docs: group Strategy into Skills Adoption and Autonomous Agent stages #30

Merged
jarvis-at-skic merged 1 commits from feat/strategy-stage-navigation into main 2026-10-06 12:07:57 -07:00
17 changed files with 218 additions and 21 deletions

No files matched your search

+1 -1
View File
@@ -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
---
+1 -1
View File
@@ -68,6 +68,6 @@ Stage 2 builds on proven skills, measurements and working practices—not permis
</details>
**Next:** [Return to the strategy destination →](./target-operating-model.mdx)
**Next:** [Stage - 01 - Skills Adoption →](./stage-01-skills-adoption.mdx)
</div>
+1 -1
View File
@@ -44,6 +44,6 @@ Owner ratification is required before adoption. Review earlier after incidents o
</details>
**Next:** [Use exit evidence to choose the next rollout stage →](./roadmap.mdx)
**Next:** [Stage - 02 - Autonomous Agent →](./stage-02-autonomous-agent.mdx)
</div>
@@ -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
---
<div className="strategy-content">
**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.
</div>
@@ -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
---
<div className="strategy-content">
**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.
</div>
+1 -1
View File
@@ -162,6 +162,6 @@ Success means accepted outcomes with maintained quality, controlled risk and und
</details>
**Next:** [Decide who owns and approves each skill →](./skills-governance.mdx)
**Next:** [Follow the Roadmap toward Target →](./roadmap.mdx)
</div>
+1 -1
View File
@@ -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": {
+2 -2
View File
@@ -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();
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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');
+83
View File
@@ -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;});
+1 -1
View File
@@ -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`);
+1 -1
View File
@@ -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('<details>'));
assert(page.includes('./reference/measurement-contracts.mdx'));
+34 -5
View File
@@ -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'/);
+3 -2
View File
@@ -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}`));
+7 -2
View File
@@ -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/',''));
+20 -1
View File
@@ -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;