@boyingliu01/xp-gate 0.14.4 → 0.14.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boyingliu01/xp-gate",
3
- "version": "0.14.4",
3
+ "version": "0.14.5",
4
4
  "description": "AI-driven development workflow: 6 quality gates + Delphi review + Sprint Flow",
5
5
  "bin": {
6
6
  "xp-gate": "./bin/xp-gate.js"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xp-gate",
3
- "version": "0.14.4",
3
+ "version": "0.14.5",
4
4
  "displayName": "XP-Gate",
5
5
  "description": "Extreme Programming quality gates + AI workflow skills for Claude Code. Includes 10 quality gates (Gate 0-9), Sprint Flow (11 phases), and Delphi multi-expert review (>=90% consensus).",
6
6
  "author": {
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -200,6 +200,7 @@ Every phase MUST output its header as the first line of that phase's output. For
200
200
  4. On `/sprint-flow` trigger, first line MUST output: `Sprint Flow: PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE`
201
201
  5. Each phase completion MUST write Phase Summary to `.sprint-state/phase-outputs/phase-{N}-summary.md`
202
202
  6. Each phase completion MUST update `.sprint-state/sprint-state.json`
203
+ 7. Each phase completion MUST render the ASCII progress dashboard using `templates/sprint-progress-template.md` — the orchestrator reads `sprint-state.json` and outputs the dashboard after every phase's status block, so the user always sees current global progress without needing to ask
203
204
 
204
205
  ### Phase Output Status Schema (MANDATORY per phase)
205
206
 
@@ -9,13 +9,30 @@ const path = require('path');
9
9
 
10
10
  const SKILL_MD_PATH = path.join(__dirname, '..', 'SKILL.md');
11
11
  const REFERENCES_DIR = path.join(__dirname, '..', 'references');
12
+ const PHASE_OVERVIEW_PATH = path.join(REFERENCES_DIR, 'phase-overview.md');
12
13
  const PHASE_2_BUILD_PATH = path.join(REFERENCES_DIR, 'phase-3-build.md');
13
14
  const ORCHESTRATION_RULES_PATH = path.join(REFERENCES_DIR, 'orchestration-rules.md');
14
15
 
15
16
  let skillContent = '';
17
+ let phaseOverviewContent = '';
16
18
 
17
19
  function loadSkillMd() {
18
20
  skillContent = fs.readFileSync(SKILL_MD_PATH, 'utf-8');
21
+ if (fs.existsSync(PHASE_OVERVIEW_PATH)) {
22
+ phaseOverviewContent = fs.readFileSync(PHASE_OVERVIEW_PATH, 'utf-8');
23
+ }
24
+ }
25
+
26
+ // Search across SKILL.md AND references/phase-overview.md (progressive disclosure: sections
27
+ // like "Unique Value Proposition" and "Phase Flow Consistency" moved to reference file).
28
+ function contentIncludes(str) {
29
+ return skillContent.includes(str) || phaseOverviewContent.includes(str);
30
+ }
31
+ function contentSplit(str) {
32
+ // Return the part after str from whichever file contains it
33
+ if (skillContent.includes(str)) return skillContent.split(str)[1];
34
+ if (phaseOverviewContent.includes(str)) return phaseOverviewContent.split(str)[1];
35
+ return undefined;
19
36
  }
20
37
 
21
38
  function parseFrontmatter(content) {
@@ -182,21 +199,21 @@ function testPhaseFlowDiagramOrder() {
182
199
  }
183
200
 
184
201
  function testPhaseFlowConsistencySectionExists() {
185
- if (!skillContent.includes('Phase Flow Consistency')) {
186
- throw new Error('SKILL.md must contain "Phase Flow Consistency" section');
202
+ if (!contentIncludes('Phase Flow Consistency')) {
203
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Phase Flow Consistency" section');
187
204
  }
188
205
  console.log(' ✓ Phase Flow Consistency section exists');
189
206
  }
190
207
 
191
208
  function testCanonicalPhaseOrderTableExists() {
192
- if (!skillContent.includes('Canonical Phase Order')) {
193
- throw new Error('SKILL.md must contain "Canonical Phase Order" table');
209
+ if (!contentIncludes('Canonical Phase Order')) {
210
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Canonical Phase Order" table');
194
211
  }
195
212
  console.log(' ✓ Canonical Phase Order table exists');
196
213
  }
197
214
 
198
215
  function testAll11PhasesInPhaseFlowConsistency() {
199
- const section = skillContent.split('Phase Flow Consistency')[1];
216
+ const section = contentSplit('Phase Flow Consistency');
200
217
  const requiredPhases = [
201
218
  'PREP', 'DESIGN', 'BUILD', 'VERIFY', 'SHIP', 'CLOSE',
202
219
  ];
@@ -235,14 +252,14 @@ function testForceLevelsRequiresDelphi() {
235
252
  // === Value Proposition Tests ===
236
253
 
237
254
  function testUniqueValuePropositionExists() {
238
- if (!skillContent.includes('Unique Value Proposition')) {
239
- throw new Error('SKILL.md must contain "Unique Value Proposition" section');
255
+ if (!contentIncludes('Unique Value Proposition')) {
256
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Unique Value Proposition" section');
240
257
  }
241
258
  console.log(' ✓ Unique Value Proposition section exists');
242
259
  }
243
260
 
244
261
  function testUvpMentionsTokenSavings() {
245
- const section = skillContent.split('Unique Value Proposition')[1];
262
+ const section = contentSplit('Unique Value Proposition');
246
263
  if (!section.includes('40') || !section.includes('67') || !section.includes('token')) {
247
264
  throw new Error('Unique Value Proposition must mention 40-67% token savings');
248
265
  }
@@ -250,7 +267,7 @@ function testUvpMentionsTokenSavings() {
250
267
  }
251
268
 
252
269
  function testUvpMentionsHardGate() {
253
- const section = skillContent.split('Unique Value Proposition')[1];
270
+ const section = contentSplit('Unique Value Proposition');
254
271
  if (!section.includes('HARD-GATE')) {
255
272
  throw new Error('Unique Value Proposition must mention HARD-GATE discipline');
256
273
  }
@@ -258,7 +275,7 @@ function testUvpMentionsHardGate() {
258
275
  }
259
276
 
260
277
  function testUvpMentionsEmergentRequirements() {
261
- const section = skillContent.split('Unique Value Proposition')[1];
278
+ const section = contentSplit('Unique Value Proposition');
262
279
  if (!section.toLowerCase().includes('emergent')) {
263
280
  throw new Error('Unique Value Proposition must mention emergent requirements');
264
281
  }
@@ -360,7 +377,7 @@ function runTests(opts = {}) {
360
377
  }
361
378
 
362
379
  console.log(`\n=== Results: ${passed} passed, ${failed} failed ===\n`);
363
- errors.forEach(e => console.log(e));
380
+ for (const e of errors) console.log(e);
364
381
 
365
382
  if (exitOnFail && failed > 0) {
366
383
  process.exit(1);
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boyingliu01/opencode-plugin",
3
- "version": "0.14.4",
3
+ "version": "0.14.5",
4
4
  "type": "module",
5
5
  "main": "index.ts",
6
6
  "description": "XP-Gate quality gates + AI workflow skills + Sprint Flow TUI sidebar for OpenCode",
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -200,6 +200,7 @@ Every phase MUST output its header as the first line of that phase's output. For
200
200
  4. On `/sprint-flow` trigger, first line MUST output: `Sprint Flow: PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE`
201
201
  5. Each phase completion MUST write Phase Summary to `.sprint-state/phase-outputs/phase-{N}-summary.md`
202
202
  6. Each phase completion MUST update `.sprint-state/sprint-state.json`
203
+ 7. Each phase completion MUST render the ASCII progress dashboard using `templates/sprint-progress-template.md` — the orchestrator reads `sprint-state.json` and outputs the dashboard after every phase's status block, so the user always sees current global progress without needing to ask
203
204
 
204
205
  ### Phase Output Status Schema (MANDATORY per phase)
205
206
 
@@ -9,13 +9,30 @@ const path = require('path');
9
9
 
10
10
  const SKILL_MD_PATH = path.join(__dirname, '..', 'SKILL.md');
11
11
  const REFERENCES_DIR = path.join(__dirname, '..', 'references');
12
+ const PHASE_OVERVIEW_PATH = path.join(REFERENCES_DIR, 'phase-overview.md');
12
13
  const PHASE_2_BUILD_PATH = path.join(REFERENCES_DIR, 'phase-3-build.md');
13
14
  const ORCHESTRATION_RULES_PATH = path.join(REFERENCES_DIR, 'orchestration-rules.md');
14
15
 
15
16
  let skillContent = '';
17
+ let phaseOverviewContent = '';
16
18
 
17
19
  function loadSkillMd() {
18
20
  skillContent = fs.readFileSync(SKILL_MD_PATH, 'utf-8');
21
+ if (fs.existsSync(PHASE_OVERVIEW_PATH)) {
22
+ phaseOverviewContent = fs.readFileSync(PHASE_OVERVIEW_PATH, 'utf-8');
23
+ }
24
+ }
25
+
26
+ // Search across SKILL.md AND references/phase-overview.md (progressive disclosure: sections
27
+ // like "Unique Value Proposition" and "Phase Flow Consistency" moved to reference file).
28
+ function contentIncludes(str) {
29
+ return skillContent.includes(str) || phaseOverviewContent.includes(str);
30
+ }
31
+ function contentSplit(str) {
32
+ // Return the part after str from whichever file contains it
33
+ if (skillContent.includes(str)) return skillContent.split(str)[1];
34
+ if (phaseOverviewContent.includes(str)) return phaseOverviewContent.split(str)[1];
35
+ return undefined;
19
36
  }
20
37
 
21
38
  function parseFrontmatter(content) {
@@ -182,21 +199,21 @@ function testPhaseFlowDiagramOrder() {
182
199
  }
183
200
 
184
201
  function testPhaseFlowConsistencySectionExists() {
185
- if (!skillContent.includes('Phase Flow Consistency')) {
186
- throw new Error('SKILL.md must contain "Phase Flow Consistency" section');
202
+ if (!contentIncludes('Phase Flow Consistency')) {
203
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Phase Flow Consistency" section');
187
204
  }
188
205
  console.log(' ✓ Phase Flow Consistency section exists');
189
206
  }
190
207
 
191
208
  function testCanonicalPhaseOrderTableExists() {
192
- if (!skillContent.includes('Canonical Phase Order')) {
193
- throw new Error('SKILL.md must contain "Canonical Phase Order" table');
209
+ if (!contentIncludes('Canonical Phase Order')) {
210
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Canonical Phase Order" table');
194
211
  }
195
212
  console.log(' ✓ Canonical Phase Order table exists');
196
213
  }
197
214
 
198
215
  function testAll11PhasesInPhaseFlowConsistency() {
199
- const section = skillContent.split('Phase Flow Consistency')[1];
216
+ const section = contentSplit('Phase Flow Consistency');
200
217
  const requiredPhases = [
201
218
  'PREP', 'DESIGN', 'BUILD', 'VERIFY', 'SHIP', 'CLOSE',
202
219
  ];
@@ -235,14 +252,14 @@ function testForceLevelsRequiresDelphi() {
235
252
  // === Value Proposition Tests ===
236
253
 
237
254
  function testUniqueValuePropositionExists() {
238
- if (!skillContent.includes('Unique Value Proposition')) {
239
- throw new Error('SKILL.md must contain "Unique Value Proposition" section');
255
+ if (!contentIncludes('Unique Value Proposition')) {
256
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Unique Value Proposition" section');
240
257
  }
241
258
  console.log(' ✓ Unique Value Proposition section exists');
242
259
  }
243
260
 
244
261
  function testUvpMentionsTokenSavings() {
245
- const section = skillContent.split('Unique Value Proposition')[1];
262
+ const section = contentSplit('Unique Value Proposition');
246
263
  if (!section.includes('40') || !section.includes('67') || !section.includes('token')) {
247
264
  throw new Error('Unique Value Proposition must mention 40-67% token savings');
248
265
  }
@@ -250,7 +267,7 @@ function testUvpMentionsTokenSavings() {
250
267
  }
251
268
 
252
269
  function testUvpMentionsHardGate() {
253
- const section = skillContent.split('Unique Value Proposition')[1];
270
+ const section = contentSplit('Unique Value Proposition');
254
271
  if (!section.includes('HARD-GATE')) {
255
272
  throw new Error('Unique Value Proposition must mention HARD-GATE discipline');
256
273
  }
@@ -258,7 +275,7 @@ function testUvpMentionsHardGate() {
258
275
  }
259
276
 
260
277
  function testUvpMentionsEmergentRequirements() {
261
- const section = skillContent.split('Unique Value Proposition')[1];
278
+ const section = contentSplit('Unique Value Proposition');
262
279
  if (!section.toLowerCase().includes('emergent')) {
263
280
  throw new Error('Unique Value Proposition must mention emergent requirements');
264
281
  }
@@ -360,7 +377,7 @@ function runTests(opts = {}) {
360
377
  }
361
378
 
362
379
  console.log(`\n=== Results: ${passed} passed, ${failed} failed ===\n`);
363
- errors.forEach(e => console.log(e));
380
+ for (const e of errors) console.log(e);
364
381
 
365
382
  if (exitOnFail && failed > 0) {
366
383
  process.exit(1);
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xp-gate",
3
- "version": "0.14.4",
3
+ "version": "0.14.5",
4
4
  "displayName": "XP-Gate",
5
5
  "description": "Extreme Programming quality gates + AI workflow skills for Qoder. Includes 10 quality gates (Gate 0-9), Sprint Flow (11 phases), and Delphi multi-expert review (>=90% consensus).",
6
6
  "author": {
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -200,6 +200,7 @@ Every phase MUST output its header as the first line of that phase's output. For
200
200
  4. On `/sprint-flow` trigger, first line MUST output: `Sprint Flow: PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE`
201
201
  5. Each phase completion MUST write Phase Summary to `.sprint-state/phase-outputs/phase-{N}-summary.md`
202
202
  6. Each phase completion MUST update `.sprint-state/sprint-state.json`
203
+ 7. Each phase completion MUST render the ASCII progress dashboard using `templates/sprint-progress-template.md` — the orchestrator reads `sprint-state.json` and outputs the dashboard after every phase's status block, so the user always sees current global progress without needing to ask
203
204
 
204
205
  ### Phase Output Status Schema (MANDATORY per phase)
205
206
 
@@ -9,13 +9,30 @@ const path = require('path');
9
9
 
10
10
  const SKILL_MD_PATH = path.join(__dirname, '..', 'SKILL.md');
11
11
  const REFERENCES_DIR = path.join(__dirname, '..', 'references');
12
+ const PHASE_OVERVIEW_PATH = path.join(REFERENCES_DIR, 'phase-overview.md');
12
13
  const PHASE_2_BUILD_PATH = path.join(REFERENCES_DIR, 'phase-3-build.md');
13
14
  const ORCHESTRATION_RULES_PATH = path.join(REFERENCES_DIR, 'orchestration-rules.md');
14
15
 
15
16
  let skillContent = '';
17
+ let phaseOverviewContent = '';
16
18
 
17
19
  function loadSkillMd() {
18
20
  skillContent = fs.readFileSync(SKILL_MD_PATH, 'utf-8');
21
+ if (fs.existsSync(PHASE_OVERVIEW_PATH)) {
22
+ phaseOverviewContent = fs.readFileSync(PHASE_OVERVIEW_PATH, 'utf-8');
23
+ }
24
+ }
25
+
26
+ // Search across SKILL.md AND references/phase-overview.md (progressive disclosure: sections
27
+ // like "Unique Value Proposition" and "Phase Flow Consistency" moved to reference file).
28
+ function contentIncludes(str) {
29
+ return skillContent.includes(str) || phaseOverviewContent.includes(str);
30
+ }
31
+ function contentSplit(str) {
32
+ // Return the part after str from whichever file contains it
33
+ if (skillContent.includes(str)) return skillContent.split(str)[1];
34
+ if (phaseOverviewContent.includes(str)) return phaseOverviewContent.split(str)[1];
35
+ return undefined;
19
36
  }
20
37
 
21
38
  function parseFrontmatter(content) {
@@ -182,21 +199,21 @@ function testPhaseFlowDiagramOrder() {
182
199
  }
183
200
 
184
201
  function testPhaseFlowConsistencySectionExists() {
185
- if (!skillContent.includes('Phase Flow Consistency')) {
186
- throw new Error('SKILL.md must contain "Phase Flow Consistency" section');
202
+ if (!contentIncludes('Phase Flow Consistency')) {
203
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Phase Flow Consistency" section');
187
204
  }
188
205
  console.log(' ✓ Phase Flow Consistency section exists');
189
206
  }
190
207
 
191
208
  function testCanonicalPhaseOrderTableExists() {
192
- if (!skillContent.includes('Canonical Phase Order')) {
193
- throw new Error('SKILL.md must contain "Canonical Phase Order" table');
209
+ if (!contentIncludes('Canonical Phase Order')) {
210
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Canonical Phase Order" table');
194
211
  }
195
212
  console.log(' ✓ Canonical Phase Order table exists');
196
213
  }
197
214
 
198
215
  function testAll11PhasesInPhaseFlowConsistency() {
199
- const section = skillContent.split('Phase Flow Consistency')[1];
216
+ const section = contentSplit('Phase Flow Consistency');
200
217
  const requiredPhases = [
201
218
  'PREP', 'DESIGN', 'BUILD', 'VERIFY', 'SHIP', 'CLOSE',
202
219
  ];
@@ -235,14 +252,14 @@ function testForceLevelsRequiresDelphi() {
235
252
  // === Value Proposition Tests ===
236
253
 
237
254
  function testUniqueValuePropositionExists() {
238
- if (!skillContent.includes('Unique Value Proposition')) {
239
- throw new Error('SKILL.md must contain "Unique Value Proposition" section');
255
+ if (!contentIncludes('Unique Value Proposition')) {
256
+ throw new Error('SKILL.md or references/phase-overview.md must contain "Unique Value Proposition" section');
240
257
  }
241
258
  console.log(' ✓ Unique Value Proposition section exists');
242
259
  }
243
260
 
244
261
  function testUvpMentionsTokenSavings() {
245
- const section = skillContent.split('Unique Value Proposition')[1];
262
+ const section = contentSplit('Unique Value Proposition');
246
263
  if (!section.includes('40') || !section.includes('67') || !section.includes('token')) {
247
264
  throw new Error('Unique Value Proposition must mention 40-67% token savings');
248
265
  }
@@ -250,7 +267,7 @@ function testUvpMentionsTokenSavings() {
250
267
  }
251
268
 
252
269
  function testUvpMentionsHardGate() {
253
- const section = skillContent.split('Unique Value Proposition')[1];
270
+ const section = contentSplit('Unique Value Proposition');
254
271
  if (!section.includes('HARD-GATE')) {
255
272
  throw new Error('Unique Value Proposition must mention HARD-GATE discipline');
256
273
  }
@@ -258,7 +275,7 @@ function testUvpMentionsHardGate() {
258
275
  }
259
276
 
260
277
  function testUvpMentionsEmergentRequirements() {
261
- const section = skillContent.split('Unique Value Proposition')[1];
278
+ const section = contentSplit('Unique Value Proposition');
262
279
  if (!section.toLowerCase().includes('emergent')) {
263
280
  throw new Error('Unique Value Proposition must mention emergent requirements');
264
281
  }
@@ -360,7 +377,7 @@ function runTests(opts = {}) {
360
377
  }
361
378
 
362
379
  console.log(`\n=== Results: ${passed} passed, ${failed} failed ===\n`);
363
- errors.forEach(e => console.log(e));
380
+ for (const e of errors) console.log(e);
364
381
 
365
382
  if (exitOnFail && failed > 0) {
366
383
  process.exit(1);
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-09
4
- **Commit:** 8408ba6
5
- **Branch:** sprint/2026-07-09-01
6
- **Version:** 0.14.4.0
4
+ **Commit:** b1d2c76
5
+ **Branch:** sprint/2026-07-09-02
6
+ **Version:** 0.14.5.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.