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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.28.0",
3
+ "version": "2.30.0",
4
4
  "description": "70 skills — 61 agent skills for spec-driven, test-first software development by solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
@@ -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 become inline comments in bigpowers targets. Never silently renumber.
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
- - Copy REQ-XX IDs as-is (preserve for cross-referencing)
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
- - [ ] **ID tracking in SCOPE_LATEST.yaml** — FR/UJ IDs for spec → plan → verification traceability.
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
- - [ ] **FR-XX + UJ-XX in SCOPE_LATEST.yaml** — Rigorous traceability.
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: "3.0.0"
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: "3.0.0"
112
- last_tag: null
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 become inline comments in bigpowers targets. Never silently renumber.
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
- - Copy REQ-XX IDs as-is (preserve for cross-referencing)
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
- - [ ] **ID tracking in SCOPE_LATEST.yaml** — FR/UJ IDs for spec → plan → verification traceability.
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
- - [ ] **FR-XX + UJ-XX in SCOPE_LATEST.yaml** — Rigorous traceability.
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: "3.0.0"
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: "3.0.0"
114
- last_tag: null
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 — three places
99
+ ### Semantic-release — the real version is never hand-tracked
100
100
 
101
- 1. **Planning intent** `specs/release-plan.yaml` `release.version`, `release.bump_hint` (minor/patch/major expectation).
102
- 2. **Published version** repo root: `package.json`, git tag `vX.Y.Z`, `CHANGELOG.md` (CI semantic-release; not hand-edited in specs).
103
- 3. **Dashboard optional** `specs/state.yaml` `release.last_tag`, `release.last_publish` (from tags/CI).
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-22T13:26:01Z
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
- - Copy REQ-XX IDs as-is (preserve for cross-referencing)
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
- - [ ] **ID tracking in SCOPE_LATEST.yaml** — FR/UJ IDs for spec → plan → verification traceability.
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
- - [ ] **FR-XX + UJ-XX in SCOPE_LATEST.yaml** — Rigorous traceability.
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:
@@ -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 become inline comments in bigpowers targets. Never silently renumber.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.28.0",
3
+ "version": "2.30.0",
4
4
  "description": "61 agent skills for spec-driven, test-first software development by solo developers",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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: "3.0.0"
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:
@@ -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: "3.0.0"
113
- last_tag: null
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": "912299321559a5e2",
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": "4eeb65607ca2f799",
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": "4efd54a453e3e2cd",
266
+ "sha256": "0141daaed69b05dc",
267
267
  "path": "session-state/SKILL.md"
268
268
  },
269
269
  "setup-environment": {