From fe4c3509d1ac67ea505099e9034f742c4fa311dc Mon Sep 17 00:00:00 2001 From: Jarvis Jr Hermes Date: Tue, 6 Oct 2026 19:07:00 +0000 Subject: [PATCH] docs: [verified] group Strategy into adoption and autonomy stages --- docs/strategy/measurement.mdx | 2 +- docs/strategy/roadmap.mdx | 2 +- docs/strategy/skills-maintenance.mdx | 2 +- docs/strategy/stage-01-skills-adoption.mdx | 36 +++++++++ docs/strategy/stage-02-autonomous-agent.mdx | 24 ++++++ docs/strategy/target-operating-model.mdx | 2 +- package.json | 2 +- scripts/browser/inline-controls.cjs | 4 +- scripts/browser/sdlc-cycle.cjs | 2 +- scripts/browser/skills-measurement.cjs | 2 +- scripts/browser/strategy-navigation.cjs | 83 +++++++++++++++++++++ scripts/sdlc-cycle.test.mjs | 2 +- scripts/skills-measurement.test.mjs | 2 +- scripts/strategy-navigation.test.mjs | 39 ++++++++-- scripts/strategy.test.mjs | 5 +- scripts/verify.mjs | 9 ++- sidebars/strategy.ts | 21 +++++- 17 files changed, 218 insertions(+), 21 deletions(-) create mode 100644 docs/strategy/stage-01-skills-adoption.mdx create mode 100644 docs/strategy/stage-02-autonomous-agent.mdx create mode 100644 scripts/browser/strategy-navigation.cjs 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;