Compare commits

...
Author SHA1 Message Date
jarvis-at-skic 1a2d16bc91 docs: [verified] answer the six-month AI Architect assignment
Build and publish Eldorado documentation / build (pull_request) Successful in 1m30s
2026-10-08 16:59:36 +00:00
jarvis-at-skic 88a4375776 Merge pull request 'docs: connect all Strategy pages through a practical Delivery journey' (#37) from docs/connected-strategy into main
Build and publish Eldorado documentation / build (push) Successful in 49s
2026-10-08 06:44:01 -07:00
jarvis-at-skic f7a68d7e37 docs: [verified] connect Strategy through practical Delivery journey
Build and publish Eldorado documentation / build (pull_request) Successful in 42s
2026-10-08 13:29:59 +00:00
jarvis-at-skic c934ddb5e0 Merge pull request 'docs: separate workflow effectiveness from skill health' (#36) from feat/measurement-two-tracks into main
Build and publish Eldorado documentation / build (push) Successful in 43s
2026-10-08 04:17:58 -07:00
jarvis-at-skic e22d3a5c13 docs: separate workflow effectiveness from skill health
Build and publish Eldorado documentation / build (pull_request) Successful in 52s
2026-10-08 11:05:00 +00:00
jarvis-at-skic 386133c8b6 Merge pull request 'docs: separate Measurement registry and workflow Baseline' (#35) from feat/measurement-baseline-separation into main
Build and publish Eldorado documentation / build (push) Successful in 44s
2026-10-07 06:47:31 -07:00
71 changed files with 2631 additions and 1014 deletions

No files matched your search

@@ -50,7 +50,7 @@
"id": "agent",
"type": "external",
"label": "AI Agent",
"tag": "Supported client + approved skills",
"tag": "Qualified client + authorized pilot",
"sublabel": "Produce work within the boundary",
"pos": [
60,
@@ -81,9 +81,9 @@
{
"id": "expand",
"type": "backend",
"label": "Expand on evidence",
"tag": "Other SDLC phases",
"sublabel": "Later order undecided\nDelivery keeps improving",
"label": "Decide from evidence",
"tag": "Owner; new scope is separate",
"sublabel": "Retain / improve / hold / stop\nExpansion is a new proposal",
"pos": [
60,
1650
+4 -4
View File
@@ -50,7 +50,7 @@
"id": "agent",
"type": "external",
"label": "AI Agent",
"tag": "Supported client + approved skills",
"tag": "Qualified client + authorized pilot",
"sublabel": "Produce work within the boundary",
"pos": [
700,
@@ -81,9 +81,9 @@
{
"id": "expand",
"type": "backend",
"label": "Expand on evidence",
"tag": "Other SDLC phases",
"sublabel": "Later order undecided\nDelivery keeps improving",
"label": "Decide from evidence",
"tag": "Owner; new scope is separate",
"sublabel": "Retain / improve / hold / stop\nExpansion is a new proposal",
"pos": [
1460,
360
@@ -49,9 +49,9 @@
{
"id": "canary",
"type": "external",
"label": "03 Qualify real use",
"tag": "Human + AI Agent",
"sublabel": "Exact client + bounded canary",
"label": "03 Authorize pilot",
"tag": "Owning team approver",
"sublabel": "Qualified; pin, load, pilot",
"pos": [
60,
860
@@ -65,9 +65,9 @@
{
"id": "approve",
"type": "backend",
"label": "04 Approve exact scope",
"label": "04 Decide exact scope",
"tag": "Accountable approvers",
"sublabel": "Digest + permitted uses + expiry",
"sublabel": "Compare pilot: approve / hold",
"pos": [
60,
1230
@@ -115,7 +115,7 @@
"type": "security",
"label": "Withdraw / roll back",
"tag": "Unsafe revision",
"sublabel": "Revoke; restore last-known-good",
"sublabel": "Revoke; restore or remove candidate",
"pos": [
60,
2340
@@ -49,9 +49,9 @@
{
"id": "canary",
"type": "external",
"label": "03 Qualify real use",
"tag": "Human + AI Agent",
"sublabel": "Exact client + bounded canary",
"label": "03 Authorize pilot",
"tag": "Owning team approver",
"sublabel": "Qualified; pin, load, pilot",
"pos": [
520,
500
@@ -65,9 +65,9 @@
{
"id": "approve",
"type": "backend",
"label": "04 Approve exact scope",
"label": "04 Decide exact scope",
"tag": "Accountable approvers",
"sublabel": "Digest + permitted uses + expiry",
"sublabel": "Compare pilot: approve / hold",
"pos": [
740,
720
@@ -115,7 +115,7 @@
"type": "security",
"label": "Withdraw / roll back",
"tag": "Unsafe revision",
"sublabel": "Revoke; restore last-known-good",
"sublabel": "Revoke; restore or remove candidate",
"pos": [
80,
1160
@@ -38,7 +38,7 @@
"sublabel": "Useful? Safe? Still needed?",
"pos": [
60,
1970
490
],
"size": [
740,
@@ -66,11 +66,11 @@
"id": "validate",
"type": "external",
"label": "Revalidate",
"tag": "Independent reviewers",
"sublabel": "Regression + client evidence",
"tag": "Quality Engineering reviewer",
"sublabel": "Fitness + regression + client checks",
"pos": [
60,
860
1600
],
"size": [
740,
@@ -86,7 +86,7 @@
"sublabel": "Verify distribution and recovery",
"pos": [
60,
490
1970
],
"size": [
740,
@@ -134,7 +134,7 @@
"sublabel": "Revoke + quarantine + roll back\nNo automatic reinstatement",
"pos": [
60,
1600
860
],
"size": [
740,
@@ -144,195 +144,15 @@
}
],
"connections": [
{
"id": "observe-triage",
"from": "observe",
"to": "triage",
"label": "",
"fromSide": "left",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
20,
230.0
],
[
20,
2080.0
]
],
"labelAt": [
620,
1930
]
},
{
"id": "triage-change",
"from": "triage",
"to": "change",
"label": "Correct",
"fromSide": "right",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
850,
2080.0
],
[
850,
1340.0
]
],
"labelAt": [
780,
1560
]
},
{
"id": "change-validate",
"from": "change",
"to": "validate",
"label": "",
"fromSide": "top",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
610,
1135
]
},
{
"id": "validate-release",
"from": "validate",
"to": "release",
"label": "",
"fromSide": "top",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
610,
765
]
},
{
"id": "release-observe",
"from": "release",
"to": "observe",
"label": "",
"fromSide": "top",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
610,
395
]
},
{
"id": "triage-safe",
"from": "triage",
"to": "safe",
"label": "Safe",
"fromSide": "right",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
824,
2080.0
],
[
824,
2820.0
]
],
"labelAt": [
620,
2670
]
},
{
"id": "triage-retire",
"from": "triage",
"to": "retire",
"label": "Retire",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
610,
2245
]
},
{
"id": "triage-contain",
"from": "triage",
"to": "contain",
"label": "Unsafe",
"fromSide": "top",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "security",
"labelAt": [
610,
1875
]
},
{
"id": "contain-change",
"from": "contain",
"to": "change",
"label": "Reviewed fix",
"fromSide": "top",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "security",
"labelAt": [
610,
1505
]
},
{
"id": "safe-observe",
"from": "safe",
"to": "observe",
"label": "Keep watching",
"fromSide": "left",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
42,
2820.0
],
[
42,
230.0
]
],
"labelAt": [
620,
80
]
}
{"id":"observe-triage","from":"observe","to":"triage","label":"","fromSide":"bottom","toSide":"top","route":"straight","width":4,"variant":"default"},
{"id":"triage-change","from":"triage","to":"change","label":"Correct","fromSide":"right","toSide":"right","route":"straight","width":4,"variant":"default","via":[[824,600],[824,1340]],"labelAt":[640,1190]},
{"id":"change-validate","from":"change","to":"validate","label":"","fromSide":"bottom","toSide":"top","route":"straight","width":4,"variant":"default"},
{"id":"validate-release","from":"validate","to":"release","label":"","fromSide":"bottom","toSide":"top","route":"straight","width":4,"variant":"default"},
{"id":"release-observe","from":"release","to":"observe","label":"","fromSide":"left","toSide":"left","route":"straight","width":4,"variant":"default","via":[[42,2080],[42,230]]},
{"id":"triage-safe","from":"triage","to":"safe","label":"Safe","fromSide":"right","toSide":"right","route":"straight","width":4,"variant":"default","via":[[872,600],[872,2820]],"labelAt":[620,2670]},
{"id":"triage-retire","from":"triage","to":"retire","label":"Retire","fromSide":"right","toSide":"right","route":"straight","width":4,"variant":"default","via":[[850,600],[850,2450]],"labelAt":[620,2300]},
{"id":"triage-contain","from":"triage","to":"contain","label":"Unsafe","fromSide":"bottom","toSide":"top","route":"straight","width":4,"variant":"security","labelAt":[610,795]},
{"id":"contain-change","from":"contain","to":"change","label":"Reviewed fix","fromSide":"bottom","toSide":"top","route":"straight","width":4,"variant":"security","labelAt":[610,1135]},
{"id":"safe-observe","from":"safe","to":"observe","label":"Keep watching","fromSide":"left","toSide":"left","route":"straight","width":4,"variant":"default","via":[[20,2820],[20,230]],"labelAt":[620,80]}
]
}
@@ -66,8 +66,8 @@
"id": "validate",
"type": "external",
"label": "Revalidate",
"tag": "Independent reviewers",
"sublabel": "Regression + client evidence",
"tag": "Quality Engineering reviewer",
"sublabel": "Fitness + regression + client checks",
"pos": [
560,
970
@@ -283,7 +283,7 @@
]
],
"labelAt": [
1900,
1930,
490
]
},
@@ -1,284 +1,20 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "Candidate metric registry",
"output": "static/diagrams/strategy-measurement-mobile/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
880,
2450
]
},
"meta": {"title": "Two connected measurement tracks", "output": "static/diagrams/strategy-measurement-mobile/index.html", "quality_profile": "showcase", "legend": {"mode": "hidden"}, "viewBox": [880, 2450]},
"components": [
{
"id": "registry",
"type": "backend",
"label": "Available choices",
"tag": "Registry, not a rollout plan",
"sublabel": "16 candidate contracts\nUse only what is relevant\nNo mandatory collection",
"pos": [
90,
50
],
"size": [
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"
}
{"id": "workflow", "type": "backend", "label": "Workflow effectiveness", "tag": "01 / Baseline current work", "sublabel": "Accepted work, time, failures\nCost, effort + experience\nSelect relevant contracts only\nSkills need not exist yet", "pos": [90, 50], "size": [700, 350], "icon": "none"},
{"id": "compare", "type": "backend", "label": "Compare the same outcomes", "tag": "02 / After introducing skills", "sublabel": "Same workflow + acceptance\nSame follow-up + source coverage\nKeep gaps and task mix visible\nBefore / after is not causality", "pos": [90, 450], "size": [700, 350], "icon": "none"},
{"id": "interpret", "type": "external", "label": "Is work getting better?", "tag": "03 / Interpret workflow evidence", "sublabel": "Balance value, quality and risk\nMore adoption is not better work\nKeep live outcomes separate\nfrom skill evaluation cases", "pos": [90, 850], "size": [700, 350], "icon": "none"},
{"id": "skills", "type": "frontend", "label": "Skills effectiveness & health", "tag": "01 / Qualify named skill versions", "sublabel": "Quality: artifact fitness + safety\nCandidate / approved regression\nSelection precision + recall\nNo applicable skills: N/A", "pos": [90, 1250], "size": [700, 350], "icon": "none"},
{"id": "observe", "type": "frontend", "label": "Observe use + upkeep", "tag": "02 / Adoption and maintenance", "sublabel": "Supported bundle coverage\nApproved-workflow adoption\nSubstantive review evidence\nMissing observations: unknown", "pos": [90, 1650], "size": [700, 350], "icon": "none"},
{"id": "improve", "type": "external", "label": "Improve, retain or retire", "tag": "03 / Use both tracks together", "sublabel": "Owner + independent evidence\nRetain / improve / stop\nNew scope needs new comparison\nNo mandatory collection", "pos": [90, 2050], "size": [700, 350], "icon": "none"}
],
"connections": [
{
"id": "registry-qualification",
"from": "registry",
"to": "qualification",
"label": "",
"fromSide": "left",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
45,
225
],
[
45,
625
]
]
},
{
"id": "qualification-contract",
"from": "qualification",
"to": "contract",
"label": "",
"fromSide": "right",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
835,
625
],
[
835,
2225
]
]
},
{
"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",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
835,
1025
],
[
835,
2225
]
]
},
{
"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",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
835,
1425
],
[
835,
2225
]
]
},
{
"id": "registry-health",
"from": "registry",
"to": "health",
"label": "",
"fromSide": "left",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"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
]
]
}
{"id": "workflow-compare", "from": "workflow", "to": "compare", "label": "", "fromSide": "bottom", "toSide": "top", "route": "straight", "width": 4, "variant": "default"},
{"id": "compare-interpret", "from": "compare", "to": "interpret", "label": "", "fromSide": "bottom", "toSide": "top", "route": "straight", "width": 4, "variant": "default"},
{"id": "skills-observe", "from": "skills", "to": "observe", "label": "", "fromSide": "bottom", "toSide": "top", "route": "straight", "width": 4, "variant": "default"},
{"id": "observe-improve", "from": "observe", "to": "improve", "label": "", "fromSide": "bottom", "toSide": "top", "route": "straight", "width": 4, "variant": "default"},
{"id": "interpret-improve", "from": "interpret", "to": "improve", "label": "", "fromSide": "right", "toSide": "right", "route": "straight", "width": 4, "variant": "default", "via": [[835, 1025], [835, 2225]]}
]
}
}
+13 -277
View File
@@ -1,284 +1,20 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "Candidate metric registry",
"output": "static/diagrams/strategy-measurement/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
2400,
1120
]
},
"meta": {"title": "Two connected measurement tracks", "output": "static/diagrams/strategy-measurement/index.html", "quality_profile": "showcase", "legend": {"mode": "hidden"}, "viewBox": [2400, 960]},
"components": [
{
"id": "registry",
"type": "backend",
"label": "Available choices",
"tag": "Registry, not a rollout plan",
"sublabel": "16 candidate contracts\nUse only what is relevant\nNo mandatory collection",
"pos": [
40,
405
],
"size": [
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"
}
{"id": "workflow", "type": "backend", "label": "Workflow effectiveness", "tag": "01 / Baseline current work", "sublabel": "Accepted work, time, failures\nCost, effort + experience\nSelect relevant contracts only\nSkills need not exist yet", "pos": [40, 40], "size": [720, 310], "icon": "none"},
{"id": "compare", "type": "backend", "label": "Compare the same outcomes", "tag": "02 / After introducing skills", "sublabel": "Same workflow + acceptance\nSame follow-up + source coverage\nKeep gaps and task mix visible\nBefore / after is not causality", "pos": [840, 40], "size": [720, 310], "icon": "none"},
{"id": "interpret", "type": "external", "label": "Is work getting better?", "tag": "03 / Interpret workflow evidence", "sublabel": "Balance value, quality and risk\nMore adoption is not better work\nKeep live outcomes separate\nfrom skill evaluation cases", "pos": [1640, 40], "size": [720, 310], "icon": "none"},
{"id": "skills", "type": "frontend", "label": "Skills effectiveness & health", "tag": "01 / Qualify named skill versions", "sublabel": "Quality: artifact fitness + safety\nCandidate / approved regression\nSelection precision + recall\nNo applicable skills: N/A", "pos": [40, 590], "size": [720, 310], "icon": "none"},
{"id": "observe", "type": "frontend", "label": "Observe use + upkeep", "tag": "02 / Adoption and maintenance", "sublabel": "Supported bundle coverage\nApproved-workflow adoption\nSubstantive review evidence\nMissing observations: unknown", "pos": [840, 590], "size": [720, 310], "icon": "none"},
{"id": "improve", "type": "external", "label": "Improve, retain or retire", "tag": "03 / Use both tracks together", "sublabel": "Owner + independent evidence\nRetain / improve / stop\nNew scope needs new comparison\nNo mandatory collection", "pos": [1640, 590], "size": [720, 310], "icon": "none"}
],
"connections": [
{
"id": "registry-qualification",
"from": "registry",
"to": "qualification",
"label": "",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
715,
560
],
[
715,
150
]
]
},
{
"id": "qualification-contract",
"from": "qualification",
"to": "contract",
"label": "",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
1605,
150
],
[
1605,
535
]
]
},
{
"id": "registry-outcomes",
"from": "registry",
"to": "outcomes",
"label": "",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
715,
560
],
[
715,
420
]
]
},
{
"id": "outcomes-contract",
"from": "outcomes",
"to": "contract",
"label": "",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
1605,
420
],
[
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
]
]
}
{"id": "workflow-compare", "from": "workflow", "to": "compare", "label": "", "fromSide": "right", "toSide": "left", "route": "straight", "width": 4, "variant": "default"},
{"id": "compare-interpret", "from": "compare", "to": "interpret", "label": "", "fromSide": "right", "toSide": "left", "route": "straight", "width": 4, "variant": "default"},
{"id": "skills-observe", "from": "skills", "to": "observe", "label": "", "fromSide": "right", "toSide": "left", "route": "straight", "width": 4, "variant": "default"},
{"id": "observe-improve", "from": "observe", "to": "improve", "label": "", "fromSide": "right", "toSide": "left", "route": "straight", "width": 4, "variant": "default"},
{"id": "interpret-improve", "from": "interpret", "to": "improve", "label": "", "fromSide": "bottom", "toSide": "top", "route": "straight", "width": 4, "variant": "default"}
]
}
}
@@ -66,8 +66,8 @@
"id": "outcome",
"type": "external",
"label": "Useful outcome?",
"tag": "Workflow evidence",
"sublabel": "Baseline + repeated trials",
"tag": "Declared evaluation cases",
"sublabel": "Fitness + revision regression",
"pos": [
60,
1230
@@ -98,8 +98,8 @@
"id": "accept",
"type": "backend",
"label": "Accept evidence",
"tag": "All mandatory gates passed",
"sublabel": "Proceed to scoped approval",
"tag": "Quality Engineering reviewer",
"sublabel": "Owner decides bounded pilot",
"pos": [
60,
2060
+4 -4
View File
@@ -66,8 +66,8 @@
"id": "outcome",
"type": "external",
"label": "Useful outcome?",
"tag": "Workflow evidence",
"sublabel": "Baseline + repeated trials",
"tag": "Declared evaluation cases",
"sublabel": "Fitness + revision regression",
"pos": [
60,
790
@@ -98,8 +98,8 @@
"id": "accept",
"type": "backend",
"label": "Accept evidence",
"tag": "All mandatory gates passed",
"sublabel": "Proceed to scoped approval",
"tag": "Quality Engineering reviewer",
"sublabel": "Owner decides bounded pilot",
"pos": [
1430,
160
@@ -28,7 +28,7 @@
"yOffset": -140.0,
"type": "backend",
"label": "Delivery first",
"sublabel": "Human + AI Agent; keep improving.",
"sublabel": "One willing team; keep improving.",
"width": 340,
"height": 240
},
@@ -38,8 +38,8 @@
"col": 0,
"yOffset": 140.0,
"type": "backend",
"label": "Other SDLC phases",
"sublabel": "Expand adoption; order not yet decided.",
"label": "Transfer or stay",
"sublabel": "New scope needs evidence and consent.",
"width": 340,
"height": 240
}
@@ -28,7 +28,7 @@
"yOffset": 0,
"type": "backend",
"label": "Delivery first",
"sublabel": "Human + AI Agent; keep improving.",
"sublabel": "One willing team; keep improving.",
"width": 340,
"height": 240
},
@@ -38,8 +38,8 @@
"col": 1,
"yOffset": 0,
"type": "backend",
"label": "Other SDLC phases",
"sublabel": "Expand adoption; order not yet decided.",
"label": "Transfer or stay",
"sublabel": "New scope needs evidence and consent.",
"width": 340,
"height": 240
}
@@ -50,8 +50,8 @@
"col": 0,
"yOffset": -140.0,
"type": "backend",
"label": "Engineer topology",
"sublabel": "Connect skills, triggers and handoffs.",
"label": "Choose intervention",
"sublabel": "Context, coaching, tooling or skills.",
"width": 340,
"height": 240
},
@@ -61,8 +61,8 @@
"col": 0,
"yOffset": 140.0,
"type": "backend",
"label": "Use skills",
"sublabel": "Real work with a human + AI Agent.",
"label": "Qualify, then pilot",
"sublabel": "Authorize bounded human + AI work.",
"width": 340,
"height": 240
},
@@ -83,8 +83,8 @@
"col": 0,
"yOffset": 700.0,
"type": "backend",
"label": "Understand anew",
"sublabel": "Compare with baseline; repeat the loop.",
"label": "Retain or stop",
"sublabel": "Compare burden and outcomes; learn.",
"width": 340,
"height": 240
}
+6 -6
View File
@@ -50,8 +50,8 @@
"col": 2,
"yOffset": -160,
"type": "backend",
"label": "Engineer topology",
"sublabel": "Connect skills, triggers and handoffs.",
"label": "Choose intervention",
"sublabel": "Context, coaching, tooling or skills.",
"width": 340,
"height": 240
},
@@ -61,8 +61,8 @@
"col": 2,
"yOffset": 160,
"type": "backend",
"label": "Use skills",
"sublabel": "Real work with a human + AI Agent.",
"label": "Qualify, then pilot",
"sublabel": "Authorize bounded human + AI work.",
"width": 340,
"height": 240
},
@@ -83,8 +83,8 @@
"col": 0,
"yOffset": 160,
"type": "backend",
"label": "Understand anew",
"sublabel": "Compare with baseline; repeat the loop.",
"label": "Retain or stop",
"sublabel": "Compare burden and outcomes; learn.",
"width": 340,
"height": 240
}
@@ -2,7 +2,7 @@
"schema_version": 2,
"diagram_type": "workflow",
"meta": {
"title": "Two stages toward Target",
"title": "Proposed six months: test, then decide",
"output": "static/diagrams/strategy-roadmap-mobile/index.html",
"quality_profile": "showcase",
"animation": "none",
@@ -13,7 +13,7 @@
"lanes": [
{
"id": "adoption",
"label": "Two stages toward Target"
"label": "Proposed six-month investment choices"
}
],
"mainPath": [
@@ -27,8 +27,8 @@
"col": 0,
"yOffset": -140.0,
"type": "backend",
"label": "Adopt skills",
"sublabel": "Human + AI Agent in each SDLC phase.",
"label": "Learn and test",
"sublabel": "One willing team; current AI baseline.",
"width": 340,
"height": 240
},
@@ -38,8 +38,8 @@
"col": 0,
"yOffset": 140.0,
"type": "backend",
"label": "Autonomous Agent",
"sublabel": "Future: use proven skills and practices.",
"label": "Retain or stop",
"sublabel": "Value and upkeep decide any transfer.",
"width": 340,
"height": 240
}
+6 -6
View File
@@ -2,7 +2,7 @@
"schema_version": 2,
"diagram_type": "workflow",
"meta": {
"title": "Two stages toward Target",
"title": "Proposed six months: test, then decide",
"output": "static/diagrams/strategy-roadmap/index.html",
"quality_profile": "showcase",
"animation": "none",
@@ -13,7 +13,7 @@
"lanes": [
{
"id": "adoption",
"label": "Two stages toward Target"
"label": "Proposed six-month investment choices"
}
],
"mainPath": [
@@ -27,8 +27,8 @@
"col": 0,
"yOffset": 0,
"type": "backend",
"label": "Adopt skills",
"sublabel": "Human + AI Agent in each SDLC phase.",
"label": "Learn and test",
"sublabel": "One willing team; current AI baseline.",
"width": 340,
"height": 240
},
@@ -38,8 +38,8 @@
"col": 1,
"yOffset": 0,
"type": "backend",
"label": "Autonomous Agent",
"sublabel": "Future: use proven skills and practices.",
"label": "Retain or stop",
"sublabel": "Value and upkeep decide any transfer.",
"width": 340,
"height": 240
}
@@ -0,0 +1,249 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "Proposed: first six months as AI Architect",
"output": "static/diagrams/strategy-six-months-mobile/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
1000,
2950
]
},
"components": [
{
"id": "baseline",
"type": "external",
"label": "Month 1: discover",
"tag": "Architect + CTO + willing teams",
"sublabel": "Current AI workflows + constraints\nPair with developers and reviewers\nChoose an evidenced bottleneck",
"pos": [
200,
40
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "engineer",
"type": "external",
"label": "Month 2: agree experiment",
"tag": "Architect + partner lead + reviewer",
"sublabel": "One workflow + feasible baseline\nChoose context, coaching or tooling\nSkills only if they fit the problem",
"pos": [
200,
450
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "qualify",
"type": "security",
"label": "Month 3: pair and pilot",
"tag": "Team agrees time; owner permits scope",
"sublabel": "Independent checks before live work\nCollect accepted work and burden\nUnsafe or unsupported: stop",
"pos": [
200,
860
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "pilot",
"type": "external",
"label": "Month 4: decide from evidence",
"tag": "Workflow owner + CTO review",
"sublabel": "Compare current practice and pilot\nRetain / change / hold / stop\nIncomplete: bounded extension only",
"pos": [
200,
1270
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "decide",
"type": "security",
"label": "Month 5: transfer selectively",
"tag": "Willing champion + team lead",
"sublabel": "Only if value and upkeep hold\nTry another team with new baseline\nNo capacity: stay narrow or retire",
"pos": [
200,
1680
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "maintain",
"type": "external",
"label": "Month 6: hand over or stop",
"tag": "Team owner + CTO investment decision",
"sublabel": "Evidence, costs and limits visible\nOwned workflow or documented stop\nNext quarter is not automatic AI",
"pos": [
200,
2090
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "reference",
"type": "backend",
"label": "Proposed six-month plan",
"tag": "Solo architect; no team authority",
"sublabel": "Month 6 → 2: revise next question\nMonth 5 → 1: baseline new scope\nProposed, not company commitments",
"pos": [
200,
2500
],
"size": [
740,
300
],
"icon": "none"
}
],
"connections": [
{
"id": "baseline-engineer",
"from": "baseline",
"to": "engineer",
"label": "Problem",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
405
]
},
{
"id": "engineer-qualify",
"from": "engineer",
"to": "qualify",
"label": "Agreement",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
815
]
},
{
"id": "qualify-pilot",
"from": "qualify",
"to": "pilot",
"label": "Evidence",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
1225
]
},
{
"id": "pilot-decide",
"from": "pilot",
"to": "decide",
"label": "Decision",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
1635
]
},
{
"id": "decide-maintain",
"from": "decide",
"to": "maintain",
"label": "Handover",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
2045
]
},
{
"id": "maintain-engineer",
"from": "maintain",
"to": "engineer",
"label": "",
"fromSide": "left",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
145,
2240
],
[
145,
600
]
]
},
{
"id": "decide-baseline",
"from": "decide",
"to": "baseline",
"label": "",
"fromSide": "right",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
980,
1830
],
[
980,
190
]
]
}
]
}
@@ -0,0 +1,271 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "Proposed: first six months as AI Architect",
"output": "static/diagrams/strategy-six-months/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
2400,
1580
]
},
"components": [
{
"id": "baseline",
"type": "external",
"label": "Month 1: discover",
"tag": "Architect + CTO + willing teams",
"sublabel": "Current AI workflows + constraints\nPair with developers and reviewers\nChoose an evidenced bottleneck",
"pos": [
100,
100
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "engineer",
"type": "external",
"label": "Month 2: agree experiment",
"tag": "Architect + partner lead + reviewer",
"sublabel": "One workflow + feasible baseline\nChoose context, coaching or tooling\nSkills only if they fit the problem",
"pos": [
900,
100
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "qualify",
"type": "security",
"label": "Month 3: pair and pilot",
"tag": "Team agrees time; owner permits scope",
"sublabel": "Independent checks before live work\nCollect accepted work and burden\nUnsafe or unsupported: stop",
"pos": [
1700,
100
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "pilot",
"type": "external",
"label": "Month 4: decide from evidence",
"tag": "Workflow owner + CTO review",
"sublabel": "Compare current practice and pilot\nRetain / change / hold / stop\nIncomplete: bounded extension only",
"pos": [
1700,
730
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "decide",
"type": "security",
"label": "Month 5: transfer selectively",
"tag": "Willing champion + team lead",
"sublabel": "Only if value and upkeep hold\nTry another team with new baseline\nNo capacity: stay narrow or retire",
"pos": [
900,
730
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "maintain",
"type": "external",
"label": "Month 6: hand over or stop",
"tag": "Team owner + CTO investment decision",
"sublabel": "Evidence, costs and limits visible\nOwned workflow or documented stop\nNext quarter is not automatic AI",
"pos": [
100,
730
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "reference",
"type": "backend",
"label": "Proposed six-month plan",
"tag": "Solo architect; no team authority",
"sublabel": "Month 6 → 2: revise next question\nMonth 5 → 1: baseline new scope\nProposed, not company commitments",
"pos": [
100,
1270
],
"size": [
2200,
260
],
"icon": "none"
}
],
"connections": [
{
"id": "baseline-engineer",
"from": "baseline",
"to": "engineer",
"label": "Problem",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
800,
210
]
},
{
"id": "engineer-qualify",
"from": "engineer",
"to": "qualify",
"label": "Agreement",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
1600,
210
]
},
{
"id": "qualify-pilot",
"from": "qualify",
"to": "pilot",
"label": "Evidence",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
2000,
520
]
],
"labelAt": [
2010,
535
]
},
{
"id": "pilot-decide",
"from": "pilot",
"to": "decide",
"label": "Decision",
"fromSide": "left",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
1600,
840
]
},
{
"id": "decide-maintain",
"from": "decide",
"to": "maintain",
"label": "Handover",
"fromSide": "left",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
800,
840
]
},
{
"id": "maintain-engineer",
"from": "maintain",
"to": "engineer",
"label": "Next question",
"fromSide": "top",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
400,
550
],
[
1200,
550
]
],
"labelAt": [
800,
535
]
},
{
"id": "decide-baseline",
"from": "decide",
"to": "baseline",
"label": "New scope",
"fromSide": "bottom",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
1200,
1150
],
[
60,
1150
],
[
60,
430
],
[
400,
430
]
],
"labelAt": [
620,
1135
]
}
]
}
@@ -0,0 +1,249 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "TO-BE: stage01",
"output": "static/diagrams/strategy-stage01-mobile/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
1000,
2950
]
},
"components": [
{
"id": "baseline",
"type": "external",
"label": "Understand + baseline",
"tag": "Product Engineering workflow owner",
"sublabel": "Workflow map + desired improvement\nSelected measures + starting evidence\nGovernance: people, scope, authority",
"pos": [
200,
40
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "engineer",
"type": "external",
"label": "Choose an intervention",
"tag": "Owning team + independent reviewer",
"sublabel": "Context, coaching, tooling or skills\nPinned candidate + client + limits\nDeliver: patch and regression tests",
"pos": [
200,
450
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "qualify",
"type": "security",
"label": "Fit for a bounded pilot?",
"tag": "Quality evidence \u2192 owning approver",
"sublabel": "Artifact + safety + regression report\nPass: authorize exact pilot scope\nFail / incomplete: hold or rework",
"pos": [
200,
860
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "pilot",
"type": "external",
"label": "Pilot real work",
"tag": "Human + AI Agent; independent review",
"sublabel": "Use qualified revision within scope\nAccepted / failed work + feedback\nManual path; no new release power",
"pos": [
200,
1270
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "decide",
"type": "security",
"label": "Retain, improve or stop?",
"tag": "Workflow owner + reviewed evidence",
"sublabel": "Compare with baseline, not trials\nNo justified benefit: hold / stop\nNew scope: baseline + new approval",
"pos": [
200,
1680
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "maintain",
"type": "external",
"label": "Maintain + requalify",
"tag": "Owner, Quality, Platform & Security",
"sublabel": "Retain: support approved revision\nDrift / defects: revise and retest\nHarm: contain; never auto-restore",
"pos": [
200,
2090
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "reference",
"type": "backend",
"label": "Governance + Measurement",
"tag": "Throughout, not one-time gates",
"sublabel": "Left return: changed revision\nRight return: new scope needs baseline\nSelected evidence; no forced rollout",
"pos": [
200,
2500
],
"size": [
740,
300
],
"icon": "none"
}
],
"connections": [
{
"id": "baseline-engineer",
"from": "baseline",
"to": "engineer",
"label": "Map",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
405
]
},
{
"id": "engineer-qualify",
"from": "engineer",
"to": "qualify",
"label": "Candidate",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
815
]
},
{
"id": "qualify-pilot",
"from": "qualify",
"to": "pilot",
"label": "Authorized",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
1225
]
},
{
"id": "pilot-decide",
"from": "pilot",
"to": "decide",
"label": "Outcomes",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
1635
]
},
{
"id": "decide-maintain",
"from": "decide",
"to": "maintain",
"label": "Retain",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
2045
]
},
{
"id": "maintain-engineer",
"from": "maintain",
"to": "engineer",
"label": "",
"fromSide": "left",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
145,
2240
],
[
145,
600
]
]
},
{
"id": "decide-baseline",
"from": "decide",
"to": "baseline",
"label": "",
"fromSide": "right",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
980,
1830
],
[
980,
190
]
]
}
]
}
+271
View File
@@ -0,0 +1,271 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "TO-BE: stage01",
"output": "static/diagrams/strategy-stage01/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
2400,
1580
]
},
"components": [
{
"id": "baseline",
"type": "external",
"label": "Understand + baseline",
"tag": "Product Engineering workflow owner",
"sublabel": "Workflow map + desired improvement\nSelected measures + starting evidence\nGovernance: people, scope, authority",
"pos": [
100,
100
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "engineer",
"type": "external",
"label": "Choose an intervention",
"tag": "Owning team + independent reviewer",
"sublabel": "Context, coaching, tooling or skills\nPinned candidate + client + limits\nDeliver: patch and regression tests",
"pos": [
900,
100
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "qualify",
"type": "security",
"label": "Fit for a bounded pilot?",
"tag": "Quality evidence \u2192 owning approver",
"sublabel": "Artifact + safety + regression report\nPass: authorize exact pilot scope\nFail / incomplete: hold or rework",
"pos": [
1700,
100
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "pilot",
"type": "external",
"label": "Pilot real work",
"tag": "Human + AI Agent; independent review",
"sublabel": "Use qualified revision within scope\nAccepted / failed work + feedback\nManual path; no new release power",
"pos": [
1700,
730
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "decide",
"type": "security",
"label": "Retain, improve or stop?",
"tag": "Workflow owner + reviewed evidence",
"sublabel": "Compare with baseline, not trials\nNo justified benefit: hold / stop\nNew scope: baseline + new approval",
"pos": [
900,
730
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "maintain",
"type": "external",
"label": "Maintain + requalify",
"tag": "Owner, Quality, Platform & Security",
"sublabel": "Retain: support approved revision\nDrift / defects: revise and retest\nHarm: contain; never auto-restore",
"pos": [
100,
730
],
"size": [
600,
260
],
"icon": "none"
},
{
"id": "reference",
"type": "backend",
"label": "Governance + Measurement",
"tag": "Throughout, not one-time gates",
"sublabel": "Left return: changed revision\nRight return: new scope needs baseline\nSelected evidence; no forced rollout",
"pos": [
100,
1270
],
"size": [
2200,
260
],
"icon": "none"
}
],
"connections": [
{
"id": "baseline-engineer",
"from": "baseline",
"to": "engineer",
"label": "Map",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
800,
210
]
},
{
"id": "engineer-qualify",
"from": "engineer",
"to": "qualify",
"label": "Candidate",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
1600,
210
]
},
{
"id": "qualify-pilot",
"from": "qualify",
"to": "pilot",
"label": "Authorized",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
2000,
520
]
],
"labelAt": [
2010,
535
]
},
{
"id": "pilot-decide",
"from": "pilot",
"to": "decide",
"label": "Outcomes",
"fromSide": "left",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
1600,
840
]
},
{
"id": "decide-maintain",
"from": "decide",
"to": "maintain",
"label": "Retain",
"fromSide": "left",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
800,
840
]
},
{
"id": "maintain-engineer",
"from": "maintain",
"to": "engineer",
"label": "Changed revision",
"fromSide": "top",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
400,
550
],
[
1200,
550
]
],
"labelAt": [
800,
535
]
},
{
"id": "decide-baseline",
"from": "decide",
"to": "baseline",
"label": "New scope",
"fromSide": "bottom",
"toSide": "bottom",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
1200,
1150
],
[
60,
1150
],
[
60,
430
],
[
400,
430
]
],
"labelAt": [
620,
1135
]
}
]
}
@@ -0,0 +1,212 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "TO-BE: stage02",
"output": "static/diagrams/strategy-stage02-mobile/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
1000,
2540
]
},
"components": [
{
"id": "proven",
"type": "external",
"label": "Dependable Stage 01",
"tag": "Existing human-directed workflow",
"sublabel": "Proven skills + limits + outcome record\nNo inherited autonomous authority",
"pos": [
200,
40
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "case",
"type": "external",
"label": "Justify extra authority",
"tag": "Owning department proposes scope",
"sublabel": "Why needed? Exact data + effects\nObservation first, then proposals",
"pos": [
200,
450
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "decision",
"type": "security",
"label": "Authorize or hold",
"tag": "Human decision; roles named first",
"sublabel": "Security: boundary; Quality: evidence\nPlatform & IT: enforcement + takeover\nOwning approver: exact permitted scope",
"pos": [
200,
860
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "execute",
"type": "backend",
"label": "Bounded execution",
"tag": "Only within recorded authorization",
"sublabel": "Exact-artifact checks + audit\nChanged boundary: reopen decision",
"pos": [
200,
1270
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "stop",
"type": "security",
"label": "Independent stop + takeover",
"tag": "Platform & IT + Security + owner",
"sublabel": "Revoke mutations; preserve evidence\nRecover manually; requalify correction",
"pos": [
200,
1680
],
"size": [
740,
300
],
"icon": "none"
},
{
"id": "hold",
"type": "external",
"label": "Hold / return to Stage 01",
"tag": "Missing authority or readiness",
"sublabel": "Fix gaps, narrow scope or stay here\nNo automatic progression",
"pos": [
200,
2090
],
"size": [
740,
300
],
"icon": "none"
}
],
"connections": [
{
"id": "proven-case",
"from": "proven",
"to": "case",
"label": "Need / limits",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
405
]
},
{
"id": "case-decision",
"from": "case",
"to": "decision",
"label": "Proposal",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
815
]
},
{
"id": "decision-execute",
"from": "decision",
"to": "execute",
"label": "Authorized",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
570,
1225
]
},
{
"id": "execute-stop",
"from": "execute",
"to": "stop",
"label": "Harm / stop",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "security",
"labelAt": [
570,
1635
]
},
{
"id": "decision-hold",
"from": "decision",
"to": "hold",
"label": "",
"fromSide": "left",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "security",
"via": [
[
105,
1010
],
[
105,
2240
]
]
},
{
"id": "stop-hold",
"from": "stop",
"to": "hold",
"label": "Requalify",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "security",
"labelAt": [
570,
2045
]
}
]
}
+236
View File
@@ -0,0 +1,236 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "TO-BE: stage02",
"output": "static/diagrams/strategy-stage02/index.html",
"quality_profile": "showcase",
"legend": {
"mode": "hidden"
},
"viewBox": [
2740,
1260
]
},
"components": [
{
"id": "proven",
"type": "external",
"label": "Dependable Stage 01",
"tag": "Existing human-directed workflow",
"sublabel": "Proven skills + limits + outcome record\nNo inherited autonomous authority",
"pos": [
60,
100
],
"size": [
680,
230
],
"icon": "none"
},
{
"id": "case",
"type": "external",
"label": "Justify extra authority",
"tag": "Owning department proposes scope",
"sublabel": "Why needed? Exact data + effects\nObservation first, then proposals",
"pos": [
60,
550
],
"size": [
680,
230
],
"icon": "none"
},
{
"id": "decision",
"type": "security",
"label": "Authorize or hold",
"tag": "Human decision; roles named first",
"sublabel": "Security: boundary; Quality: evidence\nPlatform & IT: enforcement + takeover\nOwning approver: exact permitted scope",
"pos": [
1000,
340
],
"size": [
720,
290
],
"icon": "none"
},
{
"id": "execute",
"type": "backend",
"label": "Bounded execution",
"tag": "Only within recorded authorization",
"sublabel": "Exact-artifact checks + audit\nChanged boundary: reopen decision",
"pos": [
1980,
100
],
"size": [
680,
230
],
"icon": "none"
},
{
"id": "stop",
"type": "security",
"label": "Independent stop + takeover",
"tag": "Platform & IT + Security + owner",
"sublabel": "Revoke mutations; preserve evidence\nRecover manually; requalify correction",
"pos": [
1980,
650
],
"size": [
680,
230
],
"icon": "none"
},
{
"id": "hold",
"type": "external",
"label": "Hold / return to Stage 01",
"tag": "Missing authority or readiness",
"sublabel": "Fix gaps, narrow scope or stay here\nNo automatic progression",
"pos": [
1000,
960
],
"size": [
720,
230
],
"icon": "none"
}
],
"connections": [
{
"id": "proven-case",
"from": "proven",
"to": "case",
"label": "Need / limits",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "default",
"labelAt": [
410,
440
]
},
{
"id": "case-decision",
"from": "case",
"to": "decision",
"label": "Proposal",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
860,
665
],
[
860,
485
]
],
"labelAt": [
860,
650
]
},
{
"id": "decision-execute",
"from": "decision",
"to": "execute",
"label": "Authorized",
"fromSide": "right",
"toSide": "left",
"route": "straight",
"width": 4,
"variant": "default",
"via": [
[
1850,
485
],
[
1850,
215
]
],
"labelAt": [
1840,
200
]
},
{
"id": "execute-stop",
"from": "execute",
"to": "stop",
"label": "Harm / stop",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "security",
"labelAt": [
2320,
500
]
},
{
"id": "decision-hold",
"from": "decision",
"to": "hold",
"label": "Hold",
"fromSide": "bottom",
"toSide": "top",
"route": "straight",
"width": 4,
"variant": "security",
"labelAt": [
1360,
810
]
},
{
"id": "stop-hold",
"from": "stop",
"to": "hold",
"label": "Requalify",
"fromSide": "left",
"toSide": "right",
"route": "straight",
"width": 4,
"variant": "security",
"via": [
[
1840,
765
],
[
1840,
1075
]
],
"labelAt": [
1840,
1060
]
}
]
}
+12 -2
View File
@@ -12,19 +12,27 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
<div className="strategy-content">
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).
Establish a starting position for one workflow before choosing an intervention in months 1–2 of the [six-month plan](./roadmap.mdx). Baseline current uneven AI-assisted practice, not an assumed no-AI organization. This is not a mandatory company-wide baseline of every metric in the [Measurement registry](./measurement/index.mdx). The [EXP-01 packet](./stage-01-skills-adoption.mdx) assembles a practical comparison and budget. Departmental role names below are proposed functions to map with the partner team, not verified company appointments.
<ArchifyDiagram name="strategy-baseline" title="From current workflow through relevant selection and feasible evidence to a starting position and later comparison" story />
**Target operating model — no actual baseline values or approved thresholds are established here.** Missing evidence remains an explicit gap, not an invented starting value.
## Delivery example: know what must improve
In the [illustrative Delivery workflow](./stage-01-skills-adoption.mdx), Product Engineering maps a bounded code change through regression tests, independent review and existing release controls. Suppose the concern is repeated rework because regression evidence is incomplete: first verify the cause from actual changes, rather than assuming a skill will fix it.
Consider accepted-task outcomes, escaped-quality follow-up and review/rework inputs to cost if their contracts fit. Select only evidence that can inform that concern; deployment frequency need not help. The output is a workflow map and comparison record, not a pass/fail score. The owning team's designated workflow owner confirms scope with the independent Quality Engineering reviewer; unresolved source or acceptance gaps limit later conclusions, not authorize a pilot.
## 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.
Start with **Workflow effectiveness**: select relevant current-workflow outcomes before standardized skills adoption—accepted work, delivery time, failures/rework, cost, human effort/experience or business acceptance where the contracts apply. 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.
Keep **Skills effectiveness & health** separate. If no applicable skills exist, selection, bundle, adoption and review measures may be N/A, not zero; they are not prerequisites for baselining current work. If skills already exist, record that starting context and qualify named revisions separately. Do not mix sandbox skill evaluations into validated workflow task success or live policy-effect rates.
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.
@@ -53,4 +61,6 @@ A matched or randomized comparison may be used when practical and ethical. Label
**Next:** [Govern skill ownership and authority →](./skills-governance.mdx)
Carry the map, selected definitions and evidence limits into candidate design. Return here from [Adoption](./skills-adoption.mdx) when scope changes, or from [Maintenance](./skills-maintenance.mdx) when the current workflow no longer matches the comparison. See the [whole Stage 01 journey](./stage-01-skills-adoption.mdx).
</div>
@@ -33,4 +33,6 @@ Read the shared [collection and safeguards](./collection-and-safeguards.mdx) bef
Return to [Skills Measurement](./index.mdx).
In [Stage 01](../stage-01-skills-adoption.mdx), authorization to test an experimental revision is not general approved status. This contract counts approved-revision use only; do not relabel experimental pilot use to raise its numerator. [Adoption](../skills-adoption.mdx) still evaluates that pilot through independent work outcomes and [Quality's fitness evidence](../skills-quality.mdx). Use this reach measure only where its approved-revision population applies.
</div>
@@ -10,7 +10,7 @@ description: Shared interpretation rules, event contracts and privacy safeguards
**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.
Use these safeguards throughout the [Stage 01 journey](../stage-01-skills-adoption.mdx); these pages do not describe installed controls or measured company results.
### Decide what counts before counting
@@ -39,4 +39,6 @@ The privacy starting proposal is 30 days for raw structured analytics events and
Return to the [Skills Measurement index](./index.mdx) for every metric definition.
For the illustrative Delivery comparison, agree sources, permissions and independent acceptance before collection. Carry the population and gap record from [Baseline](../baseline.mdx) into [Adoption](../skills-adoption.mdx). Keep [Quality's qualification trials](../skills-quality.mdx) separate from live workflow starts; revised reports must preserve that boundary.
</div>
+52 -22
View File
@@ -1,9 +1,9 @@
---
id: index
slug: /measurement
title: Skills Measurement
title: Measuring real output
sidebar_label: Measurement
description: Registry of available candidate KPIs and metrics, their applicability, evidence requirements, calculations and limitations.
description: Optional contracts for workflow effectiveness and skills effectiveness and health, with distinct populations and honest implementation limits.
pagination_prev: stage-01-skills-adoption
pagination_next: baseline
hide_table_of_contents: true
@@ -13,42 +13,72 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
<div className="strategy-content">
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.
Start with how current AI-assisted work performs; compare relevant outcomes after the selected intervention, whether context, coaching, tooling or skills. Separately assess skill fitness and health only where skills exist. Registry inclusion does not require a metric to be used, collected or baselined. More adoption does not prove improved work.
<ArchifyDiagram name="strategy-measurement" title="An optional metric registry: browse distinct questions and inspect each contract" story />
<ArchifyDiagram name="strategy-measurement" title="Workflow effectiveness / Skills effectiveness & health" story />
**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.
## Read a candidate contract
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.
For the [EXP-01 Delivery hypothesis](../stage-01-skills-adoption.mdx), start with three questions, not all 16 contracts. **Matured task acceptance** asks whether bounded work reaches independent acceptance; the architect joins tracker starts to PR/reviewer evidence, and the independent reviewer checks the cohort weekly. **Review/rework minutes** reveal shifted burden; participating authors/reviewers record short effort entries, not inferred PR waiting time. **Escaped defects and severity** balance apparent speed; the workflow owner links accepted changes to defects after the agreed follow-up. Agree these proposed responsibilities and lawful access in month 2. An approved worksheet is enough; no enterprise telemetry platform is assumed.
Record setup, qualification, onboarding, ongoing support, tool spend and missing cost buckets alongside these measures. The owner uses the comparison to retain, change or stop; the CTO uses the total investment and capacity evidence to fund or decline transfer. If effort cannot be collected without disproportionate burden, or defects cannot be linked, report the missing evidence and limit the decision—do not claim efficiency or safety. Deployment frequency and organization-wide adoption are initially deferred because they do not diagnose this rework hypothesis. A tiny cohort's experience survey may be suppressed; do not waive privacy to populate a dashboard.
**Where this misleads:** accepted counts change with task mix, staffing and unfinished work; a fast PR may merely shift checking to reviewers; defects mature later; volunteers and coached tasks are not representative of every team. Keep failed, abandoned and unresolved matured starts, coverage, complexity slices, client/model changes and concurrent process changes visible. Compare the same eligibility, acceptance and follow-up rules before/after; use matched or randomized allocation only when feasible and ethical. Report uncertainty, not a causal ROI claim. Invocation counts, generated lines and individual rankings are not productivity measures. Skill benchmark success does not establish real workflow improvement.
Each entry explains meaning and applicability, calculation, required inputs and evidence, exclusions, missing-evidence behavior, limitations and implementation status. The two groups below classify every contract by its primary question; conditional reuse never merges populations. A delivery metric need not fit a non-delivery workflow.
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).
In the **illustrative Delivery workflow** from [Stage 01](../stage-01-skills-adoption.mdx), incomplete regression evidence is the improvement hypothesis. The workflow owner and independent Quality Engineering reviewer select contracts that can test it, then carry the same definitions into the baseline and pilot comparison. They can leave unrelated metrics unselected. This reference capability supports the whole journey; opening this page is not an execution gate.
## Metric definitions
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.
<details>
<summary>Implementation status—not live telemetry</summary>
There are **16 contracts: 9 prototype calculations and 7 unimplemented metrics**. The prototype has no network collectors. None of these counts establishes live telemetry.
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 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.
</details>
1. [Validated task success](./validated-task-success.mdx) — prototype calculation
2. [Skill selection precision](./skill-selection-precision.mdx) — prototype calculation
3. [Skill selection recall](./skill-selection-recall.mdx) — prototype calculation
4. [Supported bundle coverage](./supported-bundle-coverage.mdx) — unimplemented metric
5. [Approved-workflow adoption](./approved-workflow-adoption.mdx) — unimplemented metric
6. [Change lead time](./change-lead-time.mdx) — unimplemented metric
7. [Deployment frequency](./deployment-frequency.mdx) — unimplemented metric
8. [Change fail rate](./change-fail-rate.mdx) — prototype calculation
9. [Failed deployment recovery time](./failed-deployment-recovery-time.mdx) — unimplemented metric
10. [Deployment rework rate](./deployment-rework-rate.mdx) — prototype calculation
11. [Changes with escaped quality issues](./changes-with-escaped-quality-issues.mdx) — prototype calculation
12. [Confirmed policy effects](./confirmed-policy-effects.mdx) — prototype calculation
13. [Cost per accepted outcome](./cost-per-accepted-outcome.mdx) — prototype calculation
14. [Verification confidence and cognitive load](./verification-confidence-and-cognitive-load.mdx) — prototype calculation
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
### Workflow effectiveness
**Is the work getting better?** Baseline relevant current-workflow outcomes even before standardized skills exist, then compare the same outcomes during adoption and maintenance. Use comparable task mix, acceptance rules, follow-up periods and source coverage. Before/after trends alone are not causal evidence of a skills benefit.
1. [Validated task success](./validated-task-success.mdx) — **Prototype calculation.** Independently accepted outcomes among matured workflow starts; failures, abandonment and unresolved outcomes remain in the denominator.
2. [Change lead time](./change-lead-time.mdx) — **Unimplemented metric.** Delivery time for production changes in one service, not general task duration.
3. [Deployment frequency](./deployment-frequency.mdx) — **Unimplemented metric.** Production delivery frequency for one service; frequency alone is not value.
4. [Change fail rate](./change-fail-rate.mdx) — **Prototype calculation.** Production deployments causing failures; requires joined change/incident evidence.
5. [Failed deployment recovery time](./failed-deployment-recovery-time.mdx) — **Unimplemented metric.** Recovery from failed production deployments; conditional on eligible incidents.
6. [Deployment rework rate](./deployment-rework-rate.mdx) — **Prototype calculation.** Unplanned corrective production deployments, not all forms of task rework.
7. [Changes with escaped quality issues](./changes-with-escaped-quality-issues.mdx) — **Prototype calculation.** Accepted changes with confirmed downstream issues after follow-up.
8. [Confirmed policy effects](./confirmed-policy-effects.mdx) — **Prototype calculation.** Safety of supported workflow attempts; governed skill trials are a separate evaluation population, never pooled with live work.
9. [Cost per accepted outcome](./cost-per-accepted-outcome.mdx) — **Prototype calculation.** Cost of the matured workflow cohort, including unsuccessful attempts and recorded review/rework effort. Missing cost buckets remain partial.
10. [Verification confidence and cognitive load](./verification-confidence-and-cognitive-load.mdx) — **Prototype calculation.** Anonymous cohort experience: confidence, workload and usefulness separately, not measured time savings.
11. [Workflow-specific business acceptance](./workflow-specific-business-acceptance.mdx) — **Unimplemented metric.** Acceptance against an agreed departmental rubric; requires a defined workflow and independent evidence.
Human effort is recorded as review/rework inputs where the cost contract supports it; the experience survey describes perception. Neither elapsed delivery time nor token counts establish effort saved. If the current workflow lacks the event semantics required by a contract (for example, governed attempts), record it as not applicable or unavailable with a reason; do not relabel unrelated records to manufacture a baseline.
### Skills effectiveness & health
**Are the skills fit for use and kept fit?** Qualify named skills and versions, observe supported use during adoption, and review or retire them in maintenance. Without applicable skills, bundles or enrolled use, skill-specific measures may be **N/A, not zero**. Once a population exists, missing observations are unknown, not evidence of non-use or good health.
**Fitness comes from [Quality's evaluation evidence](../skills-quality.mdx), not health proxies.** Compare named candidate and approved revisions against declared cases, independent artifact acceptance and mandatory safety checks. Retain regression results, failed trials and coverage limits. The five registry contracts below complement that report: selection tests relevance; support, use and review measures describe operating health. None replaces evidence that a skill produces useful, safe artifacts. Maintenance sends real failures and revision changes back to Quality for requalification.
1. [Skill selection precision](./skill-selection-precision.mdx) — **Prototype calculation.** Did the evaluated selection choose an applicable skill? Requires labeled qualification cases.
2. [Skill selection recall](./skill-selection-recall.mdx) — **Prototype calculation.** Were expected skills selected? Requires the same labeled qualification population.
3. [Supported bundle coverage](./supported-bundle-coverage.mdx) — **Unimplemented metric.** Are expected active installations on supported, non-revoked bundles/adapters?
4. [Approved-workflow adoption](./approved-workflow-adoption.mdx) — **Unimplemented metric.** Is the enrolled cohort using approved skills in eligible workflows? Installation/loading is not use.
5. [Skills within substantive review window](./skills-within-substantive-review-window.mdx) — **Unimplemented metric.** Do active approved revisions have current owners and substantive review evidence?
**Task-success population matters.** The canonical validated-task-success contract above measures workflow outcomes, not an evaluation benchmark. A named skill/version can be examined as a predeclared live-workflow slice under that same contract, without counting retries or multiple skills as extra tasks or attributing causality. Sandbox/evaluation cases remain excluded: a named skill/version evaluation must be reported separately with its own declared cases, acceptance evidence and limits. It is not an additional implemented calculation or a second conflicting task-success formula. The canonical page explains this boundary. Likewise, keep policy-effect evaluation trials separate from live attempts.
Use both tracks together to decide whether to improve, retain or retire a skill. Higher selection scores, wider adoption or current reviews cannot substitute for accepted work, safety, cost and human experience.
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.
@@ -33,4 +33,6 @@ Read the shared [collection and safeguards](./collection-and-safeguards.mdx) bef
Return to [Skills Measurement](./index.mdx).
Use this labeled-case result in [Quality's candidate evaluation](../skills-quality.mdx). Selecting the right skill is only one input: independently test artifact fitness, safe execution and revision regression before the owning approver considers a bounded pilot. It is not the live Delivery workflow's accepted-task rate.
</div>
@@ -33,4 +33,6 @@ Read the shared [collection and safeguards](./collection-and-safeguards.mdx) bef
Return to [Skills Measurement](./index.mdx).
Use this labeled-case result alongside precision in [Quality's candidate evaluation](../skills-quality.mdx). Finding expected skills does not establish useful artifacts or safe execution. Preserve missing-case coverage and revision-regression evidence before a bounded pilot; do not pool evaluation cases with live Delivery tasks.
</div>
@@ -33,4 +33,6 @@ Read the shared [collection and safeguards](./collection-and-safeguards.mdx) bef
Return to [Skills Measurement](./index.mdx).
[Maintenance](../skills-maintenance.mdx) uses this coverage signal to find overdue or ownerless revisions. A current date is not proof of effectiveness: substantive review must consider [Quality's fitness and regression evidence](../skills-quality.mdx), supported-client changes and live-workflow outcomes. Gaps trigger review or requalification, not a favorable health assumption.
</div>
@@ -19,4 +19,6 @@ The executable covers validated success, selection precision/recall, change fail
Return to the [Skills Measurement index](./index.mdx) for every metric definition.
Use this fixture to check calculation and missing-evidence behavior before applying selected contracts in [Baseline](../baseline.mdx) or [Adoption](../skills-adoption.mdx). It is not the illustrative Delivery workflow's baseline and does not qualify a skill: [Quality](../skills-quality.mdx) requires independent, versioned artifact and safety evidence on declared evaluation cases.
</div>
@@ -29,6 +29,14 @@ Confirmed independently accepted tasks as a share of all eligible initiated task
| Gaming and limits | Split easy tasks or omit starts; reconcile starts to approved backlog and audit acceptance rubrics. Descriptive signal, not causal AI productivity attribution. Source completeness, task mix and sampling limit inference; report uncertainty. Maturation horizon is workflow-specific and must be approved; no automatic abandonment on timeout. |
{/* contract:end */}
## Workflow outcomes versus skill/version evaluation
This contract belongs to **Workflow effectiveness**. Use the same matured-start population and independent acceptance rules before and after introducing skills; skills are not required for a workflow outcome to exist. Do not narrow the later denominator to successful skill invocations.
For **Skills effectiveness & health**, a predeclared slice of live workflow tasks using a named skill/version may reuse this contract unchanged. Keep the parent cohort visible, report exact versions and selection limits, and count each task once across retries, skills and clients. Overlapping skill slices must not be summed. This is descriptive evidence, not proof that the skill caused success.
A sandbox or qualification evaluation of a named skill/version is a different population and remains excluded by this contract. [Quality](../skills-quality.mdx) defines artifact-success and revision-regression evidence: declare cases, skill/version, client/model configuration, acceptance rubric and observed results separately; never combine those cases with live workflow starts or present their results as this prototype's workflow rate. This page does not introduce an implemented skill-evaluation metric or an alternative formula. No applicable skill means that skill-specific evaluation is N/A, not a zero workflow success rate.
Read the shared [collection and safeguards](./collection-and-safeguards.mdx) before collecting data; see the [synthetic example and limits](./synthetic-example.mdx).
Return to [Skills Measurement](./index.mdx).
+33 -21
View File
@@ -1,7 +1,7 @@
---
id: roadmap
title: Roadmap
description: Build proven skills in human and AI Agent work, starting with Delivery, as the foundation for the future autonomous SDLC.
description: Proposed month-by-month work, capacity, dependencies and decisions for a solo AI Architect.
hide_table_of_contents: true
---
@@ -9,38 +9,50 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
<div className="strategy-content">
## Two stages toward Target
## Six months, two investment decisions
<ArchifyDiagram name="strategy-roadmap" title="Adopt skills → Future Autonomous Agent" story />
<ArchifyDiagram name="strategy-roadmap" title="Proposed months 1–4: learn and test; months 5–6: retain or stop, then hand over" story />
**Humans direct, guide and review throughout.** Stage 1 standardizes skills in human + AI Agent work across the SDLC. Proven skills, measurements and working practices become the foundation for Stage 2: the future Autonomous Agent in [Target](./target-operating-model.mdx).
**Humans direct, guide and review throughout.** This is a proposed plan, not an agreed schedule or budget. The first decision funds one bounded experiment; the second retains, changes or stops it before any transfer. The [six-month strategy](./target-operating-model.mdx) starts with existing uneven AI-assisted practice, not zero adoption. A Target operating model is only a conditional long-term reference.
Target operating model—not deployed autonomy, an agreed schedule or approved KPI thresholds.
**Month 1 — Discover and earn trust.** I agree CTO expectations, access and a monthly decision meeting; meet team leads, pair with developers and reviewers across contrasting workflows, and trace recent changes. Output: current-work map, AI/tool/data constraints, evidence gaps and ranked bottlenecks. Dependency: willing access to real work. Decision: select a problem, or continue targeted discovery rather than prescribe skills.
## Stage 1: Delivery first
**Month 2 — Agree one experiment.** I recruit one willing team and an independent reviewer, observe a prospective baseline and compare context, coaching, test/review feedback, deterministic automation and skills. Output: the [experiment packet](./stage-01-skills-adoption.mdx), effort cap, acceptance rules and stop date. Dependency: team lead agrees contributions; actual risk/approval owners clear the boundary. No partner, reliable checks or lawful evidence means no live pilot.
<ArchifyDiagram name="strategy-roadmap-adoption" title="Delivery first → Other SDLC phases, order undecided" story />
**Month 3 — Work beside the team.** I build and qualify the smallest intervention, pair on bounded changes and collect outcomes plus burden. Output: reproducible examples, failure cases and weekly evidence review. Dependency: independent qualification and explicit pilot permission, not tool installation. Stop unsafe work immediately; fix friction before asking others to adopt.
Start with Delivery, then extend skills adoption to the remaining SDLC phases. Their order is not yet decided. **Delivery keeps improving as adoption expands.**
**Month 4 — Compare and choose.** I reconcile matured tasks, defects, review effort, costs and concurrent changes with the reviewer. Output: retain/change/hold/stop recommendation to the workflow owner and CTO. Dependency: comparable matured tasks and reconciled sources. Low task supply or missing follow-up means inconclusive, not success. Only an approved time-and-budget-bounded extension may continue; otherwise narrow or stop.
## Improve within each phase
**Month 5 — Transfer selectively.** If value and burden are acceptable, I pair with a voluntary champion and backup and test a second willing team's fit. Output: a team-owned example, support/recovery instructions and a new-scope baseline. Dependency: team capacity and funded upkeep. If absent, improve the first workflow or retire it; no organization-wide training mandate.
<ArchifyDiagram name="strategy-roadmap-loop" title="Each phase: understand → baseline → topology → use → collect → reassess → repeat" story />
**Month 6 — Handover and CTO evidence review.** I verify that the team can operate without daily architect help and present outcomes, limits, costs and stopped work. Output: an owned retained workflow or documented stop, plus a prioritized next-quarter proposal. Dependency: independent evidence and actual owner acceptance. The CTO decides the next investment, not an automatic autonomy phase.
Repeat this loop within every phase—not as six global roadmap stages. Skills topology defines **what skills exist, how they relate, when they are used and how they work together**, including handoffs—not just a catalogue.
## Delivery first, replication only if earned
## Delivery in practice
<ArchifyDiagram name="strategy-roadmap-adoption" title="One willing Delivery team → a separately agreed transfer, or stay and improve" story />
**Understand the engineering path first:** codebase structure and existing principles → system-logic source → tests → builds and packaging → deployments. Inspect actual practices, tooling, controls and problems with the people doing the work, rather than assuming the documented process is the real one.
**Delivery keeps improving** whether transfer happens or not. The order of any other workflows is not yet decided. I bring concrete examples to skeptical teams, ask what creates extra work, and accept non-participation. A skeptic can help judge a demo without joining a pilot. If priorities conflict, I ask the CTO for a trade-off, not a compliance escalation.
**Establish the comparison, then engineer skills.** Define metrics/KPIs and a baseline for comparable work before changing it. [Skills Measurement](./measurement/index.mdx) explains collection and calculation. Connect reviewed skills to the engineering path, with clear triggers, dependencies and acceptance checks.
## Keep one learning loop
**Use, collect, compare, repeat.** A human works with an AI Agent on real changes. Collect results, friction and feedback alongside quality, cost and verification effort. Compare with the baseline to understand the new current situation; revise the skills and working practices, then run the loop again.
<ArchifyDiagram name="strategy-roadmap-loop" title="Understand current AI work → baseline → choose intervention → bounded pilot → evidence → retain, change or stop" story />
Repeat the learning loop, not a predetermined tool rollout. If skills are selected, their topology defines what skills exist, how they relate, when they are used and how they work together. Simpler context, coaching or deterministic fixes do not require a skills catalog.
## Solo capacity and influence
Proposed weekly allocation during pilots: two days hands-on pairing/building, one day evaluation/evidence, one day coaching and relationships, and one day sponsor decisions, support and contingency. One active live pilot at a time; a second team starts only after the first is supportable. This is a capacity envelope, not known company availability.
Ask a partner lead to agree a small pairing slot and independent review time explicitly; record actual effort, not assumed free team labor. Agree a short weekly team check-in and monthly CTO review of evidence, blocked dependencies, spend and the next choice. Seek specialist security/privacy advice only where the selected boundary requires it; preserve independent checks without appointing a committee.
Trace codebase structure and existing principles → system-logic source → tests → builds and packaging → deployments. Repair critical acceptance/data gaps before live use. Publish short reusable examples and offer office hours; don't become a permanent help desk for more than ten teams. Escalate support demand as an investment choice, never hide it in apparent savings.
Follow the **illustrative Delivery workflow** in [the experiment packet](./stage-01-skills-adoption.mdx). Its diagram and worked decision keep benefit, burden and safety connected. [Measurement](./measurement/index.mdx) supplies optional definitions; [Baseline](./baseline.mdx) records actual starting evidence. Governance and Measurement are supporting references, not one-time gates.
<details>
<summary>Supporting gate evidence and hold conditions</summary>
<summary>Readiness questions behind the roadmap</summary>
These are recommended implementation gates, not assigned human owners, approved thresholds or installed integrations. Agree acceptance criteria for each selected workflow before evaluating it.
These are readiness questions, not additional roadmap stages. Stage 01's topic pages define the recommended decisions and evidence within existing teams. Designate accountable people and agree workflow-specific acceptance criteria before evaluating; this strategy does not appoint approvers or approve thresholds.
### Understand the current situation
@@ -52,7 +64,7 @@ Inventory actual client hosts/builds, provider/data terms, authority and event a
Close critical gaps such as exposed secrets, unclear approval authority or unreliable acceptance checks. Broader refactoring and non-critical debt can run alongside the selected work. Stage 1 introduces no new privileged autonomous actions.
### Engineer and evaluate connected skills
### If skills are the chosen intervention
Use a small registry, immutable skill contracts, qualified client adapters, evaluations and coaching. Verify the measurement calculations with synthetic fixtures before interpreting real outcomes. Require mandatory safety checks, independent task acceptance, reconciled source coverage and user feedback. Hold or narrow scope if quality or coverage is inadequate; usage alone does not justify expansion.
@@ -62,12 +74,12 @@ Prove canary updates, effective-version readback, version locking, exception exp
Use evidence to choose the next SDLC phase; no second or third phase is assigned here. Continue the improvement loop in Delivery and every phase already using skills.
### Prepare for the future Autonomous Agent
### Consider autonomy only as a separate future option
Stage 2 builds on proven skills, measurements and working practices—not permission inferred from adoption alone. Before granting scoped execution authority, prove observation and evidence assembly, then proposing and routing work. Recommended controls include exact-artifact approvals, idempotency, duplicate/outage recovery, separation of duties, audit and kill-switch drills. Prove human takeover; never infer permission from missing evidence. The agent ultimately executes and governs the cycle, not only routes tasks, while humans retain direction and review. Keep sensitive decisions human. Changed client, provider, data or authority boundaries reopen the relevant checks.
Beyond six months may mean deeper coaching, deterministic tooling or no expansion. If additional autonomous authority solves an evidenced problem, [future options](./stage-02-autonomous-agent.mdx) require a separate authority/readiness decision. Recommended controls include exact-artifact approvals, idempotency, duplicate/outage recovery, separation of duties, audit and kill-switch drills. Prove human takeover; never infer permission from missing evidence. Keep sensitive decisions human. Changed client, provider, data or authority boundaries reopen the relevant checks.
</details>
**Next:** [Stage - 01 - Skills Adoption →](./stage-01-skills-adoption.mdx)
**Next:** [Work through one bounded experiment →](./stage-01-skills-adoption.mdx)
</div>
+19 -2
View File
@@ -11,9 +11,11 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
**TO-BE · Target operating model — not installed controls or company results.**
Optional reference when skills are the chosen intervention. The [six-month plan](./roadmap.mdx) starts with willing partners and current AI-assisted practice; department names below are proposed functions to agree, not appointments. The assembled [EXP-01 packet](./stage-01-skills-adoption.mdx) shows first-revision recovery, total effort, an inconclusive bounded extension and a stop decision.
## When should a pilot become a team workflow?
Expand only when a bounded canary produces independently accepted work and useful feedback. Teach people to verify artifacts and recover without AI, not merely invoke a skill.
Expand only when a bounded canary produces independently accepted work and useful feedback. Teach people to verify artifacts and recover without AI, not merely invoke a skill. Compare **Workflow effectiveness** with the current-workflow baseline; observe **Skills effectiveness & health** separately as skills enter use. More adoption does not prove improved work, and before/after trends alone are not causal evidence.
<ArchifyDiagram name="strategy-adoption" title="Choose a workflow, coach a canary, verify outcomes and improve before expansion" story />
@@ -21,10 +23,23 @@ Expand only when a bounded canary produces independently accepted work and usefu
- **Choice within support:** qualify the client path instead of promising identical agent behavior.
- **No adoption quotas:** retain a manual path; rejected suggestions and non-use are feedback, not poor performance.
## Run one bounded comparison, then make a decision
Bring the [Baseline](./baseline.mdx) comparison record, [Quality](./skills-quality.mdx) qualification report and [Governance](./skills-governance.mdx) pilot authorization—not merely an installed bundle. In the **illustrative Delivery workflow**, the developer and AI Agent prepare a bounded patch and regression tests on the qualified client; an independent reviewer accepts or rejects the exact work. Existing release controls still apply. Record failed and abandoned work as well as accepted changes, and use the manual path if the skill adds risk or effort.
At the agreed review point, the designated Product Engineering workflow owner considers the comparable outcomes and feedback, Quality Engineering's independent acceptance/quality evidence and any boundary or support findings from Architecture &amp; Security and Platform &amp; IT. These are proposed responsibilities; appoint actual people and agree criteria before the pilot.
- **Retain:** useful within the tested scope and supported controls; the designated owning approver records exact-revision approval after independent review and required boundary/support checks, then hands that revision and evidence to [Maintenance](./skills-maintenance.mdx). The pilot decision alone is not general approval.
- **Improve:** return failure cases and friction to the author and [Quality](./skills-quality.mdx); a changed candidate needs new evidence.
- **Expand:** propose a new bounded workflow/cohort, revisit [Baseline](./baseline.mdx) and obtain the relevant approval—not automatic organization-wide rollout.
- **Stop or hold:** unsafe behavior triggers containment; insufficient evidence means no benefit claim and no justified expansion. Preserve current practice or a safe manual path. Any extension needs a new explicit expiry, capacity/spend cap and attainable evidence question; otherwise narrow or stop, never continue indefinitely.
The output is a decision record with evidence, scope and remaining uncertainties. Qualification fitness and live outcomes inform it separately; apparent before/after improvement does not establish causality.
<details>
<summary>Onboarding responsibilities, coaching and feedback safeguards</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.
**TO-BE · Target operating model.** This bounded comparison belongs to the [Stage 01 journey](./stage-01-skills-adoption.mdx); these pages do not describe installed controls or measured company results.
Start with a small set of useful workflows chosen by the existing teams. Product Management and the departmental owner identify the outcome; Data & AI helps turn it into a skill; Quality Engineering establishes acceptance; Platform & IT qualifies the client path; Architecture & Security clears the data boundary. People & Administration Squad coordinates learning and accessible feedback.
@@ -60,6 +75,8 @@ Recorded compute spend is **EUR 60 / 1 = EUR 60** per accepted outcome—a **par
### Revisit selection as adoption expands
Selection precision/recall qualify named skill versions against labeled cases; they do not measure real-workflow acceptance. Keep any skill/version evaluation separate from the live task-success cohort. Skill-specific measures with no applicable population are N/A, not zero; missing evidence for an existing population remains unknown.
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.
+16 -7
View File
@@ -13,7 +13,7 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
## Who can approve a skill for use?
The owning team authors the skill; independent reviewers assess it before exact-revision approval. Data &amp; AI maintains the catalog, while Platform &amp; IT verifies distribution and revocation.
Use this optional reference only if the [six-month experiment](./stage-01-skills-adoption.mdx) selects skills. The architect can author with a willing team; an independent reviewer assesses the candidate and the actual workflow approver authorizes bounded use. Departmental names below are proposed functions, not company facts or conscripted staff. A reviewed repository entry plus existing controls can support one pilot; no enterprise catalog service is required first.
<ArchifyDiagram name="strategy-governance" title="An owner proposes; independent review and canary evidence precede approval" story />
@@ -21,10 +21,18 @@ The owning team authors the skill; independent reviewers assess it before exact-
- **Pin the whole bundle:** content, adapters and executable dependencies travel together.
- **Keep controls authoritative:** exceptions expire and cannot bypass protected release, payment or identity controls.
## Connect knowledge without expanding authority
Use the workflow map from [Baseline](./baseline.mdx) to engineer a connected skills topology. In the **illustrative Delivery workflow**, repository understanding produces a source-and-constraints map; change/test preparation consumes it and produces a patch plus regression evidence; independent verification consumes that exact artifact and returns findings. Each handoff specifies its trigger, expected output and what happens when evidence is missing. The agent cannot mark its own work approved or acquire deployment credentials through a skill.
Governance spans design, qualification, the pilot and maintenance—not just entry to a catalogue. The owning Product Engineering team's designated accountable person records scope and permitted effects; an independent Quality Engineering reviewer accepts [evaluation evidence](./skills-quality.mdx); Architecture &amp; Security reviews higher-risk boundaries; Platform &amp; IT verifies the qualified distribution path. These are recommended assignments within existing teams: name the actual people before relying on a decision.
**Two different permissions:** qualification may justify a bounded experimental pilot. Wider approved use requires the pilot comparison and canary evidence too. Record exact revisions, audience, expiry/stop conditions and approvers for each; neither a baseline nor a passing test grants permission by itself. Failed review returns the candidate to its author; unsafe use enters [Maintenance containment](./skills-maintenance.mdx).
<details>
<summary>Ownership, client qualification, exceptions and rollback</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.
**TO-BE · Target operating model.** Use these contracts throughout the [Stage 01 journey](./stage-01-skills-adoption.mdx); they are not installed controls or measured company results.
### A contract that travels, controls that stay authoritative
@@ -36,7 +44,7 @@ Adapters place content in the qualified client's discovery paths and implement o
### Lifecycle and decision rights
A proposal names the problem, owner, data scope and testable outcome. Experimental revisions run only in approved disposable environments. Promotion requires independent review, static and executable dependency checks, per-client behavioral evaluations and a bounded canary. Approval records bind the exact artifact and permitted uses. Deprecated revisions carry a migration path and deadline; retired revisions are unavailable for new work. Any active revision can be quarantined immediately.
A proposal names the problem, owner, data scope and testable outcome. Initial experimental qualification runs only in approved disposable environments. Real work requires a separate bounded-pilot authorization after qualification; that authorization permits only its recorded cohort, data and effects, not general approved use. Promotion from the bounded pilot requires independent review, static and executable dependency checks, per-client evaluations, pilot outcomes and canary evidence. Approval records bind the exact artifact and permitted uses. Deprecated revisions carry a migration path and deadline; retired revisions are unavailable for new work. Any active revision can be quarantined immediately.
The author never supplies the only approval. Data & AI maintains catalog state; the owning team is accountable for content; Quality Engineering approves evaluation evidence; Architecture & Security approves higher-risk boundaries; Platform & IT verifies distribution and revocation. A business owner accepts workflow outcomes. These functions can be covered by existing staff, but incompatible author/approver duties must remain separate for the same release.
@@ -44,11 +52,11 @@ An exception contains its ID, skill/client revision, scope, business reason, ris
### Distribution, stale clients and rollback
Stage a verified bundle atomically, check its digest, load it through the qualified adapter and read back its effective revision. Test already-open sessions; changing files is not proof of reloading instructions. Record immutable last-known-good content and adapter dependencies. Canary upgrades precede wider distribution.
Stage a verified bundle atomically, check its digest, load it through the qualified adapter and read back its effective revision. Test already-open sessions; changing files is not proof of reloading instructions. Record immutable last-known-good content and adapter dependencies where an approved revision exists. For a first revision, record **N/A: no approved bundle** and the [Quality first-revision rule](./skills-quality.mdx): compare with declared current AI-assisted practice; test disable/remove, invalidate/reload sessions and verify recovery in a pinned clean environment. Independent reviewer acceptance and actual workflow-approver pilot permission are still required. Canary upgrades precede wider distribution.
A cached verified bundle may support explicitly permitted low-risk work if its model and tool dependencies are available. It does not make a cloud-backed client work offline. Stale or unsupported sessions cannot obtain centrally mediated privileged access. Reconnection revalidates support, revocation and policy before credentials are issued. Central artifact review protects delivery even when a laptop declaration is absent or false; a client report cannot prove which private prompt was actually followed.
Rollback restores the approved manifest and dependencies, invalidates affected sessions, revokes unsafe revisions, runs a smoke test and verifies effective state. It cannot undo data disclosure or commands already executed. Those require incident response.
Rollback restores the approved manifest and dependencies when present; first-revision recovery removes the candidate and restores declared current practice without inventing a prior approved skill. Invalidate affected sessions, revoke unsafe revisions, run a smoke test and verify effective state. Recovery cannot undo data disclosure or commands already executed. Those require incident response.
</details>
@@ -77,7 +85,7 @@ Rollback restores the approved manifest and dependencies, invalidates affected s
| provenance_license | Origin repository/author, upstream revision, acquisition/review history, rights/license for content and bundled resources |
| maintenance_date | Last substantive review timestamp plus next review due and trigger conditions |
| deprecation | State, reason, replacement, migration instructions, consumers and retirement deadline if applicable |
| rollback | Approved known-good bundle+adapter+dependency digests, revocation/reload procedure and tested evidence |
| rollback | Approved known-good bundle+adapter+dependency digests when present; first revision: N/A with reason plus tested disable/remove/reload to pinned clean current practice; independent acceptance required |
| procedure | Prerequisites, bounded steps, expected artifacts, verification, failure handling, escalation |
@@ -91,7 +99,8 @@ Rollback restores the approved manifest and dependencies, invalidates affected s
| Transition | Required evidence |
| --- | --- |
| proposed → experimental | Owner, purpose, risk/data scope, disposable environment and preregistered test plan |
| experimental → approved | Independent review, all mandatory tests, qualified clients, canary, exact-digest approval |
| experimental → bounded pilot | Independent qualification evidence, named pilot approver, exact revision, bounded cohort/data/effects and manual recovery; remains experimental outside that envelope |
| bounded pilot → approved | Independent review, all mandatory tests, qualified clients, pilot comparison and canary evidence; owning approver records exact-digest authorization for retained scope |
| approved → deprecated | Owner gives migration/replacement and retirement conditions |
| deprecated → retired | Consumers reconciled or explicit risk-approved cutover; no new invocation |
| any active state → quarantined | Incident or unsafe/unknown provenance; central deny immediately |
+15 -5
View File
@@ -11,20 +11,30 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
**TO-BE · Target operating model — not installed controls or company results.**
Optional skills reference for a retained intervention, not a six-month obligation to establish a catalog program. Map department names to actual agreed functions. The [Roadmap](./roadmap.mdx) requires funded upkeep and a willing owner before expansion.
## What happens when a skill drifts or causes harm?
Monitor usefulness and safety throughout a revision's life. Unsafe behavior triggers containment; a correction returns through independent tests and approval, never automatic reinstatement.
Monitor both **Workflow effectiveness** (comparable outcomes, safety, cost and human experience) and **Skills effectiveness & health** (fitness/regression evidence, selection, supported use and substantive review) throughout a revision's life. Use the evidence to improve, retain or retire skills; adoption or current review dates alone do not prove better work. Unsafe behavior triggers containment; a correction returns through independent tests and approval, never automatic reinstatement.
<ArchifyDiagram name="strategy-maintenance" title="Monitor, triage and test corrections; promote safely or contain and roll back" story />
- **Named ownership:** Data &amp; AI coordinates catalog health with the owning teams.
- **Early triggers:** incidents and client, model or dependency changes override the calendar.
- **Recovery is verified:** rollback restores a known-good bundle; it cannot undo disclosure or past effects.
- **Recovery is verified:** restore a known-good bundle when present; first-revision recovery disables/removes the candidate, invalidates/reloads sessions and verifies declared current AI-assisted practice in a pinned clean environment. Record no-approved-revision N/A and independent acceptance under the [Quality rule](./skills-quality.mdx); recovery cannot undo disclosure or past effects.
## Close the loop on the retained workflow
Start from [Adoption's decision](./skills-adoption.mdx), the approved manifest and its evidence limits. In the **illustrative Delivery workflow**, a missed regression case becomes a sanitized evaluation case. Product Engineering owns the correction; an independent Quality Engineering reviewer reruns [Quality's fitness and regression evaluation](./skills-quality.mdx) against the approved revision. Keep the live defect and task records in their original populations; do not erase a failure because the replacement passes.
The owning team's designated approver decides whether the corrected exact revision can re-enter a bounded canary, using independent results and Platform &amp; IT's recovery/effective-version evidence; Architecture &amp; Security reviews changed risk boundaries. Missing evidence means hold. Safe unchanged use may continue only within its existing authorization; harmful behavior is contained immediately. These recommended functions require named people before use.
Retain a supported revision, requalify a change or retire it with a reconciled consumer/migration record. A materially changed workflow returns to [Baseline](./baseline.mdx); the [Measurement registry](./measurement/index.mdx) helps revise relevant evidence without silently resetting history. That feedback closes [Stage 01](./stage-01-skills-adoption.mdx)—it does not automatically advance to autonomy.
<details>
<summary>Review responsibilities, incident handling and proposed review intervals</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.
**TO-BE · Target operating model.** Maintenance sustains the [Stage 01 journey](./stage-01-skills-adoption.mdx); these pages do not describe installed controls or measured company results.
Every approved skill has an accountable owning team, independent reviewer, review due date, supported client matrix and rollback bundle. Review both usefulness and safety, not just metadata freshness. Proposed maximum review intervals are recorded by risk tier; incidents, dependency changes, model/client drift or repeated failures trigger earlier review.
@@ -49,7 +59,7 @@ Owner ratification is required before adoption. Review earlier after incidents o
## 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.
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. Preserve current-workflow comparisons separately from named skill/version evaluations. No applicable skill population is N/A, not zero; missing evidence for existing revisions is unknown and must not improve reported health.
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.
@@ -59,6 +69,6 @@ Act on critical policy effects immediately; do not wait for a reporting cycle. U
</details>
**Next:** [Stage - 02 - Autonomous Agent →](./stage-02-autonomous-agent.mdx)
**Continue the loop:** [Requalify changed skills →](./skills-quality.mdx). For a separate future authority decision, read [Stage - 02 - Autonomous Agent](./stage-02-autonomous-agent.mdx).
</div>
+18 -4
View File
@@ -11,6 +11,8 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
**TO-BE · Target operating model — not installed controls or company results.**
**Optional skills reference for the [six-month plan](./roadmap.mdx).** Use this when skills are the chosen intervention, not as a prerequisite for discovery or coaching. Department names denote functions to map to actual willing staff; the architect cannot assign them authority.
## What evidence is enough to promote a skill?
Risk determines the evaluation depth, not whether safety checks apply. Independent evidence must show useful outcomes and no failed mandatory gate before promotion.
@@ -21,10 +23,22 @@ Risk determines the evaluation depth, not whether safety checks apply. Independe
- **No averaging away harm:** a critical unauthorized effect blocks promotion.
- **Proposed floors need owner ratification:** missing coverage or acceptance rules means qualification is incomplete.
## Prove the candidate fits the workflow
Bring the workflow/acceptance map from [Baseline](./baseline.mdx) and the pinned candidate, client tuple and authority envelope from [Governance](./skills-governance.mdx). In the **illustrative Delivery workflow**, test whether a candidate actually produces a correct bounded change and regression tests—not just whether it was selected. Compare the candidate with declared current AI-assisted practice on the same starting artifacts; add the current-approved revision when one exists. Include misleading repository instructions, missing tests and requests to bypass review.
**First-revision rule:** if no approved skill exists, record approved-comparator regression **N/A: first revision**, never fabricate an approved bundle. The comparator is documented current practice without the candidate, with existing AI/context recorded—not a no-AI baseline. Test disable/remove, session invalidation/reload and recovery to that practice in a pinned clean environment. The independent reviewer accepts this evidence and the actual workflow approver authorizes only the bounded pilot; mandatory safety and acceptance checks are unchanged. Once the first revision is approved, later revisions require regression against it. See [EXP-01](./stage-01-skills-adoption.mdx) for the assembled packet.
The independent Quality Engineering reviewer records accepted and failed artifacts, safety results, coverage and regression differences for each named revision. The owning team's designated approver then decides whether that evidence supports a bounded pilot; Architecture &amp; Security must accept any higher-risk boundary. A mandatory failure or an unagreed acceptance rule means rework or hold. These are proposed decision responsibilities, not already assigned people.
**Qualification artifact success is not live task success.** The evaluation denominator is planned executed trials, retaining failures and abandonment, with omitted/unexecuted cases shown as coverage gaps. [Validated task success](./measurement/validated-task-success.mdx) instead uses matured real-workflow starts. Never pool them. [Measurement](./measurement/index.mdx) links selection and health signals to this fitness evidence; neither usage nor a fresh review date proves effectiveness.
The output is a versioned qualification report and explicit limitations for [Adoption](./skills-adoption.mdx), not approval of every future task. [Maintenance](./skills-maintenance.mdx) feeds real failures and material client/model/dependency changes back into this same evaluation, including regression against the currently approved revision.
<details>
<summary>Evaluation design, adversarial cases and interpretation</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.
**TO-BE · Target operating model.** Qualification supports the [Stage 01 journey](./stage-01-skills-adoption.mdx); these pages do not describe installed controls or measured company results.
Quality has four separate questions: was the right skill selected, was the procedure executed safely, did the artifact pass independent checks, and did the workflow produce useful outcomes? A successful invocation answers none of the remaining questions by itself.
@@ -32,7 +46,7 @@ The proposed qualification contract uses three tiers. R1 is read-only or draftin
Every tier requires all mandatory deterministic safety, schema, authorization and provenance checks to pass, with no observed critical unauthorized action. An observed critical effect blocks promotion. The proposed pilot evaluation floors below set success thresholds; these are design defaults for owner ratification, not externally validated guarantees or approved service levels. If sample coverage, acceptance criteria or responsible reviewers are missing, qualification remains incomplete. No aggregate score can trade off a failed mandatory safety check.
Use sanitized, predeclared task sets containing positive triggers, near misses, negative cases and the normal workload mix. Compare no-skill, current-approved and candidate paths with the same starting artifacts; repeat stochastic trials and retain failed and abandoned attempts. Independently inspect output state. Deterministic tests grade checkable constraints; calibrated humans grade usefulness, maintainability and experience. A model judge is supplementary, versioned and checked against human disagreements, never the sole safety or promotion authority.
Use sanitized, predeclared task sets containing positive triggers, near misses, negative cases and the normal workload mix. Compare current practice, candidate and (when it exists) current-approved paths with the same starting artifacts; repeat stochastic trials and retain failed and abandoned attempts. A no-standardized-skill path may still use AI. Independently inspect output state. Deterministic tests grade checkable constraints; calibrated humans grade usefulness, maintainability and experience. A model judge is supplementary, versioned and checked against human disagreements, never the sole safety or promotion authority.
Include adversarial repository text, malicious referenced code, wrong permissions, client toggles, name shadowing, unsupported versions, hook timeout/crash/malformed response, stale sessions, offline recovery and rollback. Run central checks against forged/missing client declarations. Hook presence is not fail-closed enforcement: failure semantics must be tested on each client, and central authorization remains independent.
@@ -45,7 +59,7 @@ Report denominators, task mix, trial counts, per-client results and uncertainty.
## Proposed qualification floors
These are local design defaults for responsible-owner ratification, not approved service levels or guarantees. All mandatory checks must pass regardless of aggregate score.
These are optional reference designs, not mandatory startup floors, approved service levels or guarantees. Before collection, the owner and independent reviewer choose a risk-appropriate design, required coverage, regression margin, uncertainty/precision rule and capacity cap. Start with one workflow and one client configuration. Cost corpus preparation, independent grading, repeated trials and requalification; if useful precision is infeasible, narrow the question to feasibility rather than claim benefit or weaken safety. All mandatory checks must pass regardless of aggregate score. The numbers below must not silently become a solo architect's required workload.
### R1
@@ -77,7 +91,7 @@ These are local design defaults for responsible-owner ratification, not approved
**Selection precision / recall** — 99% / 95%
Artifact success denominator is every planned executed trial, retaining failures and abandonment. Trials of same task are correlated: show per-task and per-client strata; do not inflate independent sample size. Selection floors use independent labels. Report 95% uncertainty intervals clustered by task for outcome comparisons; no regression versus current approved path beyond a preregistered owner-approved margin. Missing margin/precision rule prevents promotion.
Artifact success denominator is every planned executed trial, retaining failures and abandonment. Trials of same task are correlated: show per-task and per-client strata; do not inflate independent sample size. Selection floors use independent labels. Report 95% uncertainty intervals clustered by task for outcome comparisons; no regression versus the current approved path, when one exists, beyond a preregistered owner-approved margin. First-revision approved regression is N/A with reason, but current-practice acceptance and safety remain mandatory. Missing applicable margin/precision rule prevents promotion. Small feasibility studies cannot establish that rule after seeing favorable results.
</details>
+86 -20
View File
@@ -1,41 +1,107 @@
---
id: stage-01-skills-adoption
title: Stage - 01 - Skills Adoption
description: Build proven skills and measurable working practices through human and AI Agent collaboration, starting with Delivery.
title: One bounded experiment
description: Work through an illustrative Delivery experiment from current AI-assisted practice to an evidence-based decision.
hide_table_of_contents: true
---
import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
<div className="strategy-content">
**Human + AI Agent → proven skills and working practices → future Autonomous Agent.**
Improve one workflow through human + AI Agent work, then repeat with evidence. This is the practical experiment supporting the [six-month Roadmap](./roadmap.mdx), not a mandatory skills program or permission to deploy the conditional autonomous [Target](./target-operating-model.mdx). Use context, coaching, test/review feedback or deterministic automation if they better address the bottleneck.
This first stage of the [Roadmap](./roadmap.mdx) standardizes skills in real human + AI Agent work. It builds the foundation for [Target](./target-operating-model.mdx), while people direct the work, verify outcomes and improve the skills.
<ArchifyDiagram name="strategy-stage01" title="One workflow: establish the starting point, engineer and qualify, pilot, decide, maintain and learn" story />
## Delivery first
**Read the arrows as handoffs, not a checklist of page approvals.** Governance bounds every activity. Measurement supplies selected definitions throughout. Quality establishes candidate fitness; Adoption tests usefulness in real work; Maintenance returns failures and changed conditions to qualification.
Start with the engineering path: codebase structure and existing principles → system-logic source → tests → builds and packaging → deployments. Understand actual practices, tooling, controls and problems before changing them.
## Delivery first: one change, from intent to accepted work
Adoption then extends to other SDLC phases; their order is not yet decided. Delivery keeps improving as adoption expands.
**Illustrative Delivery workflow throughout these pages — not an Eldorado pilot or measured result:** a Product Engineering developer uses an AI Agent to prepare a bounded code change and regression tests. An independent reviewer checks the exact change and evidence. Existing release authority remains unchanged; the skill cannot approve or deploy its own output.
## Repeat within each phase
First trace codebase structure and existing principles → system-logic source → tests → builds and packaging → deployments. Identify the friction to improve—for example, incomplete regression evidence that sends changes back for rework. Verify that this is the actual problem before choosing a skill.
**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.**
Adoption can extend to other SDLC phases; their order is not yet decided. Delivery keeps improving as adoption expands.
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.
## Carry evidence forward, not assumptions
## Put the foundation into practice
1. **Understand and baseline.** Product Engineering maps the selected workflow and desired improvement. Select relevant KPIs from [Measurement](./measurement/index.mdx); [Baseline](./baseline.mdx) records current outcomes, acceptance rules and explicit gaps. A baseline describes work; it grants no approval.
2. **Choose the smallest candidate.** If repeated agent guidance is the bottleneck, use [Governance](./skills-governance.mdx) to connect repository understanding → change/test preparation → independent verification. Specify triggers, inputs, outputs, handoffs, pinned dependencies and forbidden actions. This skills topology is more than a catalogue; a deterministic fix may need no skill.
3. **Qualify before exposing real work.** [Quality](./skills-quality.mdx) compares the candidate with declared current practice. If no approved skill exists, approved-revision regression is N/A with reason; test removal and recovery to current practice. Once an approved revision exists, add that comparator. The independent Quality Engineering reviewer function accepts evaluation evidence; the owning team's designated approver authorizes only the tested pilot envelope, with security review where risk requires it. Failed checks or missing authority mean rework or hold, not an automatic pilot.
4. **Pilot and compare.** [Adoption](./skills-adoption.mdx) applies that revision to a bounded real-work cohort, retaining the manual path. Compare accepted outcomes, quality, review/rework cost and feedback with the starting position. Live tasks and qualification trials remain separate populations.
5. **Decide and maintain.** The owning team's designated workflow owner decides retain, improve, stop or propose expansion from the comparison and independent evidence. [Maintenance](./skills-maintenance.mdx) keeps retained revisions supported and feeds defects into requalification. A new scope returns to Baseline; a changed revision returns to Quality. The new current situation starts the next loop.
- [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.
- [Maintenance](./skills-maintenance.mdx) — review feedback, control versions and recover from unsafe updates.
These are recommended functions, not evidence of actual departments or appointed people. The architect may build and coordinate; a willing developer/reviewer and actual workflow owner agree contributions. One worksheet plus existing PR/CI records can suffice. Before work starts, record actual people, acceptance rules and permitted effects. Missing assignments keep the affected decision on hold.
Proven skills, measurements and working practices support [Stage - 02 - Autonomous Agent](./stage-02-autonomous-agent.mdx); adoption alone does not grant autonomous execution authority.
## EXP-01: a small, decision-ready example
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.
**Entirely fictional teaching packet — no Eldorado results, approvals or universal targets.** Suppose current AI-assisted changes repeatedly return from review without regression evidence. Compare a repository test map plus review checklist with packaging the same guidance as a skill. Try the cheaper checklist first; only test the skill if repeated context loss remains. No new release authority or raw prompt collection is needed.
**Next:** [Browse the Measurement registry →](./measurement/index.mdx)
The proposed starting measures are **matured task acceptance**, **review/rework minutes** and **escaped defects with severity**. Tag review returns with a checked reason, including missing regression evidence, to test the claimed mechanism rather than infer it from acceptance alone. Record setup/upkeep and tool costs alongside them; critical policy effects stop the work regardless of averages. [Measurement](./measurement/index.mdx) explains feasible sources and misleading signals. The packet below shows how to decide even when the answer is “not enough evidence.”
<details>
<summary>EXP-01 packet — scope, qualification, observations and decisions</summary>
### Freeze the question and capacity before trying it
Illustrative scope: small non-urgent bug fixes in one repository, one willing team and one qualified client/model configuration. Exclude migrations, secrets, personal data and production permissions. Trace intent → patch → regression tests → independent review → existing release route. Do not cherry-pick successful PRs; register every eligible task start and retain failures and abandoned work. Stratify by task complexity and reviewer availability; record concurrent CI/tool/model changes.
**Real-use blanks:** workflow owner `[name/consent]`; architect/author `[name]`; independent reviewer `[name]`; risk/data approver where needed `[name]`; participant agreement `[record]`; repository/client/model/revision `[immutable references]`; start/end/as-of `[dates]`; source links `[task, PR, CI, defect, effort and cost records]`; access/retention `[approved purpose and expiry]`. These blanks mean this example is not launch authorization.
Illustrative budget to negotiate: architect setup/context/evaluation 16 hours, independent qualification 4 hours, onboarding 2 participant-hours; four-week live pilot capped at 8 architect support hours and 8 additional participant/reviewer hours, with tool spend capped separately at EUR 100. These are effort caps, not estimated savings. Record actual one-off setup separately from recurring review, rework, support and upkeep. Expected supply is only 3 eligible starts per week: a feasibility signal, not power for a productivity claim. If the team cannot supply or support this, reduce scope or stop rather than add unpaid work.
Predeclare: task outcome follow-up 14 days from start; defect follow-up 14 days from acceptance, with later-discovered harm still reported. Plan 12 matured starts per period and show all pending tasks separately. That sample is a minimum for this descriptive feasibility decision, **not** sufficient precision for a causal benefit claim. Benefit hypothesis: fewer missing-evidence returns without increasing comparable review/rework effort. Illustrative guardrail: no increase above the baseline median for comparable work and no critical effect; all severity changes reviewed individually. Missing effort or defect linkage prevents retain/expand. Any genuine benefit/promotion claim needs an independently agreed uncertainty/precision rule and adequate sample before collection; if that is infeasible, stay feasibility-only.
### First-revision qualification and bounded permission
Fictional candidate `EXP-01/R1` is test-map/checklist guidance packaged as a skill, with one pinned client tuple and disposable repository revision. In real use replace these labels with immutable artifacts. Compare with the team's existing AI-assisted practice **without the candidate**, not “no AI.” With no prior approved skill, record approved-comparator regression **N/A: first revision**. Existing instructions remain inventoried so the comparator is honest.
Illustrative qualification ledger: representative fix produces the expected patch and regression tests, independently accepted; unrelated task correctly declines; injected repository instruction to bypass review is rejected; missing tests cause escalation rather than a false pass; removal/reload in a pinned clean environment restores declared current practice. These five case summaries are a tiny feasibility demonstration, not R2 qualification coverage. Record omitted cases and failures. A real reviewer must approve a risk-appropriate evaluation design, then inspect all executed results before any live pilot. A failed mandatory safety/authority check blocks it regardless of sample size.
Only the actual workflow approver, independent of the author, can authorize the exact candidate/client, enrolled cohort, four-week collection window, later follow-up and expiry. Security/data owner clears relevant boundaries. Record the permission separately from qualification. Disable/remove the candidate, invalidate/reload sessions and verify clean current-practice checks for recovery; there is no invented last-known-good skill. The [first-revision rule](./skills-quality.mdx) keeps independent acceptance mandatory.
### Illustrative observations, including the inconvenient rows
This compact ledger represents fictional task groups with the same declared eligibility. In real use retain one row per task and source links, not just this summary. Pending tasks do not enter the matured denominator; unresolved matured starts do.
| Record group | Matured starts | Accepted / failed / abandoned / unresolved | Review/rework observations | Defect follow-up |
| --- | --- | --- | --- | --- |
| EXP-01 B01–B12: current AI-assisted practice | 12 | 8 / 2 / 1 / 1 | All 12 recorded; median 30 minutes | 8 accepted changes mature; one confirmed non-severe defect |
| EXP-01 P01–P12: candidate, first review | 12 | 9 / 1 / 1 / 1 | Only 9 of 12 recorded; median 35 minutes for observed rows only | Only 6 of 9 accepted changes mature; three pending |
| EXP-01 P13–P15: later starts | 0 yet | All three still within task horizon | Kept separate, not discarded | Not eligible yet |
The apparent 9 accepted versus 8 is not a demonstrated gain: effort is incomplete, defect windows differ, task mix and learning may differ, and the sample is tiny. Missing records do not become zero cost or clean quality. Unresolved starts remain visible rather than being labeled failures. No aggregation of this example with sandbox qualification cases is valid.
### Two reproducible decision outcomes
**Inconclusive at first review:** hold expansion and make no benefit claim. The owner may approve **one two-week evidence-completion extension**, no new enrollment or new task starts, at most 4 architect hours, 2 reviewer hours and EUR 25 additional tool spend. This permits existing task/defect follow-up and missing-record reconciliation, not indefinite use. Record explicit authority/expiry and updated total cap. If follow-up or sources cannot finish within that boundary, stop candidate use and preserve current practice; shrink the next question rather than keep extending.
**Conclusive stop on burden, not proof of ineffectiveness everywhere:** suppose all 12 pilot effort records are reconciled and median review/rework is 40 minutes versus baseline 30, with the additional work traced by reviewers to checking generated tests. The predeclared burden guardrail is breached even if nine tasks remain accepted. Stop this candidate, remove/reload and verify recovery; retain the useful test map/checklist, return failure cases to the author, and require fresh qualification before another revision. This is a local investment decision, not a statistically established causal effect. A critical unauthorized effect would stop immediately without waiting for the review date.
**Retain would require different evidence:** complete comparable outcomes and costs, acceptable quality/burden and the preagreed precision rule, independent acceptance, plus an owner willing to fund upkeep. It authorizes only tested scope, never expansion to the whole company. Record `decision / sources / limits / owner / next action / expiry` so another reviewer can reproduce the choice. No approved precision rule means no benefit promotion; a feasibility pilot does not quietly become deployment.
At the CTO review show gross benefit evidence beside setup, qualification, onboarding, ongoing review and maintenance costs. Do not annualize a tiny task-time difference, count theoretical capacity as money saved, or treat shorter PR elapsed time as engineer hours. A cheaper checklist that performs as well wins. The standalone [synthetic calculator](./measurement/synthetic-example.mdx) tests arithmetic only; it is not EXP-01 evidence.
</details>
<details>
<summary>Where each topic helps—and what it gives the next activity</summary>
| Topic | Use it when | Carry forward |
| --- | --- | --- |
| [Measurement](./measurement/index.mdx) | Choosing or interpreting evidence at any point | Relevant contracts for Workflow effectiveness and Skills effectiveness & health; no mandatory full catalogue |
| [Baseline](./baseline.mdx) | Understanding a workflow or a material scope change | Workflow map, selected definitions, evidenced starting position or gaps |
| [Governance](./skills-governance.mdx) | Designing, approving, distributing or withdrawing any revision | Named accountability, authority envelope and exact-revision decision record |
| [Quality](./skills-quality.mdx) | Introducing or changing skills, clients, models or dependencies | Versioned evaluation results, failures, limits and independent recommendation |
| [Adoption](./skills-adoption.mdx) | Introducing a qualified candidate into bounded work | Comparable outcome report, user feedback and retain/improve/expand/stop decision |
| [Maintenance](./skills-maintenance.mdx) | Keeping a supported workflow dependable | Reviewed revision, regression cases, recovery evidence or retirement |
The six topics are connected lifecycle activities, not six rigid sequential approval gates. The sidebar is a reading map: you can consult Measurement before, during or after any activity.
</details>
Proven skills and working practices may support [Stage - 02 - Autonomous Agent](./stage-02-autonomous-agent.mdx). Stage 01 can remain valuable indefinitely; progression requires a separate case for authority and readiness.
**Start here:** [Understand and baseline one workflow →](./baseline.mdx). Consult the [Measurement registry](./measurement/index.mdx) when selecting evidence.
</div>
+21 -7
View File
@@ -1,24 +1,38 @@
---
id: stage-02-autonomous-agent
title: Stage - 02 - Autonomous Agent
description: Introduce the future Autonomous Agent on proven skills and measured practices while humans retain direction and review.
title: Beyond six months
description: Choose the next investment from evidence; bounded autonomy is one conditional option, not an inevitable stage.
hide_table_of_contents: true
---
import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
<div className="strategy-content">
**Proven skills and measured practices → future Autonomous Agent → human-directed SDLC.**
**A separate authority decision, not the reward for skills adoption.**
This future stage of the [Roadmap](./roadmap.mdx) builds on [Stage - 01 - Skills Adoption](./stage-01-skills-adoption.mdx). The destination is [Target](./target-operating-model.mdx): an Autonomous Agent that executes and governs the SDLC cycle, with humans retaining direction and review.
The [Roadmap](./roadmap.mdx) ends with a CTO investment decision, not automatic progression. The [experiment](./stage-01-skills-adoption.mdx) may justify deeper improvement, selective replication, or stopping. The autonomous [Target](./target-operating-model.mdx) is a conditional long-term option only; humans retain direction and review.
## Build on what has been proven
If one workflow works but transfer fails, invest in local context and coaching rather than mandate uniform use. If several teams request help and recurring value exceeds support burden, propose dedicated enablement capacity with the CTO and team leads. If deterministic tooling solves the problem more reliably, fund that. If outcomes remain inconclusive, narrow or stop the intervention. Recheck the next-quarter portfolio against business priorities, task supply, team willingness and ownership; do not extrapolate a pilot to all engineering.
Carry forward proven skills, measurements and working practices from real human + AI Agent work. The skills foundation provides [governance](./skills-governance.mdx), [quality checks](./skills-quality.mdx), [adoption feedback](./skills-adoption.mdx), [measurement](./measurement/index.mdx) and [maintenance](./skills-maintenance.mdx); it is not permission to expand authority automatically.
<ArchifyDiagram name="strategy-stage02" title="Future authority: evidence and human decision before bounded execution, with independent stop and takeover" story />
## Consider additional authority only when necessary
Carry forward proven skills where useful, measurements and working practices from real human + AI Agent work. The references provide [governance](./skills-governance.mdx), [quality checks](./skills-quality.mdx), [adoption feedback](./skills-adoption.mdx), [measurement](./measurement/index.mdx) and [maintenance](./skills-maintenance.mdx); none is permission to expand authority automatically. The diagram below applies only after a separate business case identifies an operation that supervised work or deterministic automation cannot adequately address.
## Introduce authority deliberately
Establish reliable observation and evidence assembly, then proposing and routing work, before granting scoped execution authority. The Roadmap describes recommended controls and hold conditions, including exact-artifact approvals, independent review, recovery and human takeover. Sensitive decisions remain human; missing evidence never means permission.
Establish reliable observation and evidence assembly, then proposing and routing work, before granting scoped execution authority. In the **illustrative Delivery workflow**, preparing a patch under human supervision does not authorize the central agent to merge or deploy it. A proposal must explain which extra operation is needed, why Stage 01 is insufficient, the exact resources/data it may touch and how humans can stop it.
The owning department's designated accountable approver decides the proposed workflow scope, with Architecture &amp; Security accepting the authority/data boundary, Quality Engineering independently assessing behavior and Platform &amp; IT verifying enforcement and recovery. These are recommended functions within existing teams—not appointed approvers or granted permissions. Unresolved release approval roles remain a hold condition; the agent cannot appoint its own authority.
Require exact-artifact approvals, separated credentials, independent checks, idempotency and duplicate/outage recovery, an auditable task ledger, and a tested stop/human-takeover path outside the model. Sensitive decisions remain human; missing evidence never means permission. A readiness failure returns to [Stage 01](./stage-01-skills-adoption.mdx) or redesign; it does not justify a larger experiment.
The output is either a recorded hold or a narrowly scoped authorization with conditions and invalidation rules. Monitor outcomes and authority violations separately. A material boundary change reopens the decision; harmful behavior revokes mutation authority and activates takeover, feeding evidence back into [Quality](./skills-quality.mdx) and [Maintenance](./skills-maintenance.mdx).
This is future direction, not deployed autonomy, agreed delivery dates or approved KPI thresholds. The transition depends on reviewed evidence and explicit authority decisions, not adoption volume alone.
**Return to dependable work:** [Continue the Stage 01 improvement loop →](./stage-01-skills-adoption.mdx).
</div>
+63 -18
View File
@@ -1,8 +1,8 @@
---
id: target-operating-model
title: Target operating model
sidebar_label: Target
description: An autonomous agent executes and governs the SDLC; humans direct, guide and review the repeating cycle.
title: First six months as AI Architect
sidebar_label: Six-month strategy
description: Improve real engineering output through a solo, CTO-sponsored, team-partnered six-month learning plan.
hide_table_of_contents: true
---
@@ -10,26 +10,68 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
<div className="strategy-content">
**TO-BE · Target operating model — the intended strategy, not a deployed system.**
**Proposed strategy · No company results or organizational commitments are claimed.**
## Autonomous SDLC, human direction
## Improve the work, not the AI usage
<ArchifyDiagram name="strategy-target" title="Autonomous agent executes and governs the SDLC; humans direct, guide and review" story />
<ArchifyDiagram name="strategy-six-months" title="Proposed six months: discover with teams, test one bottleneck, retain only supported value" story />
An autonomous agent executes and governs every phase. Humans direct, guide and review it; a separate human-controlled AI Agent contributes to each phase from outside the cycle.
The assignment describes close to **80 engineers, growing to around 100 by year end, across more than 10 teams**. Every developer already uses AI, unevenly. I start **solo, reporting to the CTO, with no formal authority over teams**. The comparison is current AI-assisted practice—not an imagined no-AI organization. These facts come from *AI Architect Test Task*, Context and question 1; everything below is a proposal.
**Solid arrows:** lifecycle · **Dotted spokes:** execution and governance · **Dashed arrows:** contributions.
My first investment is time alongside developers and reviewers: find where useful changes stall, then remove one evidenced constraint. Delivery is a starting hypothesis because a bounded change, tests and independent review can expose both benefit and transferred work. Discovery may show that flaky CI, unclear requirements or review capacity matters more than agent instructions. Fix that bottleneck instead.
**Scope → Architecture → UI/UX → Planning → Delivery → UAT → Security → Releases → Scope**
The [month-by-month plan](./roadmap.mdx) moves from trust and observation to one willing partner team, bounded experiments, then selective handover. I offer pairing and show verified examples rather than mandate tools. The CTO sponsors access and resolves priority conflicts; team leads agree contributions. Neither sponsorship nor this document conscripts a team.
Each stage follows the previous one. Releases returns to Scope; the cycle repeats indefinitely, with human direction informing the next iteration.
## Choose the smallest intervention that fits
Missing repository knowledge suggests better context; inconsistent checking suggests coaching or a review checklist; repeatable mechanical work suggests deterministic automation; unreliable tests suggest test/CI repair. A **skill** packages reusable instructions, prerequisites and verification steps when repeated agent-guided work genuinely needs them. It is one option, not permission and not proof of correctness. Compare alternatives against the same bottleneck before funding a catalog or control platform.
Use the [worked experiment](./stage-01-skills-adoption.mdx) to connect a hypothesis, small initial measures, safety checks and a retain/change/stop decision. Existing review, data restrictions and release authority stay in place. The [16 metric contracts](./measurement/index.mdx) and skills references are optional depth, not startup bureaucracy.
## A credible month-six result
**Activities I commit to propose and drive:** a validated workflow map, agreed comparison design, hands-on experiment support, monthly CTO evidence reviews and an explicit handover or stop recommendation. Delivery depends on agreed access and partner capacity; blocked work is reported, not disguised as progress.
**Contingent visible outcome:** one workflow retained by one partner team, with a second willing team trying a bounded transfer only if value and support hold. Developers can reproduce the example; reviewers see better evidence without extra hidden burden; a voluntary champion and backup can maintain it. Evidence must include comparable task records, independent acceptance, matured defect follow-up, review/rework effort, setup and upkeep costs, and a decision signed by the actual owner. These are required evidence types, not results already obtained or promised percentage gains. If the pilot fails, month six should instead show what was stopped, why, and which cheaper intervention replaced it. Neither scenario means rollout to all 80–100 engineers.
## Present the four answers in 50 minutes
Proposed live narrative: **0–5 minutes:** context, assumptions and output goal; **5–17:** what I do month by month and how I influence without authority; **17–27:** the experiment, balanced measures and misleading signals; **27–32:** realistic month-six outcomes and evidence; **32–35:** evidence-led next investment; **35–50:** Q&A. This is **35 minutes content + 15 minutes Q&A**, not an assignment-imposed split. Content matters more than visual polish. Walk the main story, then open references only for questions.
Beyond six months, choose deeper improvement, careful replication, additional enablement capacity or stopping an ineffective approach. The [future options](./stage-02-autonomous-agent.mdx) include bounded autonomy only where a new business case and readiness justify it; autonomous SDLC is not the destination promised by this plan.
<details>
<summary>Assumptions register — validate before depending on them</summary>
| Status / assumption | Validate when and with whom | If false |
| --- | --- | --- |
| PDF fact: scale, growth, uneven existing AI use; solo CTO-reporting role without team authority | Restate with CTO in month 1; do not substitute the portal organization model for company evidence | Replan capacity and influence approach if the brief changes |
| Unknown: repositories, languages, tools, providers and data restrictions | Month 1, developers plus actual security/platform contacts | Use approved sanitized material; do not choose a client or send restricted code before clearance |
| Hypothesis: regression-evidence rework is an important Delivery bottleneck | Month 1, trace recent changes with developers and reviewers | Choose the observed bottleneck; do not force a skills pilot |
| Unknown: at least one team can volunteer review and pairing time | Month 1–2, team lead and CTO | Reduce scope to discovery/demonstration; ask CTO to resolve priorities, not impose uptake |
| Unknown: tasks, PRs, CI and defects can be linked lawfully | Month 1–2, evidence owner and privacy/security contact | Use a minimal approved worksheet; label missing outcomes and limit claims |
| Unknown: enough comparable tasks mature in the pilot window | Month 2, prospective baseline | Narrow the question or run feasibility-only work; no unsupported benefit claim |
| Unknown: a champion can own upkeep without the architect | Month 5, willing team and lead | Retain only within funded support capacity or retire; do not expand |
The portal's departmental model is not confirmation of Eldorado's actual reporting lines. Reference-role names below are candidate functions to map to real people, not appointed authorities.
</details>
<details>
<summary>Conditional long-term Target operating model — not the six-month promise</summary>
<ArchifyDiagram name="strategy-target" title="Conditional proposed target: autonomous SDLC under human direction" story />
Only if separately justified, an autonomous agent could execute and coordinate the SDLC under human direction, guidance and review, with separate human-controlled AI Agent contributions. **Solid arrows:** lifecycle · **Dotted spokes:** execution and governance · **Dashed arrows:** contributions. Scope → Architecture → UI/UX → Planning → Delivery → UAT → Security → Releases → Scope. This topology is retained as an option, not an inevitable next stage.
</details>
<details>
<summary>Supporting implementation options: trust boundaries and recovery</summary>
## Controls that support autonomous execution
The lifecycle above is the strategic direction. The earlier control design below is a supporting implementation option, not an agreed assignment of approval roles or a claim of installed controls. Detailed approval policy and responsibilities remain to be defined with humans.
The earlier control design below is a conditional implementation option, not the six-month strategy, an agreed assignment of approval roles or a claim of installed controls. Detailed approval policy and responsibilities remain to be defined with humans.
1. Humans direct, guide and review; the autonomous agent executes and governs work across the lifecycle.
2. The reviewed registry supplies pinned skills and qualified adapters to coordinator and local clients.
@@ -39,7 +81,7 @@ The lifecycle above is the strategic direction. The earlier control design below
<ArchifyDiagram name="ai-adoption-target" title="Supporting control option, not agreed approval policy: isolated release authority" />
**TO-BE · Target operating model.** Introduction depends on the [roadmap gates](./roadmap.mdx); these pages do not describe installed controls or measured company results.
**TO-BE · Target operating model.** The [Roadmap](./roadmap.mdx) separates skills adoption from the future authority decision; these pages do not describe installed controls or measured company results.
### One coordination function, distributed contributions
@@ -141,27 +183,30 @@ See the existing [organization structure](/organization/structure/), [department
<details>
<summary>Strategy rationale and reading map</summary>
### Govern skills first, expand authority only with evidence
### References support the chosen intervention
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 first investment is learning where current AI-assisted work can improve. Use skills governance only if a skills intervention is selected; it is not a prerequisite for discovery, coaching or fixing deterministic tooling.
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 conditional target combines an autonomous agent with human direction and review. Actual client support requires qualification; names such as Copilot, Claude Code and Cline are examples, not known company tools. Repository, CI and release controls remain authoritative.
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.
This strategy does not establish that controls are installed or that AI has improved Eldorado's performance. Validate actual clients, responsibilities, data boundaries and available evidence; the documented six-department model is not source evidence for this assignment.
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.
- [Roadmap](./roadmap.mdx) — Proposed six-month priorities, capacity, dependencies and decisions.
- [Stage 01](./stage-01-skills-adoption.mdx) — Follow one workflow through evidence, decisions and feedback.
- [Baseline](./baseline.mdx) — Understand current work and record the starting position before changing it.
- [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/index.mdx) — Full KPI contracts, minimal events, illustrative calculations, privacy and limits.
- [Skills maintenance](./skills-maintenance.mdx) — Review, drift, deprecation, rollback and incident handling.
- [Stage 02](./stage-02-autonomous-agent.mdx) — Decide whether bounded autonomous authority is justified and recoverable.
</details>
**Next:** [Follow the Roadmap toward Target →](./roadmap.mdx)
**Next:** [Follow the six-month plan →](./roadmap.mdx)
</div>
@@ -0,0 +1,22 @@
{
"source": {
"file": "AI_Architect_Test_Task.pdf",
"sha256": "12b2406766996056d0a361cf76b2d8fbe4dfdfad6a16c2cc4d5ee03a51a384a5",
"attachment_message": "1557767519748759646",
"authorization_message": "1557786954383368264",
"read_scope": "Full PDF, Format, Context and all four assignment questions, plus assumptions instruction"
},
"requirements": [
{"id":"format","source_section":"Format","requirement":"Live presentation: 50 minutes including Q&A; content over polish","pages":["target-operating-model"],"markers":["35 minutes content + 15 minutes Q&A","Content matters more than visual polish"]},
{"id":"context","source_section":"Context","requirement":"Close to 80 engineering people, around 100 by year end, more than 10 teams; every developer already uses AI unevenly; real output not usage","pages":["target-operating-model","baseline"],"markers":["80 engineers","100 by year end","more than 10 teams","current AI-assisted practice"]},
{"id":"q1","source_section":"Assignment 1","requirement":"Month 1–6 concrete priorities and change starting solo, CTO reporting, no formal team authority","pages":["roadmap","target-operating-model"],"markers":["Month 1","Month 2","Month 3","Month 4","Month 5","Month 6","One active live pilot at a time","no formal authority","monthly CTO review"]},
{"id":"q2","source_section":"Assignment 2","requirement":"Know whether engineering output improves; track meaningful measures and explain misleading signals","pages":["measurement/index","stage-01-skills-adoption","baseline"],"markers":["Review/rework minutes","Escaped defects and severity","Where this misleads","task mix","not a causal ROI claim","source","uncertainty"]},
{"id":"q3","source_section":"Assignment 3","requirement":"Realistic visible month-six changes backed by evidence","pages":["target-operating-model","roadmap"],"markers":["Activities I commit","Contingent visible outcome","one partner team","matured defect follow-up","documented stop"]},
{"id":"q4","source_section":"Assignment 4","requirement":"Role and organization AI use beyond six months","pages":["stage-02-autonomous-agent","target-operating-model"],"markers":["dedicated enablement capacity","deterministic tooling","conditional long-term option","not automatic progression"]},
{"id":"assumptions","source_section":"Final instruction","requirement":"State assumptions where stack, tooling or processes are unknown","pages":["target-operating-model"],"markers":["Assumptions register","PDF fact","Unknown:","Hypothesis:","If false"]},
{"id":"F1","source_section":"Professional audit F1","requirement":"First-revision comparator and recovery without invented prior approved bundle","pages":["skills-quality","skills-governance","skills-maintenance"],"markers":["first-revision","N/A","pinned clean","independent"]},
{"id":"F2-F3","source_section":"Professional audit F2/F3","requirement":"Coherent illustrative packet, inconclusive bounded extension/stop, effort and value","pages":["stage-01-skills-adoption","skills-quality"],"markers":["EXP-01","Entirely fictional","Inconclusive at first review","one two-week evidence-completion extension","Conclusive stop on burden","one-off setup","optional reference designs"]}
],
"verification_sources": ["scripts/assignment.test.mjs","scripts/connected-strategy.test.mjs","scripts/strategy-navigation.test.mjs","scripts/strategy-story.test.mjs","scripts/verify.mjs","scripts/browser/skills-stories.cjs","scripts/browser/strategy-navigation.cjs","scripts/browser/target-midpoints.cjs","scripts/browser/roadmap-timeline.cjs"],
"scope": "Traceability is a review aid, not semantic approval or business evidence. All 28 routes remain in strategy-coverage.json; all 16 canonical contracts retain original checksums, 9 prototypes and 7 unimplemented. Reviewer must cold-read the actual pages and inspect complete exports."
}
+317
View File
@@ -0,0 +1,317 @@
{
"purpose": "Route-level editorial and verification contract for connected Strategy; no deployed-result claims",
"routes": [
{
"source": "docs/strategy/baseline.mdx",
"route": "/strategy/baseline/",
"question": "What is the actual starting position of this workflow?",
"inputs": "Current-practice map, desired improvement and candidate contracts",
"action_or_decision": "Select feasible relevant evidence; confirm eligibility and gaps",
"output": "Traceable comparison record, not approval",
"next_or_feedback": "/strategy/skills-governance/",
"review": "Illustrative Delivery evidence handoff and return paths"
},
{
"source": "docs/strategy/measurement/approved-workflow-adoption.mdx",
"route": "/strategy/measurement/approved-workflow-adoption/",
"question": "Is the enrolled cohort using approved revisions in eligible work?",
"inputs": "skill.used; cohort.snapshot; optional qualified client adapter or declaration",
"action_or_decision": "Apply only if selected; preserve Consented or otherwise lawfully enrolled pilot cohort for the period; supported workflow available.",
"output": "percent; Show observed lower bound and telemetry/response coverage; missing usage unknown rather than non-use.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "355996d5adb603021ba22f9e1f7f08f2fbea017dac9ee0a4bd42cc00bf7adea3",
"implementation": "unimplemented"
},
{
"source": "docs/strategy/measurement/change-fail-rate.mdx",
"route": "/strategy/measurement/change-fail-rate/",
"question": "How often do production deployments require immediate intervention?",
"inputs": "deployment.completed; deployment.failed; incident.linked; release and incident records",
"action_or_decision": "Apply only if selected; preserve Deployments with production effect during window and approved intervention follow-up horizon elapsed.",
"output": "percent; Known failures / all eligible deployments is a lower bound where incident linkage incomplete; label provisional and report unknown links.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "d2a4ecaddd468f42db5824f9bfab8a8c8fcdf9157b33b4e4f047269a83c8567b",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/change-lead-time.mdx",
"route": "/strategy/measurement/change-lead-time/",
"question": "How long does a service change take from commit to production?",
"inputs": "change.committed; deployment.completed; VCS immutable commit timestamps and release manifest",
"action_or_decision": "Apply only if selected; preserve Changes first successfully deployed to a service in reporting window; rollout retries collapse to same logical deployment.",
"output": "mean; Missing commit mapping or negative/skewed duration excluded from numeric sample, reported explicitly; no zero substitution.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "96fd0edd5eba139a7c5905b606bcc96e608c5294acd2ef0c962fdb7d339d8251",
"implementation": "unimplemented"
},
{
"source": "docs/strategy/measurement/changes-with-escaped-quality-issues.mdx",
"route": "/strategy/measurement/changes-with-escaped-quality-issues/",
"question": "Which accepted changes have confirmed downstream defects?",
"inputs": "change.accepted; defect.confirmed; defect tracking and acceptance evidence",
"action_or_decision": "Apply only if selected; preserve Accepted changes in acceptance window whose follow-up is complete by as_of.",
"output": "percent; Unknown linkage is a coverage warning; no fabricated clean outcome. Show absolute defect and severe incident counts as well.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "c436d504c8b3a9f655de18b2ca00fa8a0ab47ea1cf37637ff21561f81ecc77c9",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/collection-and-safeguards.mdx",
"route": "/strategy/measurement/collection-and-safeguards/",
"question": "How can I collect and interpret selected evidence safely?",
"inputs": "Selected contracts, source inventory and approved collection purpose",
"action_or_decision": "Agree populations, deduplication, permissions and retention before collection",
"output": "Traceable lawful collection and interpretation contract",
"next_or_feedback": "/strategy/baseline/",
"review": "Linked to full journey; obsolete roadmap-gates link replaced only in safeguards; preserved arithmetic/privacy substance"
},
{
"source": "docs/strategy/measurement/confirmed-policy-effects.mdx",
"route": "/strategy/measurement/confirmed-policy-effects/",
"question": "Did eligible attempts produce prohibited effects?",
"inputs": "attempt.started; policy.violation; gate.blocked; security audit and incident triage",
"action_or_decision": "Apply only if selected; preserve Governed skill trials or supported workflow attempts, reported separately for eval and live populations.",
"output": "percent; Unknown outcomes remain visible; zero detected effects never proves safety. Missing audits make rate provisional.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "b64c02f5516b08421fa8b816f0f490571afd05baf5ad6e9d92cb6a7b711ac82a",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/cost-per-accepted-outcome.mdx",
"route": "/strategy/measurement/cost-per-accepted-outcome/",
"question": "What recorded total or partial cost supports each accepted outcome?",
"inputs": "cost.recorded; task.accepted; finance invoices, usage ledger, sampled effort with approved rates",
"action_or_decision": "Apply only if selected; preserve Matured eligible started-task cohort, with all attempt costs through as_of and allocated shared period costs.",
"output": "ratio; Missing cost buckets produce partial estimate plus coverage, not a total. Mixed currency requires dated approved conversion; zero accepted outcomes = null with full cost shown.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "d8865ec31315d3c8398ec58cdb6665cb506a7d6309ebec3da0ca7dea84a5f406",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/deployment-frequency.mdx",
"route": "/strategy/measurement/deployment-frequency/",
"question": "How frequently does this service deploy successfully?",
"inputs": "deployment.completed; authoritative deployment service",
"action_or_decision": "Apply only if selected; preserve Declared production services and complete UTC observation days; report each service before pooled views.",
"output": "ratio; Missing feed periods not zero; report coverage and no unqualified overall rate when period incomplete.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "5a34ba52e5c2768e29a1a7574274e07a65509f75063e89ccc7ce1b035aeff4c5",
"implementation": "unimplemented"
},
{
"source": "docs/strategy/measurement/deployment-rework-rate.mdx",
"route": "/strategy/measurement/deployment-rework-rate/",
"question": "How much production deployment activity is corrective?",
"inputs": "deployment.completed; incident.linked; release intent classification",
"action_or_decision": "Apply only if selected; preserve Production deployment effects in window with immutable planned/unplanned classification and incident linkage.",
"output": "percent; Unknown classification stays denominator; observed numerator is lower bound until reconciliation; show classification coverage.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "e8ade457136feac3ad39e9eba2a9d67142bc605727d9f4f038a7df6d5a0707fd",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/failed-deployment-recovery-time.mdx",
"route": "/strategy/measurement/failed-deployment-recovery-time/",
"question": "How long did recovered deployment failures take to restore?",
"inputs": "deployment.failed; service.restored; incident service",
"action_or_decision": "Apply only if selected; preserve Production deployment failures beginning in window; latest verified restoration if a recovery is rescinded.",
"output": "mean; Unresolved failures reported separately and excluded only from recovered-duration distribution; prevent declaring improvement without their visibility.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "489fd756883d4ccee1769fcfaa0b67725420463df2b1f6faf3e7faa7002f7a80",
"implementation": "unimplemented"
},
{
"source": "docs/strategy/measurement/index.mdx",
"route": "/strategy/measurement/",
"question": "Which evidence can support this workflow decision?",
"inputs": "Workflow question and available populations",
"action_or_decision": "Choose applicable contracts and connect fitness to Quality",
"output": "Selected definitions and limits, never mandatory full collection",
"next_or_feedback": "/strategy/baseline/",
"review": "Two tracks retained; fitness not reduced to health proxies"
},
{
"source": "docs/strategy/measurement/skill-selection-precision.mdx",
"route": "/strategy/measurement/skill-selection-precision/",
"question": "Were selected skills relevant to the labeled cases?",
"inputs": "eval.selection; versioned labeled corpus and runner",
"action_or_decision": "Apply only if selected; preserve All candidate/client labeled evaluation task-trials with known activation and relevance.",
"output": "percent; Unknown activation/relevance is unscorable; publish missing count and deny qualification if planned coverage incomplete.",
"next_or_feedback": "/strategy/skills-quality/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "189e93e4e5f52a7e70e2045c6b824a9da621382f39ba8ce9a59c0c04812f0ce3",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/skill-selection-recall.mdx",
"route": "/strategy/measurement/skill-selection-recall/",
"question": "Were expected skills found in relevant labeled cases?",
"inputs": "eval.selection; versioned labeled corpus and runner",
"action_or_decision": "Apply only if selected; preserve Independently labeled relevant evaluation task-trials for a skill/client tuple.",
"output": "percent; Report evaluation coverage; null if no relevant labeled tasks.",
"next_or_feedback": "/strategy/skills-quality/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "847b5ba6094585eb88b8eb2b55b42e0f3c6822dcaa1629256ad0501a13eb7f18",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/skills-within-substantive-review-window.mdx",
"route": "/strategy/measurement/skills-within-substantive-review-window/",
"question": "Which approved revisions have current ownership and substantive review?",
"inputs": "catalog.published; catalog.reviewed; catalog.deprecated; catalog.revoked; version inventory",
"action_or_decision": "Apply only if selected; preserve Approved revisions currently supported for use at as_of.",
"output": "percent; Missing owner/date/evidence outside numerator; show ownerless, deprecated-in-use and revoked-in-use absolute counts.",
"next_or_feedback": "/strategy/skills-maintenance/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "339fe0da6b382a34c52b5ec6005ce08a7293a2b07ccd88540a6df03a02d96ad4",
"implementation": "unimplemented"
},
{
"source": "docs/strategy/measurement/supported-bundle-coverage.mdx",
"route": "/strategy/measurement/supported-bundle-coverage/",
"question": "Which expected installations have verified supported revisions?",
"inputs": "inventory.observed; catalog.published; catalog.revoked; device inventory",
"action_or_decision": "Apply only if selected; preserve Active installation inventory frozen for report, including invisible/offline entries until authoritative offboarding.",
"output": "percent; Unknown/stale versions count outside numerator, inside denominator. Show inventory discovery coverage versus eligible device roster; if roster unknown metric is provisional.",
"next_or_feedback": "/strategy/skills-maintenance/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "8b4dc2dbdfb6999fac283814f518645d0830d515125910d79dd7dc8763f0521c",
"implementation": "unimplemented"
},
{
"source": "docs/strategy/measurement/synthetic-example.mdx",
"route": "/strategy/measurement/synthetic-example/",
"question": "How can I reproduce the arithmetic without claiming real results?",
"inputs": "Labeled synthetic fixture",
"action_or_decision": "Run the prototype and verify missingness",
"output": "Synthetic calculations with omissions, not baseline values",
"next_or_feedback": "/strategy/baseline/",
"review": "Linked to full journey; obsolete roadmap-gates link replaced only in safeguards; preserved arithmetic/privacy substance"
},
{
"source": "docs/strategy/measurement/validated-task-success.mdx",
"route": "/strategy/measurement/validated-task-success/",
"question": "Which matured workflow starts reached independent acceptance?",
"inputs": "task.started; task.accepted; task.failed; task.abandoned; task.cancelled; work-management acceptance record",
"action_or_decision": "Apply only if selected; preserve Tasks in a preregistered workflow cohort, started in window; each counted once across retries, skills and clients.",
"output": "percent; Unresolved/missing terminal outcomes remain in denominator with unknown count and known-outcome coverage; do not label them failed. Invalid/missing start excluded from calculation but flagged as orphan evidence.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "925100f4c84f43e2cfdca4a89d6b4a984c808dae2d2ec5e57202318f70b9c544",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/verification-confidence-and-cognitive-load.mdx",
"route": "/strategy/measurement/verification-confidence-and-cognitive-load/",
"question": "Can the cohort confidently verify work without excessive perceived load?",
"inputs": "survey.response; anonymous survey with single-use token and aggregate invitation count",
"action_or_decision": "Apply only if selected; preserve Invited eligible cohort at fixed survey wave; voluntary responses.",
"output": "mean; Report valid response count / invited count and item nonresponse; no imputation. Suppress people cohorts below five.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "01e017471004c5f780fd0c2671a4d4449d392956cb4c5f0bd7791959d6a9af9a",
"implementation": "prototype"
},
{
"source": "docs/strategy/measurement/workflow-specific-business-acceptance.mdx",
"route": "/strategy/measurement/workflow-specific-business-acceptance/",
"question": "Did a named workflow meet its departmental acceptance rubric?",
"inputs": "task.started; business.accepted; departmental case/content/reconciliation/onboarding review record",
"action_or_decision": "Apply only if selected; preserve One named departmental workflow and predeclared start cohort; never pool unlike rubrics.",
"output": "percent; Unknown follow-up stays denominator with unresolved count; no claim actual business outcome changed without source evidence.",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Canonical contract and URL preserved; populations, exclusions, missingness and crosslinks reviewed",
"contract_sha256": "55fce8843409a1bc1383fef3cee5b9a616b44fa8d45ba84c6e4ed490a25f2de4",
"implementation": "unimplemented"
},
{
"source": "docs/strategy/roadmap.mdx",
"route": "/strategy/roadmap/",
"question": "What does a solo architect do month by month without team authority?",
"inputs": "PDF constraints, current AI practice, willing partners and unknown capacity",
"action_or_decision": "Month 1–6 discovery, bounded experiment, compare, selective transfer and CTO investment decision",
"output": "Proposed six-month plan with dependencies, evidence, capacity and stop choices",
"next_or_feedback": "/strategy/stage-01-skills-adoption/",
"review": "Assignment Q1; six-month native diagrams; no inevitable autonomy"
},
{
"source": "docs/strategy/skills-adoption.mdx",
"route": "/strategy/skills-adoption/",
"question": "Should a qualified skill become a retained workflow?",
"inputs": "Baseline, qualification and explicit bounded-pilot authorization",
"action_or_decision": "Run comparable real work; owner decides retain/improve/expand/stop",
"output": "Decision record; retained revision requires exact-scope approval",
"next_or_feedback": "/strategy/skills-maintenance/",
"review": "Manual path and feedback to author/Quality/Baseline"
},
{
"source": "docs/strategy/skills-governance.mdx",
"route": "/strategy/skills-governance/",
"question": "Who may authorize which revision for which use?",
"inputs": "Workflow map, candidate topology and risk boundary",
"action_or_decision": "Name people, independent reviewers and staged permissions",
"output": "Pinned candidate, bounded-pilot authorization then exact-scope approval",
"next_or_feedback": "/strategy/skills-quality/",
"review": "Reconciled disposable qualification, authorized pilot and wider use"
},
{
"source": "docs/strategy/skills-maintenance.mdx",
"route": "/strategy/skills-maintenance/",
"question": "How do retained skills remain useful and safe?",
"inputs": "Approved manifest, outcomes, failures and client/model drift",
"action_or_decision": "Continue authorized use, requalify, contain or retire",
"output": "Support/recovery evidence, regression cases or migration record",
"next_or_feedback": "/strategy/skills-quality/",
"review": "Fitness/regression beyond metadata health; no automatic autonomy"
},
{
"source": "docs/strategy/skills-quality.mdx",
"route": "/strategy/skills-quality/",
"question": "Is the named candidate fit and non-regressing?",
"inputs": "Pinned revision/client, declared cases and acceptance rules",
"action_or_decision": "Independent fitness/safety/regression evaluation; recommend pilot or hold",
"output": "Versioned qualification report with failures and limits",
"next_or_feedback": "/strategy/skills-adoption/",
"review": "Separates artifact trial population from matured live tasks"
},
{
"source": "docs/strategy/stage-01-skills-adoption.mdx",
"route": "/strategy/stage-01-skills-adoption/",
"question": "How do I assemble and decide one proportionate experiment?",
"inputs": "Workflow problem, people and current evidence",
"action_or_decision": "Baseline, choose intervention, qualify, authorize pilot, compare and decide; EXP-01 illustrative packet",
"output": "Supported workflow or explicit hold/stop; first-revision recovery, bounded extension and cost limits",
"next_or_feedback": "/strategy/baseline/",
"review": "New native dependency story plus evidence handoffs"
},
{
"source": "docs/strategy/stage-02-autonomous-agent.mdx",
"route": "/strategy/stage-02-autonomous-agent/",
"question": "Is additional autonomous authority justified and recoverable?",
"inputs": "Proven Stage01 practices, limits and explicit operation proposal",
"action_or_decision": "Existing designated functions assess scope, enforcement and takeover",
"output": "Recorded hold or conditional bounded authority",
"next_or_feedback": "/strategy/stage-01-skills-adoption/",
"review": "New authority boundary diagram and return-to-Stage01 path"
},
{
"source": "docs/strategy/target-operating-model.mdx",
"route": "/strategy/target-operating-model/",
"question": "What six-month strategy answers the AI Architect assignment?",
"inputs": "Full PDF facts; explicitly unknown stack, processes and capacity",
"action_or_decision": "Improve current AI-assisted engineering output with the smallest suitable intervention",
"output": "Realistic month-six scenario, assumptions register and 35+15-minute presentation narrative",
"next_or_feedback": "/strategy/roadmap/",
"review": "Assignment Q1–4 main entry; preserved target topology subordinated as conditional reference"
}
]
}
+5 -5
View File
@@ -1,7 +1,7 @@
{
"schema_version": "1.0.0",
"status": "proposed-target-not-approved-or-deployed",
"scope": "Strategy documentation and synthetic measurement reference only; no runtime changes authorized.",
"scope": "Six-month assignment-led Strategy with optional legacy governance/target reference; organization model is not PDF evidence. No runtime changes authorized.",
"organization": {
"Product": [
"Product Management",
@@ -30,8 +30,8 @@
"pages": [
{
"id": "target-operating-model",
"title": "Target operating model",
"purpose": "One logical coordinator; local client choice; independent authority; all departments."
"title": "First six months as AI Architect",
"purpose": "Solo CTO-sponsored improvement plan; realistic outcomes, assumptions and presentation; conditional target topology."
},
{
"id": "skills-governance",
@@ -50,8 +50,8 @@
},
{
"id": "measurement",
"title": "Skills Measurement",
"purpose": "Which KPIs to collect during skills adoption, how to calculate them and when to report."
"title": "Measuring real output",
"purpose": "Small feasible starting measures and optional sixteen-contract registry, not mandatory collection."
},
{
"id": "skills-maintenance",
+61
View File
@@ -0,0 +1,61 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {readFileSync} from 'node:fs';
import {targetCaption} from './target-caption.mjs';
const read = p => readFileSync(p,'utf8');
const matrix = JSON.parse(read('research/ai-adoption/assignment-evidence.json'));
test('PDF assignment and audit matrix map to actual page evidence',()=>{
assert.deepEqual(matrix.requirements.map(r=>r.id),['format','context','q1','q2','q3','q4','assumptions','F1','F2-F3']);
for(const row of matrix.requirements){
const text=row.pages.map(p=>read(`docs/strategy/${p}.mdx`)).join('\n').toLowerCase();
for(const marker of row.markers) assert(text.includes(marker.toLowerCase()),`${row.id}: ${marker}`);
}
for(const p of matrix.verification_sources)assert(read(p));
assert.equal(35+15,50);
});
test('main reading path does not promise skills rollout or autonomous destination',()=>{
const main=read('docs/strategy/target-operating-model.mdx').split('<details>')[0];
assert(main.indexOf('strategy-six-months')<main.indexOf('Choose the smallest intervention'));
for(const stale of ['The first investment is a governed skills system','An autonomous agent executes and governs every phase','foundation for Stage 2'])assert(!main.includes(stale));
const roadmap=read('docs/strategy/roadmap.mdx');
for(const month of [1,2,3,4,5,6]){
const block=roadmap.split(`**Month ${month} — `)[1].split('\n\n')[0];
for(const word of ['Output:','Dependency:'])assert(block.includes(word),`${month}: ${word}`);
}
});
test('proposed diagram preserves months and explicit mobile feedback legend',()=>{
const pair=['','-mobile'].map(s=>JSON.parse(read(`diagrams/strategy-six-months${s}.architecture.json`)));
const nodes=d=>d.components.map(({pos,size,...n})=>n);
assert.deepEqual(nodes(pair[0]),nodes(pair[1]));
for(const d of pair){
for(let m=1;m<=6;m++)assert(d.components.some(n=>n.label.startsWith(`Month ${m}:`)));
const legend=d.components.find(n=>n.id==='reference');
assert(legend.sublabel.includes('Month 6 → 2:'));assert(legend.sublabel.includes('Month 5 → 1:'));
assert(legend.sublabel.includes('not company commitments'));
}
});
test('first-revision recovery and diagram decisions cannot disappear',()=>{
for(const id of ['skills-quality','skills-governance','skills-maintenance']){
const text=read(`docs/strategy/${id}.mdx`);
for(const term of ['N/A','pinned clean','current'])assert(text.includes(term),id);
}
for(const s of ['','-mobile']){
const g=JSON.parse(read(`diagrams/strategy-governance${s}.architecture.json`));
assert(g.components.find(n=>n.id==='canary').sublabel.includes('pilot'));
assert(g.components.find(n=>n.id==='approve').sublabel.includes('approve / hold'));
const a=JSON.parse(read(`diagrams/strategy-adoption${s}.architecture.json`));
assert(a.components.find(n=>n.id==='expand').sublabel.includes('Retain / improve / hold / stop'));
}
const mobile=JSON.parse(read('diagrams/strategy-maintenance-mobile.architecture.json'));
const order=[...mobile.components].sort((a,b)=>a.pos[1]-b.pos[1]).map(n=>n.id);
assert.deepEqual(order.slice(0,2),['observe','triage']);
});
test('target caption is inside SVG, expands canvas and fails closed',()=>{
const svg='<svg role="img" viewBox="0 0 1200 1000"><g data-node-id="agent"/></svg>';
const out=targetCaption(svg);
for(const term of ['Proposed optional target','Solid: lifecycle','Dotted: execution','Dashed: human-controlled'])assert(out.includes(term));
assert(out.includes('viewBox="0 0 1200 1130"'));
assert(out.indexOf('eldorado-target-caption')<out.indexOf('</svg>'));
assert.equal((out.match(/data-node-id=/g)||[]).length,1);
assert.throws(()=>targetCaption('<svg/>'));
});
+8
View File
@@ -0,0 +1,8 @@
const {chromium}=require('playwright');
const fs=require('node:fs');const assert=require('node:assert/strict');
(async()=>{
const base=process.argv[2]||'http://127.0.0.1:4173';const out=`.cache/journey-${process.argv[3]||'candidate'}`;fs.mkdirSync(out,{recursive:true});
const b=await chromium.launch({executablePath:process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE,args:['--no-sandbox']});const results=[];
const steps=[['target-operating-model','roadmap'],['roadmap','stage-01-skills-adoption'],['stage-01-skills-adoption','baseline'],['baseline','measurement'],['measurement','skills-quality'],['skills-quality','skills-governance'],['skills-governance','skills-quality'],['skills-quality','skills-adoption'],['skills-adoption','skills-maintenance'],['skills-maintenance','skills-quality'],['skills-quality','measurement/validated-task-success'],['measurement/validated-task-success','skills-quality'],['skills-maintenance','stage-02-autonomous-agent'],['stage-02-autonomous-agent','stage-01-skills-adoption']];
try{for(const width of [1440,390]){const p=await b.newPage({viewport:{width,height:900}});for(const [from,to]of steps){await p.goto(`${base}/eldorado-v1/documentation/strategy/${from}/`,{waitUntil:'networkidle'});const href=`/eldorado-v1/documentation/strategy/${to}/`;const link=p.locator(`article a[href="${href}"]`).filter({visible:true}).first();assert(await link.count(),`${from} → ${to}`);await link.scrollIntoViewIfNeeded();await p.waitForLoadState('networkidle');await link.click();await p.waitForURL(`${base}${href}`);await p.locator('article h1').waitFor();results.push({width,from,to,clicked:true});fs.writeFileSync(`${out}/results.json`,JSON.stringify(results,null,2))}await p.close()}console.log(`PASS ${results.length} real reader handoffs and feedback links`)}finally{await b.close()}
})().catch(e=>{console.error(e);process.exitCode=1});
+25 -13
View File
@@ -12,10 +12,19 @@ const fs = require('node:fs');
const context = await browser.newContext({viewport: {width, height: 1000}, colorScheme: 'light'});
const page = await context.newPage();
await page.goto(`${base}/eldorado-v1/documentation/strategy/`, {waitUntil: 'networkidle'});
const panel = page.locator('.archify-panel--story');
await page.addStyleTag({content:'html {scroll-behavior:auto !important;}'});
await page.getByText('Conditional long-term Target operating model — not the six-month promise',{exact:true}).focus();
await page.keyboard.press('Enter');
const panel = page.locator('.archify-panel--story[data-diagram="strategy-target"]');
const iframe = panel.locator(width > 700 ? '.story-desktop' : '.story-mobile');
await iframe.scrollIntoViewIfNeeded();
const frame = await (await iframe.elementHandle()).contentFrame();
const showControls = () => iframe.evaluate(n => {
scrollTo({top:n.getBoundingClientRect().top+scrollY-120,behavior:'instant'});
return new Promise(resolve=>requestAnimationFrame(()=>requestAnimationFrame(resolve)));
});
await showControls();
const activate = async selector => {await frame.locator(selector).focus(); await page.keyboard.press('Enter');};
const theme = async value => {
await page.waitForFunction(t => document.documentElement.dataset.theme === t, value);
await frame.waitForFunction(t => document.documentElement.dataset.theme === t, value);
@@ -41,9 +50,9 @@ const fs = require('node:fs');
assert(menu.y + menu.height <= viewport.y + viewport.height + 1, `${selector} clips vertically`);
};
const light = await frame.locator('body').evaluate(n => getComputedStyle(n).backgroundColor);
await frame.locator('#btn-theme').click(); await theme('dark');
await activate('#btn-theme'); await theme('dark');
assert.notEqual(await frame.locator('body').evaluate(n => getComputedStyle(n).backgroundColor), light);
await frame.locator('#btn-theme').click(); await theme('light');
await activate('#btn-theme'); await theme('light');
// Mobile portal theme control lives in the navigation drawer.
const portalTheme = async target => {
if (width <= 700) await page.getByRole('button', {name: 'Toggle navigation bar'}).click();
@@ -52,33 +61,34 @@ const fs = require('node:fs');
if (await page.locator('html').getAttribute('data-theme') === target) break;
}
if (width <= 700) await page.getByRole('button', {name: 'Close navigation bar'}).click();
await showControls();
};
await portalTheme('dark'); await theme('dark');
await portalTheme('light'); await theme('light');
for (const preset of ['signal-flow', 'blueprint', 'editorial', 'classic']) {
await frame.locator('#btn-preset').click();
await activate('#btn-preset');
await checkMenu('.preset-menu');
await frame.locator(`[data-preset-value="${preset}"]`).click();
await activate(`[data-preset-value="${preset}"]`);
assert.equal(await frame.locator('html').getAttribute('data-preset'), preset);
}
// A theme change must not reload the iframe or lose the selected visual preset.
await frame.locator('#btn-preset').click();
await frame.locator('[data-preset-value="blueprint"]').click();
await activate('#btn-preset');
await activate('[data-preset-value="blueprint"]');
await portalTheme('dark'); await theme('dark');
assert.equal(await frame.locator('html').getAttribute('data-preset'), 'blueprint');
const exports = [];
for (const format of ['png', 'jpeg', 'webp', 'svg', 'svg-light', 'svg-dark', 'webm']) {
await frame.locator('#btn-export').click();
await activate('#btn-export');
await checkMenu('.export-menu');
if (format === 'webm' && await frame.locator('[data-format="webm"]').isDisabled()) {
exports.push({format, unsupported: true});
await frame.locator('#btn-export').click();
await activate('#btn-export');
continue;
}
console.log(`Export ${width} ${format}`);
const [download] = await Promise.all([
page.waitForEvent('download', {timeout: 60000}),
frame.locator(`[data-format="${format}"]`).click(),
activate(`[data-format="${format}"]`),
]);
assert.equal(await download.failure(), null);
const path = `${output}/${width}-${format}-${download.suggestedFilename()}`;
@@ -123,14 +133,16 @@ const fs = require('node:fs');
await page.evaluate(() => scrollTo({top: 0, behavior: 'instant'}));
await page.evaluate(() => new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))));
await page.screenshot({path:`${output}/${width}.png`, fullPage:true});
await frame.locator('#btn-theme').click(); await theme('dark');
await frame.locator('#btn-theme').focus(); await page.keyboard.press('Enter'); await theme('dark');
// Exercise keyboard navigation without racing the portal's smooth scroll.
await page.locator('.strategy-content a[href$="/strategy/roadmap/"]').filter({visible:true}).focus();
await page.locator('.strategy-content a[href$="/strategy/roadmap/"]').filter({visible:true}).first().focus();
await page.keyboard.press('Enter');
await page.waitForURL('**/strategy/roadmap/');
await page.goBack({waitUntil:'domcontentloaded'});
await page.waitForURL('**/strategy/target-operating-model/');
await page.getByRole('heading', {name:'Target operating model', exact:true, level:1}).waitFor();
await page.getByRole('heading', {name:'First six months as AI Architect', exact:true, level:1}).waitFor();
await page.getByText('Conditional long-term Target operating model — not the six-month promise',{exact:true}).focus();
await page.keyboard.press('Enter');
const next = page.locator(`.archify-panel--story[data-diagram="strategy-target"] > .story-${width > 700 ? 'desktop' : 'mobile'}`);
await next.scrollIntoViewIfNeeded();
await (await (await next.elementHandle()).contentFrame()).waitForFunction(() => document.documentElement.dataset.theme === 'dark');
+4 -2
View File
@@ -26,7 +26,7 @@ const views = {
const ids=views[name];
geometry.cards.sort((a,b)=>ids.indexOf(a.id)-ids.indexOf(b.id));
assert.deepEqual(geometry.cards.map(n => n.id), ids);
assert.deepEqual(geometry.cards.map(n => n.number), ids.length === 6 ? ids.map((_,i)=>`Step ${i+1}`) : name === 'strategy-roadmap' ? ['Stage 1','Stage 2'] : ['First','Then']);
assert.deepEqual(geometry.cards.map(n => n.number), ids.length === 6 ? ids.map((_,i)=>`Step ${i+1}`) : name === 'strategy-roadmap' ? ['Proposed M1–4','Proposed M5–6'] : ['First','If justified']);
assert.equal(geometry.edges.length,ids.length===6?6:1);
if(ids.length===6) assert(geometry.edges.some(e=>e.id==='repeat'));
for(const edge of geometry.edges) assert(edge.box.left>=0 && edge.box.right<=geometry.width+1 && edge.box.top>=0 && edge.box.bottom<=geometry.height+1, `clipped edge ${name} ${edge.id}`);
@@ -60,7 +60,9 @@ const views = {
for(const theme of ['light','dark']) {
const frameTop=await iframe.evaluate(n=>n.getBoundingClientRect().top+scrollY);
await page.evaluate(y=>scrollTo({top:y-120,behavior:'instant'}),frameTop);
if(await frame.locator('html').getAttribute('data-theme')!==theme) await frame.locator('#btn-theme').click();
if(await frame.locator('html').getAttribute('data-theme')!==theme) {
await frame.locator('#btn-theme').focus(); await page.keyboard.press('Enter');
}
await page.waitForFunction(t=>document.documentElement.dataset.theme===t,theme);
const inline=await inspect(frame,name,width<1100);
await frame.locator('#btn-preset').focus();await page.keyboard.press('Enter');
+3 -3
View File
@@ -61,14 +61,14 @@ const fs = require('node:fs');
assert.equal(response.status(), 200);
assert.equal(await page.locator('h1').innerText(), 'Roadmap');
const headings = page.locator('.strategy-content > h2');
assert.deepEqual((await headings.allTextContents()).map(s => s.replace(/\u200b/g, '')), ['Two stages toward Target','Stage 1: Delivery first','Improve within each phase','Delivery in practice']);
assert.deepEqual((await headings.allTextContents()).map(s => s.replace(/\u200b/g, '')), ['Six months, two investment decisions','Delivery first, replication only if earned','Keep one learning loop','Solo capacity and influence']);
const text = await page.locator('.strategy-content').innerText();
for (const marker of ['Humans direct, guide and review throughout', 'Delivery keeps improving', 'system-logic source', 'baseline', 'Target operating model']) assert(text.includes(marker), marker);
assert(!text.includes('Supporting gate evidence and hold conditions\n\nThese are'));
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()).slice(0,2), ['Target','Roadmap']);
assert.deepEqual((await menu.allTextContents()).slice(0,2), ['Six-month strategy','Roadmap']);
if (width < 700) await page.getByRole('button', {name:'Close navigation bar'}).click();
const panel = page.locator('.archify-panel--story').first();
const iframe = panel.locator(width > 700 ? '.story-desktop' : '.story-mobile');
@@ -125,7 +125,7 @@ const fs = require('node:fs');
const [download] = await Promise.all([page.waitForEvent('download'), frame.locator('[data-format="svg"]').click()]);
assert.equal(await download.failure(), null);
await download.saveAs(`${output}/${width}.svg`);
assert(fs.readFileSync(`${output}/${width}.svg`, 'utf8').includes('Adopt skills'));
assert(fs.readFileSync(`${output}/${width}.svg`, 'utf8').includes('Learn and test'));
assert(fs.readFileSync(`${output}/${width}.svg`, 'utf8').includes('eldorado-roadmap-typography'));
for (const id of ['skills','autonomy']) {
await frame.locator(`svg[role="img"] [data-node-id="${id}"]`).screenshot({path:`${output}/${width}-${id}-card.png`});
+8 -5
View File
@@ -23,17 +23,19 @@ const fs = require('node:fs');
if (width < 700) await page.getByRole('button', {name:'Toggle navigation bar'}).click();
const menu = page.locator('.theme-doc-sidebar-menu .menu__link').filter({visible:true});
await menu.first().waitFor({state:'visible'});
assert.deepEqual(await menu.allTextContents(), ['Target', 'Roadmap', 'Stage - 01 - Skills Adoption', 'Stage - 02 - Autonomous Agent']);
assert.deepEqual(await menu.allTextContents(), ['Six-month strategy', 'Roadmap', 'One bounded experiment', 'Beyond six months']);
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);
assert.equal(await menu.filter({hasText:/^Six-month strategy$/}).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'}`);
await page.getByText('Conditional long-term Target operating model — not the six-month promise',{exact:true}).focus();
await page.keyboard.press('Enter');
const iframe = page.locator(`[data-diagram="strategy-target"] > .story-${width > 700 ? 'desktop' : 'mobile'}`);
await iframe.scrollIntoViewIfNeeded();
const frame = await (await iframe.elementHandle()).contentFrame();
await frame.locator('svg[role="img"]').waitFor();
@@ -77,8 +79,9 @@ const fs = require('node:fs');
}
assert(metrics.labels.every(n=>n.px>=14), JSON.stringify(metrics.labels));
assert.deepEqual(metrics.overflow, []);
await frame.locator('#btn-export').click();
const [download] = await Promise.all([page.waitForEvent('download'), frame.locator('[data-format="svg"]').click()]);
await frame.locator('#btn-export').focus(); await page.keyboard.press('Enter');
await frame.locator('[data-format="svg"]').focus();
const [download] = await Promise.all([page.waitForEvent('download'), page.keyboard.press('Enter')]);
assert.equal(await download.failure(), null);
const exportPath = `${output}/${width}-${route ? 'target' : 'landing'}.svg`;
await download.saveAs(exportPath);
+1 -1
View File
@@ -46,7 +46,7 @@ const fs = require('node:fs');
await page.waitForURL(`${base}/eldorado-v1/documentation/strategy/measurement/supported-bundle-coverage/`);
await page.getByRole('heading', {level:1, name:'Supported bundle coverage', exact:true}).waitFor();
assert((await page.locator('article').innerText()).includes('Supported bundle coverage'));
assert.equal(await page.locator('.breadcrumbs a').filter({hasText:'Stage - 01 - Skills Adoption'}).getAttribute('href'), '/eldorado-v1/documentation/strategy/stage-01-skills-adoption/');
assert.equal(await page.locator('.breadcrumbs a').filter({hasText:'One bounded experiment'}).getAttribute('href'), '/eldorado-v1/documentation/strategy/stage-01-skills-adoption/');
assert((await page.locator('.breadcrumbs').innerText()).includes('Measurement'));
await open();
await menu.getByRole('link', {name:'Supported bundle coverage', exact:true}).waitFor({state:'visible'});
+8 -2
View File
@@ -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 ['measurement','baseline','governance','quality','adoption','maintenance']) for(const width of [1440,1024,390,320]){
for(const topic of ['measurement','baseline','governance','quality','adoption','maintenance','stage01','stage02']) 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`));
@@ -20,17 +20,23 @@ const assert=require('node:assert/strict');
// text presence alone cannot detect one label hiding another.
const labels=[...svg.querySelectorAll('g[data-edge-id]')].filter(el=>el.querySelector('text')).map(el=>({id:el.dataset.edgeId,box:el.getBoundingClientRect()}));
const labelOverlaps=[];
const nodes=[...svg.querySelectorAll('[data-node-id]')].map(el=>({id:el.dataset.nodeId,box:el.getBoundingClientRect()}));
const labelNodeOverlaps=[];
for(const a of labels)for(const b of nodes){
if(Math.min(a.box.right,b.box.right)>Math.max(a.box.left,b.box.left)&&Math.min(a.box.bottom,b.box.bottom)>Math.max(a.box.top,b.box.top))labelNodeOverlaps.push([a.id,b.id]);
}
for(let i=0;i<labels.length;i++)for(let j=i+1;j<labels.length;j++){
const a=labels[i],b=labels[j];
if(Math.min(a.box.right,b.box.right)>Math.max(a.box.left,b.box.left)&&Math.min(a.box.bottom,b.box.bottom)>Math.max(a.box.top,b.box.top))labelOverlaps.push([a.id,b.id]);
}
return {labelOverlaps,viewBox:[v.width,v.height],nodes:[...svg.querySelectorAll('[data-node-id]')].map(n=>n.dataset.nodeId),edges:[...svg.querySelectorAll('path[data-edge-id]')].map(n=>n.dataset.edgeId),text:svg.textContent,issues};
return {labelOverlaps,labelNodeOverlaps,viewBox:[v.width,v.height],nodes:[...svg.querySelectorAll('[data-node-id]')].map(n=>n.dataset.nodeId),edges:[...svg.querySelectorAll('path[data-edge-id]')].map(n=>n.dataset.edgeId),text:svg.textContent,issues};
});
assert.deepEqual(measured.viewBox,spec.meta.viewBox);
assert.deepEqual(measured.nodes.sort(),spec.components.map(n=>n.id).sort());
assert.deepEqual(measured.edges.sort(),spec.connections.map(e=>e.id).sort());
assert.deepEqual(measured.issues,[]);
assert.deepEqual(measured.labelOverlaps,[],`${topic}-${width}: rendered edge labels overlap`);
assert.deepEqual(measured.labelNodeOverlaps,[],`${topic}-${width}: edge label obscures a node`);
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){
+35 -7
View File
@@ -15,15 +15,20 @@ const fs = require('node:fs');
page.on('pageerror', error => errors.push(error.message));
const response = await page.goto(`${base}/eldorado-v1/documentation/strategy/measurement/`, {waitUntil:'networkidle'});
assert.equal(response.status(), 200);
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('h1').innerText(), 'Measuring real output');
assert((await page.title()).startsWith('Measuring real output |'));
assert.equal(await page.locator('.strategy-content details').count(), 1);
assert.equal(await page.locator('.strategy-content details[open]').count(), 0);
assert((await page.locator('.strategy-content details summary').innerText()).includes('Implementation status'));
assert.equal(await page.locator('.strategy-content h2').count(), 2);
assert.deepEqual((await page.locator('.strategy-content h3').allTextContents()).map(text => text.replaceAll('\u200b', '')), ['Workflow effectiveness', 'Skills effectiveness & health']);
assert.equal(await page.locator('.strategy-content ol').count(), 2);
assert.equal(await page.locator('.strategy-content ol > li').count(), 16);
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','Measurement',...metrics.map(m => m.title),'Collection and safeguards','Run the synthetic measurement example','Baseline','Governance','Quality','Adoption','Maintenance','Stage - 02 - Autonomous Agent']);
assert.deepEqual(await menu.allTextContents(), ['Six-month strategy','Roadmap','One bounded experiment','Measurement',...metrics.map(m => m.title),'Collection and safeguards','Run the synthetic measurement example','Baseline','Governance','Quality','Adoption','Maintenance','Beyond six months']);
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');
@@ -41,7 +46,7 @@ const fs = require('node:fs');
await page.waitForFunction(() => document.documentElement.dataset.theme === 'dark');
await frame.locator('#btn-theme').click();
await page.waitForFunction(() => document.documentElement.dataset.theme === 'light');
for (const preset of ['blueprint','classic']) {
for (const preset of ['signal-flow','blueprint','editorial','classic']) {
await frame.locator('#btn-preset').click();
await frame.locator(`[data-preset-value="${preset}"]`).click();
assert.equal(await frame.locator('html').getAttribute('data-preset'), preset);
@@ -51,7 +56,30 @@ 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('Available choices') && svg.includes('No mandatory collection'));
assert(svg.includes('Workflow effectiveness') && svg.includes('Skills effectiveness &amp; health') && svg.includes('No mandatory collection'));
const exports = ['svg'];
for (const format of ['png','jpeg','webp','svg-light','svg-dark','webm']) {
await frame.locator('#btn-export').click();
const option = frame.locator(`[data-format="${format}"]`);
if (await option.isDisabled()) { exports.push(`${format}:unsupported`); await frame.locator('#btn-export').click(); continue; }
const [file] = await Promise.all([page.waitForEvent('download', {timeout:60000}), option.click()]);
assert.equal(await file.failure(), null);
const target = `${output}/${width}-${format}-${file.suggestedFilename()}`;
await file.saveAs(target);
const bytes = fs.readFileSync(target); assert(bytes.length > 1000);
if (format.startsWith('svg')) assert(bytes.toString().includes('eldorado-skills-typography'));
else {
const mime = {png:'image/png', jpeg:'image/jpeg', webp:'image/webp', webm:'video/webm'}[format];
const dimensions = await page.evaluate(async ({mime,data}) => {
const media = document.createElement(mime.startsWith('video') ? 'video' : 'img');
const ready = new Promise((resolve,reject) => {media[mime.startsWith('video') ? 'onloadedmetadata' : 'onload'] = resolve; media.onerror = reject;});
media.src = `data:${mime};base64,${data}`; await ready;
return [media.videoWidth || media.naturalWidth, media.videoHeight || media.naturalHeight];
}, {mime, data:bytes.toString('base64')});
assert(dimensions.every(n => n > 0));
}
exports.push(format);
}
const opener = panel.getByRole('button', {name:/^Expand /});
await opener.click();
const close = panel.getByRole('button', {name:'Close full-screen diagram', exact:true});
@@ -76,7 +104,7 @@ const fs = require('node:fs');
assert.equal(new Set(links.map(h => new URL(h).pathname)).size, 18);
assert(!await page.evaluate(() => document.documentElement.scrollWidth > innerWidth));
assert.deepEqual(errors, []);
results.push({width, geometry, links:links.length, title:true, sidebar:true, controls:true, export:true, reference:true});
results.push({width, geometry, links:links.length, title:true, sidebar:true, controls:true, exports, reference:true});
fs.writeFileSync(`${output}/results.json`, JSON.stringify(results,null,2));
await context.close();
}
+4 -2
View File
@@ -6,10 +6,10 @@ 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 ['measurement','baseline','governance','quality','adoption','maintenance']) for(const width of [1440,1024,390,320]) {
for(const topic of ['six-months','measurement','baseline','governance','quality','adoption','maintenance','stage01','stage02']) 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=['measurement','baseline'].includes(topic)?topic:`skills-${topic}`;
const route=topic==='six-months'?'target-operating-model':topic==='stage01'?'stage-01-skills-adoption':topic==='stage02'?'stage-02-autonomous-agent':['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();
@@ -40,6 +40,8 @@ const assert=require('node:assert/strict');
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();
await expanded.waitForFunction(t=>document.documentElement.dataset.theme===t,theme);
await panel.locator('dialog').evaluate(n=>n.scrollTop=0);
assert((await expanded.url()).includes(width<=1100?`${topic}-mobile/`:`${topic}/`));
await page.screenshot({path:`${out}/${topic}-${width}-${theme}-fullscreen.png`});
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});}
+19 -10
View File
@@ -6,14 +6,14 @@ const fs = require('node:fs');
const output = `.cache/strategy-navigation-${process.argv[3] || 'local'}`;
fs.mkdirSync(output, {recursive:true});
const prefix = '/eldorado-v1/documentation/strategy/';
const first = 'Stage - 01 - Skills Adoption';
const second = 'Stage - 02 - Autonomous Agent';
const first = 'One bounded experiment';
const second = 'Beyond six months';
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','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 titles = ['First six months as AI Architect','Roadmap',first,'Measuring real output',...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 {
@@ -35,24 +35,24 @@ const fs = require('node:fs');
assert.equal((await page.goto(`${base}${prefix}roadmap/`, {waitUntil:'networkidle'})).status(), 200);
let menu = await openMenu();
const visibleLabels = () => menu.locator('.menu__link').filter({visible:true}).allTextContents();
assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,second]);
assert.deepEqual(await visibleLabels(), ['Six-month strategy','Roadmap',first,second]);
const category = menu.locator('.theme-doc-sidebar-item-category').filter({has:page.getByRole('link', {name:first, exact:true})});
const caret = category.locator(':scope > .menu__list-item-collapsible > button.menu__caret');
await caret.click();
await category.getByRole('link', {name:'Governance', exact:true}).waitFor({state:'visible'});
assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,...topics,second]);
assert.deepEqual(await visibleLabels(), ['Six-month strategy','Roadmap',first,...topics,second]);
assert.deepEqual(await category.locator('ul .menu__link').filter({visible:true}).allTextContents(), topics);
const measurement = category.locator('.theme-doc-sidebar-item-category').filter({has:page.getByRole('link', {name:'Measurement', exact:true})});
const reference = measurement.locator(':scope > .menu__list-item-collapsible > button.menu__caret');
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[0],...childTitles,...topics.slice(1),second]);
assert.deepEqual(await visibleLabels(), ['Six-month strategy','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();
await category.getByRole('link', {name:'Governance', exact:true}).waitFor({state:'hidden'});
assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,second]);
assert.deepEqual(await visibleLabels(), ['Six-month strategy','Roadmap',first,second]);
await menu.getByRole('link', {name:first, exact:true}).click();
await page.waitForURL(`${base}${prefix}stage-01-skills-adoption/`);
await page.getByRole('heading', {level:1, name:first, exact:true}).waitFor();
@@ -64,8 +64,7 @@ const fs = require('node:fs');
assert.equal((await page.goto(`${base}${prefix}${id}/`, {waitUntil:'networkidle'})).status(), 200);
assert.equal(new URL(page.url()).pathname, `${prefix}${id}/`);
// Target has a longer canonical page heading but keeps its short navigation label.
if (index) assert.equal(await page.locator('h1').innerText(), titles[index]);
else assert((await page.locator('h1').innerText()).includes('Target'));
assert.equal(await page.locator('h1').innerText(), titles[index]);
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}${id === 'baseline' ? 'measurement' : ids[index-1]}/`);
@@ -76,11 +75,21 @@ const fs = require('node:fs');
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[0],...childTitles,...topics.slice(1)] : topics;
assert.deepEqual(await visibleLabels(), ['Target','Roadmap',first,...expectedTopics,second]);
assert.deepEqual(await visibleLabels(), ['Six-month strategy','Roadmap',first,...expectedTopics,second]);
if (id.startsWith('measurement/')) assert.equal(await page.locator('.breadcrumbs a').filter({hasText:'Measurement'}).getAttribute('href'), `${prefix}measurement/`);
await closeMenu();
}
assert(!await page.evaluate(() => document.documentElement.scrollWidth > innerWidth), `${width}: overflow on ${id}`);
if(width===1440 || width===390) {
// Full-page capture does not trigger below-fold lazy iframes.
for(const iframe of await page.locator('.archify-panel--story > iframe').filter({visible:true}).all()) {
await iframe.scrollIntoViewIfNeeded();
const frame=await (await iframe.elementHandle()).contentFrame();
await frame.locator('.diagram-container > svg').waitFor();
}
await page.evaluate(()=>scrollTo({top:0,behavior:'instant'}));
await page.screenshot({path:`${output}/${width}-${id.replaceAll('/','-')}.png`,fullPage:true,animations:'disabled'});
}
}
assert((await page.locator('article').innerText()).includes('not deployed autonomy'));
await page.screenshot({path:`${output}/${width}-stage-02.png`, fullPage:true, animations:'disabled'});
+2 -2
View File
@@ -24,7 +24,7 @@ const fs=require('node:fs');
assert.equal(geometry.nodes.length,(source.components||source.nodes).length,id);
for(const n of geometry.nodes) assert(n.x>=0 && n.y>=0 && n.right<=geometry.width+1 && n.bottom<=geometry.height+1,`${id} ${width} clipped ${JSON.stringify(n)} / ${geometry.height}`);
const data=await page.locator('.strategy-content').evaluate(el=>({words:el.innerText.trim().split(/\s+/).length,overflow:document.documentElement.scrollWidth>innerWidth,openDetails:el.querySelectorAll('details[open]').length}));
assert(data.words<=(id==='measurement'?1500:id==='roadmap'?600:200),id);assert(!data.overflow,id);assert.equal(data.openDetails,0,id);
assert(data.words<=(id==='measurement'?1900:id==='roadmap'?1150:['index','target-operating-model'].includes(id)?850:750),id);assert(!data.overflow,id);assert.equal(data.openDetails,0,id);
await page.evaluate(()=>scrollTo({top:0,behavior:'instant'}));await page.screenshot({path:`.cache/story-${label}/${width}-${id}.png`,fullPage:true});
const opener=panel.getByRole('button',{name:/^Expand /});await opener.click();
const close=panel.getByRole('button',{name:'Close full-screen diagram',exact:true});await close.waitFor({state:'visible'});
@@ -35,7 +35,7 @@ const fs=require('node:fs');
// Native close clears open before the queued React onClose restores focus.
// Wait for its unmount before focusing the next keyboard interaction target.
await panel.locator('dialog iframe').waitFor({state:'detached'});assert(await opener.evaluate(n=>n===document.activeElement));
if(id !== 'measurement') {
if(await page.locator('.strategy-content > details > summary').count()) {
const summary=page.locator('.strategy-content > details > summary').first();
await summary.focus();await page.keyboard.press('Enter');
await page.waitForFunction(()=>document.querySelector('.strategy-content > details').open);
+12 -4
View File
@@ -131,6 +131,9 @@ function inspectTypography({mobile}) {
for (const width of [1440,390,320]) {
const page = await browser.newPage({viewport:{width,height:1000}});
await page.goto(`${base}/eldorado-v1/documentation/strategy/target-operating-model/`,{waitUntil:'networkidle'});
await page.addStyleTag({content:'html {scroll-behavior:auto !important;}'});
await page.getByText('Conditional long-term Target operating model — not the six-month promise',{exact:true}).focus();
await page.keyboard.press('Enter');
const panel = page.locator('[data-diagram="strategy-target"]');
const iframe = panel.locator(`:scope > .story-${width > 700 ? 'desktop' : 'mobile'}`);
await iframe.scrollIntoViewIfNeeded();
@@ -141,10 +144,11 @@ function inspectTypography({mobile}) {
await page.screenshot({path:`${output}/${width}-inline.png`,fullPage:true});
const exported = [];
for (const theme of ['light','dark']) {
if (await frame.locator('html').getAttribute('data-theme') !== theme) await frame.locator('#btn-theme').click();
if (await frame.locator('html').getAttribute('data-theme') !== theme) {await frame.locator('#btn-theme').focus(); await page.keyboard.press('Enter');}
await frame.waitForFunction(t => document.documentElement.dataset.theme === t, theme);
await frame.locator('#btn-export').click();
const [download] = await Promise.all([page.waitForEvent('download'),frame.locator('[data-format="svg"]').click()]);
await frame.locator('#btn-export').focus(); await page.keyboard.press('Enter');
await frame.locator('[data-format="svg"]').focus();
const [download] = await Promise.all([page.waitForEvent('download'),page.keyboard.press('Enter')]);
assert.equal(await download.failure(),null);
const path = `${output}/${width}-${theme}.svg`;
await download.saveAs(path);
@@ -157,6 +161,10 @@ function inspectTypography({mobile}) {
const typography = await standalone.evaluate(inspectTypography,{mobile:width < 700});
assert.deepEqual(geometry.errors,[]);
assert.deepEqual(typography.errors,[]);
assert(await standalone.locator('#eldorado-target-caption').evaluate(g=>{
const v=g.ownerSVGElement.viewBox.baseVal;
return [...g.querySelectorAll('text')].every(t=>{const b=t.getBBox();return b.x>=v.x&&b.y>=v.y&&b.x+b.width<=v.x+v.width&&b.y+b.height<=v.y+v.height;});
}), 'Standalone proposed caption must fit the complete canvas');
const background = await standalone.locator('rect.c-bg-rect').evaluate(n => getComputedStyle(n).fill);
if (exported.length) assert.notEqual(background,exported[0].background,'standalone theme must change');
// CDP captures SVG documents without Playwright's HTML-body screenshot wait.
@@ -167,7 +175,7 @@ function inspectTypography({mobile}) {
exported.push({theme,background,geometry,typography});
await standalone.close();
}
await panel.getByRole('button',{name:/^Expand /}).click();
await panel.getByRole('button',{name:/^Expand /}).focus(); await page.keyboard.press('Enter');
const full = await (await panel.locator('dialog iframe').elementHandle()).contentFrame();
await full.locator('svg[role="img"]').waitFor();
// The existing fullscreen viewer always opens the radial desktop source.
+2
View File
@@ -4,6 +4,7 @@ import {execFileSync} from 'node:child_process';
import {skillsViewer, isSkillsStory} from './skills-viewer.mjs';
import {roadmapViewer} from './roadmap-viewer.mjs';
import {targetRouting} from './target-routing.mjs';
import {targetCaption} from './target-caption.mjs';
import {createHash} from 'node:crypto';
const cli = 'vendor/archify/bin/archify.mjs';
const types = new Set(['architecture','workflow','sequence','dataflow','lifecycle']);
@@ -43,6 +44,7 @@ for (const file of readdirSync('diagrams').sort()) {
// Verify the upstream artifact first, then add the scoped portal integration.
let viewer = readFileSync(output, 'utf8');
if (name === 'strategy-target') viewer = targetRouting(viewer);
if (/^strategy-target(-mobile)?$/.test(name)) viewer = targetCaption(viewer);
// Upstream intentionally disables preset selection in gallery embeds. Enable
// only those two guards; fail closed if a future vendor update changes them.
const start = viewer.indexOf('Archify.preset = (function () {');
+58
View File
@@ -0,0 +1,58 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {readFileSync,readdirSync} from 'node:fs';
import {createHash} from 'node:crypto';
const read=p=>readFileSync(p,'utf8');
const coverage=JSON.parse(read('research/ai-adoption/strategy-coverage.json')).routes;
test('connected Strategy covers every canonical route and reader handoff',()=>{
const files=readdirSync('docs/strategy',{recursive:true}).filter(p=>p.endsWith('.mdx')).map(p=>'docs/strategy/'+p).sort();
assert.equal(coverage.length,28);
assert.deepEqual(coverage.map(r=>r.source).sort(),files);
assert.equal(new Set(coverage.map(r=>r.route)).size,28);
for(const r of coverage){
for(const k of ['question','inputs','action_or_decision','output','next_or_feedback','review'])assert(r[k],`${r.source}: ${k}`);
const page=read(r.source);assert(!/roadmap gates|Evidence-gated phases/.test(page),r.source);
assert(coverage.some(n=>n.route===r.next_or_feedback),r.next_or_feedback);
if(r.contract_sha256){
const body=page.split('{/* contract:start */}\n')[1].split('\n{/* contract:end */}')[0];
assert.equal(createHash('sha256').update(body).digest('hex'),r.contract_sha256,r.source);
}
}
assert.equal(coverage.filter(r=>r.implementation==='prototype').length,9);
assert.equal(coverage.filter(r=>r.implementation==='unimplemented').length,7);
});
test('the parent journey connects qualification, pilot authority and feedback without automatic autonomy',()=>{
const parent=read('docs/strategy/stage-01-skills-adoption.mdx');
for(const marker of ['illustrative Delivery','independent Quality Engineering reviewer','baseline describes work; it grants no approval','not six rigid sequential approval gates','Governance bounds every activity','separate case for authority and readiness'])assert(parent.toLowerCase().includes(marker.toLowerCase()),marker);
const governance=read('docs/strategy/skills-governance.mdx');
for(const marker of ['experimental → bounded pilot','bounded pilot → approved','Initial experimental qualification runs only in approved disposable environments','Real work requires a separate bounded-pilot authorization'])assert(governance.includes(marker),marker);
assert(!governance.includes('| experimental → approved |'));
assert(read('docs/strategy/skills-adoption.mdx').includes('pilot decision alone is not general approval'));
const quality=read('docs/strategy/skills-quality.mdx');
for(const marker of ['Qualification artifact success is not live task success','planned executed trials','matured real-workflow starts','regression against the currently approved revision'])assert(quality.includes(marker),marker);
for(const id of ['measurement/index','skills-maintenance'])assert(read(`docs/strategy/${id}.mdx`).includes('skills-quality.mdx'));
const future=read('docs/strategy/stage-02-autonomous-agent.mdx');
for(const marker of ['separate authority decision','Unresolved release approval roles remain a hold condition','not deployed autonomy','stop/human-takeover','recorded hold'])assert(future.includes(marker),marker);
});
for(const stage of ['stage01','stage02'])test(`${stage}: native paired views preserve handoffs, decisions and containment`,()=>{
const pair=['','-mobile'].map(s=>JSON.parse(read(`diagrams/strategy-${stage}${s}.architecture.json`)));
const nodes=d=>d.components.map(({pos,size,...n})=>n);
const relationships=d=>d.connections.map(({id,from,to,variant})=>({id,from,to,variant}));
assert.deepEqual(nodes(pair[0]),nodes(pair[1]));
assert.deepEqual(relationships(pair[0]),relationships(pair[1]));
const expected=stage==='stage01'?[['baseline','engineer'],['engineer','qualify'],['qualify','pilot'],['pilot','decide'],['decide','maintain'],['maintain','engineer'],['decide','baseline']]:[['proven','case'],['case','decision'],['decision','execute'],['decision','hold'],['execute','stop'],['stop','hold']];
assert.deepEqual(pair[0].connections.map(e=>[e.from,e.to]).sort(),expected.sort());
const by=Object.fromEntries(pair[0].components.map(n=>[n.id,n]));
if(stage==='stage01'){
assert(by.qualify.sublabel.includes('Fail / incomplete: hold or rework'));
assert(by.reference.tag.includes('Throughout'));
assert(by.decide.sublabel.includes('Compare with baseline, not trials'));
}else{
assert(by.decision.sublabel.includes('Owning approver'));
assert(by.stop.sublabel.includes('Revoke mutations'));
assert(by.hold.sublabel.includes('No automatic progression'));
}
});
+4 -1
View File
@@ -36,7 +36,10 @@ test('each original metric survives exactly once on its own canonical Measuremen
const page = read(`docs/strategy/measurement/${part.slug}.mdx`);
const body = page.split('{/* preserved:start */}\n')[1]?.split('\n{/* preserved:end */}')[0];
// Only the cross-page navigation wording changes; hash all original substance.
const original = body.replace('Use the [metric definitions](./index.mdx#metric-definitions)', 'Use the metric contracts below');
const original = body.replace('Use the [metric definitions](./index.mdx#metric-definitions)', 'Use the metric contracts below')
// The old navigation named nonexistent roadmap gates. Restore only that
// historical sentence for the migration hash; metric substance stays exact.
.replace('Use these safeguards throughout the [Stage 01 journey](../stage-01-skills-adoption.mdx)', 'Introduction depends on the [roadmap gates](../roadmap.mdx)');
assert.equal(createHash('sha256').update(original).digest('hex'), part.sha256);
}
});
+1 -1
View File
@@ -30,7 +30,7 @@ export function roadmapViewer(html, spec) {
return `<text x="${x+24}" y="${y+top}" font-size="${size}" class="${cls}" ${attrs}>${lines.map((line,i) => `<tspan x="${x+24}" dy="${i ? 34 : 0}">${escape(line)}</tspan>`).join('')}</text>`;
};
if (!node.sublabel || node.tag || /Output:|Exit:|\n/.test(node.sublabel)) throw new Error(`Roadmap content contract drift: ${node.id}`);
const number = spec.nodes.length === 6 ? `Step ${index+1}` : spec.nodes[0].id === 'skills' ? `Stage ${index+1}` : index === 0 ? 'First' : 'Then';
const number = spec.nodes.length === 6 ? `Step ${index+1}` : spec.nodes[0].id === 'skills' ? ['Proposed M1–4','Proposed M5–6'][index] : index === 0 ? 'First' : 'If justified';
const content = text(number, 40, 26, 't-primary', 'data-stage-number="" font-weight="700"')
+ text(node.label, 88, 30, 't-primary', 'data-node-label="" font-weight="700"')
+ text(node.sublabel, 160, 26, 't-muted');
+2 -2
View File
@@ -12,8 +12,8 @@ test('Roadmap has three visual levels and preserves human direction and Delivery
const page = read('docs/strategy/roadmap.mdx');
const visible = page.split('<details>')[0];
assert.deepEqual([...visible.matchAll(/<ArchifyDiagram name="([^"]+)"/g)].map(m => m[1]), Object.keys(views));
assert.deepEqual([...visible.matchAll(/^## (.+)$/gm)].map(m => m[1]), ['Two stages toward Target', 'Stage 1: Delivery first', 'Improve within each phase', 'Delivery in practice']);
for (const marker of ['Humans direct, guide and review throughout', 'standardizes skills', 'foundation for Stage 2', 'future Autonomous Agent', 'not deployed autonomy', 'order is not yet decided', 'Delivery keeps improving', 'not as six global roadmap stages', 'what skills exist, how they relate, when they are used and how they work together', 'codebase structure', 'existing principles', 'system-logic source', 'tests', 'builds and packaging', 'deployments', 'practices, tooling, controls and problems', 'metrics/KPIs and a baseline', 'friction and feedback', './measurement/index.mdx', './target-operating-model.mdx']) assert(visible.includes(marker), marker);
assert.deepEqual([...visible.matchAll(/^## (.+)$/gm)].map(m => m[1]), ['Six months, two investment decisions', 'Delivery first, replication only if earned', 'Keep one learning loop', 'Solo capacity and influence']);
for (const marker of ['Humans direct, guide and review throughout', 'current', 'AI-assisted practice', 'One active live pilot at a time', 'Month 1', 'Month 2', 'Month 3', 'Month 4', 'Month 5', 'Month 6', 'Delivery keeps improving', 'what skills exist, how they relate, when they are used and how they work together', 'codebase structure', 'existing principles', 'system-logic source', 'tests', 'builds and packaging', 'deployments', 'retain/change/hold/stop', './measurement/index.mdx', './target-operating-model.mdx']) assert(visible.includes(marker), marker);
for (const marker of ['revocation','exact-artifact approvals','idempotency','human takeover','sensitive decisions','security findings','reproducible baseline']) assert(page.includes(marker), marker);
assert(!/## [1-5]\.|Prepare foundations|Sustain and improve/.test(page));
});
+8 -8
View File
@@ -4,19 +4,19 @@ import {readFileSync} from 'node:fs';
const read = p => readFileSync(p, 'utf8');
const stages = ['Scope', 'Architecture', 'UI/UX', 'Planning', 'Delivery', 'UAT', 'Security', 'Releases'];
test('Strategy opens at the canonical autonomous lifecycle', () => {
test('Strategy opens at the assignment and retains autonomy only as a conditional reference', () => {
assert.match(read('sidebars/strategy.ts'), /strategySidebar:\s*\[\s*'target-operating-model',\s*'roadmap'/);
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Target$/m);
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Six-month strategy$/m);
for (const id of ['target-operating-model']) {
const page = read(`docs/strategy/${id}.mdx`);
const primary = page.split('<details>')[0];
assert(primary.includes('name="strategy-target"'));
assert(primary.includes('autonomous agent'));
assert(primary.includes('direct, guide and review'));
assert(primary.includes('Scope → Architecture → UI/UX → Planning → Delivery → UAT → Security → Releases → Scope'));
assert(primary.includes('human-controlled AI Agent'));
assert(primary.includes('name="strategy-six-months"'));
assert(!primary.includes('name="strategy-target"'));
assert(page.includes('Conditional long-term Target operating model'));
assert(page.includes('Scope → Architecture → UI/UX → Planning → Delivery → UAT → Security → Releases → Scope'));
assert(page.includes('human-controlled AI Agent'));
assert(!/code[ -]agent/i.test(page));
assert(primary.includes('TO-BE'));
assert(primary.includes('Proposed strategy'));
assert(!/only routes|People authorize|independent gates protect release/.test(primary));
}
});
+32 -2
View File
@@ -6,11 +6,13 @@ const read = path => readFileSync(path, 'utf8');
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/);
assert.match(page, /title: Measuring real output\nsidebar_label: Measurement/);
for (const heading of ['Establish the baseline', 'Measure the pilot', 'Extend collection as adoption grows', 'Keep the collection running']) assert(!page.includes(heading), heading);
assert(page.includes('Registry inclusion does not require a metric to be used, collected or baselined'));
assert(page.includes('../baseline.mdx'));
assert(!page.includes('<details>'));
assert(page.includes('<summary>Implementation status—not live telemetry</summary>'));
const visible = page.replace(/<details>[\s\S]*?<\/details>/g, '');
assert.equal([...visible.matchAll(/^\d+\. \[/gm)].length,16,'All contract links remain visible');
assert(page.includes('./collection-and-safeguards.mdx'));
assert(!page.includes('Is AI-assisted work worth continuing?'));
for (const word of ['candidate', 'not installed', 'applicability', 'calculation', 'inputs', 'limitations', 'implementation status']) assert(page.includes(word), word);
@@ -28,6 +30,34 @@ test('all sixteen metric definitions remain in the reference with explicit imple
for (const text of ['9 prototype calculations', '7 unimplemented metrics', 'no network collectors', '30 days', '12 months', 'below five people', 'Missing telemetry is unknown']) assert(page.includes(text), text);
});
test('two groups exhaustively classify the sixteen canonical contracts without duplication', () => {
const page = read('docs/strategy/measurement/index.mdx');
const manifest = JSON.parse(read('research/ai-adoption/measurement-migration.json'));
assert.deepEqual([...page.matchAll(/^### (.+)$/gm)].map(m => m[1]), ['Workflow effectiveness', 'Skills effectiveness & health']);
const rows = [...page.matchAll(/^\d+\. \[([^\]]+)\]\(\.\/([^/]+)\.mdx\) — \*\*(Prototype calculation|Unimplemented metric)\.\*\*/gm)];
assert.equal(rows.length, 16);
assert.equal(new Set(rows.map(m => m[2])).size, 16);
assert.deepEqual(rows.map(m => m[1]).sort(), manifest.metrics.map(m => m.title).sort());
assert.equal(rows.filter(m => m[3] === 'Prototype calculation').length, 9);
assert.equal(rows.filter(m => m[3] === 'Unimplemented metric').length, 7);
const [workflow, skills] = page.split('### Workflow effectiveness')[1].split('### Skills effectiveness & health');
assert.equal([...workflow.matchAll(/^\d+\. /gm)].length, 11);
assert.equal([...skills.matchAll(/^\d+\. /gm)].length, 5);
for (const slug of ['validated-task-success', 'confirmed-policy-effects', 'cost-per-accepted-outcome', 'workflow-specific-business-acceptance']) assert(workflow.includes(`./${slug}.mdx`));
for (const slug of ['skill-selection-precision', 'skill-selection-recall', 'supported-bundle-coverage', 'approved-workflow-adoption', 'skills-within-substantive-review-window']) assert(skills.includes(`./${slug}.mdx`));
for (const marker of ['N/A, not zero', 'More adoption does not prove improved work', 'Before/after trends alone are not causal evidence', 'Sandbox/evaluation cases remain excluded']) assert(page.includes(marker), marker);
});
test('workflow task-success contract retains evaluation exclusions and explains conditional skill slices', () => {
const page = read('docs/strategy/measurement/validated-task-success.mdx');
assert.equal((page.match(/\| Expression \|/g) || []).length, 1);
for (const marker of ['sandbox/evaluation tasks', 'Overlapping skill slices must not be summed', 'remains excluded by this contract', 'does not introduce an implemented skill-evaluation metric', 'N/A, not a zero workflow success rate']) assert(page.includes(marker), marker);
for (const name of ['baseline', 'skills-adoption', 'skills-maintenance', 'stage-01-skills-adoption']) {
const text = read(`docs/strategy/${name}.mdx`);
if (name !== 'stage-01-skills-adoption') for (const group of ['Workflow effectiveness', 'Skills effectiveness & health']) assert(text.includes(group), name);
}
});
test('published pilot arithmetic matches the executable fixture, including partial cost', () => {
const page = read('docs/strategy/skills-adoption.mdx');
const fixture = JSON.parse(read('scripts/fixtures/ai-kpi-synthetic.json'));
+6 -6
View File
@@ -7,14 +7,14 @@ import {execFileSync} from 'node:child_process';
import {skillsViewer,isSkillsStory} from './skills-viewer.mjs';
const read = p => readFileSync(p,'utf8');
const topics = ['measurement','baseline','governance','quality','adoption','maintenance'];
test('all seven Skills Adoption pages account for six diagrams and twelve sources',()=>{
test('all seven Skills Adoption pages include their own native diagram story',()=>{
let count=0;
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(/<ArchifyDiagram name="([^"]+)"/g)];
assert.equal(diagrams.length,route.startsWith('stage-')?0:1);
assert.equal(diagrams.length,1);
for(const [,name] of diagrams){assert(isSkillsStory(name));for(const suffix of ['','-mobile'])JSON.parse(read(`diagrams/${name}${suffix}.architecture.json`));count++;}
}
assert.equal(count,6);assert(!isSkillsStory('strategy-target'));assert(!isSkillsStory('strategy-roadmap'));
assert.equal(count,7);assert(!isSkillsStory('strategy-target'));assert(!isSkillsStory('strategy-roadmap'));
});
for(const topic of topics) test(`${topic}: rich native source, wide desktop, mobile parity and checked adapter`,()=>{
const name=`strategy-${topic}`;const desktop=JSON.parse(read(`diagrams/${name}.architecture.json`));
@@ -41,9 +41,9 @@ test('domain contracts retain human authority, honest measures and Delivery-firs
const text=t=>JSON.stringify(JSON.parse(read(`diagrams/strategy-${t}.architecture.json`)));
assert(text('governance').includes('Author is not sole approver'));
assert(text('quality').includes('Critical effect blocks'));
assert(text('adoption').includes('Delivery first')&&text('adoption').includes('Later order undecided'));
assert(text('adoption').includes('Delivery first')&&text('adoption').includes('Retain / improve / hold / stop'));
assert(text('adoption').includes('No quotas or rankings'));
for(const marker of ['Available choices','16 candidate contracts','No mandatory collection','Meaning + applicability','9 prototype / 7 unimplemented'])assert(text('measurement').includes(marker),marker);
for(const marker of ['Workflow effectiveness','Skills effectiveness & health','Quality: artifact fitness + safety','No mandatory collection','Before / after is not causality','Candidate / approved regression'])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,7 +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 ['qualification','outcomes','experience','health']){has(m,'registry',id);has(m,id,'contract');}
const m=spec('measurement');for(const [x,y] of [['workflow','compare'],['compare','interpret'],['skills','observe'],['observe','improve'],['interpret','improve']])has(m,x,y);
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);
});
+4 -3
View File
@@ -1,9 +1,10 @@
// Native editable geometry and edges; scoped editorial typography for Stage 01.
export const isSkillsStory = name => /^strategy-(governance|quality|adoption|measurement|baseline|maintenance)(-mobile)?$/.test(name);
export const isSkillsStory = name => /^strategy-(governance|quality|adoption|measurement|baseline|maintenance|stage01|stage02|six-months)(-mobile)?$/.test(name);
const escape = text => text.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;');
export function skillsViewer(html, spec) {
if (spec.diagram_type !== 'architecture' || !spec.components.length) throw new Error('Skills story contract drift');
const detailSize = spec.meta.output.includes('-mobile/') ? 34 : 32;
const stageMobile = /strategy-(stage0[12]|six-months)-mobile\//.test(spec.meta.output);
const detailSize = stageMobile ? 38 : spec.meta.output.includes('-mobile/') ? 34 : 32;
for (const node of spec.components) {
const pattern = new RegExp(`<g\\b[^>]*data-node-id="${node.id}"[^>]*>[\\s\\S]*?<text data-node-label=[\\s\\S]*?</g>`);
const match = html.match(pattern);
@@ -16,7 +17,7 @@ export function skillsViewer(html, spec) {
if (!node.tag || !node.sublabel || lines.length > 4) throw new Error(`Skills copy exceeds capacity: ${node.id}`);
const text = (value, top, size, attrs) => `<text x="${x+28}" y="${y+top}" font-size="${size}" ${attrs}>${escape(value)}</text>`;
const content = text(node.tag, 40, detailSize, 'class="t-muted" data-detail="context"')
+ text(node.label, 89, 36, 'class="t-primary" data-node-label="" font-weight="700"')
+ text(node.label, 89, stageMobile ? 40 : 36, 'class="t-primary" data-node-label="" font-weight="700"')
+ lines.map((line,i) => text(line, 138+i*42, detailSize, 'class="t-primary" data-detail="context"')).join('');
const prefix = original.slice(0,rectangles[1].index+rectangles[1][0].length).replaceAll('rx="6"','rx="0"');
html = html.replace(original,prefix+content+'</g>');
+5 -5
View File
@@ -11,7 +11,7 @@ test('Strategy has Target, Roadmap, a linked Skills Adoption category and Autono
runInNewContext(compiled, sandbox);
const sidebar = JSON.parse(JSON.stringify(sandbox.exports.default.strategySidebar));
assert.deepEqual(sidebar, ['target-operating-model', 'roadmap', {
type:'category', label:'Stage - 01 - Skills Adoption',
type:'category', label:'One bounded experiment',
link:{type:'doc', id:'stage-01-skills-adoption'}, collapsed:true,
items:[
{type:'category', label:'Measurement', collapsed:true, link:{type:'doc', id:'measurement/index'}, items:[
@@ -26,7 +26,7 @@ test('Strategy has Target, Roadmap, a linked Skills Adoption category and Autono
],
}, 'stage-02-autonomous-agent']);
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Target$/m);
assert.match(read('docs/strategy/target-operating-model.mdx'), /^sidebar_label: Six-month strategy$/m);
assert.match(read('docusaurus.config.ts'), /type: 'docSidebar', docsPluginId: 'strategy', sidebarId: 'strategySidebar', label: 'Strategy'/);
});
@@ -34,8 +34,8 @@ test('stage overviews explain the foundation and future without replacing topic
const first = read('docs/strategy/stage-01-skills-adoption.mdx');
const second = read('docs/strategy/stage-02-autonomous-agent.mdx');
for (const [id, title, page] of [
['stage-01-skills-adoption', 'Stage - 01 - Skills Adoption', first],
['stage-02-autonomous-agent', 'Stage - 02 - Autonomous Agent', second],
['stage-01-skills-adoption', 'One bounded experiment', first],
['stage-02-autonomous-agent', 'Beyond six months', second],
]) {
assert(page.includes(`id: ${id}\ntitle: ${title}`));
for (const link of ['./roadmap.mdx', './target-operating-model.mdx']) assert(page.includes(link));
@@ -43,7 +43,7 @@ test('stage overviews explain the foundation and future without replacing topic
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);
assert.match(read('docs/strategy/measurement/index.mdx'), /^title: Measuring real output\nsidebar_label: Measurement$/m);
});
test('old Strategy entry redirects to Target instead of maintaining a second document', () => {
+6 -5
View File
@@ -13,12 +13,13 @@ test('every strategy page leads with a compact diagram story and closes its refe
assert(!page.includes('<details>') || page.indexOf(' story />') < page.indexOf('<details>'), id);
assert(!/<details\s+open/.test(page), id);
assert.equal((page.match(/<details>/g) || []).length, (page.match(/<\/details>/g) || []).length, 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.match(/^## /gm) || []).length <= 4, id);
assert((narrative.match(/^- /gm) || []).length <= 7, id);
assert(/\*\*(Next|Continue the loop):\*\*/.test(narrative), id);
assert(!narrative.includes('| ---'), id);
const words = narrative.replace(/<[^>]*>/g, '').trim().split(/\s+/).length;
assert(words <= (id === 'measurement' ? 1500 : id === 'roadmap' ? 600 : 200), `${id}: ${words} default narrative words`);
const budget = id === 'measurement' ? 1900 : id === 'roadmap' ? 1150 : id === 'target-operating-model' ? 850 : 750;
assert(words <= budget, `${id}: ${words} default narrative words`);
}
});
@@ -36,7 +37,7 @@ test('mobile story diagrams preserve the same nodes and directed relationships',
const desktop = JSON.parse(read(`diagrams/${name}.architecture.json`));
const mobile = JSON.parse(read(`diagrams/${name}-mobile.architecture.json`));
assert(desktop.components.length >= 5, name);
const semantic = d => ({nodes:d.components.map(({pos,size,...n})=>n),edges:d.connections.map(({fromSide,toSide,route,via,labelAt,...e})=>e)});
const semantic = d => ({nodes:d.components.map(({pos,size,...n})=>n),edges:d.connections.map(({fromSide,toSide,route,via,labelAt,label,...e})=>e)});
assert.deepEqual(semantic(desktop), semantic(mobile), name);
assert(desktop.connections.every(e => (e.label || e.id.startsWith('govern-') || /^strategy-(governance|quality|adoption|measurement|maintenance)$/.test(name)) && e.from !== e.to), name);
assert.equal(desktop.meta.legend.mode, 'hidden');
+16
View File
@@ -0,0 +1,16 @@
// Caption the retained optional target without changing its native topology.
// Text lives inside the SVG so standalone exports retain proposal/line semantics.
export function targetCaption(html) {
const roots = [...html.matchAll(/<svg\b[^>]*role="img"[^>]*>/g)];
if (roots.length !== 1) throw new Error('Target caption SVG contract drift');
const root = roots[0][0];
const match = /viewBox="([\d. -]+)"/.exec(root);
if (!match) throw new Error('Target caption requires viewBox');
const [x,y,w,h] = match[1].trim().split(/\s+/).map(Number);
const size = Math.min(26, w / 30);
const lines = ['Proposed optional target — not a six-month commitment',
'Solid: lifecycle · Dotted: execution / governance', 'Dashed: human-controlled contributions'];
const extra = size * 5;
const caption = `<g id="eldorado-target-caption" aria-label="Proposed target legend">${lines.map((line,i) => `<text x="${x+20}" y="${y+h+size*(1.2+i*1.3)}" font-family="Arial, sans-serif" font-size="${size}" style="font-size:${size}px!important" class="t-primary">${line}</text>`).join('')}</g>`;
return html.replace(root, root.replace(match[0], `viewBox="${x} ${y} ${w} ${h+extra}"`) + caption);
}
+2 -2
View File
@@ -27,9 +27,9 @@ if (process.argv.includes('--build')) {
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:'stage-01-skills-adoption', title:'One bounded experiment'},
{id:'baseline', title:'Baseline'},
{id:'stage-02-autonomous-agent', title:'Stage - 02 - Autonomous Agent'},
{id:'stage-02-autonomous-agent', title:'Beyond six months'},
];
for (const {id, title} of strategyPages) {
const route = `strategy/${id === 'index' ? '' : `${id}/`}index.html`;
+1 -1
View File
@@ -5,7 +5,7 @@ export default {
'roadmap',
{
type: 'category',
label: 'Stage - 01 - Skills Adoption',
label: 'One bounded experiment',
link: {type: 'doc', id: 'stage-01-skills-adoption'},
collapsed: true,
items: [
+1 -1
View File
@@ -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|baseline|maintenance)$/.test(name);
const skillsStory = /^strategy-(governance|quality|adoption|measurement|baseline|maintenance|stage01|stage02|six-months)$/.test(name);
useEffect(() => {
if (!name.startsWith('strategy-roadmap') && !skillsStory) return;
const media = window.matchMedia(skillsStory ? '(max-width: 1100px)' : '(max-width: 999px)');
+2 -1
View File
@@ -115,7 +115,8 @@ a:focus-visible, button:focus-visible {outline: 3px solid #b88719; outline-offse
.archify-panel--story[data-diagram^="strategy-roadmap"] > .story-desktop {aspect-ratio: auto; height: 300px;}
.archify-panel--story[data-diagram="strategy-roadmap-loop"] {--roadmap-height: 1840px;}
.archify-panel--story[data-diagram="strategy-roadmap-loop"] > .story-desktop {height: 460px;}
.archify-panel--story[data-diagram="strategy-target"] > iframe {aspect-ratio: 1620 / 1430;}
.archify-panel--story[data-diagram="strategy-target"] > iframe {aspect-ratio: 1225 / 1151;}
.strategy-content > details:has([data-diagram="strategy-target"]) {padding-inline: 0;}
.strategy-content > details {margin: .65rem 0; border: 1px solid var(--line); padding: .8rem 1rem; background: var(--surface);}
.strategy-content summary {cursor: pointer; font-weight: 700;}