@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
|
@@ -32,7 +32,9 @@ absent or its prerequisites are unmet, skip the UI-clone step and log a warning.
|
|
|
32
32
|
When executing skills during the pipeline:
|
|
33
33
|
|
|
34
34
|
1. Read the skill's `SKILL.md` file from `.claude/skills/[name]/SKILL.md`
|
|
35
|
-
2. When a skill references `/mnt/skills/user/[name]/` — read from `.claude/skills/[name]/` instead
|
|
35
|
+
2. When a skill references `/mnt/skills/user/[name]/` — read from `.claude/skills/[name]/` instead.
|
|
36
|
+
*(The ten PRE-SHIPPED skills no longer contain such paths — since 1.8.0 they are pre-baked. This
|
|
37
|
+
rule is for skills you bring yourself.)*
|
|
36
38
|
3. When a skill references `/mnt/user-data/uploads/` — read from `docs/` instead
|
|
37
39
|
4. When a skill outputs to `/output/` — write to `docs/` or project root instead
|
|
38
40
|
5. `goap-research` skill name maps to `goap-research-ed25519` in this repo
|
|
@@ -58,6 +60,7 @@ All generated files go directly into the project. Never create a separate output
|
|
|
58
60
|
|
|
59
61
|
| Category | Path |
|
|
60
62
|
|----------|------|
|
|
63
|
+
| Product Discovery Brief (Phase 0) | `docs/product-discovery-brief.md` |
|
|
61
64
|
| SPARC documentation | `docs/` |
|
|
62
65
|
| Validation report | `docs/validation-report.md` |
|
|
63
66
|
| BDD scenarios | `docs/test-scenarios.md` |
|
|
@@ -121,6 +124,9 @@ Always pass these constraints to sparc-prd-mini (Phase 1):
|
|
|
121
124
|
- Infrastructure: VPS (AdminVPS/HOSTKEY)
|
|
122
125
|
- Deploy: Docker Compose direct deploy
|
|
123
126
|
- AI Integration: MCP servers
|
|
127
|
+
- Storage: у баз и очередей НЕТ публикации на хост — кроме привязки к петле (`127.0.0.1` / `::1`).
|
|
128
|
+
Ни `0.0.0.0`, ни `[::]`, ни один явный внешний адрес, ни `network_mode: host`
|
|
129
|
+
(см. `.claude/rules/docker-ports.md`, «Правило №0»)
|
|
124
130
|
|
|
125
131
|
## Git Discipline During Pipeline
|
|
126
132
|
|
|
@@ -148,12 +154,19 @@ are project-agnostic and can be enhanced (read by Phase 3) but never recreated.
|
|
|
148
154
|
**Agents (4):** `replicate-coordinator`, `product-discoverer`, `doc-validator`,
|
|
149
155
|
`harvest-coordinator`
|
|
150
156
|
|
|
151
|
-
**Rules (
|
|
152
|
-
`insights-capture`, `feature-lifecycle`
|
|
157
|
+
**Rules (6):** `replicate-pipeline`, `skill-interface-protocol`, `git-workflow`,
|
|
158
|
+
`insights-capture`, `feature-lifecycle`, `docker-ports`
|
|
153
159
|
|
|
154
|
-
**Hooks
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
**Hooks (8 files in `.claude/hooks/`, cross-platform Node).** Only four are wired to an
|
|
161
|
+
event in `.claude/settings.json`; the rest are utilities you invoke deliberately, and the
|
|
162
|
+
difference matters — a hook of this package is NON-BLOCKING by contract and can only print.
|
|
163
|
+
|
|
164
|
+
*Wired to an event:* `session-insights.cjs` (SessionStart) · `autocommit-roadmap.cjs`,
|
|
165
|
+
`autocommit-insights.cjs`, `autocommit-plans.cjs` (Stop)
|
|
166
|
+
|
|
167
|
+
*Invoked deliberately, wired to nothing:* `statusline.cjs` (a statusLine, not a hook) ·
|
|
168
|
+
`state-update.cjs` (argv utility) · `check-ports.cjs` (docker-ports Правило №0, exits 0/1/2) ·
|
|
169
|
+
`check-growth-trace.cjs` (did the M5 growth seed reach `docs/Specification.md`, exits 0/1/2)
|
|
157
170
|
|
|
158
171
|
### Generated by /replicate Phase 3 (project-specific — create new)
|
|
159
172
|
|
|
@@ -39,6 +39,15 @@ view() .claude/skills/[skill-name]/references/[file].md
|
|
|
39
39
|
|
|
40
40
|
Skills originating from claude.ai use `/mnt/` paths. Apply these rewrites in order:
|
|
41
41
|
|
|
42
|
+
> **The ten skills this package ships no longer need this.** Since p-replicator 1.8.0 their paths are
|
|
43
|
+
> pre-baked: `.claude/skills/<name>/` resolves directly, with no rewrite step. The table below stays
|
|
44
|
+
> because a skill YOU bring from claude.ai still needs it — and because the toolkit generator's own
|
|
45
|
+
> output-scanning instructions describe this transform.
|
|
46
|
+
>
|
|
47
|
+
> One case the table cannot express: a skill referenced but NOT installed. Rewriting its path yields
|
|
48
|
+
> a local-looking path that resolves to nothing, which is worse than an obviously foreign one. Declare
|
|
49
|
+
> it OPTIONAL with a fallback (§6) instead.
|
|
50
|
+
|
|
42
51
|
| Source Pattern | Target Pattern | Notes |
|
|
43
52
|
|----------------|----------------|-------|
|
|
44
53
|
| `/mnt/skills/user/[name]/` | `.claude/skills/[name]/` | Skill root directories |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"_comment": "Default hooks + statusline shipped by @dzhechkov/p-replicator init. Cross-platform Node scripts (no bash dependencies). Auto-commits roadmap/insights/plans on Stop, injects relevant insights on SessionStart. Statusline displays pipeline+roadmap+toolkit dashboard above the prompt. Project-specific hooks (DDD, fitness functions, etc.) are merged in by /replicate Phase 3.",
|
|
4
4
|
"statusLine": {
|
|
5
5
|
"type": "command",
|
|
6
|
-
"command": "node
|
|
6
|
+
"command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/statusline.cjs\""
|
|
7
7
|
},
|
|
8
8
|
"hooks": {
|
|
9
9
|
"SessionStart": [
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"hooks": [
|
|
13
13
|
{
|
|
14
14
|
"type": "command",
|
|
15
|
-
"command": "node
|
|
15
|
+
"command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/session-insights.cjs\"",
|
|
16
16
|
"timeout": 5
|
|
17
17
|
}
|
|
18
18
|
]
|
|
@@ -24,17 +24,17 @@
|
|
|
24
24
|
"hooks": [
|
|
25
25
|
{
|
|
26
26
|
"type": "command",
|
|
27
|
-
"command": "node
|
|
27
|
+
"command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/autocommit-roadmap.cjs\"",
|
|
28
28
|
"timeout": 10
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"type": "command",
|
|
32
|
-
"command": "node
|
|
32
|
+
"command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/autocommit-insights.cjs\"",
|
|
33
33
|
"timeout": 10
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"type": "command",
|
|
37
|
-
"command": "node
|
|
37
|
+
"command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/autocommit-plans.cjs\"",
|
|
38
38
|
"timeout": 10
|
|
39
39
|
}
|
|
40
40
|
]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Module: Detect & Parse
|
|
2
2
|
|
|
3
3
|
Phase 1 of the CC-Toolkit-Generator Enhanced pipeline.
|
|
4
|
-
Scans the
|
|
4
|
+
Scans the PROJECT ROOT (see `docs_path` below — it is the root, not `docs/`), detects the pipeline type, identifies project
|
|
5
5
|
characteristics, and builds the Internal Project Model (IPM) used by all
|
|
6
6
|
subsequent modules.
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ subsequent modules.
|
|
|
11
11
|
|
|
12
12
|
| Parameter | Type | Description |
|
|
13
13
|
|-----------|------|-------------|
|
|
14
|
-
| `docs_path` | string |
|
|
14
|
+
| `docs_path` | string | The directory every probe below resolves from. In Claude.ai context: `/mnt/user-data/uploads/`. In Claude Code / replicate context: **the PROJECT ROOT** — not `docs/`. It has to be the root, because the probes reach both `.ai-context/` (a root-level directory, beside `.claude/`) and `docs/…` below it; anchoring at `docs/` would force `../` on half of them. |
|
|
15
15
|
|
|
16
16
|
No prior module output is required. This is the foundation module.
|
|
17
17
|
|
|
@@ -25,7 +25,7 @@ Scan `docs_path` recursively and catalog every file by category.
|
|
|
25
25
|
|
|
26
26
|
```
|
|
27
27
|
SCAN docs_path FOR:
|
|
28
|
-
# SPARC pipeline files (
|
|
28
|
+
# SPARC pipeline files — under docs/ (replicate.md:233-243 writes them all there)
|
|
29
29
|
PRD.md
|
|
30
30
|
Solution_Strategy.md
|
|
31
31
|
Specification.md
|
|
@@ -41,7 +41,8 @@ SCAN docs_path FOR:
|
|
|
41
41
|
docs/prd/PRD.md
|
|
42
42
|
docs/ddd/strategic/ # bounded-contexts.md, context-map.md
|
|
43
43
|
docs/ddd/tactical/ # aggregates/, entities/, value-objects/, events/, repositories/
|
|
44
|
-
docs/adr/*.md # ADR-001-*.md, ADR-002-*.md, ...
|
|
44
|
+
docs/adr/*.md # ADR-001-*.md, ADR-002-*.md, ... (directory shape)
|
|
45
|
+
docs/ADR.md # single-file shape — /replicate writes ALL decisions here
|
|
45
46
|
docs/c4/*.mermaid # context.mermaid, container.mermaid, component.mermaid
|
|
46
47
|
docs/pseudocode/*.pseudo
|
|
47
48
|
docs/tests/*.feature # Gherkin scenarios
|
|
@@ -72,13 +73,18 @@ def detect_pipeline(docs_path: str) -> str:
|
|
|
72
73
|
has_ddd = exists(f"{docs_path}/docs/ddd/")
|
|
73
74
|
has_ai_context = exists(f"{docs_path}/.ai-context/")
|
|
74
75
|
has_gherkin = glob(f"{docs_path}/docs/tests/*.feature")
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
# Pipeline-IDENTITY marker: the docs/adr/ DIRECTORY is an idea2prd fingerprint. The
|
|
77
|
+
# expression is deliberately unchanged (>5) so routing stays byte-identical for every
|
|
78
|
+
# existing project. The DECISION-presence flag `has_adr` (see Collector below) never
|
|
79
|
+
# participates in routing: it can now be true via docs/ADR.md — a /replicate fingerprint,
|
|
80
|
+
# not an idea2prd one — and flipping routing on it would silently reroute SPARC projects.
|
|
81
|
+
has_idea2prd_adr_dir = len(glob(f"{docs_path}/docs/adr/*.md")) > 5
|
|
82
|
+
has_sparc_arch = exists(f"{docs_path}/docs/Architecture.md") # replicate.md:237 writes it here
|
|
83
|
+
has_sparc_sol = exists(f"{docs_path}/docs/Solution_Strategy.md") # replicate.md:234 writes it here
|
|
78
84
|
|
|
79
85
|
if has_ddd and has_ai_context:
|
|
80
86
|
return "IDEA2PRD_FULL" # Complete idea2prd-manual output
|
|
81
|
-
elif has_ddd or
|
|
87
|
+
elif has_ddd or has_idea2prd_adr_dir:
|
|
82
88
|
return "IDEA2PRD_PARTIAL" # Partial idea2prd output
|
|
83
89
|
elif has_sparc_arch and has_sparc_sol:
|
|
84
90
|
return "SPARC" # Full SPARC documentation set
|
|
@@ -88,12 +94,49 @@ def detect_pipeline(docs_path: str) -> str:
|
|
|
88
94
|
return "MINIMAL" # Basic PRD only, or mixed
|
|
89
95
|
```
|
|
90
96
|
|
|
97
|
+
### ADR collector — ONE normalizer for both storage shapes
|
|
98
|
+
|
|
99
|
+
ADRs arrive in two shapes: a `docs/adr/*.md` directory (idea2prd-manual, one decision per file) and
|
|
100
|
+
a single `docs/ADR.md` (what `/replicate` writes). ONE collector handles both; no other step in this
|
|
101
|
+
skill may glob ADR paths for itself — every consumer iterates `detected_docs.idea2prd.adrs`.
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
def collect_adrs(docs_path: str) -> list:
|
|
105
|
+
entries = []
|
|
106
|
+
for f in glob(f"{docs_path}/docs/adr/*.md"): # shape A: one decision per file
|
|
107
|
+
entries.append({ "id": id_from_filename(f), # ADR-001-title.md -> "ADR-001"
|
|
108
|
+
"title": first_heading(f),
|
|
109
|
+
"source_path": f })
|
|
110
|
+
single = f"{docs_path}/docs/ADR.md" # shape B: /replicate's single file
|
|
111
|
+
if exists(single):
|
|
112
|
+
for section in split_on_h2_headings(read(single)): # each "## ..." heading opens one decision
|
|
113
|
+
entries.append({ "id": id_from_heading(section), # "## ADR-003: X" -> "ADR-003"; else slug of title
|
|
114
|
+
"title": heading_title(section),
|
|
115
|
+
"source_path": single })
|
|
116
|
+
# STABLE-FIRST dedupe: keep the FIRST entry for a given id (falling back to title when an id is
|
|
117
|
+
# absent), and directory entries are appended first — so "directory wins" is a property of the
|
|
118
|
+
# ORDER above, not an unstated convention inside the helper.
|
|
119
|
+
return dedupe_stable_first_by_id_then_title(entries) # both shapes present -> merged, no double-count
|
|
120
|
+
|
|
121
|
+
has_adr = len(collect_adrs(docs_path)) > 0 # THE one definition — decisions, not files
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Worked examples (the behavioural contract, verbatim acid ids):
|
|
125
|
+
|
|
126
|
+
- **A1** — `docs/ADR.md` with two `##` sections ⇒ 2 entries, `has_adr: true`. The single-file shape
|
|
127
|
+
is a first-class citizen, not a fallback.
|
|
128
|
+
- **A4** — `docs/ADR.md` exists but holds prose with NO `##` headings ⇒ 0 entries,
|
|
129
|
+
`has_adr: false`. A file is not a decision; presence of the path never flips the flag by itself.
|
|
130
|
+
- **A5** — BOTH shapes present and `docs/adr/ADR-002-caching.md` duplicates the id of a `## ADR-002`
|
|
131
|
+
section ⇒ one merged list, the duplicate dropped (directory entry wins — it is the finer-grained
|
|
132
|
+
source).
|
|
133
|
+
|
|
91
134
|
| Pipeline | Minimum Docs | Typical File Count |
|
|
92
135
|
|----------|-------------|-------------------|
|
|
93
136
|
| IDEA2PRD_FULL | `docs/ddd/` + `.ai-context/` | 30-50 files |
|
|
94
137
|
| IDEA2PRD_PARTIAL | `docs/ddd/` or `docs/adr/` (>5) | 15-30 files |
|
|
95
|
-
| SPARC | `Architecture.md` + `Solution_Strategy.md` | 8-11 files |
|
|
96
|
-
| SPARC_MINIMAL | `Architecture.md` only | 2-5 files |
|
|
138
|
+
| SPARC | `docs/Architecture.md` + `docs/Solution_Strategy.md` | 8-11 files |
|
|
139
|
+
| SPARC_MINIMAL | `docs/Architecture.md` only | 2-5 files |
|
|
97
140
|
| MINIMAL | PRD.md only | 1-3 files |
|
|
98
141
|
|
|
99
142
|
### Step 3: Detect Project Characteristics
|
|
@@ -116,7 +159,7 @@ IF any keyword found → has_external_apis = true
|
|
|
116
159
|
#### 3b. `has_database`
|
|
117
160
|
|
|
118
161
|
```
|
|
119
|
-
SCAN Architecture.md, Specification.md, docker-compose.yml,
|
|
162
|
+
SCAN docs/Architecture.md, docs/Specification.md, docker-compose.yml (project root),
|
|
120
163
|
ADR-*-data.md, repositories/*.md FOR:
|
|
121
164
|
keywords: "PostgreSQL", "Postgres", "MongoDB", "MySQL", "Redis",
|
|
122
165
|
"database", "Prisma", "TypeORM", "Drizzle", "Knex",
|
|
@@ -185,7 +228,7 @@ IPM = {
|
|
|
185
228
|
events: [paths] | [],
|
|
186
229
|
repositories: [paths] | []
|
|
187
230
|
},
|
|
188
|
-
adrs: [
|
|
231
|
+
adrs: [{id, title, source_path}] | [], // collect_adrs() output — entries, not bare paths
|
|
189
232
|
c4_diagrams: [paths] | [],
|
|
190
233
|
pseudocode: [paths] | [],
|
|
191
234
|
gherkin_tests: [paths] | [],
|
|
@@ -217,7 +260,7 @@ IPM = {
|
|
|
217
260
|
has_ddd_strategic: bool, // same as has_ddd (alias for readability)
|
|
218
261
|
has_gherkin: bool, // detected_docs.idea2prd.gherkin_tests non-empty
|
|
219
262
|
has_fitness: bool, // detected_docs.idea2prd.fitness non-empty
|
|
220
|
-
has_adr: bool, //
|
|
263
|
+
has_adr: bool, // collect_adrs() output non-empty — the ONE definition (see ADR collector)
|
|
221
264
|
has_c4: bool, // detected_docs.idea2prd.c4 non-empty
|
|
222
265
|
has_ai_context: bool, // detected_docs.ai_context.readme non-null
|
|
223
266
|
has_pseudocode: bool, // detected_docs.sparc.pseudocode OR idea2prd.pseudocode non-null
|
|
@@ -291,7 +334,7 @@ All of the following must be satisfied before the IPM is considered valid:
|
|
|
291
334
|
|
|
292
335
|
| Check | Condition | Action on Failure |
|
|
293
336
|
|-------|-----------|-------------------|
|
|
294
|
-
| Minimum docs | SPARC: at least `PRD.md` + `Architecture.md` present | Halt. Ask user to upload missing docs. |
|
|
337
|
+
| Minimum docs | SPARC: at least `docs/PRD.md` + `docs/Architecture.md` present | Halt. Ask user to upload missing docs. |
|
|
295
338
|
| Minimum docs | idea2prd: at least `docs/ddd/` directory present | Halt. Ask user to upload missing docs. |
|
|
296
339
|
| Pipeline resolved | `pipeline_type` is not ambiguous | If mixed signals, default to "SPARC" with unified mapping. |
|
|
297
340
|
| Characteristics scanned | All 4 characteristic flags have been evaluated | Re-scan if any flag is missing. |
|
|
@@ -128,7 +128,9 @@ DDD TACTICAL:
|
|
|
128
128
|
- Event handlers → PostToolUse hooks (P2)
|
|
129
129
|
|
|
130
130
|
ADR DOCUMENTS:
|
|
131
|
-
|
|
131
|
+
# via detected_docs.idea2prd.adrs — the Module-1 collector output, BOTH storage
|
|
132
|
+
# shapes (docs/adr/*.md AND the single docs/ADR.md). Never glob ADR paths here.
|
|
133
|
+
FOR EACH entry IN detected_docs.idea2prd.adrs (read entry.source_path):
|
|
132
134
|
CLASSIFY by keywords:
|
|
133
135
|
"security", "auth", "encryption" → security.md rule
|
|
134
136
|
"performance", "scale", "cache" → performance rules
|
|
@@ -217,8 +219,8 @@ aggregates/ has >3 files → ddd-validator.md (+8), +5 if >7 files
|
|
|
217
219
|
aggregates/ has >5 files → aggregate-patterns/ (+5)
|
|
218
220
|
events/ has >3 files → event-handlers/ (+5)
|
|
219
221
|
events/ has >0 files → event-handlers/ (+10)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
+
adrs has >10 decisions → architect.md (+10) # detected_docs.idea2prd.adrs — decisions, not files
|
|
223
|
+
adrs has >15 decisions → architect.md (+5 additional)
|
|
222
224
|
docs/tests/*.feature exists → testing-patterns/ (+10), tdd-guide.md (+8)
|
|
223
225
|
tests/ has >10 scenarios → testing-patterns/ (+5)
|
|
224
226
|
docs/fitness/ exists → fitness-functions.md (+10)
|
|
@@ -226,10 +228,10 @@ fitness has >5 functions → validation hooks (+5)
|
|
|
226
228
|
.ai-context/ exists → INTEGRATE into CLAUDE.md, project-context/ (+10)
|
|
227
229
|
.ai-context/ has >4 files → project-context/ RECOMMEND
|
|
228
230
|
|
|
229
|
-
# ADR Security Boost
|
|
230
|
-
FOR EACH adr
|
|
231
|
-
FOR EACH adr
|
|
232
|
-
FOR EACH adr
|
|
231
|
+
# ADR Security Boost (over detected_docs.idea2prd.adrs — read each entry.source_path)
|
|
232
|
+
FOR EACH adr entry containing "security": security.md += 2
|
|
233
|
+
FOR EACH adr entry containing "authentication": security.md += 1
|
|
234
|
+
FOR EACH adr entry containing "encryption": security.md += 1
|
|
233
235
|
```
|
|
234
236
|
|
|
235
237
|
#### 4c. Assign Priority Tiers
|
|
@@ -422,7 +422,7 @@ Copy these 6 skills from the user's skill set into `.claude/skills/`:
|
|
|
422
422
|
|---|-------|-------------|-------------|
|
|
423
423
|
| 11 | sparc-prd-mini | `/mnt/skills/user/sparc-prd-mini/` | `.claude/skills/sparc-prd-mini/` |
|
|
424
424
|
| 12 | explore | `/mnt/skills/user/explore/` | `.claude/skills/explore/` |
|
|
425
|
-
| 13 | goap-research | `/mnt/skills/user/goap-research/` | `.claude/skills/goap-research/` |
|
|
425
|
+
| 13 | goap-research | `/mnt/skills/user/goap-research/` | `.claude/skills/goap-research-ed25519/` |
|
|
426
426
|
| 14 | problem-solver-enhanced | `/mnt/skills/user/problem-solver-enhanced/` | `.claude/skills/problem-solver-enhanced/` |
|
|
427
427
|
| 15 | requirements-validator | `/mnt/skills/user/requirements-validator/` | `.claude/skills/requirements-validator/` |
|
|
428
428
|
| 16 | brutal-honesty-review | `/mnt/skills/user/brutal-honesty-review/` | `.claude/skills/brutal-honesty-review/` |
|
|
@@ -438,7 +438,7 @@ After copying, rewrite ALL `view()` paths in `sparc-prd-mini/SKILL.md`:
|
|
|
438
438
|
External skill paths (3 rewrites):
|
|
439
439
|
```
|
|
440
440
|
/mnt/skills/user/explore/SKILL.md -> .claude/skills/explore/SKILL.md
|
|
441
|
-
/mnt/skills/user/goap-research/SKILL.md -> .claude/skills/goap-research/SKILL.md
|
|
441
|
+
/mnt/skills/user/goap-research/SKILL.md -> .claude/skills/goap-research-ed25519/SKILL.md
|
|
442
442
|
/mnt/skills/user/problem-solver-enhanced/SKILL.md -> .claude/skills/problem-solver-enhanced/SKILL.md
|
|
443
443
|
```
|
|
444
444
|
|
|
@@ -458,10 +458,12 @@ Lines 951-953: Dependency Version Note -- update paths to .claude/skills/
|
|
|
458
458
|
|
|
459
459
|
**Note on `goap-research` name mapping:** The skill name `goap-research` in the
|
|
460
460
|
lifecycle context maps to `goap-research-ed25519` in this repository. Ensure the
|
|
461
|
-
correct directory name is used when copying
|
|
461
|
+
correct directory name is used when copying — the **Output paths** below therefore name
|
|
462
|
+
`goap-research-ed25519`, not `goap-research`. Until 2026-08-27 they named the short form, which is
|
|
463
|
+
the alias and never a real directory: the list contradicted the note directly above it.
|
|
462
464
|
|
|
463
465
|
**Output paths:** `.claude/skills/sparc-prd-mini/`, `.claude/skills/explore/`,
|
|
464
|
-
`.claude/skills/goap-research/`, `.claude/skills/problem-solver-enhanced/`,
|
|
466
|
+
`.claude/skills/goap-research-ed25519/`, `.claude/skills/problem-solver-enhanced/`,
|
|
465
467
|
`.claude/skills/requirements-validator/`, `.claude/skills/brutal-honesty-review/`
|
|
466
468
|
|
|
467
469
|
---
|
package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/08-skill-composition.md
CHANGED
|
@@ -201,8 +201,8 @@ FOR each copied_file IN target_skill_directory:
|
|
|
201
201
|
|
|
202
202
|
```
|
|
203
203
|
# Before (claude.ai format):
|
|
204
|
-
Read
|
|
205
|
-
Scan
|
|
204
|
+
Read `.claude/skills/explore/SKILL.md` for clarification protocol.
|
|
205
|
+
Scan `docs/` for documents.
|
|
206
206
|
Write output to `/output/validation-report.md`.
|
|
207
207
|
|
|
208
208
|
# After (Claude Code local format):
|
|
@@ -13,7 +13,9 @@ def detect_pipeline(uploads_path: str) -> str:
|
|
|
13
13
|
has_ddd = exists(f"{uploads_path}/docs/ddd/")
|
|
14
14
|
has_ai_context = exists(f"{uploads_path}/.ai-context/")
|
|
15
15
|
has_gherkin = glob(f"{uploads_path}/docs/tests/*.feature")
|
|
16
|
-
|
|
16
|
+
# Shape marker only (mirrors Module 1 detect_pipeline). The DECISION flag has_adr is
|
|
17
|
+
# defined ONCE, in Module 1 ADR collector — never redefined here.
|
|
18
|
+
has_idea2prd_adr_dir = len(glob(f"{uploads_path}/docs/adr/*.md")) > 5
|
|
17
19
|
has_sparc = exists(f"{uploads_path}/Architecture.md")
|
|
18
20
|
|
|
19
21
|
if has_ddd and has_ai_context:
|
|
@@ -124,7 +126,7 @@ if len(events) > 5:
|
|
|
124
126
|
```python
|
|
125
127
|
score = 10 # base (always somewhat useful)
|
|
126
128
|
|
|
127
|
-
adrs =
|
|
129
|
+
adrs = detected_docs.idea2prd.adrs # Module-1 collector: both storage shapes
|
|
128
130
|
if len(adrs) > 5:
|
|
129
131
|
score += 5
|
|
130
132
|
if len(adrs) > 10:
|
|
@@ -145,8 +147,8 @@ if exists("docs/c4/container.mermaid"):
|
|
|
145
147
|
```python
|
|
146
148
|
security_boost = 0
|
|
147
149
|
|
|
148
|
-
for adr in
|
|
149
|
-
content = read(adr)
|
|
150
|
+
for adr in detected_docs.idea2prd.adrs: # both storage shapes
|
|
151
|
+
content = read(adr.source_path)
|
|
150
152
|
if "security" in content.lower():
|
|
151
153
|
security_boost += 2
|
|
152
154
|
if "authentication" in content.lower():
|
package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/extended-mapping.md
CHANGED
|
@@ -211,7 +211,7 @@ EXTRACT events/*.md:
|
|
|
211
211
|
### From ADRs
|
|
212
212
|
|
|
213
213
|
```
|
|
214
|
-
FOR EACH
|
|
214
|
+
FOR EACH entry IN detected_docs.idea2prd.adrs (read entry.source_path):
|
|
215
215
|
EXTRACT:
|
|
216
216
|
- Title → Rule/skill name candidate
|
|
217
217
|
- Status → (if Accepted) include, (if Deprecated) exclude
|
|
@@ -348,7 +348,7 @@ IF fitness has architecture rules: +5 to ddd-validator
|
|
|
348
348
|
### From ADR Integration Decisions
|
|
349
349
|
|
|
350
350
|
```
|
|
351
|
-
SCAN
|
|
351
|
+
SCAN detected_docs.idea2prd.adrs (each entry.source_path) for:
|
|
352
352
|
- "GitHub" → @modelcontextprotocol/server-github
|
|
353
353
|
- "PostgreSQL", "Postgres" → @modelcontextprotocol/server-postgres
|
|
354
354
|
- "MongoDB" → @modelcontextprotocol/server-mongodb
|
package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-agents.md
CHANGED
|
@@ -425,7 +425,7 @@ APPROVE / REQUEST_CHANGES / COMMENT
|
|
|
425
425
|
- Context diagram summary
|
|
426
426
|
- Container descriptions
|
|
427
427
|
|
|
428
|
-
2. Extract from `docs/adr
|
|
428
|
+
2. Extract from `detected_docs.idea2prd.adrs` (docs/adr/*.md or the single docs/ADR.md):
|
|
429
429
|
- Top 5-10 most important ADRs
|
|
430
430
|
- Architecture-related decisions
|
|
431
431
|
|
|
@@ -448,7 +448,7 @@ APPROVE / REQUEST_CHANGES / COMMENT
|
|
|
448
448
|
1. Extract from `docs/fitness/`:
|
|
449
449
|
- All fitness functions as checklist
|
|
450
450
|
|
|
451
|
-
2. Extract from `docs/adr
|
|
451
|
+
2. Extract from `detected_docs.idea2prd.adrs` (docs/adr/*.md or the single docs/ADR.md):
|
|
452
452
|
- Key decisions affecting code
|
|
453
453
|
|
|
454
454
|
3. Extract from `docs/ddd/tactical/`:
|
package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-skills.md
CHANGED
|
@@ -345,6 +345,6 @@ src/
|
|
|
345
345
|
1. From `.ai-context/coding-standards.md`:
|
|
346
346
|
- Direct integration
|
|
347
347
|
|
|
348
|
-
2. From `docs/adr
|
|
348
|
+
2. From `detected_docs.idea2prd.adrs` (docs/adr/*.md or the single docs/ADR.md):
|
|
349
349
|
- Extract coding-related decisions
|
|
350
350
|
- Extract rejected alternatives as anti-patterns
|
|
@@ -188,9 +188,9 @@ If specific .ai-context file missing, extract from:
|
|
|
188
188
|
|---------|----------------|------------------|
|
|
189
189
|
| Overview | docs/prd/PRD.md | Research_Findings.md |
|
|
190
190
|
| Architecture | docs/c4/*.mermaid | Architecture.md |
|
|
191
|
-
| Key Decisions | docs/adr/*.md | Solution_Strategy.md |
|
|
191
|
+
| Key Decisions | detected_docs.idea2prd.adrs (docs/adr/*.md or docs/ADR.md) | Solution_Strategy.md |
|
|
192
192
|
| Domain Model | docs/ddd/strategic/ | Specification.md |
|
|
193
|
-
| Tech Stack |
|
|
193
|
+
| Tech Stack | adrs entries titled *technology* | Architecture.md |
|
|
194
194
|
| Testing | docs/tests/*.feature | Refinement.md |
|
|
195
195
|
| Deployment | docs/completion/ | Completion.md |
|
|
196
196
|
|
|
@@ -12,7 +12,7 @@ When generating the toolkit, **copy these skills from the user's skill set** int
|
|
|
12
12
|
# Source paths (Claude.ai user skills)
|
|
13
13
|
/mnt/skills/user/sparc-prd-mini/ → .claude/skills/sparc-prd-mini/
|
|
14
14
|
/mnt/skills/user/explore/ → .claude/skills/explore/
|
|
15
|
-
/mnt/skills/user/goap-research/ → .claude/skills/goap-research/
|
|
15
|
+
/mnt/skills/user/goap-research/ → .claude/skills/goap-research-ed25519/
|
|
16
16
|
/mnt/skills/user/problem-solver-enhanced/ → .claude/skills/problem-solver-enhanced/
|
|
17
17
|
/mnt/skills/user/requirements-validator/ → .claude/skills/requirements-validator/
|
|
18
18
|
/mnt/skills/user/brutal-honesty-review/ → .claude/skills/brutal-honesty-review/
|
|
@@ -26,7 +26,7 @@ After copying, rewrite ALL `view()` paths in `sparc-prd-mini/SKILL.md`:
|
|
|
26
26
|
External skill paths (3):
|
|
27
27
|
```
|
|
28
28
|
/mnt/skills/user/explore/SKILL.md → .claude/skills/explore/SKILL.md
|
|
29
|
-
/mnt/skills/user/goap-research/SKILL.md → .claude/skills/goap-research/SKILL.md
|
|
29
|
+
/mnt/skills/user/goap-research/SKILL.md → .claude/skills/goap-research-ed25519/SKILL.md
|
|
30
30
|
/mnt/skills/user/problem-solver-enhanced/SKILL.md → .claude/skills/problem-solver-enhanced/SKILL.md
|
|
31
31
|
```
|
|
32
32
|
|
|
@@ -4,13 +4,21 @@ Templates for generating a feature navigation and contextual suggestion system.
|
|
|
4
4
|
Combines CLAUDE.md roadmap, SessionStart hook for dynamic context, `/next` command,
|
|
5
5
|
and `feature-navigator` skill for on-demand roadmap navigation.
|
|
6
6
|
|
|
7
|
-
Architecture: **feature-roadmap.json** as single
|
|
7
|
+
Architecture: **feature-roadmap.json** as the system's single data file → consumed by hook, skill,
|
|
8
|
+
and command. (The SCHEMA of that file is defined once, in `.claude/commands/next.md`; this document
|
|
9
|
+
describes the system built on it, not the file's fields.)
|
|
8
10
|
|
|
9
11
|
---
|
|
10
12
|
|
|
11
13
|
## 1. Data File Template: `feature-roadmap.json`
|
|
12
14
|
|
|
13
|
-
Generate as `.claude/feature-roadmap.json` — pre-populate from project's PRD/Specification
|
|
15
|
+
Generate as `.claude/feature-roadmap.json` — pre-populate from project's PRD/Specification.
|
|
16
|
+
|
|
17
|
+
**Fields: follow `.claude/commands/next.md`, which holds the single schema.** In particular every
|
|
18
|
+
feature carries `priority` from the closed set `mvp | high | medium | low`; a roadmap without it
|
|
19
|
+
cannot be read by the shipped status line. The sketch below shows only the ENVELOPE and this system's
|
|
20
|
+
OPTIONAL extensions — `project`, `current_sprint`, `description`, `sprint`, `files` — which the
|
|
21
|
+
canonical schema does not forbid:
|
|
14
22
|
|
|
15
23
|
```json
|
|
16
24
|
{
|
|
@@ -21,6 +29,7 @@ Generate as `.claude/feature-roadmap.json` — pre-populate from project's PRD/S
|
|
|
21
29
|
"id": "{{feature-id}}",
|
|
22
30
|
"name": "{{Feature Name}}",
|
|
23
31
|
"description": "{{Brief description of the feature}}",
|
|
32
|
+
"priority": "mvp|high|medium|low",
|
|
24
33
|
"status": "done|in_progress|next|planned|blocked",
|
|
25
34
|
"files": ["src/path/to/main-file.ts"],
|
|
26
35
|
"depends_on": ["{{other-feature-id}}"],
|
package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/start-command.md
CHANGED
|
@@ -139,7 +139,7 @@ List ALL documentation files the /start should read.
|
|
|
139
139
|
```markdown
|
|
140
140
|
- `docs/ddd/strategic/` → bounded contexts, context map
|
|
141
141
|
- `docs/ddd/tactical/` → aggregates, entities, events
|
|
142
|
-
- `docs/adr
|
|
142
|
+
- `detected_docs.idea2prd.adrs` (docs/adr/ or docs/ADR.md) → technology decisions
|
|
143
143
|
- `docs/tests/*.feature` → Gherkin test scenarios
|
|
144
144
|
```
|
|
145
145
|
|
|
@@ -64,6 +64,13 @@ Always flag these terms and suggest specific replacements:
|
|
|
64
64
|
|
|
65
65
|
**Score <50 = BLOCKED from development.** Provide rewrite suggestions.
|
|
66
66
|
|
|
67
|
+
**Blocking floor — the weakest link decides, never the average.** Independently of the score, a
|
|
68
|
+
requirement is BLOCKED if `Testable = 0` (no acceptance criteria) or `Completeness = 0` (rubric "No
|
|
69
|
+
AC"). A story can total 72/100 with neither, and 72 reads as "minor fixes" in the table above. A non-zero `Testable` or `Completeness` REQUIRES quoting the acceptance criteria it scores — no quote
|
|
70
|
+
means 0, because the agent that scores is the agent the floor binds. The
|
|
71
|
+
floor is closed at those two: `Measurable` and `Traceability` are deliberately excluded — see
|
|
72
|
+
`references/scoring-system.md` → "Blocking floor" for the worked case and the reason.
|
|
73
|
+
|
|
67
74
|
## Output Format
|
|
68
75
|
|
|
69
76
|
### Requirements Analysis Report
|
|
@@ -127,6 +134,58 @@ apply additional security validation:
|
|
|
127
134
|
- Cross-tenant access attempt (if multi-tenant)
|
|
128
135
|
- Rate limiting / brute force scenario (if auth endpoint)
|
|
129
136
|
|
|
137
|
+
### Growth Traceability (scoring: +5 present / +0 not applicable / -10 applicable but absent)
|
|
138
|
+
|
|
139
|
+
Phase 0's M5 module analyses how a competitor grows and emits a `Growth Requirements Seed` table of
|
|
140
|
+
`FR-GROWTH-<nnn>` draft obligations into `docs/product-discovery-brief.md`. This criterion asks one
|
|
141
|
+
question: **did those obligations survive into `docs/Specification.md`, or were they analysed and
|
|
142
|
+
dropped?**
|
|
143
|
+
|
|
144
|
+
**APPLICABILITY — decide this FIRST, and it is not about project type.** The criterion applies when
|
|
145
|
+
**acquisition or adoption is in scope** — the same condition `/replicate` already gates M5 on
|
|
146
|
+
("If acquisition/adoption in scope (incl. B2B)"). Concretely:
|
|
147
|
+
|
|
148
|
+
| Situation | Applicable? | Score |
|
|
149
|
+
|---|:---:|---|
|
|
150
|
+
| `docs/product-discovery-brief.md` exists and its seed table has ≥1 `FR-GROWTH-nnn` row | YES | +5 traced · -10 not traced |
|
|
151
|
+
| The brief exists and its seed table says `нет` / is empty | no | +0 |
|
|
152
|
+
| No acquisition or adoption objective (internal tool, on-prem, replacement of an existing internal system) | no | +0 |
|
|
153
|
+
| `docs/product-discovery-brief.md` is ABSENT | no | +0 — see below |
|
|
154
|
+
|
|
155
|
+
**An absent brief is +0, never -10.** Absence means Phase 0 did not run (the `--from-docs` entry
|
|
156
|
+
skips it). Penalising a project for not running an optional phase would send every `--from-docs`
|
|
157
|
+
project into a permanent NEEDS WORK loop, which is the exact trap already closed for the Measurable
|
|
158
|
+
criterion. "Phase 0 did not run" is not "the growth requirements are missing".
|
|
159
|
+
|
|
160
|
+
**What TRACED means.** For each `FR-GROWTH-nnn` row in the brief, one of two things is true in
|
|
161
|
+
`docs/Specification.md`:
|
|
162
|
+
|
|
163
|
+
- the id `FR-GROWTH-nnn` appears (case-sensitive, the exact token — not a title, not a paraphrase), **or**
|
|
164
|
+
- the requirement was consciously rejected, and the rejection is written down with its reason.
|
|
165
|
+
|
|
166
|
+
A silently dropped row is the defect. A row rejected on the record is not.
|
|
167
|
+
|
|
168
|
+
| Check | Red Flags |
|
|
169
|
+
|-------|-----------|
|
|
170
|
+
| Every non-SPECULATIVE seed row is traced or rejected on the record | ids present in the brief, absent from the Specification, no rejection noted |
|
|
171
|
+
| Rejections carry a reason | "не берём" with no reason — indistinguishable from forgetting |
|
|
172
|
+
| `SPECULATIVE` rows were not promoted silently | a `[H]`-sourced row promoted to a firm requirement with no human decision recorded |
|
|
173
|
+
|
|
174
|
+
**Scoring Bonus:** +5 if every applicable seed row is traced or rejected on the record, +0 if not
|
|
175
|
+
applicable per the table above, -10 if the seed table carries rows and the Specification traces none
|
|
176
|
+
of them (BLOCKED if the score drops below 50).
|
|
177
|
+
|
|
178
|
+
**This criterion scores OUTSIDE the 100-point INVEST/SMART table**, exactly like Security. It adds no
|
|
179
|
+
weight to any existing criterion — the weight table and everything derived from it are unchanged.
|
|
180
|
+
|
|
181
|
+
**Honest limit.** This proves an obligation was CARRIED FORWARD, not that it was built, and not that
|
|
182
|
+
copying the competitor's growth move is lawful. Legality is not assessed anywhere in this pipeline.
|
|
183
|
+
|
|
184
|
+
**Deterministic counterpart.** `node .claude/hooks/check-growth-trace.cjs .` answers the same
|
|
185
|
+
question mechanically (0 traced · 1 rows present and none traced · 2 the check did not run). This
|
|
186
|
+
section is a prose gate read by a model; the utility is the deterministic one. Run it when the answer
|
|
187
|
+
has to be more than a judgement.
|
|
188
|
+
|
|
130
189
|
### BDD Scenario Generation
|
|
131
190
|
|
|
132
191
|
For each requirement, generate scenarios covering:
|
|
@@ -53,6 +53,34 @@ Total Score = INVEST Score (50%) + SMART Score (30%) + Quality Score (20%)
|
|
|
53
53
|
| 50-69 | Fair | 🔶 REWORK | Significant clarification needed |
|
|
54
54
|
| **0-49** | **Poor** | **🚫 BLOCKED** | **Requires complete rewrite** |
|
|
55
55
|
|
|
56
|
+
### Blocking floor (overrides the total, both directions)
|
|
57
|
+
|
|
58
|
+
**The weakest link decides, never the average.** A requirement is BLOCKED — whatever its total says —
|
|
59
|
+
if either of these is zero:
|
|
60
|
+
|
|
61
|
+
| Criterion | Zero means | Why it vetoes |
|
|
62
|
+
|-----------|-----------|---------------|
|
|
63
|
+
| `Testable` (INVEST, 8) | no acceptance criteria exist | the gate exists to block untestable requirements |
|
|
64
|
+
| `Completeness` (Quality, 10) | "No AC" on the rubric above | nothing states what "done" is |
|
|
65
|
+
|
|
66
|
+
Without this floor the total alone lets an untestable requirement through. Worked case: a story with
|
|
67
|
+
NO acceptance criteria and NO test links loses `Testable` 8, `Completeness` 10 and `Traceability` 10,
|
|
68
|
+
keeps everything else, and totals **72/100** — above the 70 line, filed as "fix minor issues, then
|
|
69
|
+
proceed". The floor blocks it on `Testable = 0` and `Completeness = 0`.
|
|
70
|
+
|
|
71
|
+
**The floor keys on the artifact, not on the number you wrote.** The same agent scores these
|
|
72
|
+
criteria AND is bound by the floor, so a score is not evidence of anything — reporting `Testable = 4`
|
|
73
|
+
("vague AC") on a story with no AC at all evades the veto without lying about the rubric. Therefore:
|
|
74
|
+
|
|
75
|
+
> A non-zero `Testable` or `Completeness` REQUIRES quoting the acceptance criteria being scored —
|
|
76
|
+
> the actual text, with its document and heading. `Testable = 4` means the AC exist and are vague:
|
|
77
|
+
> quote them. **No quote ⇒ the score is 0 ⇒ the floor applies.**
|
|
78
|
+
|
|
79
|
+
**The floor is CLOSED at these two.** `Measurable` and `Traceability` are deliberately NOT on it: a
|
|
80
|
+
requirement with no number is often correct ("the user can export the report as PDF" is specific,
|
|
81
|
+
testable and unmeasurable), so vetoing on `Measurable` would turn a false pass into a false block.
|
|
82
|
+
Widening this list needs the same kind of worked case as the one above.
|
|
83
|
+
|
|
56
84
|
## Quality Gate Rules
|
|
57
85
|
|
|
58
86
|
### BLOCKED (Score < 50)
|
|
@@ -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, плюс:**
|