@dzhechkov/p-replicator 1.5.18 → 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.
- package/.dz-manifest.json +173 -57
- package/CHANGELOG.md +262 -0
- package/MULTIPLATFORM_ROADMAP.md +1 -1
- package/README/eng/01_quickstart.md +2 -2
- package/README/eng/02_user_guide.md +1 -1
- package/README/eng/03_admin_guide.md +2 -2
- package/README/eng/05_architecture.md +6 -2
- package/README/eng/README.md +1 -1
- package/README/ru/01_quickstart.md +2 -2
- package/README/ru/02_user_guide.md +1 -1
- package/README/ru/03_admin_guide.md +2 -2
- package/README/ru/05_architecture.md +1 -1
- package/README/ru/README.md +1 -1
- package/README/ru/html/index.html +7 -7
- package/README.md +139 -16
- package/bin/cli.js +0 -0
- package/package.json +11 -10
- package/sbom.json +346 -56
- package/src/utils.js +4 -0
- package/templates/.claude/agents/doc-validator.md +2 -1
- package/templates/.claude/agents/product-discoverer.md +1 -1
- package/templates/.claude/commands/next.md +16 -0
- package/templates/.claude/commands/replicate.md +183 -9
- package/templates/.claude/commands/start.md +19 -1
- package/templates/.claude/hooks/autocommit-insights.cjs +95 -10
- package/templates/.claude/hooks/autocommit-plans.cjs +95 -10
- package/templates/.claude/hooks/autocommit-roadmap.cjs +96 -13
- package/templates/.claude/hooks/check-docs-complete.cjs +174 -0
- package/templates/.claude/hooks/check-growth-trace.cjs +191 -0
- package/templates/.claude/hooks/check-ports.cjs +232 -0
- package/templates/.claude/hooks/session-insights.cjs +13 -1
- package/templates/.claude/hooks/state-update.cjs +13 -1
- package/templates/.claude/hooks/statusline.cjs +145 -18
- package/templates/.claude/rules/docker-ports.md +123 -0
- package/templates/.claude/rules/replicate-pipeline.md +19 -6
- package/templates/.claude/rules/skill-interface-protocol.md +9 -0
- package/templates/.claude/settings.json +5 -5
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/01-detect-parse.md +57 -14
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/02-analyze-map.md +9 -7
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md +6 -4
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/08-skill-composition.md +2 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/enhanced-recommendations.md +6 -4
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/extended-mapping.md +2 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-agents.md +2 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-skills.md +1 -1
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/enhanced-claude-md.md +2 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md +2 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-suggestions.md +11 -2
- package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/start-command.md +1 -1
- package/templates/.claude/skills/requirements-validator/SKILL.md +59 -0
- package/templates/.claude/skills/requirements-validator/references/scoring-system.md +28 -0
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/01-intelligence.md +4 -4
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md +2 -2
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md +9 -1
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md +3 -3
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/04-business-finance.md +3 -3
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/05-growth-engine.md +132 -12
- package/templates/.claude/skills/reverse-engineering-unicorn/modules/06-playbook-synthesis.md +1 -1
- package/templates/.claude/skills/sparc-prd-mini/SKILL.md +152 -10
- package/tests/e2e/lifecycle.test.js +21 -10
- package/tests/snapshot/baseline.json +42 -38
- package/tests/snapshot/update-baseline.js +2 -1
- package/tests/unit/adr-decision-coverage.test.js +137 -0
- package/tests/unit/adr-scanner-contract.test.js +108 -0
- package/tests/unit/autocommit-deletion.test.js +242 -0
- package/tests/unit/check-docs-complete.test.js +249 -0
- package/tests/unit/check-growth-trace.test.js +188 -0
- package/tests/unit/check-ports.test.js +184 -0
- package/tests/unit/db-port-rule.test.js +216 -0
- package/tests/unit/detect-parse-anchor.test.js +109 -0
- package/tests/unit/external-dependency-check.test.js +209 -0
- package/tests/unit/growth-axes-and-compliance.test.js +169 -0
- package/tests/unit/growth-gate-conditional.test.js +122 -0
- package/tests/unit/growth-module-b2b-gate.test.js +122 -0
- package/tests/unit/growth-requirements-bridge.test.js +127 -0
- package/tests/unit/hooks-project-anchored.test.js +223 -0
- package/tests/unit/hooks-report-failures.test.js +207 -0
- package/tests/unit/module-copy-identity.test.js +76 -0
- package/tests/unit/pipeline-file-ownership.test.js +95 -0
- package/tests/unit/roadmap-one-schema.test.js +179 -0
- package/tests/unit/skill-paths-prebaked.test.js +174 -0
- package/tests/unit/sparc-reconciliation.test.js +117 -0
- package/tests/unit/spec-pseudocode-traceability.test.js +146 -0
- package/tests/unit/statusline-honest-labels.test.js +178 -0
- package/tests/unit/statusline-two-roots.test.js +237 -0
- package/tests/unit/sync-templates-guard.test.js +209 -0
- package/tests/unit/utils.test.js +2 -2
- package/tests/unit/validation-gate-teeth.test.js +158 -0
- package/LICENSE +0 -21
package/templates/.claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
### 🔵 Режим DEEP
|
|
38
38
|
|
|
39
39
|
> ⚙️ **Загрузи:**
|
|
40
|
-
> 1. `view(/
|
|
40
|
+
> 1. `view(.claude/skills/goap-research-ed25519/SKILL.md)` — адаптивный поиск отзывов
|
|
41
41
|
> 2. `view(references/jtbd-canvas.md)` — JTBD framework + примеры
|
|
42
42
|
|
|
43
43
|
**GOAP State Assessment:**
|
|
@@ -73,7 +73,7 @@ sample_size_factor: 1.0 (≥20 reviews), 0.8 (10-19), 0.5 (<10)
|
|
|
73
73
|
|
|
74
74
|
### 🟣 Режим VERIFIED
|
|
75
75
|
|
|
76
|
-
> ⚙️ **Дополнительно:** `view(/
|
|
76
|
+
> ⚙️ **Дополнительно:** `view(.claude/skills/goap-research-ed25519/SKILL.md)`
|
|
77
77
|
|
|
78
78
|
Всё из DEEP, плюс:
|
|
79
79
|
- Каждая цитата клиента получает `source_hash` и, где доступно, provenance signature
|
|
@@ -99,7 +99,15 @@ why_now: [из M2 Section E — 4 фактора]
|
|
|
99
99
|
|
|
100
100
|
### Step 3: Generate React Prototype
|
|
101
101
|
|
|
102
|
-
> ⚙️
|
|
102
|
+
> ⚙️ **`frontend-design` — OPTIONAL, ВНЕШНИЙ.** Этот пакет его не отгружает. Пути вида
|
|
103
|
+
> `.claude/skills/frontend-design/` здесь намеренно НЕТ: он выглядел бы рабочим и не резолвился бы,
|
|
104
|
+
> а путь, который врёт, хуже честно чужого.
|
|
105
|
+
>
|
|
106
|
+
> Если навык установлен — читайте его для design quality. **Fallback, если его нет:** стройте
|
|
107
|
+
> прототип по секции ниже, она самодостаточна; в отчёте пометьте, что оценка design quality не
|
|
108
|
+
> проводилась. Молча пропускать нельзя (см. `.claude/rules/skill-interface-protocol.md` §6).
|
|
109
|
+
>
|
|
110
|
+
> Установить: `dz init --select frontend-design`.
|
|
103
111
|
> ⚙️ `view(examples/noom-cjm-example.md)` — few-shot: структура .jsx
|
|
104
112
|
|
|
105
113
|
**Создай один .jsx файл** со следующей архитектурой:
|
package/templates/.claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md
CHANGED
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
### 🔵 Режим DEEP
|
|
41
41
|
|
|
42
42
|
> ⚙️ **Загрузи перед началом:**
|
|
43
|
-
> 1. `view(/
|
|
44
|
-
> 2. `view(/
|
|
43
|
+
> 1. `view(.claude/skills/goap-research-ed25519/SKILL.md)` — для рыночного research
|
|
44
|
+
> 2. `view(.claude/skills/problem-solver-enhanced/SKILL.md)` — Modules 4, 5, 6 — для конкурентного анализа
|
|
45
45
|
|
|
46
46
|
#### PHASE A: GOAP Market Research
|
|
47
47
|
|
|
@@ -159,7 +159,7 @@ Incumbent │ (-2, +1) | (0, +2) │ Ценовая война
|
|
|
159
159
|
|
|
160
160
|
### 🟣 Режим VERIFIED (Ed25519)
|
|
161
161
|
|
|
162
|
-
> ⚙️ **Дополнительно:** `view(/
|
|
162
|
+
> ⚙️ **Дополнительно:** `view(.claude/skills/goap-research-ed25519/SKILL.md)`
|
|
163
163
|
|
|
164
164
|
Всё из режима DEEP, плюс:
|
|
165
165
|
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
### 🔵 Режим DEEP
|
|
42
42
|
|
|
43
43
|
> ⚙️ **Загрузи:**
|
|
44
|
-
> 1. `view(/
|
|
45
|
-
> 2. `view(/
|
|
44
|
+
> 1. `view(.claude/skills/goap-research-ed25519/SKILL.md)` — адаптивный research
|
|
45
|
+
> 2. `view(.claude/skills/problem-solver-enhanced/SKILL.md)` — Modules 1, 6
|
|
46
46
|
|
|
47
47
|
#### PHASE A: GOAP Financial Research
|
|
48
48
|
|
|
@@ -111,7 +111,7 @@ Physical: "Команда должна быть БОЛЬШОЙ (для скор
|
|
|
111
111
|
|
|
112
112
|
### 🟣 Режим VERIFIED
|
|
113
113
|
|
|
114
|
-
> ⚙️ **Дополнительно:** `view(/
|
|
114
|
+
> ⚙️ **Дополнительно:** `view(.claude/skills/goap-research-ed25519/SKILL.md)`
|
|
115
115
|
|
|
116
116
|
Всё из DEEP, плюс:
|
|
117
117
|
- Все benchmark числа получают source_hash; issuer-grade crypto используется только при valid signature under pinned active key
|
|
@@ -18,6 +18,45 @@
|
|
|
18
18
|
|
|
19
19
|
## Research Protocol
|
|
20
20
|
|
|
21
|
+
### ⚖️ Чеклист допустимости (все три режима)
|
|
22
|
+
|
|
23
|
+
Этот модуль оптимизирует рост и НЕ знает, что запрещено. Без этой секции он способен спроектировать
|
|
24
|
+
нарушение с невозмутимым видом и высокой уверенностью — уверенность здесь берётся из качества
|
|
25
|
+
данных, а не из законности приёма.
|
|
26
|
+
|
|
27
|
+
Пройдите список ДО того, как приём попадёт в `Growth Requirements Seed`. Отвечать нужно **про свою
|
|
28
|
+
юрисдикцию**: это вопросы, а не утверждения о праве.
|
|
29
|
+
|
|
30
|
+
| # | Вопрос | Приём, который его провоцирует |
|
|
31
|
+
|---|--------|--------------------------------|
|
|
32
|
+
| 1 | Отзывы и оценки — настоящие? Есть ли запрет на покупные и на «стимулированные без раскрытия»? | накрутка отзывов, отзыв за скидку |
|
|
33
|
+
| 2 | Отписка так же проста, как подписка? | подписка в один клик, отмена по звонку |
|
|
34
|
+
| 3 | Рассылки идут по согласию, которое можно предъявить? | закупленные базы, «согласие» в мелком шрифте |
|
|
35
|
+
| 4 | Реферальная программа не превращается в оплату за приведённого без раскрытия? | амбассадоры без пометки о вознаграждении |
|
|
36
|
+
| 5 | Данные для таргетинга собраны законно и хранятся там, где требует закон? | обогащение из внешних баз, трансграничная передача |
|
|
37
|
+
| 6 | Ограничения по вашей отрасли учтены? | реклама в медицине, финансах, детских продуктах |
|
|
38
|
+
| 7 | Приём конкурента, который вы копируете, законен — или он просто пока не пойман? | всё, что вы увидели в разборе выше |
|
|
39
|
+
|
|
40
|
+
**Как этим пользоваться — одно правило, и оно важнее самого списка.**
|
|
41
|
+
|
|
42
|
+
Ссылайтесь на **норму и на то, где её смотреть**, никогда — на сумму. Здесь намеренно нет ни одной
|
|
43
|
+
цифры: ни размера штрафа, ни порога, ни срока. Такие числа пересматриваются ежегодно, и цифра,
|
|
44
|
+
записанная в шаблон, гарантированно устареет — а уверенно неправильное число хуже отсутствия числа.
|
|
45
|
+
|
|
46
|
+
Показательный случай: разбор, из которого выросла эта секция, предупреждал, что цифра позапрошлого
|
|
47
|
+
года устарела, и тут же приводил цифру прошлого года как текущую. Предупреждение и ошибка в одном
|
|
48
|
+
документе. Поэтому: норма и ссылка, дата проверки — и всё.
|
|
49
|
+
|
|
50
|
+
**Ответ «нет» — это находка, а не формальность.** Запишите его рядом с приёмом: неотвеченный вопрос
|
|
51
|
+
и снятый вопрос выглядят одинаково, а значат противоположное.
|
|
52
|
+
|
|
53
|
+
**Чем это НЕ является.** Это не юридическая проверка и не застава: у неё нет проверяемого входа, и
|
|
54
|
+
никто её не исполняет автоматически. Это приглашение подумать до того, как приём станет требованием.
|
|
55
|
+
Конкретные нормы зависят от юрисдикции и в этом репозитории не проверялись — за ответами идите к
|
|
56
|
+
первоисточнику или к юристу, а не к этому файлу.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
21
60
|
### 🟢 Режим QUICK
|
|
22
61
|
|
|
23
62
|
**Поисковые запросы (выполни ВСЕ):**
|
|
@@ -39,8 +78,8 @@
|
|
|
39
78
|
### 🔵 Режим DEEP
|
|
40
79
|
|
|
41
80
|
> ⚙️ **Загрузи:**
|
|
42
|
-
> 1. `view(/
|
|
43
|
-
> 2. `view(/
|
|
81
|
+
> 1. `view(.claude/skills/goap-research-ed25519/SKILL.md)` — адаптивный research
|
|
82
|
+
> 2. `view(.claude/skills/problem-solver-enhanced/SKILL.md)` — Modules 5, 6
|
|
44
83
|
|
|
45
84
|
#### PHASE A: GOAP Growth Research
|
|
46
85
|
|
|
@@ -59,7 +98,9 @@ Goal State:
|
|
|
59
98
|
|
|
60
99
|
**OODA:**
|
|
61
100
|
- Если маркетинговые данные {COMPANY} недоступны → анализируй видимые каналы (SEO, ads library, social)
|
|
62
|
-
- Если B2B → sales-led
|
|
101
|
+
- Если B2B → мотион почти всегда sales-led или partnership-led, НЕ product-led self-serve;
|
|
102
|
+
переключи framework. Но это утверждение ТОЛЬКО про ось 1: петля выбирается отдельно, и
|
|
103
|
+
sales-led B2B с поощряемой реферальной петлёй — обычное дело, а не противоречие
|
|
63
104
|
- Если marketplace → two-sided acquisition, supply-side first
|
|
64
105
|
|
|
65
106
|
#### PHASE B: Second-Order Thinking — Growth Dynamics
|
|
@@ -116,7 +157,7 @@ Physical: "Продукт должен быть ПРОСТЫМ (для onboardin
|
|
|
116
157
|
|
|
117
158
|
### 🟣 Режим VERIFIED
|
|
118
159
|
|
|
119
|
-
> ⚙️ **Дополнительно:** `view(/
|
|
160
|
+
> ⚙️ **Дополнительно:** `view(.claude/skills/goap-research-ed25519/SKILL.md)`
|
|
120
161
|
|
|
121
162
|
Всё из DEEP, плюс:
|
|
122
163
|
- Traffic estimates и follower counts получают source_hash; issuer-grade crypto используется только при valid signature under pinned active key
|
|
@@ -136,18 +177,50 @@ Physical: "Продукт должен быть ПРОСТЫМ (для onboardin
|
|
|
136
177
|
|
|
137
178
|
## A. PRIMARY GROWTH LOOP
|
|
138
179
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
180
|
+
Здесь ДВА независимых вопроса, и раньше они стояли одним списком «выбери одно». Это делало
|
|
181
|
+
невыразимым самый обычный случай: компания продаёт через отдел продаж И крутит реферальную петлю.
|
|
182
|
+
Выбирается по одному пункту из КАЖДОЙ таблицы.
|
|
183
|
+
|
|
184
|
+
**Ось 1 — МОТИОН: как компания доходит до покупателя**
|
|
185
|
+
|
|
186
|
+
| | Мотион | Признак, по которому узнаётся |
|
|
187
|
+
|--|--------|-------------------------------|
|
|
188
|
+
| □ | Content/SEO | органический трафик — главный источник новых пользователей |
|
|
189
|
+
| □ | Performance Marketing | платные каналы, окупаемость считается по CAC/payback |
|
|
190
|
+
| □ | Sales-Led | сделку закрывает человек; есть цикл сделки и квоты |
|
|
191
|
+
| □ | Partnership-Led | приводят чужие каналы: интеграторы, маркетплейсы, реселлеры |
|
|
192
|
+
| □ | Product-Led (self-serve) | покупатель доходит до оплаты сам, без разговора |
|
|
193
|
+
|
|
194
|
+
**Ось 2 — ПЕТЛЯ: что заставляет использование порождать использование**
|
|
195
|
+
|
|
196
|
+
| | Петля | Механика | Что измеряет |
|
|
197
|
+
|--|-------|----------|--------------|
|
|
198
|
+
| □ | Нет петли | рост линейный, каждый новый пользователь куплен заново | — |
|
|
199
|
+
| □ | Product-Led loop | результат работы продукта сам приводит следующего | активации из шаринга |
|
|
200
|
+
| □ | Community-Led | сообщество отвечает на вопросы и втягивает новых | доля ответов от участников |
|
|
201
|
+
| □ | Значковая / встраиваемая | артефакт продукта живёт на чужой странице и виден снаружи | переходы со значка |
|
|
202
|
+
| □ | Поощряемая реферальная (односторонняя) | награду получает ТОЛЬКО приглашающий ИЛИ только приглашённый | K-фактор, стоимость поощрения |
|
|
203
|
+
| □ | Поощряемая реферальная (двусторонняя) | награду получают ОБЕ стороны | K-фактор, стоимость поощрения ×2 |
|
|
204
|
+
| □ | Сетевой эффект | ценность растёт от числа участников, не от их действий | плотность связей в сегменте |
|
|
146
205
|
|
|
147
|
-
|
|
206
|
+
Оси НЕЗАВИСИМЫ: `Sales-Led` + `Поощряемая реферальная` — законная и частая комбинация.
|
|
207
|
+
`Product-Led` встречается в обеих таблицах намеренно: как мотион это «покупает без разговора», как
|
|
208
|
+
петля — «результат продукта приводит следующего». Это разные утверждения, и одно не влечёт другое.
|
|
209
|
+
|
|
210
|
+
`Нет петли` — полноценный ответ, а не пропуск. Отсутствие петли меняет всю экономику роста, и
|
|
211
|
+
написать это прямо честнее, чем оставить пустую строку.
|
|
212
|
+
|
|
213
|
+
**Почему эти:** [обоснование на основе M2 segments + M4 unit economics — отдельно по каждой оси]
|
|
148
214
|
|
|
149
215
|
### Механика Loop
|
|
150
216
|
|
|
217
|
+
> **Если на оси 2 выбрано `Нет петли` — этот блок ПРОПУСКАЕТСЯ целиком**, вместе с маховиком и
|
|
218
|
+
> K-фактором ниже. Вместо него заполните «Воронка без петли»: `Источник → Первое касание → Оплата`,
|
|
219
|
+
> и назовите, чем оплачивается каждый новый пользователь. Требовать здесь петлю от того, кто честно
|
|
220
|
+
> ответил, что её нет, — значит вынудить его её выдумать; выдуманная петля хуже признанного её
|
|
221
|
+
> отсутствия, потому что на неё потом планируют.
|
|
222
|
+
|
|
223
|
+
|
|
151
224
|
```
|
|
152
225
|
Step 1: [Trigger / Awareness]
|
|
153
226
|
↓
|
|
@@ -259,6 +332,53 @@ Step 5: [Flywheel / Data Moat] ──→ усиливает Step 2-3
|
|
|
259
332
|
| **ИТОГО** | **0.XX** | **0.XX** |
|
|
260
333
|
```
|
|
261
334
|
|
|
335
|
+
## 🌱 Growth Requirements Seed
|
|
336
|
+
|
|
337
|
+
Всё выше — **анализ**: как растёт конкурент. Требование — это **обязательство**: что обязаны
|
|
338
|
+
построить мы. Разные вещи, и до этой секции вторая не появлялась ни разу. Секция переводит первое
|
|
339
|
+
во второе, потому что иначе разбор роста заканчивается вместе с сессией.
|
|
340
|
+
|
|
341
|
+
Заполняется ВСЕГДА, когда модуль M5 отработал. Пустая таблица — тоже ответ, но она должна быть
|
|
342
|
+
написана словом `нет`, а не отсутствовать: отсутствующая таблица и таблица «нечего сеять» читаются
|
|
343
|
+
одинаково, а значат разное.
|
|
344
|
+
|
|
345
|
+
| ID | Требование (ЧЕРНОВИК) | Блок-источник | Confidence из блока | Допустимость | Статус |
|
|
346
|
+
|----|----------------------|---------------|--------------------|--------------|--------|
|
|
347
|
+
| FR-GROWTH-001 | [что обязаны построить, одним предложением] | A. Primary Growth Loop | [как записано в блоке] | вопросы пройдены / ВОПРОС №N: [норма, где смотреть, дата проверки] / не проверялось | ЧЕРНОВИК / SPECULATIVE / ЗАБЛОКИРОВАНО |
|
|
348
|
+
| FR-GROWTH-002 | ... | B. Top-3 Acquisition Channels | ... | ... | ... |
|
|
349
|
+
|
|
350
|
+
**Правила заполнения — четыре, каждое закрывает конкретный способ соврать:**
|
|
351
|
+
|
|
352
|
+
1. **ID.** Ровно `FR-GROWTH-<nnn>`, три цифры, по порядку, номер не переиспользуется никогда.
|
|
353
|
+
Идентификатор — минимальное, что делает обязательство находимым машиной; проза про каналы
|
|
354
|
+
у конвейера уже есть, и она не помогла.
|
|
355
|
+
2. **Блок-источник обязателен.** Строка обязана назвать блок (`A`–`F`), из которого выведена.
|
|
356
|
+
Требование без источника непрослеживаемо и семенем не является — удалите его или найдите источник.
|
|
357
|
+
3. **Confidence переносится ДОСЛОВНО** — в том виде и на той шкале, как её записал блок-источник
|
|
358
|
+
(в QUICK это ручная оценка, в DEEP формула). Не пересчитывайте и не приводите к общей шкале:
|
|
359
|
+
пересчёт создаёт число, которого никто не измерял.
|
|
360
|
+
4. **Допустимость обязательна.** Перенесите сюда итог `⚖️ Чеклиста допустимости`. Ответ «нет» на
|
|
361
|
+
любой вопрос записывается НОМЕРОМ вопроса, нормой и датой проверки — и переводит строку в
|
|
362
|
+
`ЗАБЛОКИРОВАНО`. Заблокированную строку нельзя продвигать в `Specification.md`, пока вопрос не
|
|
363
|
+
снят. Пустая ячейка недопустима: `не проверялось` — честный ответ, пустота — потерянная находка.
|
|
364
|
+
5. **`SPECULATIVE`** ставится, когда источник помечен `[H]` (правило 4 навыка — непроверенное
|
|
365
|
+
утверждение), либо говорит `НЕ НАЙДЕНО`, либо не содержит confidence вовсе. Такую строку нельзя
|
|
366
|
+
продвигать в Specification.md молча — только с явным решением человека.
|
|
367
|
+
|
|
368
|
+
**Чего эта секция НЕ утверждает — два ограничения, и оба здесь, а не в отчёте о фиче:**
|
|
369
|
+
|
|
370
|
+
- **Черновик ≠ построено.** Наличие строки `FR-GROWTH-nnn` не означает, что что-то реализовано.
|
|
371
|
+
Секция ловит ровно один класс потерь: находку записали и забыли.
|
|
372
|
+
- **Допустимость СПРОШЕНА, но не установлена.** `⚖️ Чеклист допустимости` задаёт вопросы, и их итог
|
|
373
|
+
обязан стоять в колонке «Допустимость». Это не юридическое заключение: вопросы задаёт шаблон,
|
|
374
|
+
отвечает на них человек, и правильность ответа никем здесь не проверяется. `вопросы пройдены`
|
|
375
|
+
означает ровно «человек прошёл семь вопросов и не увидел препятствия» — не «это законно». За
|
|
376
|
+
заключением идите к юристу, не к этому файлу.
|
|
377
|
+
|
|
378
|
+
**Куда это идёт.** Секция входит в Product Discovery Brief, который Фаза 0 записывает в
|
|
379
|
+
`docs/product-discovery-brief.md`. Фаза 1 промотирует принятые строки в `docs/Specification.md`;
|
|
380
|
+
Фаза 2 проверяет, что промоушен состоялся.
|
|
381
|
+
|
|
262
382
|
## External Skill References
|
|
263
383
|
|
|
264
384
|
| Скилл | Режим | Как используется |
|
package/templates/.claude/skills/reverse-engineering-unicorn/modules/06-playbook-synthesis.md
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
### 🔵 Режим DEEP
|
|
38
38
|
|
|
39
39
|
> ⚙️ **После формирования плана, загрузи:**
|
|
40
|
-
> `view(/
|
|
40
|
+
> `view(.claude/skills/brutal-honesty-review/SKILL.md)`
|
|
41
41
|
> Применяй **Bach Mode (BS-detection)** к финальному playbook.
|
|
42
42
|
|
|
43
43
|
#### BS-Detection Quality Gate
|
|
@@ -28,9 +28,9 @@ sparc-prd-mini/
|
|
|
28
28
|
|
|
29
29
|
| Phase | Skill | Path | What it provides |
|
|
30
30
|
|-------|-------|------|------------------|
|
|
31
|
-
| Phase 0: Explore | `explore` |
|
|
32
|
-
| Phase 1: Research | `goap-research-ed25519` |
|
|
33
|
-
| Phase 2: Solve | `problem-solver-enhanced` |
|
|
31
|
+
| Phase 0: Explore | `explore` | `.claude/skills/explore/SKILL.md` | Socratic questioning → Product Brief |
|
|
32
|
+
| Phase 1: Research | `goap-research-ed25519` | `.claude/skills/goap-research-ed25519/SKILL.md` | GOAP A* + OODA → Research Findings |
|
|
33
|
+
| Phase 2: Solve | `problem-solver-enhanced` | `.claude/skills/problem-solver-enhanced/SKILL.md` | 9 modules + TRIZ → Solution Strategy |
|
|
34
34
|
|
|
35
35
|
**Принцип:** Каждый внешний скилл — Single Source of Truth. Обновление оригинала автоматически подхватывается здесь.
|
|
36
36
|
|
|
@@ -164,7 +164,7 @@ Checkpoint после каждой фазы. Пользователь подтв
|
|
|
164
164
|
### Phase 0: EXPLORE (делегация → explore skill)
|
|
165
165
|
|
|
166
166
|
```
|
|
167
|
-
view("/
|
|
167
|
+
view(".claude/skills/explore/SKILL.md")
|
|
168
168
|
→ Применить Socratic questioning к текущей задаче
|
|
169
169
|
→ Scope: уточнить продукт, аудиторию, features, constraints
|
|
170
170
|
```
|
|
@@ -216,7 +216,7 @@ view("/mnt/skills/user/explore/SKILL.md")
|
|
|
216
216
|
### Phase 1: RESEARCH (делегация → goap-research-ed25519 skill)
|
|
217
217
|
|
|
218
218
|
```
|
|
219
|
-
view("/
|
|
219
|
+
view(".claude/skills/goap-research-ed25519/SKILL.md")
|
|
220
220
|
→ Применить GOAP planning к продуктовому research
|
|
221
221
|
→ State Assessment → Gap Analysis → Plan → OODA Execution
|
|
222
222
|
```
|
|
@@ -290,7 +290,7 @@ view("/mnt/skills/user/goap-research-ed25519/SKILL.md")
|
|
|
290
290
|
### Phase 2: SOLVE (делегация → problem-solver-enhanced skill)
|
|
291
291
|
|
|
292
292
|
```
|
|
293
|
-
view("/
|
|
293
|
+
view(".claude/skills/problem-solver-enhanced/SKILL.md")
|
|
294
294
|
→ Применить 9-модульный framework к продуктовой проблеме
|
|
295
295
|
→ Включая TRIZ для разрешения противоречий
|
|
296
296
|
```
|
|
@@ -382,16 +382,24 @@ view("/mnt/skills/user/problem-solver-enhanced/SKILL.md")
|
|
|
382
382
|
|
|
383
383
|
**User Story Format:**
|
|
384
384
|
```
|
|
385
|
-
As a [persona],
|
|
385
|
+
US-<nnn>: As a [persona],
|
|
386
386
|
I want to [action],
|
|
387
387
|
So that [benefit].
|
|
388
388
|
|
|
389
389
|
Acceptance Criteria:
|
|
390
|
+
[SC-<story-id>-1]
|
|
390
391
|
Given [context]
|
|
391
392
|
When [action]
|
|
392
393
|
Then [expected result]
|
|
393
394
|
```
|
|
394
395
|
|
|
396
|
+
Every user story carries an ID `US-<nnn>` — three digits, assigned in order, never reused even after
|
|
397
|
+
a story is deleted. Every acceptance scenario under it carries `SC-<US-id>-<n>`, numbered from 1
|
|
398
|
+
within its story: the scenarios of `US-007` are `SC-US-007-1`, `SC-US-007-2`, and so on. Phase 4
|
|
399
|
+
traces algorithms back to these IDs, and there is nothing to trace to if a scenario has no name — nor
|
|
400
|
+
anything reliable to trace to if two scenarios can end up with the same name, which is what the
|
|
401
|
+
never-reused rule prevents.
|
|
402
|
+
|
|
395
403
|
**PRD Generation:**
|
|
396
404
|
```
|
|
397
405
|
view("templates/prd.md")
|
|
@@ -437,6 +445,7 @@ type EntityName = {
|
|
|
437
445
|
## Core Algorithms
|
|
438
446
|
|
|
439
447
|
### Algorithm: [Name]
|
|
448
|
+
REALISES: [SC-… ids this algorithm implements, comma-separated]
|
|
440
449
|
INPUT: [parameters]
|
|
441
450
|
OUTPUT: [result]
|
|
442
451
|
|
|
@@ -471,6 +480,54 @@ Response (4xx/5xx):
|
|
|
471
480
|
[Error categories and responses]
|
|
472
481
|
```
|
|
473
482
|
|
|
483
|
+
**Шаг 4.9 — ПОКРЫТИЕ СЦЕНАРИЕВ (обязательный, до чекпойнта).**
|
|
484
|
+
|
|
485
|
+
Re-read `Specification.md` and collect every `SC-` scenario ID. Collect every algorithm's `REALISES`
|
|
486
|
+
line from `Pseudocode.md`. Write a `## Scenario Coverage` block into `Pseudocode.md` — **in every
|
|
487
|
+
case, including the one where everything is covered**, because an absent block and a block saying
|
|
488
|
+
"all covered" are indistinguishable to the next reader:
|
|
489
|
+
|
|
490
|
+
```
|
|
491
|
+
## Scenario Coverage
|
|
492
|
+
|
|
493
|
+
Scenarios in Specification.md: [N] · claimed by an algorithm: [M]
|
|
494
|
+
|
|
495
|
+
Not claimed by any algorithm:
|
|
496
|
+
| Scenario | Reason |
|
|
497
|
+
|---|---|
|
|
498
|
+
| SC-… | ui-only |
|
|
499
|
+
|
|
500
|
+
Claimed by an algorithm but absent from Specification.md:
|
|
501
|
+
| Algorithm | Claimed ID |
|
|
502
|
+
|---|---|
|
|
503
|
+
| [name] | SC-… |
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
**Both tables are required, and both may be the single word `none`.** A traceability check that runs
|
|
507
|
+
one way only is half a check: without the second table an algorithm can declare `REALISES: SC-US-009-3`
|
|
508
|
+
for a scenario nobody ever wrote, and the dangling reference reads exactly like coverage. `none` is
|
|
509
|
+
written out rather than left blank, because an empty table and a forgotten table look identical.
|
|
510
|
+
|
|
511
|
+
**Reasons are a CLOSED list of five**, and nothing else is accepted:
|
|
512
|
+
|
|
513
|
+
| Reason | Means |
|
|
514
|
+
|---|---|
|
|
515
|
+
| `ui-only` | realised entirely in the interface, no algorithm to write |
|
|
516
|
+
| `external-service` | performed by a third party, see `Architecture.md` → External Dependencies |
|
|
517
|
+
| `out-of-mvp-scope` | deliberately not built yet |
|
|
518
|
+
| `data-only` | satisfied by a schema or constraint, not by a procedure |
|
|
519
|
+
| `config-only` | satisfied by OUR OWN configuration — a server setting, a header, a policy file — with no procedure to write |
|
|
520
|
+
|
|
521
|
+
Free text is NOT a reason, and `N/A` is NOT a reason. A field that accepts anything records nothing:
|
|
522
|
+
the whole value of the list is that an unclaimed scenario has to be one of a small number of
|
|
523
|
+
recognisable things, and if it is none of them, the gap is real and belongs in the algorithms.
|
|
524
|
+
|
|
525
|
+
**What this establishes, and what it does not.** It establishes that a CLAIM exists and that its two
|
|
526
|
+
ends name each other. It does NOT establish that the algorithm's steps actually perform the check the
|
|
527
|
+
scenario describes — no comparison of names can. So this catches *"nobody wrote anything about this
|
|
528
|
+
scenario"*; it does not catch *"someone wrote a line that mentions it"*. Say so here rather than
|
|
529
|
+
letting a later reader assume the stronger thing.
|
|
530
|
+
|
|
474
531
|
**[MANUAL] CP4:**
|
|
475
532
|
```
|
|
476
533
|
═══════════════════════════════════════════════════════════════
|
|
@@ -541,6 +598,51 @@ graph TB
|
|
|
541
598
|
| Queue | | |
|
|
542
599
|
| Infrastructure | | |
|
|
543
600
|
|
|
601
|
+
## External Dependencies
|
|
602
|
+
|
|
603
|
+
Every capability this product needs from someone else's service. One row per capability, not one row
|
|
604
|
+
per vendor: "sends email" and "reports bounces" are two questions, and a provider can do one without
|
|
605
|
+
the other.
|
|
606
|
+
|
|
607
|
+
| Capability needed | Provider / API | Evidence | Verdict | Requirements relying on it |
|
|
608
|
+
|---|---|---|---|---|
|
|
609
|
+
| [what the product needs it to DO] | [service] | [link to the provider's own docs naming this capability] · checked [YYYY-MM-DD] | CONFIRMED | [REQ ids] |
|
|
610
|
+
|
|
611
|
+
**Evidence — what counts, and what does not.** Evidence is a link to the PROVIDER'S OWN documentation
|
|
612
|
+
that names the specific capability, plus the date it was checked, plus **a short verbatim QUOTE from
|
|
613
|
+
that page stating the capability**. These do NOT count, and each is a way this check gets faked: a
|
|
614
|
+
landing page or marketing page; a pricing page; recollection — "the model knows this API supports
|
|
615
|
+
it"; and **a URL nobody opened** — a plausible-looking link is the cheapest possible forgery, which
|
|
616
|
+
is exactly why the quote is required and the link alone is not enough. A capability nobody could cite
|
|
617
|
+
is not confirmed, and saying so is the point of the middle verdict.
|
|
618
|
+
|
|
619
|
+
**Verdicts — exactly three, because two would hide a difference that matters:**
|
|
620
|
+
|
|
621
|
+
| Verdict | Means | Consequence in Phase 2 |
|
|
622
|
+
|---|---|---|
|
|
623
|
+
| CONFIRMED | cited, and the citation names this capability | none |
|
|
624
|
+
| UNCONFIRMED | nobody could produce a citation | the REQUIREMENTS in that row's last column cannot enter Phase 3 — defer, remove or replace them. Unrelated work continues; the run is 🟡 CAVEATS at best and the row is NAMED in the report |
|
|
625
|
+
| CONTRADICTED | the provider's own docs say it cannot | 🔴 NEEDS WORK — the requirement rests on something that is not there |
|
|
626
|
+
|
|
627
|
+
`UNCONFIRMED` is not a failure to be hidden; it is the honest state of a project on a machine with no
|
|
628
|
+
web access. Collapsing it into CONFIRMED overstates what is known; collapsing it into CONTRADICTED
|
|
629
|
+
blocks work that may be perfectly fine — and would push people to write a citation that isn't one,
|
|
630
|
+
which is how a gate becomes theatre.
|
|
631
|
+
|
|
632
|
+
But it does not pass for free either. **The consequence is scoped to the REQUIREMENT, not to the
|
|
633
|
+
run:** the requirements listed in an `UNCONFIRMED` row do not enter Phase 3 until they are deferred,
|
|
634
|
+
removed, or rewritten onto something confirmable. Everything not resting on that capability proceeds.
|
|
635
|
+
Without this scoping an inventory of nothing but `UNCONFIRMED` rows would reach Phase 3 with a
|
|
636
|
+
caveat, and external feasibility would never have to be established at all — the check would be
|
|
637
|
+
optional in practice while looking mandatory on paper.
|
|
638
|
+
|
|
639
|
+
**If this product has no external dependencies**, write exactly that: *"No external dependencies —
|
|
640
|
+
this product calls no third-party service."* An empty section and an absent section are
|
|
641
|
+
indistinguishable, and only one of them means anything.
|
|
642
|
+
|
|
643
|
+
Names in the row above are PLACEHOLDERS. Do not copy a real provider or a real capability from any
|
|
644
|
+
example: what an API can do drifts, and a stale fact recorded as evidence is worse than none.
|
|
645
|
+
|
|
544
646
|
## Data Architecture
|
|
545
647
|
[Data models, relationships, storage strategy]
|
|
546
648
|
|
|
@@ -551,6 +653,46 @@ graph TB
|
|
|
551
653
|
[Horizontal/vertical scaling, bottlenecks]
|
|
552
654
|
```
|
|
553
655
|
|
|
656
|
+
**Шаг 5.9 — СВЕРКА С ПСЕВДОКОДОМ (обязательный, до чекпойнта).**
|
|
657
|
+
|
|
658
|
+
Фаза 4 написала модель данных ДО того, как эта фаза выбрала хранилище и технологии, и до сих пор
|
|
659
|
+
ничто их не сверяло. Именно отсюда берутся расхождения, которые всплывают уже в коде: поле осталось
|
|
660
|
+
булевым, когда схема получила перечисление; алгоритм пользуется полем, которого в схеме нет; у
|
|
661
|
+
статуса три значения в одном документе и пять в другом.
|
|
662
|
+
|
|
663
|
+
Перечитай в `Pseudocode.md` ДВЕ секции — `## Data Structures` и `## Core Algorithms` — и сверь их с
|
|
664
|
+
тем, что выбрано ЗДЕСЬ. Алгоритмы нужны обязательно: расхождение «алгоритм читает поле, которого в
|
|
665
|
+
схеме нет» по одним лишь структурам данных не обнаруживается. Ищи три вида расхождений:
|
|
666
|
+
|
|
667
|
+
- **смена типа** — поле объявлено одним типом, а хранилище требует другого (булево против перечисления);
|
|
668
|
+
- **отсутствующая колонка** — алгоритм читает или пишет поле, которого в схеме нет;
|
|
669
|
+
- **несовпадение набора значений** — у одного и того же поля разное число допустимых значений.
|
|
670
|
+
|
|
671
|
+
Какую сторону править — решается по РОЛИ документа, а не по старшинству. `Pseudocode.md` держит
|
|
672
|
+
ЛОГИЧЕСКУЮ модель (что означает поле), `Architecture.md` — ФИЗИЧЕСКУЮ (где и как оно лежит).
|
|
673
|
+
Поэтому: если эта фаза ввела осознанное физическое ограничение (тип хранилища, индекс, длина) —
|
|
674
|
+
правится `Pseudocode.md`; если выбранная технология НАРУШАЕТ требуемую семантику (теряются значения,
|
|
675
|
+
исчезает состояние, которым пользуется алгоритм) — меняется выбор ЗДЕСЬ, потому что требование
|
|
676
|
+
старше удобства реализации. Секция `## Data Architecture` этого документа остаётся на месте, но
|
|
677
|
+
описывает отображение на хранилище и связи, а НЕ пересказывает список полей: второй экземпляр списка
|
|
678
|
+
становится вторым местом, где начинается расхождение.
|
|
679
|
+
|
|
680
|
+
Результат записывается в `Architecture.md` ВСЕГДА, отдельным блоком:
|
|
681
|
+
|
|
682
|
+
```markdown
|
|
683
|
+
## Reconciliation with Pseudocode
|
|
684
|
+
|
|
685
|
+
| Сущность.поле | Вид расхождения | Что сделано |
|
|
686
|
+
|---|---|---|
|
|
687
|
+
| … | смена типа / отсутствующая колонка / несовпадение набора значений | … |
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
Если сверка не нашла ничего — блок всё равно пишется, и он ОБЯЗАН назвать, что именно
|
|
691
|
+
сверялось: «Расхождений с `Pseudocode.md` не найдено. Сверены сущности: <перечисление>; алгоритмы:
|
|
692
|
+
<перечисление>.» Одна фраза «расхождений нет» без перечня — это церемония, которую модель напишет
|
|
693
|
+
не глядя; перечень делает утверждение проверяемым. Молчание не является результатом сверки: по нему
|
|
694
|
+
нельзя отличить «сверили и чисто» от «не сверяли».
|
|
695
|
+
|
|
554
696
|
**[MANUAL] CP5:**
|
|
555
697
|
```
|
|
556
698
|
═══════════════════════════════════════════════════════════════
|
|
@@ -948,8 +1090,8 @@ sparc-prd-mini MANUAL
|
|
|
948
1090
|
## Dependency Version Note
|
|
949
1091
|
|
|
950
1092
|
Этот скилл ссылается на внешние зависимости через `view()`. Если поведение изменилось неожиданно, проверь обновления в:
|
|
951
|
-
-
|
|
952
|
-
-
|
|
953
|
-
-
|
|
1093
|
+
- `.claude/skills/explore/SKILL.md`
|
|
1094
|
+
- `.claude/skills/goap-research-ed25519/SKILL.md`
|
|
1095
|
+
- `.claude/skills/problem-solver-enhanced/SKILL.md`
|
|
954
1096
|
|
|
955
1097
|
Собственная методология: `references/sparc-methodology.md`
|
|
@@ -281,16 +281,24 @@ describe('e2e: unknown command', () => {
|
|
|
281
281
|
// ---------------------------------------------------------------------------
|
|
282
282
|
|
|
283
283
|
describe('e2e: --help shows correct component counts', () => {
|
|
284
|
-
test('
|
|
284
|
+
test('--help agrees with COMPONENTS for every group', () => {
|
|
285
|
+
// DERIVED, not hardcoded. This assertion has now gone stale twice for the same reason — the
|
|
286
|
+
// comment above records "cli.js used to say 1 rule while EXPECTED_RULES had 2 entries", and
|
|
287
|
+
// adding the docker-ports rule broke it again with a literal 5. cli.js:57 already computes the
|
|
288
|
+
// numbers from COMPONENTS; a test that re-types them is a second source of truth, which is the
|
|
289
|
+
// very defect it was written to catch.
|
|
290
|
+
const { COMPONENTS } = require(path.join(PKG_DIR, 'src', 'utils.js'));
|
|
285
291
|
const dir = tmpDir();
|
|
286
292
|
try {
|
|
287
293
|
const r = runCli(['--help'], dir);
|
|
288
294
|
assert.equal(r.exitCode, 0);
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
295
|
+
for (const group of ['skills', 'commands', 'agents', 'rules']) {
|
|
296
|
+
const n = Object.keys(COMPONENTS[group].items).length;
|
|
297
|
+
// singular/plural: cli.js prints "1 rule" but "6 rules"
|
|
298
|
+
const word = n === 1 ? group.replace(/s$/, '') : group;
|
|
299
|
+
assert.match(r.stdout, new RegExp(n + '\\s+' + word, 'i'),
|
|
300
|
+
'--help must say "' + n + ' ' + word + '" to match COMPONENTS.' + group);
|
|
301
|
+
}
|
|
294
302
|
} finally { rmRf(dir); }
|
|
295
303
|
});
|
|
296
304
|
});
|
|
@@ -440,8 +448,10 @@ describe('e2e: v1.4.1 cross-platform hooks', () => {
|
|
|
440
448
|
assert.doesNotMatch(cmd, /\|\|\s*true/,
|
|
441
449
|
`bash-specific || true in: ${cmd}`);
|
|
442
450
|
// Each command should invoke node + a script
|
|
443
|
-
|
|
444
|
-
|
|
451
|
+
// Anchored at the project root, not the drifting cwd (PR-013): still node + the exact
|
|
452
|
+
// script, and now additionally the anchor — strictly stronger than the old assertion.
|
|
453
|
+
assert.match(cmd, /node\s+"\$\{CLAUDE_PROJECT_DIR\}\/\.claude\/hooks\/[A-Za-z0-9._-]+\.cjs"/,
|
|
454
|
+
`expected 'node "\${CLAUDE_PROJECT_DIR}/.claude/hooks/<script>.cjs"', got: ${cmd}`);
|
|
445
455
|
}
|
|
446
456
|
} finally { rmRf(dir); }
|
|
447
457
|
});
|
|
@@ -599,8 +609,9 @@ describe('e2e: v1.5.0 statusline dashboard', () => {
|
|
|
599
609
|
);
|
|
600
610
|
assert.ok(settings.statusLine, 'statusLine field should be present in settings.json');
|
|
601
611
|
assert.equal(settings.statusLine.type, 'command');
|
|
602
|
-
assert.match(settings.statusLine.command,
|
|
603
|
-
|
|
612
|
+
assert.match(settings.statusLine.command,
|
|
613
|
+
/node\s+"\$\{CLAUDE_PROJECT_DIR\}\/\.claude\/hooks\/statusline\.cjs"/,
|
|
614
|
+
'should invoke statusline.cjs via node, anchored at the project root (PR-013)');
|
|
604
615
|
} finally { rmRf(dir); }
|
|
605
616
|
});
|
|
606
617
|
|