diff --git a/docs/strategy/measurement.mdx b/docs/strategy/measurement.mdx
index eb5383e..81f3f0e 100644
--- a/docs/strategy/measurement.mdx
+++ b/docs/strategy/measurement.mdx
@@ -1,7 +1,7 @@
---
id: measurement
title: Skills Measurement
-sidebar_label: Skills Measurement
+sidebar_label: Measurement
description: Which KPIs to collect during skills adoption, where the evidence comes from, how to calculate them and when to report.
hide_table_of_contents: true
---
diff --git a/docs/strategy/roadmap.mdx b/docs/strategy/roadmap.mdx
index 0f21175..512b060 100644
--- a/docs/strategy/roadmap.mdx
+++ b/docs/strategy/roadmap.mdx
@@ -68,6 +68,6 @@ Stage 2 builds on proven skills, measurements and working practices—not permis
-**Next:** [Return to the strategy destination →](./target-operating-model.mdx)
+**Next:** [Stage - 01 - Skills Adoption →](./stage-01-skills-adoption.mdx)
diff --git a/docs/strategy/skills-maintenance.mdx b/docs/strategy/skills-maintenance.mdx
index 3a546d6..1456f5e 100644
--- a/docs/strategy/skills-maintenance.mdx
+++ b/docs/strategy/skills-maintenance.mdx
@@ -44,6 +44,6 @@ Owner ratification is required before adoption. Review earlier after incidents o
-**Next:** [Use exit evidence to choose the next rollout stage →](./roadmap.mdx)
+**Next:** [Stage - 02 - Autonomous Agent →](./stage-02-autonomous-agent.mdx)
diff --git a/docs/strategy/stage-01-skills-adoption.mdx b/docs/strategy/stage-01-skills-adoption.mdx
new file mode 100644
index 0000000..6929a93
--- /dev/null
+++ b/docs/strategy/stage-01-skills-adoption.mdx
@@ -0,0 +1,36 @@
+---
+id: stage-01-skills-adoption
+title: Stage - 01 - Skills Adoption
+description: Build proven skills and measurable working practices through human and AI Agent collaboration, starting with Delivery.
+hide_table_of_contents: true
+---
+
+
+
+**Human + AI Agent → proven skills and working practices → future Autonomous Agent.**
+
+This first stage of the [Roadmap](./roadmap.mdx) standardizes skills in real human + AI Agent work. It builds the foundation for [Target](./target-operating-model.mdx), while people direct the work, verify outcomes and improve the skills.
+
+## Delivery first
+
+Start with the engineering path: codebase structure and existing principles → system-logic source → tests → builds and packaging → deployments. Understand actual practices, tooling, controls and problems before changing them.
+
+Adoption then extends to other SDLC phases; their order is not yet decided. Delivery keeps improving as adoption expands.
+
+## Repeat within each phase
+
+**Understand the current situation → establish KPIs and a baseline → engineer skills topology → use skills in real work → collect metrics and feedback → understand the new current situation → repeat.**
+
+Skills topology connects what skills exist, how they relate, when they are used and how they work together. Compare accepted outcomes, quality, cost and review effort with the baseline; use friction and feedback to revise the skills and working practices. These are repeating steps within each phase, not additional roadmap stages.
+
+## Put the foundation into practice
+
+- [Governance](./skills-governance.mdx) — define ownership, authority and approval of skills.
+- [Quality](./skills-quality.mdx) — qualify skills and verify their outcomes before wider use.
+- [Adoption](./skills-adoption.mdx) — coach bounded workflows with a supported client and a manual path.
+- [Measurement](./measurement.mdx) — establish KPIs, collect evidence and compare outcomes with the baseline.
+- [Maintenance](./skills-maintenance.mdx) — review feedback, control versions and recover from unsafe updates.
+
+Proven skills, measurements and working practices support [Stage - 02 - Autonomous Agent](./stage-02-autonomous-agent.mdx); adoption alone does not grant autonomous execution authority.
+
+
diff --git a/docs/strategy/stage-02-autonomous-agent.mdx b/docs/strategy/stage-02-autonomous-agent.mdx
new file mode 100644
index 0000000..c7d4df8
--- /dev/null
+++ b/docs/strategy/stage-02-autonomous-agent.mdx
@@ -0,0 +1,24 @@
+---
+id: stage-02-autonomous-agent
+title: Stage - 02 - Autonomous Agent
+description: Introduce the future Autonomous Agent on proven skills and measured practices while humans retain direction and review.
+hide_table_of_contents: true
+---
+
+
+
+**Proven skills and measured practices → future Autonomous Agent → human-directed SDLC.**
+
+This future stage of the [Roadmap](./roadmap.mdx) builds on [Stage - 01 - Skills Adoption](./stage-01-skills-adoption.mdx). The destination is [Target](./target-operating-model.mdx): an Autonomous Agent that executes and governs the SDLC cycle, with humans retaining direction and review.
+
+## Build on what has been proven
+
+Carry forward proven skills, measurements and working practices from real human + AI Agent work. The skills foundation provides [governance](./skills-governance.mdx), [quality checks](./skills-quality.mdx), [adoption feedback](./skills-adoption.mdx), [measurement](./measurement.mdx) and [maintenance](./skills-maintenance.mdx); it is not permission to expand authority automatically.
+
+## Introduce authority deliberately
+
+Establish reliable observation and evidence assembly, then proposing and routing work, before granting scoped execution authority. The Roadmap describes recommended controls and hold conditions, including exact-artifact approvals, independent review, recovery and human takeover. Sensitive decisions remain human; missing evidence never means permission.
+
+This is future direction, not deployed autonomy, agreed delivery dates or approved KPI thresholds. The transition depends on reviewed evidence and explicit authority decisions, not adoption volume alone.
+
+
diff --git a/docs/strategy/target-operating-model.mdx b/docs/strategy/target-operating-model.mdx
index 1ebf1c1..7365911 100644
--- a/docs/strategy/target-operating-model.mdx
+++ b/docs/strategy/target-operating-model.mdx
@@ -162,6 +162,6 @@ Success means accepted outcomes with maintained quality, controlled risk and und
-**Next:** [Decide who owns and approves each skill →](./skills-governance.mdx)
+**Next:** [Follow the Roadmap toward Target →](./roadmap.mdx)
diff --git a/package.json b/package.json
index df229ac..510cb82 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"verify:build": "node scripts/verify.mjs --build",
"diagrams:build": "node scripts/build-diagrams.mjs",
"test": "node --test scripts/*.test.mjs",
- "test:browser": "node scripts/browser/strategy-story.cjs && node scripts/browser/inline-controls.cjs && node scripts/browser/sdlc-cycle.cjs && node scripts/browser/target-midpoints.cjs && node scripts/browser/skills-measurement.cjs && node scripts/browser/roadmap.cjs && node scripts/browser/roadmap-timeline.cjs",
+ "test:browser": "node scripts/browser/strategy-navigation.cjs && node scripts/browser/strategy-story.cjs && node scripts/browser/inline-controls.cjs && node scripts/browser/sdlc-cycle.cjs && node scripts/browser/target-midpoints.cjs && node scripts/browser/skills-measurement.cjs && node scripts/browser/roadmap.cjs && node scripts/browser/roadmap-timeline.cjs",
"kpi:example": "node scripts/ai-kpi.mjs"
},
"dependencies": {
diff --git a/scripts/browser/inline-controls.cjs b/scripts/browser/inline-controls.cjs
index 5d4f2e6..9ebd291 100644
--- a/scripts/browser/inline-controls.cjs
+++ b/scripts/browser/inline-controls.cjs
@@ -125,9 +125,9 @@ const fs = require('node:fs');
await page.screenshot({path:`${output}/${width}.png`, fullPage:true});
await frame.locator('#btn-theme').click(); await theme('dark');
// Exercise keyboard navigation without racing the portal's smooth scroll.
- await page.locator('.strategy-content a[href$="/strategy/skills-governance/"]').filter({visible:true}).focus();
+ await page.locator('.strategy-content a[href$="/strategy/roadmap/"]').filter({visible:true}).focus();
await page.keyboard.press('Enter');
- await page.waitForURL('**/strategy/skills-governance/');
+ await page.waitForURL('**/strategy/roadmap/');
await page.goBack({waitUntil:'domcontentloaded'});
await page.waitForURL('**/strategy/target-operating-model/');
await page.getByRole('heading', {name:'Target operating model', exact:true, level:1}).waitFor();
diff --git a/scripts/browser/sdlc-cycle.cjs b/scripts/browser/sdlc-cycle.cjs
index 74d4f3c..dc989fd 100644
--- a/scripts/browser/sdlc-cycle.cjs
+++ b/scripts/browser/sdlc-cycle.cjs
@@ -23,7 +23,7 @@ const fs = require('node:fs');
if (width < 700) await page.getByRole('button', {name:'Toggle navigation bar'}).click();
const menu = page.locator('.theme-doc-sidebar-menu .menu__link').filter({visible:true});
await menu.first().waitFor({state:'visible'});
- assert.deepEqual(await menu.allTextContents(), ['Target', 'Roadmap', 'Skills governance', 'Skills quality', 'Skills adoption', 'Skills Measurement', 'Skills maintenance']);
+ assert.deepEqual(await menu.allTextContents(), ['Target', 'Roadmap', 'Stage - 01 - Skills Adoption', 'Stage - 02 - Autonomous Agent']);
assert((await menu.nth(0).getAttribute('href')).endsWith('/strategy/target-operating-model/'));
assert((await menu.nth(1).getAttribute('href')).endsWith('/strategy/roadmap/'));
assert.equal(await menu.filter({hasText:/^Target$/}).count(), 1);
diff --git a/scripts/browser/skills-measurement.cjs b/scripts/browser/skills-measurement.cjs
index ab438b5..62a4747 100644
--- a/scripts/browser/skills-measurement.cjs
+++ b/scripts/browser/skills-measurement.cjs
@@ -22,7 +22,7 @@ const fs = require('node:fs');
if (width < 700) await page.getByRole('button', {name:'Toggle navigation bar'}).click();
const menu = page.locator('.theme-doc-sidebar-menu .menu__link').filter({visible:true});
await menu.first().waitFor({state:'visible'});
- assert.deepEqual(await menu.allTextContents(), ['Target','Roadmap','Skills governance','Skills quality','Skills adoption','Skills Measurement','Skills maintenance']);
+ assert.deepEqual(await menu.allTextContents(), ['Target','Roadmap','Stage - 01 - Skills Adoption','Governance','Quality','Adoption','Measurement','Maintenance','Stage - 02 - Autonomous Agent']);
if (width < 700) await page.getByRole('button', {name:'Close navigation bar'}).click();
const panel = page.locator('.archify-panel--story');
const iframe = panel.locator(width > 700 ? '.story-desktop' : '.story-mobile');
diff --git a/scripts/browser/strategy-navigation.cjs b/scripts/browser/strategy-navigation.cjs
new file mode 100644
index 0000000..e4d679e
--- /dev/null
+++ b/scripts/browser/strategy-navigation.cjs
@@ -0,0 +1,83 @@
+const {chromium} = require('playwright');
+const assert = require('node:assert/strict');
+const fs = require('node:fs');
+(async () => {
+ const base = process.argv[2] || 'http://127.0.0.1:4173';
+ const output = `.cache/strategy-navigation-${process.argv[3] || 'local'}`;
+ fs.mkdirSync(output, {recursive:true});
+ const prefix = '/eldorado-v1/documentation/strategy/';
+ const first = 'Stage - 01 - Skills Adoption';
+ const second = 'Stage - 02 - Autonomous Agent';
+ const topics = ['Governance','Quality','Adoption','Measurement','Maintenance'];
+ const ids = ['target-operating-model','roadmap','stage-01-skills-adoption','skills-governance','skills-quality','skills-adoption','measurement','skills-maintenance','stage-02-autonomous-agent'];
+ const titles = ['Target','Roadmap',first,'Skills governance','Skills quality','Skills adoption','Skills Measurement','Skills maintenance',second];
+ const browser = await chromium.launch({headless:true, executablePath:process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE, args:['--no-sandbox']});
+ const results = [];
+ try {
+ for (const width of [1440,1024,390,320]) {
+ const context = await browser.newContext({viewport:{width,height:900}, colorScheme:'light'});
+ try {
+ const page = await context.newPage();
+ const errors = [];
+ page.on('pageerror', error => errors.push(error.message));
+ const openMenu = async () => {
+ if (width < 997) await page.getByRole('button', {name:'Toggle navigation bar'}).click();
+ const menu = page.locator('.theme-doc-sidebar-menu').filter({visible:true});
+ await menu.locator('.menu__link').first().waitFor({state:'visible'});
+ return menu;
+ };
+ const closeMenu = async () => {
+ if (width < 997) await page.getByRole('button', {name:'Close navigation bar'}).click();
+ };
+ assert.equal((await page.goto(`${base}${prefix}roadmap/`, {waitUntil:'networkidle'})).status(), 200);
+ let menu = await openMenu();
+ const visibleLabels = () => menu.locator('.menu__link').filter({visible:true}).allTextContents();
+ assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,second]);
+ const category = menu.locator('.theme-doc-sidebar-item-category').filter({has:page.getByRole('link', {name:first, exact:true})});
+ const caret = category.locator('button.menu__caret');
+ await caret.click();
+ await category.getByRole('link', {name:'Governance', exact:true}).waitFor({state:'visible'});
+ assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,...topics,second]);
+ assert.deepEqual(await category.locator('ul .menu__link').allTextContents(), topics);
+ await page.screenshot({path:`${output}/${width}-expanded.png`, animations:'disabled'});
+ await caret.click();
+ await category.getByRole('link', {name:'Governance', exact:true}).waitFor({state:'hidden'});
+ assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,second]);
+ await menu.getByRole('link', {name:first, exact:true}).click();
+ await page.waitForURL(`${base}${prefix}stage-01-skills-adoption/`);
+ await page.getByRole('heading', {level:1, name:first, exact:true}).waitFor();
+ assert.equal(await page.locator('h1').innerText(), first);
+ assert((await page.locator('article').innerText()).includes('Delivery first'));
+ assert(!await page.evaluate(() => document.documentElement.scrollWidth > innerWidth));
+ await page.screenshot({path:`${output}/${width}-stage-01.png`, fullPage:true, animations:'disabled'});
+ for (const [index, id] of ids.entries()) {
+ assert.equal((await page.goto(`${base}${prefix}${id}/`, {waitUntil:'networkidle'})).status(), 200);
+ assert.equal(new URL(page.url()).pathname, `${prefix}${id}/`);
+ // Target has a longer canonical page heading but keeps its short navigation label.
+ if (index) assert.equal(await page.locator('h1').innerText(), titles[index]);
+ else assert((await page.locator('h1').innerText()).includes('Target'));
+ const prev = page.locator('.pagination-nav__link--prev');
+ const next = page.locator('.pagination-nav__link--next');
+ if (index) assert.equal(await prev.getAttribute('href'), `${prefix}${ids[index-1]}/`);
+ else assert.equal(await prev.count(), 0);
+ if (index < ids.length-1) assert.equal(await next.getAttribute('href'), `${prefix}${ids[index+1]}/`);
+ else assert.equal(await next.count(), 0);
+ if (index >= 3 && index <= 7) {
+ assert.equal(await page.locator('.breadcrumbs a').filter({hasText:first}).getAttribute('href'), `${prefix}stage-01-skills-adoption/`);
+ menu = await openMenu();
+ assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,...topics,second]);
+ await closeMenu();
+ }
+ assert(!await page.evaluate(() => document.documentElement.scrollWidth > innerWidth), `${width}: overflow on ${id}`);
+ }
+ assert((await page.locator('article').innerText()).includes('not deployed autonomy'));
+ await page.screenshot({path:`${output}/${width}-stage-02.png`, fullPage:true, animations:'disabled'});
+ assert.deepEqual(errors, []);
+ results.push({width, routes:ids.length, linkedCategory:true, expandCollapse:true, nesting:true, breadcrumbs:true, pagination:true, overflow:false, errors});
+ fs.writeFileSync(`${output}/results.json`, JSON.stringify(results,null,2));
+ } finally {await context.close();}
+ }
+ assert.equal(results.length, 4);
+ console.log('PASS: 4 desktop/mobile viewports; all 9 routes; linked category, expand/collapse, unique nested labels, breadcrumbs, next/previous and no overflow/errors');
+ } finally {await browser.close();}
+})().catch(error => {console.error(error); process.exitCode = 1;});
diff --git a/scripts/sdlc-cycle.test.mjs b/scripts/sdlc-cycle.test.mjs
index dcc6ce5..42baa8d 100644
--- a/scripts/sdlc-cycle.test.mjs
+++ b/scripts/sdlc-cycle.test.mjs
@@ -5,7 +5,7 @@ const read = p => readFileSync(p, 'utf8');
const stages = ['Scope', 'Architecture', 'UI/UX', 'Planning', 'Delivery', 'UAT', 'Security', 'Releases'];
test('Strategy opens at the canonical autonomous lifecycle', () => {
- assert.match(read('sidebars/strategy.ts'), /strategySidebar: \['target-operating-model', 'roadmap'/);
+ assert.match(read('sidebars/strategy.ts'), /strategySidebar:\s*\[\s*'target-operating-model',\s*'roadmap'/);
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Target$/m);
for (const id of ['target-operating-model']) {
const page = read(`docs/strategy/${id}.mdx`);
diff --git a/scripts/skills-measurement.test.mjs b/scripts/skills-measurement.test.mjs
index 51d2165..baa0d6e 100644
--- a/scripts/skills-measurement.test.mjs
+++ b/scripts/skills-measurement.test.mjs
@@ -6,7 +6,7 @@ const read = path => readFileSync(path, 'utf8');
test('Skills Measurement is an open adoption collection plan, not a hidden catalogue', () => {
const page = read('docs/strategy/measurement.mdx');
- assert.match(page, /title: Skills Measurement\nsidebar_label: Skills Measurement/);
+ assert.match(page, /title: Skills Measurement\nsidebar_label: Measurement/);
for (const heading of ['Establish the baseline', 'Measure the pilot', 'Extend collection as adoption grows', 'Keep the collection running']) assert(page.includes(heading), heading);
assert(!page.includes(''));
assert(page.includes('./reference/measurement-contracts.mdx'));
diff --git a/scripts/strategy-navigation.test.mjs b/scripts/strategy-navigation.test.mjs
index 1757fc0..9a68aea 100644
--- a/scripts/strategy-navigation.test.mjs
+++ b/scripts/strategy-navigation.test.mjs
@@ -1,17 +1,46 @@
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {readFileSync, existsSync} from 'node:fs';
+import {runInNewContext} from 'node:vm';
+import ts from 'typescript';
const read = p => readFileSync(p, 'utf8');
-test('Strategy has one canonical Target, then Roadmap, without a landing menu duplicate', () => {
- const sidebar = read('sidebars/strategy.ts').split('strategySidebar: [')[1].split(']')[0];
- const ids = [...sidebar.matchAll(/'([^']+)'/g)].map(match => match[1]);
- assert.deepEqual(ids, ['target-operating-model', 'roadmap', 'skills-governance', 'skills-quality', 'skills-adoption', 'measurement', 'skills-maintenance']);
- assert.equal(ids.filter(id => id === 'target-operating-model').length, 1);
+test('Strategy has Target, Roadmap, a linked Skills Adoption category and Autonomous Agent', () => {
+ const compiled = ts.transpileModule(read('sidebars/strategy.ts'), {compilerOptions:{module:ts.ModuleKind.CommonJS}}).outputText;
+ const sandbox = {exports:{}};
+ runInNewContext(compiled, sandbox);
+ const sidebar = JSON.parse(JSON.stringify(sandbox.exports.default.strategySidebar));
+ assert.deepEqual(sidebar, ['target-operating-model', 'roadmap', {
+ type:'category', label:'Stage - 01 - Skills Adoption',
+ link:{type:'doc', id:'stage-01-skills-adoption'}, collapsed:true,
+ items:[
+ {type:'doc', id:'skills-governance', label:'Governance'},
+ {type:'doc', id:'skills-quality', label:'Quality'},
+ {type:'doc', id:'skills-adoption', label:'Adoption'},
+ {type:'doc', id:'measurement', label:'Measurement'},
+ {type:'doc', id:'skills-maintenance', label:'Maintenance'},
+ ],
+ }, 'stage-02-autonomous-agent']);
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Target$/m);
assert.match(read('docusaurus.config.ts'), /type: 'docSidebar', docsPluginId: 'strategy', sidebarId: 'strategySidebar', label: 'Strategy'/);
});
+test('stage overviews explain the foundation and future without replacing topic content', () => {
+ const first = read('docs/strategy/stage-01-skills-adoption.mdx');
+ const second = read('docs/strategy/stage-02-autonomous-agent.mdx');
+ for (const [id, title, page] of [
+ ['stage-01-skills-adoption', 'Stage - 01 - Skills Adoption', first],
+ ['stage-02-autonomous-agent', 'Stage - 02 - Autonomous Agent', second],
+ ]) {
+ assert(page.includes(`id: ${id}\ntitle: ${title}`));
+ for (const link of ['./roadmap.mdx', './target-operating-model.mdx']) assert(page.includes(link));
+ }
+ for (const id of ['skills-governance','skills-quality','skills-adoption','measurement','skills-maintenance']) assert(first.includes(`./${id}.mdx`));
+ for (const marker of ['human + AI Agent','Delivery first','order is not yet decided','KPIs','baseline','topology','feedback','new current situation']) assert(first.includes(marker), marker);
+ for (const marker of ['future','proven skills','measurements','working practices','direction and review','not deployed autonomy','approved KPI thresholds']) assert(second.includes(marker), marker);
+ assert.match(read('docs/strategy/measurement.mdx'), /^title: Skills Measurement\nsidebar_label: Measurement$/m);
+});
+
test('old Strategy entry redirects to Target instead of maintaining a second document', () => {
assert(!existsSync('docs/strategy/index.mdx'));
assert.match(read('docusaurus.config.ts'), /'@docusaurus\/plugin-client-redirects'/);
diff --git a/scripts/strategy.test.mjs b/scripts/strategy.test.mjs
index f261757..5dbfe63 100644
--- a/scripts/strategy.test.mjs
+++ b/scripts/strategy.test.mjs
@@ -3,9 +3,10 @@ import assert from 'node:assert/strict';
import {readFileSync, readdirSync} from 'node:fs';
const read = p => readFileSync(p, 'utf8');
const model = JSON.parse(read('research/ai-adoption/strategy-model.json'));
-test('seven canonical strategy pages preserve target boundary and separate evidence', () => {
+test('seven existing strategy pages and two stage overviews preserve canonical routes', () => {
assert.equal(model.pages.length, 7);
- assert.equal(readdirSync('docs/strategy').filter(p => p.endsWith('.mdx')).length, 7);
+ assert.deepEqual(readdirSync('docs/strategy').filter(p => p.endsWith('.mdx')).sort(),
+ [...model.pages.map(({id}) => `${id}.mdx`), 'stage-01-skills-adoption.mdx', 'stage-02-autonomous-agent.mdx'].sort());
for (const {id} of model.pages) {
const page = read(`docs/strategy/${id}.mdx`);
assert(page.includes(`id: ${id}`));
diff --git a/scripts/verify.mjs b/scripts/verify.mjs
index 5828f87..ec20c5e 100644
--- a/scripts/verify.mjs
+++ b/scripts/verify.mjs
@@ -21,10 +21,15 @@ if (process.argv.includes('--build')) {
const redirect = read('build/strategy/index.html');
assert(redirect.includes('/eldorado-v1/documentation/strategy/target-operating-model/'));
assert(redirect.includes('window.location.href') && redirect.includes('http-equiv="refresh"') && !redirect.includes('archify-panel'), 'Landing must redirect, not duplicate Target');
- for (const {id, title} of model.pages) {
+ const strategyPages = [...model.pages,
+ {id:'stage-01-skills-adoption', title:'Stage - 01 - Skills Adoption'},
+ {id:'stage-02-autonomous-agent', title:'Stage - 02 - Autonomous Agent'},
+ ];
+ for (const {id, title} of strategyPages) {
const route = `strategy/${id === 'index' ? '' : `${id}/`}index.html`;
const page = read(join('build',route));
- assert(page.includes(title) && page.includes('Target operating model'), route);
+ assert(page.includes(title), route);
+ if (!id.startsWith('stage-')) assert(page.includes('Target operating model'), route);
assert(indexes.includes(title), `Missing indexed Strategy page: ${id}`);
for (const match of page.matchAll(/href="(\/eldorado-v1\/documentation\/[^"?#]*)/g)) {
const local = decodeURIComponent(match[1].replace('/eldorado-v1/documentation/',''));
diff --git a/sidebars/strategy.ts b/sidebars/strategy.ts
index 18c649d..687ca25 100644
--- a/sidebars/strategy.ts
+++ b/sidebars/strategy.ts
@@ -1,2 +1,21 @@
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
-export default {strategySidebar: ['target-operating-model', 'roadmap', 'skills-governance', 'skills-quality', 'skills-adoption', 'measurement', 'skills-maintenance']} satisfies SidebarsConfig;
+export default {
+ strategySidebar: [
+ 'target-operating-model',
+ 'roadmap',
+ {
+ type: 'category',
+ label: 'Stage - 01 - Skills Adoption',
+ link: {type: 'doc', id: 'stage-01-skills-adoption'},
+ collapsed: true,
+ items: [
+ {type: 'doc', id: 'skills-governance', label: 'Governance'},
+ {type: 'doc', id: 'skills-quality', label: 'Quality'},
+ {type: 'doc', id: 'skills-adoption', label: 'Adoption'},
+ {type: 'doc', id: 'measurement', label: 'Measurement'},
+ {type: 'doc', id: 'skills-maintenance', label: 'Maintenance'},
+ ],
+ },
+ 'stage-02-autonomous-agent',
+ ],
+} satisfies SidebarsConfig;