memento-mori-jester 0.1.98 → 0.1.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes to Memento Mori Jester are tracked here.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.1.99
8
+
9
+ - Added a checked public-safe support lifecycle worksheet for reviewing one report across report, triage, response, closeout, prioritization, backlog record, and backlog review stages.
10
+ - Added `support-lifecycle-worksheet.json` plus `npm run support:check` and production-readiness coverage so checklist items, record fields, stop conditions, outcomes, and privacy guardrails stay aligned.
11
+ - Updated README, maintainer triage docs, support examples, production-readiness docs, roadmap, and release notes for the active-review worksheet.
12
+
7
13
  ## 0.1.98
8
14
 
9
15
  - Added a compact checked support lifecycle map for scanning report, triage, response, closeout, prioritization, backlog record, and backlog review stages at a glance.
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 map](examples/support/support-lifecycle-map.md), [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 backlog review](examples/support/backlog-review.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 map](examples/support/support-lifecycle-map.md), [support lifecycle worksheet](examples/support/support-lifecycle-worksheet.md), [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 backlog review](examples/support/backlog-review.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,7 @@ 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 Map](examples/support/support-lifecycle-map.md)
454
+ - [Support Lifecycle Worksheet](examples/support/support-lifecycle-worksheet.md)
454
455
  - [Support Lifecycle Overview](examples/support/support-lifecycle.md)
455
456
  - [Support Outcome Prioritization](examples/support/outcome-prioritization.md)
456
457
  - [Support Backlog Records](examples/support/backlog-records.md)
@@ -480,6 +481,7 @@ Framework CI examples:
480
481
  - [Real-World Report Gallery](examples/reports)
481
482
  - [Report Gallery Feedback Template](examples/reports/feedback-template.md)
482
483
  - [Support Lifecycle Map](examples/support/support-lifecycle-map.md)
484
+ - [Support Lifecycle Worksheet](examples/support/support-lifecycle-worksheet.md)
483
485
  - [Support Lifecycle Overview](examples/support/support-lifecycle.md)
484
486
  - [Support Outcome Prioritization](examples/support/outcome-prioritization.md)
485
487
  - [Support Backlog Records](examples/support/backlog-records.md)
@@ -543,7 +545,7 @@ Maintainers can use [docs/MAINTAINER_TRIAGE.md](docs/MAINTAINER_TRIAGE.md) to tu
543
545
  Run `npm run fixtures:check` before merging fixture changes; it catches duplicate IDs, missing rule metadata, weak descriptions, unsafe-looking content, and duplicate content.
544
546
  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.
545
547
  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.
546
- Run `npm run support:check` after editing issue templates, support docs, the report gallery feedback path, the [support lifecycle map](examples/support/support-lifecycle-map.md), [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 backlog review](examples/support/backlog-review.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.
548
+ Run `npm run support:check` after editing issue templates, support docs, the report gallery feedback path, the [support lifecycle map](examples/support/support-lifecycle-map.md), [support lifecycle worksheet](examples/support/support-lifecycle-worksheet.md), [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 backlog review](examples/support/backlog-review.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.
547
549
  Run `npm run promo:card` to regenerate the repo-local social preview card after changing its copy or design.
548
550
  Run `npm run promo:check` after editing promo assets; it checks the current demo video, stills, docs, and fixture evidence numbers stay in sync.
549
551
  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,7 @@ 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 lifecycle worksheet in v0.1.99, turning the compact map into an active-review checklist with stage checks, record fields, and stop conditions.
9
10
  - Compact checked support lifecycle map in v0.1.98, giving maintainers a quick scan of report, triage, response, closeout, prioritization, backlog record, and backlog review.
10
11
  - Full checked support lifecycle overview in v0.1.97, extending the index from report, triage, response, and closeout through prioritization, backlog records, and backlog review.
11
12
  - Checked support backlog review in v0.1.96, helping maintainers revisit backlog records and keep them as docs, fixture, or rule-review work, or close them with no action when evidence goes stale.
@@ -90,6 +91,7 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
90
91
  - Collect real-world reports and fold the strongest redacted cases into more framework tuning cookbook recipes.
91
92
  - Add a small checked maintainer dashboard or report that summarizes open support backlog review states from public-safe JSON.
92
93
  - Add a generated support lifecycle status summary if backlog review records grow beyond the compact map.
94
+ - Add a checked anonymized example of a completed lifecycle worksheet once support reports accumulate.
93
95
  - Use support backlog record counts to choose the next docs, fixture, report-gallery, or rule-guidance batch.
94
96
  - Use repeated prioritized support outcomes to choose the next redacted fixture, report-gallery update, or rule-guidance review.
95
97
  - Add a hosted-page option or GitHub Pages instructions once the static page has settled.
@@ -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 map](../examples/support/support-lifecycle-map.md) for a quick scan of the path, or the full [support lifecycle overview](../examples/support/support-lifecycle.md) to see the whole path from report to backlog review. 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, then use [backlog-review.md](../examples/support/backlog-review.md) to revisit whether that artifact remains active or closes with no action.
24
+ When a report has enough public-safe detail to triage, start with the checked [support lifecycle map](../examples/support/support-lifecycle-map.md) for a quick scan of the path, then use the checked [support lifecycle worksheet](../examples/support/support-lifecycle-worksheet.md) to record each stage during active review. Use the full [support lifecycle overview](../examples/support/support-lifecycle.md) to see the whole path from report to backlog review. 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, then use [backlog-review.md](../examples/support/backlog-review.md) to revisit whether that artifact remains active or closes with no action.
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
 
@@ -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 compact checked support lifecycle map plus a full support lifecycle overview covering report, triage, response, closeout, prioritization, backlog record, and backlog review, plus the supporting outcome prioritization guide, backlog records, backlog review checklist, maintainer triage playbook, response snippets, and closeout checklist.
50
+ - `examples/support` provides a compact checked support lifecycle map, an active-review worksheet, and a full support lifecycle overview covering report, triage, response, closeout, prioritization, backlog record, and backlog review, plus the supporting outcome prioritization guide, backlog records, backlog review checklist, maintainer triage playbook, response snippets, and closeout checklist.
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 scan the support lifecycle map, audit the full lifecycle overview, 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, create a public-safe backlog record, and review aging records for keep-or-close decisions.
63
+ - `examples/support` shows maintainers how to scan the support lifecycle map, use the support lifecycle worksheet during active review, audit the full lifecycle overview, 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, create a public-safe backlog record, and review aging records for keep-or-close decisions.
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 map, the support lifecycle overview, outcome prioritization guide, backlog records, backlog review checklist, 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 map, support lifecycle worksheet, support lifecycle overview, outcome prioritization guide, backlog records, backlog review checklist, 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,45 @@
1
+ # Memento Mori Jester v0.1.99
2
+
3
+ ## Summary
4
+
5
+ This release adds a checked public-safe support lifecycle worksheet so maintainers can turn the compact lifecycle map into an active review checklist for one support report.
6
+
7
+ ## Changes
8
+
9
+ - Added `examples/support/support-lifecycle-worksheet.md` with stage-by-stage checks for:
10
+ `report -> triage -> response -> closeout -> prioritization -> backlog-record -> backlog-review`.
11
+ - Added `examples/support/support-lifecycle-worksheet.json` as the deterministic source for stage order, checklist items, record fields, stop conditions, outcomes, privacy guardrails, and required checks.
12
+ - Extended `npm run support:check` and `npm run production:check` so the worksheet stays aligned with the support lifecycle map and overview.
13
+ - Updated README, maintainer triage docs, support examples, production-readiness docs, roadmap, and changelog.
14
+
15
+ ## Public Interface Changes
16
+
17
+ - No CLI, MCP, config schema, rule, scoring, GitHub Action, or release automation changes.
18
+ - New package docs/examples only:
19
+ - `examples/support/support-lifecycle-worksheet.md`
20
+ - `examples/support/support-lifecycle-worksheet.json`
21
+
22
+ ## Release Validation
23
+
24
+ ```powershell
25
+ npm.cmd test
26
+ npm.cmd run demo:svg:check
27
+ npm.cmd run promo:card:check
28
+ npm.cmd run promo:check
29
+ npm.cmd run support:check
30
+ npm.cmd run production:check
31
+ npm.cmd run pack:dry
32
+ git diff --check
33
+ node .\dist\cli.js doctor
34
+ node .\dist\cli.js summary --kind command "git reset --hard"
35
+ git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.99 support lifecycle worksheet"
36
+ ```
37
+
38
+ ## Post-Publish Smoke
39
+
40
+ ```powershell
41
+ npm.cmd view memento-mori-jester version --silent
42
+ npx.cmd -y memento-mori-jester@latest doctor
43
+ npx.cmd -y memento-mori-jester@latest summary --kind command "git reset --hard"
44
+ npm.cmd run support:check
45
+ ```
@@ -2,7 +2,7 @@
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 compact checked [support lifecycle map](support-lifecycle-map.md) when you need a quick scan of the path: report, triage, response, closeout, prioritization, backlog record, and backlog review. Use the full checked [support lifecycle overview](support-lifecycle.md) when you need the outcome table in one place. The lifecycle sources are [support-lifecycle-map.json](support-lifecycle-map.json) and [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, then use [backlog-review.md](backlog-review.md) to decide whether the item stays active or closes with no action.
5
+ Start with the compact checked [support lifecycle map](support-lifecycle-map.md) when you need a quick scan of the path: report, triage, response, closeout, prioritization, backlog record, and backlog review. Use the checked [support lifecycle worksheet](support-lifecycle-worksheet.md) during an active review so every stage has concrete checks and record fields. Use the full checked [support lifecycle overview](support-lifecycle.md) when you need the outcome table in one place. The lifecycle sources are [support-lifecycle-map.json](support-lifecycle-map.json), [support-lifecycle-worksheet.json](support-lifecycle-worksheet.json), and [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, then use [backlog-review.md](backlog-review.md) to decide whether the item stays active or closes with no action.
6
6
 
7
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). The review source is [backlog-review.json](backlog-review.json).
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  This is the compact public-safe map for maintainers who need the whole support chain without reading every checklist first.
4
4
 
5
- The checked source is [support-lifecycle-map.json](support-lifecycle-map.json). Use the full [support lifecycle overview](support-lifecycle.md) when you need the outcome table and per-stage artifact references.
5
+ The checked source is [support-lifecycle-map.json](support-lifecycle-map.json). Use the [support lifecycle worksheet](support-lifecycle-worksheet.md) during an active review, and use the full [support lifecycle overview](support-lifecycle.md) when you need the outcome table and per-stage artifact references.
6
6
 
7
7
  ```text
8
8
  report
@@ -0,0 +1,98 @@
1
+ {
2
+ "title": "Support Lifecycle Worksheet",
3
+ "sourceMap": "examples/support/support-lifecycle-map.json",
4
+ "flow": [
5
+ "report",
6
+ "triage",
7
+ "response",
8
+ "closeout",
9
+ "prioritization",
10
+ "backlog-record",
11
+ "backlog-review"
12
+ ],
13
+ "stages": [
14
+ {
15
+ "id": "report",
16
+ "artifact": "examples/reports/feedback-template.md",
17
+ "checklist": [
18
+ "Confirm the issue uses a redacted report, false-positive, bug, or report-gallery feedback template.",
19
+ "Confirm the report includes a package version, nearest checked example or minimal input, and redacted doctor --json output when useful.",
20
+ "Confirm no secrets, private code, private paths, customer data, full logs, unredacted SARIF, or exploitable details are present."
21
+ ],
22
+ "record": ["source issue", "package version", "sanitized summary", "safe to discuss publicly"],
23
+ "stopIf": "The report includes sensitive material or exploitable detail; route through SECURITY.md instead of the public lifecycle."
24
+ },
25
+ {
26
+ "id": "triage",
27
+ "artifact": "examples/support/triage-playbook.json",
28
+ "checklist": [
29
+ "Reproduce or compare the smallest public-safe summary against latest or local main.",
30
+ "Identify whether the report is expected docs behavior, a plausible fixture boundary, or a repeated rule-review pattern.",
31
+ "Choose exactly one lifecycle outcome: docs-example, fixture-backlog, or rule-review-candidate."
32
+ ],
33
+ "record": ["selected outcome", "rule id or report id", "why the outcome fits"],
34
+ "stopIf": "The report cannot be reproduced or reduced without private material."
35
+ },
36
+ {
37
+ "id": "response",
38
+ "artifact": "examples/support/response-snippets.json",
39
+ "checklist": [
40
+ "Pick the matching checked response snippet for the selected outcome.",
41
+ "Ask only for redacted diagnostics such as doctor --json, summary, or tune <rule-id> --json.",
42
+ "Give the reporter one next command or one public-safe follow-up link."
43
+ ],
44
+ "record": ["snippet id", "next command", "public-safe follow-up link"],
45
+ "stopIf": "The response would require secrets, private repo code, full logs, or private paths."
46
+ },
47
+ {
48
+ "id": "closeout",
49
+ "artifact": "examples/support/closeout-checklist.json",
50
+ "checklist": [
51
+ "Record whether the docs clarification shipped or queued, fixture backlog was created, or rule-review candidate was opened.",
52
+ "Link only public-safe artifacts, placeholders, or sanitized issue references.",
53
+ "Keep rule behavior unchanged unless a separate checked rule-review change exists."
54
+ ],
55
+ "record": ["closeout id", "decision status", "follow-up link placeholder"],
56
+ "stopIf": "The closeout cannot explain the decision without private context."
57
+ },
58
+ {
59
+ "id": "prioritization",
60
+ "artifact": "examples/support/outcome-prioritization.json",
61
+ "checklist": [
62
+ "Use the outcome prioritization guide to set low, medium, or high priority.",
63
+ "Confirm the minimum evidence threshold for the selected outcome is met.",
64
+ "Confirm there is enough public-safe evidence before opening follow-up work."
65
+ ],
66
+ "record": ["priority", "minimum evidence", "not enough evidence guardrail"],
67
+ "stopIf": "The priority depends on private reports that cannot be summarized safely."
68
+ },
69
+ {
70
+ "id": "backlog-record",
71
+ "artifact": "examples/support/backlog-records.json",
72
+ "checklist": [
73
+ "Create a public-safe backlog record only after closeout and prioritization agree.",
74
+ "Include the source closeout, public title, public summary, expected next action, and required checks.",
75
+ "Include privacy review notes showing the artifact is redacted and safe to keep public."
76
+ ],
77
+ "record": ["backlog record id", "backlog type", "next action", "required checks"],
78
+ "stopIf": "The backlog item would reveal private code, customer data, or a live exploit path."
79
+ },
80
+ {
81
+ "id": "backlog-review",
82
+ "artifact": "examples/support/backlog-review.json",
83
+ "checklist": [
84
+ "Revisit whether the item remains docs clarification, fixture backlog, or rule-review candidate.",
85
+ "Close as closed-no-action when evidence is stale, duplicated, private, security-sensitive, or already resolved.",
86
+ "Confirm current checks still pass before keeping or closing the item."
87
+ ],
88
+ "record": ["review decision", "review cadence", "next action", "checks run"],
89
+ "stopIf": "The review uncovers sensitive details that belong in the private security flow."
90
+ }
91
+ ],
92
+ "outcomes": ["docs-example", "fixture-backlog", "rule-review-candidate", "closed-no-action"],
93
+ "privacyGuardrail": "Do not paste secrets, private code, private paths, customer data, full logs, unredacted SARIF, package publishing credentials, MCP data exposure, or exploitable security details into the public worksheet.",
94
+ "requiredChecks": [
95
+ "npm run support:check",
96
+ "npm run production:check"
97
+ ]
98
+ }
@@ -0,0 +1,82 @@
1
+ # Support Lifecycle Worksheet
2
+
3
+ Use this public-safe worksheet while reviewing one support report. It turns the [support lifecycle map](support-lifecycle-map.md) into a stage-by-stage checklist.
4
+
5
+ The checked source is [support-lifecycle-worksheet.json](support-lifecycle-worksheet.json). Use [support-lifecycle.md](support-lifecycle.md) for the outcome table after the worksheet identifies the right path.
6
+
7
+ ## Report
8
+
9
+ - [ ] Confirm the issue uses a redacted report, false-positive, bug, or report-gallery feedback template.
10
+ - [ ] Confirm the report includes a package version, nearest checked example or minimal input, and redacted `doctor --json` output when useful.
11
+ - [ ] Confirm no secrets, private code, private paths, customer data, full logs, unredacted SARIF, or exploitable details are present.
12
+
13
+ Record: `source issue`, `package version`, `sanitized summary`, and `safe to discuss publicly`.
14
+
15
+ Stop and route through [SECURITY.md](../../SECURITY.md) if the report includes sensitive material or exploitable detail.
16
+
17
+ ## Triage
18
+
19
+ - [ ] Reproduce or compare the smallest public-safe summary against `latest` or local `main`.
20
+ - [ ] Identify whether the report is expected docs behavior, a plausible fixture boundary, or a repeated rule-review pattern.
21
+ - [ ] Choose exactly one lifecycle outcome: `docs-example`, `fixture-backlog`, or `rule-review-candidate`.
22
+
23
+ Record: `selected outcome`, `rule id or report id`, and `why the outcome fits`.
24
+
25
+ Stop if the report cannot be reproduced or reduced without private material.
26
+
27
+ ## Response
28
+
29
+ - [ ] Pick the matching checked response snippet for the selected outcome.
30
+ - [ ] Ask only for redacted diagnostics such as `doctor --json`, `summary`, or `tune <rule-id> --json`.
31
+ - [ ] Give the reporter one next command or one public-safe follow-up link.
32
+
33
+ Record: `snippet id`, `next command`, and `public-safe follow-up link`.
34
+
35
+ Stop if the response would require secrets, private repo code, full logs, or private paths.
36
+
37
+ ## Closeout
38
+
39
+ - [ ] Record whether the docs clarification shipped or queued, fixture backlog was created, or rule-review candidate was opened.
40
+ - [ ] Link only public-safe artifacts, placeholders, or sanitized issue references.
41
+ - [ ] Keep rule behavior unchanged unless a separate checked rule-review change exists.
42
+
43
+ Record: `closeout id`, `decision status`, and `follow-up link placeholder`.
44
+
45
+ Stop if the closeout cannot explain the decision without private context.
46
+
47
+ ## Prioritization
48
+
49
+ - [ ] Use the outcome prioritization guide to set low, medium, or high priority.
50
+ - [ ] Confirm the minimum evidence threshold for the selected outcome is met.
51
+ - [ ] Confirm there is enough public-safe evidence before opening follow-up work.
52
+
53
+ Record: `priority`, `minimum evidence`, and `not enough evidence guardrail`.
54
+
55
+ Stop if the priority depends on private reports that cannot be summarized safely.
56
+
57
+ ## Backlog Record
58
+
59
+ - [ ] Create a public-safe backlog record only after closeout and prioritization agree.
60
+ - [ ] Include the source closeout, public title, public summary, expected next action, and required checks.
61
+ - [ ] Include privacy review notes showing the artifact is redacted and safe to keep public.
62
+
63
+ Record: `backlog record id`, `backlog type`, `next action`, and `required checks`.
64
+
65
+ Stop if the backlog item would reveal private code, customer data, or a live exploit path.
66
+
67
+ ## Backlog Review
68
+
69
+ - [ ] Revisit whether the item remains docs clarification, fixture backlog, or rule-review candidate.
70
+ - [ ] Close as `closed-no-action` when evidence is stale, duplicated, private, security-sensitive, or already resolved.
71
+ - [ ] Confirm current checks still pass before keeping or closing the item.
72
+
73
+ Record: `review decision`, `review cadence`, `next action`, and `checks run`.
74
+
75
+ Stop if the review uncovers sensitive details that belong in the private security flow.
76
+
77
+ ## Required Checks
78
+
79
+ ```powershell
80
+ npm run support:check
81
+ npm run production:check
82
+ ```
@@ -6,7 +6,7 @@ This index shows the public-safe support path at a glance:
6
6
  report -> triage -> response -> closeout -> prioritization -> backlog-record -> backlog-review
7
7
  ```
8
8
 
9
- The compact map is [support-lifecycle-map.md](support-lifecycle-map.md), backed by [support-lifecycle-map.json](support-lifecycle-map.json). The checked source for the full outcome table is [support-lifecycle.json](support-lifecycle.json). It ties together the [report gallery feedback template](../reports/feedback-template.md), [triage playbook](triage-playbook.json), [response snippets](response-snippets.md), [closeout checklist](closeout-checklist.md), [outcome prioritization guide](outcome-prioritization.md), [backlog records](backlog-records.md), and [backlog review checklist](backlog-review.md).
9
+ The compact map is [support-lifecycle-map.md](support-lifecycle-map.md), backed by [support-lifecycle-map.json](support-lifecycle-map.json). The active review worksheet is [support-lifecycle-worksheet.md](support-lifecycle-worksheet.md), backed by [support-lifecycle-worksheet.json](support-lifecycle-worksheet.json). The checked source for the full outcome table is [support-lifecycle.json](support-lifecycle.json). It ties together the [report gallery feedback template](../reports/feedback-template.md), [triage playbook](triage-playbook.json), [response snippets](response-snippets.md), [closeout checklist](closeout-checklist.md), [outcome prioritization guide](outcome-prioritization.md), [backlog records](backlog-records.md), and [backlog review checklist](backlog-review.md).
10
10
 
11
11
  ## Outcomes
12
12
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mori-jester",
3
- "version": "0.1.98",
3
+ "version": "0.1.99",
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": {
@@ -106,6 +106,8 @@ for (const path of [
106
106
  "examples/support/response-snippets.json",
107
107
  "examples/support/support-lifecycle-map.md",
108
108
  "examples/support/support-lifecycle-map.json",
109
+ "examples/support/support-lifecycle-worksheet.md",
110
+ "examples/support/support-lifecycle-worksheet.json",
109
111
  "examples/support/support-lifecycle.md",
110
112
  "examples/support/support-lifecycle.json",
111
113
  "examples/support/triage-playbook.json",
@@ -141,6 +143,7 @@ requireText("README.md", /examples\/support/, "support triage playbook link");
141
143
  requireText("README.md", /response-snippets\.md/, "support response snippets link");
142
144
  requireText("README.md", /closeout-checklist\.md/, "support closeout checklist link");
143
145
  requireText("README.md", /support-lifecycle-map\.md/, "support lifecycle map link");
146
+ requireText("README.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
144
147
  requireText("README.md", /support-lifecycle\.md/, "support lifecycle overview link");
145
148
  requireText("README.md", /outcome-prioritization\.md/, "support outcome prioritization link");
146
149
  requireText("README.md", /backlog-review\.md/, "support backlog review link");
@@ -170,6 +173,7 @@ requireText("docs/PRODUCTION_READINESS.md", /response snippets/i, "support respo
170
173
  requireText("docs/PRODUCTION_READINESS.md", /closeout checklist/i, "support closeout checklist readiness");
171
174
  requireText("docs/PRODUCTION_READINESS.md", /support lifecycle overview/i, "support lifecycle overview readiness");
172
175
  requireText("docs/PRODUCTION_READINESS.md", /support lifecycle map/i, "support lifecycle map readiness");
176
+ requireText("docs/PRODUCTION_READINESS.md", /support lifecycle worksheet/i, "support lifecycle worksheet readiness");
173
177
  requireText("docs/PRODUCTION_READINESS.md", /outcome prioritization guide/i, "support outcome prioritization readiness");
174
178
  requireText("docs/PRODUCTION_READINESS.md", /backlog review/i, "support backlog review readiness");
175
179
  requireText("docs/PRODUCTION_READINESS.md", /backlog records/i, "support backlog records readiness");
@@ -200,6 +204,7 @@ requireText("docs/MAINTAINER_TRIAGE.md", /examples\/support/, "support triage pl
200
204
  requireText("docs/MAINTAINER_TRIAGE.md", /response-snippets\.md/, "support response snippets link");
201
205
  requireText("docs/MAINTAINER_TRIAGE.md", /closeout-checklist\.md/, "support closeout checklist link");
202
206
  requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle-map\.md/, "support lifecycle map link");
207
+ requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
203
208
  requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle\.md/, "support lifecycle overview link");
204
209
  requireText("docs/MAINTAINER_TRIAGE.md", /outcome-prioritization\.md/, "support outcome prioritization link");
205
210
  requireText("docs/MAINTAINER_TRIAGE.md", /backlog-review\.md/, "support backlog review link");
@@ -240,6 +245,8 @@ requireText("examples/support/README.md", /response-snippets\.md/, "support resp
240
245
  requireText("examples/support/README.md", /closeout-checklist\.md/, "support closeout checklist link");
241
246
  requireText("examples/support/README.md", /support-lifecycle-map\.md/, "support lifecycle map link");
242
247
  requireText("examples/support/README.md", /support-lifecycle-map\.json/, "support lifecycle map JSON link");
248
+ requireText("examples/support/README.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
249
+ requireText("examples/support/README.md", /support-lifecycle-worksheet\.json/, "support lifecycle worksheet JSON link");
243
250
  requireText("examples/support/README.md", /support-lifecycle\.md/, "support lifecycle overview link");
244
251
  requireText("examples/support/README.md", /outcome-prioritization\.md/, "support outcome prioritization link");
245
252
  requireText("examples/support/README.md", /backlog-review\.md/, "support backlog review link");
@@ -265,6 +272,7 @@ requireText("examples/support/closeout-checklist.json", /fixture-backlog-closeou
265
272
  requireText("examples/support/closeout-checklist.json", /rule-review-closeout/, "support rule-review closeout record");
266
273
  requireText("examples/support/support-lifecycle-map.md", /Support Lifecycle Map/, "support lifecycle map heading");
267
274
  requireText("examples/support/support-lifecycle-map.md", /support-lifecycle-map\.json/, "support lifecycle map JSON link");
275
+ requireText("examples/support/support-lifecycle-map.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
268
276
  requireText("examples/support/support-lifecycle-map.md", /report\s*\n\s*-> triage\s*\n\s*-> response\s*\n\s*-> closeout\s*\n\s*-> prioritization\s*\n\s*-> backlog-record\s*\n\s*-> backlog-review/, "support lifecycle map compact flow");
269
277
  requireText("examples/support/support-lifecycle-map.md", /docs-clarification-backlog-record/, "support lifecycle map docs backlog record");
270
278
  requireText("examples/support/support-lifecycle-map.md", /fixture-backlog-record/, "support lifecycle map fixture backlog record");
@@ -274,8 +282,19 @@ requireText("examples/support/support-lifecycle-map.md", /SECURITY\.md/, "suppor
274
282
  requireText("examples/support/support-lifecycle-map.json", /Support Lifecycle Map/, "support lifecycle map JSON title");
275
283
  requireText("examples/support/support-lifecycle-map.json", /backlog-record/, "support lifecycle map backlog-record stage");
276
284
  requireText("examples/support/support-lifecycle-map.json", /backlog-review/, "support lifecycle map backlog-review stage");
285
+ requireText("examples/support/support-lifecycle-worksheet.md", /Support Lifecycle Worksheet/, "support lifecycle worksheet heading");
286
+ requireText("examples/support/support-lifecycle-worksheet.md", /support-lifecycle-worksheet\.json/, "support lifecycle worksheet JSON link");
287
+ requireText("examples/support/support-lifecycle-worksheet.md", /support lifecycle map/, "support lifecycle worksheet map link");
288
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Report/, "support lifecycle worksheet report stage");
289
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Backlog Review/, "support lifecycle worksheet backlog review stage");
290
+ requireText("examples/support/support-lifecycle-worksheet.md", /Record:/, "support lifecycle worksheet record fields");
291
+ requireText("examples/support/support-lifecycle-worksheet.md", /SECURITY\.md/, "support lifecycle worksheet security redirect");
292
+ requireText("examples/support/support-lifecycle-worksheet.json", /Support Lifecycle Worksheet/, "support lifecycle worksheet JSON title");
293
+ requireText("examples/support/support-lifecycle-worksheet.json", /support-lifecycle-map\.json/, "support lifecycle worksheet source map");
294
+ requireText("examples/support/support-lifecycle-worksheet.json", /closed-no-action/, "support lifecycle worksheet closed no-action outcome");
277
295
  requireText("examples/support/support-lifecycle.md", /Support Lifecycle Overview/, "support lifecycle heading");
278
296
  requireText("examples/support/support-lifecycle.md", /support-lifecycle-map\.md/, "support lifecycle map link");
297
+ requireText("examples/support/support-lifecycle.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
279
298
  requireText("examples/support/support-lifecycle.md", /support-lifecycle\.json/, "support lifecycle JSON link");
280
299
  requireText("examples/support/support-lifecycle.md", /report -> triage -> response -> closeout -> prioritization -> backlog-record -> backlog-review/, "support lifecycle flow");
281
300
  requireText("examples/support/support-lifecycle.md", /docs-example/, "support lifecycle docs outcome");
@@ -356,6 +375,7 @@ requireText("scripts/check-support-triage.mjs", /response-snippets\.json/, "supp
356
375
  requireText("scripts/check-support-triage.mjs", /closeout-checklist\.json/, "support closeout checklist guard");
357
376
  requireText("scripts/check-support-triage.mjs", /support-lifecycle\.json/, "support lifecycle overview guard");
358
377
  requireText("scripts/check-support-triage.mjs", /support-lifecycle-map\.json/, "support lifecycle map guard");
378
+ requireText("scripts/check-support-triage.mjs", /support-lifecycle-worksheet\.json/, "support lifecycle worksheet guard");
359
379
  requireText("scripts/check-support-triage.mjs", /outcome-prioritization\.json/, "support outcome prioritization guard");
360
380
  requireText("scripts/check-support-triage.mjs", /backlog-records\.json/, "support backlog records guard");
361
381
  requireText("scripts/check-support-triage.mjs", /backlog-review\.json/, "support backlog review guard");
@@ -38,6 +38,8 @@ const supportFiles = [
38
38
  "examples/support/response-snippets.json",
39
39
  "examples/support/support-lifecycle-map.md",
40
40
  "examples/support/support-lifecycle-map.json",
41
+ "examples/support/support-lifecycle-worksheet.md",
42
+ "examples/support/support-lifecycle-worksheet.json",
41
43
  "examples/support/support-lifecycle.md",
42
44
  "examples/support/support-lifecycle.json",
43
45
  "examples/support/triage-playbook.json",
@@ -93,8 +95,10 @@ requireText("examples/support/README.md", /Maintainer Triage Playbook/, "maintai
93
95
  requireText("examples/support/README.md", /backlog-review\.md/, "support backlog review link");
94
96
  requireText("examples/support/README.md", /backlog-records\.md/, "support backlog records link");
95
97
  requireText("examples/support/README.md", /support-lifecycle-map\.md/, "support lifecycle map link");
98
+ requireText("examples/support/README.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
96
99
  requireText("examples/support/README.md", /support-lifecycle\.md/, "support lifecycle overview link");
97
100
  requireText("examples/support/README.md", /support-lifecycle-map\.json/, "support lifecycle map JSON link");
101
+ requireText("examples/support/README.md", /support-lifecycle-worksheet\.json/, "support lifecycle worksheet JSON link");
98
102
  requireText("examples/support/README.md", /outcome-prioritization\.md/, "support outcome prioritization link");
99
103
  requireText("examples/support/README.md", /closeout-checklist\.md/, "support closeout checklist link");
100
104
  requireText("examples/support/README.md", /triage-playbook\.json/, "maintainer playbook JSON link");
@@ -124,6 +128,7 @@ requireText("examples/support/closeout-checklist.json", /fixture-backlog-closeou
124
128
  requireText("examples/support/closeout-checklist.json", /rule-review-closeout/, "rule-review closeout record");
125
129
  requireText("examples/support/support-lifecycle-map.md", /Support Lifecycle Map/, "support lifecycle map heading");
126
130
  requireText("examples/support/support-lifecycle-map.md", /support-lifecycle-map\.json/, "support lifecycle map JSON link");
131
+ requireText("examples/support/support-lifecycle-map.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
127
132
  requireText("examples/support/support-lifecycle-map.md", /report\s*\n\s*-> triage\s*\n\s*-> response\s*\n\s*-> closeout\s*\n\s*-> prioritization\s*\n\s*-> backlog-record\s*\n\s*-> backlog-review/, "support lifecycle compact flow");
128
133
  requireText("examples/support/support-lifecycle-map.md", /Maintainer question/, "support lifecycle map scan questions");
129
134
  requireText("examples/support/support-lifecycle-map.md", /docs-clarification-backlog-record/, "docs backlog map record");
@@ -136,8 +141,28 @@ requireText("examples/support/support-lifecycle-map.json", /Support Lifecycle Ma
136
141
  requireText("examples/support/support-lifecycle-map.json", /backlog-record/, "support lifecycle map backlog-record stage");
137
142
  requireText("examples/support/support-lifecycle-map.json", /backlog-review/, "support lifecycle map backlog-review stage");
138
143
  requireText("examples/support/support-lifecycle-map.json", /closed-no-action/, "support lifecycle map closed no-action fallback");
144
+ requireText("examples/support/support-lifecycle-worksheet.md", /Support Lifecycle Worksheet/, "support lifecycle worksheet heading");
145
+ requireText("examples/support/support-lifecycle-worksheet.md", /support-lifecycle-worksheet\.json/, "support lifecycle worksheet JSON link");
146
+ requireText("examples/support/support-lifecycle-worksheet.md", /support lifecycle map/, "support lifecycle worksheet map link");
147
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Report/, "worksheet report stage");
148
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Triage/, "worksheet triage stage");
149
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Response/, "worksheet response stage");
150
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Closeout/, "worksheet closeout stage");
151
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Prioritization/, "worksheet prioritization stage");
152
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Backlog Record/, "worksheet backlog record stage");
153
+ requireText("examples/support/support-lifecycle-worksheet.md", /## Backlog Review/, "worksheet backlog review stage");
154
+ requireText("examples/support/support-lifecycle-worksheet.md", /Record:/, "worksheet record fields");
155
+ requireText("examples/support/support-lifecycle-worksheet.md", /Stop and route through|Stop if/, "worksheet stop conditions");
156
+ requireText("examples/support/support-lifecycle-worksheet.md", /SECURITY\.md/, "worksheet security redirect");
157
+ requireText("examples/support/support-lifecycle-worksheet.md", /npm run support:check/, "support checker worksheet command");
158
+ requireText("examples/support/support-lifecycle-worksheet.json", /Support Lifecycle Worksheet/, "support lifecycle worksheet JSON title");
159
+ requireText("examples/support/support-lifecycle-worksheet.json", /support-lifecycle-map\.json/, "worksheet source map");
160
+ requireText("examples/support/support-lifecycle-worksheet.json", /docs-example/, "worksheet docs outcome");
161
+ requireText("examples/support/support-lifecycle-worksheet.json", /closed-no-action/, "worksheet closed no-action outcome");
139
162
  requireText("examples/support/support-lifecycle.md", /Support Lifecycle Overview/, "support lifecycle heading");
140
163
  requireText("examples/support/support-lifecycle.md", /support-lifecycle-map\.md/, "support lifecycle map link");
164
+ requireText("examples/support/support-lifecycle.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet link");
165
+ requireText("examples/support/support-lifecycle.md", /support-lifecycle-worksheet\.json/, "support lifecycle worksheet JSON link");
141
166
  requireText("examples/support/support-lifecycle.md", /support-lifecycle\.json/, "support lifecycle JSON link");
142
167
  requireText("examples/support/support-lifecycle.md", /report -> triage -> response -> closeout -> prioritization -> backlog-record -> backlog-review/, "support lifecycle flow");
143
168
  requireText("examples/support/support-lifecycle.md", /report gallery feedback template/, "report feedback lifecycle link");
@@ -220,6 +245,7 @@ requireText("docs/MAINTAINER_TRIAGE.md", /feedback-template\.md/, "feedback temp
220
245
  requireText("docs/MAINTAINER_TRIAGE.md", /report_gallery_feedback\.yml/, "report gallery issue template triage link");
221
246
  requireText("docs/MAINTAINER_TRIAGE.md", /examples\/support/, "maintainer playbook triage link");
222
247
  requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle-map\.md/, "support lifecycle map triage link");
248
+ requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet triage link");
223
249
  requireText("docs/MAINTAINER_TRIAGE.md", /support-lifecycle\.md/, "support lifecycle triage link");
224
250
  requireText("docs/MAINTAINER_TRIAGE.md", /outcome-prioritization\.md/, "support prioritization triage link");
225
251
  requireText("docs/MAINTAINER_TRIAGE.md", /backlog-review\.md/, "support backlog review triage link");
@@ -233,6 +259,7 @@ requireText("docs/MAINTAINER_TRIAGE.md", /npm(?:\.cmd)? run support:check/, "sup
233
259
  requireText("docs/PRODUCTION_READINESS.md", /support:check/, "support checker readiness");
234
260
  requireText("README.md", /feedback-template\.md/, "feedback template README link");
235
261
  requireText("README.md", /support-lifecycle-map\.md/, "support lifecycle map README link");
262
+ requireText("README.md", /support-lifecycle-worksheet\.md/, "support lifecycle worksheet README link");
236
263
  requireText("README.md", /support-lifecycle\.md/, "support lifecycle README link");
237
264
  requireText("README.md", /outcome-prioritization\.md/, "support prioritization README link");
238
265
  requireText("README.md", /backlog-review\.md/, "support backlog review README link");
@@ -248,6 +275,7 @@ requireText("package.json", /npm run support:check/, "support checker in npm tes
248
275
  checkTriagePlaybook();
249
276
  checkResponseSnippets();
250
277
  checkCloseoutChecklist();
278
+ checkSupportLifecycleWorksheet();
251
279
  checkSupportLifecycleMap();
252
280
  checkSupportLifecycle();
253
281
  checkOutcomePrioritization();
@@ -765,6 +793,89 @@ function checkSupportLifecycleMap() {
765
793
  }
766
794
  }
767
795
 
796
+ function checkSupportLifecycleWorksheet() {
797
+ const path = "examples/support/support-lifecycle-worksheet.json";
798
+ const worksheet = readJson(path);
799
+ if (!worksheet) {
800
+ return;
801
+ }
802
+
803
+ const expectedStageIds = ["report", "triage", "response", "closeout", "prioritization", "backlog-record", "backlog-review"];
804
+ const expectedArtifacts = [
805
+ "examples/reports/feedback-template.md",
806
+ "examples/support/triage-playbook.json",
807
+ "examples/support/response-snippets.json",
808
+ "examples/support/closeout-checklist.json",
809
+ "examples/support/outcome-prioritization.json",
810
+ "examples/support/backlog-records.json",
811
+ "examples/support/backlog-review.json"
812
+ ];
813
+ const expectedOutcomes = ["docs-example", "fixture-backlog", "rule-review-candidate", "closed-no-action"];
814
+
815
+ if (worksheet.title !== "Support Lifecycle Worksheet") {
816
+ failures.push(`${path}.title should be Support Lifecycle Worksheet.`);
817
+ }
818
+
819
+ if (worksheet.sourceMap !== "examples/support/support-lifecycle-map.json") {
820
+ failures.push(`${path}.sourceMap should point at examples/support/support-lifecycle-map.json.`);
821
+ }
822
+
823
+ if (!Array.isArray(worksheet.flow) || worksheet.flow.join("|") !== expectedStageIds.join("|")) {
824
+ failures.push(`${path}.flow should contain the support lifecycle order.`);
825
+ }
826
+
827
+ if (!Array.isArray(worksheet.stages) || worksheet.stages.length !== expectedStageIds.length) {
828
+ failures.push(`${path}.stages should contain seven lifecycle checklist stages.`);
829
+ } else {
830
+ for (const [index, stage] of worksheet.stages.entries()) {
831
+ if (stage?.id !== expectedStageIds[index]) {
832
+ failures.push(`${path}.stages[${index}].id should be ${expectedStageIds[index]}.`);
833
+ }
834
+
835
+ if (stage?.artifact !== expectedArtifacts[index]) {
836
+ failures.push(`${path}.stages[${index}].artifact should be ${expectedArtifacts[index]}.`);
837
+ }
838
+
839
+ if (!Array.isArray(stage?.checklist) || stage.checklist.length !== 3) {
840
+ failures.push(`${path}.stages[${index}].checklist should contain exactly three checklist items.`);
841
+ } else {
842
+ for (const [itemIndex, item] of stage.checklist.entries()) {
843
+ if (typeof item !== "string" || item.length < 35) {
844
+ failures.push(`${path}.stages[${index}].checklist[${itemIndex}] should be a useful maintainer check.`);
845
+ }
846
+ }
847
+ }
848
+
849
+ if (!Array.isArray(stage?.record) || stage.record.length < 3) {
850
+ failures.push(`${path}.stages[${index}].record should name at least three fields to record.`);
851
+ }
852
+
853
+ if (typeof stage?.stopIf !== "string" || !/private|secret|SECURITY\.md|sensitive|exploit/i.test(stage.stopIf)) {
854
+ failures.push(`${path}.stages[${index}].stopIf should include public-safe stop guidance.`);
855
+ }
856
+ }
857
+ }
858
+
859
+ if (!Array.isArray(worksheet.outcomes) || worksheet.outcomes.join("|") !== expectedOutcomes.join("|")) {
860
+ failures.push(`${path}.outcomes should include docs-example, fixture-backlog, rule-review-candidate, and closed-no-action.`);
861
+ }
862
+
863
+ if (typeof worksheet.privacyGuardrail !== "string" || !/secrets|private|customer data|SECURITY\.md|exploitable/i.test(worksheet.privacyGuardrail)) {
864
+ failures.push(`${path}.privacyGuardrail should include public-safe support guidance.`);
865
+ }
866
+
867
+ const requiredChecks = ["npm run support:check", "npm run production:check"];
868
+ if (!Array.isArray(worksheet.requiredChecks)) {
869
+ failures.push(`${path}.requiredChecks should be an array.`);
870
+ } else {
871
+ for (const check of requiredChecks) {
872
+ if (!worksheet.requiredChecks.includes(check)) {
873
+ failures.push(`${path}.requiredChecks should include ${check}.`);
874
+ }
875
+ }
876
+ }
877
+ }
878
+
768
879
  function checkOutcomePrioritization() {
769
880
  const path = "examples/support/outcome-prioritization.json";
770
881
  const priorities = readJson(path);