@dzhechkov/p-replicator 1.6.0 → 1.9.0

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 (33) hide show
  1. package/.dz-manifest.json +59 -23
  2. package/CHANGELOG.md +127 -0
  3. package/README.md +106 -4
  4. package/package.json +4 -4
  5. package/sbom.json +112 -22
  6. package/src/utils.js +2 -0
  7. package/templates/.claude/commands/replicate.md +57 -1
  8. package/templates/.claude/hooks/check-docs-complete.cjs +174 -0
  9. package/templates/.claude/hooks/check-growth-trace.cjs +191 -0
  10. package/templates/.claude/hooks/statusline.cjs +1 -1
  11. package/templates/.claude/rules/replicate-pipeline.md +14 -4
  12. package/templates/.claude/rules/skill-interface-protocol.md +9 -0
  13. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md +6 -4
  14. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/08-skill-composition.md +2 -2
  15. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md +2 -2
  16. package/templates/.claude/skills/requirements-validator/SKILL.md +52 -0
  17. package/templates/.claude/skills/reverse-engineering-unicorn/modules/01-intelligence.md +4 -4
  18. package/templates/.claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md +2 -2
  19. package/templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md +9 -1
  20. package/templates/.claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md +3 -3
  21. package/templates/.claude/skills/reverse-engineering-unicorn/modules/04-business-finance.md +3 -3
  22. package/templates/.claude/skills/reverse-engineering-unicorn/modules/05-growth-engine.md +132 -12
  23. package/templates/.claude/skills/reverse-engineering-unicorn/modules/06-playbook-synthesis.md +1 -1
  24. package/templates/.claude/skills/sparc-prd-mini/SKILL.md +9 -9
  25. package/tests/snapshot/baseline.json +20 -18
  26. package/tests/unit/check-docs-complete.test.js +249 -0
  27. package/tests/unit/check-growth-trace.test.js +188 -0
  28. package/tests/unit/growth-axes-and-compliance.test.js +169 -0
  29. package/tests/unit/growth-gate-conditional.test.js +122 -0
  30. package/tests/unit/growth-module-b2b-gate.test.js +20 -2
  31. package/tests/unit/growth-requirements-bridge.test.js +127 -0
  32. package/tests/unit/module-copy-identity.test.js +76 -0
  33. package/tests/unit/skill-paths-prebaked.test.js +174 -0
package/.dz-manifest.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "files": [
6
6
  {
7
7
  "path": "CHANGELOG.md",
8
- "sha256": "837815d5116c5e117c1249a414b7ae81927969d74a3b44685e8dc8a8dd3a6d8e"
8
+ "sha256": "57b20e3bfd20ed2a97f783d77af52bb6c74ceff5466cacb20ddb058c0a344c48"
9
9
  },
10
10
  {
11
11
  "path": "KNOWN_LIMITATIONS.md",
@@ -21,7 +21,7 @@
21
21
  },
22
22
  {
23
23
  "path": "README.md",
24
- "sha256": "6b863dbfd298c1788097d53a87425030a341684f67bbb5a81a90c192c0c90d22"
24
+ "sha256": "d65437974585200f0db8ef082dfbd0519f61cc29cadf3224732ae7a459a20186"
25
25
  },
26
26
  {
27
27
  "path": "README/eng/01_quickstart.md",
@@ -109,7 +109,7 @@
109
109
  },
110
110
  {
111
111
  "path": "package.json",
112
- "sha256": "8ae12d621050c3a4f992bc853b4ec961af5fbf32bf9c3fee639a182b546992de"
112
+ "sha256": "195281e31da3a3e5ecde1b7087ec5904f35d8f2639e6270f2d8ae685adcfa0c5"
113
113
  },
114
114
  {
115
115
  "path": "src/cli.js",
@@ -141,7 +141,7 @@
141
141
  },
142
142
  {
143
143
  "path": "src/utils.js",
144
- "sha256": "ec9d1695f4b0ef2ce0b3ee6908e90900ebac0941a32ea48df673f6cd20fc1387"
144
+ "sha256": "d4fc297e21682290c15aa64499190ee49b7aa62e69d527c2b5332fffad02f401"
145
145
  },
146
146
  {
147
147
  "path": "templates/.claude/agents/doc-validator.md",
@@ -193,7 +193,7 @@
193
193
  },
194
194
  {
195
195
  "path": "templates/.claude/commands/replicate.md",
196
- "sha256": "13f5e2ebe109f33b63cbcd75e3cf1b94224ab066aba1b0cb10cf34f668144a8a"
196
+ "sha256": "8862d0dc117815b1c3fc7f6e929996e2458783f1ac443eb70bc2a7ebe63a67c3"
197
197
  },
198
198
  {
199
199
  "path": "templates/.claude/commands/run.md",
@@ -215,6 +215,14 @@
215
215
  "path": "templates/.claude/hooks/autocommit-roadmap.cjs",
216
216
  "sha256": "f4dcc9ffd9a3aed91dd56e011e699fcf8af903cc81594e4ab1ef61e5432a36ad"
217
217
  },
218
+ {
219
+ "path": "templates/.claude/hooks/check-docs-complete.cjs",
220
+ "sha256": "13eca8ab8f18325031ca707baa2f7068f8c05484f8e4b12d4129a1023cc7a478"
221
+ },
222
+ {
223
+ "path": "templates/.claude/hooks/check-growth-trace.cjs",
224
+ "sha256": "91994fc109c8440306c9dd3d5eea176c533eb0818fcdb09bac2b309397d9908a"
225
+ },
218
226
  {
219
227
  "path": "templates/.claude/hooks/check-ports.cjs",
220
228
  "sha256": "e5f2d2bd8899df27c2dfedf76128467becae1868210eb8525a1bad2869a8c78f"
@@ -229,7 +237,7 @@
229
237
  },
230
238
  {
231
239
  "path": "templates/.claude/hooks/statusline.cjs",
232
- "sha256": "1eca683baf67a17874dc5db6dfe38eb11944f550c66f46330bce0f794732245f"
240
+ "sha256": "948edf98ccabaa4e2dc59078435fb444639aa740baa08967d3a78067e4de3416"
233
241
  },
234
242
  {
235
243
  "path": "templates/.claude/rules/docker-ports.md",
@@ -249,11 +257,11 @@
249
257
  },
250
258
  {
251
259
  "path": "templates/.claude/rules/replicate-pipeline.md",
252
- "sha256": "b65e802d32a1e50bdfcd0cfc79c78e9234eac48a94f0cd1f5647cf4fea6c0162"
260
+ "sha256": "99289f711c34cfddddbef5328b74749fc63d1f74636c6a4e4d61caa202fad05d"
253
261
  },
254
262
  {
255
263
  "path": "templates/.claude/rules/skill-interface-protocol.md",
256
- "sha256": "fe18fcb9217002572f462f3a7f38de22cdd7ba0dd4e906fdcd0c0e8cfed9f2aa"
264
+ "sha256": "7669309b0ae4330bc6cf6b26bd9cfc01d7b99a8e70c1f056a52574430db9378e"
257
265
  },
258
266
  {
259
267
  "path": "templates/.claude/settings.json",
@@ -309,7 +317,7 @@
309
317
  },
310
318
  {
311
319
  "path": "templates/.claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md",
312
- "sha256": "b093a5d66663e2dfd6415afef7c7444409f03379f857001b811685ded410038b"
320
+ "sha256": "e1ae2dd69db0d68fe276c1d0e57bd19921bf98fe91fe054716add76338442891"
313
321
  },
314
322
  {
315
323
  "path": "templates/.claude/skills/cc-toolkit-generator-enhanced/modules/04-generate-p1.md",
@@ -329,7 +337,7 @@
329
337
  },
330
338
  {
331
339
  "path": "templates/.claude/skills/cc-toolkit-generator-enhanced/modules/08-skill-composition.md",
332
- "sha256": "1deedef5ee5c7ef1f7fd8a8fb84732d82f872724fc96697bf530c6dbd6d0850a"
340
+ "sha256": "683b254e400414b432827bedf4153a122322125eff053da4ccfeb3a62bab2a77"
333
341
  },
334
342
  {
335
343
  "path": "templates/.claude/skills/cc-toolkit-generator-enhanced/modules/09-cross-project-learning.md",
@@ -385,7 +393,7 @@
385
393
  },
386
394
  {
387
395
  "path": "templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md",
388
- "sha256": "c537b47e7a4ff2d692767f4aac130e2ae9b1923782106750218696e87f515feb"
396
+ "sha256": "7b01140a304c060fb085ded8711189ac3f259f999df1cb42380d0274191f1b25"
389
397
  },
390
398
  {
391
399
  "path": "templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-suggestions.md",
@@ -597,7 +605,7 @@
597
605
  },
598
606
  {
599
607
  "path": "templates/.claude/skills/requirements-validator/SKILL.md",
600
- "sha256": "e50c5269ad181966a81c14ef596946cea67cbf4b8f8f648c90fd66ecad948933"
608
+ "sha256": "d2b8e71f4053c642f455a0f245ae18471ab25b7a21e0658f0fe410912a47bf8b"
601
609
  },
602
610
  {
603
611
  "path": "templates/.claude/skills/requirements-validator/assets/templates/bdd-feature-template.feature",
@@ -633,31 +641,31 @@
633
641
  },
634
642
  {
635
643
  "path": "templates/.claude/skills/reverse-engineering-unicorn/modules/01-intelligence.md",
636
- "sha256": "4af16873637c26baba0d30728748108c79f5b96765de08d54fc65fe1008f4280"
644
+ "sha256": "0770bd63a6a1eeb34e873cb101e2ba0cf88d507e9bc03242046eaa837b9f587c"
637
645
  },
638
646
  {
639
647
  "path": "templates/.claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md",
640
- "sha256": "b614e43359ffe88c07d6f45abdb2d3c523fc7779052757ed95bbd31b5ce9408d"
648
+ "sha256": "499bbded50ddd368a62301083e828a42bd0223aa58322b6a952f00086b462972"
641
649
  },
642
650
  {
643
651
  "path": "templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md",
644
- "sha256": "0ca044b769a70bcc89bdb5af496471b59104428770d49735e8255fc22da48207"
652
+ "sha256": "11e2e101c99d42306ac1d0931475c5a8899e929514e41a393b6173e03856cfc3"
645
653
  },
646
654
  {
647
655
  "path": "templates/.claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md",
648
- "sha256": "6c5c802ee558b5e13c80eb05e64a8197bad34192416df81ea32f3b0e1b04b259"
656
+ "sha256": "7c2e7164463371239d92f28153777e40ee0d6dad293d59886a4cf5b306fa3627"
649
657
  },
650
658
  {
651
659
  "path": "templates/.claude/skills/reverse-engineering-unicorn/modules/04-business-finance.md",
652
- "sha256": "19d25e9fe9a732d963f2359748ef2c7793bd6282183f84b938351feccea88075"
660
+ "sha256": "dd08226391d498a82f111f0da665ea7cea1fa8a97683fab11070f879142727f7"
653
661
  },
654
662
  {
655
663
  "path": "templates/.claude/skills/reverse-engineering-unicorn/modules/05-growth-engine.md",
656
- "sha256": "98e8577aa5a5472574ac9bac590b76a4a3d16f99bc67ebec2b09b604c7c1faab"
664
+ "sha256": "84658390dc7beb590f70164b391ace915e42926660bc1015e4be300752b74a37"
657
665
  },
658
666
  {
659
667
  "path": "templates/.claude/skills/reverse-engineering-unicorn/modules/06-playbook-synthesis.md",
660
- "sha256": "f72841226f929cea2c3a414f74b3f1e933e3952f1b55e6eea38081dd804a87cd"
668
+ "sha256": "3cd76a218aa9f94e0ff8ff2fc257647540674f68df3883f0de5e76e1cea26d9b"
661
669
  },
662
670
  {
663
671
  "path": "templates/.claude/skills/reverse-engineering-unicorn/references/blue-ocean-canvas.md",
@@ -673,7 +681,7 @@
673
681
  },
674
682
  {
675
683
  "path": "templates/.claude/skills/sparc-prd-mini/SKILL.md",
676
- "sha256": "50e829635b828b444487e4b04219518a595dbd4b94f91b66fb03ddf4a7b21712"
684
+ "sha256": "71f97e269e8b1807550a4ef91b2f0ac4dd892a074781504890d33db8f32685d2"
677
685
  },
678
686
  {
679
687
  "path": "templates/.claude/skills/sparc-prd-mini/references/sparc-methodology.md",
@@ -693,7 +701,7 @@
693
701
  },
694
702
  {
695
703
  "path": "tests/snapshot/baseline.json",
696
- "sha256": "cb6c08b5c5fb7ea837fb6c054d1094f8c4878a88ac866ec67a3862f8c7fb2a07"
704
+ "sha256": "0d5af8aadd98bf1f5f07a02b9d6d7a5dd243d4263a5b03de1a249fdaa5111a56"
697
705
  },
698
706
  {
699
707
  "path": "tests/snapshot/templates.test.js",
@@ -715,6 +723,14 @@
715
723
  "path": "tests/unit/autocommit-deletion.test.js",
716
724
  "sha256": "87ebe50e164cfa3aeda3d4f04e6b6aa98ab8af44711cbeb94252d770c07ad8ad"
717
725
  },
726
+ {
727
+ "path": "tests/unit/check-docs-complete.test.js",
728
+ "sha256": "0dbc15c1077c9c02766cfa9b1eb357b30b59639f2fa91003e44e3c6485da3e7b"
729
+ },
730
+ {
731
+ "path": "tests/unit/check-growth-trace.test.js",
732
+ "sha256": "733d87fe8eca897fcfc5cad9342d4db2085270c21d0d8866d817a9b9418511c2"
733
+ },
718
734
  {
719
735
  "path": "tests/unit/check-ports.test.js",
720
736
  "sha256": "72d9eeaa8c47d83fba867722f4b8efc8d079e2d9649e1a20abff46571c2f6f15"
@@ -731,9 +747,21 @@
731
747
  "path": "tests/unit/external-dependency-check.test.js",
732
748
  "sha256": "d85109f8e86648d61fc17d0128e9d4881950a70641c246e667d7e54ffc1f0273"
733
749
  },
750
+ {
751
+ "path": "tests/unit/growth-axes-and-compliance.test.js",
752
+ "sha256": "88e4d8c7ae278c46dfce4d89fcbd1dee49c0b545ebc07e459306bfdc70567048"
753
+ },
754
+ {
755
+ "path": "tests/unit/growth-gate-conditional.test.js",
756
+ "sha256": "bff4149b339294ac822d1a8fe732d21560ea8d70bcb80b10f3491105a4a9b75c"
757
+ },
734
758
  {
735
759
  "path": "tests/unit/growth-module-b2b-gate.test.js",
736
- "sha256": "7bb5b39a637becbea9813744a5d649b19c6bd8a9b18045c971bcfd842852ea84"
760
+ "sha256": "05ce46882984905ba41983c34b8d983e9fa9bf5eb4b1af988841a46e78142098"
761
+ },
762
+ {
763
+ "path": "tests/unit/growth-requirements-bridge.test.js",
764
+ "sha256": "2f560a16f1757df46d5d52e5d29a7aad3e4c327cd07ea9cc69240c7dd1c93f2a"
737
765
  },
738
766
  {
739
767
  "path": "tests/unit/hooks-project-anchored.test.js",
@@ -743,6 +771,10 @@
743
771
  "path": "tests/unit/hooks-report-failures.test.js",
744
772
  "sha256": "35d3fca74c22e1bc88b6fbb25f172b66a21561a947e2b6e90a366d5a854376b8"
745
773
  },
774
+ {
775
+ "path": "tests/unit/module-copy-identity.test.js",
776
+ "sha256": "a1269ad9f68a38faa7710fc63ce850feacb2304996b85ef38237b222815a3532"
777
+ },
746
778
  {
747
779
  "path": "tests/unit/pipeline-file-ownership.test.js",
748
780
  "sha256": "dd5b6e2ddb3078fb5ccafed6c55a6079bbd20d73fd5c2dacbb988263ceeda806"
@@ -751,6 +783,10 @@
751
783
  "path": "tests/unit/roadmap-one-schema.test.js",
752
784
  "sha256": "3e7ac9dbc9796a791fc95c43b4346c6da2455f3c0ace45bbc440502c5957d3dc"
753
785
  },
786
+ {
787
+ "path": "tests/unit/skill-paths-prebaked.test.js",
788
+ "sha256": "efb13ca5d2fa68f3186e5af4142509d260d7cf63c902f59e915110bb550887df"
789
+ },
754
790
  {
755
791
  "path": "tests/unit/sparc-reconciliation.test.js",
756
792
  "sha256": "4020c623cb351d42b3b184d23194d48cf04e4a3ce8d95ff96c4261ade75632c9"
@@ -781,5 +817,5 @@
781
817
  }
782
818
  ]
783
819
  },
784
- "signature": "2lO/3LnJ6PCrXJW8Hm4PO2SRG0YNFAU8vsA+FjHBfXgNYU91TalTT7tFpIo2uG8wx9qpZWDYfWjGNsiQhvqiBQ=="
820
+ "signature": "OMtz2uZJ+oSOZn3pdPDukLfw/5FD68SgFh/weBKRMzNGQyuBjh7L0durZEyaLu1T0pbbQ+WTQ1eEAi48cGCjBg=="
785
821
  }
package/CHANGELOG.md CHANGED
@@ -5,6 +5,93 @@ All notable changes to `@dzhechkov/p-replicator` are documented here.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.9.0] - 2026-08-27
9
+
10
+ **MINOR — hooks 8 → 9** (`check-docs-complete`). After `update`, `doctor` and `verify` expect the new count.
11
+
12
+ ### Added
13
+ - **`check-docs-complete.cjs`** — the cheap question, asked before the expensive one. Phase 2 used to
14
+ launch a swarm of validation agents over whatever Phase 1 produced; existence, emptiness and
15
+ unfilled placeholders are decidable by forty lines. `/replicate` now runs it at the Phase 1→2
16
+ boundary and does not start the swarm on exit 1.
17
+ - **A resume section in `/replicate`** — the three signals that already answer "where did we stop":
18
+ the per-phase commits, this checker, and `verify`. Automated phase detection was deliberately NOT
19
+ added; the reasoning is recorded there so it can be revisited on evidence.
20
+
21
+ ### Changed
22
+ - **`prepublishOnly` now runs the snapshot test before signing.** `tests/` is in `files[]`, so a
23
+ baseline drifted from the templates used to be signed, shipped and wrong — `dz sign` states its own
24
+ limit: tamper-evidence, never truthfulness.
25
+
26
+ ### Honest limit
27
+ The completeness check proves the documents were WRITTEN, not that they are correct. Correctness is
28
+ what the Phase-2 swarm is for. It blocks only on shapes that cannot be anything else (`{{…}}`,
29
+ TODO/TBD/XXX/FIXME); bracketed prose is NAMED as a warning and never blocks, because it cannot be
30
+ told from a mermaid label without understanding the document — and `[GAP: …]` always reaches Phase 2,
31
+ which owns it.
32
+
33
+ ## [1.8.0] - 2026-08-27
34
+
35
+ **MINOR — the ten shipped skills no longer depend on a rewrite rule being read.**
36
+
37
+ ### Changed
38
+ - **Skill paths are pre-baked.** They referenced each other by claude.ai `/mnt/skills/user/<name>/`
39
+ paths and worked only because two rules files tell the model to rewrite them at read time — layer
40
+ 4, silent when it lapses. 27 references now resolve directly.
41
+ - Two skills referenced but NOT shipped (`frontend-design`, `idea2prd-manual`) are declared OPTIONAL
42
+ with a fallback rather than rewritten. A local-looking path that resolves to nothing is worse than
43
+ an obviously foreign one.
44
+ - 56 occurrences are DELIBERATELY preserved: the toolkit generator's own instructions to scan its
45
+ output for unrewritten paths, and the rewrite tables. Rewriting them would blind the self-check.
46
+ - The rewrite rules stay — a skill YOU bring from claude.ai still needs them.
47
+
48
+ ### Fixed
49
+ - `03-generate-p0.md` named `.claude/skills/goap-research/` as an output path two lines under a note
50
+ saying that name is an alias which never exists as a directory.
51
+
52
+ ## [1.7.0] - 2026-08-27
53
+
54
+ **Growth stops being analysis and becomes an obligation.** Two features, both cross-family reviewed
55
+ (grades B and C); artifacts in `features/growth-requirements-bridge/` and
56
+ `features/growth-list-and-compliance/`.
57
+
58
+ **MINOR — the pre-shipped contract changed again.** Hooks 7 → 8 (`check-growth-trace`). After
59
+ `update`, `doctor` and `verify` expect the new count.
60
+
61
+ ### Added
62
+
63
+ - **Phase 0 now writes `docs/product-discovery-brief.md`.** MEASURED before this change: it never
64
+ did. The brief was passed to Phase 1 in conversation and evaporated, so the M5 growth analysis had
65
+ no artifact anything downstream could read. Nothing was ignoring it — there was nothing to ignore.
66
+ - **`Growth Requirements Seed`** in M5: `FR-GROWTH-nnn` DRAFT obligations, each naming its source
67
+ block, carrying that block's confidence verbatim, and now carrying a compliance verdict.
68
+ - **Growth type is two independent axes** — a go-to-market MOTION and a growth LOOP — plus the three
69
+ mechanics the old list omitted (badge/embed, one- and two-sided incentivised referral, network
70
+ effect). `No loop` is a real answer and skips the loop-only output instead of demanding an
71
+ invented flywheel.
72
+ - **A compliance checklist** before any technique becomes a requirement. It cites the norm and where
73
+ to check it, and carries no amount, threshold or statute: those are jurisdiction-specific and go
74
+ stale within a year. A `no` answer is recorded against the requirement and blocks its promotion.
75
+ - **`Growth Traceability`** in `requirements-validator` — CONDITIONAL, scored `+5 / +0 / -10`
76
+ OUTSIDE the 100-point table. A project with no acquisition objective, or one that never ran
77
+ Phase 0, scores `+0` and never a penalty.
78
+ - **`.claude/hooks/check-growth-trace.cjs`** — the deterministic counterpart. Exit `0` traced ·
79
+ `1` analysed then dropped · `2` **the check did not run**. Wired to no event, like `check-ports`.
80
+ - **README:** a usage-scenario section for both deliberately-invoked checks, closing a gap 1.6.0 left
81
+ when `check-ports` shipped without one.
82
+
83
+ ### Fixed
84
+
85
+ - The pipeline rule listed **four** hook files when eight ship, and the components table said
86
+ **Rules 5** when six do — both stale since 1.6.0.
87
+
88
+ ### Honest limits, stated in the shipped artifacts
89
+
90
+ The seed proves an obligation was carried forward, never that it was built. The compliance checklist
91
+ asks its questions and records the answers; it does not establish that anything is lawful. And the
92
+ validator criterion is prose read by a model — layer 3. Only `check-growth-trace.cjs` is
93
+ deterministic, and only when someone runs it.
94
+
8
95
  ## [1.6.0] - 2026-08-27
9
96
 
10
97
  **Seventeen features** across two days, from the field-report sweep (PR-003, PR-005+010, PR-008,
@@ -140,6 +227,46 @@ Still open, and it is the owner's call: whether a DELETED target should be auto-
140
227
  features, 235 after the last). Every feature's guard is proven by mutation: apply it, watch a
141
228
  specific assertion go red, restore, watch it pass.
142
229
 
230
+ ## [1.5.19] - 2026-08-25
231
+
232
+ ### Fixed
233
+
234
+ - **The ADR chain was dead for every `/replicate` project.** The scanner required a directory of
235
+ `docs/adr/*.md`, which is the idea2prd-manual shape; a `/replicate` project writes a single
236
+ `docs/ADR.md`, so decisions were recorded and never read. The scanner now accepts both shapes.
237
+
238
+ ## [1.5.18] - 2026-08-25
239
+
240
+ ### Changed
241
+
242
+ - Version bump only, as part of a 51-package publish sweep — signatures re-verified against the
243
+ published tarballs. No behaviour change in this package.
244
+
245
+ ## [1.5.17] - 2026-08-25
246
+
247
+ ### Fixed
248
+
249
+ - Slice-H cross-model QE round 5 in `learning_bridge.py`. Recorded honestly at the time: the finding
250
+ count across five rounds went 11 → 10 → 5 → 3 → 6 and **did not converge**.
251
+
252
+ ## [1.5.16] - 2026-08-25
253
+
254
+ ### Fixed
255
+
256
+ - Slice-H QE round 4: acronym-versus-name confusion, laundered identifiers, and a forgeable probe.
257
+ The acronym test had been wrong in BOTH directions — it accepted `McDonald` and rejected `apoB`,
258
+ an example from this package's own README.
259
+
260
+ ## [1.5.15] - 2026-08-25
261
+
262
+ ### Fixed
263
+
264
+ - Slice-H QE round 3: the `learning_bridge.py` guard became a token allowlist rather than an
265
+ enumeration of bad cases, with evidence-provenance tests added.
266
+
267
+ > These five entries were reconstructed from git history on 2026-08-27 (backlog `2b286239`). They are
268
+ > accurate about what changed and why; they are terser than a contemporaneous entry would have been.
269
+
143
270
  ## [1.5.14] - 2026-07-28
144
271
 
145
272
  ### Fixed — Documentation & packaging (package-verification findings)
package/README.md CHANGED
@@ -101,7 +101,7 @@
101
101
 
102
102
  ## 📖 What is p-replicator?
103
103
 
104
- `@dzhechkov/p-replicator` installs a ready-made `.claude/` toolkit into any project: **11 slash commands**, **10 skills**, **4 agents**, **6 rules**, **7 hook scripts**, and a `settings.json` with pre-configured hooks and a multi-line statusline dashboard.
104
+ `@dzhechkov/p-replicator` installs a ready-made `.claude/` toolkit into any project: **11 slash commands**, **10 skills**, **4 agents**, **6 rules**, **9 hook scripts**, and a `settings.json` with pre-configured hooks and a multi-line statusline dashboard.
105
105
 
106
106
  The flagship `/replicate` command takes a project through a **5-phase pipeline**:
107
107
 
@@ -289,8 +289,8 @@ This creates:
289
289
  | **Skills** | 10 | 92 files (880K+ chars — MEASURED via `wc -c` over `templates/.claude/skills`: 880,679). Modular architecture: foundation → composite → master orchestrator |
290
290
  | **Commands** | 11 | `/replicate`, `/harvest`, `/start`, `/plan`, `/feature`, `/go`, `/run`, `/next`, `/myinsights`, `/docs`, `/deploy` |
291
291
  | **Agents** | 4 | `replicate-coordinator`, `product-discoverer`, `doc-validator`, `harvest-coordinator` |
292
- | **Rules** | 5 | `replicate-pipeline`, `skill-interface-protocol`, `git-workflow`, `insights-capture`, `feature-lifecycle` |
293
- | **Hooks** | 7 | `session-insights`, `autocommit-{roadmap,insights,plans}`, `statusline`, `state-update`, `check-ports` (cross-platform Node) |
292
+ | **Rules** | 6 | `replicate-pipeline`, `skill-interface-protocol`, `git-workflow`, `insights-capture`, `feature-lifecycle`, `docker-ports` |
293
+ | **Hooks** | 9 | `session-insights`, `autocommit-{roadmap,insights,plans}`, `statusline`, `state-update`, `check-ports`, `check-growth-trace`, `check-docs-complete` (cross-platform Node) |
294
294
  | **Settings** | 1 | `settings.json` with statusLine + SessionStart + Stop hooks pre-configured |
295
295
 
296
296
  After running `/replicate`, the toolkit also generates **project-specific** artifacts:
@@ -306,6 +306,108 @@ After running `/replicate`, the toolkit also generates **project-specific** arti
306
306
 
307
307
  ---
308
308
 
309
+ ## 📈 Growth: from analysis to obligation
310
+
311
+ Phase 0's M5 module used to end as analysis — and the analysis had nowhere to go, because the Product
312
+ Discovery Brief was never written to disk at all. Since 1.7.0:
313
+
314
+ - Phase 0 writes `docs/product-discovery-brief.md`.
315
+ - M5 emits a **Growth Requirements Seed**: `FR-GROWTH-nnn` DRAFT obligations, each naming the
316
+ analysis block it came from and carrying that block's confidence verbatim.
317
+ - Growth type is **two independent choices** — a go-to-market MOTION and a growth LOOP. The old
318
+ single list forced one pick across both, which made "sales-led company running a referral loop"
319
+ unsayable. `No loop` is a real answer and skips the loop-only output.
320
+ - A **compliance checklist** runs before a technique becomes a requirement. It names the norm and
321
+ where to check it, never an amount or a statute — those go stale and are jurisdiction-specific.
322
+ A `no` answer blocks that requirement's promotion.
323
+ - Phase 2's validator gains a **conditional** `Growth Traceability` criterion: `+5` traced, `+0` not
324
+ applicable, `-10` applicable but dropped. It scores outside the 100-point table, and a project with
325
+ no acquisition objective — or one that never ran Phase 0 — scores `+0`, never a penalty.
326
+
327
+ What none of this proves: that anything was built, or that copying a competitor's move is lawful.
328
+
329
+ ## 🔎 The three deliberate checks
330
+
331
+ Six of the nine hook scripts run themselves. Three do not: they are utilities you invoke when you want
332
+ an answer, and they are wired to no event on purpose. A hook of this package is **non-blocking by
333
+ contract** — it can print, never refuse — so a check that must be able to say "no" cannot be one.
334
+
335
+ Both answer with **three** exit codes, and the third is the one that matters:
336
+
337
+ | Code | Meaning |
338
+ |:---:|---|
339
+ | `0` | the rule holds |
340
+ | `1` | the rule is violated — the offender is named |
341
+ | `2` | **the check did not run** — it could not look, and says so |
342
+
343
+ A checker that answers "clean" when it could not look turns an unknown into a reassurance. That is
344
+ why a missing config, a missing docker, or a missing brief is `2` and never `0`.
345
+
346
+ ### `check-ports.cjs` — no database faces the internet
347
+
348
+ ```bash
349
+ node .claude/hooks/check-ports.cjs .
350
+ ```
351
+
352
+ ```
353
+ ❌ Правило №0 нарушено (.claude/rules/docker-ports.md):
354
+ • db: порт 5432 → 5432 (без адреса — значит все интерфейсы) — хранилище опубликовано наружу.
355
+ Убрать ports: целиком, либо привязать к 127.0.0.1
356
+ ```
357
+
358
+ Reads the normalised config (`docker compose config`), so the short port form and `extends` are
359
+ already resolved. Catches `network_mode: host` and services published beside a reverse-proxy too.
360
+ A loopback bind (`127.0.0.1:` or `[::1]:`) is legal and passes — that exception is part of the rule.
361
+
362
+ **When to run it:** after writing or editing `docker-compose.yml`, and before any deploy.
363
+
364
+ ### `check-docs-complete.cjs` — the cheap question, before the swarm
365
+
366
+ ```bash
367
+ node .claude/hooks/check-docs-complete.cjs .
368
+ ```
369
+
370
+ ```
371
+ ❌ документы Фазы 1 не готовы к валидации (1):
372
+ • PRD.md: пуст или почти пуст (5 симв., порог 200)
373
+ Рой валидации запускать рано: он потратит агентов на то, что видно отсюда.
374
+ ```
375
+
376
+ Phase 2 launches a swarm of validation agents over whatever Phase 1 produced. Existence, emptiness
377
+ and unfilled placeholders are decidable by forty lines of code — this asks them first, so the swarm
378
+ is spent on testability and completeness rather than on discovering an empty file.
379
+
380
+ `docs/ADR.md` and `docs/C4_Diagrams.md` stay optional, as `/replicate` itself declares them. A
381
+ markdown link is not a placeholder.
382
+
383
+ **When to run it:** at the Phase 1 → Phase 2 boundary. `/replicate` now runs it there for you.
384
+
385
+ **What it does NOT prove:** that the documents are correct. That is what the swarm is for.
386
+
387
+ ### `check-growth-trace.cjs` — the growth analysis was not analysed and dropped
388
+
389
+ ```bash
390
+ node .claude/hooks/check-growth-trace.cjs .
391
+ ```
392
+
393
+ ```
394
+ ❌ часть требований по росту потеряна (1 из 2):
395
+ • FR-GROWTH-002
396
+ Каждое надо либо перенести в docs/Specification.md, либо отклонить С ПРИЧИНОЙ — молча уронить нельзя.
397
+ ```
398
+
399
+ Phase 0's M5 module emits a `Growth Requirements Seed` table of `FR-GROWTH-nnn` draft obligations
400
+ into `docs/product-discovery-brief.md`. This asks whether they survived into `docs/Specification.md`.
401
+ A conscious rejection **with a reason written down** passes; a silent drop does not.
402
+
403
+ `docs/product-discovery-brief.md` absent is `2`, not `0` — it means Phase 0 never ran (the
404
+ `--from-docs` entry skips it), which is not the same as having nothing to trace.
405
+
406
+ **When to run it:** at the Phase 1 → Phase 2 boundary, before the validation pass.
407
+
408
+ **What it does NOT prove:** that anything was built, or that copying a competitor's growth move is
409
+ lawful. It proves an obligation was carried forward, nothing more.
410
+
309
411
  ## ✅ Verify the install
310
412
 
311
413
  After `/replicate`, run:
@@ -316,7 +418,7 @@ npx @dzhechkov/p-replicator verify
316
418
 
317
419
  The command checks:
318
420
 
319
- - **Pre-shipped contract** (must-have): 10 skills + 11 commands + 4 agents + 6 rules + settings.json + 7 hooks
421
+ - **Pre-shipped contract** (must-have): 10 skills + 11 commands + 4 agents + 6 rules + settings.json + 9 hooks
320
422
  - **Post-/replicate hints** (advisory): CLAUDE.md, project-specific agents, feature-roadmap.json, security rules, etc.
321
423
 
322
424
  **Exit codes:**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/p-replicator",
3
- "version": "1.6.0",
3
+ "version": "1.9.0",
4
4
  "description": "P-Replicator — Claude Code toolkit for AI-assisted product development (Vibe Coding). Full /replicate pipeline, 10 modular skills (880K+ chars), /harvest knowledge extraction, swarm agents, quality gates, security patterns, cross-project learning.",
5
5
  "main": "src/cli.js",
6
6
  "bin": {
@@ -19,9 +19,9 @@
19
19
  "sbom.json"
20
20
  ],
21
21
  "scripts": {
22
- "prepublishOnly": "node ../../../scripts/prepublish-gate.mjs",
23
- "test": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/e2e/lifecycle.test.js tests/snapshot/templates.test.js",
24
- "test:unit": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js",
22
+ "prepublishOnly": "node --test tests/snapshot/templates.test.js && node ../../../scripts/prepublish-gate.mjs",
23
+ "test": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/e2e/lifecycle.test.js tests/snapshot/templates.test.js",
24
+ "test:unit": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js",
25
25
  "test:e2e": "node --test tests/e2e/lifecycle.test.js",
26
26
  "test:snapshot": "node --test tests/snapshot/templates.test.js",
27
27
  "test:doctor": "node bin/cli.js doctor",