From abe00994a15aff02adc629ad4f986215c24ebba1 Mon Sep 17 00:00:00 2001 From: Jarvis Jr Hermes Date: Wed, 7 Oct 2026 13:33:07 +0000 Subject: [PATCH] docs: [verified] separate Measurement registry and workflow Baseline --- ...strategy-adoption-mobile.architecture.json | 4 +- diagrams/strategy-adoption.architecture.json | 4 +- ...strategy-baseline-mobile.architecture.json | 144 ++++++ diagrams/strategy-baseline.architecture.json | 184 ++++++++ ...ategy-maintenance-mobile.architecture.json | 2 +- .../strategy-maintenance.architecture.json | 2 +- ...ategy-measurement-mobile.architecture.json | 434 ++++++++---------- .../strategy-measurement.architecture.json | 410 ++++++++--------- docs/strategy/baseline.mdx | 56 +++ .../measurement/collection-and-safeguards.mdx | 10 +- docs/strategy/measurement/index.mdx | 66 +-- docs/strategy/skills-adoption.mdx | 32 +- docs/strategy/skills-maintenance.mdx | 15 + docs/strategy/stage-01-skills-adoption.mdx | 9 +- .../ai-adoption/measurement-migration.json | 4 +- scripts/baseline.test.mjs | 34 ++ scripts/browser/skills-exports.cjs | 7 +- scripts/browser/skills-measurement.cjs | 8 +- scripts/browser/skills-stories.cjs | 18 +- scripts/browser/strategy-navigation.cjs | 14 +- scripts/skills-measurement.test.mjs | 10 +- scripts/skills-stories.test.mjs | 13 +- scripts/skills-viewer.mjs | 2 +- scripts/strategy-navigation.test.mjs | 9 +- scripts/strategy-story.test.mjs | 2 +- scripts/strategy.test.mjs | 2 +- scripts/verify.mjs | 2 + sidebars/strategy.ts | 7 +- src/components/ArchifyDiagram/index.tsx | 2 +- src/css/custom.css | 3 +- 30 files changed, 961 insertions(+), 548 deletions(-) create mode 100644 diagrams/strategy-baseline-mobile.architecture.json create mode 100644 diagrams/strategy-baseline.architecture.json create mode 100644 docs/strategy/baseline.mdx create mode 100644 scripts/baseline.test.mjs diff --git a/diagrams/strategy-adoption-mobile.architecture.json b/diagrams/strategy-adoption-mobile.architecture.json index f88e529..0ec8d4a 100644 --- a/diagrams/strategy-adoption-mobile.architecture.json +++ b/diagrams/strategy-adoption-mobile.architecture.json @@ -19,7 +19,7 @@ "type": "external", "label": "Delivery first", "tag": "Start with a real workflow", - "sublabel": "Baseline + bounded canary", + "sublabel": "Workflow baseline + canary", "pos": [ 60, 120 @@ -67,7 +67,7 @@ "type": "external", "label": "Learn from real work", "tag": "Ongoing, reviewed improvement", - "sublabel": "Feedback + friction + measures\nRetain a manual path\nNo quotas or rankings", + "sublabel": "Feedback + selected measures\nRetain a manual path\nNo quotas or rankings", "pos": [ 60, 490 diff --git a/diagrams/strategy-adoption.architecture.json b/diagrams/strategy-adoption.architecture.json index 2896ae7..72718b1 100644 --- a/diagrams/strategy-adoption.architecture.json +++ b/diagrams/strategy-adoption.architecture.json @@ -19,7 +19,7 @@ "type": "external", "label": "Delivery first", "tag": "Start with a real workflow", - "sublabel": "Baseline + bounded canary", + "sublabel": "Workflow baseline + canary", "pos": [ 60, 350 @@ -67,7 +67,7 @@ "type": "external", "label": "Learn from real work", "tag": "Ongoing, reviewed improvement", - "sublabel": "Feedback + friction + measures\nRetain a manual path\nNo quotas or rankings", + "sublabel": "Feedback + selected measures\nRetain a manual path\nNo quotas or rankings", "pos": [ 700, 800 diff --git a/diagrams/strategy-baseline-mobile.architecture.json b/diagrams/strategy-baseline-mobile.architecture.json new file mode 100644 index 0000000..d93cdb7 --- /dev/null +++ b/diagrams/strategy-baseline-mobile.architecture.json @@ -0,0 +1,144 @@ +{ + "schema_version": 1, + "diagram_type": "architecture", + "meta": { + "title": "Workflow baseline", + "output": "static/diagrams/strategy-baseline-mobile/index.html", + "quality_profile": "showcase", + "legend": { + "mode": "hidden" + }, + "viewBox": [ + 880, + 2050 + ] + }, + "components": [ + { + "id": "workflow", + "type": "external", + "label": "Current workflow", + "tag": "01 / Understand", + "sublabel": "Task, scope, people\nTools + handoffs\nCurrent practice", + "pos": [ + 90, + 50 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "selection", + "type": "frontend", + "label": "Relevant selection", + "tag": "02 / Choose", + "sublabel": "Registry candidates\nReasons for inclusion\nDefer what does not fit", + "pos": [ + 90, + 450 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "evidence", + "type": "frontend", + "label": "Feasible evidence", + "tag": "03 / Agree", + "sublabel": "Sources + period\nPrivacy, access, owner\nTest joins + coverage", + "pos": [ + 90, + 850 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "position", + "type": "backend", + "label": "Starting position", + "tag": "04 / Record", + "sublabel": "Actual values + limits\nOr unavailable gaps\nNo invented baseline", + "pos": [ + 90, + 1250 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "comparison", + "type": "backend", + "label": "Later comparison", + "tag": "05 / Evaluate", + "sublabel": "Comparable rules\nContext + uncertainty\nNot causal ROI", + "pos": [ + 90, + 1650 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + } + ], + "connections": [ + { + "id": "workflow-selection", + "from": "workflow", + "to": "selection", + "label": "", + "fromSide": "bottom", + "toSide": "top", + "route": "straight", + "width": 4, + "variant": "default" + }, + { + "id": "selection-evidence", + "from": "selection", + "to": "evidence", + "label": "", + "fromSide": "bottom", + "toSide": "top", + "route": "straight", + "width": 4, + "variant": "default" + }, + { + "id": "evidence-position", + "from": "evidence", + "to": "position", + "label": "", + "fromSide": "bottom", + "toSide": "top", + "route": "straight", + "width": 4, + "variant": "default" + }, + { + "id": "position-comparison", + "from": "position", + "to": "comparison", + "label": "", + "fromSide": "bottom", + "toSide": "top", + "route": "straight", + "width": 4, + "variant": "default" + } + ] +} diff --git a/diagrams/strategy-baseline.architecture.json b/diagrams/strategy-baseline.architecture.json new file mode 100644 index 0000000..e577cce --- /dev/null +++ b/diagrams/strategy-baseline.architecture.json @@ -0,0 +1,184 @@ +{ + "schema_version": 1, + "diagram_type": "architecture", + "meta": { + "title": "Workflow baseline", + "output": "static/diagrams/strategy-baseline/index.html", + "quality_profile": "showcase", + "legend": { + "mode": "hidden" + }, + "viewBox": [ + 2400, + 1120 + ] + }, + "components": [ + { + "id": "workflow", + "type": "external", + "label": "Current workflow", + "tag": "01 / Understand", + "sublabel": "Task, scope, people\nTools + handoffs\nCurrent practice", + "pos": [ + 40, + 55 + ], + "size": [ + 440, + 290 + ], + "icon": "none" + }, + { + "id": "selection", + "type": "frontend", + "label": "Relevant selection", + "tag": "02 / Choose", + "sublabel": "Registry candidates\nReasons for inclusion\nDefer what does not fit", + "pos": [ + 510, + 235 + ], + "size": [ + 440, + 290 + ], + "icon": "none" + }, + { + "id": "evidence", + "type": "frontend", + "label": "Feasible evidence", + "tag": "03 / Agree", + "sublabel": "Sources + period\nPrivacy, access, owner\nTest joins + coverage", + "pos": [ + 980, + 415 + ], + "size": [ + 440, + 290 + ], + "icon": "none" + }, + { + "id": "position", + "type": "backend", + "label": "Starting position", + "tag": "04 / Record", + "sublabel": "Actual values + limits\nOr unavailable gaps\nNo invented baseline", + "pos": [ + 1450, + 595 + ], + "size": [ + 440, + 290 + ], + "icon": "none" + }, + { + "id": "comparison", + "type": "backend", + "label": "Later comparison", + "tag": "05 / Evaluate", + "sublabel": "Comparable rules\nContext + uncertainty\nNot causal ROI", + "pos": [ + 1920, + 775 + ], + "size": [ + 440, + 290 + ], + "icon": "none" + } + ], + "connections": [ + { + "id": "workflow-selection", + "from": "workflow", + "to": "selection", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 495.0, + 200.0 + ], + [ + 495.0, + 380.0 + ] + ] + }, + { + "id": "selection-evidence", + "from": "selection", + "to": "evidence", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 965.0, + 380.0 + ], + [ + 965.0, + 560.0 + ] + ] + }, + { + "id": "evidence-position", + "from": "evidence", + "to": "position", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 1435.0, + 560.0 + ], + [ + 1435.0, + 740.0 + ] + ] + }, + { + "id": "position-comparison", + "from": "position", + "to": "comparison", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 1905.0, + 740.0 + ], + [ + 1905.0, + 920.0 + ] + ] + } + ] +} diff --git a/diagrams/strategy-maintenance-mobile.architecture.json b/diagrams/strategy-maintenance-mobile.architecture.json index 5b74fa0..316920c 100644 --- a/diagrams/strategy-maintenance-mobile.architecture.json +++ b/diagrams/strategy-maintenance-mobile.architecture.json @@ -19,7 +19,7 @@ "type": "external", "label": "Observe use", "tag": "Owner + Data & AI", - "sublabel": "Feedback, drift + review due", + "sublabel": "Selected evidence + drift", "pos": [ 60, 120 diff --git a/diagrams/strategy-maintenance.architecture.json b/diagrams/strategy-maintenance.architecture.json index bd05b7a..43abcdf 100644 --- a/diagrams/strategy-maintenance.architecture.json +++ b/diagrams/strategy-maintenance.architecture.json @@ -19,7 +19,7 @@ "type": "external", "label": "Observe use", "tag": "Owner + Data & AI", - "sublabel": "Feedback, drift + review due", + "sublabel": "Selected evidence + drift", "pos": [ 670, 60 diff --git a/diagrams/strategy-measurement-mobile.architecture.json b/diagrams/strategy-measurement-mobile.architecture.json index b9ac07a..149baa8 100644 --- a/diagrams/strategy-measurement-mobile.architecture.json +++ b/diagrams/strategy-measurement-mobile.architecture.json @@ -2,7 +2,7 @@ "schema_version": 1, "diagram_type": "architecture", "meta": { - "title": "TO-BE: Measurement", + "title": "Candidate metric registry", "output": "static/diagrams/strategy-measurement-mobile/index.html", "quality_profile": "showcase", "legend": { @@ -10,220 +10,133 @@ }, "viewBox": [ 880, - 3630 + 2450 ] }, "components": [ { - "id": "success-source", - "type": "external", - "label": "Tracker + acceptance", - "tag": "Matured task starts", - "sublabel": "Join evidence to the workflow", - "pos": [ - 60, - 120 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "success", - "type": "frontend", - "label": "Accepted / eligible starts \u00d7 100", - "tag": "Task success (%)", - "sublabel": "Failures + unresolved retained", - "pos": [ - 60, - 490 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "quality-source", - "type": "external", - "label": "Changes + defects", - "tag": "Completed follow-up", - "sublabel": "Join evidence to the workflow", - "pos": [ - 60, - 860 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "quality", - "type": "frontend", - "label": "Affected / accepted changes \u00d7 100", - "tag": "Escaped quality (%)", - "sublabel": "Count each affected change once", - "pos": [ - 60, - 1230 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "cost-source", - "type": "external", - "label": "Invoices + review minutes", - "tag": "Include failed attempts", - "sublabel": "Join evidence to the workflow", - "pos": [ - 60, - 1600 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "cost", - "type": "frontend", - "label": "Allocated cost / accepted tasks", - "tag": "Cost per accepted outcome", - "sublabel": "Missing buckets = partial", - "pos": [ - 60, - 1970 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "confidence-source", - "type": "external", - "label": "Anonymous 1\u20135 survey", - "tag": "Protect small groups", - "sublabel": "Join evidence to the workflow", - "pos": [ - 60, - 2340 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "confidence", - "type": "frontend", - "label": "Confidence sum / valid responses", - "tag": "Verification confidence (1\u20135)", - "sublabel": "Show distribution + response rate", - "pos": [ - 60, - 2710 - ], - "size": [ - 740, - 220 - ], - "icon": "none" - }, - { - "id": "interpret", + "id": "registry", "type": "backend", - "label": "Compare with baseline", - "tag": "Interpret, then act", - "sublabel": "Like workflows + source coverage\nZero denominator = N/A\nTrends are not causal ROI\nFix gaps; improve the workflow", + "label": "Available choices", + "tag": "Registry, not a rollout plan", + "sublabel": "16 candidate contracts\nUse only what is relevant\nNo mandatory collection", "pos": [ - 60, - 3080 + 90, + 50 ], "size": [ - 740, - 400 + 700, + 350 + ], + "icon": "none" + }, + { + "id": "qualification", + "type": "frontend", + "label": "Selection + reach", + "tag": "Qualification / supported use", + "sublabel": "Precision, recall, coverage\nApproved-workflow adoption", + "pos": [ + 90, + 450 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "outcomes", + "type": "frontend", + "label": "Outcomes + delivery", + "tag": "Task / change / service", + "sublabel": "Success, quality, DORA\nBusiness acceptance", + "pos": [ + 90, + 850 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "experience", + "type": "frontend", + "label": "Safety + cost + experience", + "tag": "Policy / spend / people", + "sublabel": "Policy effects, outcome cost\nConfidence + cognitive load", + "pos": [ + 90, + 1250 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "health", + "type": "frontend", + "label": "Skill health", + "tag": "Catalog revisions", + "sublabel": "Substantive-review coverage\nOwnership + review evidence", + "pos": [ + 90, + 1650 + ], + "size": [ + 700, + 350 + ], + "icon": "none" + }, + { + "id": "contract", + "type": "external", + "label": "Inspect a candidate", + "tag": "Every entry explains", + "sublabel": "Meaning + applicability\nCalculation + required inputs\nLimits + implementation status\n9 prototype / 7 unimplemented", + "pos": [ + 90, + 2050 + ], + "size": [ + 700, + 350 ], "icon": "none" } ], "connections": [ { - "id": "success-source-success", - "from": "success-source", - "to": "success", + "id": "registry-qualification", + "from": "registry", + "to": "qualification", "label": "", - "fromSide": "bottom", - "toSide": "top", + "fromSide": "left", + "toSide": "left", "route": "straight", "width": 4, "variant": "default", - "labelAt": [ - 610, - 395 + "via": [ + [ + 45, + 225 + ], + [ + 45, + 625 + ] ] }, { - "id": "quality-source-quality", - "from": "quality-source", - "to": "quality", - "label": "", - "fromSide": "bottom", - "toSide": "top", - "route": "straight", - "width": 4, - "variant": "default", - "labelAt": [ - 610, - 1135 - ] - }, - { - "id": "cost-source-cost", - "from": "cost-source", - "to": "cost", - "label": "", - "fromSide": "bottom", - "toSide": "top", - "route": "straight", - "width": 4, - "variant": "default", - "labelAt": [ - 610, - 1875 - ] - }, - { - "id": "confidence-source-confidence", - "from": "confidence-source", - "to": "confidence", - "label": "", - "fromSide": "bottom", - "toSide": "top", - "route": "straight", - "width": 4, - "variant": "default", - "labelAt": [ - 610, - 2615 - ] - }, - { - "id": "success-interpret", - "from": "success", - "to": "interpret", + "id": "qualification-contract", + "from": "qualification", + "to": "contract", "label": "", "fromSide": "right", "toSide": "right", @@ -232,23 +145,40 @@ "variant": "default", "via": [ [ - 850, - 600.0 + 835, + 625 ], [ - 850, - 3280.0 + 835, + 2225 ] - ], - "labelAt": [ - 620, - 3040 ] }, { - "id": "quality-interpret", - "from": "quality", - "to": "interpret", + "id": "registry-outcomes", + "from": "registry", + "to": "outcomes", + "label": "", + "fromSide": "left", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 45, + 225 + ], + [ + 45, + 1025 + ] + ] + }, + { + "id": "outcomes-contract", + "from": "outcomes", + "to": "contract", "label": "", "fromSide": "right", "toSide": "right", @@ -257,23 +187,40 @@ "variant": "default", "via": [ [ - 850, - 1340.0 + 835, + 1025 ], [ - 850, - 3280.0 + 835, + 2225 ] - ], - "labelAt": [ - 620, - 3040 ] }, { - "id": "cost-interpret", - "from": "cost", - "to": "interpret", + "id": "registry-experience", + "from": "registry", + "to": "experience", + "label": "", + "fromSide": "left", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 45, + 225 + ], + [ + 45, + 1425 + ] + ] + }, + { + "id": "experience-contract", + "from": "experience", + "to": "contract", "label": "", "fromSide": "right", "toSide": "right", @@ -282,32 +229,55 @@ "variant": "default", "via": [ [ - 850, - 2080.0 + 835, + 1425 ], [ - 850, - 3280.0 + 835, + 2225 ] - ], - "labelAt": [ - 620, - 3040 ] }, { - "id": "confidence-interpret", - "from": "confidence", - "to": "interpret", + "id": "registry-health", + "from": "registry", + "to": "health", "label": "", - "fromSide": "bottom", - "toSide": "top", + "fromSide": "left", + "toSide": "left", "route": "straight", "width": 4, "variant": "default", - "labelAt": [ - 610, - 2985 + "via": [ + [ + 45, + 225 + ], + [ + 45, + 1825 + ] + ] + }, + { + "id": "health-contract", + "from": "health", + "to": "contract", + "label": "", + "fromSide": "right", + "toSide": "right", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 835, + 1825 + ], + [ + 835, + 2225 + ] ] } ] diff --git a/diagrams/strategy-measurement.architecture.json b/diagrams/strategy-measurement.architecture.json index 94b227a..978b409 100644 --- a/diagrams/strategy-measurement.architecture.json +++ b/diagrams/strategy-measurement.architecture.json @@ -2,7 +2,7 @@ "schema_version": 1, "diagram_type": "architecture", "meta": { - "title": "TO-BE: Measurement", + "title": "Candidate metric registry", "output": "static/diagrams/strategy-measurement/index.html", "quality_profile": "showcase", "legend": { @@ -15,199 +15,107 @@ }, "components": [ { - "id": "success-source", - "type": "external", - "label": "Tracker + acceptance", - "tag": "Matured task starts", - "sublabel": "Join evidence to the workflow", - "pos": [ - 50, - 70 - ], - "size": [ - 580, - 180 - ], - "icon": "none" - }, - { - "id": "success", - "type": "frontend", - "label": "Accepted / eligible starts \u00d7 100", - "tag": "Task success (%)", - "sublabel": "Failures + unresolved retained", - "pos": [ - 770, - 70 - ], - "size": [ - 700, - 180 - ], - "icon": "none" - }, - { - "id": "quality-source", - "type": "external", - "label": "Changes + defects", - "tag": "Completed follow-up", - "sublabel": "Join evidence to the workflow", - "pos": [ - 50, - 320 - ], - "size": [ - 580, - 180 - ], - "icon": "none" - }, - { - "id": "quality", - "type": "frontend", - "label": "Affected / accepted changes \u00d7 100", - "tag": "Escaped quality (%)", - "sublabel": "Count each affected change once", - "pos": [ - 770, - 320 - ], - "size": [ - 700, - 180 - ], - "icon": "none" - }, - { - "id": "cost-source", - "type": "external", - "label": "Invoices + review minutes", - "tag": "Include failed attempts", - "sublabel": "Join evidence to the workflow", - "pos": [ - 50, - 570 - ], - "size": [ - 580, - 180 - ], - "icon": "none" - }, - { - "id": "cost", - "type": "frontend", - "label": "Allocated cost / accepted tasks", - "tag": "Cost per accepted outcome", - "sublabel": "Missing buckets = partial", - "pos": [ - 770, - 570 - ], - "size": [ - 700, - 180 - ], - "icon": "none" - }, - { - "id": "confidence-source", - "type": "external", - "label": "Anonymous 1\u20135 survey", - "tag": "Protect small groups", - "sublabel": "Join evidence to the workflow", - "pos": [ - 50, - 820 - ], - "size": [ - 580, - 180 - ], - "icon": "none" - }, - { - "id": "confidence", - "type": "frontend", - "label": "Confidence sum / valid responses", - "tag": "Verification confidence (1\u20135)", - "sublabel": "Show distribution + response rate", - "pos": [ - 770, - 820 - ], - "size": [ - 700, - 180 - ], - "icon": "none" - }, - { - "id": "interpret", + "id": "registry", "type": "backend", - "label": "Compare with baseline", - "tag": "Interpret, then act", - "sublabel": "Like workflows + source coverage\nZero denominator = N/A\nTrends are not causal ROI\nFix gaps; improve the workflow", + "label": "Available choices", + "tag": "Registry, not a rollout plan", + "sublabel": "16 candidate contracts\nUse only what is relevant\nNo mandatory collection", "pos": [ - 1650, - 325 + 40, + 405 ], "size": [ - 680, - 400 + 600, + 310 + ], + "icon": "none" + }, + { + "id": "qualification", + "type": "frontend", + "label": "Selection + reach", + "tag": "Qualification / supported use", + "sublabel": "Precision, recall, coverage\nApproved-workflow adoption", + "pos": [ + 810, + 40 + ], + "size": [ + 700, + 220 + ], + "icon": "none" + }, + { + "id": "outcomes", + "type": "frontend", + "label": "Outcomes + delivery", + "tag": "Task / change / service", + "sublabel": "Success, quality, DORA\nBusiness acceptance", + "pos": [ + 810, + 310 + ], + "size": [ + 700, + 220 + ], + "icon": "none" + }, + { + "id": "experience", + "type": "frontend", + "label": "Safety + cost + experience", + "tag": "Policy / spend / people", + "sublabel": "Policy effects, outcome cost\nConfidence + cognitive load", + "pos": [ + 810, + 580 + ], + "size": [ + 700, + 220 + ], + "icon": "none" + }, + { + "id": "health", + "type": "frontend", + "label": "Skill health", + "tag": "Catalog revisions", + "sublabel": "Substantive-review coverage\nOwnership + review evidence", + "pos": [ + 810, + 850 + ], + "size": [ + 700, + 220 + ], + "icon": "none" + }, + { + "id": "contract", + "type": "external", + "label": "Inspect a candidate", + "tag": "Every entry explains", + "sublabel": "Meaning + applicability\nCalculation + required inputs\nLimits + implementation status\n9 prototype / 7 unimplemented", + "pos": [ + 1710, + 355 + ], + "size": [ + 650, + 360 ], "icon": "none" } ], "connections": [ { - "id": "success-source-success", - "from": "success-source", - "to": "success", - "label": "", - "fromSide": "right", - "toSide": "left", - "route": "straight", - "width": 4, - "variant": "default" - }, - { - "id": "quality-source-quality", - "from": "quality-source", - "to": "quality", - "label": "", - "fromSide": "right", - "toSide": "left", - "route": "straight", - "width": 4, - "variant": "default" - }, - { - "id": "cost-source-cost", - "from": "cost-source", - "to": "cost", - "label": "", - "fromSide": "right", - "toSide": "left", - "route": "straight", - "width": 4, - "variant": "default" - }, - { - "id": "confidence-source-confidence", - "from": "confidence-source", - "to": "confidence", - "label": "", - "fromSide": "right", - "toSide": "left", - "route": "straight", - "width": 4, - "variant": "default" - }, - { - "id": "success-interpret", - "from": "success", - "to": "interpret", + "id": "registry-qualification", + "from": "registry", + "to": "qualification", "label": "", "fromSide": "right", "toSide": "left", @@ -216,19 +124,19 @@ "variant": "default", "via": [ [ - 1550, - 160 + 715, + 560 ], [ - 1550, - 525 + 715, + 150 ] ] }, { - "id": "quality-interpret", - "from": "quality", - "to": "interpret", + "id": "qualification-contract", + "from": "qualification", + "to": "contract", "label": "", "fromSide": "right", "toSide": "left", @@ -237,19 +145,19 @@ "variant": "default", "via": [ [ - 1550, - 410 + 1605, + 150 ], [ - 1550, - 525 + 1605, + 535 ] ] }, { - "id": "cost-interpret", - "from": "cost", - "to": "interpret", + "id": "registry-outcomes", + "from": "registry", + "to": "outcomes", "label": "", "fromSide": "right", "toSide": "left", @@ -258,19 +166,19 @@ "variant": "default", "via": [ [ - 1550, - 660 + 715, + 560 ], [ - 1550, - 525 + 715, + 420 ] ] }, { - "id": "confidence-interpret", - "from": "confidence", - "to": "interpret", + "id": "outcomes-contract", + "from": "outcomes", + "to": "contract", "label": "", "fromSide": "right", "toSide": "left", @@ -279,12 +187,96 @@ "variant": "default", "via": [ [ - 1550, - 910 + 1605, + 420 ], [ - 1550, - 525 + 1605, + 535 + ] + ] + }, + { + "id": "registry-experience", + "from": "registry", + "to": "experience", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 715, + 560 + ], + [ + 715, + 690 + ] + ] + }, + { + "id": "experience-contract", + "from": "experience", + "to": "contract", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 1605, + 690 + ], + [ + 1605, + 535 + ] + ] + }, + { + "id": "registry-health", + "from": "registry", + "to": "health", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 715, + 560 + ], + [ + 715, + 960 + ] + ] + }, + { + "id": "health-contract", + "from": "health", + "to": "contract", + "label": "", + "fromSide": "right", + "toSide": "left", + "route": "straight", + "width": 4, + "variant": "default", + "via": [ + [ + 1605, + 960 + ], + [ + 1605, + 535 ] ] } diff --git a/docs/strategy/baseline.mdx b/docs/strategy/baseline.mdx new file mode 100644 index 0000000..c0dd6d2 --- /dev/null +++ b/docs/strategy/baseline.mdx @@ -0,0 +1,56 @@ +--- +id: baseline +title: Baseline +sidebar_label: Baseline +description: Understand a workflow, select relevant candidate metrics and establish feasible starting evidence for later comparison. +pagination_prev: measurement/index +pagination_next: skills-governance +hide_table_of_contents: true +--- + +import ArchifyDiagram from '@site/src/components/ArchifyDiagram'; + +
+ +Establish a starting position for one workflow as adoption reaches it. This is not a mandatory company-wide baseline of every metric in the [Measurement registry](./measurement/index.mdx). + + + +**Target operating model — no actual baseline values or approved thresholds are established here.** Missing evidence remains an explicit gap, not an invented starting value. + +## Understand the current workflow + +Describe the task, team or service, intended outcome, current tools, handoffs, controls and known friction. Bound what is in and out of scope. For Delivery, start with codebase structure and existing principles, system-logic sources, tests, builds and packaging, then deployments. Record current practice, including any existing AI use; do not label it “no-skill” unless that is true. + +## Select relevant metrics, with reasons + +Choose the registry entries that answer this workflow's questions. Record why each selected metric applies, what decision it can inform, and why other candidates are irrelevant or deferred. There is no required universal subset. A service-level DORA metric, a qualification test and a people survey have different populations; they are not interchangeable. + +Agree what counts as a started task, independent acceptance and completed follow-up before counting outcomes. Freeze eligibility and acceptance rules and verify event joins. Select a complete comparable workflow cycle and a predeclared precision/sample requirement appropriate to the decision. Do not select a convenient end date after seeing results. Where those requirements cannot be met, record the resulting evidence limitation. + +## Agree feasible evidence + +Confirm collection feasibility, period, sources, owner, independent reviewer, access, lawful basis, privacy and retention before collecting. Use the [shared safeguards](./measurement/collection-and-safeguards.mdx) and each selected contract's input requirements. Proposed owner/cadence entries are not already assigned responsibilities. + +Start with a controlled worksheet or export if automation is unavailable. Join task IDs to acceptance records, PR/commit IDs, CI results and later defects where relevant; test source coverage and permissions. Repository and CI evidence support verification, but a green build alone is not task acceptance. Record exact skill revisions and client/model configurations when present; keep missing versions unknown. + +## Record the starting position + +Collect prospective current-practice evidence over the agreed period. Record actual starting values only when supported by traceable evidence. Include units, population, observation period, counts, exclusions, source coverage, calculation version, uncertainty and limitations. Zero denominators mean “not available,” not zero performance. + +For each selected metric, keep one of these explicit records: + +- **Available:** evidenced starting value, source links, calculation, owner and limits. +- **Unavailable:** missing input or permission, affected comparison, responsible owner and proposed next action or review point. Never fill the gap with the synthetic example or an assumed industry value. + +Record deferred and non-applicable candidates separately from selected-but-unavailable metrics. This page is the recording method, not an Eldorado baseline report or a set of approved targets. + +## Keep later evaluation comparable + +Retain task class, service, skill, client/model configuration and concurrent changes. In [Adoption](./skills-adoption.mdx), use the same agreed eligibility, acceptance and observation rules; in [Maintenance](./skills-maintenance.mdx), record any changes and breaks in comparability rather than silently replacing the starting position. + +A matched or randomized comparison may be used when practical and ethical. Label observational trends as descriptive, not causal ROI; report confounding, selection and uncertainty. Missing or small samples limit conclusions. Baseline values describe current practice; they do not establish acceptable risk or authorize expansion. + +**Next:** [Govern skill ownership and authority →](./skills-governance.mdx) + +
diff --git a/docs/strategy/measurement/collection-and-safeguards.mdx b/docs/strategy/measurement/collection-and-safeguards.mdx index 13c8e8e..9abdfed 100644 --- a/docs/strategy/measurement/collection-and-safeguards.mdx +++ b/docs/strategy/measurement/collection-and-safeguards.mdx @@ -2,12 +2,12 @@ id: collection-and-safeguards slug: /measurement/collection-and-safeguards title: Collection and safeguards -description: Collection rules, baseline interpretation, event contracts and privacy safeguards. +description: Shared interpretation rules, event contracts and privacy safeguards for selected metrics. ---
-**Target operating model — recommended contracts, not installed collection.** All owner and cadence entries below are proposals to confirm before the pilot, not assigned responsibilities or approved schedules. +**Target operating model — recommended contracts, not installed collection.** Registry inclusion does not require use, collection or baselining. All owner and cadence entries are proposals to confirm for selected metrics, not assigned responsibilities or approved schedules. {/* preserved:start */} Introduction depends on the [roadmap gates](../roadmap.mdx); these pages do not describe installed controls or measured company results. @@ -20,11 +20,11 @@ Begin with task acceptance, repository, CI, deployment and incident systems beca Validated success uses all eligible initiated tasks whose predeclared observation window has matured. Failed and abandoned tasks remain nonsuccess. Unresolved or unobserved outcomes remain in the denominator, with known-outcome coverage shown alongside the conservative confirmed-success share. They are not relabeled as observed failure. A task cancelled before start is excluded; cancellation after start remains visible. Count a task once across retries and multiple skills. For timeliness, also show unfinished work and age; accepted-only lead-time distributions have survivorship limitations. -Track all five service-level DORA measures: commit-to-production lead time, deployment frequency, change fail rate, failed deployment recovery time and deployment rework rate. Do not substitute PR-open-to-merge time or all-incident MTTR. Pair them with matured escaped-quality rates, policy effects, total cost per accepted outcome, support coverage, adoption, human experience and catalog maintenance. Keep customer/business outcomes linked to their departmental hypotheses; do not infer conversion, trust or revenue improvement from delivery telemetry. +The registry includes five service-level DORA measures: commit-to-production lead time, deployment frequency, change fail rate, failed deployment recovery time and deployment rework rate. Select them only where applicable; do not substitute PR-open-to-merge time or all-incident MTTR. Where relevant, interpret them alongside selected quality, policy, cost, support, adoption, experience or maintenance evidence. Keep customer/business outcomes linked to their departmental hypotheses; do not infer conversion, trust or revenue improvement from delivery telemetry. -### Baseline and interpretation +### Interpretation limits {#baseline-and-interpretation} -Before a pilot, freeze eligibility and acceptance rules and verify event joins. Collect prospective no-skill/current-practice evidence over a complete comparable workflow cycle and until the preregistered precision/sample requirement is met. Do not select a convenient end date after seeing results. Retain task class, service, skill, client/model configuration and concurrent changes. A matched or randomized comparison may be used when practical and ethical; label observational trends as descriptive and report confounding, selection and uncertainty. +See [Baseline](../baseline.mdx) for selecting relevant metrics and establishing comparable current-practice evidence. Pilot application belongs to [Adoption](../skills-adoption.mdx); ongoing reporting belongs to [Maintenance](../skills-maintenance.mdx). Elapsed time and human effort are different quantities. Parallel agents may reduce waiting while increasing review or compute. Include failed attempts and human review/rework in cost, do not multiply a multi-skill task's value across every invocation, and do not convert survey perceptions into proven time savings. Small or incomplete populations yield evidence limits, not an ROI percentage. diff --git a/docs/strategy/measurement/index.mdx b/docs/strategy/measurement/index.mdx index 6bafc64..79e162c 100644 --- a/docs/strategy/measurement/index.mdx +++ b/docs/strategy/measurement/index.mdx @@ -3,7 +3,9 @@ id: index slug: /measurement title: 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. +description: Registry of available candidate KPIs and metrics, their applicability, evidence requirements, calculations and limitations. +pagination_prev: stage-01-skills-adoption +pagination_next: baseline hide_table_of_contents: true --- @@ -11,59 +13,17 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
-Measure adoption in stages: first establish today’s performance, then follow the pilot, extend coverage and keep skills current. Count use separately from outcomes—more use does not by itself mean better work. +Browse available candidate KPIs and metrics. Registry inclusion does not require a metric to be used, collected or baselined. Count use separately from outcomes—more use does not by itself mean better work. - + -**Recommended collection plan · Target operating model, not installed telemetry.** Confirm the proposed roles and reporting cadence below before collecting data. +**Target operating model — candidate definitions, not installed telemetry or a collection plan.** Proposed owners and cadences in the contracts apply only if selected and agreed for a workflow. -## 1. Establish the baseline +## Read a candidate contract -Choose one workflow, such as reviewing a code change with a review skill. Agree what counts as a started task, independent acceptance and the follow-up period before counting outcomes. Collect current-practice evidence over a complete comparable workflow cycle and until the agreed sample requirement is met; use the same rules in the pilot. +Each entry explains meaning and applicability, calculation, required inputs and evidence, exclusions, missing-evidence behavior, limitations and implementation status. Selection measures concern qualification; coverage and adoption concern reach; DORA measures concern service delivery. Outcome, safety, cost, experience and maintenance measures retain their distinct populations. A delivery metric need not fit a non-delivery workflow. -Start with a controlled worksheet or export. Join task IDs to acceptance records, PR/commit IDs, CI results and later defects. Record the exact skill revision and client configuration for pilot work; keep missing versions unknown. Repository and CI evidence support verification, but a green build alone is not task acceptance. - -## 2. Measure the pilot - -Start with these four questions. Capture inputs as work happens; do not reconstruct review effort from elapsed PR time. - -### Are tasks reaching acceptance? - -**Collect:** task starts and independent acceptance, failure or abandonment records from the work tracker. **Calculate:** accepted tasks / all eligible starts whose observation period has ended × 100. Failed, abandoned and unresolved tasks stay in the denominator; show unknown outcomes and coverage separately. This is [validated task success](./validated-task-success.mdx), not a count of agent completions. **Weekly:** Quality Engineering reviews the pilot cohort. - -### Is quality holding up? - -**Collect:** accepted change IDs, linked confirmed defects, severity and follow-up dates from review and defect records; retain PR/CI evidence. **Calculate:** changes with at least one confirmed defect / accepted changes with completed follow-up × 100. Count each affected change once, not each defect. Missing links do not mean clean work. **Monthly:** Quality Engineering reviews [escaped quality](./changes-with-escaped-quality-issues.mdx) after follow-up, alongside severe incident counts. - -### What does an accepted outcome cost? - -**Collect:** invoices and usage costs plus sampled human review/rework minutes at approved rates, including unsuccessful attempts and allocated licenses/tooling. **Calculate:** total allocated workflow cost / independently accepted tasks in the same matured start cohort. Keep effort separate from waiting time. Missing buckets make this a partial estimate, not total cost. **Monthly:** Finance & Accounting reconciles [cost per accepted outcome](./cost-per-accepted-outcome.mdx), restating late invoices. - -### Can people confidently verify the work? - -**Collect:** an anonymous 1–5 survey after a pilot workflow cycle: verification confidence, manageable workload and usefulness as separate items. **Calculate:** sum of valid confidence scores / valid responses; also show the distribution and responses / invitations × 100. This guides enablement, not claims of saved time. **After each pilot cycle:** People & Administration reviews [confidence and cognitive load](./verification-confidence-and-cognitive-load.mdx); protect small groups. - -### What a pilot report looks like - -**Illustrative arithmetic, not company results or targets.** The bundled synthetic fixture shows four matured starts: one accepted, one failed, one abandoned and one unresolved. Confirmed success is **1 / 4 × 100 = 25%**, with **75%** known-outcome coverage. A newer start has not finished its observation period and is shown separately. - -Recorded compute spend is **EUR 60 / 1 = EUR 60** per accepted outcome—a **partial estimate** because licenses, tooling, review and rework are missing. Five survey responses total 20 points: **20 / 5 = 4** out of 5; response rate is **5 / 10 × 100 = 50%**. The report calls for reconciling the unknown task and missing costs, not claiming a skills benefit. Reproduce it with `node scripts/ai-kpi.mjs`; [fixture and limits](./synthetic-example.mdx). - -## 3. Extend collection as adoption grows - -Keep those outcome measures, then add reach. An adoption percentage is meaningless without a known eligible population. - -**Are supported skills available?** Freeze the expected active installation inventory; compare observed bundle/adapter revisions with the approved support and revocation records. [Supported bundle coverage](./supported-bundle-coverage.mdx) = fresh, verified supported installations / all expected active installations × 100. Offline or stale entries stay in the denominator. **Weekly and at revocation:** Platform & IT reconciles coverage. - -**Are approved workflows being used?** Freeze the lawfully enrolled participant cohort; collect workflow-linked use of an approved revision through a qualified adapter or a separately labeled declaration. [Approved-workflow adoption](./approved-workflow-adoption.mdx) = eligible participants with at least one observed approved use / eligible invited participants × 100. Report this as an observed lower bound with source coverage: missing use is unknown. Installation and loading are not use. **Monthly:** Data & AI reviews reach without invocation quotas or employee rankings. - -## 4. Keep the collection running - -**Are skills still maintained?** From the versioned catalog, join each active approved revision to its owner, substantive review evidence and due date. [Review coverage](./skills-within-substantive-review-window.mdx) = revisions with all three current / all active approved revisions × 100. **Monthly and each release:** Data & AI reports overdue/ownerless revisions and deprecated or revoked versions still in use—not just a percentage. - -At each report, compare like workflows with the baseline and publish the period, counts, exclusions and source coverage. Zero denominators mean “not available.” Trends are descriptive, not causal ROI. Act on critical policy effects immediately; add selection precision/recall at qualification and service-level delivery or departmental outcome measures when their source links are ready. - -Agree purpose, lawful basis, access and retention first. No raw prompts, code or secrets by default; suppress people cohorts below five and prevent identifying drill-downs. +To select a relevant subset and establish actual starting evidence, use [Baseline](../baseline.mdx). Pilot application belongs to [Adoption](../skills-adoption.mdx); ongoing interpretation belongs to [Maintenance](../skills-maintenance.mdx). ## Metric definitions @@ -71,9 +31,7 @@ There are **16 contracts: 9 prototype calculations and 7 unimplemented metrics** The nine calculations cover task success, selection precision and recall, change fail rate, deployment rework, escaped quality, policy effects, cost and the primary human-experience item. The seven omissions are supported bundle coverage, approved-workflow adoption, change lead time, deployment frequency, failed deployment recovery time, substantive-review coverage and workflow-specific business acceptance. -Each contract is a prospective collection design. No live source or observed baseline is established. N and D refer to the numerator and denominator shown for that metric. - -Selection measures concern qualification; coverage and adoption concern reach; DORA measures concern service delivery. Outcome, safety, cost, experience and maintenance measures retain their distinct populations. +Each contract is a prospective definition, not a rollout obligation. No live source or observed baseline is established. N and D refer to the numerator and denominator shown for that metric. 1. [Validated task success](./validated-task-success.mdx) — prototype calculation 2. [Skill selection precision](./skill-selection-precision.mdx) — prototype calculation @@ -92,8 +50,8 @@ Selection measures concern qualification; coverage and adoption concern reach; D 15. [Skills within substantive review window](./skills-within-substantive-review-window.mdx) — unimplemented metric 16. [Workflow-specific business acceptance](./workflow-specific-business-acceptance.mdx) — unimplemented metric -Read [Collection and safeguards](./collection-and-safeguards.mdx) for shared baseline, event and privacy rules. [Run the synthetic measurement example](./synthetic-example.mdx) for reproducible arithmetic and limits. +Read [Collection and safeguards](./collection-and-safeguards.mdx) for shared interpretation, event and privacy rules. [Run the synthetic measurement example](./synthetic-example.mdx) for reproducible arithmetic and limits. -**Next:** [Maintain skills using the evidence →](../skills-maintenance.mdx) +**Next:** [Establish a relevant workflow baseline →](../baseline.mdx)
diff --git a/docs/strategy/skills-adoption.mdx b/docs/strategy/skills-adoption.mdx index 036e2ba..4f88392 100644 --- a/docs/strategy/skills-adoption.mdx +++ b/docs/strategy/skills-adoption.mdx @@ -36,6 +36,36 @@ No developer rankings, individual productivity scores, minimum invocation quotas -**Next:** [Measure accepted outcomes, not activity →](./measurement/index.mdx) +
+Pilot evidence, illustrative report and expansion + +## Apply the selected measures in the pilot + +Use the relevant subset agreed in [Baseline](./baseline.mdx), not every entry in the [Measurement registry](./measurement/index.mdx). Keep its eligibility, independent acceptance and follow-up rules. Capture inputs as work happens; record exact skill revision and client configuration, leaving missing versions unknown. Do not reconstruct review effort from elapsed PR time. + +The following questions are candidates, not a mandatory pilot bundle. Proposed owners and cadences need agreement before collection: + +| If this question is selected | Evidence and pilot review | +| --- | --- | +| Are tasks reaching acceptance? | Join tracker starts to independent acceptance, failure and abandonment. Apply [validated task success](./measurement/validated-task-success.mdx) to matured starts; retain failed, abandoned and unresolved tasks in the denominator and show unknown outcomes and coverage. Proposed weekly reviewer: Quality Engineering. | +| Is quality holding up? | Link accepted changes to confirmed defects, severity and follow-up dates; retain PR/CI evidence. Apply [escaped quality](./measurement/changes-with-escaped-quality-issues.mdx) after follow-up, counting each affected change once, alongside severe incidents. Missing links are not clean work. Proposed monthly reviewer: Quality Engineering. | +| What does an accepted outcome cost? | Reconcile invoices and usage, sampled review/rework minutes at approved rates, unsuccessful attempts and allocated licenses/tooling. Apply [cost per accepted outcome](./measurement/cost-per-accepted-outcome.mdx) to the same matured start cohort; distinguish effort from waiting. Missing buckets make the estimate partial. Proposed monthly reviewer: Finance & Accounting; restate late invoices. | +| Can people confidently verify the work? | Use the anonymous 1–5 survey for confidence, manageable workload and usefulness as separate items. Report the [confidence measure](./measurement/verification-confidence-and-cognitive-load.mdx), distribution and response rate; protect small groups. Proposed reviewer after each pilot cycle: People & Administration. This is enablement evidence, not proven saved time. | + +### What a pilot report looks like + +**Illustrative arithmetic, not company results or targets.** The bundled synthetic fixture shows four matured starts: one accepted, one failed, one abandoned and one unresolved. Confirmed success is **1 / 4 × 100 = 25%**, with **75%** known-outcome coverage. A newer start has not finished its observation period and is shown separately. + +Recorded compute spend is **EUR 60 / 1 = EUR 60** per accepted outcome—a **partial estimate** because licenses, tooling, review and rework are missing. Five survey responses total 20 points: **20 / 5 = 4** out of 5; response rate is **5 / 10 × 100 = 50%**. Reconcile the unknown task and missing costs instead of claiming a skills benefit. Reproduce it with `node scripts/ai-kpi.mjs`; [fixture and limits](./measurement/synthetic-example.mdx). + +### Revisit selection as adoption expands + +Keep relevant outcome evidence comparable; add reach measures only if they answer the expanded workflow's questions. For [supported bundle coverage](./measurement/supported-bundle-coverage.mdx), freeze the expected active installation inventory and compare observed bundle/adapter revisions to support and revocation records. Offline or stale entries stay in the denominator. Platform & IT is the proposed weekly and at-revocation reviewer. + +For [approved-workflow adoption](./measurement/approved-workflow-adoption.mdx), freeze the lawfully enrolled participant cohort and distinguish qualified-adapter observations from labeled declarations. Report the observed lower bound with source coverage: missing use is unknown; installation and loading are not use. Data & AI is the proposed monthly reviewer. No invocation quotas or employee rankings. Return to Baseline for a new workflow rather than treating rollout as company-wide metric collection. + +
+ +**Next:** [Maintain skills using the agreed evidence →](./skills-maintenance.mdx)
diff --git a/docs/strategy/skills-maintenance.mdx b/docs/strategy/skills-maintenance.mdx index 1456f5e..4913075 100644 --- a/docs/strategy/skills-maintenance.mdx +++ b/docs/strategy/skills-maintenance.mdx @@ -44,6 +44,21 @@ Owner ratification is required before adoption. Review earlier after incidents o +
+Ongoing reporting and comparison + +## Keep selected evidence useful + +Continue the measures agreed for the workflow in [Baseline](./baseline.mdx) and applied during [Adoption](./skills-adoption.mdx). Revisit relevance when scope changes; the [registry](./measurement/index.mdx) is a source of choices, not a requirement to collect every metric. + +If substantive-review coverage is selected, join each active approved catalog revision to its owner, substantive review evidence and due date. Apply [review coverage](./measurement/skills-within-substantive-review-window.mdx): revisions with all three current / all active approved revisions × 100. The proposed Data & AI review is monthly and at each release, subject to agreement. Report overdue/ownerless revisions and deprecated or revoked versions still in use—not just a percentage. + +At each agreed report, compare like workflows with their recorded starting position. Publish period, counts, exclusions, source coverage and changes in calculation or scope. Zero denominators mean “not available”; unresolved gaps remain visible. Trends are descriptive, not causal ROI. Reconcile late evidence using versioned corrections and distinguish changed practice from changed measurement. + +Act on critical policy effects immediately; do not wait for a reporting cycle. Use selection precision/recall at qualification, or service-level delivery and departmental outcome measures, only where relevant and their source links are feasible. Confirm purpose, lawful basis, access and retention before changing collection, following the [shared safeguards](./measurement/collection-and-safeguards.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 index 0a54ec5..d79db4e 100644 --- a/docs/strategy/stage-01-skills-adoption.mdx +++ b/docs/strategy/stage-01-skills-adoption.mdx @@ -19,18 +19,23 @@ Adoption then extends to other SDLC phases; their order is not yet decided. Deli ## 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.** +**Understand the current situation → select relevant KPIs and establish a workflow baseline → engineer skills topology → use skills in real work → collect agreed 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 +- [Measurement](./measurement/index.mdx) — browse available candidate metrics; inclusion does not require collection or baselining. +- [Baseline](./baseline.mdx) — understand a workflow, select relevant metrics and record feasible starting evidence or explicit gaps. - [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/index.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. +These six topics belong to Stage 01, not six additional roadmap stages. Establish a baseline per workflow as adoption reaches it—not a mandatory company-wide baseline of every registry metric. + +**Next:** [Browse the Measurement registry →](./measurement/index.mdx) + diff --git a/research/ai-adoption/measurement-migration.json b/research/ai-adoption/measurement-migration.json index 701f272..89b495c 100644 --- a/research/ai-adoption/measurement-migration.json +++ b/research/ai-adoption/measurement-migration.json @@ -150,7 +150,9 @@ "shared": [ { "slug": "collection-and-safeguards", - "sha256": "8610ed8df6a24cf138f9e6e2c09060db2aab4c0b1259ca0168e581e3fb964e52" + "sha256": "37709cf9978a698026492b29f2095996c462e098a74f082a6b3c3a3a7b38ecab", + "previousSha256": "8610ed8df6a24cf138f9e6e2c09060db2aab4c0b1259ca0168e581e3fb964e52", + "revisionNote": "Stage 01 separation: baseline establishment moved to baseline.mdx; DORA candidates are optional. Event/privacy and outcome safeguards retained." }, { "slug": "synthetic-example", diff --git a/scripts/baseline.test.mjs b/scripts/baseline.test.mjs new file mode 100644 index 0000000..7c39f4d --- /dev/null +++ b/scripts/baseline.test.mjs @@ -0,0 +1,34 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFileSync} from 'node:fs'; +const read = path => readFileSync(path, 'utf8'); + +test('Baseline is workflow-scoped, evidence-bound and distinct from the optional registry', () => { + const page = read('docs/strategy/baseline.mdx'); + for (const heading of ['Understand the current workflow','Select relevant metrics, with reasons','Agree feasible evidence','Record the starting position','Keep later evaluation comparable']) assert(page.includes(`## ${heading}`)); + for (const text of ['not a mandatory company-wide baseline','no actual baseline values or approved thresholds','lawful basis','privacy','retention','source coverage','**Available:**','**Unavailable:**','not causal ROI','selected-but-unavailable']) assert(page.includes(text), text); + assert(page.indexOf(' { + const registry = read('docs/strategy/measurement/index.mdx'); + const shared = read('docs/strategy/measurement/collection-and-safeguards.mdx'); + const adoption = read('docs/strategy/skills-adoption.mdx'); + const maintenance = read('docs/strategy/skills-maintenance.mdx'); + assert(!registry.includes('Measure the pilot')); + assert(!shared.includes('Track all five')); + assert(!shared.includes('Before a pilot, freeze')); + assert(shared.includes('id') && shared.includes('{#baseline-and-interpretation}')); // Existing inbound anchor survives relocation. + for (const marker of ['transport retries','quarantined','Late arrivals','Unknown version stays null','30 days','12 months','below five people','No raw prompts','Consent is not presumed']) assert(shared.includes(marker),marker); + assert(adoption.includes('not a mandatory pilot bundle')); + assert(adoption.includes('What a pilot report looks like')); + assert(maintenance.includes('Keep selected evidence useful')); + assert(maintenance.includes('versioned corrections')); + assert(adoption.includes('**Next:** [Maintain skills using the agreed evidence →](./skills-maintenance.mdx)')); +}); diff --git a/scripts/browser/skills-exports.cjs b/scripts/browser/skills-exports.cjs index 4f34cc3..10e1740 100644 --- a/scripts/browser/skills-exports.cjs +++ b/scripts/browser/skills-exports.cjs @@ -7,7 +7,7 @@ const assert=require('node:assert/strict'); const browser=await chromium.launch({executablePath:process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE,args:['--no-sandbox']}); const results=[]; try { - for(const topic of ['governance','quality','adoption','measurement','maintenance']) for(const width of [1440,1024,390,320]){ + for(const topic of ['measurement','baseline','governance','quality','adoption','maintenance']) for(const width of [1440,1024,390,320]){ const spec=JSON.parse(fs.readFileSync(`diagrams/strategy-${topic}${width<=1100?'-mobile':''}.architecture.json`)); const page=await browser.newPage({viewport:{width:1200,height:1000}}); await page.goto('file://'+path.resolve(`${dir}/${topic}-${width}.svg`)); @@ -33,7 +33,10 @@ const assert=require('node:assert/strict'); assert.deepEqual(measured.labelOverlaps,[],`${topic}-${width}: rendered edge labels overlap`); for(const n of spec.components){assert(measured.text.includes(n.label));assert(measured.text.includes(n.tag));for(const line of n.sublabel.split('\n'))assert(measured.text.includes(line));} for(const e of spec.connections)if(e.label)assert(measured.text.includes(e.label)); - if(width===1440)await page.screenshot({path:`${dir}/${topic}-standalone-export.png`}); + if(width===1440){ + await page.setViewportSize({width:spec.meta.viewBox[0],height:spec.meta.viewBox[1]}); + await page.screenshot({path:`${dir}/${topic}-standalone-export.png`}); + } results.push({topic,width,nodes:measured.nodes.length,edges:measured.edges.length,complete:true});await page.close(); } fs.writeFileSync(`${dir}/export-results.json`,JSON.stringify(results,null,2)); diff --git a/scripts/browser/skills-measurement.cjs b/scripts/browser/skills-measurement.cjs index 70a6a73..91d57d2 100644 --- a/scripts/browser/skills-measurement.cjs +++ b/scripts/browser/skills-measurement.cjs @@ -18,12 +18,12 @@ const fs = require('node:fs'); assert.equal(await page.locator('h1').innerText(), 'Skills Measurement'); assert((await page.title()).startsWith('Skills Measurement |')); assert.equal(await page.locator('.strategy-content details').count(), 0); - assert.equal(await page.locator('.strategy-content h2').count(), 5); + assert.equal(await page.locator('.strategy-content h2').count(), 2); 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'}); const metrics = JSON.parse(fs.readFileSync('research/ai-adoption/measurement-migration.json','utf8')).metrics; - assert.deepEqual(await menu.allTextContents(), ['Target','Roadmap','Stage - 01 - Skills Adoption','Governance','Quality','Adoption','Measurement',...metrics.map(m => m.title),'Collection and safeguards','Run the synthetic measurement example','Maintenance','Stage - 02 - Autonomous Agent']); + assert.deepEqual(await menu.allTextContents(), ['Target','Roadmap','Stage - 01 - Skills Adoption','Measurement',...metrics.map(m => m.title),'Collection and safeguards','Run the synthetic measurement example','Baseline','Governance','Quality','Adoption','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'); @@ -51,7 +51,7 @@ const fs = require('node:fs'); assert.equal(await download.failure(), null); const path = `${output}/${width}.svg`; await download.saveAs(path); const svg = fs.readFileSync(path, 'utf8'); - assert(svg.includes('Compare with baseline') && svg.includes('Zero denominator = N/A')); + assert(svg.includes('Available choices') && svg.includes('No mandatory collection')); const opener = panel.getByRole('button', {name:/^Expand /}); await opener.click(); const close = panel.getByRole('button', {name:'Close full-screen diagram', exact:true}); @@ -80,6 +80,6 @@ const fs = require('node:fs'); fs.writeFileSync(`${output}/results.json`, JSON.stringify(results,null,2)); await context.close(); } - console.log(`PASS ${results.length} Skills Measurement viewports: title/sidebar, open plan, diagram geometry/controls/export, all reference links and no page errors`); + console.log(`PASS ${results.length} Skills Measurement viewports: title/sidebar, optional registry, diagram geometry/controls/export, all reference links and no page errors`); } finally {await browser.close();} })().catch(error => {console.error(error); process.exitCode = 1;}); diff --git a/scripts/browser/skills-stories.cjs b/scripts/browser/skills-stories.cjs index 3440212..a7591ab 100644 --- a/scripts/browser/skills-stories.cjs +++ b/scripts/browser/skills-stories.cjs @@ -6,13 +6,23 @@ const assert=require('node:assert/strict'); const out=`.cache/skills-${process.argv[3]||'candidate'}`;fs.mkdirSync(out,{recursive:true}); const browser=await chromium.launch({executablePath:process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE,args:['--no-sandbox']}); const results=[]; try { - for(const topic of ['governance','quality','adoption','measurement','maintenance']) for(const width of [1440,1024,390,320]) { + for(const topic of ['measurement','baseline','governance','quality','adoption','maintenance']) for(const width of [1440,1024,390,320]) { + console.log(`Checking ${topic} at ${width}px`); const page=await browser.newPage({viewport:{width,height:900},colorScheme:'light'});const errors=[];page.on('pageerror',e=>errors.push(e.message)); - const route=topic==='measurement'?topic:`skills-${topic}`; + const route=['measurement','baseline'].includes(topic)?topic:`skills-${topic}`; assert.equal((await page.goto(`${base}/eldorado-v1/documentation/strategy/${route}/`,{waitUntil:'networkidle'})).status(),200); const panel=page.locator('.archify-panel--skills');assert.equal(await panel.count(),1); const iframe=panel.locator(width>1100?'.story-desktop':'.story-mobile');await iframe.scrollIntoViewIfNeeded(); const frame=await(await iframe.elementHandle()).contentFrame();await frame.locator('svg[role="img"]').waitFor(); + // Keep iframe controls below the fixed portal header. Frame-local click + // actionability cannot detect an overlay in the parent document. + const showControls=async()=>{ + await panel.locator('dialog iframe').waitFor({state:'detached'}); + await panel.evaluate(n=>{ + scrollTo({top:n.getBoundingClientRect().top+scrollY-100,behavior:'instant'}); + return new Promise(resolve=>requestAnimationFrame(()=>requestAnimationFrame(resolve))); + }); + }; const geometry=await frame.locator('svg[role="img"]').evaluate(svg=>{ const nodes=[...svg.querySelectorAll('g[data-node-id]')];const issues=[];let min=Infinity; for(const n of nodes){const rect=n.querySelector('rect').getBBox();for(const t of n.querySelectorAll('text')){ @@ -24,8 +34,9 @@ const assert=require('node:assert/strict'); const source=JSON.parse(fs.readFileSync(`diagrams/strategy-${topic}.architecture.json`)); assert.equal(geometry.nodes,source.components.length);assert.deepEqual(geometry.issues,[]);assert(geometry.min>=10,JSON.stringify(geometry)); for(const theme of ['light','dark']){ + await showControls(); if(await frame.locator('html').getAttribute('data-theme')!==theme)await frame.locator('#btn-theme').click(); - await page.waitForFunction(t=>document.documentElement.dataset.theme===t,theme); + await page.waitForFunction(t=>document.documentElement.dataset.theme===t,theme).catch(error=>{throw new Error(`${topic}/${width}/${theme}: theme synchronization failed`,{cause:error});}); await panel.scrollIntoViewIfNeeded();await page.screenshot({path:`${out}/${topic}-${width}-${theme}-inline.png`}); const open=panel.getByRole('button',{name:/^Expand /});await open.click();const close=panel.getByRole('button',{name:'Close full-screen diagram',exact:true});await close.waitFor({state:'visible'}); const expanded=await(await panel.locator('dialog iframe').elementHandle()).contentFrame();await expanded.locator('svg[role="img"]').waitFor(); @@ -34,6 +45,7 @@ const assert=require('node:assert/strict'); if(width<=700){await page.setViewportSize({width,height:480});assert(await panel.locator('dialog').evaluate(n=>n.scrollHeight>n.clientHeight));await panel.locator('dialog').evaluate(n=>n.scrollTop=n.scrollHeight);await page.screenshot({path:`${out}/${topic}-${width}-${theme}-short-bottom.png`});await page.setViewportSize({width,height:900});} await close.focus();await page.keyboard.press('Escape');assert(await open.evaluate(n=>n===document.activeElement)); } + await showControls(); await frame.locator('#btn-preset').click();await frame.locator('[data-preset-value="blueprint"]').click(); await frame.locator('#btn-preset').click();await frame.locator('[data-preset-value="classic"]').click(); await frame.locator('#btn-export').click();const [download]=await Promise.all([page.waitForEvent('download'),frame.locator('[data-format="svg"]').click()]);assert.equal(await download.failure(),null); diff --git a/scripts/browser/strategy-navigation.cjs b/scripts/browser/strategy-navigation.cjs index 7426048..6f763d0 100644 --- a/scripts/browser/strategy-navigation.cjs +++ b/scripts/browser/strategy-navigation.cjs @@ -8,12 +8,12 @@ const fs = require('node:fs'); 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 topics = ['Measurement','Baseline','Governance','Quality','Adoption','Maintenance']; const metrics = JSON.parse(fs.readFileSync('research/ai-adoption/measurement-migration.json','utf8')).metrics; const childIds = [...metrics.map(m => m.docId),'measurement/collection-and-safeguards','measurement/synthetic-example']; const childTitles = [...metrics.map(m => m.title),'Collection and safeguards','Run the synthetic measurement example']; - const ids = ['target-operating-model','roadmap','stage-01-skills-adoption','skills-governance','skills-quality','skills-adoption','measurement',...childIds,'skills-maintenance','stage-02-autonomous-agent']; - const titles = ['Target','Roadmap',first,'Skills governance','Skills quality','Skills adoption','Skills Measurement',...childTitles,'Skills maintenance',second]; + const ids = ['target-operating-model','roadmap','stage-01-skills-adoption','measurement',...childIds,'baseline','skills-governance','skills-quality','skills-adoption','skills-maintenance','stage-02-autonomous-agent']; + const titles = ['Target','Roadmap',first,'Skills Measurement',...childTitles,'Baseline','Skills governance','Skills quality','Skills adoption','Skills maintenance',second]; const browser = await chromium.launch({headless:true, executablePath:process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE, args:['--no-sandbox']}); const results = []; try { @@ -47,7 +47,7 @@ const fs = require('node:fs'); await reference.focus(); await page.keyboard.press('Enter'); await category.getByRole('link', {name:'Validated task success', exact:true}).waitFor({state:'visible'}); - assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,...topics.slice(0,4),...childTitles,'Maintenance',second]); + assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,topics[0],...childTitles,...topics.slice(1),second]); await reference.click(); await page.screenshot({path:`${output}/${width}-expanded.png`, animations:'disabled'}); await caret.click(); @@ -68,14 +68,14 @@ const fs = require('node:fs'); 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]}/`); + if (index) assert.equal(await prev.getAttribute('href'), `${prefix}${id === 'baseline' ? 'measurement' : 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]}/`); + if (index < ids.length-1) assert.equal(await next.getAttribute('href'), `${prefix}${id === 'measurement' ? 'baseline' : ids[index+1]}/`); else assert.equal(await next.count(), 0); if (index >= 3 && index < ids.length - 1) { assert.equal(await page.locator('.breadcrumbs a').filter({hasText:first}).getAttribute('href'), `${prefix}stage-01-skills-adoption/`); menu = await openMenu(); - const expectedTopics = id === 'measurement' || id.startsWith('measurement/') ? [...topics.slice(0,4),...childTitles,'Maintenance'] : topics; + const expectedTopics = id === 'measurement' || id.startsWith('measurement/') ? [topics[0],...childTitles,...topics.slice(1)] : topics; assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,...expectedTopics,second]); if (id.startsWith('measurement/')) assert.equal(await page.locator('.breadcrumbs a').filter({hasText:'Measurement'}).getAttribute('href'), `${prefix}measurement/`); await closeMenu(); diff --git a/scripts/skills-measurement.test.mjs b/scripts/skills-measurement.test.mjs index 3616d7d..fc74e01 100644 --- a/scripts/skills-measurement.test.mjs +++ b/scripts/skills-measurement.test.mjs @@ -4,14 +4,16 @@ import {readFileSync} from 'node:fs'; import {calculate} from './ai-kpi.mjs'; const read = path => readFileSync(path, 'utf8'); -test('Skills Measurement is an open adoption collection plan, not a hidden catalogue', () => { +test('Skills Measurement is a visible optional registry, separate from workflow application', () => { const page = read('docs/strategy/measurement/index.mdx'); 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); + 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('Registry inclusion does not require a metric to be used, collected or baselined')); + assert(page.includes('../baseline.mdx')); assert(!page.includes('
')); assert(page.includes('./collection-and-safeguards.mdx')); assert(!page.includes('Is AI-assisted work worth continuing?')); - for (const word of ['Recommended', 'not installed', 'unknown', 'review', 'CI', 'revision', 'Monthly', 'Weekly']) assert(page.includes(word), word); + for (const word of ['candidate', 'not installed', 'applicability', 'calculation', 'inputs', 'limitations', 'implementation status']) assert(page.includes(word), word); }); test('all sixteen metric definitions remain in the reference with explicit implementation limits', () => { @@ -27,7 +29,7 @@ test('all sixteen metric definitions remain in the reference with explicit imple }); test('published pilot arithmetic matches the executable fixture, including partial cost', () => { - const page = read('docs/strategy/measurement/index.mdx'); + const page = read('docs/strategy/skills-adoption.mdx'); const fixture = JSON.parse(read('scripts/fixtures/ai-kpi-synthetic.json')); const report = calculate(fixture); const success = report.kpis['validated-task-success']; diff --git a/scripts/skills-stories.test.mjs b/scripts/skills-stories.test.mjs index 887c671..bcc0dc3 100644 --- a/scripts/skills-stories.test.mjs +++ b/scripts/skills-stories.test.mjs @@ -6,15 +6,15 @@ import {join} from 'node:path'; import {execFileSync} from 'node:child_process'; import {skillsViewer,isSkillsStory} from './skills-viewer.mjs'; const read = p => readFileSync(p,'utf8'); -const topics = ['governance','quality','adoption','measurement','maintenance']; -test('all six Skills Adoption pages account for exactly five diagrams and ten sources',()=>{ +const topics = ['measurement','baseline','governance','quality','adoption','maintenance']; +test('all seven Skills Adoption pages account for six diagrams and twelve sources',()=>{ let count=0; - for(const route of ['stage-01-skills-adoption',...topics.map(t=>t==='measurement'?t:`skills-${t}`)]){ + for(const route of ['stage-01-skills-adoption',...topics.map(t=>['measurement','baseline'].includes(t)?t:`skills-${t}`)]){ const diagrams=[...read(`docs/strategy/${route === 'measurement' ? 'measurement/index' : route}.mdx`).matchAll(/{ const name=`strategy-${topic}`;const desktop=JSON.parse(read(`diagrams/${name}.architecture.json`)); @@ -43,7 +43,7 @@ test('domain contracts retain human authority, honest measures and Delivery-firs assert(text('quality').includes('Critical effect blocks')); assert(text('adoption').includes('Delivery first')&&text('adoption').includes('Later order undecided')); assert(text('adoption').includes('No quotas or rankings')); - for(const marker of ['Tracker + acceptance','Invoices + review minutes','Changes + defects','Anonymous 1–5 survey','Missing buckets = partial','Zero denominator = N/A'])assert(text('measurement').includes(marker),marker); + for(const marker of ['Available choices','16 candidate contracts','No mandatory collection','Meaning + applicability','9 prototype / 7 unimplemented'])assert(text('measurement').includes(marker),marker); assert(text('maintenance').includes('No automatic reinstatement')); }); test('topic compositions explain distinct relationships rather than a fixed card count',()=>{ @@ -55,6 +55,7 @@ test('topic compositions explain distinct relationships rather than a fixed card has(g,'approve','owner');has(g,'distribute','withdraw'); const q=spec('quality');for(const id of ['selection','safety','artifact','outcome'])has(q,id,'gate');has(q,'gate','accept');has(q,'gate','rework'); const a=spec('adoption');for(const [x,y] of [['human','agent'],['agent','human'],['agent','learn'],['learn','delivery'],['learn','expand'],['human','expand']])has(a,x,y); - const m=spec('measurement');for(const id of ['success','quality','cost','confidence']){has(m,id+'-source',id);has(m,id,'interpret');} + const m=spec('measurement');for(const id of ['qualification','outcomes','experience','health']){has(m,'registry',id);has(m,id,'contract');} + const b=spec('baseline');for(const [x,y] of [['workflow','selection'],['selection','evidence'],['evidence','position'],['position','comparison']])has(b,x,y); const c=spec('maintenance');for(const [x,y] of [['observe','triage'],['triage','change'],['change','validate'],['validate','release'],['release','observe'],['triage','safe'],['safe','observe'],['triage','retire'],['triage','contain'],['contain','change']])has(c,x,y); }); diff --git a/scripts/skills-viewer.mjs b/scripts/skills-viewer.mjs index 6cec6c5..bb9e652 100644 --- a/scripts/skills-viewer.mjs +++ b/scripts/skills-viewer.mjs @@ -1,5 +1,5 @@ // Native editable geometry and edges; scoped editorial typography for Stage 01. -export const isSkillsStory = name => /^strategy-(governance|quality|adoption|measurement|maintenance)(-mobile)?$/.test(name); +export const isSkillsStory = name => /^strategy-(governance|quality|adoption|measurement|baseline|maintenance)(-mobile)?$/.test(name); const escape = text => text.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"'); export function skillsViewer(html, spec) { if (spec.diagram_type !== 'architecture' || !spec.components.length) throw new Error('Skills story contract drift'); diff --git a/scripts/strategy-navigation.test.mjs b/scripts/strategy-navigation.test.mjs index 40f0173..5014a7f 100644 --- a/scripts/strategy-navigation.test.mjs +++ b/scripts/strategy-navigation.test.mjs @@ -14,13 +14,14 @@ test('Strategy has Target, Roadmap, a linked Skills Adoption category and Autono 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:'category', label:'Measurement', collapsed:true, link:{type:'doc', id:'measurement/index'}, items:[ ...JSON.parse(read('research/ai-adoption/measurement-migration.json')).metrics.map(m => m.docId), 'measurement/collection-and-safeguards','measurement/synthetic-example', ]}, + {type:'doc', id:'baseline', label:'Baseline'}, + {type:'doc', id:'skills-governance', label:'Governance'}, + {type:'doc', id:'skills-quality', label:'Quality'}, + {type:'doc', id:'skills-adoption', label:'Adoption'}, {type:'doc', id:'skills-maintenance', label:'Maintenance'}, ], @@ -39,7 +40,7 @@ test('stage overviews explain the foundation and future without replacing topic 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/index','skills-maintenance']) assert(first.includes(`./${id}.mdx`)); + for (const id of ['measurement/index','baseline','skills-governance','skills-quality','skills-adoption','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/index.mdx'), /^title: Skills Measurement\nsidebar_label: Measurement$/m); diff --git a/scripts/strategy-story.test.mjs b/scripts/strategy-story.test.mjs index df2226a..3fb4380 100644 --- a/scripts/strategy-story.test.mjs +++ b/scripts/strategy-story.test.mjs @@ -13,7 +13,7 @@ test('every strategy page leads with a compact diagram story and closes its refe assert(!page.includes('
') || page.indexOf(' story />') < page.indexOf('
'), id); assert(!//g) || []).length, (page.match(/<\/details>/g) || []).length, id); - assert.equal((narrative.match(/^## /gm) || []).length, id === 'measurement' ? 5 : id === 'roadmap' ? 4 : 1, id); + assert.equal((narrative.match(/^## /gm) || []).length, id === 'measurement' ? 2 : id === 'roadmap' ? 4 : 1, id); assert((narrative.match(/^- /gm) || []).length <= 3, id); assert(narrative.includes('**Next:**'), id); assert(!narrative.includes('| ---'), id); diff --git a/scripts/strategy.test.mjs b/scripts/strategy.test.mjs index 051e3fa..2393b0c 100644 --- a/scripts/strategy.test.mjs +++ b/scripts/strategy.test.mjs @@ -6,7 +6,7 @@ const model = JSON.parse(read('research/ai-adoption/strategy-model.json')); test('seven existing strategy pages and two stage overviews preserve canonical routes', () => { assert.equal(model.pages.length, 7); assert.deepEqual(readdirSync('docs/strategy').filter(p => p.endsWith('.mdx')).sort(), - [...model.pages.filter(p => p.id !== 'measurement').map(({id}) => `${id}.mdx`), 'stage-01-skills-adoption.mdx', 'stage-02-autonomous-agent.mdx'].sort()); + [...model.pages.filter(p => p.id !== 'measurement').map(({id}) => `${id}.mdx`), 'stage-01-skills-adoption.mdx', 'stage-02-autonomous-agent.mdx', 'baseline.mdx'].sort()); for (const {id} of model.pages) { const page = read(`docs/strategy/${id === 'measurement' ? 'measurement/index' : id}.mdx`); assert(page.includes(`id: ${id === 'measurement' ? 'index' : id}`)); diff --git a/scripts/verify.mjs b/scripts/verify.mjs index 7065ae8..b0695f8 100644 --- a/scripts/verify.mjs +++ b/scripts/verify.mjs @@ -22,11 +22,13 @@ if (process.argv.includes('--build')) { verifyMeasurementPages(); 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'); + assert(indexes.includes('/eldorado-v1/documentation/strategy/baseline/'), 'Missing indexed Baseline route'); 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'); const strategyPages = [...model.pages, {id:'stage-01-skills-adoption', title:'Stage - 01 - Skills Adoption'}, + {id:'baseline', title:'Baseline'}, {id:'stage-02-autonomous-agent', title:'Stage - 02 - Autonomous Agent'}, ]; for (const {id, title} of strategyPages) { diff --git a/sidebars/strategy.ts b/sidebars/strategy.ts index c9fbe3d..7164fe1 100644 --- a/sidebars/strategy.ts +++ b/sidebars/strategy.ts @@ -9,9 +9,6 @@ export default { 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: 'category', label: 'Measurement', collapsed: true, link: {type: 'doc', id: 'measurement/index'}, @@ -36,6 +33,10 @@ export default { 'measurement/synthetic-example', ], }, + {type: 'doc', id: 'baseline', label: 'Baseline'}, + {type: 'doc', id: 'skills-governance', label: 'Governance'}, + {type: 'doc', id: 'skills-quality', label: 'Quality'}, + {type: 'doc', id: 'skills-adoption', label: 'Adoption'}, {type: 'doc', id: 'skills-maintenance', label: 'Maintenance'}, ], }, diff --git a/src/components/ArchifyDiagram/index.tsx b/src/components/ArchifyDiagram/index.tsx index ff3600e..b0f6eeb 100644 --- a/src/components/ArchifyDiagram/index.tsx +++ b/src/components/ArchifyDiagram/index.tsx @@ -12,7 +12,7 @@ export default function ArchifyDiagram({name, title, compact = false, story = fa const headingId = useId(); const [expanded, setExpanded] = useState(false); const [narrowRoadmap, setNarrowRoadmap] = useState(false); - const skillsStory = /^strategy-(governance|quality|adoption|measurement|maintenance)$/.test(name); + const skillsStory = /^strategy-(governance|quality|adoption|measurement|baseline|maintenance)$/.test(name); useEffect(() => { if (!name.startsWith('strategy-roadmap') && !skillsStory) return; const media = window.matchMedia(skillsStory ? '(max-width: 1100px)' : '(max-width: 999px)'); diff --git a/src/css/custom.css b/src/css/custom.css index 1f13bac..3020baa 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -157,7 +157,8 @@ a:focus-visible, button:focus-visible {outline: 3px solid #b88719; outline-offse .archify-panel--skills {--skills-wide: 2000 / 1200; --skills-narrow: 880 / 2900;} .archify-panel--skills[data-diagram="strategy-governance"] {--skills-wide: 1760 / 1550;} .archify-panel--skills[data-diagram="strategy-adoption"] {--skills-wide: 2040 / 1300; --skills-narrow: 880 / 2200;} -.archify-panel--skills[data-diagram="strategy-measurement"] {--skills-wide: 2400 / 1280; --skills-narrow: 880 / 3900;} +.archify-panel--skills[data-diagram="strategy-measurement"] {--skills-wide: 2400 / 1280; --skills-narrow: 880 / 2600;} +.archify-panel--skills[data-diagram="strategy-baseline"] {--skills-wide: 2400 / 1280; --skills-narrow: 880 / 2200;} .archify-panel--skills[data-diagram="strategy-maintenance"] {--skills-wide: 2630 / 1480; --skills-narrow: 880 / 3250;} .archify-panel--story.archify-panel--skills > .story-desktop {aspect-ratio: var(--skills-wide); height: auto;} @media (max-width: 1100px) {