@dzhechkov/p-replicator 1.10.4 → 1.13.1

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.
Files changed (136) hide show
  1. package/.dz-manifest.json +312 -76
  2. package/CHANGELOG.md +232 -0
  3. package/MULTIPLATFORM_ROADMAP.md +1 -1
  4. package/README/eng/01_quickstart.md +3 -3
  5. package/README/eng/02_user_guide.md +1 -1
  6. package/README/eng/03_admin_guide.md +2 -2
  7. package/README/eng/04_api_reference.md +11 -5
  8. package/README/eng/05_architecture.md +1 -1
  9. package/README/eng/README.md +2 -1
  10. package/README/ru/01_quickstart.md +3 -3
  11. package/README/ru/02_user_guide.md +1 -1
  12. package/README/ru/03_admin_guide.md +2 -2
  13. package/README/ru/04_api_reference.md +11 -5
  14. package/README/ru/05_architecture.md +1 -1
  15. package/README/ru/README.md +2 -1
  16. package/README/ru/html/index.html +9 -9
  17. package/README.md +278 -39
  18. package/package.json +5 -4
  19. package/sbom.json +665 -75
  20. package/scripts/check-pipeline-gaps.sh +413 -0
  21. package/src/commands/doctor.js +94 -4
  22. package/src/commands/init.js +1 -1
  23. package/src/rule-components.json +15 -0
  24. package/src/utils.js +35 -11
  25. package/templates/.claude/agents/harvest-coordinator.md +10 -1
  26. package/templates/.claude/agents/product-discoverer.md +38 -0
  27. package/templates/.claude/agents/replicate-coordinator.md +11 -1
  28. package/templates/.claude/commands/feature.md +81 -9
  29. package/templates/.claude/commands/go.md +9 -0
  30. package/templates/.claude/commands/harvest.md +39 -3
  31. package/templates/.claude/commands/myinsights.md +21 -26
  32. package/templates/.claude/commands/replicate.md +171 -37
  33. package/templates/.claude/commands/start.md +29 -0
  34. package/templates/.claude/hooks/capture-source-path.cjs +795 -0
  35. package/templates/.claude/hooks/check-canon.cjs +493 -0
  36. package/templates/.claude/hooks/check-embed-contract.cjs +374 -0
  37. package/templates/.claude/hooks/check-external-deps.cjs +288 -0
  38. package/templates/.claude/hooks/check-file-ownership.cjs +424 -0
  39. package/templates/.claude/hooks/check-handoff-manifest.cjs +367 -0
  40. package/templates/.claude/hooks/check-job-contract.cjs +501 -0
  41. package/templates/.claude/hooks/check-look-origin.cjs +240 -0
  42. package/templates/.claude/hooks/check-look-trace.cjs +385 -0
  43. package/templates/.claude/hooks/check-metric-source.cjs +296 -0
  44. package/templates/.claude/hooks/check-model-cost.cjs +470 -0
  45. package/templates/.claude/hooks/check-ports.cjs +434 -24
  46. package/templates/.claude/hooks/check-source-version.cjs +312 -0
  47. package/templates/.claude/hooks/check-swarm-receipts.cjs +197 -0
  48. package/templates/.claude/hooks/check-webhook-contract.cjs +535 -0
  49. package/templates/.claude/hooks/session-insights.cjs +158 -25
  50. package/templates/.claude/hooks/statusline.cjs +2 -2
  51. package/templates/.claude/hooks/write-insight.cjs +253 -0
  52. package/templates/.claude/rules/cost-of-detection-ladder.md +96 -0
  53. package/templates/.claude/rules/docker-ports.md +41 -19
  54. package/templates/.claude/rules/embeddable-widget.md +73 -0
  55. package/templates/.claude/rules/feature-lifecycle.md +13 -3
  56. package/templates/.claude/rules/honest-configuration.md +54 -0
  57. package/templates/.claude/rules/incoming-webhooks.md +99 -0
  58. package/templates/.claude/rules/insights-capture.md +10 -5
  59. package/templates/.claude/rules/long-running-job.md +73 -0
  60. package/templates/.claude/rules/model-call-cost.md +85 -0
  61. package/templates/.claude/rules/replicate-pipeline.md +123 -52
  62. package/templates/.claude/rules/skill-interface-protocol.md +1 -0
  63. package/templates/.claude/rules/swarm-file-evidence.md +46 -0
  64. package/templates/.claude/settings.json +13 -1
  65. package/templates/.claude/skills/brutal-honesty-review/SKILL.md +9 -0
  66. package/templates/.claude/skills/cc-toolkit-generator-enhanced/SKILL.md +4 -0
  67. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md +46 -1
  68. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/04-generate-p1.md +7 -1
  69. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/06-package-deliver.md +20 -2
  70. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/claude-md-strategy.md +7 -0
  71. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/automation-commands.md +17 -0
  72. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle-ent.md +43 -5
  73. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md +43 -7
  74. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/start-command.md +19 -1
  75. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/swarm-file-evidence.md +151 -0
  76. package/templates/.claude/skills/goap-research-ed25519/SKILL.md +37 -22
  77. package/templates/.claude/skills/goap-research-ed25519/references/negative-results.md +94 -0
  78. package/templates/.claude/skills/goap-research-ed25519/scripts/check_report_evidence.py +368 -4
  79. package/templates/.claude/skills/goap-research-ed25519/scripts/ed25519_verifier.py +122 -5
  80. package/templates/.claude/skills/goap-research-ed25519/scripts/evidence_fetch.py +33 -16
  81. package/templates/.claude/skills/goap-research-ed25519/scripts/quote_provenance.py +342 -0
  82. package/templates/.claude/skills/goap-research-ed25519/scripts/test_ed25519_verifier.py +60 -0
  83. package/templates/.claude/skills/goap-research-ed25519/scripts/test_evidence_provenance.py +139 -6
  84. package/templates/.claude/skills/goap-research-ed25519/scripts/test_quote_provenance.py +274 -0
  85. package/templates/.claude/skills/goap-research-ed25519/scripts/test_suite_completeness.py +2 -1
  86. package/templates/.claude/skills/knowledge-extractor/SKILL.md +4 -0
  87. package/templates/.claude/skills/knowledge-extractor/modules/01-agent-review.md +16 -5
  88. package/templates/.claude/skills/pipeline-forge/SKILL.md +18 -23
  89. package/templates/.claude/skills/pipeline-forge/examples/replicate-analysis.md +7 -2
  90. package/templates/.claude/skills/pipeline-forge/references/patterns-catalog.md +19 -1
  91. package/templates/.claude/skills/pipeline-forge/references/self-extracted-patterns.md +17 -6
  92. package/templates/.claude/skills/pipeline-forge/references/skill-anatomy.md +0 -1
  93. package/templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md +21 -1
  94. package/templates/.claude/skills/sparc-prd-mini/SKILL.md +234 -716
  95. package/tests/e2e/lifecycle.test.js +55 -9
  96. package/tests/e2e/packed-insights-writer.test.js +308 -0
  97. package/tests/fixtures/prep-traceability-fixture/docs/features/order-refund/01_specification.md +29 -0
  98. package/tests/fixtures/prep-traceability-fixture/docs/features/order-refund/02_pseudocode.md +57 -0
  99. package/tests/snapshot/baseline.json +72 -46
  100. package/tests/snapshot/templates.test.js +47 -0
  101. package/tests/unit/absence-is-not-emptiness.test.js +15 -1
  102. package/tests/unit/capture-source-path.test.js +492 -0
  103. package/tests/unit/check-canon.test.js +403 -0
  104. package/tests/unit/check-embed-contract.test.js +422 -0
  105. package/tests/unit/check-external-deps.test.js +363 -0
  106. package/tests/unit/check-file-ownership.test.js +388 -0
  107. package/tests/unit/check-handoff-manifest.test.js +410 -0
  108. package/tests/unit/check-job-contract.test.js +514 -0
  109. package/tests/unit/check-look-origin.test.js +180 -0
  110. package/tests/unit/check-look-trace.test.js +420 -0
  111. package/tests/unit/check-metric-source.test.js +325 -0
  112. package/tests/unit/check-model-cost.test.js +425 -0
  113. package/tests/unit/check-pipeline-gaps.test.js +94 -0
  114. package/tests/unit/check-ports.test.js +773 -2
  115. package/tests/unit/check-source-version.test.js +344 -0
  116. package/tests/unit/check-swarm-receipts.test.js +231 -0
  117. package/tests/unit/check-webhook-contract.test.js +536 -0
  118. package/tests/unit/db-port-rule.test.js +43 -6
  119. package/tests/unit/detection-ladder-contract.test.js +302 -0
  120. package/tests/unit/detection-ladder-registry.test.js +52 -0
  121. package/tests/unit/doctor-insight-flow.test.js +315 -0
  122. package/tests/unit/external-dependency-check.test.js +19 -19
  123. package/tests/unit/generator-swarm-contract.test.js +287 -0
  124. package/tests/unit/guard-honest-input-meta.test.js +64 -0
  125. package/tests/unit/honest-failure-rules.test.js +574 -0
  126. package/tests/unit/hooks-project-anchored.test.js +67 -3
  127. package/tests/unit/insights-docs-tell-the-truth.test.js +52 -31
  128. package/tests/unit/insights-dz-delegation.test.js +197 -0
  129. package/tests/unit/insights-writer.test.js +285 -0
  130. package/tests/unit/look-phase-contract.test.js +231 -0
  131. package/tests/unit/negative-conclusion-gate.test.js +300 -0
  132. package/tests/unit/quote-provenance.test.js +122 -0
  133. package/tests/unit/shipped-suite-context.test.js +3 -1
  134. package/tests/unit/traceability-machine-ids.test.js +413 -0
  135. package/tests/unit/traceability-negative-fixture.test.js +322 -0
  136. package/tests/unit/utils.test.js +40 -2
@@ -1,38 +1,60 @@
1
1
  {
2
- "generatedAt": "2026-08-27T15:11:31.068Z",
3
- "totalFiles": 138,
2
+ "generatedAt": "2026-09-02T06:02:58.142Z",
3
+ "totalFiles": 164,
4
4
  "files": {
5
5
  ".claude/agents/doc-validator.md": "e57950758cd4764b2cb54b3f1905567e9dbc1ed20ac6ecd30998614894689f4f",
6
- ".claude/agents/harvest-coordinator.md": "70fa884057669902e18744915305705cf9e45e738a83d7bb5ab011a3b72d683c",
7
- ".claude/agents/product-discoverer.md": "f74683fe91b4357d6fb4024ed47b4d5a129ea6375ca6b223dee97176d74acf1c",
8
- ".claude/agents/replicate-coordinator.md": "e86060110ab188109cf908878206543f414993e14dad01f8dc19f041ee6497a7",
6
+ ".claude/agents/harvest-coordinator.md": "71e524e8379df46bbf457dbc1d4480634e05c99b7d3a4f59a356b8d71a0a4166",
7
+ ".claude/agents/product-discoverer.md": "be7d707a5fc1ee2eb18dda9e904ffbdc0be21c874b3a721349fd9e840bf77bc8",
8
+ ".claude/agents/replicate-coordinator.md": "bbfe18a7642954f357db08e849349fee02681e2f0ffa036539c45d98dbaba960",
9
9
  ".claude/commands/deploy.md": "27f5424ee217163c55e5e6b9322a1f0858159407bd24ebd6d6588d6c22a5f890",
10
10
  ".claude/commands/docs.md": "be03592cb3f1d61b60dc96d3e26d71281ad4eb2d4626012c080ce609a32c96e4",
11
- ".claude/commands/feature.md": "3b605c004ae6d794dee30892956dc0a9536195e828929bdaff134f3e952e87bb",
12
- ".claude/commands/go.md": "655dc9cad37b61a9f283cef15e435c492ee7cbc88a6ce59295ac32c975dee858",
13
- ".claude/commands/harvest.md": "c074fe7799f594dda44c5f8166da707f25cee51b12f758dea562a8c1e6ac5dcd",
14
- ".claude/commands/myinsights.md": "93258a3340f99a0f14b374746ae2934b01d7cefe06d575434868eb98da2d854a",
11
+ ".claude/commands/feature.md": "b2bb83fce09f823a36c943f397d63ff9d9406da1dadc055c4f187f8ff964d1ce",
12
+ ".claude/commands/go.md": "e7337012dccaab09e0cf27a696ebff14bea4626fb5167538af7da2f5cc7b597a",
13
+ ".claude/commands/harvest.md": "ed6355c102af0f2c62bf6714fce63157e0cb1c1ee85bc32c96f137b8b0c0e1ba",
14
+ ".claude/commands/myinsights.md": "f31c5e133b5027197359e4179cbba1ab535f990634a69ea7c5c73bd2bc329d68",
15
15
  ".claude/commands/next.md": "1e4984306c3aa80dfc8734dc1c975dfe5fdf2cf6396ddd759e4c7635646107b8",
16
16
  ".claude/commands/plan.md": "6fef889f51168981bf4a98b8392a0d595e3d199e1cfaa8e08c0a181ec6c440e4",
17
- ".claude/commands/replicate.md": "8862d0dc117815b1c3fc7f6e929996e2458783f1ac443eb70bc2a7ebe63a67c3",
17
+ ".claude/commands/replicate.md": "165d7b3c0606be6817893b53cbfc5ca55c7b81cbe35cbdd0dccf8679d702e81a",
18
18
  ".claude/commands/run.md": "87144dfe8c56c15ba7c117daa544d8a08b84d7205f21dafcc48d27c6c3995059",
19
- ".claude/commands/start.md": "4aaebc10ca8d607d4b2b43883d82392e9788c2f183878a49fc0d1ed54d07ee95",
19
+ ".claude/commands/start.md": "fb8a7762f4073b9e8689dec3830680907efb9ec68bb2faa39b8a547793d9a078",
20
20
  ".claude/hooks/autocommit-insights.cjs": "5e7cef87b24d457f25315d79fe15f0dfaf94d9269495d638817f0faee2593c6f",
21
21
  ".claude/hooks/autocommit-plans.cjs": "9bb404b7f4fda5de03e6c2f16bf8939a79ec1944538767b04bcccc6cf50cc03d",
22
22
  ".claude/hooks/autocommit-roadmap.cjs": "f4dcc9ffd9a3aed91dd56e011e699fcf8af903cc81594e4ab1ef61e5432a36ad",
23
+ ".claude/hooks/capture-source-path.cjs": "bed92548c3313d69110b6cc06e6b2b858d9d548b8c18c82750ae90d514212bf2",
24
+ ".claude/hooks/check-canon.cjs": "99e6bff9b0078eb2ec23f7df98b7ac06c894f9018eba4a8c358e8f92e5ec7b06",
23
25
  ".claude/hooks/check-docs-complete.cjs": "27c05c2adcedc806e395b30b455243193a4fbd0968ce96e415679e1f78db951a",
26
+ ".claude/hooks/check-embed-contract.cjs": "9e963a07c12350b760264133021e75fb699439b1f060332e1ccdd962b645b4a0",
27
+ ".claude/hooks/check-external-deps.cjs": "7bce49a744170a3193edf4b2238bcc5a6f1b0efa29333760a52e4fd145739d18",
28
+ ".claude/hooks/check-file-ownership.cjs": "c6273e7b0817d15e375586131924a08095722aff7d0e6a6a04c857a480788e1f",
24
29
  ".claude/hooks/check-growth-trace.cjs": "91994fc109c8440306c9dd3d5eea176c533eb0818fcdb09bac2b309397d9908a",
25
- ".claude/hooks/check-ports.cjs": "1813aa60e4d15c5f6ce54a9b3471c3772efe60c332316183c7ad8f5b619f2169",
26
- ".claude/hooks/session-insights.cjs": "46f8357e3886a6d54db1ab4af969b9b8643ae5937ba59038a5651ffbcfd0d30e",
30
+ ".claude/hooks/check-handoff-manifest.cjs": "768cd0befc0da3adcddcded86ed6d1bd1ac4f25afb563ae578002060a54968cf",
31
+ ".claude/hooks/check-job-contract.cjs": "48676c52eba3d0dd01e8c9764a2becfdcc8112423dc9711db7c18a8c2a5870a7",
32
+ ".claude/hooks/check-look-origin.cjs": "ebde0d8287601aecd8024edb0647f20eeaf8130f3ef920bb6a47b15aef297213",
33
+ ".claude/hooks/check-look-trace.cjs": "2952d8547feff344ec18289e1eaf5d067ada2af6e13541e25e73a8dfd7caf2bc",
34
+ ".claude/hooks/check-metric-source.cjs": "315deda6354f91737165786bdb22b799517bd80530e5b4584593c4f4df84c56e",
35
+ ".claude/hooks/check-model-cost.cjs": "425bda547661e0b31f313d6bb371db4d303cc83a43189fb4dc981e1fb43fac06",
36
+ ".claude/hooks/check-ports.cjs": "2b458cf78367ec7752174f08aa40109b3b6217e405f99a46e18e75e4b69bc87e",
37
+ ".claude/hooks/check-source-version.cjs": "b9dc2eee7403119481ea2c49a94581613f2c134685448736c2734948a638a010",
38
+ ".claude/hooks/check-swarm-receipts.cjs": "9fa83d78b085d8eea28958b4722999ba44a7bd47c98fe5a96127fc5b5230b40c",
39
+ ".claude/hooks/check-webhook-contract.cjs": "dfa27bd24cee8868fd60be5d24749c206f303fe4afcc1e72024d526324562a39",
40
+ ".claude/hooks/session-insights.cjs": "31fbe90d81b01dfb56557ed5d68dbde2211a14d5469c5d3761f45fb63c07c3a7",
27
41
  ".claude/hooks/state-update.cjs": "47146a76b768ac2273abe8f2f017856a0e28b45afaf90048148da417dd19604e",
28
- ".claude/hooks/statusline.cjs": "465190ab21610357094fd6eba188ba9f7086dc5a933568f40a7f7c715ccd6745",
29
- ".claude/rules/docker-ports.md": "bef41c25c875479341f68783c2d64572800d4710f55401e55519245f03d22efb",
30
- ".claude/rules/feature-lifecycle.md": "f9ddc8c889ab7938a7207b36ae46c36be05e9b870956ef16617bf31b2f78c758",
42
+ ".claude/hooks/statusline.cjs": "6e30ccdcdbe3c36896b85821f8986077a0e4065fdff3b103d669fac7ad44670e",
43
+ ".claude/hooks/write-insight.cjs": "743f2d85b037cf522dfaf4775947b0cd331e52f2f304e88360c160e0e8e9a589",
44
+ ".claude/rules/cost-of-detection-ladder.md": "f15309ee8f1494478ff7678380dbe8fc8eecd154be36d57c9090cd17126a07da",
45
+ ".claude/rules/docker-ports.md": "59eb430f29dd762e8b76ad6d1177fe8b5b250de007856c743387cb88ee157942",
46
+ ".claude/rules/embeddable-widget.md": "0159224f8e9599b67a860738bb42e3e40adf598176c48ea6c86a01c891f0f18c",
47
+ ".claude/rules/feature-lifecycle.md": "4e926f84f244feb6824114a0624733738669c93e0508693fa2afa4e9a35c2aa3",
31
48
  ".claude/rules/git-workflow.md": "7d8d2ded47fcc0fb95da3dc226efa6cb3c80d6adf7296977588c181dfce20192",
32
- ".claude/rules/insights-capture.md": "488d694caffe7a32915b0ec1beb7a84b223fe602722c5bb91ab8bf2785626387",
33
- ".claude/rules/replicate-pipeline.md": "99289f711c34cfddddbef5328b74749fc63d1f74636c6a4e4d61caa202fad05d",
34
- ".claude/rules/skill-interface-protocol.md": "7669309b0ae4330bc6cf6b26bd9cfc01d7b99a8e70c1f056a52574430db9378e",
35
- ".claude/settings.json": "b1df6cf834ccfa227f3318a70862115c17838ab31253e9d8d89381b7763e61fd",
49
+ ".claude/rules/honest-configuration.md": "851bc28e9e2baf1043bc09b982f3df3431bc7af1e076f8ff9df3d6729835bad5",
50
+ ".claude/rules/incoming-webhooks.md": "92f3de02814ed0610df644acf554f4b41b2bae2f9d281695e2e217a1d6558e84",
51
+ ".claude/rules/insights-capture.md": "d529e6be79178636ca362d83366b1dd7a843371e8ba4f2b09d65c009fab52dc4",
52
+ ".claude/rules/long-running-job.md": "e6bd0efff89338998d34440a94dc9288cf7bcf790b27bcaa51b83d43f57942ed",
53
+ ".claude/rules/model-call-cost.md": "26c3b20ac3ed7f9cf6deb5e94302ade87f9e3e51fffca7ac2377ff31bc144f34",
54
+ ".claude/rules/replicate-pipeline.md": "879ca7b6ca9039c7b94f6b9df2eadca9ec5fd0f97da5f468d5ee723f3d47f438",
55
+ ".claude/rules/skill-interface-protocol.md": "c3f624d0a8a4c7e0f5744e529eb4486cc0589fdb732b9799bccc75091a6d63ca",
56
+ ".claude/rules/swarm-file-evidence.md": "c71a216dbc3fd633c30949823ceac354f8439b96279a1a8dd606afb1b3ef5c45",
57
+ ".claude/settings.json": "18db09827dce410667b93e2b1a41ef8e46d4431114733e4304a5fc2192b2fc66",
36
58
  ".claude/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml": "855c155d55575e12aab23fb3a5fb2fada74d93974ff755dfedac6f2d5bd41f13",
37
59
  ".claude/skills/brutal-honesty-review/README.md": "2a026b4af50b21456e50424fbfa089cb983fbbaa0c68024c8c17c695bea25a57",
38
60
  ".claude/skills/brutal-honesty-review/resources/assessment-rubrics.md": "dac09c91c765e2211799cc230738fb72a966f47511edb872306a906e49640cbe",
@@ -41,77 +63,81 @@
41
63
  ".claude/skills/brutal-honesty-review/scripts/assess-code.sh": "2b10d2972b1379adde9a68ddf8bcdb399b7d65075e458a54523ffd8d99ddc746",
42
64
  ".claude/skills/brutal-honesty-review/scripts/assess-tests.sh": "d33e760a0739e9291f6087adf189f01eb7c4a1136d9128390dd6e3ad8eadda6f",
43
65
  ".claude/skills/brutal-honesty-review/scripts/validate-config.json": "7418284839f89735d01f50eefdb488b013e0076f6003a67683062429c14984c6",
44
- ".claude/skills/brutal-honesty-review/SKILL.md": "21e41129dac8e99485b501dcb3767d5f4461ce527782fa7bc71f89dabe5bd2bd",
66
+ ".claude/skills/brutal-honesty-review/SKILL.md": "f49957f8bac6b55ab49bb953867b1aa3d6d658f4a1d24eddec5b05a71a07da54",
45
67
  ".claude/skills/cc-toolkit-generator-enhanced/modules/01-detect-parse.md": "85c72f6daa5af88b4a7ff520a387f47a7c92b81cb1f0757550c8b58100a97be6",
46
68
  ".claude/skills/cc-toolkit-generator-enhanced/modules/02-analyze-map.md": "5939f3fe6ae542fabb8e665dc373a20410d8de917362fcb3ecac504286f41836",
47
- ".claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md": "e1ae2dd69db0d68fe276c1d0e57bd19921bf98fe91fe054716add76338442891",
48
- ".claude/skills/cc-toolkit-generator-enhanced/modules/04-generate-p1.md": "081284d3858c5dd89b45fc8a2b83bbc0477843f864cbceb6d9f8c3629b198a0a",
69
+ ".claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md": "db63c7c7e1277c0b0c51a1f18986abe0257d079c20938416b673effee5edecaf",
70
+ ".claude/skills/cc-toolkit-generator-enhanced/modules/04-generate-p1.md": "d40062dffa70aede07dd1411a1f7cff83bb33aa45746d6e65eac8a7016ce3a33",
49
71
  ".claude/skills/cc-toolkit-generator-enhanced/modules/05-generate-p2p3.md": "9535eaa5fa1be0804369aa4e8ee6f6f580839ea2c3c7b7aa51584e298a928093",
50
- ".claude/skills/cc-toolkit-generator-enhanced/modules/06-package-deliver.md": "d7d7effe411b6dc885f2cff04ccc931bed06c9245ebde34c5842d130b0f1e89d",
72
+ ".claude/skills/cc-toolkit-generator-enhanced/modules/06-package-deliver.md": "b1dbb09e6bf5bef980517def86032288c53a87a367c7d7d554fa2591a585b2b8",
51
73
  ".claude/skills/cc-toolkit-generator-enhanced/modules/07-harvest-feedback.md": "2121fa2e93b0d0e01418d92ca12c2dd2831596ff11a1ec44b436b530198fca91",
52
74
  ".claude/skills/cc-toolkit-generator-enhanced/modules/08-skill-composition.md": "683b254e400414b432827bedf4153a122322125eff053da4ccfeb3a62bab2a77",
53
75
  ".claude/skills/cc-toolkit-generator-enhanced/modules/09-cross-project-learning.md": "c395bc42a40ed14c0b8fe274df516082db0490228c82aba6a56f23b8f41d3d43",
54
76
  ".claude/skills/cc-toolkit-generator-enhanced/modules/README.md": "9dbcc9c0978d06cbe31caffa909741fdb3a38d3cd1e6e98addf95628ec8394a0",
55
- ".claude/skills/cc-toolkit-generator-enhanced/references/claude-md-strategy.md": "88cdab1687096d58dc4450cdf81d24d00fdb493b2cc4960030b30fd57d1ca2da",
77
+ ".claude/skills/cc-toolkit-generator-enhanced/references/claude-md-strategy.md": "14366a8e645efdea181ccefb20ebb3f157ef9b723fa56f359cdcc983624b5131",
56
78
  ".claude/skills/cc-toolkit-generator-enhanced/references/enhanced-recommendations.md": "657e35db0cb77d3a9d1a4d01215a9b8d50441dd863593bee3a84f62aad8b00bc",
57
79
  ".claude/skills/cc-toolkit-generator-enhanced/references/extended-mapping.md": "5e87c91956eabc70b4a1084b47b2c9a20ede18bb245735812ead956eafabf3af",
58
80
  ".claude/skills/cc-toolkit-generator-enhanced/references/maturity-integration.md": "aa4e743bcd0281525336a298d0489c31481f69ff1a534e1ed1d262d888937deb",
59
81
  ".claude/skills/cc-toolkit-generator-enhanced/references/security-patterns-library.md": "5f1d650c426cbd2c9536b385306605ea62a5a520ee4566d23ca7254409c672a5",
60
- ".claude/skills/cc-toolkit-generator-enhanced/references/templates/automation-commands.md": "23b8204fdc70b5afc5430cbe503af709a04b26716d2d2e07889283a755858fee",
82
+ ".claude/skills/cc-toolkit-generator-enhanced/references/templates/automation-commands.md": "9ce3db4c3c5b9696a312152067c1869b1f421ce77fbcfdca83edaa797c5caf3f",
61
83
  ".claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-agents.md": "c91f81da197a072b57378fd0018eea26c35d909a558bdca6f070eb60153c97b3",
62
84
  ".claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-hooks-commands.md": "8398f2493434db101476300e514a34bf8124a51eb732cf81923f9a5b5a3d5db4",
63
85
  ".claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-skills.md": "2f1019d5da7d695983aee79186a47fcefccbfa24db48219c04f9bb9feb757d3a",
64
86
  ".claude/skills/cc-toolkit-generator-enhanced/references/templates/enhanced-claude-md.md": "db6898b7202b84965cbff9195a6ce780cadd6aeb64adae3fbfd951443a6bc43d",
65
- ".claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle-ent.md": "eb9025b687f0408b33280bf5fcc6c8be9b1670a544dd90b510557b89ae6cc123",
66
- ".claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md": "7b01140a304c060fb085ded8711189ac3f259f999df1cb42380d0274191f1b25",
87
+ ".claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle-ent.md": "7a4be2ea28b973470d3c71fb083db7042ee6a2ee0f3564c7caa7ecb425e0ae09",
88
+ ".claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md": "e734df95afd0f10aa9abc4e696b93d1701d393664a44411c4c78a11dab5c14cf",
67
89
  ".claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-suggestions.md": "3b1c20d2394e180720447416767fbfae99168cf9ca846bf64907f6fe5cd906da",
68
90
  ".claude/skills/cc-toolkit-generator-enhanced/references/templates/insights-system.md": "244c2ef5f417c5d0097accf5ccfffd9de93d167efbfc6818cb9a8196139e096e",
69
91
  ".claude/skills/cc-toolkit-generator-enhanced/references/templates/mcp.md": "63d1e6dabf5bb29534e6fa11d9dd531ec55a48cda661f0faf7a29dad6f49296f",
70
- ".claude/skills/cc-toolkit-generator-enhanced/references/templates/start-command.md": "e037a7e73e65e5216f95f27a255009c4c2b95f0f2d6b7c575d70813efac34438",
71
- ".claude/skills/cc-toolkit-generator-enhanced/SKILL.md": "26fb1a3c0961fbb1f5f7e81ec5134bbe49ba0f99175c394cdf0c6b8a35568be2",
92
+ ".claude/skills/cc-toolkit-generator-enhanced/references/templates/start-command.md": "68b5f933f9d720de3bf2054154bb4316ba4d6dd02b31dc866d73fdf90927b46a",
93
+ ".claude/skills/cc-toolkit-generator-enhanced/references/templates/swarm-file-evidence.md": "661f24e764d6eababcf65d7bfb4c66cca90541c821ade4986ade46423d69ece6",
94
+ ".claude/skills/cc-toolkit-generator-enhanced/SKILL.md": "ef4f8901f49f7fbb7db0c2994973c42840e3e909f1585c70a4f7442752b41265",
72
95
  ".claude/skills/explore/references/questioning-techniques.md": "ec0dd00871d3abe950f9cf375216a43043827897166c4165c3fa581839851195",
73
96
  ".claude/skills/explore/references/task-brief-templates.md": "4e9292479e120afce944b747bb7b4a7226c41e9880708d620de3ea4fa4ef0249",
74
97
  ".claude/skills/explore/SKILL.md": "2473e7961845db0d64566cd42627b374d1830664b9e302058a1b1aa466bc7361",
75
98
  ".claude/skills/goap-research-ed25519/references/ed25519-verification.md": "2742f14b472bff69c83f24d9bac5bf023bd7f9ecc3e659742ac3152a239dd68f",
99
+ ".claude/skills/goap-research-ed25519/references/negative-results.md": "64bf39ca20d7d11c02c981b97f72a258a2874eafdc0a6a2935e54278c529ee5b",
76
100
  ".claude/skills/goap-research-ed25519/references/research-actions.md": "156d2f8ce342f7013bc758fe7c0d3ad3041b4f67f30dbcf8d59e091cb70d9a9c",
77
101
  ".claude/skills/goap-research-ed25519/references/source-evaluation.md": "d6a19abb6be64dc9e1f539903080029125d2d899da4de3063e75e1afb7e4906f",
78
- ".claude/skills/goap-research-ed25519/scripts/check_report_evidence.py": "5053e677f11d00b4dd8365a81eafa1d2c961eebd25c33f72b02455573a934a32",
79
- ".claude/skills/goap-research-ed25519/scripts/ed25519_verifier.py": "f4a2ac9e6473201583643fe8abf47560863cec600344dad5c9df06091b4298f5",
80
- ".claude/skills/goap-research-ed25519/scripts/evidence_fetch.py": "5f4d7cb5d6fb3106d64130b6606582eb55a4f633ef969cf7890b1de1c179345b",
102
+ ".claude/skills/goap-research-ed25519/scripts/check_report_evidence.py": "ca663eab0fe31eeeacfbc71b4f436f516bdf118da7f1fd28fe3956b5069f27c1",
103
+ ".claude/skills/goap-research-ed25519/scripts/ed25519_verifier.py": "76ac4a9d5374002a98880e5328d84c50e85d7da06a1fb04e476805b6d9a147e4",
104
+ ".claude/skills/goap-research-ed25519/scripts/evidence_fetch.py": "5bdc8e97e6bff7c449dca1f5643d6bb2fca1aee28a91001407dfc28cfa8a233f",
81
105
  ".claude/skills/goap-research-ed25519/scripts/fixture_legacy_v1_fact.json": "e613de4737145cbfb5f349fbf9f1122801ce3508b62c3a18e2e0cba26b9da5b0",
82
106
  ".claude/skills/goap-research-ed25519/scripts/fixture_legacy_v2_fact.json": "3f552b47c3864e4ff7ae8c72516e98c188592c7f4f7703d09ce88b39f586ad9d",
83
107
  ".claude/skills/goap-research-ed25519/scripts/fixtures_field_cases.json": "e2ee619732ab4a1b57285e57b4349f96b4158b231a5624e5264fadf69edb8983",
84
108
  ".claude/skills/goap-research-ed25519/scripts/goap_planner.py": "f5cbf4784106710b363e7f29bfa538b75f488cb25e1c273ae40de9f4c2a6710b",
85
109
  ".claude/skills/goap-research-ed25519/scripts/learning_bridge.py": "74f8842978ba945ff78c2bd54702415dd87122e61919571e12a19c3cf1e56131",
86
110
  ".claude/skills/goap-research-ed25519/scripts/population_match.py": "bbd1d3346a6fb75d0e8526cb5d2fc8bc8613bb31ab63ffb0958d436d5e009054",
111
+ ".claude/skills/goap-research-ed25519/scripts/quote_provenance.py": "c78668234c881e5f9f81899d903b573eac1d51a04c7e8bc791f356739de4f329",
87
112
  ".claude/skills/goap-research-ed25519/scripts/risk_statement.py": "320ffece816e875f65624583846f44dc99461f672a0de7cda42be5ddf29d6de5",
88
113
  ".claude/skills/goap-research-ed25519/scripts/source_tiers.py": "e1aae76fad01693ab35b51466fc4369c04a5ac64230fd307e7b798dc5beeff7a",
89
- ".claude/skills/goap-research-ed25519/scripts/test_ed25519_verifier.py": "dcba1ce538ff946d6928f30a7c5cbcc37fddf712b6181f91f94c76e20c117ac5",
90
- ".claude/skills/goap-research-ed25519/scripts/test_evidence_provenance.py": "292bfcdcc086934905c77f1543d8400ee483166ff3ce26c79bb526c204320dbb",
114
+ ".claude/skills/goap-research-ed25519/scripts/test_ed25519_verifier.py": "9982a8a7f1cdff4d9cab7c90aeac6470dbc445c5f726e18befd29af09e180eaf",
115
+ ".claude/skills/goap-research-ed25519/scripts/test_evidence_provenance.py": "d16aca1e6c8951e081801a0ce363ad0b33fec8003e5d12d723fbd1f5c8bf4ffc",
91
116
  ".claude/skills/goap-research-ed25519/scripts/test_goap_planner.py": "7942ada069048b7e97bf2b6e920898a58517ccec090069f347399dbf1fc37731",
92
117
  ".claude/skills/goap-research-ed25519/scripts/test_population_match.py": "f33f72c0ba6305af1644e6b1a7f7635d3f33273344f19c14e7dbd2f819af0e7f",
118
+ ".claude/skills/goap-research-ed25519/scripts/test_quote_provenance.py": "c3fb6df236b1f432d1ecdcd8acacb95e2e091b436296eef43abe183b67b90b74",
93
119
  ".claude/skills/goap-research-ed25519/scripts/test_risk_absolute.py": "ab353db189650551c374cb772ba4a3a6929e3a2618f2f5c112eca4c3f69e46b6",
94
120
  ".claude/skills/goap-research-ed25519/scripts/test_signature_v3.py": "a04259296df104c9497c7b31d29556cb9a7ad4dd3339cbe3d8d32a4f53950d25",
95
- ".claude/skills/goap-research-ed25519/scripts/test_suite_completeness.py": "727c5d5b0dad215957012276ebc146397178255077e762ed7b88a60d8178d2ab",
96
- ".claude/skills/goap-research-ed25519/SKILL.md": "404cb696d537d29585ec35f97a86173a582cd6fcf8d5f172a4f5bbd75ec971a8",
121
+ ".claude/skills/goap-research-ed25519/scripts/test_suite_completeness.py": "8aba19a95d380f32ce8d8dc68c5d1b8d4e6b912152bd527e3ce9d60e41be1073",
122
+ ".claude/skills/goap-research-ed25519/SKILL.md": "c6503749a8bd8222d63542831c2003e16f1bc0239dd903d59a934cd2ff40d1c9",
97
123
  ".claude/skills/knowledge-extractor/examples/rate-limiting-extraction.md": "fab68772135532aaa7675dfca4ec068cfa68a847f964f872f201f08fb9ee4034",
98
- ".claude/skills/knowledge-extractor/modules/01-agent-review.md": "53883f182c26c710190399a23193cddb4a94b0f35bb42169a353f354aae4083a",
124
+ ".claude/skills/knowledge-extractor/modules/01-agent-review.md": "33395c8b87c4d7d1f63dff0891aaebcf50e302cbe2026005b3c6d51817f35a70",
99
125
  ".claude/skills/knowledge-extractor/modules/02-classify.md": "3b6a59cde451fc89e2e683b7cd35f5535d12cc6072cd40ca35cf7d5f61eb78aa",
100
126
  ".claude/skills/knowledge-extractor/modules/03-decontextualize.md": "ecb082116577cb86dfa4f43066d3c6d61b5d4a70964cb9ed4f15c6311d526347",
101
127
  ".claude/skills/knowledge-extractor/modules/04-integrate.md": "15a31634dd52e87bcad78a2b612c821dcd11b91ed21f2ddb2cde741411aa287e",
102
128
  ".claude/skills/knowledge-extractor/references/artifact-categories.md": "3f8c920f57476272dd4886a792c60d2439b2dabd3f9bbc3dbb3bafc731b46dfe",
103
129
  ".claude/skills/knowledge-extractor/references/decontextualization-guide.md": "224ab90bfc6da35fc2bd17039e82f355eb8e1651ad89fd2b4667f7a7f41bd074",
104
130
  ".claude/skills/knowledge-extractor/references/maturity-model.md": "d036d0f4d4ccbaab806f4a70a3297b7a9f0700b28f8ce9d32d43699029b814ce",
105
- ".claude/skills/knowledge-extractor/SKILL.md": "ccfd23ead51b710c5197372e82522d17706a1a4e71143bc6f03d80f913bc0a67",
131
+ ".claude/skills/knowledge-extractor/SKILL.md": "3ac6d9832dd263eba21ccadb091e845dc2cfcb656c4cda447f744e16f96870c7",
106
132
  ".claude/skills/knowledge-extractor/templates/artifact-card.md": "61b77204be5099f5aa0b7179ef14409efc08873c32fb46df42069782c297521b",
107
133
  ".claude/skills/knowledge-extractor/templates/harvest-report.md": "a112dde3d3fab90405ed89c1b4a665003ca70cfc995a8af6a0cf67b2476037c2",
108
134
  ".claude/skills/knowledge-extractor/templates/toolkit-harvest.md": "71b4661956eb6dfb6860ff820b4a872bb243161ce4a18e03845b2bd54a70a2c8",
109
- ".claude/skills/pipeline-forge/examples/replicate-analysis.md": "57e31a5bbf320f383e1a7fc665635ee3ad025d3825d4b1dc6c331bcd9270f146",
110
- ".claude/skills/pipeline-forge/references/patterns-catalog.md": "94bca28d8df333005c2e8c3511586f05395a141c8c8c0225047f580cbee7e418",
135
+ ".claude/skills/pipeline-forge/examples/replicate-analysis.md": "9eaa0eda2b6b0c4eded68ce18d22e43d55073fb70cf631d7b5e89ba9798f221d",
136
+ ".claude/skills/pipeline-forge/references/patterns-catalog.md": "650f588eaf7b7e29e7045cf86326e9c89beb16e7694ceb95165c2e1c2ad82db3",
111
137
  ".claude/skills/pipeline-forge/references/quality-gates.md": "286a533eac25ca39429b200b66eb43b33092d3e85cd505bfa4c567f6e86b6eea",
112
- ".claude/skills/pipeline-forge/references/self-extracted-patterns.md": "ad67e502d1b82efd646440d90a2781cf0db3732a1f94294ad0905d0f7338e0b4",
113
- ".claude/skills/pipeline-forge/references/skill-anatomy.md": "ee91351ad53fdd924f358c4e30a291d5801e03c2c568b10e641edcb90a4ae10b",
114
- ".claude/skills/pipeline-forge/SKILL.md": "619e4fa03b9d289cfd143b1a0f5fe8e77ddbd48d6846dcaaad601ba4702f3787",
138
+ ".claude/skills/pipeline-forge/references/self-extracted-patterns.md": "190451eaddcbbb3f24616c446748a95e747f430882911576e2c89c3d718ca99f",
139
+ ".claude/skills/pipeline-forge/references/skill-anatomy.md": "e9ef3c7f173624bfd1d9eee392613b751a8df65d7eb581b05b5ed64acdda20f0",
140
+ ".claude/skills/pipeline-forge/SKILL.md": "66a135c30ed384b4db8088571735c8333b2bc8f06e736fda6075f8e17e59291c",
115
141
  ".claude/skills/pipeline-forge/templates/agent-template.md": "18ed69f9cce1cc4157f1e43895d6135eac3ff2a6ebd08fb2fb543658564bc3fd",
116
142
  ".claude/skills/pipeline-forge/templates/command-template.md": "b91a4ef084ba542801154c8b1fb2a086a6b404c3f7ee809ceb6ea633e2b55245",
117
143
  ".claude/skills/pipeline-forge/templates/pipeline-template.md": "952d2e1f050558dacbf86d2b2ad2c9bc671b1ce2809ce430593434998103a27c",
@@ -127,7 +153,7 @@
127
153
  ".claude/skills/reverse-engineering-unicorn/examples/noom-module1-example.md": "7009cf2e2624a1254913ad2e1ff554e7ff675358b0b99bc0632f2e12132663a3",
128
154
  ".claude/skills/reverse-engineering-unicorn/modules/01-intelligence.md": "0770bd63a6a1eeb34e873cb101e2ba0cf88d507e9bc03242046eaa837b9f587c",
129
155
  ".claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md": "499bbded50ddd368a62301083e828a42bd0223aa58322b6a952f00086b462972",
130
- ".claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md": "11e2e101c99d42306ac1d0931475c5a8899e929514e41a393b6173e03856cfc3",
156
+ ".claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md": "d9dd399cbb60d6b5fa9734ad44128a49790ef15bbde25c809d69d5c918601eb3",
131
157
  ".claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md": "7c2e7164463371239d92f28153777e40ee0d6dad293d59886a4cf5b306fa3627",
132
158
  ".claude/skills/reverse-engineering-unicorn/modules/04-business-finance.md": "dd08226391d498a82f111f0da665ea7cea1fa8a97683fab11070f879142727f7",
133
159
  ".claude/skills/reverse-engineering-unicorn/modules/05-growth-engine.md": "84658390dc7beb590f70164b391ace915e42926660bc1015e4be300752b74a37",
@@ -137,7 +163,7 @@
137
163
  ".claude/skills/reverse-engineering-unicorn/references/jtbd-canvas.md": "7938e657af631109ca7b4752002c21ac84a7dad3a35cc522be088f814d102773",
138
164
  ".claude/skills/reverse-engineering-unicorn/SKILL.md": "20d6b667971f9749d091c1d47e2f75df957f259647cbb861ac54174280096c71",
139
165
  ".claude/skills/sparc-prd-mini/references/sparc-methodology.md": "9c93dafe8149590809ff6b27508d7df52c8efa7f31f8e8f8052b7124a6561fee",
140
- ".claude/skills/sparc-prd-mini/SKILL.md": "71f97e269e8b1807550a4ef91b2f0ac4dd892a074781504890d33db8f32685d2",
166
+ ".claude/skills/sparc-prd-mini/SKILL.md": "b663793d1e1d1de028f91f2e266a191811bb610f97a12be7f95d62327589d53a",
141
167
  ".claude/skills/sparc-prd-mini/templates/CLAUDE.md": "9eeb66752cc4dec5c3c3fa5a8f7cfc3dd282f75d245bd36835f690a945b534ed",
142
168
  ".claude/skills/sparc-prd-mini/templates/prd.md": "7b4497bc76bb421fae7a07ecb46af01e021412180a394a5487a3c3c42dc004b6"
143
169
  }
@@ -9,6 +9,10 @@ const crypto = require('node:crypto');
9
9
  const PKG_DIR = path.resolve(__dirname, '..', '..');
10
10
  const TEMPLATES = path.join(PKG_DIR, 'templates');
11
11
  const BASELINE = path.join(__dirname, 'baseline.json');
12
+ const DETECTION_LADDER = '.claude/rules/cost-of-detection-ladder.md';
13
+ const PACK_LADDER = `templates/${DETECTION_LADDER}`;
14
+ const MANIFEST = path.join(PKG_DIR, '.dz-manifest.json');
15
+ const SBOM = path.join(PKG_DIR, 'sbom.json');
12
16
 
13
17
  function walk(dir, base = dir, out = []) {
14
18
  if (!fs.existsSync(dir)) return out;
@@ -29,6 +33,20 @@ function sha256(p) {
29
33
  return crypto.createHash('sha256').update(fs.readFileSync(p)).digest('hex');
30
34
  }
31
35
 
36
+ function integrityProblems(signed, sbom, file, digest) {
37
+ const problems = [];
38
+ const manifestEntry = signed.manifest.files.find((entry) => entry.path === file);
39
+ if (!manifestEntry) problems.push(`manifest missing ${file}`);
40
+ else if (manifestEntry.sha256 !== digest) problems.push(`manifest digest mismatch for ${file}`);
41
+
42
+ const component = sbom.components.find((entry) => entry.name === file);
43
+ if (!component) problems.push(`SBOM missing ${file}`);
44
+ else if (component.hashes.find((entry) => entry.alg === 'SHA-256')?.content !== digest) {
45
+ problems.push(`SBOM digest mismatch for ${file}`);
46
+ }
47
+ return problems;
48
+ }
49
+
32
50
  describe('snapshot: templates/', () => {
33
51
  test('baseline.json exists', () => {
34
52
  assert.ok(
@@ -37,6 +55,35 @@ describe('snapshot: templates/', () => {
37
55
  );
38
56
  });
39
57
 
58
+ test('baseline explicitly registers the consumer detection ladder', () => {
59
+ const baseline = JSON.parse(fs.readFileSync(BASELINE, 'utf8'));
60
+ assert.match(
61
+ baseline.files[DETECTION_LADDER] || '',
62
+ /^[a-f0-9]{64}$/,
63
+ `${DETECTION_LADDER} must have a SHA-256 entry in baseline.json`
64
+ );
65
+ });
66
+
67
+ test('signed manifest and SBOM register the settled detection-ladder digest', () => {
68
+ const digest = sha256(path.join(TEMPLATES, DETECTION_LADDER));
69
+ const signed = JSON.parse(fs.readFileSync(MANIFEST, 'utf8'));
70
+ const sbom = JSON.parse(fs.readFileSync(SBOM, 'utf8'));
71
+ assert.deepEqual(integrityProblems(signed, sbom, PACK_LADDER, digest), []);
72
+
73
+ const omitted = JSON.parse(JSON.stringify(signed));
74
+ omitted.manifest.files = omitted.manifest.files.filter((entry) => entry.path !== PACK_LADDER);
75
+ assert.deepEqual(integrityProblems(omitted, sbom, PACK_LADDER, digest),
76
+ [`manifest missing ${PACK_LADDER}`],
77
+ 'removing the real manifest entry must fire the integrity safeguard');
78
+
79
+ const changed = JSON.parse(JSON.stringify(sbom));
80
+ const component = changed.components.find((entry) => entry.name === PACK_LADDER);
81
+ component.hashes.find((entry) => entry.alg === 'SHA-256').content = '0'.repeat(64);
82
+ assert.deepEqual(integrityProblems(signed, changed, PACK_LADDER, digest),
83
+ [`SBOM digest mismatch for ${PACK_LADDER}`],
84
+ 'changing the real SBOM digest must fire the integrity safeguard');
85
+ });
86
+
40
87
  test('current templates match recorded baseline (no drift)', () => {
41
88
  const baseline = JSON.parse(fs.readFileSync(BASELINE, 'utf8'));
42
89
  const current = walk(TEMPLATES);
@@ -140,7 +140,21 @@ describe('an artifact that is there but says nothing is not verified', () => {
140
140
  const zero = run(dir, 'doctor');
141
141
  assert.equal(zero.code, 0, 'zero entries must not fail either: ' + zero.out);
142
142
 
143
- fs.writeFileSync(idx, '# Insights\n\n## 2026-08-27 — a rake\n\nBody.\n');
143
+ const writer = path.join(dir, '.claude', 'hooks', 'write-insight.cjs');
144
+ const written = spawnSync(process.execPath, [writer], {
145
+ cwd: dir,
146
+ env: { ...process.env, CLAUDE_PROJECT_DIR: dir },
147
+ input: JSON.stringify({
148
+ date: '2026-08-30',
149
+ title: 'Doctor reads writer output',
150
+ tags: ['doctor'],
151
+ problem: 'A synthetic fixture could drift from the real writer format.',
152
+ solution: 'Create the populated state through the installed writer.',
153
+ references: ['tests/unit/absence-is-not-emptiness.test.js'],
154
+ }),
155
+ encoding: 'utf8',
156
+ });
157
+ assert.equal(written.status, 0, written.stderr || written.stdout);
144
158
  const some = run(dir, 'doctor');
145
159
  assert.equal(some.code, 0);
146
160