Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
baf79e125b | ||
|
|
9651417ba7 | ||
|
|
4cc2bb4dfd | ||
|
|
afb6a97e97 |
No files matched your search
@@ -3,8 +3,7 @@
|
|||||||
"diagram_type": "architecture",
|
"diagram_type": "architecture",
|
||||||
"meta": {"title": "TO-BE: autonomous SDLC, human direction", "output": "static/diagrams/strategy-target-mobile/index.html", "quality_profile": "showcase", "legend": {"mode": "hidden"}},
|
"meta": {"title": "TO-BE: autonomous SDLC, human direction", "output": "static/diagrams/strategy-target-mobile/index.html", "quality_profile": "showcase", "legend": {"mode": "hidden"}},
|
||||||
"components": [
|
"components": [
|
||||||
{"id":"humans","type":"backend","label":"Humans","sublabel":"Direct, guide and review","pos":[140,20],"size":[360,100]},
|
{"id":"agent","type":"security","label":"Autonomous agent","sublabel":"Human Controlled","pos":[140,200],"size":[360,120]},
|
||||||
{"id":"agent","type":"security","label":"Autonomous agent","sublabel":"Executes / governs SDLC","pos":[140,200],"size":[360,120]},
|
|
||||||
{"id":"scope","type":"backend","label":"Scope","sublabel":"01","pos":[100,440],"size":[240,100]},
|
{"id":"scope","type":"backend","label":"Scope","sublabel":"01","pos":[100,440],"size":[240,100]},
|
||||||
{"id":"architecture","type":"backend","label":"Architecture","sublabel":"02","pos":[100,660],"size":[240,100]},
|
{"id":"architecture","type":"backend","label":"Architecture","sublabel":"02","pos":[100,660],"size":[240,100]},
|
||||||
{"id":"ui-ux","type":"backend","label":"UI/UX","sublabel":"03","pos":[100,880],"size":[240,100]},
|
{"id":"ui-ux","type":"backend","label":"UI/UX","sublabel":"03","pos":[100,880],"size":[240,100]},
|
||||||
@@ -23,7 +22,7 @@
|
|||||||
{"id":"code-releases","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,1980],"size":[240,100]}
|
{"id":"code-releases","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,1980],"size":[240,100]}
|
||||||
],
|
],
|
||||||
"connections": [
|
"connections": [
|
||||||
{"id":"human-direction","from":"humans","to":"agent","label":"Guide","fromSide":"bottom","toSide":"top"},
|
|
||||||
{"id":"govern-scope","from":"agent","to":"scope","label":"","variant":"security","fromSide":"left","toSide":"left","via":[[60,260],[60,490]]},
|
{"id":"govern-scope","from":"agent","to":"scope","label":"","variant":"security","fromSide":"left","toSide":"left","via":[[60,260],[60,490]]},
|
||||||
{"id":"govern-architecture","from":"agent","to":"architecture","label":"","variant":"security","fromSide":"left","toSide":"left","via":[[60,260],[60,710]]},
|
{"id":"govern-architecture","from":"agent","to":"architecture","label":"","variant":"security","fromSide":"left","toSide":"left","via":[[60,260],[60,710]]},
|
||||||
{"id":"govern-ui-ux","from":"agent","to":"ui-ux","label":"","variant":"security","fromSide":"left","toSide":"left","via":[[60,260],[60,930]]},
|
{"id":"govern-ui-ux","from":"agent","to":"ui-ux","label":"","variant":"security","fromSide":"left","toSide":"left","via":[[60,260],[60,930]]},
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
"diagram_type": "architecture",
|
"diagram_type": "architecture",
|
||||||
"meta": {"title": "TO-BE: autonomous SDLC, human direction", "output": "static/diagrams/strategy-target/index.html", "quality_profile": "showcase", "legend": {"mode": "hidden"}},
|
"meta": {"title": "TO-BE: autonomous SDLC, human direction", "output": "static/diagrams/strategy-target/index.html", "quality_profile": "showcase", "legend": {"mode": "hidden"}},
|
||||||
"components": [
|
"components": [
|
||||||
{"id":"humans","type":"backend","label":"Humans","sublabel":"Direct, guide and review","pos":[465,322.5],"size":[270,75]},
|
{"id":"agent","type":"security","label":"Autonomous agent","sublabel":"Human Controlled","pos":[465,450],"size":[270,90]},
|
||||||
{"id":"agent","type":"security","label":"Autonomous agent","sublabel":"Executes / governs SDLC","pos":[465,450],"size":[270,90]},
|
|
||||||
{"id":"scope","type":"backend","label":"Scope","sublabel":"01","pos":[510,187.5],"size":[180,75]},
|
{"id":"scope","type":"backend","label":"Scope","sublabel":"01","pos":[510,187.5],"size":[180,75]},
|
||||||
{"id":"architecture","type":"backend","label":"Architecture","sublabel":"02","pos":[780,187.5],"size":[180,75]},
|
{"id":"architecture","type":"backend","label":"Architecture","sublabel":"02","pos":[780,187.5],"size":[180,75]},
|
||||||
{"id":"ui-ux","type":"backend","label":"UI/UX","sublabel":"03","pos":[780,457.5],"size":[180,75]},
|
{"id":"ui-ux","type":"backend","label":"UI/UX","sublabel":"03","pos":[780,457.5],"size":[180,75]},
|
||||||
@@ -23,7 +22,7 @@
|
|||||||
{"id":"code-releases","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[240,37.5],"size":[180,75]}
|
{"id":"code-releases","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[240,37.5],"size":[180,75]}
|
||||||
],
|
],
|
||||||
"connections": [
|
"connections": [
|
||||||
{"id":"human-direction","from":"humans","to":"agent","label":"Guide","fromSide":"bottom","toSide":"top"},
|
|
||||||
{"id":"govern-scope","from":"agent","to":"scope","label":"","variant":"security","fromSide":"right","toSide":"bottom","via":[[750,495],[750,292.5],[600,292.5]]},
|
{"id":"govern-scope","from":"agent","to":"scope","label":"","variant":"security","fromSide":"right","toSide":"bottom","via":[[750,495],[750,292.5],[600,292.5]]},
|
||||||
{"id":"govern-architecture","from":"agent","to":"architecture","label":"","variant":"security","fromSide":"right","toSide":"bottom","via":[[765,495],[765,345],[870,345]]},
|
{"id":"govern-architecture","from":"agent","to":"architecture","label":"","variant":"security","fromSide":"right","toSide":"bottom","via":[[765,495],[765,345],[870,345]]},
|
||||||
{"id":"govern-ui-ux","from":"agent","to":"ui-ux","label":"","variant":"security","fromSide":"right","toSide":"left"},
|
{"id":"govern-ui-ux","from":"agent","to":"ui-ux","label":"","variant":"security","fromSide":"right","toSide":"left"},
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
---
|
|
||||||
id: index
|
|
||||||
title: AI adoption strategy
|
|
||||||
description: An autonomous SDLC cycle directed, guided and reviewed by humans, supported by governed skills.
|
|
||||||
slug: /
|
|
||||||
hide_table_of_contents: true
|
|
||||||
---
|
|
||||||
|
|
||||||
import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
|
|
||||||
|
|
||||||
<div className="strategy-content">
|
|
||||||
|
|
||||||
**TO-BE · Target operating model — not installed controls or company results.**
|
|
||||||
|
|
||||||
## Autonomous SDLC, human direction
|
|
||||||
|
|
||||||
<ArchifyDiagram name="strategy-target" title="Autonomous agent executes and governs the SDLC; humans direct, guide and review" story />
|
|
||||||
|
|
||||||
An autonomous agent executes and governs every phase. Humans direct, guide and review it; a separate human-controlled code agent contributes to each phase from outside the cycle.
|
|
||||||
|
|
||||||
**Solid arrows:** lifecycle · **Dotted spokes:** execution and governance · **Dashed arrows:** contributions.
|
|
||||||
|
|
||||||
**Scope → Architecture → UI/UX → Planning → Delivery → UAT → Security → Releases → Scope**
|
|
||||||
|
|
||||||
Releases returns to Scope and the cycle repeats indefinitely. Governed skills and measured outcomes support the path toward this target; they are not a substitute for it.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Strategy rationale and reading map</summary>
|
|
||||||
|
|
||||||
**TO-BE · Target operating model.** Introduction depends on the [roadmap gates](./roadmap.mdx); these pages do not describe installed controls or measured company results.
|
|
||||||
|
|
||||||
### Govern skills first, expand authority only with evidence
|
|
||||||
|
|
||||||
Eldorado's target is to make AI-assisted work dependable across the organization: useful guidance, clear human ownership, controlled execution and measurable outcomes. The first investment is a governed skills system, not an autonomous replacement for the organization. A skill packages reusable working knowledge, prerequisites and verification steps. It helps an agent perform a task; it does not grant permission or guarantee that the work is correct.
|
|
||||||
|
|
||||||
The target combines an autonomous agent executing and governing the SDLC with humans directing, guiding and reviewing it. Developer choice on local laptops remains a supporting option: Copilot, Claude Code and Cline can receive reviewed portable skill content through qualified adapters. Repository, CI and release controls support execution; detailed approval policies remain implementation decisions, not new roles established by this strategy.
|
|
||||||
|
|
||||||
The strategy describes the intended operating model and the evidence required to introduce it. It does not establish that these controls are installed, that every client is supported, or that AI has improved Eldorado's performance. The current reference is the documented six-department organization. Rollout begins by validating actual clients, responsibilities, data boundaries and available evidence.
|
|
||||||
|
|
||||||
Success means accepted outcomes with maintained quality, controlled risk and understood total cost. Faster activity without reliable outcomes is not success. More skill invocations, generated lines or tool subscriptions are not productivity targets. People remain accountable for product, customer, financial and personnel decisions.
|
|
||||||
|
|
||||||
## Navigate the strategy
|
|
||||||
|
|
||||||
- [Target operating model](./target-operating-model.mdx) — The autonomous SDLC cycle, with human direction, guidance and review.
|
|
||||||
- [Skills governance](./skills-governance.mdx) — Contract, lifecycle, decision rights, adapters, locking, exceptions.
|
|
||||||
- [Skills quality](./skills-quality.mdx) — Risk tiers, independent evaluation, repeated trials, adversarial conformance.
|
|
||||||
- [Skills adoption](./skills-adoption.mdx) — Workflow-led coaching, client choice, feedback, manual path.
|
|
||||||
- [Measurement](./measurement.mdx) — Full KPI contracts, minimal events, illustrative calculations, privacy and limits.
|
|
||||||
- [Skills maintenance](./skills-maintenance.mdx) — Review, drift, deprecation, rollback and incident handling.
|
|
||||||
- [Roadmap](./roadmap.mdx) — Evidence-gated phases, no promised dates or budgets.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
**Next:** [Explore the autonomous SDLC cycle →](./target-operating-model.mdx)
|
|
||||||
|
|
||||||
</div>
|
|
||||||
@@ -70,6 +70,6 @@ There are no invented launch dates, budgets, staffing commitments or guaranteed
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
**Next:** [Return to the strategy destination →](./index.mdx)
|
**Next:** [Return to the strategy destination →](./target-operating-model.mdx)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -138,6 +138,30 @@ See the existing [organization structure](/organization/structure/), [department
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Strategy rationale and reading map</summary>
|
||||||
|
|
||||||
|
### Govern skills first, expand authority only with evidence
|
||||||
|
|
||||||
|
Eldorado's target is to make AI-assisted work dependable across the organization: useful guidance, clear human ownership, controlled execution and measurable outcomes. The first investment is a governed skills system, not an autonomous replacement for the organization. A skill packages reusable working knowledge, prerequisites and verification steps. It helps an agent perform a task; it does not grant permission or guarantee that the work is correct.
|
||||||
|
|
||||||
|
The target combines an autonomous agent executing and governing the SDLC with humans directing, guiding and reviewing it. Developer choice on local laptops remains a supporting option: Copilot, Claude Code and Cline can receive reviewed portable skill content through qualified adapters. Repository, CI and release controls support execution; detailed approval policies remain implementation decisions, not new roles established by this strategy.
|
||||||
|
|
||||||
|
The strategy describes the intended operating model and the evidence required to introduce it. It does not establish that these controls are installed, that every client is supported, or that AI has improved Eldorado's performance. The current reference is the documented six-department organization. Rollout begins by validating actual clients, responsibilities, data boundaries and available evidence.
|
||||||
|
|
||||||
|
Success means accepted outcomes with maintained quality, controlled risk and understood total cost. Faster activity without reliable outcomes is not success. More skill invocations, generated lines or tool subscriptions are not productivity targets. People remain accountable for product, customer, financial and personnel decisions.
|
||||||
|
|
||||||
|
### Navigate the strategy
|
||||||
|
|
||||||
|
- [Roadmap](./roadmap.mdx) — Evidence-gated phases, no promised dates or budgets.
|
||||||
|
- [Skills governance](./skills-governance.mdx) — Contract, lifecycle, decision rights, adapters, locking, exceptions.
|
||||||
|
- [Skills quality](./skills-quality.mdx) — Risk tiers, independent evaluation, repeated trials, adversarial conformance.
|
||||||
|
- [Skills adoption](./skills-adoption.mdx) — Workflow-led coaching, client choice, feedback, manual path.
|
||||||
|
- [Measurement](./measurement.mdx) — Full KPI contracts, minimal events, illustrative calculations, privacy and limits.
|
||||||
|
- [Skills maintenance](./skills-maintenance.mdx) — Review, drift, deprecation, rollback and incident handling.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
**Next:** [Decide who owns and approves each skill →](./skills-governance.mdx)
|
**Next:** [Decide who owns and approves each skill →](./skills-governance.mdx)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -18,6 +18,7 @@ const config: Config = {
|
|||||||
theme: {customCss: './src/css/custom.css'},
|
theme: {customCss: './src/css/custom.css'},
|
||||||
} satisfies Preset.Options]],
|
} satisfies Preset.Options]],
|
||||||
plugins: [
|
plugins: [
|
||||||
|
['@docusaurus/plugin-client-redirects', {redirects: [{from: '/strategy/', to: '/strategy/target-operating-model/'}]}],
|
||||||
['@docusaurus/plugin-content-docs', {id: 'organization', path: 'docs/organization', routeBasePath: 'organization', sidebarPath: './sidebars/organization.ts'}],
|
['@docusaurus/plugin-content-docs', {id: 'organization', path: 'docs/organization', routeBasePath: 'organization', sidebarPath: './sidebars/organization.ts'}],
|
||||||
['@docusaurus/plugin-content-docs', {id: 'strategy', path: 'docs/strategy', routeBasePath: 'strategy', sidebarPath: './sidebars/strategy.ts'}],
|
['@docusaurus/plugin-content-docs', {id: 'strategy', path: 'docs/strategy', routeBasePath: 'strategy', sidebarPath: './sidebars/strategy.ts'}],
|
||||||
['@docusaurus/plugin-content-docs', {id: 'contribution', path: 'docs/contribution', routeBasePath: 'contribution', sidebarPath: './sidebars/contribution.ts'}],
|
['@docusaurus/plugin-content-docs', {id: 'contribution', path: 'docs/contribution', routeBasePath: 'contribution', sidebarPath: './sidebars/contribution.ts'}],
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@docusaurus/core": "3.10.2",
|
"@docusaurus/core": "3.10.2",
|
||||||
|
"@docusaurus/plugin-client-redirects": "3.10.2",
|
||||||
"@docusaurus/preset-classic": "3.10.2",
|
"@docusaurus/preset-classic": "3.10.2",
|
||||||
"@docusaurus/theme-common": "3.10.2",
|
"@docusaurus/theme-common": "3.10.2",
|
||||||
"@easyops-cn/docusaurus-search-local": "0.55.3",
|
"@easyops-cn/docusaurus-search-local": "0.55.3",
|
||||||
|
|||||||
Generated
+51
@@ -14,6 +14,9 @@ importers:
|
|||||||
'@docusaurus/core':
|
'@docusaurus/core':
|
||||||
specifier: 3.10.2
|
specifier: 3.10.2
|
||||||
version: 3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(debug@4.4.3)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)
|
version: 3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(debug@4.4.3)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)
|
||||||
|
'@docusaurus/plugin-client-redirects':
|
||||||
|
specifier: 3.10.2
|
||||||
|
version: 3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)
|
||||||
'@docusaurus/preset-classic':
|
'@docusaurus/preset-classic':
|
||||||
specifier: 3.10.2
|
specifier: 3.10.2
|
||||||
version: 3.10.2(@algolia/client-search@5.59.0)(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3)(typescript@5.9.3)
|
version: 3.10.2(@algolia/client-search@5.59.0)(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3)(typescript@5.9.3)
|
||||||
@@ -1115,6 +1118,13 @@ packages:
|
|||||||
react: '*'
|
react: '*'
|
||||||
react-dom: '*'
|
react-dom: '*'
|
||||||
|
|
||||||
|
'@docusaurus/plugin-client-redirects@3.10.2':
|
||||||
|
resolution: {integrity: sha512-z5I5ttCXw+8y2gHVZvqAMmUw4Rb0ZzKA5eCPk87SfM/jCKOTvE24yDpPAwwipvug96ij7mOwEHXWw8G4LlWdGA==}
|
||||||
|
engines: {node: '>=20.0'}
|
||||||
|
peerDependencies:
|
||||||
|
react: ^18.0.0 || ^19.0.0
|
||||||
|
react-dom: ^18.0.0 || ^19.0.0
|
||||||
|
|
||||||
'@docusaurus/plugin-content-blog@3.10.2':
|
'@docusaurus/plugin-content-blog@3.10.2':
|
||||||
resolution: {integrity: sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w==}
|
resolution: {integrity: sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w==}
|
||||||
engines: {node: '>=20.0'}
|
engines: {node: '>=20.0'}
|
||||||
@@ -6784,6 +6794,47 @@ snapshots:
|
|||||||
- uglify-js
|
- uglify-js
|
||||||
- webpack-cli
|
- webpack-cli
|
||||||
|
|
||||||
|
'@docusaurus/plugin-client-redirects@3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)':
|
||||||
|
dependencies:
|
||||||
|
'@docusaurus/core': 3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(debug@4.4.3)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)
|
||||||
|
'@docusaurus/logger': 3.10.2
|
||||||
|
'@docusaurus/utils': 3.10.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.28))(html-minifier-terser@7.2.0)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||||
|
'@docusaurus/utils-common': 3.10.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.28))(html-minifier-terser@7.2.0)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||||
|
'@docusaurus/utils-validation': 3.10.2(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||||
|
eta: 2.2.0
|
||||||
|
fs-extra: 11.4.1
|
||||||
|
lodash: 4.18.1
|
||||||
|
react: 19.1.1
|
||||||
|
react-dom: 19.1.1(react@19.1.1)
|
||||||
|
tslib: 2.8.1
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- '@docusaurus/faster'
|
||||||
|
- '@mdx-js/react'
|
||||||
|
- '@minify-html/node'
|
||||||
|
- '@napi-rs/image'
|
||||||
|
- '@parcel/css'
|
||||||
|
- '@rspack/core'
|
||||||
|
- '@swc/core'
|
||||||
|
- '@swc/css'
|
||||||
|
- '@swc/html'
|
||||||
|
- bufferutil
|
||||||
|
- clean-css
|
||||||
|
- cssnano
|
||||||
|
- csso
|
||||||
|
- debug
|
||||||
|
- esbuild
|
||||||
|
- html-minifier-terser
|
||||||
|
- imagemin
|
||||||
|
- lightningcss
|
||||||
|
- postcss
|
||||||
|
- sharp
|
||||||
|
- supports-color
|
||||||
|
- svgo
|
||||||
|
- typescript
|
||||||
|
- uglify-js
|
||||||
|
- utf-8-validate
|
||||||
|
- webpack-cli
|
||||||
|
|
||||||
'@docusaurus/plugin-content-blog@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)':
|
'@docusaurus/plugin-content-blog@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@docusaurus/core': 3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(debug@4.4.3)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)
|
'@docusaurus/core': 3.10.2(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(debug@4.4.3)(postcss@8.5.28)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)
|
||||||
|
|||||||
@@ -28,11 +28,6 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"pages": [
|
"pages": [
|
||||||
{
|
|
||||||
"id": "index",
|
|
||||||
"title": "AI adoption strategy",
|
|
||||||
"purpose": "Govern skills first; outcomes before activity; explicit target status."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "target-operating-model",
|
"id": "target-operating-model",
|
||||||
"title": "Target operating model",
|
"title": "Target operating model",
|
||||||
|
|||||||
@@ -88,6 +88,9 @@ const fs = require('node:fs');
|
|||||||
if (format.startsWith('svg')) {
|
if (format.startsWith('svg')) {
|
||||||
const valid = await page.evaluate(xml => {
|
const valid = await page.evaluate(xml => {
|
||||||
const doc = new DOMParser().parseFromString(xml, 'image/svg+xml');
|
const doc = new DOMParser().parseFromString(xml, 'image/svg+xml');
|
||||||
|
if (doc.querySelector('[data-node-id="humans"], [data-edge-id="human-direction"]')) return false;
|
||||||
|
if (![...doc.querySelectorAll('[data-node-id="agent"] text')].some(n => n.textContent === 'Human Controlled')) return false;
|
||||||
|
if (doc.querySelectorAll('[data-node-id]').length !== 17 || doc.querySelectorAll('path[data-edge-id]').length !== 24) return false;
|
||||||
return !doc.querySelector('parsererror') && doc.documentElement.localName === 'svg' && doc.querySelectorAll('text').length > 0 && doc.querySelector('#eldorado-cycle-export')?.textContent.includes('stroke-dasharray: 3 9');
|
return !doc.querySelector('parsererror') && doc.documentElement.localName === 'svg' && doc.querySelectorAll('text').length > 0 && doc.querySelector('#eldorado-cycle-export')?.textContent.includes('stroke-dasharray: 3 9');
|
||||||
}, bytes.toString());
|
}, bytes.toString());
|
||||||
assert(valid, format);
|
assert(valid, format);
|
||||||
@@ -122,8 +125,10 @@ const fs = require('node:fs');
|
|||||||
await page.screenshot({path:`${output}/${width}.png`, fullPage:true});
|
await page.screenshot({path:`${output}/${width}.png`, fullPage:true});
|
||||||
await frame.locator('#btn-theme').click(); await theme('dark');
|
await frame.locator('#btn-theme').click(); await theme('dark');
|
||||||
// Exercise keyboard navigation without racing the portal's smooth scroll.
|
// Exercise keyboard navigation without racing the portal's smooth scroll.
|
||||||
await page.locator('.strategy-content a[href$="/strategy/target-operating-model/"]').filter({visible:true}).focus();
|
await page.locator('.strategy-content a[href$="/strategy/skills-governance/"]').filter({visible:true}).focus();
|
||||||
await page.keyboard.press('Enter');
|
await page.keyboard.press('Enter');
|
||||||
|
await page.waitForURL('**/strategy/skills-governance/');
|
||||||
|
await page.goBack({waitUntil:'domcontentloaded'});
|
||||||
await page.waitForURL('**/strategy/target-operating-model/');
|
await page.waitForURL('**/strategy/target-operating-model/');
|
||||||
await page.getByRole('heading', {name:'Target operating model', exact:true, level:1}).waitFor();
|
await page.getByRole('heading', {name:'Target operating model', exact:true, level:1}).waitFor();
|
||||||
const next = page.locator(`.archify-panel--story[data-diagram="strategy-target"] > .story-${width > 700 ? 'desktop' : 'mobile'}`);
|
const next = page.locator(`.archify-panel--story[data-diagram="strategy-target"] > .story-${width > 700 ? 'desktop' : 'mobile'}`);
|
||||||
|
|||||||
@@ -19,7 +19,20 @@ const fs = require('node:fs');
|
|||||||
await page.waitForURL('**/strategy/target-operating-model/');
|
await page.waitForURL('**/strategy/target-operating-model/');
|
||||||
for (const route of ['target-operating-model/', '']) {
|
for (const route of ['target-operating-model/', '']) {
|
||||||
await page.goto(`${base}/eldorado-v1/documentation/strategy/${route}`, {waitUntil:'networkidle'});
|
await page.goto(`${base}/eldorado-v1/documentation/strategy/${route}`, {waitUntil:'networkidle'});
|
||||||
if (width === 1440) assert.equal(await page.locator('.theme-doc-sidebar-menu .menu__link').first().innerText(), 'Target');
|
await page.waitForURL('**/strategy/target-operating-model/');
|
||||||
|
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', 'Measurement', 'Skills maintenance']);
|
||||||
|
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);
|
||||||
|
await page.screenshot({path:`${output}/${width}-${route ? 'target' : 'landing'}-navigation.png`,fullPage:true,animations:'disabled'});
|
||||||
|
await menu.nth(1).click();
|
||||||
|
await page.waitForURL('**/strategy/roadmap/');
|
||||||
|
await page.getByRole('heading', {level:1,name:'Roadmap',exact:true}).waitFor();
|
||||||
|
await page.goBack({waitUntil:'domcontentloaded'});
|
||||||
|
await page.waitForURL('**/strategy/target-operating-model/');
|
||||||
const iframe = page.locator(`.archify-panel--story > .story-${width > 700 ? 'desktop' : 'mobile'}`);
|
const iframe = page.locator(`.archify-panel--story > .story-${width > 700 ? 'desktop' : 'mobile'}`);
|
||||||
await iframe.scrollIntoViewIfNeeded();
|
await iframe.scrollIntoViewIfNeeded();
|
||||||
const frame = await (await iframe.elementHandle()).contentFrame();
|
const frame = await (await iframe.elementHandle()).contentFrame();
|
||||||
@@ -39,14 +52,17 @@ const fs = require('node:fs');
|
|||||||
const ids = ['scope','architecture','ui-ux','planning','delivery','uat','security','releases'];
|
const ids = ['scope','architecture','ui-ux','planning','delivery','uat','security','releases'];
|
||||||
assert.deepEqual(metrics.edges.map(e=>e.slice(0,2)), ids.map((id,i)=>[id,ids[(i+1)%ids.length]]));
|
assert.deepEqual(metrics.edges.map(e=>e.slice(0,2)), ids.map((id,i)=>[id,ids[(i+1)%ids.length]]));
|
||||||
assert(metrics.edges.every(e=>e[2]?.startsWith('url(')), 'all stages must have arrowheads');
|
assert(metrics.edges.every(e=>e[2]?.startsWith('url(')), 'all stages must have arrowheads');
|
||||||
assert.equal(metrics.nodes.length, 18);
|
assert.equal(metrics.nodes.length, 17);
|
||||||
|
assert(!metrics.nodes.some(n=>n.id==='humans'));
|
||||||
|
assert.equal(await frame.locator('[data-node-id="agent"] text').allTextContents().then(texts=>texts.includes('Human Controlled')), true);
|
||||||
|
assert.equal(metrics.relationships.length, 24);
|
||||||
const governs = metrics.relationships.filter(e=>e.id.startsWith('govern-'));
|
const governs = metrics.relationships.filter(e=>e.id.startsWith('govern-'));
|
||||||
const contributions = metrics.relationships.filter(e=>e.id.startsWith('contribute-'));
|
const contributions = metrics.relationships.filter(e=>e.id.startsWith('contribute-'));
|
||||||
assert.deepEqual(governs.map(e=>[e.from,e.to]), ids.map(id=>['agent',id]));
|
assert.deepEqual(governs.map(e=>[e.from,e.to]), ids.map(id=>['agent',id]));
|
||||||
assert.deepEqual(contributions.map(e=>[e.from,e.to]), ids.map(id=>[`code-${id}`,id]));
|
assert.deepEqual(contributions.map(e=>[e.from,e.to]), ids.map(id=>[`code-${id}`,id]));
|
||||||
assert(governs.every(e=>e.dash==='3px, 9px' && e.arrow?.startsWith('url(')));
|
assert(governs.every(e=>e.dash==='3px, 9px' && e.arrow?.startsWith('url(')));
|
||||||
assert(contributions.every(e=>e.dash==='12px, 8px' && e.arrow?.startsWith('url(')));
|
assert(contributions.every(e=>e.dash==='12px, 8px' && e.arrow?.startsWith('url(')));
|
||||||
assert(metrics.relationships.some(e=>e.from==='humans' && e.to==='agent'));
|
assert(!metrics.relationships.some(e=>e.id==='human-direction' || e.from==='humans' || e.to==='humans'));
|
||||||
if (width > 700) {
|
if (width > 700) {
|
||||||
const agent = metrics.nodes.find(n=>n.id==='agent');
|
const agent = metrics.nodes.find(n=>n.id==='agent');
|
||||||
const phases = metrics.nodes.filter(n=>ids.includes(n.id));
|
const phases = metrics.nodes.filter(n=>ids.includes(n.id));
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import {readFileSync} from 'node:fs';
|
|||||||
const read = p => readFileSync(p, 'utf8');
|
const read = p => readFileSync(p, 'utf8');
|
||||||
const stages = ['Scope', 'Architecture', 'UI/UX', 'Planning', 'Delivery', 'UAT', 'Security', 'Releases'];
|
const stages = ['Scope', 'Architecture', 'UI/UX', 'Planning', 'Delivery', 'UAT', 'Security', 'Releases'];
|
||||||
|
|
||||||
test('Strategy opens at the autonomous lifecycle, with a matching direct landing story', () => {
|
test('Strategy opens at the canonical autonomous lifecycle', () => {
|
||||||
assert.match(read('sidebars/strategy.ts'), /strategySidebar: \['target-operating-model', 'index'/);
|
assert.match(read('sidebars/strategy.ts'), /strategySidebar: \['target-operating-model', 'roadmap'/);
|
||||||
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Target$/m);
|
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Target$/m);
|
||||||
for (const id of ['index', 'target-operating-model']) {
|
for (const id of ['target-operating-model']) {
|
||||||
const page = read(`docs/strategy/${id}.mdx`);
|
const page = read(`docs/strategy/${id}.mdx`);
|
||||||
const primary = page.split('<details>')[0];
|
const primary = page.split('<details>')[0];
|
||||||
assert(primary.includes('name="strategy-target"'));
|
assert(primary.includes('name="strategy-target"'));
|
||||||
@@ -30,9 +30,10 @@ test('both target diagrams have eight stages, eight governed phases and eight hu
|
|||||||
assert.deepEqual(flow.map(e => [e.from, e.to]), ids.map((id, i) => [id, ids[(i + 1) % ids.length]]));
|
assert.deepEqual(flow.map(e => [e.from, e.to]), ids.map((id, i) => [id, ids[(i + 1) % ids.length]]));
|
||||||
assert.match(flow.at(-1).label, /Repeat/);
|
assert.match(flow.at(-1).label, /Repeat/);
|
||||||
|
|
||||||
assert(d.components.some(n => n.label === 'Autonomous agent' && /Executes.*governs/.test(n.sublabel)));
|
assert(d.components.some(n => n.id === 'agent' && n.label === 'Autonomous agent' && n.sublabel === 'Human Controlled'));
|
||||||
assert(d.components.some(n => n.label === 'Humans' && n.sublabel === 'Direct, guide and review'));
|
assert(!d.components.some(n => n.id === 'humans' || n.label === 'Humans'));
|
||||||
assert(d.connections.some(e => e.from === 'humans' && e.to === 'agent'));
|
assert(!d.connections.some(e => e.id === 'human-direction' || e.from === 'humans' || e.to === 'humans'));
|
||||||
|
assert.equal(d.connections.length, 24);
|
||||||
assert.deepEqual(d.connections.filter(e => e.from === 'agent').map(e => e.to), ids);
|
assert.deepEqual(d.connections.filter(e => e.from === 'agent').map(e => e.to), ids);
|
||||||
const contributors = d.components.filter(n => n.id.startsWith('code-'));
|
const contributors = d.components.filter(n => n.id.startsWith('code-'));
|
||||||
assert.equal(contributors.length, 8);
|
assert.equal(contributors.length, 8);
|
||||||
@@ -41,7 +42,7 @@ test('both target diagrams have eight stages, eight governed phases and eight hu
|
|||||||
assert(d.connections.some(e => e.from === `code-${id}` && e.to === id && e.variant === 'dashed'));
|
assert(d.connections.some(e => e.from === `code-${id}` && e.to === id && e.variant === 'dashed'));
|
||||||
assert(d.connections.some(e => e.from === 'agent' && e.to === id && e.variant === 'security'));
|
assert(d.connections.some(e => e.from === 'agent' && e.to === id && e.variant === 'security'));
|
||||||
}
|
}
|
||||||
assert.equal(d.components.length, 18);
|
assert.equal(d.components.length, 17);
|
||||||
if (!suffix) {
|
if (!suffix) {
|
||||||
const center = n => n.pos.map((v, i) => v + n.size[i] / 2);
|
const center = n => n.pos.map((v, i) => v + n.size[i] / 2);
|
||||||
const agent = center(d.components.find(n => n.id === 'agent'));
|
const agent = center(d.components.find(n => n.id === 'agent'));
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import {test} from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import {readFileSync, existsSync} from 'node:fs';
|
||||||
|
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);
|
||||||
|
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('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'/);
|
||||||
|
assert.match(read('docusaurus.config.ts'), /from: '\/strategy\/', to: '\/strategy\/target-operating-model\/'/);
|
||||||
|
});
|
||||||
@@ -3,9 +3,9 @@ import assert from 'node:assert/strict';
|
|||||||
import {readFileSync, readdirSync} from 'node:fs';
|
import {readFileSync, readdirSync} from 'node:fs';
|
||||||
const read = p => readFileSync(p, 'utf8');
|
const read = p => readFileSync(p, 'utf8');
|
||||||
const model = JSON.parse(read('research/ai-adoption/strategy-model.json'));
|
const model = JSON.parse(read('research/ai-adoption/strategy-model.json'));
|
||||||
test('eight fixed strategy pages preserve target boundary and separate evidence', () => {
|
test('seven canonical strategy pages preserve target boundary and separate evidence', () => {
|
||||||
assert.equal(model.pages.length, 8);
|
assert.equal(model.pages.length, 7);
|
||||||
assert.equal(readdirSync('docs/strategy').length, 8);
|
assert.equal(readdirSync('docs/strategy').length, 7);
|
||||||
for (const {id} of model.pages) {
|
for (const {id} of model.pages) {
|
||||||
const page = read(`docs/strategy/${id}.mdx`);
|
const page = read(`docs/strategy/${id}.mdx`);
|
||||||
assert(page.includes(`id: ${id}`));
|
assert(page.includes(`id: ${id}`));
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ assert(workflow.includes("gitea.event_name == 'push' && gitea.ref == 'refs/heads
|
|||||||
if (process.argv.includes('--build')) {
|
if (process.argv.includes('--build')) {
|
||||||
const model = JSON.parse(read('research/ai-adoption/strategy-model.json'));
|
const model = JSON.parse(read('research/ai-adoption/strategy-model.json'));
|
||||||
const indexes = readdirSync('build').filter(f => /^search-index.*\.json$/.test(f)).map(f => read(join('build',f))).join('\n');
|
const indexes = readdirSync('build').filter(f => /^search-index.*\.json$/.test(f)).map(f => read(join('build',f))).join('\n');
|
||||||
|
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) {
|
for (const {id, title} of model.pages) {
|
||||||
const route = `strategy/${id === 'index' ? '' : `${id}/`}index.html`;
|
const route = `strategy/${id === 'index' ? '' : `${id}/`}index.html`;
|
||||||
const page = read(join('build',route));
|
const page = read(join('build',route));
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
|
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
|
||||||
export default {strategySidebar: ['target-operating-model', 'index', 'skills-governance', 'skills-quality', 'skills-adoption', 'measurement', 'skills-maintenance', 'roadmap']} satisfies SidebarsConfig;
|
export default {strategySidebar: ['target-operating-model', 'roadmap', 'skills-governance', 'skills-quality', 'skills-adoption', 'measurement', 'skills-maintenance']} satisfies SidebarsConfig;
|
||||||
+1
-1
@@ -25,7 +25,7 @@ export default function Home(): React.ReactElement {
|
|||||||
<div className="section-heading"><div><p className="eyebrow">START HERE</p><h2 id="start-title">A clear place to begin.</h2></div><span className="foundation-badge">Foundation · v1</span></div>
|
<div className="section-heading"><div><p className="eyebrow">START HERE</p><h2 id="start-title">A clear place to begin.</h2></div><span className="foundation-badge">Foundation · v1</span></div>
|
||||||
<div className="start-grid">
|
<div className="start-grid">
|
||||||
<Link className="start-card" to="/organization/structure/"><span className="card-number">01 / ORGANIZATION</span><h3>Organization</h3><p>Explore the structure workspace and its first interactive diagram.</p><span className="card-action">Explore structure <span aria-hidden="true">↗</span></span></Link>
|
<Link className="start-card" to="/organization/structure/"><span className="card-number">01 / ORGANIZATION</span><h3>Organization</h3><p>Explore the structure workspace and its first interactive diagram.</p><span className="card-action">Explore structure <span aria-hidden="true">↗</span></span></Link>
|
||||||
<Link className="start-card" to="/strategy/"><span className="card-number">02 / STRATEGY</span><h3>Strategy</h3><p>Shape the direction for an AI-powered Eldorado.</p><span className="card-action">View the direction <span aria-hidden="true">↗</span></span></Link>
|
<Link className="start-card" to="/strategy/target-operating-model/"><span className="card-number">02 / STRATEGY</span><h3>Strategy</h3><p>Shape the direction for an AI-powered Eldorado.</p><span className="card-action">View the direction <span aria-hidden="true">↗</span></span></Link>
|
||||||
<Link className="start-card" to="/contribution/"><span className="card-number">03 / CONTRIBUTION</span><h3>Contribution</h3><p>Contribute evidence, proposals, documentation, and diagrams.</p><span className="card-action">Start contributing <span aria-hidden="true">↗</span></span></Link>
|
<Link className="start-card" to="/contribution/"><span className="card-number">03 / CONTRIBUTION</span><h3>Contribution</h3><p>Contribute evidence, proposals, documentation, and diagrams.</p><span className="card-action">Start contributing <span aria-hidden="true">↗</span></span></Link>
|
||||||
</div>
|
</div>
|
||||||
<aside className="scope-note"><span className="scope-symbol" aria-hidden="true">✦</span><div><strong>Shaping the direction.</strong><p>This space is dedicated to AI strategy and direction for Eldorado. Specific initiatives, priorities, and the roadmap remain to be defined.</p></div></aside>
|
<aside className="scope-note"><span className="scope-symbol" aria-hidden="true">✦</span><div><strong>Shaping the direction.</strong><p>This space is dedicated to AI strategy and direction for Eldorado. Specific initiatives, priorities, and the roadmap remain to be defined.</p></div></aside>
|
||||||
|
|||||||
Reference in new issue
Block a user