@dzhechkov/keysarium 1.5.41 → 1.7.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 +13 -13
- package/README.md +24 -1
- package/bin/cli.js +0 -0
- package/package.json +6 -4
- package/sbom.json +12 -12
- package/templates/.claude/skills/feature-adr/modules/05-architecture.md +26 -0
- package/templates/.claude/skills/feature-adr/modules/06-implementation-plan.md +17 -2
- package/templates/.claude/skills/feature-adr/scripts/check-plan-completeness.mjs +64 -10
- 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/.dz-manifest.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"files": [
|
|
6
6
|
{
|
|
7
7
|
"path": "README.md",
|
|
8
|
-
"sha256": "
|
|
8
|
+
"sha256": "774b9308e33e1bca33707d1df23af3e37cea34580e4978da31d34138a1abf109"
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"path": "README.ru.md",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "package.json",
|
|
20
|
-
"sha256": "
|
|
20
|
+
"sha256": "453e99f3775d2b6da50e59bc57ed4eba52d35345e44ff98c9751e83953fbf179"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "src/cli.js",
|
|
@@ -377,11 +377,11 @@
|
|
|
377
377
|
},
|
|
378
378
|
{
|
|
379
379
|
"path": "templates/.claude/skills/feature-adr/modules/05-architecture.md",
|
|
380
|
-
"sha256": "
|
|
380
|
+
"sha256": "4d20dbc85ea5bb93ca90fd8cd089255bab9c76a912ca3ad954f3a4bb670f3c45"
|
|
381
381
|
},
|
|
382
382
|
{
|
|
383
383
|
"path": "templates/.claude/skills/feature-adr/modules/06-implementation-plan.md",
|
|
384
|
-
"sha256": "
|
|
384
|
+
"sha256": "c624e0ade0314ca07913ba64e092d4655f86201856e8188c3e616b2320226c1e"
|
|
385
385
|
},
|
|
386
386
|
{
|
|
387
387
|
"path": "templates/.claude/skills/feature-adr/modules/07-code.md",
|
|
@@ -481,7 +481,7 @@
|
|
|
481
481
|
},
|
|
482
482
|
{
|
|
483
483
|
"path": "templates/.claude/skills/feature-adr/scripts/check-plan-completeness.mjs",
|
|
484
|
-
"sha256": "
|
|
484
|
+
"sha256": "630eb9047258ad0333082f407cd34522e4c278650f22ef6dba1ef897ec5cce71"
|
|
485
485
|
},
|
|
486
486
|
{
|
|
487
487
|
"path": "templates/.claude/skills/frontend-design/LICENSE.txt",
|
|
@@ -661,31 +661,31 @@
|
|
|
661
661
|
},
|
|
662
662
|
{
|
|
663
663
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/modules/01-intelligence.md",
|
|
664
|
-
"sha256": "
|
|
664
|
+
"sha256": "0770bd63a6a1eeb34e873cb101e2ba0cf88d507e9bc03242046eaa837b9f587c"
|
|
665
665
|
},
|
|
666
666
|
{
|
|
667
667
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md",
|
|
668
|
-
"sha256": "
|
|
668
|
+
"sha256": "499bbded50ddd368a62301083e828a42bd0223aa58322b6a952f00086b462972"
|
|
669
669
|
},
|
|
670
670
|
{
|
|
671
671
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md",
|
|
672
|
-
"sha256": "
|
|
672
|
+
"sha256": "11e2e101c99d42306ac1d0931475c5a8899e929514e41a393b6173e03856cfc3"
|
|
673
673
|
},
|
|
674
674
|
{
|
|
675
675
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md",
|
|
676
|
-
"sha256": "
|
|
676
|
+
"sha256": "7c2e7164463371239d92f28153777e40ee0d6dad293d59886a4cf5b306fa3627"
|
|
677
677
|
},
|
|
678
678
|
{
|
|
679
679
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/modules/04-business-finance.md",
|
|
680
|
-
"sha256": "
|
|
680
|
+
"sha256": "dd08226391d498a82f111f0da665ea7cea1fa8a97683fab11070f879142727f7"
|
|
681
681
|
},
|
|
682
682
|
{
|
|
683
683
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/modules/05-growth-engine.md",
|
|
684
|
-
"sha256": "
|
|
684
|
+
"sha256": "84658390dc7beb590f70164b391ace915e42926660bc1015e4be300752b74a37"
|
|
685
685
|
},
|
|
686
686
|
{
|
|
687
687
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/modules/06-playbook-synthesis.md",
|
|
688
|
-
"sha256": "
|
|
688
|
+
"sha256": "3cd76a218aa9f94e0ff8ff2fc257647540674f68df3883f0de5e76e1cea26d9b"
|
|
689
689
|
},
|
|
690
690
|
{
|
|
691
691
|
"path": "templates/.claude/skills/reverse-engineering-unicorn/references/blue-ocean-canvas.md",
|
|
@@ -985,5 +985,5 @@
|
|
|
985
985
|
}
|
|
986
986
|
]
|
|
987
987
|
},
|
|
988
|
-
"signature": "
|
|
988
|
+
"signature": "tE9dl+UOc6pm9JzDXyccvisqrtjyzVOu8O54WM38Vb5+WzRFAQrlTEFF9juDKLjwQMA9vocuSh7HDptX4tdfAw=="
|
|
989
989
|
}
|
package/README.md
CHANGED
|
@@ -17,6 +17,25 @@ Full 7-phase pipeline for AI case studies, hackathons, and casariums. Provides s
|
|
|
17
17
|
> whether a lesson describes a method or a person, and says so: that judgement is the agent's, per
|
|
18
18
|
> the teach protocol. See `skills/goap-research-ed25519/SKILL.md`.
|
|
19
19
|
|
|
20
|
+
## Growth engine (reverse-engineering-unicorn M5)
|
|
21
|
+
### What M5 produces, since 0.2.0 / 1.7.0 / 1.6.0
|
|
22
|
+
|
|
23
|
+
M5 no longer ends as analysis. Three changes, in the order they matter:
|
|
24
|
+
|
|
25
|
+
- **Growth type is two independent choices, not one.** A go-to-market MOTION (content, performance,
|
|
26
|
+
sales-led, partnership, self-serve) and a growth LOOP (none, product-led, community, badge/embed,
|
|
27
|
+
one- or two-sided incentivised referral, network effect). The old single list forced one pick
|
|
28
|
+
across both questions, which made the ordinary case — a sales-led company running a referral loop
|
|
29
|
+
— unsayable. Choosing `no loop` is a real answer and skips the loop-only output rather than
|
|
30
|
+
demanding an invented flywheel.
|
|
31
|
+
- **A `Growth Requirements Seed` table** turns the analysis into `FR-GROWTH-nnn` DRAFT obligations,
|
|
32
|
+
each naming the block it came from and carrying that block's confidence verbatim. A seed is a
|
|
33
|
+
draft: it does not establish that anything was built.
|
|
34
|
+
- **A compliance checklist** runs before any technique becomes a requirement. It cites the norm and
|
|
35
|
+
where to look it up, and deliberately carries no amount, threshold or statute — those are
|
|
36
|
+
jurisdiction-specific and go stale within a year. A `no` answer is recorded against the
|
|
37
|
+
requirement and blocks its promotion. It asks the questions; it is not a legal opinion.
|
|
38
|
+
|
|
20
39
|
## Quick Start
|
|
21
40
|
|
|
22
41
|
```bash
|
|
@@ -419,6 +438,10 @@ deliberately excluded — "skeleton first" is nonsense there.
|
|
|
419
438
|
|
|
420
439
|
## Status
|
|
421
440
|
|
|
441
|
+
`1.5.42` — refreshes the bundled `feature-adr` Step-5 module with the mandatory `Observability`
|
|
442
|
+
section. No keysarium behaviour changes. See `@dzhechkov/skills-feature-adr@1.5.4`.
|
|
443
|
+
|
|
444
|
+
|
|
422
445
|
`1.5.41` — refreshes the bundled `feature-adr` gate script with the C6 amendment-integrity fix (each
|
|
423
446
|
amendment scoped to its own block; closes a false refusal on markers below the old three-line window
|
|
424
447
|
AND a false pass where a testless amendment borrowed its neighbour's marker). No keysarium behaviour
|
|
@@ -433,5 +456,5 @@ carrying no acid table is an honest SKIP. Both used to report as a clean skip, s
|
|
|
433
456
|
silently switched itself off whenever Step 0 wrote nothing — MEASURED 2026-08-21, 66 of 199 features
|
|
434
457
|
carried that file and the last four in a row did not.
|
|
435
458
|
|
|
436
|
-
`1.5.
|
|
459
|
+
`1.5.40` — the bundled `feature-adr` Step-8 module now describes the amendment gate as the command
|
|
437
460
|
`dz amendment-check` instead of a judgement the reviewer is asked to make. Text only; no pipeline change.
|
package/bin/cli.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/keysarium",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
|
+
"scripts": {
|
|
5
|
+
"prepublishOnly": "node ../../../scripts/prepublish-gate.mjs"
|
|
6
|
+
},
|
|
4
7
|
"description": "AI Case Research Toolkit for Claude Code — full 7-phase pipeline with feature-adr, dream cycles, background workers, multi-platform support, reward learning, and Cloud.ru AI Factory mapping (--ai-factory flag)",
|
|
5
8
|
"main": "src/cli.js",
|
|
6
9
|
"bin": {
|
|
@@ -51,6 +54,5 @@
|
|
|
51
54
|
},
|
|
52
55
|
"publishConfig": {
|
|
53
56
|
"access": "public"
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
+
}
|
|
58
|
+
}
|
package/sbom.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"hashes": [
|
|
16
16
|
{
|
|
17
17
|
"alg": "SHA-256",
|
|
18
|
-
"content": "
|
|
18
|
+
"content": "774b9308e33e1bca33707d1df23af3e37cea34580e4978da31d34138a1abf109"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
},
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"hashes": [
|
|
46
46
|
{
|
|
47
47
|
"alg": "SHA-256",
|
|
48
|
-
"content": "
|
|
48
|
+
"content": "453e99f3775d2b6da50e59bc57ed4eba52d35345e44ff98c9751e83953fbf179"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
},
|
|
@@ -945,7 +945,7 @@
|
|
|
945
945
|
"hashes": [
|
|
946
946
|
{
|
|
947
947
|
"alg": "SHA-256",
|
|
948
|
-
"content": "
|
|
948
|
+
"content": "4d20dbc85ea5bb93ca90fd8cd089255bab9c76a912ca3ad954f3a4bb670f3c45"
|
|
949
949
|
}
|
|
950
950
|
]
|
|
951
951
|
},
|
|
@@ -955,7 +955,7 @@
|
|
|
955
955
|
"hashes": [
|
|
956
956
|
{
|
|
957
957
|
"alg": "SHA-256",
|
|
958
|
-
"content": "
|
|
958
|
+
"content": "c624e0ade0314ca07913ba64e092d4655f86201856e8188c3e616b2320226c1e"
|
|
959
959
|
}
|
|
960
960
|
]
|
|
961
961
|
},
|
|
@@ -1205,7 +1205,7 @@
|
|
|
1205
1205
|
"hashes": [
|
|
1206
1206
|
{
|
|
1207
1207
|
"alg": "SHA-256",
|
|
1208
|
-
"content": "
|
|
1208
|
+
"content": "630eb9047258ad0333082f407cd34522e4c278650f22ef6dba1ef897ec5cce71"
|
|
1209
1209
|
}
|
|
1210
1210
|
]
|
|
1211
1211
|
},
|
|
@@ -1655,7 +1655,7 @@
|
|
|
1655
1655
|
"hashes": [
|
|
1656
1656
|
{
|
|
1657
1657
|
"alg": "SHA-256",
|
|
1658
|
-
"content": "
|
|
1658
|
+
"content": "0770bd63a6a1eeb34e873cb101e2ba0cf88d507e9bc03242046eaa837b9f587c"
|
|
1659
1659
|
}
|
|
1660
1660
|
]
|
|
1661
1661
|
},
|
|
@@ -1665,7 +1665,7 @@
|
|
|
1665
1665
|
"hashes": [
|
|
1666
1666
|
{
|
|
1667
1667
|
"alg": "SHA-256",
|
|
1668
|
-
"content": "
|
|
1668
|
+
"content": "499bbded50ddd368a62301083e828a42bd0223aa58322b6a952f00086b462972"
|
|
1669
1669
|
}
|
|
1670
1670
|
]
|
|
1671
1671
|
},
|
|
@@ -1675,7 +1675,7 @@
|
|
|
1675
1675
|
"hashes": [
|
|
1676
1676
|
{
|
|
1677
1677
|
"alg": "SHA-256",
|
|
1678
|
-
"content": "
|
|
1678
|
+
"content": "11e2e101c99d42306ac1d0931475c5a8899e929514e41a393b6173e03856cfc3"
|
|
1679
1679
|
}
|
|
1680
1680
|
]
|
|
1681
1681
|
},
|
|
@@ -1685,7 +1685,7 @@
|
|
|
1685
1685
|
"hashes": [
|
|
1686
1686
|
{
|
|
1687
1687
|
"alg": "SHA-256",
|
|
1688
|
-
"content": "
|
|
1688
|
+
"content": "7c2e7164463371239d92f28153777e40ee0d6dad293d59886a4cf5b306fa3627"
|
|
1689
1689
|
}
|
|
1690
1690
|
]
|
|
1691
1691
|
},
|
|
@@ -1695,7 +1695,7 @@
|
|
|
1695
1695
|
"hashes": [
|
|
1696
1696
|
{
|
|
1697
1697
|
"alg": "SHA-256",
|
|
1698
|
-
"content": "
|
|
1698
|
+
"content": "dd08226391d498a82f111f0da665ea7cea1fa8a97683fab11070f879142727f7"
|
|
1699
1699
|
}
|
|
1700
1700
|
]
|
|
1701
1701
|
},
|
|
@@ -1705,7 +1705,7 @@
|
|
|
1705
1705
|
"hashes": [
|
|
1706
1706
|
{
|
|
1707
1707
|
"alg": "SHA-256",
|
|
1708
|
-
"content": "
|
|
1708
|
+
"content": "84658390dc7beb590f70164b391ace915e42926660bc1015e4be300752b74a37"
|
|
1709
1709
|
}
|
|
1710
1710
|
]
|
|
1711
1711
|
},
|
|
@@ -1715,7 +1715,7 @@
|
|
|
1715
1715
|
"hashes": [
|
|
1716
1716
|
{
|
|
1717
1717
|
"alg": "SHA-256",
|
|
1718
|
-
"content": "
|
|
1718
|
+
"content": "3cd76a218aa9f94e0ff8ff2fc257647540674f68df3883f0de5e76e1cea26d9b"
|
|
1719
1719
|
}
|
|
1720
1720
|
]
|
|
1721
1721
|
},
|
|
@@ -118,6 +118,32 @@ GET /api/v1/{resource}/:id
|
|
|
118
118
|
Errors: 401, 404
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
+
## Observability — a MANDATORY section of `05_architecture.md`
|
|
122
|
+
|
|
123
|
+
The artifact must carry a section headed exactly **`Observability`**, answering how anyone would
|
|
124
|
+
know this feature is working once it ships:
|
|
125
|
+
|
|
126
|
+
- what it **logs**, and at what level;
|
|
127
|
+
- what it **counts** — the one or two numbers that would move if it broke;
|
|
128
|
+
- what a **failure looks like from outside** — the symptom, not the stack trace;
|
|
129
|
+
- **who would notice**, and how.
|
|
130
|
+
|
|
131
|
+
If the feature genuinely emits nothing at runtime — a pure refactor, a doc change, a gate that only
|
|
132
|
+
runs in CI — write **"nothing to observe"** and say why. That is a complete answer, not a gap. What
|
|
133
|
+
is not acceptable is leaving the question unanswered.
|
|
134
|
+
|
|
135
|
+
The heading is read by a machine (`dz score` reports it as a discipline), so it is spelled exactly
|
|
136
|
+
`Observability` — the prompt above and the check derive that word from one shared constant, because
|
|
137
|
+
a prompt asking for one heading while a check greps another produces a gate that fails every honest
|
|
138
|
+
run.
|
|
139
|
+
|
|
140
|
+
**Why this section exists.** MEASURED 2026-08-25: across 107 existing `05_architecture.md` files,
|
|
141
|
+
ZERO carried such a section, and the word `observability` appeared nowhere in the pipeline's own
|
|
142
|
+
prompts. The pipeline kept five telemetry stores about itself and asked for none about what it
|
|
143
|
+
built. The two capable skills — `observability` (818 lines) and `observability-testing-patterns`
|
|
144
|
+
(946 lines) — were fully written and unreachable, because nothing called them. This section is the
|
|
145
|
+
call site.
|
|
146
|
+
|
|
121
147
|
## Write discipline (the 180-second rule)
|
|
122
148
|
|
|
123
149
|
An executor that returns from a tool call and then thinks in silence past **180 seconds** is killed by the
|
|
@@ -130,8 +130,15 @@ Before finalizing the plan, validate completeness:
|
|
|
130
130
|
1. Cross-reference every `{REQUIREMENT}` (FR-N) → at least one TASK covers it
|
|
131
131
|
2. Cross-reference every `{ADR_DECISION}` → at least one TASK implements it
|
|
132
132
|
3. Cross-reference every critical risk from `{QUALITY_RISKS}` → mitigation in some TASK
|
|
133
|
-
4.
|
|
134
|
-
|
|
133
|
+
4. Name every acid token `A<n>` from `00_complexity_assessment.md` VERBATIM in the plan (C4), each
|
|
134
|
+
bound to the TASK that owns it and the TEST that proves the refusal — the gate reads them with a
|
|
135
|
+
word-boundary regex, so a paraphrase, a range (`A1-A7`) or a renamed token does not count
|
|
136
|
+
5. Carry an `Inputs read:` line naming at least `03_adr` and `05_architecture` (C5). Put it at the
|
|
137
|
+
TOP of the plan or immediately BEFORE the trailing `EXPECTED_CODE_TARGETS:` block — never after
|
|
138
|
+
it. The plan must END with that targets block, so "end with Inputs read" would contradict the
|
|
139
|
+
layout the coder reads (cross-family QE, gpt-5.6-sol)
|
|
140
|
+
6. If gaps found → add missing TASKs and re-order the DAG
|
|
141
|
+
7. **Iterate until no gaps remain** (max 3 iterations, then flag for user)
|
|
135
142
|
|
|
136
143
|
This gap-check loop ensures the implementation plan is complete before coding begins.
|
|
137
144
|
|
|
@@ -190,6 +197,14 @@ Create `features/<slug>/06_implementation_plan.md` with:
|
|
|
190
197
|
the NEXT `AM-N` begins. Multi-line amendments are fine; what is NOT fine is putting a marker after
|
|
191
198
|
the following amendment has already started, because it then belongs to that one. A bare range
|
|
192
199
|
like `AM-1..AM-4` never opens a row.
|
|
200
|
+
TWO machines read this row with ONE grammar and different depths: the K2 C6 gate asks whether the
|
|
201
|
+
row is well-formed; `dz amendment-check` asks whether the named test RESOLVES to a real title in a
|
|
202
|
+
real file. So the marker carries ALL THREE parts — an arrow (`→` or `->`), the test id in
|
|
203
|
+
backticks, and the file as `` in `path` ``:
|
|
204
|
+
`AM-N (source): <change>. Confirmation: <property> → test \`test_name\` in \`path/to/file\` (fails if reverted).`
|
|
205
|
+
A marker WITHOUT the file used to pass the plan gate and then fail Step 8 with `no-file-named` —
|
|
206
|
+
that is the exact defect this shape removes. The alternative complete form is a retraction:
|
|
207
|
+
`superseded by AM-N`, which both machines accept.
|
|
193
208
|
A safeguard amendment's named test must prove it TRIGGERS on a real input, not merely that its code
|
|
194
209
|
path exists. Step 8 verifies every named test exists and is non-vacuous (`dz discrimination-check`).
|
|
195
210
|
|
|
@@ -301,15 +301,38 @@ else for (const t of acidTokens) if (!new RegExp(`\\b${t.replace(/[.*+?^${}()|[\
|
|
|
301
301
|
// Line-scan, not regex-over-document: \Z is Python, and $-lookahead under /m matches every
|
|
302
302
|
// line end — a section with no FOLLOWING heading silently failed to parse (caught by the
|
|
303
303
|
// fixture the moment the tests ran).
|
|
304
|
-
|
|
304
|
+
// Fenced blocks are BLANKED line-for-line, preserving numbering and offsets: a fenced
|
|
305
|
+
// `## Amendments` could become the section heading, and a fenced example row could either open a
|
|
306
|
+
// phantom amendment or hand a real testless one someone else's marker. Third fence-blindness
|
|
307
|
+
// found in a checker today, so it is closed here by construction rather than by care.
|
|
308
|
+
const rawLines = plan.split('\n');
|
|
309
|
+
const planLines = [];
|
|
310
|
+
{
|
|
311
|
+
let fence = null;
|
|
312
|
+
for (const line of rawLines) {
|
|
313
|
+
const open = /^ {0,3}(```+|~~~+)/.exec(line);
|
|
314
|
+
if (fence === null && open) { fence = open[1][0]; planLines.push(''); continue; }
|
|
315
|
+
if (fence !== null) {
|
|
316
|
+
planLines.push('');
|
|
317
|
+
if (new RegExp('^ {0,3}' + fence + '{3,}\\s*$').test(line)) fence = null;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
planLines.push(line);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
305
323
|
let sectionStart = -1, sectionEnd = -1, cursor = 0;
|
|
306
324
|
for (const pl of planLines) {
|
|
307
|
-
|
|
308
|
-
|
|
325
|
+
// The SAME heading shape amendment-trace.ts accepts: up to three leading spaces, two to four
|
|
326
|
+
// hashes, and trailing text allowed. C6 required exactly `##` with nothing after, so the two
|
|
327
|
+
// tools disagreed about where the section even IS — the divergence this feature exists to end.
|
|
328
|
+
if (sectionStart < 0 && /^ {0,3}#{2,4}\s+Amendments\b/.test(pl)) sectionStart = cursor + pl.length + 1;
|
|
329
|
+
else if (sectionStart >= 0 && sectionEnd < 0 && /^ {0,3}#{1,4}\s/.test(pl)) sectionEnd = cursor;
|
|
309
330
|
cursor += pl.length + 1;
|
|
310
331
|
}
|
|
311
332
|
if (sectionStart >= 0 && sectionEnd < 0) sectionEnd = plan.length;
|
|
312
|
-
|
|
333
|
+
// Sliced from the MASKED text so the offsets computed above line up with what is scanned.
|
|
334
|
+
const maskedPlan = planLines.join('\n');
|
|
335
|
+
const amSection = sectionStart >= 0 ? maskedPlan.slice(sectionStart, sectionEnd) : '';
|
|
313
336
|
// Only a DEFINITION-shaped line counts as a stray: a list item opening with the AM token.
|
|
314
337
|
// A mid-prose REFERENCE («per 01_requirements.md (AM-1..AM-6)», «(AM-1: the clause stays
|
|
315
338
|
// dropped)») cites an amendment defined in ANOTHER artifact and is legitimate — the first cut
|
|
@@ -317,7 +340,11 @@ else for (const t of acidTokens) if (!new RegExp(`\\b${t.replace(/[.*+?^${}()|[\
|
|
|
317
340
|
{
|
|
318
341
|
let cursor2 = 0;
|
|
319
342
|
for (const pl of planLines) {
|
|
320
|
-
|
|
343
|
+
// The SAME row shape as the in-section rule, or the two disagree about what a row is: a
|
|
344
|
+
// bullet-less row was invisible here while being a row there (so it evaded this check), and
|
|
345
|
+
// this side lacked the range guard, so «AM-1..AM-4 are covered elsewhere» was falsely
|
|
346
|
+
// reported as a definition. One shape, one meaning.
|
|
347
|
+
const isDef = /^\s*(?:[-*|]\s*)?\*{0,2}AM-(?:CP-)?\d+\*{0,2}\b(?!\s*\.)/.test(pl);
|
|
321
348
|
const inSection = sectionStart >= 0 && cursor2 >= sectionStart && cursor2 < sectionEnd;
|
|
322
349
|
if (isDef && !inSection) {
|
|
323
350
|
const tok = (/AM-(?:CP-)?\d+/.exec(pl) || ['AM-?'])[0];
|
|
@@ -346,16 +373,39 @@ else for (const t of acidTokens) if (!new RegExp(`\\b${t.replace(/[.*+?^${}()|[\
|
|
|
346
373
|
// check entirely (MEASURED). The `(?!\s*\.)` guard is what refuses a wrapped `AM-1..AM-4;`
|
|
347
374
|
// range preamble, which used to open a phantom amendment and double-count AM-1 — it costs 0 rows.
|
|
348
375
|
const DEF = /^(?:[-*|]\s*)?\*{0,2}(AM-(?:CP-)?\d+)\*{0,2}\b(?!\s*\.)/;
|
|
349
|
-
//
|
|
350
|
-
//
|
|
351
|
-
|
|
376
|
+
// The marker must carry what the LATER gate needs to resolve: an arrow, a backticked test id,
|
|
377
|
+
// and a file as `in \`path\``. Until 2026-08-25 this accepted a bare `-> test`, so a plan cleared
|
|
378
|
+
// K2 and then failed Step-8 `dz amendment-check` with `no-file-named` — the two tools read one
|
|
379
|
+
// row under different contracts (field report doc-26). Same grammar, different depth: this asks
|
|
380
|
+
// whether the row is WELL-FORMED, amendment-check asks whether it RESOLVES.
|
|
381
|
+
// The two-id form `-> tests \`a\` and \`b\`` is corpus-canonical; matching only the singular
|
|
382
|
+
// turned two green rows red when this was last touched.
|
|
383
|
+
const MARK = /(?:\u2192|->)\s*tests?\s+`[^`]+`(?:\s*(?:and|и)\s*`[^`]+`)?[\s\S]{0,40}?\bin\s+`[^`]+`/;
|
|
352
384
|
const defs = [];
|
|
353
385
|
secLines.forEach((l, i) => { const m = DEF.exec(l.trim()); if (m) defs.push({ i, id: m[1] }); });
|
|
354
386
|
for (let k = 0; k < defs.length; k++) {
|
|
355
387
|
const to = k + 1 < defs.length ? defs[k + 1].i : secLines.length;
|
|
356
388
|
const block = secLines.slice(defs[k].i, to).join('\n');
|
|
357
389
|
const hasTest = MARK.test(block);
|
|
358
|
-
|
|
390
|
+
// A MENTION is not a CLAIM — the third instance of that class found today. An unanchored
|
|
391
|
+
// substring test passes on "NOT superseded by AM-9" and on a sentence quoting the form.
|
|
392
|
+
// Anchoring on POSITION was tried and rejected: real rows put prose between the id and the
|
|
393
|
+
// retraction, so a position rule refuses legitimate corpus forms. The rule is therefore about
|
|
394
|
+
// NEGATION and QUOTATION, the two ways a mention differs from a claim — plus the successor
|
|
395
|
+
// must EXIST among the amendments defined here, since a retraction pointing at AM-999999 is
|
|
396
|
+
// not a retraction but a way through the gate.
|
|
397
|
+
let superseded = false;
|
|
398
|
+
for (const bl of block.split('\n')) {
|
|
399
|
+
const re = /superseded by (AM-(?:CP-)?\d+)\b/ig;
|
|
400
|
+
for (let m = re.exec(bl); m !== null; m = re.exec(bl)) {
|
|
401
|
+
const before = bl.slice(0, m.index);
|
|
402
|
+
if (/\b(?:not|never|no|isn't|is not|rather than|instead of)\s*$/i.test(before)) continue;
|
|
403
|
+
const quotes = (before.match(/[`"«]/g) || []).length;
|
|
404
|
+
if (quotes % 2 === 1) continue;
|
|
405
|
+
if (m[1] && defs.some((d) => d.id.toLowerCase() === m[1].toLowerCase())) { superseded = true; break; }
|
|
406
|
+
}
|
|
407
|
+
if (superseded) break;
|
|
408
|
+
}
|
|
359
409
|
if (!hasTest && !superseded) failures.push(`C6: ${defs[k].id} carries neither \`\u2192 test <name>\` nor \`superseded by AM-N\` — an amendment without a confirmation is a wish, and a retracted one must say its successor`);
|
|
360
410
|
}
|
|
361
411
|
}
|
|
@@ -368,7 +418,11 @@ else for (const t of acidTokens) if (!new RegExp(`\\b${t.replace(/[.*+?^${}()|[\
|
|
|
368
418
|
// with both sides named and never blocks.
|
|
369
419
|
{
|
|
370
420
|
const adrAll = adrFiles.map((f) => { try { return readFileSync(join(adrDir, f), 'utf-8'); } catch { return ''; } }).join('\n');
|
|
371
|
-
|
|
421
|
+
// The tail is OPTIONAL and stops at the first closing backtick (`[^`]*`, never `.*`): a command
|
|
422
|
+
// cited WITH its real arguments must be visible on BOTH sides, or a genuine ADR<->plan divergence
|
|
423
|
+
// hides whenever both files write the natural form (ADR-002, backlog 420e5b79). The CAPTURE stays
|
|
424
|
+
// the bare name, so the comparison remains a set of command NAMES and flag differences never warn.
|
|
425
|
+
const cmds = (t) => new Set([...t.matchAll(/`dz ([a-z][a-z0-9-]+)(?:\s[^`]*)?`/g)].map((m) => m[1]));
|
|
372
426
|
const inAdr = cmds(adrAll); const inPlan = cmds(plan);
|
|
373
427
|
const onlyAdr = [...inAdr].filter((c) => !inPlan.has(c));
|
|
374
428
|
const onlyPlan = [...inPlan].filter((c) => !inAdr.has(c));
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
|
|
39
39
|
### 🔵 Режим DEEP
|
|
40
40
|
|
|
41
|
-
> ⚙️ **Перед началом:** `view(/
|
|
41
|
+
> ⚙️ **Перед началом:** `view(.claude/skills/goap-research-ed25519/SKILL.md)`
|
|
42
42
|
> Примени GOAP-методологию вместо статического списка.
|
|
43
43
|
|
|
44
44
|
**Phase 1 — State Assessment:**
|
|
@@ -110,7 +110,7 @@ confidence = base_reliability × recency_factor
|
|
|
110
110
|
### 🟣 Режим VERIFIED (Ed25519)
|
|
111
111
|
|
|
112
112
|
> ⚙️ **Перед началом:**
|
|
113
|
-
> 1. `view(/
|
|
113
|
+
> 1. `view(.claude/skills/goap-research-ed25519/SKILL.md)`
|
|
114
114
|
> 2. Установи зависимости:
|
|
115
115
|
> ```bash
|
|
116
116
|
> python3 -m venv .venv
|
|
@@ -120,8 +120,8 @@ confidence = base_reliability × recency_factor
|
|
|
120
120
|
> 3. Запусти инициализацию:
|
|
121
121
|
> ```python
|
|
122
122
|
> # Скопируй и запусти скрипт из:
|
|
123
|
-
> # /
|
|
124
|
-
> # /
|
|
123
|
+
> # .claude/skills/goap-research-ed25519/scripts/ed25519_verifier.py
|
|
124
|
+
> # .claude/skills/goap-research-ed25519/scripts/goap_planner.py
|
|
125
125
|
> ```
|
|
126
126
|
|
|
127
127
|
**Всё из режима DEEP, плюс:**
|
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
|