memento-mori-jester 0.1.93 → 0.1.95
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/README.md +6 -2
- package/ROADMAP.md +4 -1
- package/docs/MAINTAINER_TRIAGE.md +2 -2
- package/docs/PRODUCTION_READINESS.md +3 -3
- package/docs/RELEASE_NOTES_v0.1.94.md +58 -0
- package/docs/RELEASE_NOTES_v0.1.95.md +58 -0
- package/examples/support/README.md +4 -3
- package/examples/support/backlog-records.json +78 -0
- package/examples/support/backlog-records.md +57 -0
- package/examples/support/outcome-prioritization.json +59 -0
- package/examples/support/outcome-prioritization.md +66 -0
- package/package.json +1 -1
- package/scripts/check-production-readiness.mjs +33 -0
- package/scripts/check-support-triage.mjs +263 -0
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.95
|
|
8
|
+
|
|
9
|
+
- Added checked public-safe support backlog records for turning closed/prioritized support outcomes into docs clarification, fixture backlog, or rule-review candidate artifacts.
|
|
10
|
+
- Extended `npm run support:check` and production-readiness checks so backlog record IDs, evidence thresholds, required checks, and privacy guidance stay aligned with the support lifecycle.
|
|
11
|
+
- Updated README, maintainer triage docs, support examples, production-readiness docs, roadmap, and release notes for deterministic support backlog recording.
|
|
12
|
+
|
|
13
|
+
## 0.1.94
|
|
14
|
+
|
|
15
|
+
- Added a checked public-safe support outcome prioritization guide for deciding whether closed support reports become docs clarifications, fixture backlog items, or rule-review candidates.
|
|
16
|
+
- Extended `npm run support:check` and production-readiness checks so prioritization thresholds, backlog destinations, and required evidence stay aligned with the support lifecycle.
|
|
17
|
+
- Updated README, maintainer triage docs, support examples, production-readiness docs, roadmap, and release notes for evidence-based follow-up prioritization.
|
|
18
|
+
|
|
7
19
|
## 0.1.93
|
|
8
20
|
|
|
9
21
|
- Added a checked support lifecycle overview that ties report-gallery feedback, triage playbook entries, response snippets, and closeout records together by support outcome.
|
package/README.md
CHANGED
|
@@ -76,7 +76,7 @@ For trust-building output examples, see [examples/reports](examples/reports). `n
|
|
|
76
76
|
|
|
77
77
|
If one of those reports is confusing or stale, use the public-safe [report gallery feedback template](examples/reports/feedback-template.md). It asks for version, nearest gallery example, sanitized command/output summaries, and redacted diagnostics without private repo code or secrets.
|
|
78
78
|
|
|
79
|
-
Maintainers can use the checked [support lifecycle overview](examples/support/support-lifecycle.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), and [support closeout checklist](examples/support/closeout-checklist.md) to turn sanitized reports into a docs example, fixture backlog item, or rule-review candidate without changing behavior first.
|
|
79
|
+
Maintainers can use the checked [support lifecycle overview](examples/support/support-lifecycle.md), [outcome prioritization guide](examples/support/outcome-prioritization.md), [support backlog records](examples/support/backlog-records.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), and [support closeout checklist](examples/support/closeout-checklist.md) to turn sanitized reports into a docs example, fixture backlog item, or rule-review candidate without changing behavior first.
|
|
80
80
|
|
|
81
81
|
Expected vibe:
|
|
82
82
|
|
|
@@ -451,6 +451,8 @@ More setup examples:
|
|
|
451
451
|
- [Real-World Report Gallery](examples/reports)
|
|
452
452
|
- [Report Gallery Feedback Template](examples/reports/feedback-template.md)
|
|
453
453
|
- [Support Lifecycle Overview](examples/support/support-lifecycle.md)
|
|
454
|
+
- [Support Outcome Prioritization](examples/support/outcome-prioritization.md)
|
|
455
|
+
- [Support Backlog Records](examples/support/backlog-records.md)
|
|
454
456
|
- [Support Triage Playbook](examples/support)
|
|
455
457
|
- [Maintainer Response Snippets](examples/support/response-snippets.md)
|
|
456
458
|
- [Support Closeout Checklist](examples/support/closeout-checklist.md)
|
|
@@ -476,6 +478,8 @@ Framework CI examples:
|
|
|
476
478
|
- [Real-World Report Gallery](examples/reports)
|
|
477
479
|
- [Report Gallery Feedback Template](examples/reports/feedback-template.md)
|
|
478
480
|
- [Support Lifecycle Overview](examples/support/support-lifecycle.md)
|
|
481
|
+
- [Support Outcome Prioritization](examples/support/outcome-prioritization.md)
|
|
482
|
+
- [Support Backlog Records](examples/support/backlog-records.md)
|
|
479
483
|
- [Support Triage Playbook](examples/support)
|
|
480
484
|
- [Maintainer Response Snippets](examples/support/response-snippets.md)
|
|
481
485
|
- [Support Closeout Checklist](examples/support/closeout-checklist.md)
|
|
@@ -535,7 +539,7 @@ Maintainers can use [docs/MAINTAINER_TRIAGE.md](docs/MAINTAINER_TRIAGE.md) to tu
|
|
|
535
539
|
Run `npm run fixtures:check` before merging fixture changes; it catches duplicate IDs, missing rule metadata, weak descriptions, unsafe-looking content, and duplicate content.
|
|
536
540
|
Run `npm run fixtures:report` to see fixture coverage by rule, rule family, preset slice, kind, verdict, quiet-pass boundaries, feasible pass-case gaps, and curation-next guidance before choosing the next fixture. Use `npm run fixtures:report -- --markdown` when you want a paste-ready summary for release notes or GitHub issues.
|
|
537
541
|
Run `npm run reports:check` after editing [examples/reports](examples/reports); it verifies the public report gallery against an installed package in a temporary consumer project.
|
|
538
|
-
Run `npm run support:check` after editing issue templates, support docs, the report gallery feedback path, the [support lifecycle overview](examples/support/support-lifecycle.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), or [support closeout checklist](examples/support/closeout-checklist.md); it verifies the public templates ask for useful redacted context without inviting secrets or private code.
|
|
542
|
+
Run `npm run support:check` after editing issue templates, support docs, the report gallery feedback path, the [support lifecycle overview](examples/support/support-lifecycle.md), [outcome prioritization guide](examples/support/outcome-prioritization.md), [support backlog records](examples/support/backlog-records.md), [support triage playbook](examples/support), [response snippets](examples/support/response-snippets.md), or [support closeout checklist](examples/support/closeout-checklist.md); it verifies the public templates ask for useful redacted context without inviting secrets or private code.
|
|
539
543
|
Run `npm run promo:card` to regenerate the repo-local social preview card after changing its copy or design.
|
|
540
544
|
Run `npm run promo:check` after editing promo assets; it checks the current demo video, stills, docs, and fixture evidence numbers stay in sync.
|
|
541
545
|
Run `npm run site:check` after editing the repo-local landing page; it verifies the start command, demo links, social card, repo, release, and npm links.
|
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
|
+
- Checked support backlog records in v0.1.95, turning closed and prioritized support outcomes into public-safe docs clarification, fixture backlog, or rule-review candidate artifacts.
|
|
10
|
+
- Checked support outcome prioritization in v0.1.94, helping maintainers turn closed support reports into docs, fixture backlog, or rule-review work based on public-safe evidence thresholds.
|
|
9
11
|
- Checked support lifecycle overview in v0.1.93, tying report-gallery feedback, triage playbook entries, response snippets, and closeout records together by outcome.
|
|
10
12
|
- Checked support closeout checklist in v0.1.92, recording whether docs clarifications shipped or queued, fixture backlogs were created, or rule-review candidates were opened.
|
|
11
13
|
- Checked maintainer response snippets in v0.1.91, adding public-safe reply templates for docs examples, fixture backlog items, and rule-review candidates.
|
|
@@ -83,7 +85,8 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
|
|
|
83
85
|
## Product Ideas
|
|
84
86
|
|
|
85
87
|
- Collect real-world reports and fold the strongest redacted cases into more framework tuning cookbook recipes.
|
|
86
|
-
- Use
|
|
88
|
+
- Use support backlog record counts to choose the next docs, fixture, report-gallery, or rule-guidance batch.
|
|
89
|
+
- Use repeated prioritized support outcomes to choose the next redacted fixture, report-gallery update, or rule-guidance review.
|
|
87
90
|
- Add a hosted-page option or GitHub Pages instructions once the static page has settled.
|
|
88
91
|
|
|
89
92
|
## Quality And Safety
|
|
@@ -21,7 +21,7 @@ For users who just need to understand what a healthy report looks like, point th
|
|
|
21
21
|
|
|
22
22
|
For users who say a gallery report is confusing, stale, or hard to compare with their local output, point them at [examples/reports/feedback-template.md](../examples/reports/feedback-template.md) or the GitHub [report gallery feedback issue template](../.github/ISSUE_TEMPLATE/report_gallery_feedback.yml). It asks for the nearest checked example, sanitized command and output summaries, version, and redacted diagnostics without asking for private code.
|
|
23
23
|
|
|
24
|
-
When a report has enough public-safe detail to triage, start with the checked [support lifecycle overview](../examples/support/support-lifecycle.md) to see the whole path from report to closeout. Then compare it with the checked [support triage playbook](../examples/support). The playbook walks sanitized report-gallery and false-positive reports through first response, classification, and a follow-up outcome. Use [response-snippets.md](../examples/support/response-snippets.md) to reply consistently after choosing the outcome, then use [closeout-checklist.md](../examples/support/closeout-checklist.md) to record whether the docs clarification shipped or queued, fixture backlog was created, or rule-review candidate was opened.
|
|
24
|
+
When a report has enough public-safe detail to triage, start with the checked [support lifecycle overview](../examples/support/support-lifecycle.md) to see the whole path from report to closeout. Then compare it with the checked [support triage playbook](../examples/support). The playbook walks sanitized report-gallery and false-positive reports through first response, classification, and a follow-up outcome. Use [response-snippets.md](../examples/support/response-snippets.md) to reply consistently after choosing the outcome, then use [closeout-checklist.md](../examples/support/closeout-checklist.md) to record whether the docs clarification shipped or queued, fixture backlog was created, or rule-review candidate was opened. Use [outcome-prioritization.md](../examples/support/outcome-prioritization.md) after closeout to decide whether the follow-up work is low-priority docs, medium-priority fixture backlog, or high-priority rule review. Use [backlog-records.md](../examples/support/backlog-records.md) when that prioritized follow-up needs a public-safe backlog artifact.
|
|
25
25
|
|
|
26
26
|
Do not ask users to paste secrets, private code, customer data, live credentials, complete CI logs, or unredacted SARIF. If the report involves credential exposure, command execution, unexpected network access, private code disclosure, package publishing, or MCP data exposure, route it through [SECURITY.md](../SECURITY.md).
|
|
27
27
|
|
|
@@ -65,7 +65,7 @@ Use the playbook outcomes consistently:
|
|
|
65
65
|
- `fixture-backlog`: the reduced report looks safe and should become a pass or quiet-pass fixture.
|
|
66
66
|
- `rule-review-candidate`: repeated sanitized reports suggest guidance or matching may need review, but not from a single report.
|
|
67
67
|
|
|
68
|
-
Use the matching lifecycle row and response snippet for the first public reply, then adapt only the project-neutral parts: the rule id, minimal command summary, fixture id, and next command. After the reply, record the closeout with the matching checklist entry so the issue has a public-safe decision record. Do not add private code, private paths, tokens, full logs, or exploitable details to the response or
|
|
68
|
+
Use the matching lifecycle row and response snippet for the first public reply, then adapt only the project-neutral parts: the rule id, minimal command summary, fixture id, and next command. After the reply, record the closeout with the matching checklist entry so the issue has a public-safe decision record. If follow-up work remains, choose its priority from the outcome prioritization guide before opening a docs, fixture, or rule-review backlog item, then record that choice with the matching backlog record. Do not add private code, private paths, tokens, full logs, or exploitable details to the response, closeout, or backlog item.
|
|
69
69
|
|
|
70
70
|
After editing report support docs or issue templates, run:
|
|
71
71
|
|
|
@@ -47,7 +47,7 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
|
|
|
47
47
|
- `README.md` leads with a no-write first run, project bootstrap, agent setup, and optional hooks/CI.
|
|
48
48
|
- `docs/GETTING_STARTED.md`, `docs/CLI.md`, `docs/RELEASE.md`, and `docs/TRUSTED_PUBLISHING.md` cover the core adoption and release paths.
|
|
49
49
|
- `examples/reports` provides checked, public-safe report examples for fresh install diagnostics, summary output, blocked command reviews, and report-gallery feedback.
|
|
50
|
-
- `examples/support` provides a checked support lifecycle overview, maintainer triage playbook, response snippets, and closeout checklist for first response, classification, follow-up outcomes,
|
|
50
|
+
- `examples/support` provides a checked support lifecycle overview, outcome prioritization guide, backlog records, maintainer triage playbook, response snippets, and closeout checklist for first response, classification, follow-up outcomes, public-safe decision records, backlog prioritization, and backlog artifacts from sanitized support reports.
|
|
51
51
|
- `site/index.html` gives maintainers a static one-page share surface that reuses the demo, social card, start command, and public links.
|
|
52
52
|
- Every public release has matching `CHANGELOG.md` notes and `docs/RELEASE_NOTES_vX.Y.Z.md`.
|
|
53
53
|
|
|
@@ -60,14 +60,14 @@ This checklist defines what "production grade" means for Memento Mori Jester rig
|
|
|
60
60
|
- GitHub issue templates collect bug reports, false-positive reports, report-gallery feedback, and feature requests with the diagnostic context maintainers need.
|
|
61
61
|
- `SECURITY.md` routes vulnerability reports away from public issues and asks for redacted diagnostics.
|
|
62
62
|
- `docs/MAINTAINER_TRIAGE.md` explains how to turn useful false-positive reports into fixture coverage before changing rule logic.
|
|
63
|
-
- `examples/support` shows maintainers how to audit the support lifecycle, classify sanitized reports as a docs example, fixture backlog item, or rule-review candidate before changing behavior, then reply with public-safe response snippets
|
|
63
|
+
- `examples/support` shows maintainers how to audit the support lifecycle, classify sanitized reports as a docs example, fixture backlog item, or rule-review candidate before changing behavior, then reply with public-safe response snippets, record the closeout, prioritize follow-up work, and create a public-safe backlog record.
|
|
64
64
|
- `npm run fixtures:check` validates fixture IDs, metadata, unsafe-looking content, duplicate content, and explicit expected/absent rule intent.
|
|
65
65
|
- `npm run fixtures:report` shows fixture coverage by rule, rule family, preset slice, kind, verdict, quiet-pass rule boundaries, and feasible pass-case gaps so maintainers can pick the next fixture target; `npm run fixtures:report -- --markdown` produces a paste-ready maintainer snapshot.
|
|
66
66
|
- `npm run framework:tuning:check` keeps the framework tuning guide, cookbook JSON, cookbook README, and fixture IDs aligned.
|
|
67
67
|
- `npm run framework:tuning:doctor` runs the cookbook tune commands through the built CLI with temporary preset configs, so package consumers do not inherit stale recipes.
|
|
68
68
|
- `npm run consumer:quickstart:check` installs the package into a temporary minimal project and runs `doctor`, `summary`, and packaged framework tuning checks from that consumer side.
|
|
69
69
|
- `npm run reports:check` installs the package into a temporary minimal project and runs the report gallery's `doctor`, `summary`, and blocked-command examples through that consumer side.
|
|
70
|
-
- `npm run support:check` verifies issue templates, support docs, the report gallery feedback template, the support lifecycle overview, maintainer triage playbook, response snippets, and closeout checklist stay public-safe and ask for useful redacted context.
|
|
70
|
+
- `npm run support:check` verifies issue templates, support docs, the report gallery feedback template, the support lifecycle overview, outcome prioritization guide, backlog records, maintainer triage playbook, response snippets, and closeout checklist stay public-safe and ask for useful redacted context.
|
|
71
71
|
- `npm run promo:card` regenerates the deterministic social preview card, and `npm run promo:check` verifies current repo-local promo assets against the current fixture evidence before maintainers post or refresh the demo.
|
|
72
72
|
- `npm run site:check` verifies the static landing page before maintainers post or host it.
|
|
73
73
|
- npm publish has a manual workflow fallback, but the normal release path is tag-driven trusted publishing.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.94
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
This release adds a checked public-safe support outcome prioritization guide. It helps maintainers decide whether a closed support report should become a docs clarification, fixture backlog item, or rule-review candidate based on concrete evidence thresholds.
|
|
6
|
+
|
|
7
|
+
## What Changed
|
|
8
|
+
|
|
9
|
+
- Added `examples/support/outcome-prioritization.md`.
|
|
10
|
+
- Added `examples/support/outcome-prioritization.json`.
|
|
11
|
+
- Extended `scripts/check-support-triage.mjs` to validate outcome priorities, evidence thresholds, backlog destinations, and required checks.
|
|
12
|
+
- Extended production-readiness checks for the prioritization guide.
|
|
13
|
+
- Updated README, maintainer triage docs, support examples, production-readiness docs, roadmap, and changelog.
|
|
14
|
+
|
|
15
|
+
## Public Interface
|
|
16
|
+
|
|
17
|
+
- No CLI command changes.
|
|
18
|
+
- No MCP tool changes.
|
|
19
|
+
- No config schema changes.
|
|
20
|
+
- No review rule, scoring, matching, or verdict behavior changes.
|
|
21
|
+
- No GitHub Action input changes.
|
|
22
|
+
- Support docs and package examples now include checked follow-up prioritization guidance.
|
|
23
|
+
|
|
24
|
+
## Release Validation
|
|
25
|
+
|
|
26
|
+
```powershell
|
|
27
|
+
npm.cmd test
|
|
28
|
+
npm.cmd run support:check
|
|
29
|
+
npm.cmd run reports:check
|
|
30
|
+
npm.cmd run demo:svg:check
|
|
31
|
+
npm.cmd run promo:card:check
|
|
32
|
+
npm.cmd run promo:check
|
|
33
|
+
npm.cmd run fixtures:report
|
|
34
|
+
npm.cmd run fixtures:report -- --json
|
|
35
|
+
npm.cmd run fixtures:report -- --markdown
|
|
36
|
+
npm.cmd run pack:dry
|
|
37
|
+
git diff --check
|
|
38
|
+
node .\dist\cli.js doctor
|
|
39
|
+
node .\dist\cli.js summary --kind command "git reset --hard"
|
|
40
|
+
git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.94 checked support outcome prioritization"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Expected:
|
|
44
|
+
|
|
45
|
+
- `support:check` verifies issue templates, feedback templates, the support lifecycle overview, outcome prioritization guide, maintainer triage playbook, response snippets, and closeout checklist.
|
|
46
|
+
- `reports:check` still verifies the installed-package report gallery.
|
|
47
|
+
- fixture report still shows `Fixtures: 222`.
|
|
48
|
+
- GitHub Release and npm Publish complete from the `v0.1.94` tag.
|
|
49
|
+
|
|
50
|
+
After publish:
|
|
51
|
+
|
|
52
|
+
```powershell
|
|
53
|
+
npm.cmd view memento-mori-jester version --silent
|
|
54
|
+
npx.cmd -y memento-mori-jester@latest doctor
|
|
55
|
+
npx.cmd -y memento-mori-jester@latest summary --kind command "git reset --hard"
|
|
56
|
+
npm.cmd run support:check
|
|
57
|
+
npm.cmd run reports:check -- --package memento-mori-jester@latest
|
|
58
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.95
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
This release adds checked public-safe support backlog records. It helps maintainers turn a closed and prioritized support outcome into a docs clarification, fixture backlog item, or rule-review candidate without changing rule behavior first.
|
|
6
|
+
|
|
7
|
+
## What Changed
|
|
8
|
+
|
|
9
|
+
- Added `examples/support/backlog-records.md`.
|
|
10
|
+
- Added `examples/support/backlog-records.json`.
|
|
11
|
+
- Extended `scripts/check-support-triage.mjs` to validate backlog record IDs, outcome mapping, source closeouts, evidence thresholds, required checks, and privacy review guidance.
|
|
12
|
+
- Extended production-readiness checks for the backlog records.
|
|
13
|
+
- Updated README, maintainer triage docs, support examples, production-readiness docs, roadmap, and changelog.
|
|
14
|
+
|
|
15
|
+
## Public Interface
|
|
16
|
+
|
|
17
|
+
- No CLI command changes.
|
|
18
|
+
- No MCP tool changes.
|
|
19
|
+
- No config schema changes.
|
|
20
|
+
- No review rule, scoring, matching, or verdict behavior changes.
|
|
21
|
+
- No GitHub Action input changes.
|
|
22
|
+
- Support docs and package examples now include checked follow-up backlog records.
|
|
23
|
+
|
|
24
|
+
## Release Validation
|
|
25
|
+
|
|
26
|
+
```powershell
|
|
27
|
+
npm.cmd test
|
|
28
|
+
npm.cmd run support:check
|
|
29
|
+
npm.cmd run reports:check
|
|
30
|
+
npm.cmd run demo:svg:check
|
|
31
|
+
npm.cmd run promo:card:check
|
|
32
|
+
npm.cmd run promo:check
|
|
33
|
+
npm.cmd run fixtures:report
|
|
34
|
+
npm.cmd run fixtures:report -- --json
|
|
35
|
+
npm.cmd run fixtures:report -- --markdown
|
|
36
|
+
npm.cmd run pack:dry
|
|
37
|
+
git diff --check
|
|
38
|
+
node .\dist\cli.js doctor
|
|
39
|
+
node .\dist\cli.js summary --kind command "git reset --hard"
|
|
40
|
+
git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.95 checked support backlog records"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Expected:
|
|
44
|
+
|
|
45
|
+
- `support:check` verifies issue templates, feedback templates, the support lifecycle overview, outcome prioritization guide, backlog records, maintainer triage playbook, response snippets, and closeout checklist.
|
|
46
|
+
- `reports:check` still verifies the installed-package report gallery.
|
|
47
|
+
- fixture report still shows `Fixtures: 222`.
|
|
48
|
+
- GitHub Release and npm Publish complete from the `v0.1.95` tag.
|
|
49
|
+
|
|
50
|
+
After publish:
|
|
51
|
+
|
|
52
|
+
```powershell
|
|
53
|
+
npm.cmd view memento-mori-jester version --silent
|
|
54
|
+
npx.cmd -y memento-mori-jester@latest doctor
|
|
55
|
+
npx.cmd -y memento-mori-jester@latest summary --kind command "git reset --hard"
|
|
56
|
+
npm.cmd run support:check
|
|
57
|
+
npm.cmd run reports:check -- --package memento-mori-jester@latest
|
|
58
|
+
```
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
This playbook shows how to handle sanitized adopter reports without turning every surprise into an immediate rule change. It pairs with [docs/MAINTAINER_TRIAGE.md](../../docs/MAINTAINER_TRIAGE.md), the [report gallery feedback template](../reports/feedback-template.md), and the GitHub issue templates.
|
|
4
4
|
|
|
5
|
-
Start with the checked [support lifecycle overview](support-lifecycle.md) when you need the whole path in one place. The lifecycle source is [support-lifecycle.json](support-lifecycle.json).
|
|
5
|
+
Start with the checked [support lifecycle overview](support-lifecycle.md) when you need the whole path in one place. The lifecycle source is [support-lifecycle.json](support-lifecycle.json). Use [outcome-prioritization.md](outcome-prioritization.md) after closeout to decide whether follow-up work should become docs, fixture backlog, or rule-review work. Use [backlog-records.md](backlog-records.md) to turn that decision into a public-safe backlog artifact.
|
|
6
6
|
|
|
7
|
-
The checked source is [triage-playbook.json](triage-playbook.json). Use [response-snippets.md](response-snippets.md) for copy-paste replies after a report is classified. The snippet source is [response-snippets.json](response-snippets.json). Use [closeout-checklist.md](closeout-checklist.md) to record what happened after the response. The closeout source is [closeout-checklist.json](closeout-checklist.json).
|
|
7
|
+
The checked source is [triage-playbook.json](triage-playbook.json). Use [response-snippets.md](response-snippets.md) for copy-paste replies after a report is classified. The snippet source is [response-snippets.json](response-snippets.json). Use [closeout-checklist.md](closeout-checklist.md) to record what happened after the response. The closeout source is [closeout-checklist.json](closeout-checklist.json). The backlog source is [backlog-records.json](backlog-records.json).
|
|
8
8
|
|
|
9
9
|
| ID | Source | Classification | Follow-up |
|
|
10
10
|
| --- | --- | --- | --- |
|
|
@@ -25,10 +25,11 @@ The checked source is [triage-playbook.json](triage-playbook.json). Use [respons
|
|
|
25
25
|
6. Close with the next command the user can run.
|
|
26
26
|
7. Use the matching response snippet so replies stay public-safe and consistent.
|
|
27
27
|
8. Record the closeout with the matching checklist entry: docs clarification shipped or queued, fixture backlog created, or rule-review candidate opened.
|
|
28
|
+
9. If follow-up work remains, create the matching backlog record: docs clarification, fixture backlog item, or rule-review candidate.
|
|
28
29
|
|
|
29
30
|
## Checks
|
|
30
31
|
|
|
31
|
-
Run this after editing support docs, issue templates, the lifecycle overview, the playbook, response snippets, or closeout checklist:
|
|
32
|
+
Run this after editing support docs, issue templates, the lifecycle overview, outcome prioritization, backlog records, the playbook, response snippets, or closeout checklist:
|
|
32
33
|
|
|
33
34
|
```powershell
|
|
34
35
|
npm run support:check
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "docs-clarification-backlog-record",
|
|
4
|
+
"outcome": "docs-example",
|
|
5
|
+
"priority": "low",
|
|
6
|
+
"sourceCloseout": "docs-clarification-closeout",
|
|
7
|
+
"prioritizationSource": "outcome-prioritization.json",
|
|
8
|
+
"backlogType": "docs clarification",
|
|
9
|
+
"publicTitle": "Clarify checked report-gallery wording",
|
|
10
|
+
"publicSummary": "Update docs or report-gallery wording so expected behavior is easier to compare with local output.",
|
|
11
|
+
"evidence": [
|
|
12
|
+
"Nearest checked report or docs page is identified.",
|
|
13
|
+
"Observed output matches current behavior or differs only in wording/context.",
|
|
14
|
+
"No rule behavior change is requested before a clearer explanation is tried."
|
|
15
|
+
],
|
|
16
|
+
"nextAction": "Open or update a docs issue with the public-safe wording change and link the matching checked report.",
|
|
17
|
+
"privacyReview": [
|
|
18
|
+
"No secrets, private code, private paths, customer data, full logs, or unredacted SARIF are included.",
|
|
19
|
+
"Any private project names are replaced with placeholders.",
|
|
20
|
+
"Sensitive reports are routed to SECURITY.md instead of a public backlog item."
|
|
21
|
+
],
|
|
22
|
+
"requiredChecks": [
|
|
23
|
+
"npm run reports:check",
|
|
24
|
+
"npm run support:check"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "fixture-backlog-record",
|
|
29
|
+
"outcome": "fixture-backlog",
|
|
30
|
+
"priority": "medium",
|
|
31
|
+
"sourceCloseout": "fixture-backlog-closeout",
|
|
32
|
+
"prioritizationSource": "outcome-prioritization.json",
|
|
33
|
+
"backlogType": "pass or quiet-pass fixture",
|
|
34
|
+
"publicTitle": "Add a quiet-pass fixture for a minimized false-positive boundary",
|
|
35
|
+
"publicSummary": "Track a redacted fixture candidate before changing matching, scoring, or verdict behavior.",
|
|
36
|
+
"evidence": [
|
|
37
|
+
"Smallest sanitized command, plan, diff, or final-answer text is available.",
|
|
38
|
+
"Rule id and redacted `jester tune <rule-id> --json` evidence are available.",
|
|
39
|
+
"The safe boundary is not already covered by an existing pass or quiet-pass fixture."
|
|
40
|
+
],
|
|
41
|
+
"nextAction": "Open a fixture backlog item with the candidate rule id, expected verdict, and absentRuleIds or expectedRuleIds.",
|
|
42
|
+
"privacyReview": [
|
|
43
|
+
"No secrets, private code, private paths, customer data, full logs, or unredacted SARIF are included.",
|
|
44
|
+
"The reduced reproduction uses placeholders such as <repo>, <path>, or <redacted>.",
|
|
45
|
+
"Sensitive reports are routed to SECURITY.md instead of a public backlog item."
|
|
46
|
+
],
|
|
47
|
+
"requiredChecks": [
|
|
48
|
+
"npm run fixtures:check",
|
|
49
|
+
"npm run fixtures:report",
|
|
50
|
+
"npm run support:check"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "rule-review-candidate-backlog-record",
|
|
55
|
+
"outcome": "rule-review-candidate",
|
|
56
|
+
"priority": "high",
|
|
57
|
+
"sourceCloseout": "rule-review-closeout",
|
|
58
|
+
"prioritizationSource": "outcome-prioritization.json",
|
|
59
|
+
"backlogType": "rule-review candidate",
|
|
60
|
+
"publicTitle": "Compare repeated sanitized reports for a rule boundary",
|
|
61
|
+
"publicSummary": "Track repeated public-safe reports so maintainers can compare fixture evidence before changing guidance or matching.",
|
|
62
|
+
"evidence": [
|
|
63
|
+
"At least two sanitized reports or checked examples point at the same rule boundary.",
|
|
64
|
+
"Redacted `jester tune <rule-id> --json` or fixture report evidence is referenced.",
|
|
65
|
+
"The candidate explains why docs clarification or a single fixture backlog item is not enough."
|
|
66
|
+
],
|
|
67
|
+
"nextAction": "Open a rule-review candidate issue linking the sanitized examples, fixture evidence, and current guidance.",
|
|
68
|
+
"privacyReview": [
|
|
69
|
+
"No secrets, private code, private paths, customer data, full logs, or unredacted SARIF are included.",
|
|
70
|
+
"Repeated examples are summarized without exposing private project details.",
|
|
71
|
+
"Sensitive reports are routed to SECURITY.md instead of a public backlog item."
|
|
72
|
+
],
|
|
73
|
+
"requiredChecks": [
|
|
74
|
+
"npm run fixtures:report -- --markdown",
|
|
75
|
+
"npm run support:check"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Support Backlog Records
|
|
2
|
+
|
|
3
|
+
Use this after the [support lifecycle overview](support-lifecycle.md), [outcome prioritization guide](outcome-prioritization.md), and [closeout checklist](closeout-checklist.md) have identified follow-up work. The checked source is [backlog-records.json](backlog-records.json).
|
|
4
|
+
|
|
5
|
+
These records show how a closed, prioritized, public-safe support outcome becomes a backlog artifact without changing rule behavior first.
|
|
6
|
+
|
|
7
|
+
| Outcome | Priority | Backlog record | Destination | Required checks |
|
|
8
|
+
| --- | --- | --- | --- | --- |
|
|
9
|
+
| `docs-example` | low | `docs-clarification-backlog-record` | docs clarification | `npm run reports:check`, `npm run support:check` |
|
|
10
|
+
| `fixture-backlog` | medium | `fixture-backlog-record` | pass or quiet-pass fixture | `npm run fixtures:check`, `npm run fixtures:report`, `npm run support:check` |
|
|
11
|
+
| `rule-review-candidate` | high | `rule-review-candidate-backlog-record` | rule-review candidate | `npm run fixtures:report -- --markdown`, `npm run support:check` |
|
|
12
|
+
|
|
13
|
+
## Docs Clarification
|
|
14
|
+
|
|
15
|
+
Use `docs-clarification-backlog-record` when the behavior is expected but the checked report, README, or guide made it hard to compare local output with the known-good example.
|
|
16
|
+
|
|
17
|
+
Enough evidence:
|
|
18
|
+
|
|
19
|
+
- nearest checked report or docs page,
|
|
20
|
+
- observed output summary,
|
|
21
|
+
- confirmation that no rule behavior change is requested before clearer wording is tried.
|
|
22
|
+
|
|
23
|
+
Next action: open or update a docs issue with the public-safe wording change and link the matching checked report.
|
|
24
|
+
|
|
25
|
+
## Fixture Backlog
|
|
26
|
+
|
|
27
|
+
Use `fixture-backlog-record` when a minimized false-positive report looks safe but should be protected by a pass or quiet-pass fixture before any matcher changes are considered.
|
|
28
|
+
|
|
29
|
+
Enough evidence:
|
|
30
|
+
|
|
31
|
+
- smallest sanitized command, plan, diff, or final-answer text,
|
|
32
|
+
- candidate rule id plus redacted `jester tune <rule-id> --json` evidence,
|
|
33
|
+
- confirmation that no existing pass or quiet-pass fixture covers the safe boundary.
|
|
34
|
+
|
|
35
|
+
Next action: open a fixture backlog item with the candidate rule id, expected verdict, and `absentRuleIds` or `expectedRuleIds`.
|
|
36
|
+
|
|
37
|
+
## Rule-Review Candidate
|
|
38
|
+
|
|
39
|
+
Use `rule-review-candidate-backlog-record` when repeated sanitized reports point at the same rule boundary and a docs clarification or single fixture backlog item is not enough.
|
|
40
|
+
|
|
41
|
+
Enough evidence:
|
|
42
|
+
|
|
43
|
+
- at least two sanitized reports or checked examples,
|
|
44
|
+
- fixture report or tune evidence for the rule,
|
|
45
|
+
- a short explanation of why the decision needs rule-review attention.
|
|
46
|
+
|
|
47
|
+
Next action: open a rule-review candidate issue linking the sanitized examples, fixture evidence, and current guidance.
|
|
48
|
+
|
|
49
|
+
## Privacy
|
|
50
|
+
|
|
51
|
+
Do not create a public backlog record when the report includes secrets, private code, private paths, customer data, full CI logs, unredacted SARIF, credential-handling details, command-execution vulnerability details, package publishing compromise, or MCP data exposure. Use [SECURITY.md](../../SECURITY.md) instead.
|
|
52
|
+
|
|
53
|
+
Run this after editing support backlog records:
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
npm run support:check
|
|
57
|
+
```
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"outcome": "docs-example",
|
|
4
|
+
"priority": "low",
|
|
5
|
+
"title": "Clarify expected behavior in docs or checked examples",
|
|
6
|
+
"useWhen": "The report is public-safe, matches current checked behavior, and mainly shows confusing wording, missing context, or surprising severity in docs or report examples.",
|
|
7
|
+
"minimumEvidence": [
|
|
8
|
+
"Nearest checked report or docs page is identified.",
|
|
9
|
+
"Observed output matches current behavior or differs only in wording/context.",
|
|
10
|
+
"No rule behavior change is requested before a clearer explanation is tried."
|
|
11
|
+
],
|
|
12
|
+
"backlogDestination": "docs clarification or report-gallery wording",
|
|
13
|
+
"notEnoughEvidence": [
|
|
14
|
+
"The report includes private details that belong in SECURITY.md.",
|
|
15
|
+
"The report asks to loosen a rule without a minimal reproduction.",
|
|
16
|
+
"The reported output cannot be compared with a checked example."
|
|
17
|
+
],
|
|
18
|
+
"nextArtifact": "docs-clarification-closeout",
|
|
19
|
+
"requiredChecks": ["npm run reports:check", "npm run support:check"]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"outcome": "fixture-backlog",
|
|
23
|
+
"priority": "medium",
|
|
24
|
+
"title": "Capture a plausible safe boundary before changing behavior",
|
|
25
|
+
"useWhen": "A minimized public-safe report suggests the rule may be noisy, but the safer next move is fixture evidence rather than changing matching or severity.",
|
|
26
|
+
"minimumEvidence": [
|
|
27
|
+
"Smallest sanitized command, plan, diff, or final-answer text is available.",
|
|
28
|
+
"Rule id and redacted `jester tune <rule-id> --json` evidence are available.",
|
|
29
|
+
"The safe boundary is not already covered by an existing pass or quiet-pass fixture."
|
|
30
|
+
],
|
|
31
|
+
"backlogDestination": "pass or quiet-pass fixture backlog item",
|
|
32
|
+
"notEnoughEvidence": [
|
|
33
|
+
"Only a broad complaint is available without a reduced reproduction.",
|
|
34
|
+
"The example still contains secrets, private code, private paths, or full logs.",
|
|
35
|
+
"The behavior is already clearly documented as expected."
|
|
36
|
+
],
|
|
37
|
+
"nextArtifact": "fixture-backlog-closeout",
|
|
38
|
+
"requiredChecks": ["npm run fixtures:check", "npm run fixtures:report", "npm run support:check"]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"outcome": "rule-review-candidate",
|
|
42
|
+
"priority": "high",
|
|
43
|
+
"title": "Open a rule-review candidate for repeated sanitized surprises",
|
|
44
|
+
"useWhen": "Multiple public-safe reports point at the same guidance or matching boundary and fixture evidence suggests maintainers should compare the rule more deliberately.",
|
|
45
|
+
"minimumEvidence": [
|
|
46
|
+
"At least two sanitized reports or checked examples point at the same rule boundary.",
|
|
47
|
+
"Redacted `jester tune <rule-id> --json` or fixture report evidence is referenced.",
|
|
48
|
+
"The candidate explains why docs clarification or a single fixture backlog item is not enough."
|
|
49
|
+
],
|
|
50
|
+
"backlogDestination": "rule-review candidate issue",
|
|
51
|
+
"notEnoughEvidence": [
|
|
52
|
+
"Only one report is available.",
|
|
53
|
+
"The rule id, review kind, or reproduction shape is unclear.",
|
|
54
|
+
"The candidate would require immediate behavior changes without fixture evidence."
|
|
55
|
+
],
|
|
56
|
+
"nextArtifact": "rule-review-closeout",
|
|
57
|
+
"requiredChecks": ["npm run fixtures:report -- --markdown", "npm run support:check"]
|
|
58
|
+
}
|
|
59
|
+
]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Support Outcome Prioritization
|
|
2
|
+
|
|
3
|
+
Use this guide after a support report has been closed out and maintainers need to decide what follow-up work deserves a backlog item. It keeps the public support lifecycle useful without turning every report into a rule change.
|
|
4
|
+
|
|
5
|
+
The checked source is [outcome-prioritization.json](outcome-prioritization.json). It pairs with the [support lifecycle overview](support-lifecycle.md), [triage playbook](triage-playbook.json), [response snippets](response-snippets.md), and [closeout checklist](closeout-checklist.md).
|
|
6
|
+
|
|
7
|
+
## Priority Rows
|
|
8
|
+
|
|
9
|
+
| Outcome | Priority | Backlog Destination | Enough Evidence |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| `docs-example` | `low` | docs clarification or report-gallery wording | checked behavior is correct, but wording or context confused someone |
|
|
12
|
+
| `fixture-backlog` | `medium` | pass or quiet-pass fixture backlog item | minimal public-safe reproduction plus `jester tune <rule-id> --json` evidence |
|
|
13
|
+
| `rule-review-candidate` | `high` | rule-review candidate issue | at least two sanitized reports point at the same rule boundary |
|
|
14
|
+
|
|
15
|
+
## Evidence Thresholds
|
|
16
|
+
|
|
17
|
+
### `docs-example`
|
|
18
|
+
|
|
19
|
+
Use when the report matches current checked behavior and mainly needs clearer docs, report-gallery wording, or severity context.
|
|
20
|
+
|
|
21
|
+
Enough evidence:
|
|
22
|
+
|
|
23
|
+
- nearest checked report or docs page is identified,
|
|
24
|
+
- observed output matches current behavior or differs only in wording/context,
|
|
25
|
+
- no rule behavior change is requested before a clearer explanation is tried.
|
|
26
|
+
|
|
27
|
+
### `fixture-backlog`
|
|
28
|
+
|
|
29
|
+
Use when the report describes a plausible safe boundary, but maintainers should prove it with a pass or quiet-pass fixture before changing behavior.
|
|
30
|
+
|
|
31
|
+
Enough evidence:
|
|
32
|
+
|
|
33
|
+
- smallest sanitized command, plan, diff, or final-answer text is available,
|
|
34
|
+
- rule id and redacted `jester tune <rule-id> --json` evidence are available,
|
|
35
|
+
- the safe boundary is not already covered by an existing pass or quiet-pass fixture.
|
|
36
|
+
|
|
37
|
+
### `rule-review-candidate`
|
|
38
|
+
|
|
39
|
+
Use when repeated public-safe reports suggest the guidance or matching boundary may need deliberate review.
|
|
40
|
+
|
|
41
|
+
Enough evidence:
|
|
42
|
+
|
|
43
|
+
- at least two sanitized reports or checked examples point at the same rule boundary,
|
|
44
|
+
- redacted `jester tune <rule-id> --json` or fixture report evidence is referenced,
|
|
45
|
+
- the candidate explains why docs clarification or a single fixture backlog item is not enough.
|
|
46
|
+
|
|
47
|
+
## Do Not Prioritize Publicly
|
|
48
|
+
|
|
49
|
+
Do not create a public backlog item when the report includes secrets, private code, private paths, customer data, full CI logs, unredacted SARIF, credential-handling details, command-execution vulnerability details, package publishing compromise, or MCP data exposure. Use [SECURITY.md](../../SECURITY.md) instead.
|
|
50
|
+
|
|
51
|
+
## Checks
|
|
52
|
+
|
|
53
|
+
Run this after editing prioritization guidance or support lifecycle files:
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
npm run support:check
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Run the checks for the chosen outcome:
|
|
60
|
+
|
|
61
|
+
```powershell
|
|
62
|
+
npm run reports:check
|
|
63
|
+
npm run fixtures:check
|
|
64
|
+
npm run fixtures:report
|
|
65
|
+
npm run fixtures:report -- --markdown
|
|
66
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memento-mori-jester",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.95",
|
|
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": {
|
|
@@ -94,8 +94,12 @@ for (const path of [
|
|
|
94
94
|
"examples/reports/feedback-template.md",
|
|
95
95
|
"examples/reports/report-gallery.json",
|
|
96
96
|
"examples/support/README.md",
|
|
97
|
+
"examples/support/backlog-records.md",
|
|
98
|
+
"examples/support/backlog-records.json",
|
|
97
99
|
"examples/support/closeout-checklist.md",
|
|
98
100
|
"examples/support/closeout-checklist.json",
|
|
101
|
+
"examples/support/outcome-prioritization.md",
|
|
102
|
+
"examples/support/outcome-prioritization.json",
|
|
99
103
|
"examples/support/response-snippets.md",
|
|
100
104
|
"examples/support/response-snippets.json",
|
|
101
105
|
"examples/support/support-lifecycle.md",
|
|
@@ -133,6 +137,8 @@ requireText("README.md", /examples\/support/, "support triage playbook link");
|
|
|
133
137
|
requireText("README.md", /response-snippets\.md/, "support response snippets link");
|
|
134
138
|
requireText("README.md", /closeout-checklist\.md/, "support closeout checklist link");
|
|
135
139
|
requireText("README.md", /support-lifecycle\.md/, "support lifecycle overview link");
|
|
140
|
+
requireText("README.md", /outcome-prioritization\.md/, "support outcome prioritization link");
|
|
141
|
+
requireText("README.md", /backlog-records\.md/, "support backlog records link");
|
|
136
142
|
requireText("README.md", /report gallery feedback/i, "report gallery feedback guidance");
|
|
137
143
|
requireText("README.md", /License: PolyForm Noncommercial/, "the noncommercial license badge");
|
|
138
144
|
requireText("docs/PRODUCTION_READINESS.md", /npm package/i, "npm package readiness");
|
|
@@ -157,6 +163,8 @@ requireText("docs/PRODUCTION_READINESS.md", /examples\/support/, "support triage
|
|
|
157
163
|
requireText("docs/PRODUCTION_READINESS.md", /response snippets/i, "support response snippets readiness");
|
|
158
164
|
requireText("docs/PRODUCTION_READINESS.md", /closeout checklist/i, "support closeout checklist readiness");
|
|
159
165
|
requireText("docs/PRODUCTION_READINESS.md", /support lifecycle overview/i, "support lifecycle overview readiness");
|
|
166
|
+
requireText("docs/PRODUCTION_READINESS.md", /outcome prioritization guide/i, "support outcome prioritization readiness");
|
|
167
|
+
requireText("docs/PRODUCTION_READINESS.md", /backlog records/i, "support backlog records readiness");
|
|
160
168
|
requireText("docs/PRODUCTION_READINESS.md", /quiet-pass/, "quiet-pass fixture readiness");
|
|
161
169
|
requireText("docs/CLI.md", /jester doctor --json/, "doctor JSON CLI docs");
|
|
162
170
|
requireText("docs/CLI.md", /quiet-pass fixture/, "quiet-pass fixture CLI docs");
|
|
@@ -184,6 +192,8 @@ requireText("docs/MAINTAINER_TRIAGE.md", /examples\/support/, "support triage pl
|
|
|
184
192
|
requireText("docs/MAINTAINER_TRIAGE.md", /response-snippets\.md/, "support response snippets link");
|
|
185
193
|
requireText("docs/MAINTAINER_TRIAGE.md", /closeout-checklist\.md/, "support closeout checklist link");
|
|
186
194
|
requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle\.md/, "support lifecycle overview link");
|
|
195
|
+
requireText("docs/MAINTAINER_TRIAGE.md", /outcome-prioritization\.md/, "support outcome prioritization link");
|
|
196
|
+
requireText("docs/MAINTAINER_TRIAGE.md", /backlog-records\.md/, "support backlog records link");
|
|
187
197
|
requireText("docs/MAINTAINER_TRIAGE.md", /docs-example/, "docs example triage outcome");
|
|
188
198
|
requireText("docs/MAINTAINER_TRIAGE.md", /fixture-backlog/, "fixture backlog triage outcome");
|
|
189
199
|
requireText("docs/MAINTAINER_TRIAGE.md", /rule-review-candidate/, "rule review triage outcome");
|
|
@@ -219,6 +229,8 @@ requireText("examples/support/README.md", /triage-playbook\.json/, "support tria
|
|
|
219
229
|
requireText("examples/support/README.md", /response-snippets\.md/, "support response snippets link");
|
|
220
230
|
requireText("examples/support/README.md", /closeout-checklist\.md/, "support closeout checklist link");
|
|
221
231
|
requireText("examples/support/README.md", /support-lifecycle\.md/, "support lifecycle overview link");
|
|
232
|
+
requireText("examples/support/README.md", /outcome-prioritization\.md/, "support outcome prioritization link");
|
|
233
|
+
requireText("examples/support/README.md", /backlog-records\.md/, "support backlog records link");
|
|
222
234
|
requireText("examples/support/README.md", /docs-example/, "support triage docs outcome");
|
|
223
235
|
requireText("examples/support/README.md", /fixture-backlog/, "support triage fixture outcome");
|
|
224
236
|
requireText("examples/support/README.md", /rule-review-candidate/, "support triage rule-review outcome");
|
|
@@ -247,6 +259,25 @@ requireText("examples/support/support-lifecycle.md", /rule-review-candidate/, "s
|
|
|
247
259
|
requireText("examples/support/support-lifecycle.json", /docs-example-response/, "support lifecycle docs response");
|
|
248
260
|
requireText("examples/support/support-lifecycle.json", /fixture-backlog-response/, "support lifecycle fixture response");
|
|
249
261
|
requireText("examples/support/support-lifecycle.json", /rule-review-candidate-response/, "support lifecycle rule-review response");
|
|
262
|
+
requireText("examples/support/outcome-prioritization.md", /Support Outcome Prioritization/, "support outcome prioritization heading");
|
|
263
|
+
requireText("examples/support/outcome-prioritization.md", /outcome-prioritization\.json/, "support outcome prioritization JSON link");
|
|
264
|
+
requireText("examples/support/outcome-prioritization.md", /docs-example/, "support outcome prioritization docs outcome");
|
|
265
|
+
requireText("examples/support/outcome-prioritization.md", /fixture-backlog/, "support outcome prioritization fixture outcome");
|
|
266
|
+
requireText("examples/support/outcome-prioritization.md", /rule-review-candidate/, "support outcome prioritization rule-review outcome");
|
|
267
|
+
requireText("examples/support/outcome-prioritization.md", /at least two sanitized reports/, "support outcome prioritization evidence threshold");
|
|
268
|
+
requireText("examples/support/outcome-prioritization.json", /docs-clarification-closeout/, "support outcome prioritization docs closeout");
|
|
269
|
+
requireText("examples/support/outcome-prioritization.json", /fixture-backlog-closeout/, "support outcome prioritization fixture closeout");
|
|
270
|
+
requireText("examples/support/outcome-prioritization.json", /rule-review-closeout/, "support outcome prioritization rule-review closeout");
|
|
271
|
+
requireText("examples/support/backlog-records.md", /Support Backlog Records/, "support backlog records heading");
|
|
272
|
+
requireText("examples/support/backlog-records.md", /backlog-records\.json/, "support backlog records JSON link");
|
|
273
|
+
requireText("examples/support/backlog-records.md", /docs-clarification-backlog-record/, "support docs backlog record");
|
|
274
|
+
requireText("examples/support/backlog-records.md", /fixture-backlog-record/, "support fixture backlog record");
|
|
275
|
+
requireText("examples/support/backlog-records.md", /rule-review-candidate-backlog-record/, "support rule-review backlog record");
|
|
276
|
+
requireText("examples/support/backlog-records.md", /jester tune <rule-id> --json/, "support backlog tuning evidence");
|
|
277
|
+
requireText("examples/support/backlog-records.md", /SECURITY\.md/, "support backlog security redirect");
|
|
278
|
+
requireText("examples/support/backlog-records.json", /docs-clarification-backlog-record/, "support docs backlog record JSON");
|
|
279
|
+
requireText("examples/support/backlog-records.json", /fixture-backlog-record/, "support fixture backlog record JSON");
|
|
280
|
+
requireText("examples/support/backlog-records.json", /rule-review-candidate-backlog-record/, "support rule-review backlog record JSON");
|
|
250
281
|
requireText("examples/tuning/README.md", /framework-tuning-cookbook\.json/, "framework tuning cookbook JSON link");
|
|
251
282
|
requireText("examples/tuning/README.md", /framework:tuning:doctor/, "framework tuning doctor guidance");
|
|
252
283
|
requireText("examples/tuning/README.md", /jester tune <rule-id> --json|jester tune [a-z0-9-]+ --json/, "framework tuning command guidance");
|
|
@@ -283,6 +314,8 @@ requireText("scripts/check-support-triage.mjs", /triage-playbook\.json/, "suppor
|
|
|
283
314
|
requireText("scripts/check-support-triage.mjs", /response-snippets\.json/, "support response snippets guard");
|
|
284
315
|
requireText("scripts/check-support-triage.mjs", /closeout-checklist\.json/, "support closeout checklist guard");
|
|
285
316
|
requireText("scripts/check-support-triage.mjs", /support-lifecycle\.json/, "support lifecycle overview guard");
|
|
317
|
+
requireText("scripts/check-support-triage.mjs", /outcome-prioritization\.json/, "support outcome prioritization guard");
|
|
318
|
+
requireText("scripts/check-support-triage.mjs", /backlog-records\.json/, "support backlog records guard");
|
|
286
319
|
requireText("scripts/check-support-triage.mjs", /unsafeContentPatterns/, "support triage unsafe content checks");
|
|
287
320
|
requireText("package.json", /"fixtures:check": "node scripts\/check-fixtures\.mjs"/, "fixture authoring check script");
|
|
288
321
|
requireText("package.json", /"fixtures:report": "node scripts\/report-fixtures\.mjs"/, "fixture coverage report script");
|
|
@@ -25,8 +25,12 @@ const supportFiles = [
|
|
|
25
25
|
".github/ISSUE_TEMPLATE/config.yml",
|
|
26
26
|
"examples/reports/feedback-template.md",
|
|
27
27
|
"examples/reports/README.md",
|
|
28
|
+
"examples/support/backlog-records.md",
|
|
29
|
+
"examples/support/backlog-records.json",
|
|
28
30
|
"examples/support/closeout-checklist.md",
|
|
29
31
|
"examples/support/closeout-checklist.json",
|
|
32
|
+
"examples/support/outcome-prioritization.md",
|
|
33
|
+
"examples/support/outcome-prioritization.json",
|
|
30
34
|
"examples/support/README.md",
|
|
31
35
|
"examples/support/response-snippets.md",
|
|
32
36
|
"examples/support/response-snippets.json",
|
|
@@ -82,7 +86,9 @@ requireText("examples/reports/README.md", /npm run support:check/, "support chec
|
|
|
82
86
|
requireText("examples/reports/README.md", /examples\/support|Maintainer Triage Playbook/i, "maintainer triage playbook link");
|
|
83
87
|
|
|
84
88
|
requireText("examples/support/README.md", /Maintainer Triage Playbook/, "maintainer playbook heading");
|
|
89
|
+
requireText("examples/support/README.md", /backlog-records\.md/, "support backlog records link");
|
|
85
90
|
requireText("examples/support/README.md", /support-lifecycle\.md/, "support lifecycle overview link");
|
|
91
|
+
requireText("examples/support/README.md", /outcome-prioritization\.md/, "support outcome prioritization link");
|
|
86
92
|
requireText("examples/support/README.md", /closeout-checklist\.md/, "support closeout checklist link");
|
|
87
93
|
requireText("examples/support/README.md", /triage-playbook\.json/, "maintainer playbook JSON link");
|
|
88
94
|
requireText("examples/support/README.md", /response-snippets\.md/, "maintainer response snippets link");
|
|
@@ -124,6 +130,35 @@ requireText("examples/support/support-lifecycle.md", /SECURITY\.md/, "lifecycle
|
|
|
124
130
|
requireText("examples/support/support-lifecycle.json", /docs-example-response/, "docs lifecycle response");
|
|
125
131
|
requireText("examples/support/support-lifecycle.json", /fixture-backlog-response/, "fixture lifecycle response");
|
|
126
132
|
requireText("examples/support/support-lifecycle.json", /rule-review-candidate-response/, "rule-review lifecycle response");
|
|
133
|
+
requireText("examples/support/outcome-prioritization.md", /Support Outcome Prioritization/, "support outcome prioritization heading");
|
|
134
|
+
requireText("examples/support/outcome-prioritization.md", /outcome-prioritization\.json/, "support prioritization JSON link");
|
|
135
|
+
requireText("examples/support/outcome-prioritization.md", /support lifecycle overview/, "support lifecycle prioritization link");
|
|
136
|
+
requireText("examples/support/outcome-prioritization.md", /docs-example/, "docs prioritization outcome");
|
|
137
|
+
requireText("examples/support/outcome-prioritization.md", /fixture-backlog/, "fixture prioritization outcome");
|
|
138
|
+
requireText("examples/support/outcome-prioritization.md", /rule-review-candidate/, "rule-review prioritization outcome");
|
|
139
|
+
requireText("examples/support/outcome-prioritization.md", /jester tune <rule-id> --json/, "tune JSON prioritization evidence");
|
|
140
|
+
requireText("examples/support/outcome-prioritization.md", /at least two sanitized reports/, "rule-review evidence threshold");
|
|
141
|
+
requireText("examples/support/outcome-prioritization.md", /SECURITY\.md/, "prioritization security redirect");
|
|
142
|
+
requireText("examples/support/outcome-prioritization.json", /docs-clarification-closeout/, "docs prioritization closeout");
|
|
143
|
+
requireText("examples/support/outcome-prioritization.json", /fixture-backlog-closeout/, "fixture prioritization closeout");
|
|
144
|
+
requireText("examples/support/outcome-prioritization.json", /rule-review-closeout/, "rule-review prioritization closeout");
|
|
145
|
+
requireText("examples/support/backlog-records.md", /Support Backlog Records/, "support backlog records heading");
|
|
146
|
+
requireText("examples/support/backlog-records.md", /backlog-records\.json/, "support backlog records JSON link");
|
|
147
|
+
requireText("examples/support/backlog-records.md", /support lifecycle overview/, "support lifecycle backlog link");
|
|
148
|
+
requireText("examples/support/backlog-records.md", /outcome prioritization guide/, "support prioritization backlog link");
|
|
149
|
+
requireText("examples/support/backlog-records.md", /closeout checklist/, "support closeout backlog link");
|
|
150
|
+
requireText("examples/support/backlog-records.md", /docs-clarification-backlog-record/, "docs backlog record");
|
|
151
|
+
requireText("examples/support/backlog-records.md", /fixture-backlog-record/, "fixture backlog record");
|
|
152
|
+
requireText("examples/support/backlog-records.md", /rule-review-candidate-backlog-record/, "rule-review backlog record");
|
|
153
|
+
requireText("examples/support/backlog-records.md", /docs-example/, "docs backlog outcome");
|
|
154
|
+
requireText("examples/support/backlog-records.md", /fixture-backlog/, "fixture backlog outcome");
|
|
155
|
+
requireText("examples/support/backlog-records.md", /rule-review-candidate/, "rule-review backlog outcome");
|
|
156
|
+
requireText("examples/support/backlog-records.md", /jester tune <rule-id> --json/, "tune JSON backlog evidence");
|
|
157
|
+
requireText("examples/support/backlog-records.md", /SECURITY\.md/, "backlog security redirect");
|
|
158
|
+
requireText("examples/support/backlog-records.md", /npm run support:check/, "support checker backlog command");
|
|
159
|
+
requireText("examples/support/backlog-records.json", /docs-clarification-backlog-record/, "docs backlog record JSON");
|
|
160
|
+
requireText("examples/support/backlog-records.json", /fixture-backlog-record/, "fixture backlog record JSON");
|
|
161
|
+
requireText("examples/support/backlog-records.json", /rule-review-candidate-backlog-record/, "rule-review backlog record JSON");
|
|
127
162
|
requireText("examples/support/response-snippets.md", /Maintainer Response Snippets/, "response snippets heading");
|
|
128
163
|
requireText("examples/support/response-snippets.md", /response-snippets\.json/, "response snippets JSON link");
|
|
129
164
|
requireText("examples/support/response-snippets.md", /docs-example/, "docs response outcome");
|
|
@@ -140,6 +175,8 @@ requireText("docs/MAINTAINER_TRIAGE.md", /feedback-template\.md/, "feedback temp
|
|
|
140
175
|
requireText("docs/MAINTAINER_TRIAGE.md", /report_gallery_feedback\.yml/, "report gallery issue template triage link");
|
|
141
176
|
requireText("docs/MAINTAINER_TRIAGE.md", /examples\/support/, "maintainer playbook triage link");
|
|
142
177
|
requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle\.md/, "support lifecycle triage link");
|
|
178
|
+
requireText("docs/MAINTAINER_TRIAGE.md", /outcome-prioritization\.md/, "support prioritization triage link");
|
|
179
|
+
requireText("docs/MAINTAINER_TRIAGE.md", /backlog-records\.md/, "support backlog records triage link");
|
|
143
180
|
requireText("docs/MAINTAINER_TRIAGE.md", /closeout-checklist\.md/, "support closeout checklist triage link");
|
|
144
181
|
requireText("docs/MAINTAINER_TRIAGE.md", /response-snippets\.md/, "maintainer response snippets triage link");
|
|
145
182
|
requireText("docs/MAINTAINER_TRIAGE.md", /docs-example/, "docs example triage outcome");
|
|
@@ -149,6 +186,8 @@ requireText("docs/MAINTAINER_TRIAGE.md", /npm(?:\.cmd)? run support:check/, "sup
|
|
|
149
186
|
requireText("docs/PRODUCTION_READINESS.md", /support:check/, "support checker readiness");
|
|
150
187
|
requireText("README.md", /feedback-template\.md/, "feedback template README link");
|
|
151
188
|
requireText("README.md", /support-lifecycle\.md/, "support lifecycle README link");
|
|
189
|
+
requireText("README.md", /outcome-prioritization\.md/, "support prioritization README link");
|
|
190
|
+
requireText("README.md", /backlog-records\.md/, "support backlog records README link");
|
|
152
191
|
requireText("README.md", /closeout-checklist\.md/, "support closeout checklist README link");
|
|
153
192
|
requireText("README.md", /examples\/support/, "maintainer triage playbook README link");
|
|
154
193
|
requireText("README.md", /response-snippets\.md/, "maintainer response snippets README link");
|
|
@@ -161,6 +200,8 @@ checkTriagePlaybook();
|
|
|
161
200
|
checkResponseSnippets();
|
|
162
201
|
checkCloseoutChecklist();
|
|
163
202
|
checkSupportLifecycle();
|
|
203
|
+
checkOutcomePrioritization();
|
|
204
|
+
checkBacklogRecords();
|
|
164
205
|
|
|
165
206
|
if (failures.length > 0) {
|
|
166
207
|
console.error("Support triage check failed:");
|
|
@@ -545,3 +586,225 @@ function checkSupportLifecycle() {
|
|
|
545
586
|
}
|
|
546
587
|
}
|
|
547
588
|
}
|
|
589
|
+
|
|
590
|
+
function checkOutcomePrioritization() {
|
|
591
|
+
const path = "examples/support/outcome-prioritization.json";
|
|
592
|
+
const priorities = readJson(path);
|
|
593
|
+
if (!priorities) {
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
if (!Array.isArray(priorities) || priorities.length !== 3) {
|
|
598
|
+
failures.push(`${path} should contain exactly three support outcome priorities.`);
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
const expected = [
|
|
603
|
+
{
|
|
604
|
+
outcome: "docs-example",
|
|
605
|
+
priority: "low",
|
|
606
|
+
nextArtifact: "docs-clarification-closeout",
|
|
607
|
+
checks: ["npm run reports:check", "npm run support:check"],
|
|
608
|
+
evidence: ["Nearest checked report", "Observed output", "No rule behavior change"]
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
outcome: "fixture-backlog",
|
|
612
|
+
priority: "medium",
|
|
613
|
+
nextArtifact: "fixture-backlog-closeout",
|
|
614
|
+
checks: ["npm run fixtures:check", "npm run fixtures:report", "npm run support:check"],
|
|
615
|
+
evidence: ["Smallest sanitized", "jester tune <rule-id> --json", "existing pass or quiet-pass fixture"]
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
outcome: "rule-review-candidate",
|
|
619
|
+
priority: "high",
|
|
620
|
+
nextArtifact: "rule-review-closeout",
|
|
621
|
+
checks: ["npm run fixtures:report -- --markdown", "npm run support:check"],
|
|
622
|
+
evidence: ["At least two sanitized", "fixture report evidence", "single fixture backlog item is not enough"]
|
|
623
|
+
}
|
|
624
|
+
];
|
|
625
|
+
const seenOutcomes = new Set();
|
|
626
|
+
|
|
627
|
+
for (const [index, entry] of priorities.entries()) {
|
|
628
|
+
const expectedEntry = expected[index];
|
|
629
|
+
if (entry?.outcome !== expectedEntry.outcome) {
|
|
630
|
+
failures.push(`${path} entry ${index + 1} should have outcome ${expectedEntry.outcome}.`);
|
|
631
|
+
continue;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
if (seenOutcomes.has(entry.outcome)) {
|
|
635
|
+
failures.push(`${path} has duplicate outcome ${entry.outcome}.`);
|
|
636
|
+
}
|
|
637
|
+
seenOutcomes.add(entry.outcome);
|
|
638
|
+
|
|
639
|
+
if (entry.priority !== expectedEntry.priority) {
|
|
640
|
+
failures.push(`${entry.outcome}.priority should be ${expectedEntry.priority}.`);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
if (typeof entry.title !== "string" || entry.title.length < 20) {
|
|
644
|
+
failures.push(`${entry.outcome}.title should explain the prioritization decision.`);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
if (typeof entry.useWhen !== "string" || entry.useWhen.length < 60) {
|
|
648
|
+
failures.push(`${entry.outcome}.useWhen should explain when to choose this outcome.`);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
if (typeof entry.backlogDestination !== "string" || entry.backlogDestination.length < 15) {
|
|
652
|
+
failures.push(`${entry.outcome}.backlogDestination should describe the follow-up destination.`);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if (entry.nextArtifact !== expectedEntry.nextArtifact) {
|
|
656
|
+
failures.push(`${entry.outcome}.nextArtifact should be ${expectedEntry.nextArtifact}.`);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
if (!Array.isArray(entry.minimumEvidence) || entry.minimumEvidence.length !== 3) {
|
|
660
|
+
failures.push(`${entry.outcome}.minimumEvidence should contain exactly three evidence thresholds.`);
|
|
661
|
+
} else {
|
|
662
|
+
const evidenceText = entry.minimumEvidence.join("\n");
|
|
663
|
+
for (const expectedEvidence of expectedEntry.evidence) {
|
|
664
|
+
if (!evidenceText.includes(expectedEvidence)) {
|
|
665
|
+
failures.push(`${entry.outcome}.minimumEvidence should include ${expectedEvidence}.`);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
if (!Array.isArray(entry.notEnoughEvidence) || entry.notEnoughEvidence.length !== 3) {
|
|
671
|
+
failures.push(`${entry.outcome}.notEnoughEvidence should contain exactly three guardrails.`);
|
|
672
|
+
} else {
|
|
673
|
+
const notEnoughText = entry.notEnoughEvidence.join("\n");
|
|
674
|
+
if (!/private|secret|SECURITY\.md|reproduction|rule/i.test(notEnoughText)) {
|
|
675
|
+
failures.push(`${entry.outcome}.notEnoughEvidence should include privacy, reproduction, or rule-change guardrails.`);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
if (!Array.isArray(entry.requiredChecks)) {
|
|
680
|
+
failures.push(`${entry.outcome}.requiredChecks should be an array.`);
|
|
681
|
+
continue;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
for (const check of expectedEntry.checks) {
|
|
685
|
+
if (!entry.requiredChecks.includes(check)) {
|
|
686
|
+
failures.push(`${entry.outcome}.requiredChecks should include ${check}.`);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
function checkBacklogRecords() {
|
|
693
|
+
const path = "examples/support/backlog-records.json";
|
|
694
|
+
const records = readJson(path);
|
|
695
|
+
if (!records) {
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
if (!Array.isArray(records) || records.length !== 3) {
|
|
700
|
+
failures.push(`${path} should contain exactly three support backlog records.`);
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
const expected = [
|
|
705
|
+
{
|
|
706
|
+
id: "docs-clarification-backlog-record",
|
|
707
|
+
outcome: "docs-example",
|
|
708
|
+
priority: "low",
|
|
709
|
+
sourceCloseout: "docs-clarification-closeout",
|
|
710
|
+
backlogType: "docs clarification",
|
|
711
|
+
checks: ["npm run reports:check", "npm run support:check"],
|
|
712
|
+
evidence: ["Nearest checked report", "Observed output", "No rule behavior change"]
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
id: "fixture-backlog-record",
|
|
716
|
+
outcome: "fixture-backlog",
|
|
717
|
+
priority: "medium",
|
|
718
|
+
sourceCloseout: "fixture-backlog-closeout",
|
|
719
|
+
backlogType: "pass or quiet-pass fixture",
|
|
720
|
+
checks: ["npm run fixtures:check", "npm run fixtures:report", "npm run support:check"],
|
|
721
|
+
evidence: ["Smallest sanitized", "jester tune <rule-id> --json", "existing pass or quiet-pass fixture"]
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
id: "rule-review-candidate-backlog-record",
|
|
725
|
+
outcome: "rule-review-candidate",
|
|
726
|
+
priority: "high",
|
|
727
|
+
sourceCloseout: "rule-review-closeout",
|
|
728
|
+
backlogType: "rule-review candidate",
|
|
729
|
+
checks: ["npm run fixtures:report -- --markdown", "npm run support:check"],
|
|
730
|
+
evidence: ["At least two sanitized", "fixture report evidence", "single fixture backlog item is not enough"]
|
|
731
|
+
}
|
|
732
|
+
];
|
|
733
|
+
const seenIds = new Set();
|
|
734
|
+
|
|
735
|
+
for (const [index, record] of records.entries()) {
|
|
736
|
+
const expectedRecord = expected[index];
|
|
737
|
+
if (record?.id !== expectedRecord.id) {
|
|
738
|
+
failures.push(`${path} entry ${index + 1} should have id ${expectedRecord.id}.`);
|
|
739
|
+
continue;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
if (seenIds.has(record.id)) {
|
|
743
|
+
failures.push(`${path} has duplicate id ${record.id}.`);
|
|
744
|
+
}
|
|
745
|
+
seenIds.add(record.id);
|
|
746
|
+
|
|
747
|
+
if (record.outcome !== expectedRecord.outcome) {
|
|
748
|
+
failures.push(`${record.id}.outcome should be ${expectedRecord.outcome}.`);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
if (record.priority !== expectedRecord.priority) {
|
|
752
|
+
failures.push(`${record.id}.priority should be ${expectedRecord.priority}.`);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
if (record.sourceCloseout !== expectedRecord.sourceCloseout) {
|
|
756
|
+
failures.push(`${record.id}.sourceCloseout should be ${expectedRecord.sourceCloseout}.`);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
if (record.prioritizationSource !== "outcome-prioritization.json") {
|
|
760
|
+
failures.push(`${record.id}.prioritizationSource should be outcome-prioritization.json.`);
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
if (record.backlogType !== expectedRecord.backlogType) {
|
|
764
|
+
failures.push(`${record.id}.backlogType should be ${expectedRecord.backlogType}.`);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
if (typeof record.publicTitle !== "string" || record.publicTitle.length < 20) {
|
|
768
|
+
failures.push(`${record.id}.publicTitle should be a useful public title.`);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
if (typeof record.publicSummary !== "string" || record.publicSummary.length < 50) {
|
|
772
|
+
failures.push(`${record.id}.publicSummary should be a useful public summary.`);
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
if (typeof record.nextAction !== "string" || record.nextAction.length < 40) {
|
|
776
|
+
failures.push(`${record.id}.nextAction should describe the backlog action.`);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
if (!Array.isArray(record.evidence) || record.evidence.length !== 3) {
|
|
780
|
+
failures.push(`${record.id}.evidence should contain exactly three evidence items.`);
|
|
781
|
+
} else {
|
|
782
|
+
const evidenceText = record.evidence.join("\n");
|
|
783
|
+
for (const expectedEvidence of expectedRecord.evidence) {
|
|
784
|
+
if (!evidenceText.includes(expectedEvidence)) {
|
|
785
|
+
failures.push(`${record.id}.evidence should include ${expectedEvidence}.`);
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
if (!Array.isArray(record.privacyReview) || record.privacyReview.length !== 3) {
|
|
791
|
+
failures.push(`${record.id}.privacyReview should contain exactly three privacy checks.`);
|
|
792
|
+
} else {
|
|
793
|
+
const privacyText = record.privacyReview.join("\n");
|
|
794
|
+
if (!/secret|private|SECURITY\.md|redacted|placeholder/i.test(privacyText)) {
|
|
795
|
+
failures.push(`${record.id}.privacyReview should include privacy and security routing guidance.`);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
if (!Array.isArray(record.requiredChecks)) {
|
|
800
|
+
failures.push(`${record.id}.requiredChecks should be an array.`);
|
|
801
|
+
continue;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
for (const check of expectedRecord.checks) {
|
|
805
|
+
if (!record.requiredChecks.includes(check)) {
|
|
806
|
+
failures.push(`${record.id}.requiredChecks should include ${check}.`);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
}
|