bigpowers 2.28.0 → 2.30.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/.pi/package.json +1 -1
- package/.pi/prompts/migrate-spec.md +109 -6
- package/.pi/prompts/plan-release.md +5 -1
- package/.pi/prompts/session-state.md +2 -2
- package/.pi/skills/migrate-spec/SKILL.md +109 -6
- package/.pi/skills/plan-release/SKILL.md +5 -1
- package/.pi/skills/session-state/SKILL.md +2 -2
- package/CHANGELOG.md +14 -0
- package/CONVENTIONS.md +9 -4
- package/SKILL-INDEX.md +1 -1
- package/migrate-spec/REFERENCE-GSD.md +3 -3
- package/migrate-spec/REFERENCE.md +58 -2
- package/migrate-spec/SKILL.md +48 -1
- package/migrate-spec/templates/REQUIREMENTS_TRACE.yaml +28 -0
- package/package.json +1 -1
- package/plan-release/SKILL.md +5 -1
- package/scripts/sync-status-from-epics.sh +3 -0
- package/session-state/SKILL.md +2 -2
- package/skills-lock.json +3 -3
package/.pi/package.json
CHANGED
|
@@ -71,6 +71,53 @@ Apply the mapping from [REFERENCE.md](./REFERENCE.md) and [REFERENCE-GSD.md](./R
|
|
|
71
71
|
2. Ask: "Create this? [yes / edit / skip]"
|
|
72
72
|
3. On yes: write to `specs/`.
|
|
73
73
|
|
|
74
|
+
#### ID Tracking (REQ-XX, FR-XX, UJ-XX)
|
|
75
|
+
|
|
76
|
+
When source artifacts contain IDs (REQ-XX, FR-XX, UJ-XX), emit them as **first-class YAML fields** in `in_scope` entries, not YAML comments:
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
# CORRECT — first-class id: field
|
|
80
|
+
in_scope:
|
|
81
|
+
- id: REQ-001
|
|
82
|
+
description: "User can register with email/password"
|
|
83
|
+
source: "REQUIREMENTS.md"
|
|
84
|
+
|
|
85
|
+
# DEPRECATED — comment-only
|
|
86
|
+
in_scope:
|
|
87
|
+
- "User can register with email/password" # REQ-001
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**When source has no IDs:** Prompt the user: "No IDs found. Assign auto-generated IDs? [yes / no]". If yes, emit `REQ-{NNN}` with `# auto-generated` annotation.
|
|
91
|
+
|
|
92
|
+
**When source has MIXED IDs:** Items with IDs get `id:` fields; items without IDs receive auto-generated `REQ-NNN` entries. Document which were auto-generated in a comment block at the top of `in_scope`.
|
|
93
|
+
|
|
94
|
+
See [REFERENCE.md — in_scope format with ID tracking](./REFERENCE.md#in_scope-format-with-id-tracking) for examples.
|
|
95
|
+
|
|
96
|
+
#### Traceability Output (FR-XX, UJ-XX)
|
|
97
|
+
|
|
98
|
+
When source has FR-XX or UJ-XX IDs, emit `specs/product/REQUIREMENTS_TRACE.yaml` for end-to-end requirement traceability:
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
trace:
|
|
102
|
+
- id: FR-001
|
|
103
|
+
type: functional_requirement
|
|
104
|
+
description: "User can register with email/password"
|
|
105
|
+
epic: e02-auth-ui
|
|
106
|
+
story: e02s01
|
|
107
|
+
verify: "grep -q 'FR-001' specs/product/SCOPE_LATEST.yaml && echo OK"
|
|
108
|
+
- id: UJ-001
|
|
109
|
+
type: user_journey
|
|
110
|
+
description: "New user completes registration flow"
|
|
111
|
+
epic: e02-auth-ui
|
|
112
|
+
story: e02s01
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Existing trace file:** If `REQUIREMENTS_TRACE.yaml` already exists, prompt: "REQUIREMENTS_TRACE.yaml exists. [overwrite / merge / skip]"
|
|
116
|
+
|
|
117
|
+
**No FR-XX/UJ-XX found:** Skip trace file; add note to state.yaml handoff: "No FR-XX/UJ-XX IDs found — traceability file skipped".
|
|
118
|
+
|
|
119
|
+
See [REFERENCE.md — REQUIREMENTS_TRACE.yaml format](./REFERENCE.md#requirements_traceyaml-format) for the complete schema.
|
|
120
|
+
|
|
74
121
|
> **HARD GATE** — Never overwrite an existing `specs/` file without explicit user confirmation. Merge into it if it exists; don't clobber.
|
|
75
122
|
>
|
|
76
123
|
> → verify: `git diff --name-only HEAD -- specs/ 2>/dev/null | head -20`
|
|
@@ -126,7 +173,7 @@ Full mapping tables: [REFERENCE-GSD.md](./REFERENCE-GSD.md) (GSD) · [REFERENCE.
|
|
|
126
173
|
|
|
127
174
|
## Rules
|
|
128
175
|
|
|
129
|
-
- **Preserve source IDs** — REQ-XX, FR-XX, UJ-XX
|
|
176
|
+
- **Preserve source IDs** — REQ-XX, FR-XX, UJ-XX are emitted as first-class `id:` fields in bigpowers YAML targets (e.g., `in_scope` entries). Never silently renumber. See Step 3 ID Tracking subsection for details.
|
|
130
177
|
- **Never merge contradictory docs** — if source has both `CONTEXT.md` and `architecture.md`, create sections in bigpowers `CONTEXT.md`; don't collapse them.
|
|
131
178
|
- **ADRs are opt-in** — only create an ADR when: hard to reverse, surprising without context, result of a real trade-off. Lightweight decisions go to `specs/DECISION-LOG.md`.
|
|
132
179
|
- **state.yaml is always regenerated** — never migrate source STATE verbatim; bigpowers state.yaml needs its own format.
|
|
@@ -184,9 +231,9 @@ Transform:
|
|
|
184
231
|
GSD REQUIREMENTS has: REQ-XX IDs, Validated/Active/Out-of-Scope categories, traceability.
|
|
185
232
|
|
|
186
233
|
Transform:
|
|
187
|
-
-
|
|
188
|
-
- Validated requirements → `in_scope` entries
|
|
189
|
-
- Out-of-Scope → `out_of_scope` entries
|
|
234
|
+
- Preserve REQ-XX IDs as **first-class `id:` fields** in `in_scope` entries (see [REFERENCE.md — ID tracking format](./REFERENCE.md#in_scope-format-with-id-tracking))
|
|
235
|
+
- Validated requirements → `in_scope` entries with `id:`, `description:`, `source:` fields
|
|
236
|
+
- Out-of-Scope → `out_of_scope` entries (preserve IDs if present)
|
|
190
237
|
- Active (in-progress) → `in_scope` with status note
|
|
191
238
|
|
|
192
239
|
---
|
|
@@ -404,7 +451,7 @@ Optional enhancements to offer the user after migration. Present as checkboxes.
|
|
|
404
451
|
|
|
405
452
|
- [ ] **`specs/tech-architecture/METHODOLOGY_LATEST.md`** — Standing analytical lenses. Agents read before planning.
|
|
406
453
|
- [ ] **`handoff` block in state.yaml** — Last skill, last step, required reading for next session.
|
|
407
|
-
- [
|
|
454
|
+
- [x] **ID tracking in SCOPE_LATEST.yaml** — FR/UJ IDs for spec → plan → verification traceability. (adopted in Step 3 transform)
|
|
408
455
|
|
|
409
456
|
### From spec-kit
|
|
410
457
|
|
|
@@ -414,7 +461,7 @@ Optional enhancements to offer the user after migration. Present as checkboxes.
|
|
|
414
461
|
|
|
415
462
|
### From BMAD
|
|
416
463
|
|
|
417
|
-
- [
|
|
464
|
+
- [x] **FR-XX + UJ-XX in SCOPE_LATEST.yaml** — Rigorous traceability. (adopted: REQUIREMENTS_TRACE.yaml emitted on migration)
|
|
418
465
|
- [ ] **`specs/DECISION-LOG.md`** — Lightweight decisions below ADR threshold.
|
|
419
466
|
- [ ] **Adversarial review pass** — Critique epic shard before `develop-tdd`.
|
|
420
467
|
|
|
@@ -454,6 +501,62 @@ For lightweight decisions that don't warrant a full ADR:
|
|
|
454
501
|
| 2026-05-19 | Use Postgres | Existing ops expertise | SQLite (limited), DynamoDB (no local dev) |
|
|
455
502
|
```
|
|
456
503
|
|
|
504
|
+
### in_scope format with ID tracking
|
|
505
|
+
|
|
506
|
+
Source IDs (REQ-XX, FR-XX, UJ-XX) are emitted as first-class YAML fields:
|
|
507
|
+
|
|
508
|
+
```yaml
|
|
509
|
+
in_scope:
|
|
510
|
+
- id: REQ-001
|
|
511
|
+
description: "User can register with email and password"
|
|
512
|
+
source: "REQUIREMENTS.md"
|
|
513
|
+
- id: FR-015
|
|
514
|
+
description: "Auth service must support OAuth2 token flow"
|
|
515
|
+
source: "prd.md"
|
|
516
|
+
- id: REQ-AUTO-002 # auto-generated when source had no ID
|
|
517
|
+
description: "Dashboard displays user profile"
|
|
518
|
+
# auto-generated: true (optional comment for tracking)
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
**When source has no IDs:** If the user opts in, auto-generated IDs follow the `REQ-{NNN}` format with an optional `# auto-generated` comment.
|
|
522
|
+
|
|
523
|
+
**When source has mixed IDs:** Entries with source IDs get `id:` fields; entries without IDs receive auto-generated IDs. A comment block at the top of `in_scope` documents which IDs were auto-generated.
|
|
524
|
+
|
|
525
|
+
### REQUIREMENTS_TRACE.yaml format
|
|
526
|
+
|
|
527
|
+
Emitted when source has FR-XX (functional requirement) or UJ-XX (user journey) IDs. Maps source requirements to bigpowers epic/story structure and verification commands:
|
|
528
|
+
|
|
529
|
+
```yaml
|
|
530
|
+
trace:
|
|
531
|
+
# Functional Requirements
|
|
532
|
+
- id: FR-001
|
|
533
|
+
type: functional_requirement
|
|
534
|
+
description: "User can register with email/password"
|
|
535
|
+
source_artifact: "prd.md"
|
|
536
|
+
epic: "e02-auth-ui"
|
|
537
|
+
story: "e02s01"
|
|
538
|
+
verify: "grep -q 'FR-001' specs/product/SCOPE_LATEST.yaml && echo OK"
|
|
539
|
+
|
|
540
|
+
# User Journeys
|
|
541
|
+
- id: UJ-001
|
|
542
|
+
type: user_journey
|
|
543
|
+
description: "New user completes registration flow"
|
|
544
|
+
source_artifact: "epic-auth-ui.md"
|
|
545
|
+
epic: "e02-auth-ui"
|
|
546
|
+
story: "e02s01"
|
|
547
|
+
verify: "grep -q 'UJ-001' specs/epics/e02-auth-ui/epic.yaml && echo OK"
|
|
548
|
+
|
|
549
|
+
metadata:
|
|
550
|
+
source_framework: "BMAD"
|
|
551
|
+
migrated_at: "2026-06-26T12:00:00Z"
|
|
552
|
+
total_requirements: 2
|
|
553
|
+
coverage: "All FR-XX and UJ-XX IDs from source mapped"
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
**When source has no FR-XX/UJ-XX:** Skip REQUIREMENTS_TRACE.yaml. Add note to `state.yaml` handoff: "No FR-XX/UJ-XX IDs found — traceability file skipped".
|
|
557
|
+
|
|
558
|
+
**Existing trace file:** If REQUIREMENTS_TRACE.yaml exists, prompt user: "Overwrite? [yes / merge / skip]". Merge appends new entries; skip leaves existing file intact.
|
|
559
|
+
|
|
457
560
|
### `specs/state.yaml` template format
|
|
458
561
|
|
|
459
562
|
Generated during Step 4 of migration. Regenerate from scratch in bigpowers format:
|
|
@@ -57,9 +57,13 @@ Every task must have a `verify:` command. No verify command = not a task.
|
|
|
57
57
|
|
|
58
58
|
### 4. Save specs/release-plan.yaml
|
|
59
59
|
|
|
60
|
+
> **Do NOT hand-track the real version.** semantic-release decides it at merge. `version` here is a
|
|
61
|
+
> non-authoritative mirror/label only — read the real number with `gh release view`. Set `bump_hint`
|
|
62
|
+
> (the expectation), not a number you intend to enforce.
|
|
63
|
+
|
|
60
64
|
```yaml
|
|
61
65
|
release:
|
|
62
|
-
version: "
|
|
66
|
+
version: "2.29.0" # mirror of next expected tag, NOT authoritative — gh release view wins
|
|
63
67
|
codename: "Feature Name"
|
|
64
68
|
status: planning # planning | in_progress | released
|
|
65
69
|
semantic_release: true
|
|
@@ -108,8 +108,8 @@ active_epic_id: e02
|
|
|
108
108
|
active_story_id: e02s01 # required when epic mode: folder
|
|
109
109
|
active_bug_id: null # BUG-2026-06-01T143022 when fix_bug
|
|
110
110
|
release:
|
|
111
|
-
target_version:
|
|
112
|
-
last_tag:
|
|
111
|
+
target_version: null # NOT tracked manually — semantic-release decides at merge
|
|
112
|
+
last_tag: v2.28.0 # mirror of `gh release view`, reference only
|
|
113
113
|
last_publish: null
|
|
114
114
|
epic_cycle:
|
|
115
115
|
current_step: develop-tdd
|
|
@@ -73,6 +73,53 @@ Apply the mapping from [REFERENCE.md](./REFERENCE.md) and [REFERENCE-GSD.md](./R
|
|
|
73
73
|
2. Ask: "Create this? [yes / edit / skip]"
|
|
74
74
|
3. On yes: write to `specs/`.
|
|
75
75
|
|
|
76
|
+
#### ID Tracking (REQ-XX, FR-XX, UJ-XX)
|
|
77
|
+
|
|
78
|
+
When source artifacts contain IDs (REQ-XX, FR-XX, UJ-XX), emit them as **first-class YAML fields** in `in_scope` entries, not YAML comments:
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
# CORRECT — first-class id: field
|
|
82
|
+
in_scope:
|
|
83
|
+
- id: REQ-001
|
|
84
|
+
description: "User can register with email/password"
|
|
85
|
+
source: "REQUIREMENTS.md"
|
|
86
|
+
|
|
87
|
+
# DEPRECATED — comment-only
|
|
88
|
+
in_scope:
|
|
89
|
+
- "User can register with email/password" # REQ-001
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**When source has no IDs:** Prompt the user: "No IDs found. Assign auto-generated IDs? [yes / no]". If yes, emit `REQ-{NNN}` with `# auto-generated` annotation.
|
|
93
|
+
|
|
94
|
+
**When source has MIXED IDs:** Items with IDs get `id:` fields; items without IDs receive auto-generated `REQ-NNN` entries. Document which were auto-generated in a comment block at the top of `in_scope`.
|
|
95
|
+
|
|
96
|
+
See [REFERENCE.md — in_scope format with ID tracking](./REFERENCE.md#in_scope-format-with-id-tracking) for examples.
|
|
97
|
+
|
|
98
|
+
#### Traceability Output (FR-XX, UJ-XX)
|
|
99
|
+
|
|
100
|
+
When source has FR-XX or UJ-XX IDs, emit `specs/product/REQUIREMENTS_TRACE.yaml` for end-to-end requirement traceability:
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
trace:
|
|
104
|
+
- id: FR-001
|
|
105
|
+
type: functional_requirement
|
|
106
|
+
description: "User can register with email/password"
|
|
107
|
+
epic: e02-auth-ui
|
|
108
|
+
story: e02s01
|
|
109
|
+
verify: "grep -q 'FR-001' specs/product/SCOPE_LATEST.yaml && echo OK"
|
|
110
|
+
- id: UJ-001
|
|
111
|
+
type: user_journey
|
|
112
|
+
description: "New user completes registration flow"
|
|
113
|
+
epic: e02-auth-ui
|
|
114
|
+
story: e02s01
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Existing trace file:** If `REQUIREMENTS_TRACE.yaml` already exists, prompt: "REQUIREMENTS_TRACE.yaml exists. [overwrite / merge / skip]"
|
|
118
|
+
|
|
119
|
+
**No FR-XX/UJ-XX found:** Skip trace file; add note to state.yaml handoff: "No FR-XX/UJ-XX IDs found — traceability file skipped".
|
|
120
|
+
|
|
121
|
+
See [REFERENCE.md — REQUIREMENTS_TRACE.yaml format](./REFERENCE.md#requirements_traceyaml-format) for the complete schema.
|
|
122
|
+
|
|
76
123
|
> **HARD GATE** — Never overwrite an existing `specs/` file without explicit user confirmation. Merge into it if it exists; don't clobber.
|
|
77
124
|
>
|
|
78
125
|
> → verify: `git diff --name-only HEAD -- specs/ 2>/dev/null | head -20`
|
|
@@ -128,7 +175,7 @@ Full mapping tables: [REFERENCE-GSD.md](./REFERENCE-GSD.md) (GSD) · [REFERENCE.
|
|
|
128
175
|
|
|
129
176
|
## Rules
|
|
130
177
|
|
|
131
|
-
- **Preserve source IDs** — REQ-XX, FR-XX, UJ-XX
|
|
178
|
+
- **Preserve source IDs** — REQ-XX, FR-XX, UJ-XX are emitted as first-class `id:` fields in bigpowers YAML targets (e.g., `in_scope` entries). Never silently renumber. See Step 3 ID Tracking subsection for details.
|
|
132
179
|
- **Never merge contradictory docs** — if source has both `CONTEXT.md` and `architecture.md`, create sections in bigpowers `CONTEXT.md`; don't collapse them.
|
|
133
180
|
- **ADRs are opt-in** — only create an ADR when: hard to reverse, surprising without context, result of a real trade-off. Lightweight decisions go to `specs/DECISION-LOG.md`.
|
|
134
181
|
- **state.yaml is always regenerated** — never migrate source STATE verbatim; bigpowers state.yaml needs its own format.
|
|
@@ -186,9 +233,9 @@ Transform:
|
|
|
186
233
|
GSD REQUIREMENTS has: REQ-XX IDs, Validated/Active/Out-of-Scope categories, traceability.
|
|
187
234
|
|
|
188
235
|
Transform:
|
|
189
|
-
-
|
|
190
|
-
- Validated requirements → `in_scope` entries
|
|
191
|
-
- Out-of-Scope → `out_of_scope` entries
|
|
236
|
+
- Preserve REQ-XX IDs as **first-class `id:` fields** in `in_scope` entries (see [REFERENCE.md — ID tracking format](./REFERENCE.md#in_scope-format-with-id-tracking))
|
|
237
|
+
- Validated requirements → `in_scope` entries with `id:`, `description:`, `source:` fields
|
|
238
|
+
- Out-of-Scope → `out_of_scope` entries (preserve IDs if present)
|
|
192
239
|
- Active (in-progress) → `in_scope` with status note
|
|
193
240
|
|
|
194
241
|
---
|
|
@@ -406,7 +453,7 @@ Optional enhancements to offer the user after migration. Present as checkboxes.
|
|
|
406
453
|
|
|
407
454
|
- [ ] **`specs/tech-architecture/METHODOLOGY_LATEST.md`** — Standing analytical lenses. Agents read before planning.
|
|
408
455
|
- [ ] **`handoff` block in state.yaml** — Last skill, last step, required reading for next session.
|
|
409
|
-
- [
|
|
456
|
+
- [x] **ID tracking in SCOPE_LATEST.yaml** — FR/UJ IDs for spec → plan → verification traceability. (adopted in Step 3 transform)
|
|
410
457
|
|
|
411
458
|
### From spec-kit
|
|
412
459
|
|
|
@@ -416,7 +463,7 @@ Optional enhancements to offer the user after migration. Present as checkboxes.
|
|
|
416
463
|
|
|
417
464
|
### From BMAD
|
|
418
465
|
|
|
419
|
-
- [
|
|
466
|
+
- [x] **FR-XX + UJ-XX in SCOPE_LATEST.yaml** — Rigorous traceability. (adopted: REQUIREMENTS_TRACE.yaml emitted on migration)
|
|
420
467
|
- [ ] **`specs/DECISION-LOG.md`** — Lightweight decisions below ADR threshold.
|
|
421
468
|
- [ ] **Adversarial review pass** — Critique epic shard before `develop-tdd`.
|
|
422
469
|
|
|
@@ -456,6 +503,62 @@ For lightweight decisions that don't warrant a full ADR:
|
|
|
456
503
|
| 2026-05-19 | Use Postgres | Existing ops expertise | SQLite (limited), DynamoDB (no local dev) |
|
|
457
504
|
```
|
|
458
505
|
|
|
506
|
+
### in_scope format with ID tracking
|
|
507
|
+
|
|
508
|
+
Source IDs (REQ-XX, FR-XX, UJ-XX) are emitted as first-class YAML fields:
|
|
509
|
+
|
|
510
|
+
```yaml
|
|
511
|
+
in_scope:
|
|
512
|
+
- id: REQ-001
|
|
513
|
+
description: "User can register with email and password"
|
|
514
|
+
source: "REQUIREMENTS.md"
|
|
515
|
+
- id: FR-015
|
|
516
|
+
description: "Auth service must support OAuth2 token flow"
|
|
517
|
+
source: "prd.md"
|
|
518
|
+
- id: REQ-AUTO-002 # auto-generated when source had no ID
|
|
519
|
+
description: "Dashboard displays user profile"
|
|
520
|
+
# auto-generated: true (optional comment for tracking)
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
**When source has no IDs:** If the user opts in, auto-generated IDs follow the `REQ-{NNN}` format with an optional `# auto-generated` comment.
|
|
524
|
+
|
|
525
|
+
**When source has mixed IDs:** Entries with source IDs get `id:` fields; entries without IDs receive auto-generated IDs. A comment block at the top of `in_scope` documents which IDs were auto-generated.
|
|
526
|
+
|
|
527
|
+
### REQUIREMENTS_TRACE.yaml format
|
|
528
|
+
|
|
529
|
+
Emitted when source has FR-XX (functional requirement) or UJ-XX (user journey) IDs. Maps source requirements to bigpowers epic/story structure and verification commands:
|
|
530
|
+
|
|
531
|
+
```yaml
|
|
532
|
+
trace:
|
|
533
|
+
# Functional Requirements
|
|
534
|
+
- id: FR-001
|
|
535
|
+
type: functional_requirement
|
|
536
|
+
description: "User can register with email/password"
|
|
537
|
+
source_artifact: "prd.md"
|
|
538
|
+
epic: "e02-auth-ui"
|
|
539
|
+
story: "e02s01"
|
|
540
|
+
verify: "grep -q 'FR-001' specs/product/SCOPE_LATEST.yaml && echo OK"
|
|
541
|
+
|
|
542
|
+
# User Journeys
|
|
543
|
+
- id: UJ-001
|
|
544
|
+
type: user_journey
|
|
545
|
+
description: "New user completes registration flow"
|
|
546
|
+
source_artifact: "epic-auth-ui.md"
|
|
547
|
+
epic: "e02-auth-ui"
|
|
548
|
+
story: "e02s01"
|
|
549
|
+
verify: "grep -q 'UJ-001' specs/epics/e02-auth-ui/epic.yaml && echo OK"
|
|
550
|
+
|
|
551
|
+
metadata:
|
|
552
|
+
source_framework: "BMAD"
|
|
553
|
+
migrated_at: "2026-06-26T12:00:00Z"
|
|
554
|
+
total_requirements: 2
|
|
555
|
+
coverage: "All FR-XX and UJ-XX IDs from source mapped"
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
**When source has no FR-XX/UJ-XX:** Skip REQUIREMENTS_TRACE.yaml. Add note to `state.yaml` handoff: "No FR-XX/UJ-XX IDs found — traceability file skipped".
|
|
559
|
+
|
|
560
|
+
**Existing trace file:** If REQUIREMENTS_TRACE.yaml exists, prompt user: "Overwrite? [yes / merge / skip]". Merge appends new entries; skip leaves existing file intact.
|
|
561
|
+
|
|
459
562
|
### `specs/state.yaml` template format
|
|
460
563
|
|
|
461
564
|
Generated during Step 4 of migration. Regenerate from scratch in bigpowers format:
|
|
@@ -59,9 +59,13 @@ Every task must have a `verify:` command. No verify command = not a task.
|
|
|
59
59
|
|
|
60
60
|
### 4. Save specs/release-plan.yaml
|
|
61
61
|
|
|
62
|
+
> **Do NOT hand-track the real version.** semantic-release decides it at merge. `version` here is a
|
|
63
|
+
> non-authoritative mirror/label only — read the real number with `gh release view`. Set `bump_hint`
|
|
64
|
+
> (the expectation), not a number you intend to enforce.
|
|
65
|
+
|
|
62
66
|
```yaml
|
|
63
67
|
release:
|
|
64
|
-
version: "
|
|
68
|
+
version: "2.29.0" # mirror of next expected tag, NOT authoritative — gh release view wins
|
|
65
69
|
codename: "Feature Name"
|
|
66
70
|
status: planning # planning | in_progress | released
|
|
67
71
|
semantic_release: true
|
|
@@ -110,8 +110,8 @@ active_epic_id: e02
|
|
|
110
110
|
active_story_id: e02s01 # required when epic mode: folder
|
|
111
111
|
active_bug_id: null # BUG-2026-06-01T143022 when fix_bug
|
|
112
112
|
release:
|
|
113
|
-
target_version:
|
|
114
|
-
last_tag:
|
|
113
|
+
target_version: null # NOT tracked manually — semantic-release decides at merge
|
|
114
|
+
last_tag: v2.28.0 # mirror of `gh release view`, reference only
|
|
115
115
|
last_publish: null
|
|
116
116
|
epic_cycle:
|
|
117
117
|
current_step: develop-tdd
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [2.30.0](https://github.com/danielvm-git/bigpowers/compare/v2.29.0...v2.30.0) (2026-06-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **migrate-spec:** emit REQUIREMENTS_TRACE.yaml for FR-XX/UJ-XX IDs ([955a1fd](https://github.com/danielvm-git/bigpowers/commit/955a1fd37b898ec70a86895d8772f0ec6fb8a0fa))
|
|
7
|
+
|
|
8
|
+
# [2.29.0](https://github.com/danielvm-git/bigpowers/compare/v2.28.0...v2.29.0) (2026-06-26)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **migrate-spec:** promote ID tracking from comments to first-class YAML fields ([f1c8d73](https://github.com/danielvm-git/bigpowers/commit/f1c8d73a5140175fc0067a191f119eea70395075)), closes [#22](https://github.com/danielvm-git/bigpowers/issues/22)
|
|
14
|
+
|
|
1
15
|
# [2.28.0](https://github.com/danielvm-git/bigpowers/compare/v2.27.0...v2.28.0) (2026-06-22)
|
|
2
16
|
|
|
3
17
|
|
package/CONVENTIONS.md
CHANGED
|
@@ -96,11 +96,16 @@ Epic IDs: `e01`, `e30`. Story IDs: `e01s01`. One FR in SCOPE may span multiple e
|
|
|
96
96
|
|
|
97
97
|
When planning closes, copy to `specs/product/snapshots/release-<version>/` (`release-plan.yaml`, `SCOPE_LATEST.yaml`, `VISION_LATEST.yaml`). No separate `baselines/` folder.
|
|
98
98
|
|
|
99
|
-
### Semantic-release —
|
|
99
|
+
### Semantic-release — the real version is never hand-tracked
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
> **The authority is `gh release view` / git tags.** semantic-release decides the version
|
|
102
|
+
> at merge from Conventional Commits. Never hand-maintain a `target_version` to "predict" it —
|
|
103
|
+
> that field drifts from reality every release. The specs only *mirror* the real tag for reference.
|
|
104
|
+
|
|
105
|
+
1. **Planning intent (codename only)** — `specs/release-plan.yaml` → `release.version`, `release.bump_hint`.
|
|
106
|
+
Treat `version` as a non-authoritative label; if you write a number, mark it "mirror, not the authority".
|
|
107
|
+
2. **Published version (authority)** — repo root `package.json`, git tag `vX.Y.Z`, `CHANGELOG.md` (CI semantic-release; not hand-edited in specs). Read with `gh release view`.
|
|
108
|
+
3. **Dashboard mirror** — `specs/state.yaml` → `release.last_tag`, `release.last_publish` (copied from `gh release view`; `target_version` is `null` — not tracked manually).
|
|
104
109
|
|
|
105
110
|
### Guardrails and other artifacts
|
|
106
111
|
|
package/SKILL-INDEX.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> **DO NOT EDIT** — This file is auto-generated by `scripts/generate-skill-index.sh`.
|
|
4
4
|
> Edit `SKILL.md` source files or `skills-lock.json` instead. Run `bash scripts/sync-skills.sh` to regenerate.
|
|
5
5
|
|
|
6
|
-
**Generated:** 2026-06-
|
|
6
|
+
**Generated:** 2026-06-26T22:23:41Z
|
|
7
7
|
**Skills:** 70
|
|
8
8
|
|
|
9
9
|
---
|
|
@@ -48,9 +48,9 @@ Transform:
|
|
|
48
48
|
GSD REQUIREMENTS has: REQ-XX IDs, Validated/Active/Out-of-Scope categories, traceability.
|
|
49
49
|
|
|
50
50
|
Transform:
|
|
51
|
-
-
|
|
52
|
-
- Validated requirements → `in_scope` entries
|
|
53
|
-
- Out-of-Scope → `out_of_scope` entries
|
|
51
|
+
- Preserve REQ-XX IDs as **first-class `id:` fields** in `in_scope` entries (see [REFERENCE.md — ID tracking format](./REFERENCE.md#in_scope-format-with-id-tracking))
|
|
52
|
+
- Validated requirements → `in_scope` entries with `id:`, `description:`, `source:` fields
|
|
53
|
+
- Out-of-Scope → `out_of_scope` entries (preserve IDs if present)
|
|
54
54
|
- Active (in-progress) → `in_scope` with status note
|
|
55
55
|
|
|
56
56
|
---
|
|
@@ -134,7 +134,7 @@ Optional enhancements to offer the user after migration. Present as checkboxes.
|
|
|
134
134
|
|
|
135
135
|
- [ ] **`specs/tech-architecture/METHODOLOGY_LATEST.md`** — Standing analytical lenses. Agents read before planning.
|
|
136
136
|
- [ ] **`handoff` block in state.yaml** — Last skill, last step, required reading for next session.
|
|
137
|
-
- [
|
|
137
|
+
- [x] **ID tracking in SCOPE_LATEST.yaml** — FR/UJ IDs for spec → plan → verification traceability. (adopted in Step 3 transform)
|
|
138
138
|
|
|
139
139
|
### From spec-kit
|
|
140
140
|
|
|
@@ -144,7 +144,7 @@ Optional enhancements to offer the user after migration. Present as checkboxes.
|
|
|
144
144
|
|
|
145
145
|
### From BMAD
|
|
146
146
|
|
|
147
|
-
- [
|
|
147
|
+
- [x] **FR-XX + UJ-XX in SCOPE_LATEST.yaml** — Rigorous traceability. (adopted: REQUIREMENTS_TRACE.yaml emitted on migration)
|
|
148
148
|
- [ ] **`specs/DECISION-LOG.md`** — Lightweight decisions below ADR threshold.
|
|
149
149
|
- [ ] **Adversarial review pass** — Critique epic shard before `develop-tdd`.
|
|
150
150
|
|
|
@@ -184,6 +184,62 @@ For lightweight decisions that don't warrant a full ADR:
|
|
|
184
184
|
| 2026-05-19 | Use Postgres | Existing ops expertise | SQLite (limited), DynamoDB (no local dev) |
|
|
185
185
|
```
|
|
186
186
|
|
|
187
|
+
### in_scope format with ID tracking
|
|
188
|
+
|
|
189
|
+
Source IDs (REQ-XX, FR-XX, UJ-XX) are emitted as first-class YAML fields:
|
|
190
|
+
|
|
191
|
+
```yaml
|
|
192
|
+
in_scope:
|
|
193
|
+
- id: REQ-001
|
|
194
|
+
description: "User can register with email and password"
|
|
195
|
+
source: "REQUIREMENTS.md"
|
|
196
|
+
- id: FR-015
|
|
197
|
+
description: "Auth service must support OAuth2 token flow"
|
|
198
|
+
source: "prd.md"
|
|
199
|
+
- id: REQ-AUTO-002 # auto-generated when source had no ID
|
|
200
|
+
description: "Dashboard displays user profile"
|
|
201
|
+
# auto-generated: true (optional comment for tracking)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**When source has no IDs:** If the user opts in, auto-generated IDs follow the `REQ-{NNN}` format with an optional `# auto-generated` comment.
|
|
205
|
+
|
|
206
|
+
**When source has mixed IDs:** Entries with source IDs get `id:` fields; entries without IDs receive auto-generated IDs. A comment block at the top of `in_scope` documents which IDs were auto-generated.
|
|
207
|
+
|
|
208
|
+
### REQUIREMENTS_TRACE.yaml format
|
|
209
|
+
|
|
210
|
+
Emitted when source has FR-XX (functional requirement) or UJ-XX (user journey) IDs. Maps source requirements to bigpowers epic/story structure and verification commands:
|
|
211
|
+
|
|
212
|
+
```yaml
|
|
213
|
+
trace:
|
|
214
|
+
# Functional Requirements
|
|
215
|
+
- id: FR-001
|
|
216
|
+
type: functional_requirement
|
|
217
|
+
description: "User can register with email/password"
|
|
218
|
+
source_artifact: "prd.md"
|
|
219
|
+
epic: "e02-auth-ui"
|
|
220
|
+
story: "e02s01"
|
|
221
|
+
verify: "grep -q 'FR-001' specs/product/SCOPE_LATEST.yaml && echo OK"
|
|
222
|
+
|
|
223
|
+
# User Journeys
|
|
224
|
+
- id: UJ-001
|
|
225
|
+
type: user_journey
|
|
226
|
+
description: "New user completes registration flow"
|
|
227
|
+
source_artifact: "epic-auth-ui.md"
|
|
228
|
+
epic: "e02-auth-ui"
|
|
229
|
+
story: "e02s01"
|
|
230
|
+
verify: "grep -q 'UJ-001' specs/epics/e02-auth-ui/epic.yaml && echo OK"
|
|
231
|
+
|
|
232
|
+
metadata:
|
|
233
|
+
source_framework: "BMAD"
|
|
234
|
+
migrated_at: "2026-06-26T12:00:00Z"
|
|
235
|
+
total_requirements: 2
|
|
236
|
+
coverage: "All FR-XX and UJ-XX IDs from source mapped"
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**When source has no FR-XX/UJ-XX:** Skip REQUIREMENTS_TRACE.yaml. Add note to `state.yaml` handoff: "No FR-XX/UJ-XX IDs found — traceability file skipped".
|
|
240
|
+
|
|
241
|
+
**Existing trace file:** If REQUIREMENTS_TRACE.yaml exists, prompt user: "Overwrite? [yes / merge / skip]". Merge appends new entries; skip leaves existing file intact.
|
|
242
|
+
|
|
187
243
|
### `specs/state.yaml` template format
|
|
188
244
|
|
|
189
245
|
Generated during Step 4 of migration. Regenerate from scratch in bigpowers format:
|
package/migrate-spec/SKILL.md
CHANGED
|
@@ -74,6 +74,53 @@ Apply the mapping from [REFERENCE.md](./REFERENCE.md) and [REFERENCE-GSD.md](./R
|
|
|
74
74
|
2. Ask: "Create this? [yes / edit / skip]"
|
|
75
75
|
3. On yes: write to `specs/`.
|
|
76
76
|
|
|
77
|
+
#### ID Tracking (REQ-XX, FR-XX, UJ-XX)
|
|
78
|
+
|
|
79
|
+
When source artifacts contain IDs (REQ-XX, FR-XX, UJ-XX), emit them as **first-class YAML fields** in `in_scope` entries, not YAML comments:
|
|
80
|
+
|
|
81
|
+
```yaml
|
|
82
|
+
# CORRECT — first-class id: field
|
|
83
|
+
in_scope:
|
|
84
|
+
- id: REQ-001
|
|
85
|
+
description: "User can register with email/password"
|
|
86
|
+
source: "REQUIREMENTS.md"
|
|
87
|
+
|
|
88
|
+
# DEPRECATED — comment-only
|
|
89
|
+
in_scope:
|
|
90
|
+
- "User can register with email/password" # REQ-001
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**When source has no IDs:** Prompt the user: "No IDs found. Assign auto-generated IDs? [yes / no]". If yes, emit `REQ-{NNN}` with `# auto-generated` annotation.
|
|
94
|
+
|
|
95
|
+
**When source has MIXED IDs:** Items with IDs get `id:` fields; items without IDs receive auto-generated `REQ-NNN` entries. Document which were auto-generated in a comment block at the top of `in_scope`.
|
|
96
|
+
|
|
97
|
+
See [REFERENCE.md — in_scope format with ID tracking](./REFERENCE.md#in_scope-format-with-id-tracking) for examples.
|
|
98
|
+
|
|
99
|
+
#### Traceability Output (FR-XX, UJ-XX)
|
|
100
|
+
|
|
101
|
+
When source has FR-XX or UJ-XX IDs, emit `specs/product/REQUIREMENTS_TRACE.yaml` for end-to-end requirement traceability:
|
|
102
|
+
|
|
103
|
+
```yaml
|
|
104
|
+
trace:
|
|
105
|
+
- id: FR-001
|
|
106
|
+
type: functional_requirement
|
|
107
|
+
description: "User can register with email/password"
|
|
108
|
+
epic: e02-auth-ui
|
|
109
|
+
story: e02s01
|
|
110
|
+
verify: "grep -q 'FR-001' specs/product/SCOPE_LATEST.yaml && echo OK"
|
|
111
|
+
- id: UJ-001
|
|
112
|
+
type: user_journey
|
|
113
|
+
description: "New user completes registration flow"
|
|
114
|
+
epic: e02-auth-ui
|
|
115
|
+
story: e02s01
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Existing trace file:** If `REQUIREMENTS_TRACE.yaml` already exists, prompt: "REQUIREMENTS_TRACE.yaml exists. [overwrite / merge / skip]"
|
|
119
|
+
|
|
120
|
+
**No FR-XX/UJ-XX found:** Skip trace file; add note to state.yaml handoff: "No FR-XX/UJ-XX IDs found — traceability file skipped".
|
|
121
|
+
|
|
122
|
+
See [REFERENCE.md — REQUIREMENTS_TRACE.yaml format](./REFERENCE.md#requirements_traceyaml-format) for the complete schema.
|
|
123
|
+
|
|
77
124
|
> **HARD GATE** — Never overwrite an existing `specs/` file without explicit user confirmation. Merge into it if it exists; don't clobber.
|
|
78
125
|
>
|
|
79
126
|
> → verify: `git diff --name-only HEAD -- specs/ 2>/dev/null | head -20`
|
|
@@ -131,7 +178,7 @@ Full mapping tables: [REFERENCE-GSD.md](./REFERENCE-GSD.md) (GSD) · [REFERENCE.
|
|
|
131
178
|
|
|
132
179
|
## Rules
|
|
133
180
|
|
|
134
|
-
- **Preserve source IDs** — REQ-XX, FR-XX, UJ-XX
|
|
181
|
+
- **Preserve source IDs** — REQ-XX, FR-XX, UJ-XX are emitted as first-class `id:` fields in bigpowers YAML targets (e.g., `in_scope` entries). Never silently renumber. See Step 3 ID Tracking subsection for details.
|
|
135
182
|
- **Never merge contradictory docs** — if source has both `CONTEXT.md` and `architecture.md`, create sections in bigpowers `CONTEXT.md`; don't collapse them.
|
|
136
183
|
- **ADRs are opt-in** — only create an ADR when: hard to reverse, surprising without context, result of a real trade-off. Lightweight decisions go to `specs/DECISION-LOG.md`.
|
|
137
184
|
- **state.yaml is always regenerated** — never migrate source STATE verbatim; bigpowers state.yaml needs its own format.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Auto-generated from {{source_framework}} FR-XX / UJ-XX IDs during migration
|
|
2
|
+
# Maps source requirements to bigpowers epic/story structure and verification commands.
|
|
3
|
+
|
|
4
|
+
trace:
|
|
5
|
+
# Functional Requirements (FR-XX)
|
|
6
|
+
- id: FR-001
|
|
7
|
+
type: functional_requirement
|
|
8
|
+
description: "User can register with email/password"
|
|
9
|
+
source_artifact: "{{source_file}}"
|
|
10
|
+
epic: "e02-auth-ui"
|
|
11
|
+
story: "e02s01"
|
|
12
|
+
verify: "grep -q 'FR-001' specs/product/SCOPE_LATEST.yaml && echo OK || echo FAIL"
|
|
13
|
+
|
|
14
|
+
# User Journeys (UJ-XX)
|
|
15
|
+
- id: UJ-001
|
|
16
|
+
type: user_journey
|
|
17
|
+
description: "New user completes registration flow"
|
|
18
|
+
source_artifact: "{{source_file}}"
|
|
19
|
+
epic: "e02-auth-ui"
|
|
20
|
+
story: "e02s01"
|
|
21
|
+
verify: "grep -q 'UJ-001' specs/epics/e02-auth-ui/epic.yaml && echo OK || echo FAIL"
|
|
22
|
+
|
|
23
|
+
# Metadata
|
|
24
|
+
metadata:
|
|
25
|
+
source_framework: "{{source_framework}}" # e.g., BMAD, GSD, spec-kit
|
|
26
|
+
migrated_at: "{{timestamp}}"
|
|
27
|
+
total_requirements: "{{count}}"
|
|
28
|
+
coverage: "All FR-XX and UJ-XX IDs from source mapped to bigpowers artifacts"
|
package/package.json
CHANGED
package/plan-release/SKILL.md
CHANGED
|
@@ -58,9 +58,13 @@ Every task must have a `verify:` command. No verify command = not a task.
|
|
|
58
58
|
|
|
59
59
|
### 4. Save specs/release-plan.yaml
|
|
60
60
|
|
|
61
|
+
> **Do NOT hand-track the real version.** semantic-release decides it at merge. `version` here is a
|
|
62
|
+
> non-authoritative mirror/label only — read the real number with `gh release view`. Set `bump_hint`
|
|
63
|
+
> (the expectation), not a number you intend to enforce.
|
|
64
|
+
|
|
61
65
|
```yaml
|
|
62
66
|
release:
|
|
63
|
-
version: "
|
|
67
|
+
version: "2.29.0" # mirror of next expected tag, NOT authoritative — gh release view wins
|
|
64
68
|
codename: "Feature Name"
|
|
65
69
|
status: planning # planning | in_progress | released
|
|
66
70
|
semantic_release: true
|
|
@@ -37,6 +37,9 @@ for folder in sorted(epics_dir.glob("e*/")):
|
|
|
37
37
|
em = re.search(r"^id:\s*(e\d+)", text, re.M)
|
|
38
38
|
if em:
|
|
39
39
|
keys.setdefault(em.group(1), "backlog")
|
|
40
|
+
# Parse inline story IDs from capsule epic.yaml (same pattern as flat files)
|
|
41
|
+
for sm in re.finditer(r"^\s+- id:\s*(e\d+s\d+)", text, re.M):
|
|
42
|
+
keys.setdefault(sm.group(1), "backlog")
|
|
40
43
|
for story in (folder / "stories").glob("e*s*.md"):
|
|
41
44
|
m = re.match(r"(e\d+s\d+)", story.name)
|
|
42
45
|
if m:
|
package/session-state/SKILL.md
CHANGED
|
@@ -109,8 +109,8 @@ active_epic_id: e02
|
|
|
109
109
|
active_story_id: e02s01 # required when epic mode: folder
|
|
110
110
|
active_bug_id: null # BUG-2026-06-01T143022 when fix_bug
|
|
111
111
|
release:
|
|
112
|
-
target_version:
|
|
113
|
-
last_tag:
|
|
112
|
+
target_version: null # NOT tracked manually — semantic-release decides at merge
|
|
113
|
+
last_tag: v2.28.0 # mirror of `gh release view`, reference only
|
|
114
114
|
last_publish: null
|
|
115
115
|
epic_cycle:
|
|
116
116
|
current_step: develop-tdd
|
package/skills-lock.json
CHANGED
|
@@ -163,7 +163,7 @@
|
|
|
163
163
|
},
|
|
164
164
|
"migrate-spec": {
|
|
165
165
|
"description": "Detect GSD, spec-kit, or BMAD spec artifacts and transform them into bigpowers YAML layout (state.yaml, release-plan.yaml, epics/, requirements/, plans/, ADRs). Use when migrating foreign spec docs.",
|
|
166
|
-
"sha256": "
|
|
166
|
+
"sha256": "72006537bb12ab1a",
|
|
167
167
|
"path": "migrate-spec/SKILL.md"
|
|
168
168
|
},
|
|
169
169
|
"model-domain": {
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
},
|
|
189
189
|
"plan-release": {
|
|
190
190
|
"description": "\"RELEASE-INDEX BUILDER — Sequence elaborated epics into specs/release-plan.yaml with WSJF ordering and BCP baselines. NOT a planning-spine substitute: it does not scope work (scope-work) or write story tasks (plan-work). Use after elaborate-spec when the user wants a versioned release index of epics.\"",
|
|
191
|
-
"sha256": "
|
|
191
|
+
"sha256": "352d54fe911757ad",
|
|
192
192
|
"path": "plan-release/SKILL.md"
|
|
193
193
|
},
|
|
194
194
|
"plan-work": {
|
|
@@ -263,7 +263,7 @@
|
|
|
263
263
|
},
|
|
264
264
|
"session-state": {
|
|
265
265
|
"description": "Track implementation decisions and progress in specs/state.yaml to prevent context rot. Use at the start of a session to load context, and whenever a significant decision is made or a milestone is reached.",
|
|
266
|
-
"sha256": "
|
|
266
|
+
"sha256": "0141daaed69b05dc",
|
|
267
267
|
"path": "session-state/SKILL.md"
|
|
268
268
|
},
|
|
269
269
|
"setup-environment": {
|