+ Issue Status Matrix
+ {visible.length} of {scopeIssues.length} governed records shown · Epic: {scopeIssues.filter((item) => item.type === 'Epic').length} · IN_BACKLOG: {scopeIssues.filter((item) => item.status === 'IN_BACKLOG').length}
+
+
+
+
+
+
+
+ Complete governed Scope record matrix
+ | ID and title | Type | Parent | Status | Authority | Blocked | Owner | Approval gate | Required children | Dependencies | Transition evidence |
+ {visible.map((item) =>
+ {item.id} {item.title} |
+ {item.type} | {item.parent} | {item.status} | {item.statusSource} |
+ {item.blocked ? 'Yes' : 'No'} | {item.owner} | {item.approval} | {item.requiredChildren} | {item.dependencies} |
+ Decision ↗ |
+
)}
+
+
+ {visible.length === 0 && No governed records match these filters.
}
+ ;
+}
diff --git a/src/css/custom.css b/src/css/custom.css
index aaf3de9..dea2ae8 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -1 +1,2 @@
-:root{--ifm-color-primary:#176b87;--ifm-color-primary-dark:#155f79;--ifm-color-primary-darker:#135970;--ifm-color-primary-darkest:#10495c;--ifm-color-primary-light:#197797;--ifm-color-primary-lighter:#1b7d9e;--ifm-color-primary-lightest:#1f8db2;--ifm-global-radius:0;--ifm-code-border-radius:0;--ifm-button-border-radius:0;--ifm-font-family-base:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--ifm-font-family-monospace:"IBM Plex Mono",ui-monospace,SFMono-Regular,Consolas,monospace}[data-theme='dark']{--ifm-color-primary:#5eead4;--ifm-background-color:#090d17;--ifm-background-surface-color:#111827;--ifm-color-content:#e5edf7;--ifm-color-content-secondary:#aebdd0}.navbar{box-shadow:none;border-bottom:1px solid var(--ifm-color-emphasis-300)}*,*::before,*::after{border-radius:0!important}.button{font-weight:700}.footer{border-top:4px solid #4fd1c5}.theme-doc-sidebar-container{border-right-color:var(--ifm-color-emphasis-300)!important}.navbar__items{gap:.1rem}.navbar__link{font-size:.82rem}@media(max-width:1200px){.navbar__title{display:none}.navbar__link{font-size:.76rem;padding:.25rem}}
\ No newline at end of file
+:root{--ifm-color-primary:#176b87;--ifm-color-primary-dark:#155f79;--ifm-color-primary-darker:#135970;--ifm-color-primary-darkest:#10495c;--ifm-color-primary-light:#197797;--ifm-color-primary-lighter:#1b7d9e;--ifm-color-primary-lightest:#1f8db2;--ifm-global-radius:0;--ifm-code-border-radius:0;--ifm-button-border-radius:0;--ifm-font-family-base:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--ifm-font-family-monospace:"IBM Plex Mono",ui-monospace,SFMono-Regular,Consolas,monospace}[data-theme='dark']{--ifm-color-primary:#5eead4;--ifm-background-color:#090d17;--ifm-background-surface-color:#111827;--ifm-color-content:#e5edf7;--ifm-color-content-secondary:#aebdd0}.navbar{box-shadow:none;border-bottom:1px solid var(--ifm-color-emphasis-300)}*,*::before,*::after{border-radius:0!important}.button{font-weight:700}.footer{border-top:4px solid #4fd1c5}.theme-doc-sidebar-container{border-right-color:var(--ifm-color-emphasis-300)!important}.navbar__items{gap:.1rem}.navbar__link{font-size:.82rem}@media(max-width:1200px){.navbar__title{display:none}.navbar__link{font-size:.76rem;padding:.25rem}}
+.scope-matrix__filters{display:grid;grid-template-columns:minmax(14rem,2fr) minmax(9rem,1fr) minmax(11rem,1fr);gap:1rem;margin:1rem 0}.scope-matrix__filters label{display:grid;gap:.35rem;font-weight:700}.scope-matrix__filters input,.scope-matrix__filters select{border:1px solid var(--ifm-color-emphasis-400);background:var(--ifm-background-color);color:var(--ifm-font-color-base);font:inherit;padding:.55rem}.scope-matrix__table-wrap{overflow-x:auto}.scope-matrix table{min-width:82rem}.scope-matrix th{white-space:nowrap}.scope-matrix td{vertical-align:top}.scope-matrix code{white-space:nowrap}.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}@media(max-width:760px){.scope-matrix__filters{grid-template-columns:1fr}}
\ No newline at end of file
diff --git a/src/data/scopeIssues.ts b/src/data/scopeIssues.ts
new file mode 100644
index 0000000..d63f289
--- /dev/null
+++ b/src/data/scopeIssues.ts
@@ -0,0 +1,154 @@
+// Generated by scripts/generate-scope.mjs from data/scope/epics/*.yml. Do not edit.
+export type ScopeIssue = {id:string; type:string; title:string; parent:string; status:string; statusSource:string; blocked:boolean; owner:string; approval:string; requiredChildren:string; dependencies:string; evidenceUrl:string; recordUrl:string};
+export const scopeIssues: ScopeIssue[] = [
+ {
+ "id": "3DARCH-EP-1",
+ "type": "Epic",
+ "title": "Engineering Platform, Quality, and Operability",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-1/"
+ },
+ {
+ "id": "3DARCH-EP-2",
+ "type": "Epic",
+ "title": "Secure Access and Personal Setup",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-2/"
+ },
+ {
+ "id": "3DARCH-EP-3",
+ "type": "Epic",
+ "title": "Navigate and Explore the Virtual Workplace",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-3/"
+ },
+ {
+ "id": "3DARCH-EP-4",
+ "type": "Epic",
+ "title": "Experience Live Co-Presence",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-4/"
+ },
+ {
+ "id": "3DARCH-EP-5",
+ "type": "Epic",
+ "title": "Communicate in Spatial Context",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-5/"
+ },
+ {
+ "id": "3DARCH-EP-6",
+ "type": "Epic",
+ "title": "Coordinate Shared Workplace Seating",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-6/"
+ },
+ {
+ "id": "3DARCH-EP-7",
+ "type": "Epic",
+ "title": "Generate a Furnished 3D Apartment from a Brief",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-7/"
+ },
+ {
+ "id": "3DARCH-EP-8",
+ "type": "Epic",
+ "title": "Review and Walk Through a Generated Design",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-8/"
+ },
+ {
+ "id": "3DARCH-EP-9",
+ "type": "Epic",
+ "title": "Refine a Design Through Natural-Language Changes",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-9/"
+ },
+ {
+ "id": "3DARCH-EP-10",
+ "type": "Epic",
+ "title": "Reopen and Continue Previous Design Projects",
+ "parent": "—",
+ "status": "IN_BACKLOG",
+ "statusSource": "EXACT",
+ "blocked": false,
+ "owner": "3D Architecture Wizzard team",
+ "approval": "Not approved for Solution",
+ "requiredChildren": "None defined",
+ "dependencies": "None recorded",
+ "evidenceUrl": "https://discord.com/channels/1518726359512387766/1543925247361814568/1544641572975673394",
+ "recordUrl": "/scope/epics/3darch-ep-10/"
+ }
+];
diff --git a/tests/portal-contract.test.mjs b/tests/portal-contract.test.mjs
index 5c7cfa5..72ee431 100644
--- a/tests/portal-contract.test.mjs
+++ b/tests/portal-contract.test.mjs
@@ -25,3 +25,29 @@ test('sharp light and dark UI contract is explicit', () => {
assert.match(css, /\*,\*::before,\*::after\{border-radius:0!important\}/);
assert.match(css, /\[data-theme='dark'\]/);
});
+
+test('approved Epic catalogue is complete, governed, and reader-linked', () => {
+ const sidebar = read('sidebarsScope.ts');
+ const overview = read('scope/overview.md');
+ const roadmap = read('scope/roadmap.md');
+ const matrix = read('src/data/scopeIssues.ts');
+ assert.ok(sidebar.indexOf("'overview'") < sidebar.indexOf("'roadmap'"));
+ assert.ok(sidebar.indexOf("label: 'Ideas'") < sidebar.indexOf("label: 'Questions'"));
+ assert.ok(sidebar.indexOf("label: 'Questions'") < sidebar.indexOf("label: 'Epics'"));
+ assert.match(overview, /