diff --git a/scope/epics/3darch-ep-1/features.md b/scope/epics/3darch-ep-1/features.md new file mode 100644 index 0000000..ddd9225 --- /dev/null +++ b/scope/epics/3darch-ep-1/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-1 Features" +description: "Review Features governed by 3DARCH-EP-1." +--- + +# Review 3DARCH-EP-1 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-1 boundary](../3darch-ep-1.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-10/features.md b/scope/epics/3darch-ep-10/features.md new file mode 100644 index 0000000..1ec0d99 --- /dev/null +++ b/scope/epics/3darch-ep-10/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-10 Features" +description: "Review Features governed by 3DARCH-EP-10." +--- + +# Review 3DARCH-EP-10 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-10 boundary](../3darch-ep-10.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-2/features.md b/scope/epics/3darch-ep-2/features.md new file mode 100644 index 0000000..0550d33 --- /dev/null +++ b/scope/epics/3darch-ep-2/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-2 Features" +description: "Review Features governed by 3DARCH-EP-2." +--- + +# Review 3DARCH-EP-2 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-2 boundary](../3darch-ep-2.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-3/features.md b/scope/epics/3darch-ep-3/features.md new file mode 100644 index 0000000..a39fa2e --- /dev/null +++ b/scope/epics/3darch-ep-3/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-3 Features" +description: "Review Features governed by 3DARCH-EP-3." +--- + +# Review 3DARCH-EP-3 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-3 boundary](../3darch-ep-3.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-4/features.md b/scope/epics/3darch-ep-4/features.md new file mode 100644 index 0000000..7b1a910 --- /dev/null +++ b/scope/epics/3darch-ep-4/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-4 Features" +description: "Review Features governed by 3DARCH-EP-4." +--- + +# Review 3DARCH-EP-4 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-4 boundary](../3darch-ep-4.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-5/features.md b/scope/epics/3darch-ep-5/features.md new file mode 100644 index 0000000..5f0431f --- /dev/null +++ b/scope/epics/3darch-ep-5/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-5 Features" +description: "Review Features governed by 3DARCH-EP-5." +--- + +# Review 3DARCH-EP-5 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-5 boundary](../3darch-ep-5.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-6/features.md b/scope/epics/3darch-ep-6/features.md new file mode 100644 index 0000000..59622bc --- /dev/null +++ b/scope/epics/3darch-ep-6/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-6 Features" +description: "Review Features governed by 3DARCH-EP-6." +--- + +# Review 3DARCH-EP-6 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-6 boundary](../3darch-ep-6.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-7/features.md b/scope/epics/3darch-ep-7/features.md new file mode 100644 index 0000000..df26636 --- /dev/null +++ b/scope/epics/3darch-ep-7/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-7 Features" +description: "Review Features governed by 3DARCH-EP-7." +--- + +# Review 3DARCH-EP-7 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-7 boundary](../3darch-ep-7.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-8/features.md b/scope/epics/3darch-ep-8/features.md new file mode 100644 index 0000000..c94bdda --- /dev/null +++ b/scope/epics/3darch-ep-8/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-8 Features" +description: "Review Features governed by 3DARCH-EP-8." +--- + +# Review 3DARCH-EP-8 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-8 boundary](../3darch-ep-8.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scope/epics/3darch-ep-9/features.md b/scope/epics/3darch-ep-9/features.md new file mode 100644 index 0000000..67fdc6c --- /dev/null +++ b/scope/epics/3darch-ep-9/features.md @@ -0,0 +1,8 @@ +--- +title: "3DARCH-EP-9 Features" +description: "Review Features governed by 3DARCH-EP-9." +--- + +# Review 3DARCH-EP-9 Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [3DARCH-EP-9 boundary](../3darch-ep-9.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. diff --git a/scripts/generate-scope.mjs b/scripts/generate-scope.mjs index 02b2f3d..8692a9a 100644 --- a/scripts/generate-scope.mjs +++ b/scripts/generate-scope.mjs @@ -66,6 +66,16 @@ The approved catalogue was mined from legacy revision \`${epic.legacy_revision}\ ${evidenceList(epic)} `; +const featuresPage = (epic) => `--- +title: "${epic.id} Features" +description: "Review Features governed by ${epic.id}." +--- + +# Review ${epic.id} Features + +No child Features have been defined or approved for this Epic. Feature discovery must preserve the [${epic.id} boundary](../${epic.id.toLowerCase()}.md) and requires a separate human **Approved for Solution** decision before Architecture solution work begins. +`; + const epicLinks = records.map((epic) => `- [${epic.id} — ${epic.title}](./${epic.id.toLowerCase()}.md)`).join('\n'); const epicIndex = `--- title: "Epics" @@ -110,6 +120,7 @@ const expected = new Map([ [join(root, 'scope/roadmap.md'), roadmap], [join(root, 'src/data/scopeIssues.ts'), ts], ...records.map((epic) => [join(root, `scope/epics/${epic.id.toLowerCase()}.md`), epicPage(epic)]), + ...records.map((epic) => [join(root, `scope/epics/${epic.id.toLowerCase()}/features.md`), featuresPage(epic)]), ]); let stale = false; diff --git a/sidebarsScope.ts b/sidebarsScope.ts index 1eb1999..fb0b1f0 100644 --- a/sidebarsScope.ts +++ b/sidebarsScope.ts @@ -16,7 +16,7 @@ const sidebars: SidebarsConfig = { type: 'category' as const, label: id.toUpperCase(), link: {type: 'doc' as const, id: `epics/${id}`}, - items: [{type: 'category' as const, label: 'Features', items: []}], + items: [{type: 'category' as const, label: 'Features', link: {type: 'doc' as const, id: `epics/${id}/features`}, items: []}], })), }, ], diff --git a/tests/portal-contract.test.mjs b/tests/portal-contract.test.mjs index 72ee431..797d45b 100644 --- a/tests/portal-contract.test.mjs +++ b/tests/portal-contract.test.mjs @@ -41,6 +41,7 @@ test('approved Epic catalogue is complete, governed, and reader-linked', () => { const slug = id.toLowerCase(); assert.ok(existsSync(`data/scope/epics/${slug}.yml`), id); assert.ok(existsSync(`scope/epics/${slug}.md`), id); + assert.ok(existsSync(`scope/epics/${slug}/features.md`), `${id} Features group`); const record = JSON.parse(read(`data/scope/epics/${slug}.yml`)); assert.equal(record.id, id); assert.equal(record.status, 'IN_BACKLOG');