scrum-skills 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/diagram-design/LICENSE +4 -0
- package/.agents/skills/diagram-design/SKILL.md +423 -0
- package/.agents/skills/diagram-design/UPSTREAM.json +88 -0
- package/.agents/skills/diagram-design/UPSTREAM.md +23 -0
- package/.agents/skills/diagram-design/assets/example-architecture-containment.html +205 -0
- package/.agents/skills/diagram-design/assets/example-architecture-delta.html +193 -0
- package/.agents/skills/diagram-design/assets/example-architecture.html +183 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan-campus.html +108 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan-coffee-shop.html +121 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan-warehouse.html +127 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan.html +114 -0
- package/.agents/skills/diagram-design/assets/example-bar.html +129 -0
- package/.agents/skills/diagram-design/assets/example-beeswarm.html +384 -0
- package/.agents/skills/diagram-design/assets/example-box-plot.html +127 -0
- package/.agents/skills/diagram-design/assets/example-bubble.html +147 -0
- package/.agents/skills/diagram-design/assets/example-bump.html +142 -0
- package/.agents/skills/diagram-design/assets/example-data-flow.html +143 -0
- package/.agents/skills/diagram-design/assets/example-datalake.html +269 -0
- package/.agents/skills/diagram-design/assets/example-db-schema.html +302 -0
- package/.agents/skills/diagram-design/assets/example-dependency.html +224 -0
- package/.agents/skills/diagram-design/assets/example-deployment.html +190 -0
- package/.agents/skills/diagram-design/assets/example-dp-integration.html +81 -0
- package/.agents/skills/diagram-design/assets/example-dp-security-matrix.html +88 -0
- package/.agents/skills/diagram-design/assets/example-er.html +202 -0
- package/.agents/skills/diagram-design/assets/example-exploded-ai-stack.html +85 -0
- package/.agents/skills/diagram-design/assets/example-exploded-keyboard.html +84 -0
- package/.agents/skills/diagram-design/assets/example-exploded-phone.html +83 -0
- package/.agents/skills/diagram-design/assets/example-exploded-unboxing.html +84 -0
- package/.agents/skills/diagram-design/assets/example-exploded.html +83 -0
- package/.agents/skills/diagram-design/assets/example-fishbone.html +152 -0
- package/.agents/skills/diagram-design/assets/example-flowchart.html +163 -0
- package/.agents/skills/diagram-design/assets/example-gantt.html +137 -0
- package/.agents/skills/diagram-design/assets/example-heatmap.html +224 -0
- package/.agents/skills/diagram-design/assets/example-high-level-vertical.html +325 -0
- package/.agents/skills/diagram-design/assets/example-high-level.html +301 -0
- package/.agents/skills/diagram-design/assets/example-import-drawio.html +185 -0
- package/.agents/skills/diagram-design/assets/example-import-excalidraw.html +70 -0
- package/.agents/skills/diagram-design/assets/example-import-mermaid.html +70 -0
- package/.agents/skills/diagram-design/assets/example-it-state.html +128 -0
- package/.agents/skills/diagram-design/assets/example-journey.html +148 -0
- package/.agents/skills/diagram-design/assets/example-kanban.html +174 -0
- package/.agents/skills/diagram-design/assets/example-layers.html +123 -0
- package/.agents/skills/diagram-design/assets/example-line.html +111 -0
- package/.agents/skills/diagram-design/assets/example-loop.html +100 -0
- package/.agents/skills/diagram-design/assets/example-marimekko.html +148 -0
- package/.agents/skills/diagram-design/assets/example-medallion.html +159 -0
- package/.agents/skills/diagram-design/assets/example-nested.html +136 -0
- package/.agents/skills/diagram-design/assets/example-org-chart.html +45 -0
- package/.agents/skills/diagram-design/assets/example-polar.html +116 -0
- package/.agents/skills/diagram-design/assets/example-process.html +64 -0
- package/.agents/skills/diagram-design/assets/example-pyramid.html +119 -0
- package/.agents/skills/diagram-design/assets/example-quadrant-consultant.html +166 -0
- package/.agents/skills/diagram-design/assets/example-quadrant.html +135 -0
- package/.agents/skills/diagram-design/assets/example-radar.html +139 -0
- package/.agents/skills/diagram-design/assets/example-ridgeline.html +104 -0
- package/.agents/skills/diagram-design/assets/example-sankey.html +150 -0
- package/.agents/skills/diagram-design/assets/example-scatter.html +141 -0
- package/.agents/skills/diagram-design/assets/example-sequence-oauth.html +227 -0
- package/.agents/skills/diagram-design/assets/example-sequence.html +222 -0
- package/.agents/skills/diagram-design/assets/example-service-blueprint.html +185 -0
- package/.agents/skills/diagram-design/assets/example-slopegraph.html +119 -0
- package/.agents/skills/diagram-design/assets/example-state-lifecycle.html +92 -0
- package/.agents/skills/diagram-design/assets/example-state.html +147 -0
- package/.agents/skills/diagram-design/assets/example-story-map.html +184 -0
- package/.agents/skills/diagram-design/assets/example-streamgraph.html +99 -0
- package/.agents/skills/diagram-design/assets/example-swimlane.html +172 -0
- package/.agents/skills/diagram-design/assets/example-timeline.html +135 -0
- package/.agents/skills/diagram-design/assets/example-tree-block-decomposition.html +151 -0
- package/.agents/skills/diagram-design/assets/example-tree.html +173 -0
- package/.agents/skills/diagram-design/assets/example-treemap.html +107 -0
- package/.agents/skills/diagram-design/assets/example-uml-class.html +188 -0
- package/.agents/skills/diagram-design/assets/example-venn.html +110 -0
- package/.agents/skills/diagram-design/assets/example-wardley.html +153 -0
- package/.agents/skills/diagram-design/assets/example-waterfall.html +129 -0
- package/.agents/skills/diagram-design/assets/template-dark.html +99 -0
- package/.agents/skills/diagram-design/assets/template-full.html +421 -0
- package/.agents/skills/diagram-design/assets/template-motion.html +448 -0
- package/.agents/skills/diagram-design/assets/template-terminal.html +188 -0
- package/.agents/skills/diagram-design/assets/template.html +100 -0
- package/.agents/skills/diagram-design/references/animation.md +143 -0
- package/.agents/skills/diagram-design/references/export-registry.md +78 -0
- package/.agents/skills/diagram-design/references/export.md +376 -0
- package/.agents/skills/diagram-design/references/import-drawio.md +181 -0
- package/.agents/skills/diagram-design/references/import-excalidraw.md +130 -0
- package/.agents/skills/diagram-design/references/import-mermaid.md +137 -0
- package/.agents/skills/diagram-design/references/layout-budget.md +97 -0
- package/.agents/skills/diagram-design/references/onboarding.md +368 -0
- package/.agents/skills/diagram-design/references/output-spec.md +277 -0
- package/.agents/skills/diagram-design/references/primitive-annotation.md +36 -0
- package/.agents/skills/diagram-design/references/primitive-icons.md +827 -0
- package/.agents/skills/diagram-design/references/primitive-sketchy.md +43 -0
- package/.agents/skills/diagram-design/references/primitive-terminal.md +76 -0
- package/.agents/skills/diagram-design/references/primitives-core.md +150 -0
- package/.agents/skills/diagram-design/references/profiles.md +183 -0
- package/.agents/skills/diagram-design/references/semantic-patterns.md +154 -0
- package/.agents/skills/diagram-design/references/style-guide.md +236 -0
- package/.agents/skills/diagram-design/references/style-vivid.md +148 -0
- package/.agents/skills/diagram-design/references/type-architecture-delta.md +143 -0
- package/.agents/skills/diagram-design/references/type-architecture.md +117 -0
- package/.agents/skills/diagram-design/references/type-axonometric-plan.md +83 -0
- package/.agents/skills/diagram-design/references/type-bar.md +108 -0
- package/.agents/skills/diagram-design/references/type-data-flow.md +371 -0
- package/.agents/skills/diagram-design/references/type-db-schema.md +48 -0
- package/.agents/skills/diagram-design/references/type-dependency.md +44 -0
- package/.agents/skills/diagram-design/references/type-deployment.md +45 -0
- package/.agents/skills/diagram-design/references/type-dp-integration.md +407 -0
- package/.agents/skills/diagram-design/references/type-dp-security-matrix.md +379 -0
- package/.agents/skills/diagram-design/references/type-er.md +25 -0
- package/.agents/skills/diagram-design/references/type-exploded.md +115 -0
- package/.agents/skills/diagram-design/references/type-fishbone.md +75 -0
- package/.agents/skills/diagram-design/references/type-flowchart.md +23 -0
- package/.agents/skills/diagram-design/references/type-gantt.md +45 -0
- package/.agents/skills/diagram-design/references/type-heatmap.md +80 -0
- package/.agents/skills/diagram-design/references/type-high-level.md +470 -0
- package/.agents/skills/diagram-design/references/type-it-state.md +468 -0
- package/.agents/skills/diagram-design/references/type-journey.md +55 -0
- package/.agents/skills/diagram-design/references/type-kanban.md +49 -0
- package/.agents/skills/diagram-design/references/type-layers.md +26 -0
- package/.agents/skills/diagram-design/references/type-line.md +337 -0
- package/.agents/skills/diagram-design/references/type-loop.md +223 -0
- package/.agents/skills/diagram-design/references/type-medallion.md +356 -0
- package/.agents/skills/diagram-design/references/type-nested.md +22 -0
- package/.agents/skills/diagram-design/references/type-org-chart.md +44 -0
- package/.agents/skills/diagram-design/references/type-polar.md +136 -0
- package/.agents/skills/diagram-design/references/type-process.md +490 -0
- package/.agents/skills/diagram-design/references/type-pyramid.md +33 -0
- package/.agents/skills/diagram-design/references/type-quadrant.md +81 -0
- package/.agents/skills/diagram-design/references/type-radar.md +82 -0
- package/.agents/skills/diagram-design/references/type-sankey.md +75 -0
- package/.agents/skills/diagram-design/references/type-scatter.md +276 -0
- package/.agents/skills/diagram-design/references/type-sequence.md +130 -0
- package/.agents/skills/diagram-design/references/type-service-blueprint.md +103 -0
- package/.agents/skills/diagram-design/references/type-state.md +30 -0
- package/.agents/skills/diagram-design/references/type-story-map.md +46 -0
- package/.agents/skills/diagram-design/references/type-swimlane.md +22 -0
- package/.agents/skills/diagram-design/references/type-timeline.md +20 -0
- package/.agents/skills/diagram-design/references/type-tree.md +24 -0
- package/.agents/skills/diagram-design/references/type-treemap.md +137 -0
- package/.agents/skills/diagram-design/references/type-uml-class.md +65 -0
- package/.agents/skills/diagram-design/references/type-venn.md +26 -0
- package/.agents/skills/diagram-design/references/type-wardley.md +39 -0
- package/.agents/skills/diagram-design/references/type-waterfall.md +75 -0
- package/.agents/skills/scrum-meta/SKILL.md +36 -36
- package/.agents/skills/scrum-planning/SKILL.md +61 -61
- package/.agents/skills/scrum-planning/references/schema.md +384 -336
- package/.agents/skills/scrum-report/SKILL.md +42 -42
- package/.agents/skills/scrum-sprint/SKILL.md +49 -49
- package/.agents/skills/scrum-tdd/SKILL.md +140 -127
- package/README.md +24 -1
- package/assets/board/200.html +1 -1
- package/assets/board/404.html +1 -1
- package/assets/board/_nuxt/4gQF_HS3.js +1 -0
- package/assets/board/_nuxt/5okfNy5D.js +1 -0
- package/assets/board/_nuxt/{Bb3Limos.js → B0C2jsdk.js} +1 -1
- package/assets/board/_nuxt/B1j6UC4U.js +1 -0
- package/assets/board/_nuxt/B3LKy6o2.js +1 -0
- package/assets/board/_nuxt/BAQQngAq.js +13 -0
- package/assets/board/_nuxt/BE6t7Q2m.js +1 -0
- package/assets/board/_nuxt/BGwhkDRl.js +1 -0
- package/assets/board/_nuxt/BLvbupFS.js +1 -0
- package/assets/board/_nuxt/BQgzP7ur.js +1 -0
- package/assets/board/_nuxt/BRZIF_wo.js +1 -0
- package/assets/board/_nuxt/BU8vdZUs.js +95 -0
- package/assets/board/_nuxt/BW3xJdEx.js +1 -0
- package/assets/board/_nuxt/{Cm9lkUvP.js → BY36DFyj.js} +1 -1
- package/assets/board/_nuxt/BZlZD94i.js +1 -0
- package/assets/board/_nuxt/BZvXNwev.js +3 -0
- package/assets/board/_nuxt/BiWrMOsL.js +1 -0
- package/assets/board/_nuxt/BkoKCNUY.js +1 -0
- package/assets/board/_nuxt/BlKmZhhF.js +1 -0
- package/assets/board/_nuxt/BmBpmU73.js +1 -0
- package/assets/board/_nuxt/BmrSh0rL.js +1 -0
- package/assets/board/_nuxt/BrWE0up6.js +1 -0
- package/assets/board/_nuxt/Bs52qkgk.js +1 -0
- package/assets/board/_nuxt/BuBzMkFZ.js +1 -0
- package/assets/board/_nuxt/Bubk0xn-.js +1 -0
- package/assets/board/_nuxt/BxuBMtk_.js +3 -0
- package/assets/board/_nuxt/By1KXXLR.js +1 -0
- package/assets/board/_nuxt/BygIGL69.js +2 -0
- package/assets/board/_nuxt/C-fx-vFO.js +1 -0
- package/assets/board/_nuxt/C1iO5KH3.js +1 -0
- package/assets/board/_nuxt/C2YPmTzt.js +1 -0
- package/assets/board/_nuxt/C3SpAhCW.js +1 -0
- package/assets/board/_nuxt/C3ZRWz5L.js +1 -0
- package/assets/board/_nuxt/C4WdPP6K.js +1 -0
- package/assets/board/_nuxt/C6o03JHe.js +1 -0
- package/assets/board/_nuxt/C8qB5llI.js +1 -0
- package/assets/board/_nuxt/C9MgRdhu.js +1 -0
- package/assets/board/_nuxt/CCA81-4P.js +1 -0
- package/assets/board/_nuxt/{D2O8Q8x9.js → CFCM18fF.js} +1 -1
- package/assets/board/_nuxt/CGXljzd_.js +1 -0
- package/assets/board/_nuxt/CI0scS-N.js +1 -0
- package/assets/board/_nuxt/CJs9B42o.js +1 -0
- package/assets/board/_nuxt/COmtTtfB.js +1 -0
- package/assets/board/_nuxt/CPYm4J_K.js +1 -0
- package/assets/board/_nuxt/CXG7GZes.js +1 -0
- package/assets/board/_nuxt/CYGiZn-X.js +1 -0
- package/assets/board/_nuxt/CaE8VlUp.js +1 -0
- package/assets/board/_nuxt/Cajxc4Dw.js +1 -0
- package/assets/board/_nuxt/CcGiNUgA.js +1 -0
- package/assets/board/_nuxt/Ccgv3lDj.js +1 -0
- package/assets/board/_nuxt/CdPGFZyy.js +1 -0
- package/assets/board/_nuxt/{DfR3IZN_.js → Cdf_T8Xa.js} +1 -1
- package/assets/board/_nuxt/CgQ30j_6.js +1 -0
- package/assets/board/_nuxt/Ck0-FqVI.js +1 -0
- package/assets/board/_nuxt/CkWKLtjO.js +1 -0
- package/assets/board/_nuxt/CoipdpDu.js +1 -0
- package/assets/board/_nuxt/Cq7hsCKB.js +1 -0
- package/assets/board/_nuxt/D166WVUG.js +1 -0
- package/assets/board/_nuxt/D1V1gysQ.js +1 -0
- package/assets/board/_nuxt/D4Dpzo9e.js +1 -0
- package/assets/board/_nuxt/D5i92OZO.js +1 -0
- package/assets/board/_nuxt/D6dUp4Nm.js +9 -0
- package/assets/board/_nuxt/DFQDFspC.js +1 -0
- package/assets/board/_nuxt/DHX2tw9J.js +1 -0
- package/assets/board/_nuxt/DJM7u8P3.js +1 -0
- package/assets/board/_nuxt/{BPTrRhcw.js → DLr85ebo.js} +1 -1
- package/assets/board/_nuxt/DOMM1wfl.js +1 -0
- package/assets/board/_nuxt/DU6ArlUN.js +1 -0
- package/assets/board/_nuxt/{B_SlFcWp.js → DUgGsde6.js} +1 -1
- package/assets/board/_nuxt/DV4ti-Pq.js +1 -0
- package/assets/board/_nuxt/D_ct-Stz.js +2 -0
- package/assets/board/_nuxt/DbWAComO.js +1 -0
- package/assets/board/_nuxt/DbwlcHAt.js +1 -0
- package/assets/board/_nuxt/Dki9VkAL.js +3 -0
- package/assets/board/_nuxt/DlNJhOoc.js +1 -0
- package/assets/board/_nuxt/Dmg78zOY.js +3 -0
- package/assets/board/_nuxt/DqG7CtD4.js +1 -0
- package/assets/board/_nuxt/DqUSsCJ2.js +1 -0
- package/assets/board/_nuxt/Du2F4WXh.js +1 -0
- package/assets/board/_nuxt/DuRiEXn4.js +1 -0
- package/assets/board/_nuxt/DwCE3305.js +1 -0
- package/assets/board/_nuxt/DwzGxoX2.js +1 -0
- package/assets/board/_nuxt/DxBwVNyP.js +2 -0
- package/assets/board/_nuxt/DzmVW5-D.js +1 -0
- package/assets/board/_nuxt/I-sGtDIB.js +6 -0
- package/assets/board/_nuxt/JU9-x68N.js +1 -0
- package/assets/board/_nuxt/Lozm7hhE.js +1 -0
- package/assets/board/_nuxt/MMsTMkcB.js +1 -0
- package/assets/board/_nuxt/MS7CGmCB.js +1 -0
- package/assets/board/_nuxt/OKKaKILz.js +1 -0
- package/assets/board/_nuxt/{Csqgy925.js → P6qlvBHA.js} +1 -1
- package/assets/board/_nuxt/SrNUvNwO.js +1 -0
- package/assets/board/_nuxt/{DSaWoFHS.js → SywdkA98.js} +1 -1
- package/assets/board/_nuxt/TBIRpVLG.js +1 -0
- package/assets/board/_nuxt/TlTrMIMm.js +1 -0
- package/assets/board/_nuxt/Utb4TVOl.js +1 -0
- package/assets/board/_nuxt/Zv9-SOQF.js +1 -0
- package/assets/board/_nuxt/_id_.B6iqDPxe.css +1 -0
- package/assets/board/_nuxt/b7xtxFRl.js +1 -0
- package/assets/board/_nuxt/builds/latest.json +1 -1
- package/assets/board/_nuxt/builds/meta/08bebe14-0f1b-4d2a-8de4-e84e122d10e9.json +1 -0
- package/assets/board/_nuxt/diagrams.pyhqNtmr.css +1 -0
- package/assets/board/_nuxt/{entry.CKHePurH.css → entry.BBv-sBnP.css} +1 -1
- package/assets/board/_nuxt/error-404.CgJNdpB5.css +1 -0
- package/assets/board/_nuxt/error-500.WYSoH44y.css +1 -0
- package/assets/board/_nuxt/jbri6q1p.js +1 -0
- package/assets/board/_nuxt/q_8bxRMt.js +1 -0
- package/assets/board/burndown/index.html +1 -1
- package/assets/board/diagrams/index.html +1 -0
- package/assets/board/epics/index.html +1 -1
- package/assets/board/gantt/index.html +1 -1
- package/assets/board/index.html +1 -1
- package/assets/board/last-change/index.html +1 -1
- package/assets/board/milestones/index.html +1 -1
- package/assets/board/tests/index.html +1 -1
- package/bin/scrum-skills.mjs +13 -0
- package/package.json +2 -1
- package/templates/AGENTS.md +10 -0
- package/tools/diagram-import.mjs +238 -0
- package/tools/diagram-lint.mjs +518 -0
- package/tools/diagram.mjs +299 -0
- package/tools/last-change.mjs +326 -326
- package/tools/projects.mjs +29 -4
- package/tools/serve.mjs +27 -1
- package/tools/validate.mjs +781 -664
- package/assets/board/_nuxt/1eqboJxR.js +0 -1
- package/assets/board/_nuxt/2K7ag6ES.js +0 -1
- package/assets/board/_nuxt/51OWHj8c.js +0 -2
- package/assets/board/_nuxt/6gFtTBwm.js +0 -1
- package/assets/board/_nuxt/B3jkABw9.js +0 -1
- package/assets/board/_nuxt/B5n2_jZN.js +0 -1
- package/assets/board/_nuxt/BDK2Hj7B.js +0 -1
- package/assets/board/_nuxt/BDcnzXHq.js +0 -1
- package/assets/board/_nuxt/BaG8y0Wt.js +0 -1
- package/assets/board/_nuxt/BbwJq5pb.js +0 -1
- package/assets/board/_nuxt/BgLeKwx0.js +0 -1
- package/assets/board/_nuxt/Bi9Axj3V.js +0 -1
- package/assets/board/_nuxt/BmxvtaMq.js +0 -1
- package/assets/board/_nuxt/BodFvto3.js +0 -1
- package/assets/board/_nuxt/BpWeHLuN.js +0 -1
- package/assets/board/_nuxt/BuOKDFiJ.js +0 -1
- package/assets/board/_nuxt/C40iTe-x.js +0 -1
- package/assets/board/_nuxt/C7K0R7F-.js +0 -2
- package/assets/board/_nuxt/C8vL692X.js +0 -1
- package/assets/board/_nuxt/C9StZL3D.js +0 -3
- package/assets/board/_nuxt/CGI_ZV79.js +0 -1
- package/assets/board/_nuxt/CJ2mz0WY.js +0 -1
- package/assets/board/_nuxt/CJMBJQuf.js +0 -1
- package/assets/board/_nuxt/CK-lOYG9.js +0 -1
- package/assets/board/_nuxt/CK9_veoz.js +0 -1
- package/assets/board/_nuxt/CLBcBrYf.js +0 -1
- package/assets/board/_nuxt/CMUi2-Lj.js +0 -1
- package/assets/board/_nuxt/COf6E6h4.js +0 -1
- package/assets/board/_nuxt/CPCUMJnF.js +0 -1
- package/assets/board/_nuxt/CPcKlmSm.js +0 -1
- package/assets/board/_nuxt/CQTvWh4i.js +0 -1
- package/assets/board/_nuxt/CSEEUF8S.js +0 -1
- package/assets/board/_nuxt/CSSb154I.js +0 -13
- package/assets/board/_nuxt/CgDTd7jS.js +0 -1
- package/assets/board/_nuxt/ChG76uh9.js +0 -1
- package/assets/board/_nuxt/Ci0qbkgh.js +0 -1
- package/assets/board/_nuxt/CqoQ__I_.js +0 -1
- package/assets/board/_nuxt/CuJUHLl8.js +0 -1
- package/assets/board/_nuxt/CvLiA4_O.js +0 -1
- package/assets/board/_nuxt/Cvs12oA0.js +0 -3
- package/assets/board/_nuxt/CyEXFe3V.js +0 -1
- package/assets/board/_nuxt/Cz6rZcLK.js +0 -1
- package/assets/board/_nuxt/D2FhHl1o.js +0 -1
- package/assets/board/_nuxt/D3YCAmfu.js +0 -1
- package/assets/board/_nuxt/D5CE81jK.js +0 -1
- package/assets/board/_nuxt/D75vbfSb.js +0 -1
- package/assets/board/_nuxt/D99LbGfb.js +0 -9
- package/assets/board/_nuxt/DEfLc7p3.js +0 -6
- package/assets/board/_nuxt/DF-nsa1Z.js +0 -1
- package/assets/board/_nuxt/DIc8yx98.js +0 -1
- package/assets/board/_nuxt/DLkAKotw.js +0 -1
- package/assets/board/_nuxt/DRPlYvb3.js +0 -1
- package/assets/board/_nuxt/DRlQgul3.js +0 -1
- package/assets/board/_nuxt/DSLbmoWa.js +0 -1
- package/assets/board/_nuxt/DWO9c9yp.js +0 -1
- package/assets/board/_nuxt/DZo3dYLJ.js +0 -3
- package/assets/board/_nuxt/D_S6N7_b.js +0 -1
- package/assets/board/_nuxt/DajA-Tkt.js +0 -1
- package/assets/board/_nuxt/DbHiyab-.js +0 -1
- package/assets/board/_nuxt/Dc7Ql6eE.js +0 -1
- package/assets/board/_nuxt/Dd9ZukPU.js +0 -1
- package/assets/board/_nuxt/Dg2LiqmN.js +0 -1
- package/assets/board/_nuxt/DhuleNnm.js +0 -1
- package/assets/board/_nuxt/DkI1Qxpp.js +0 -95
- package/assets/board/_nuxt/DnDHGSYI.js +0 -1
- package/assets/board/_nuxt/DpXJ_tCU.js +0 -1
- package/assets/board/_nuxt/DqZgF3hU.js +0 -1
- package/assets/board/_nuxt/DqcxvfbD.js +0 -1
- package/assets/board/_nuxt/DsA2lVci.js +0 -1
- package/assets/board/_nuxt/Dtsa-1NS.js +0 -1
- package/assets/board/_nuxt/Du91iq0p.js +0 -1
- package/assets/board/_nuxt/Dx1wcYFo.js +0 -1
- package/assets/board/_nuxt/EYTShbt4.js +0 -1
- package/assets/board/_nuxt/MaXJprwN.js +0 -1
- package/assets/board/_nuxt/P9x67aq2.js +0 -1
- package/assets/board/_nuxt/S08nFESZ.js +0 -3
- package/assets/board/_nuxt/V0uynWE2.js +0 -1
- package/assets/board/_nuxt/Vo4wMbnS.js +0 -1
- package/assets/board/_nuxt/ZVTqot-_.js +0 -1
- package/assets/board/_nuxt/ZngEd3HB.js +0 -1
- package/assets/board/_nuxt/_id_.B2NDKSlX.css +0 -1
- package/assets/board/_nuxt/assMu_Wn.js +0 -1
- package/assets/board/_nuxt/builds/meta/8e23aec9-5b67-4569-b8bf-d4f07e50ffdf.json +0 -1
- package/assets/board/_nuxt/error-404.BFmXOnCT.css +0 -1
- package/assets/board/_nuxt/error-500.BZ-DdjQ6.css +0 -1
- package/assets/board/_nuxt/rlePnzpc.js +0 -1
- package/assets/board/_nuxt/uKzCKCTq.js +0 -1
- package/assets/board/_nuxt/vwxaNGfc.js +0 -1
- package/assets/board/_nuxt/yh6sf_D5.js +0 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>AI app stack · Layer hierarchy</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
+
:root {
|
|
11
|
+
--color-paper: #f5f5f5;
|
|
12
|
+
--color-ink: #2d3142;
|
|
13
|
+
--color-muted: #4f5d75;
|
|
14
|
+
--color-accent: #bf4520;
|
|
15
|
+
--font-sans: 'Geist', system-ui, sans-serif;
|
|
16
|
+
--font-serif: 'Instrument Serif', serif;
|
|
17
|
+
--font-mono: 'Geist Mono', ui-monospace, monospace;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
body {
|
|
21
|
+
font-family: var(--font-sans);
|
|
22
|
+
background: var(--color-paper);
|
|
23
|
+
color: var(--color-ink);
|
|
24
|
+
min-height: 100vh;
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: center;
|
|
28
|
+
padding: 3rem 2rem;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.frame { max-width: 1200px; width: 100%; }
|
|
32
|
+
|
|
33
|
+
.eyebrow {
|
|
34
|
+
font-family: var(--font-mono);
|
|
35
|
+
font-size: 0.66rem;
|
|
36
|
+
font-weight: 500;
|
|
37
|
+
letter-spacing: 0.18em;
|
|
38
|
+
text-transform: uppercase;
|
|
39
|
+
color: var(--color-muted);
|
|
40
|
+
margin-bottom: 0.5rem;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
h1 {
|
|
44
|
+
font-family: var(--font-serif);
|
|
45
|
+
font-size: clamp(1.5rem, 2.4vw + 0.75rem, 2rem);
|
|
46
|
+
font-weight: 400;
|
|
47
|
+
letter-spacing: -0.02em;
|
|
48
|
+
line-height: 1.15;
|
|
49
|
+
color: var(--color-ink);
|
|
50
|
+
margin-bottom: 1.5rem;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
svg { width: 100%; min-width: 900px; display: block; }
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
<body>
|
|
57
|
+
<div class="frame">
|
|
58
|
+
<p class="eyebrow">Layer stack · Diagram Design</p>
|
|
59
|
+
<h1>AI app stack · Where the work actually happens</h1>
|
|
60
|
+
|
|
61
|
+
<svg viewBox="0 0 1000 500" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="layers-title layers-desc">
|
|
62
|
+
<title id="layers-title">AI app stack · Where the work actually happens</title>
|
|
63
|
+
<desc id="layers-desc">Layer stack showing model weights, SDK, prompts, agent harness, and UI surface, with the agent harness highlighted as the focal layer.</desc>
|
|
64
|
+
<defs>
|
|
65
|
+
<pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse">
|
|
66
|
+
<circle cx="1" cy="1" r="0.9" fill="rgba(45,49,66,0.10)"/>
|
|
67
|
+
</pattern>
|
|
68
|
+
</defs>
|
|
69
|
+
|
|
70
|
+
<rect width="100%" height="100%" fill="#f5f5f5"/>
|
|
71
|
+
<rect width="100%" height="100%" fill="url(#dots)" opacity="0.55"/>
|
|
72
|
+
|
|
73
|
+
<!-- Direction column (left margin) -->
|
|
74
|
+
<text x="60" y="68" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">ABSTRACTION</text>
|
|
75
|
+
<line x1="80" y1="80" x2="80" y2="400" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
76
|
+
<polygon points="76,80 84,80 80,72" fill="#4f5d75"/>
|
|
77
|
+
<text x="60" y="416" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">SILICON</text>
|
|
78
|
+
|
|
79
|
+
<!-- Stack container hairlines (top + bottom edges) -->
|
|
80
|
+
<line x1="120" y1="80" x2="960" y2="80" stroke="rgba(45,49,66,0.12)" stroke-width="1"/>
|
|
81
|
+
<line x1="120" y1="400" x2="960" y2="400" stroke="rgba(45,49,66,0.12)" stroke-width="1"/>
|
|
82
|
+
|
|
83
|
+
<!-- L5 — UI (top layer, near-white fill) -->
|
|
84
|
+
<rect x="120" y="80" width="840" height="64" fill="#ffffff"/>
|
|
85
|
+
<line x1="120" y1="144" x2="960" y2="144" stroke="rgba(45,49,66,0.12)" stroke-width="1"/>
|
|
86
|
+
<text x="140" y="116" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em">L5</text>
|
|
87
|
+
<text x="260" y="118" fill="#2d3142" font-size="16" font-weight="600" font-family="'Geist', sans-serif">UI surface</text>
|
|
88
|
+
<text x="940" y="118" fill="#4f5d75" font-size="10" font-family="'Geist Mono', monospace" text-anchor="end" letter-spacing="0.08em">chat, editor, canvas</text>
|
|
89
|
+
|
|
90
|
+
<!-- L4 — Agent harness (FOCAL, coral tint + coral stroke) -->
|
|
91
|
+
<rect x="120" y="144" width="840" height="64" fill="rgba(191,69,32,0.08)"/>
|
|
92
|
+
<rect x="120" y="144" width="840" height="64" fill="none" stroke="#bf4520" stroke-width="1"/>
|
|
93
|
+
<text x="140" y="180" fill="#bf4520" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em" font-weight="600">L4</text>
|
|
94
|
+
<text x="260" y="182" fill="#2d3142" font-size="16" font-weight="600" font-family="'Geist', sans-serif">Agent harness</text>
|
|
95
|
+
<text x="940" y="182" fill="#bf4520" font-size="10" font-family="'Geist Mono', monospace" text-anchor="end" letter-spacing="0.08em">tools, memory, loop</text>
|
|
96
|
+
|
|
97
|
+
<!-- L3 — Prompt layer -->
|
|
98
|
+
<rect x="120" y="208" width="840" height="64" fill="#f5f5f5"/>
|
|
99
|
+
<line x1="120" y1="272" x2="960" y2="272" stroke="rgba(45,49,66,0.12)" stroke-width="1"/>
|
|
100
|
+
<text x="140" y="244" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em">L3</text>
|
|
101
|
+
<text x="260" y="246" fill="#2d3142" font-size="16" font-weight="600" font-family="'Geist', sans-serif">Prompt layer</text>
|
|
102
|
+
<text x="940" y="246" fill="#4f5d75" font-size="10" font-family="'Geist Mono', monospace" text-anchor="end" letter-spacing="0.08em">system, few-shot, caching</text>
|
|
103
|
+
|
|
104
|
+
<!-- L2 — SDK -->
|
|
105
|
+
<rect x="120" y="272" width="840" height="64" fill="#ececec"/>
|
|
106
|
+
<line x1="120" y1="336" x2="960" y2="336" stroke="rgba(45,49,66,0.12)" stroke-width="1"/>
|
|
107
|
+
<text x="140" y="308" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em">L2</text>
|
|
108
|
+
<text x="260" y="310" fill="#2d3142" font-size="16" font-weight="600" font-family="'Geist', sans-serif">SDK / client</text>
|
|
109
|
+
<text x="940" y="310" fill="#4f5d75" font-size="10" font-family="'Geist Mono', monospace" text-anchor="end" letter-spacing="0.08em">auth, retries, streaming</text>
|
|
110
|
+
|
|
111
|
+
<!-- L1 — Model -->
|
|
112
|
+
<rect x="120" y="336" width="840" height="64" fill="#ececec"/>
|
|
113
|
+
<text x="140" y="372" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em">L1</text>
|
|
114
|
+
<text x="260" y="374" fill="#2d3142" font-size="16" font-weight="600" font-family="'Geist', sans-serif">Model weights</text>
|
|
115
|
+
<text x="940" y="374" fill="#4f5d75" font-size="10" font-family="'Geist Mono', monospace" text-anchor="end" letter-spacing="0.08em">opus, sonnet, haiku</text>
|
|
116
|
+
|
|
117
|
+
<!-- Caption -->
|
|
118
|
+
<text x="120" y="456" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">FOCAL LAYER</text>
|
|
119
|
+
<text x="240" y="456" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif" font-style="italic">The harness is where most product differentiation actually lives — tools, memory, and the loop that stitches model calls into useful work.</text>
|
|
120
|
+
</svg>
|
|
121
|
+
</div>
|
|
122
|
+
</body>
|
|
123
|
+
</html>
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Weekly signups · Line chart</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
+
:root { --color-paper:#f5f5f5; --color-ink:#2d3142; --color-muted:#4f5d75; --color-accent:#bf4520; --font-sans:'Geist',system-ui,sans-serif; --font-serif:'Instrument Serif',serif; --font-mono:'Geist Mono',ui-monospace,monospace; }
|
|
11
|
+
body { font-family: var(--font-sans); background: var(--color-paper); color: var(--color-ink); min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 3rem 2rem; }
|
|
12
|
+
.frame { max-width: 1200px; width: 100%; }
|
|
13
|
+
.eyebrow { font-family: var(--font-mono); font-size: 0.66rem; font-weight: 500; letter-spacing: 0.18em; text-transform: uppercase; color: var(--color-muted); margin-bottom: 0.5rem; }
|
|
14
|
+
h1 { font-family: var(--font-serif); font-size: clamp(1.5rem, 2.4vw + 0.75rem, 2rem); font-weight: 400; letter-spacing: -0.02em; line-height: 1.15; margin-bottom: 1.5rem; }
|
|
15
|
+
svg { width: 100%; min-width: 760px; display: block; }
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<div class="frame">
|
|
20
|
+
<p class="eyebrow">Line · Diagram Design</p>
|
|
21
|
+
<h1>Weekly signups · Organic leads the growth</h1>
|
|
22
|
+
|
|
23
|
+
<svg viewBox="0 0 1000 500" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="line-title line-desc">
|
|
24
|
+
<title id="line-title">Weekly signups · Organic leads the growth</title>
|
|
25
|
+
<desc id="line-desc">Line chart showing weekly signups from organic, direct, and referral channels across weeks W1 through W8.</desc>
|
|
26
|
+
<defs>
|
|
27
|
+
<pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse">
|
|
28
|
+
<circle cx="1" cy="1" r="0.9" fill="rgba(45,49,66,0.10)"/>
|
|
29
|
+
</pattern>
|
|
30
|
+
</defs>
|
|
31
|
+
|
|
32
|
+
<rect width="100%" height="100%" fill="#f5f5f5"/>
|
|
33
|
+
<rect width="100%" height="100%" fill="url(#dots)" opacity="0.55"/>
|
|
34
|
+
|
|
35
|
+
<!-- Y-axis rotated label -->
|
|
36
|
+
<text transform="rotate(-90 24 230)" x="24" y="230" fill="#4f5d75" font-size="7" font-family="'Geist Mono', monospace" letter-spacing="0.14em" text-anchor="middle">SIGNUPS / WEEK</text>
|
|
37
|
+
|
|
38
|
+
<!-- Gridlines -->
|
|
39
|
+
<line x1="80" y1="357" x2="960" y2="357" stroke="rgba(45,49,66,0.08)" stroke-width="0.8"/>
|
|
40
|
+
<line x1="80" y1="293" x2="960" y2="293" stroke="rgba(45,49,66,0.08)" stroke-width="0.8"/>
|
|
41
|
+
<line x1="80" y1="230" x2="960" y2="230" stroke="rgba(45,49,66,0.08)" stroke-width="0.8"/>
|
|
42
|
+
<line x1="80" y1="167" x2="960" y2="167" stroke="rgba(45,49,66,0.08)" stroke-width="0.8"/>
|
|
43
|
+
<line x1="80" y1="103" x2="960" y2="103" stroke="rgba(45,49,66,0.08)" stroke-width="0.8"/>
|
|
44
|
+
<line x1="80" y1="40" x2="960" y2="40" stroke="rgba(45,49,66,0.06)" stroke-width="0.8"/>
|
|
45
|
+
|
|
46
|
+
<!-- Axes -->
|
|
47
|
+
<line x1="80" y1="40" x2="80" y2="420" stroke="rgba(45,49,66,0.25)" stroke-width="1"/>
|
|
48
|
+
<line x1="80" y1="420" x2="960" y2="420" stroke="rgba(45,49,66,0.25)" stroke-width="1"/>
|
|
49
|
+
|
|
50
|
+
<!-- Y-axis labels -->
|
|
51
|
+
<text x="72" y="361" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="end">40</text>
|
|
52
|
+
<text x="72" y="297" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="end">80</text>
|
|
53
|
+
<text x="72" y="234" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="end">120</text>
|
|
54
|
+
<text x="72" y="171" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="end">160</text>
|
|
55
|
+
<text x="72" y="107" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="end">200</text>
|
|
56
|
+
<text x="72" y="44" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="end">240</text>
|
|
57
|
+
|
|
58
|
+
<!-- ─── SERIES (non-focal drawn first) ─── -->
|
|
59
|
+
<!-- Referral: [45,52,48,60,55,68,62,75] series-2 dusty-blue -->
|
|
60
|
+
<polyline points="80,349 200,338 320,344 440,325 560,333 680,312 800,322 920,301"
|
|
61
|
+
fill="none" stroke="#5e7a9b" stroke-width="1.2" stroke-linejoin="round"/>
|
|
62
|
+
|
|
63
|
+
<!-- Direct: [80,82,88,90,86,92,95,98] series-1 sage -->
|
|
64
|
+
<polyline points="80,293 200,290 320,281 440,278 560,284 680,274 800,270 920,265"
|
|
65
|
+
fill="none" stroke="#7c8f6f" stroke-width="1.2" stroke-linejoin="round"/>
|
|
66
|
+
|
|
67
|
+
<!-- Organic FOCAL area fill (subtle) -->
|
|
68
|
+
<polygon points="80,230 200,206 320,186 440,164 560,175 680,138 800,111 920,88 920,420 80,420"
|
|
69
|
+
fill="rgba(191,69,32,0.06)"/>
|
|
70
|
+
|
|
71
|
+
<!-- Organic FOCAL line: [120,135,148,162,155,178,195,210] accent -->
|
|
72
|
+
<polyline points="80,230 200,206 320,186 440,164 560,175 680,138 800,111 920,88"
|
|
73
|
+
fill="none" stroke="#bf4520" stroke-width="1.8" stroke-linejoin="round"/>
|
|
74
|
+
|
|
75
|
+
<!-- Focal vertex dots -->
|
|
76
|
+
<circle cx="80" cy="230" r="4" fill="#bf4520"/>
|
|
77
|
+
<circle cx="200" cy="206" r="4" fill="#bf4520"/>
|
|
78
|
+
<circle cx="320" cy="186" r="4" fill="#bf4520"/>
|
|
79
|
+
<circle cx="440" cy="164" r="4" fill="#bf4520"/>
|
|
80
|
+
<circle cx="560" cy="175" r="4" fill="#bf4520"/>
|
|
81
|
+
<circle cx="680" cy="138" r="4" fill="#bf4520"/>
|
|
82
|
+
<circle cx="800" cy="111" r="4" fill="#bf4520"/>
|
|
83
|
+
<circle cx="920" cy="88" r="4" fill="#bf4520"/>
|
|
84
|
+
|
|
85
|
+
<!-- X-axis labels -->
|
|
86
|
+
<text x="80" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W1</text>
|
|
87
|
+
<text x="200" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W2</text>
|
|
88
|
+
<text x="320" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W3</text>
|
|
89
|
+
<text x="440" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W4</text>
|
|
90
|
+
<text x="560" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W5</text>
|
|
91
|
+
<text x="680" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W6</text>
|
|
92
|
+
<text x="800" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W7</text>
|
|
93
|
+
<text x="920" y="440" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">W8</text>
|
|
94
|
+
|
|
95
|
+
<!-- Legend -->
|
|
96
|
+
<line x1="40" y1="462" x2="960" y2="462" stroke="rgba(45,49,66,0.10)" stroke-width="0.8"/>
|
|
97
|
+
<text x="40" y="478" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">LEGEND</text>
|
|
98
|
+
|
|
99
|
+
<line x1="40" y1="492" x2="64" y2="492" stroke="#bf4520" stroke-width="1.8"/>
|
|
100
|
+
<circle cx="52" cy="492" r="4" fill="#bf4520"/>
|
|
101
|
+
<text x="72" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Organic · focal</text>
|
|
102
|
+
|
|
103
|
+
<line x1="200" y1="492" x2="224" y2="492" stroke="#7c8f6f" stroke-width="1.2"/>
|
|
104
|
+
<text x="232" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Direct</text>
|
|
105
|
+
|
|
106
|
+
<line x1="316" y1="492" x2="340" y2="492" stroke="#5e7a9b" stroke-width="1.2"/>
|
|
107
|
+
<text x="348" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Referral</text>
|
|
108
|
+
</svg>
|
|
109
|
+
</div>
|
|
110
|
+
</body>
|
|
111
|
+
</html>
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8"/>
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
6
|
+
<title>The self-improving loop</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet"/>
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
+
:root {
|
|
11
|
+
--paper: #f5f5f5; --ink: #2d3142; --muted: #4f5d75; --soft: #5a6580;
|
|
12
|
+
--accent: #bf4520; --accent-tint: rgba(191,69,32,0.08); --link: #2e5aa8;
|
|
13
|
+
--sans: 'Geist', system-ui, sans-serif; --serif: 'Instrument Serif', serif;
|
|
14
|
+
--mono: 'Geist Mono', ui-monospace, monospace;
|
|
15
|
+
}
|
|
16
|
+
body { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 3rem 2rem; background: var(--paper); color: var(--ink); font-family: var(--sans); }
|
|
17
|
+
.frame { width: 100%; max-width: 1200px; }
|
|
18
|
+
.eyebrow { margin-bottom: 0.5rem; color: var(--muted); font: 500 0.66rem var(--mono); letter-spacing: 0.18em; text-transform: uppercase; }
|
|
19
|
+
h1 { margin-bottom: 1.5rem; color: var(--ink); font: 400 clamp(1.5rem, 2.4vw + 0.75rem, 2rem)/1.15 var(--serif); letter-spacing: -0.02em; }
|
|
20
|
+
svg { display: block; width: 100%; min-width: 900px; }
|
|
21
|
+
.ring { fill: none; stroke: var(--muted); stroke-width: 1.2; }
|
|
22
|
+
.spoke { fill: none; stroke: var(--soft); stroke-width: 1; stroke-dasharray: 5 4; }
|
|
23
|
+
.station { fill: var(--paper); stroke: var(--ink); stroke-width: 1; }
|
|
24
|
+
.station.focal { fill: var(--accent-tint); stroke: var(--accent); stroke-width: 1.2; }
|
|
25
|
+
.hub { fill: var(--ink); }
|
|
26
|
+
.node-name { fill: var(--ink); font: 600 12px var(--sans); text-anchor: middle; }
|
|
27
|
+
.focal-name { fill: var(--accent); }
|
|
28
|
+
.sublabel { fill: var(--soft); font: 400 8px var(--mono); text-anchor: middle; }
|
|
29
|
+
.hub-name { fill: var(--paper); font: 600 16px var(--sans); text-anchor: middle; }
|
|
30
|
+
.hub-sub { fill: var(--paper); opacity: 0.72; font: 400 8px var(--mono); text-anchor: middle; }
|
|
31
|
+
.arrow-label { fill: var(--soft); font: 400 8px var(--mono); letter-spacing: 0.06em; text-anchor: middle; }
|
|
32
|
+
</style>
|
|
33
|
+
</head>
|
|
34
|
+
<body>
|
|
35
|
+
<main class="frame">
|
|
36
|
+
<p class="eyebrow">Loop · Diagram Design</p>
|
|
37
|
+
<h1>The self-improving loop</h1>
|
|
38
|
+
|
|
39
|
+
<svg viewBox="0 0 1040 680" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="loop-title loop-desc">
|
|
40
|
+
<title id="loop-title">The self-improving loop</title>
|
|
41
|
+
<desc id="loop-desc">Six stations flow clockwise from Capture through Learn and back to Capture. Each station writes shared state into one central memory hub, with Decide highlighted as the human approval gate.</desc>
|
|
42
|
+
<defs>
|
|
43
|
+
<pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse"><circle cx="1" cy="1" r="0.9" fill="rgba(45,49,66,0.10)"/></pattern>
|
|
44
|
+
<marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#4f5d75"/></marker>
|
|
45
|
+
<marker id="arrow-accent" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#bf4520"/></marker>
|
|
46
|
+
<marker id="arrow-link" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#2e5aa8"/></marker>
|
|
47
|
+
<marker id="arrow-soft" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#5a6580"/></marker>
|
|
48
|
+
</defs>
|
|
49
|
+
<rect width="1040" height="680" fill="#f5f5f5"/>
|
|
50
|
+
<rect width="1040" height="680" fill="url(#dots)" opacity="0.55"/>
|
|
51
|
+
|
|
52
|
+
<!-- Solid clockwise ring: six arcs on the same r=240 station circle. -->
|
|
53
|
+
<path class="ring" d="M600 113.726 A240 240 0 0 1 704.969 187.073" marker-end="url(#arrow)"/>
|
|
54
|
+
<path class="ring" d="M743.285 252 A240 240 0 0 1 743.722 426.882" marker-end="url(#arrow)"/>
|
|
55
|
+
<path class="ring" d="M705.731 492 A240 240 0 0 1 601.130 565.871" marker-end="url(#arrow)"/>
|
|
56
|
+
<path class="ring" d="M440 566.274 A240 240 0 0 1 335.031 492.927" marker-end="url(#arrow)"/>
|
|
57
|
+
<path class="ring" d="M296.715 428 A240 240 0 0 1 296.278 253.118" marker-end="url(#arrow)"/>
|
|
58
|
+
<path class="ring" d="M334.269 188 A240 240 0 0 1 438.870 114.129" marker-end="url(#arrow)"/>
|
|
59
|
+
|
|
60
|
+
<!-- Dashed write-backs: station inner edge to 6px before the hub stroke. -->
|
|
61
|
+
<path class="spoke" d="M520 132 V280" marker-end="url(#arrow-soft)"/>
|
|
62
|
+
<path class="spoke" d="M672 252 L616 284" marker-end="url(#arrow-soft)"/>
|
|
63
|
+
<path class="spoke" d="M672 428 L616 396" marker-end="url(#arrow-soft)"/>
|
|
64
|
+
<path class="spoke" d="M520 548 V400" marker-end="url(#arrow-soft)"/>
|
|
65
|
+
<path class="spoke" d="M368 428 L424 396" marker-end="url(#arrow-soft)"/>
|
|
66
|
+
<path class="spoke" d="M368 252 L424 284" marker-end="url(#arrow-soft)"/>
|
|
67
|
+
|
|
68
|
+
<!-- Curated spoke labels sit beside the line with an 8px visible gap. -->
|
|
69
|
+
<rect x="532" y="200" width="48" height="16" rx="4" fill="#f5f5f5"/>
|
|
70
|
+
<text x="556" y="212" class="arrow-label">SIGNALS</text>
|
|
71
|
+
<rect x="460" y="464" width="52" height="16" rx="4" fill="#f5f5f5"/>
|
|
72
|
+
<text x="486" y="476" class="arrow-label">OUTCOMES</text>
|
|
73
|
+
|
|
74
|
+
<!-- Stations -->
|
|
75
|
+
<rect class="station" x="440" y="68" width="160" height="64" rx="6"/>
|
|
76
|
+
<text x="520" y="96" class="node-name">Capture</text><text x="520" y="116" class="sublabel">signals in / intake</text>
|
|
77
|
+
|
|
78
|
+
<rect class="station" x="648" y="188" width="160" height="64" rx="6"/>
|
|
79
|
+
<text x="728" y="216" class="node-name">Research</text><text x="728" y="236" class="sublabel">evidence pulled</text>
|
|
80
|
+
|
|
81
|
+
<rect class="station focal" x="648" y="428" width="160" height="64" rx="6"/>
|
|
82
|
+
<text x="728" y="456" class="node-name focal-name">Decide</text><text x="728" y="476" class="sublabel">human approves</text>
|
|
83
|
+
|
|
84
|
+
<rect class="station" x="440" y="548" width="160" height="64" rx="6"/>
|
|
85
|
+
<text x="520" y="576" class="node-name">Act</text><text x="520" y="596" class="sublabel">work ships</text>
|
|
86
|
+
|
|
87
|
+
<rect class="station" x="232" y="428" width="160" height="64" rx="6"/>
|
|
88
|
+
<text x="312" y="456" class="node-name">Measure</text><text x="312" y="476" class="sublabel">outcomes logged</text>
|
|
89
|
+
|
|
90
|
+
<rect class="station" x="232" y="188" width="160" height="64" rx="6"/>
|
|
91
|
+
<text x="312" y="216" class="node-name">Learn</text><text x="312" y="236" class="sublabel">playbook updated</text>
|
|
92
|
+
|
|
93
|
+
<!-- The one shared-state hub. -->
|
|
94
|
+
<rect class="hub" x="420" y="288" width="200" height="104" rx="8"/>
|
|
95
|
+
<text x="520" y="336" class="hub-name">Shared memory</text>
|
|
96
|
+
<text x="520" y="360" class="hub-sub">one record, every loop</text>
|
|
97
|
+
</svg>
|
|
98
|
+
</main>
|
|
99
|
+
</body>
|
|
100
|
+
</html>
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>CI minutes by pipeline and runner · Marimekko</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
+
:root {
|
|
11
|
+
--color-paper: #f5f5f5;
|
|
12
|
+
--color-ink: #2d3142;
|
|
13
|
+
--color-muted: #4f5d75;
|
|
14
|
+
--color-accent: #bf4520;
|
|
15
|
+
--font-sans: 'Geist', system-ui, sans-serif;
|
|
16
|
+
--font-serif: 'Instrument Serif', serif;
|
|
17
|
+
--font-mono: 'Geist Mono', ui-monospace, monospace;
|
|
18
|
+
}
|
|
19
|
+
body { font-family: var(--font-sans); background: var(--color-paper); color: var(--color-ink); min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 3rem 2rem; }
|
|
20
|
+
.frame { max-width: 1200px; width: 100%; }
|
|
21
|
+
.eyebrow { font-family: var(--font-mono); font-size: 0.66rem; font-weight: 500; letter-spacing: 0.18em; text-transform: uppercase; color: var(--color-muted); margin-bottom: 0.5rem; }
|
|
22
|
+
h1 { font-family: var(--font-serif); font-size: clamp(1.5rem, 2.4vw + 0.75rem, 2rem); font-weight: 400; letter-spacing: -0.02em; line-height: 1.15; margin-bottom: 1.5rem; }
|
|
23
|
+
.diagram-container { width: 100%; overflow-x: auto; }
|
|
24
|
+
svg { width: 100%; min-width: 760px; display: block; }
|
|
25
|
+
</style>
|
|
26
|
+
</head>
|
|
27
|
+
<body>
|
|
28
|
+
<div class="frame">
|
|
29
|
+
<p class="eyebrow">Marimekko · Diagram Design</p>
|
|
30
|
+
<h1>One pipeline on one runner is a fifth of all CI time</h1>
|
|
31
|
+
|
|
32
|
+
<div class="diagram-container">
|
|
33
|
+
<svg viewBox="0 0 1000 500" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="marimekko-title marimekko-desc">
|
|
34
|
+
<title id="marimekko-title">One pipeline on one runner is a fifth of all CI time</title>
|
|
35
|
+
<desc id="marimekko-desc">Marimekko chart of 10,000 CI minutes over 30 days, split five pipelines wide and up to three runner operating systems tall; column width is each pipeline's share of all minutes, segment height is each runner's share within its pipeline, and the mobile pipeline's macOS runners alone account for about 20 percent of the total.</desc>
|
|
36
|
+
<defs>
|
|
37
|
+
<pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse">
|
|
38
|
+
<circle cx="1" cy="1" r="0.9" fill="rgba(45,49,66,0.10)"/>
|
|
39
|
+
</pattern>
|
|
40
|
+
</defs>
|
|
41
|
+
|
|
42
|
+
<rect width="100%" height="100%" fill="#f5f5f5"/>
|
|
43
|
+
<rect width="100%" height="100%" fill="url(#dots)" opacity="0.55"/>
|
|
44
|
+
|
|
45
|
+
<!-- ─── COLUMNS ─── Five pipelines across 900px of column width (x 40 → 956
|
|
46
|
+
less four 4px gutters), each width the pipeline's share of all 10,000
|
|
47
|
+
minutes. Every column is the full 380px plot height (y 40 → 420) and its
|
|
48
|
+
segments tile it top to bottom in ONE fixed order - Linux, macOS, Windows -
|
|
49
|
+
each height the runner's share of that pipeline. Area is therefore the
|
|
50
|
+
joint share, and scripts/verify-marimekko.py recomputes width, height and
|
|
51
|
+
area from the data-amount every segment declares. Column edges sit on the
|
|
52
|
+
4px grid; segment boundaries are data and land on whole pixels. Non-focal
|
|
53
|
+
fills run one ink ramp per series, strongest on the largest series; the
|
|
54
|
+
focal segment is marked by its accent stroke, not by tone. ─── -->
|
|
55
|
+
|
|
56
|
+
<!-- web · 3,140 min · 31.4% · x 40 w 280 -->
|
|
57
|
+
<rect x="40" y="40" width="280" height="259" rx="2" fill="#f5f5f5"/>
|
|
58
|
+
<rect x="40" y="40" width="280" height="259" rx="2" data-column="web" data-segment="Linux" data-amount="2140" fill="rgba(45,49,66,0.16)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
59
|
+
<text data-column="web" data-segment="Linux" data-role="label" x="56" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Linux</text>
|
|
60
|
+
<text data-column="web" data-segment="Linux" data-role="label" x="56" y="86" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">2,140 min · 68%</text>
|
|
61
|
+
|
|
62
|
+
<rect x="40" y="299" width="280" height="46" rx="2" fill="#f5f5f5"/>
|
|
63
|
+
<rect x="40" y="299" width="280" height="46" rx="2" data-column="web" data-segment="macOS" data-amount="380" fill="rgba(45,49,66,0.10)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
64
|
+
<text data-column="web" data-segment="macOS" data-role="label" x="56" y="316" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif">macOS</text>
|
|
65
|
+
<text data-column="web" data-segment="macOS" data-role="label" x="56" y="331" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">380 min · 12%</text>
|
|
66
|
+
|
|
67
|
+
<rect x="40" y="345" width="280" height="75" rx="2" fill="#f5f5f5"/>
|
|
68
|
+
<rect x="40" y="345" width="280" height="75" rx="2" data-column="web" data-segment="Windows" data-amount="620" fill="rgba(45,49,66,0.05)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
69
|
+
<text data-column="web" data-segment="Windows" data-role="label" x="56" y="373" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Windows</text>
|
|
70
|
+
<text data-column="web" data-segment="Windows" data-role="label" x="56" y="391" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">620 min · 20%</text>
|
|
71
|
+
|
|
72
|
+
<!-- api · 2,800 min · 28.0% · x 324 w 252 · no macOS runners, so no macOS
|
|
73
|
+
segment: a series absent from a column is omitted, never drawn at zero -->
|
|
74
|
+
<rect x="324" y="40" width="252" height="334" rx="2" fill="#f5f5f5"/>
|
|
75
|
+
<rect x="324" y="40" width="252" height="334" rx="2" data-column="api" data-segment="Linux" data-amount="2460" fill="rgba(45,49,66,0.16)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
76
|
+
<text data-column="api" data-segment="Linux" data-role="label" x="340" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Linux</text>
|
|
77
|
+
<text data-column="api" data-segment="Linux" data-role="label" x="340" y="86" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">2,460 min · 88%</text>
|
|
78
|
+
|
|
79
|
+
<rect x="324" y="374" width="252" height="46" rx="2" fill="#f5f5f5"/>
|
|
80
|
+
<rect x="324" y="374" width="252" height="46" rx="2" data-column="api" data-segment="Windows" data-amount="340" fill="rgba(45,49,66,0.05)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
81
|
+
<text data-column="api" data-segment="Windows" data-role="label" x="340" y="391" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif">Windows</text>
|
|
82
|
+
<text data-column="api" data-segment="Windows" data-role="label" x="340" y="406" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">340 min · 12%</text>
|
|
83
|
+
|
|
84
|
+
<!-- mobile · 2,400 min · 24.0% · x 580 w 216 -->
|
|
85
|
+
<rect x="580" y="40" width="216" height="66" rx="2" fill="#f5f5f5"/>
|
|
86
|
+
<rect x="580" y="40" width="216" height="66" rx="2" data-column="mobile" data-segment="Linux" data-amount="420" fill="rgba(45,49,66,0.16)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
87
|
+
<text data-column="mobile" data-segment="Linux" data-role="label" x="596" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Linux</text>
|
|
88
|
+
<text data-column="mobile" data-segment="Linux" data-role="label" x="596" y="86" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">420 min · 18%</text>
|
|
89
|
+
|
|
90
|
+
<!-- mobile × macOS FOCAL: the one segment the figure is about -->
|
|
91
|
+
<rect x="580" y="106" width="216" height="314" rx="2" fill="#f5f5f5"/>
|
|
92
|
+
<rect x="580" y="106" width="216" height="314" rx="2" data-column="mobile" data-segment="macOS" data-amount="1980" fill="rgba(191,69,32,0.16)" stroke="#bf4520" stroke-width="1.5"/>
|
|
93
|
+
<text data-column="mobile" data-segment="macOS" data-role="label" x="596" y="134" fill="#2d3142" font-size="14" font-weight="600" font-family="'Geist', sans-serif">macOS</text>
|
|
94
|
+
<text data-column="mobile" data-segment="macOS" data-role="label" x="596" y="152" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">1,980 min · 83% of mobile</text>
|
|
95
|
+
|
|
96
|
+
<!-- infra · 1,400 min · 14.0% · x 800 w 128 -->
|
|
97
|
+
<rect x="800" y="40" width="128" height="304" rx="2" fill="#f5f5f5"/>
|
|
98
|
+
<rect x="800" y="40" width="128" height="304" rx="2" data-column="infra" data-segment="Linux" data-amount="1120" fill="rgba(45,49,66,0.16)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
99
|
+
<text data-column="infra" data-segment="Linux" data-role="label" x="816" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Linux</text>
|
|
100
|
+
<text data-column="infra" data-segment="Linux" data-role="label" x="816" y="86" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">1,120 min · 80%</text>
|
|
101
|
+
|
|
102
|
+
<rect x="800" y="344" width="128" height="76" rx="2" fill="#f5f5f5"/>
|
|
103
|
+
<rect x="800" y="344" width="128" height="76" rx="2" data-column="infra" data-segment="Windows" data-amount="280" fill="rgba(45,49,66,0.05)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
104
|
+
<text data-column="infra" data-segment="Windows" data-role="label" x="816" y="372" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Windows</text>
|
|
105
|
+
<text data-column="infra" data-segment="Windows" data-role="label" x="816" y="390" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">280 min · 20%</text>
|
|
106
|
+
|
|
107
|
+
<!-- docs · 260 min · 2.6% · x 932 w 24. Too narrow for a label, so it carries
|
|
108
|
+
the info mark rather than sideways text and is named in the legend. The
|
|
109
|
+
column keeps its honest width: a marimekko shows a whole, and a dropped
|
|
110
|
+
pipeline makes every other share a lie. -->
|
|
111
|
+
<rect x="932" y="40" width="24" height="380" rx="2" fill="#f5f5f5"/>
|
|
112
|
+
<rect x="932" y="40" width="24" height="380" rx="2" data-column="docs" data-segment="Linux" data-amount="260" fill="rgba(45,49,66,0.16)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
113
|
+
<circle cx="944" cy="64" r="5" fill="#2d3142"/>
|
|
114
|
+
<text x="944" y="67" fill="#f5f5f5" font-size="7" font-weight="600" font-family="'Geist Mono', monospace" text-anchor="middle">i</text>
|
|
115
|
+
|
|
116
|
+
<!-- Column captions, centred under each column, each printing the column's
|
|
117
|
+
share of the whole so the width can be read as a number -->
|
|
118
|
+
<text data-column="web" data-role="caption" x="180" y="438" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.06em" text-anchor="middle">web · 31%</text>
|
|
119
|
+
<text data-column="api" data-role="caption" x="450" y="438" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.06em" text-anchor="middle">api · 28%</text>
|
|
120
|
+
<text data-column="mobile" data-role="caption" x="688" y="438" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.06em" text-anchor="middle">mobile · 24%</text>
|
|
121
|
+
<text data-column="infra" data-role="caption" x="864" y="438" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.06em" text-anchor="middle">infra · 14%</text>
|
|
122
|
+
<text data-column="docs" data-role="caption" x="944" y="438" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.06em" text-anchor="middle">docs · 3%</text>
|
|
123
|
+
|
|
124
|
+
<!-- Legend -->
|
|
125
|
+
<line x1="40" y1="462" x2="960" y2="462" stroke="rgba(45,49,66,0.10)" stroke-width="0.8"/>
|
|
126
|
+
<text x="40" y="478" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">LEGEND</text>
|
|
127
|
+
<text x="960" y="478" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.06em" text-anchor="end">WIDTH = PIPELINE SHARE · HEIGHT = RUNNER SHARE WITHIN PIPELINE · AREA = SHARE OF ALL CI MINUTES · 30 DAYS · 10,000 MIN · ILLUSTRATIVE FIGURES</text>
|
|
128
|
+
|
|
129
|
+
<rect x="40" y="488" width="16" height="10" rx="2" fill="rgba(191,69,32,0.16)" stroke="#bf4520" stroke-width="1"/>
|
|
130
|
+
<text x="64" y="497" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">mobile × macOS · the focal segment</text>
|
|
131
|
+
|
|
132
|
+
<rect x="248" y="488" width="16" height="10" rx="2" fill="rgba(45,49,66,0.16)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
133
|
+
<text data-segment="Linux" data-role="key" x="272" y="497" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Linux</text>
|
|
134
|
+
|
|
135
|
+
<rect x="320" y="488" width="16" height="10" rx="2" fill="rgba(45,49,66,0.10)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
136
|
+
<text data-segment="macOS" data-role="key" x="344" y="497" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">macOS</text>
|
|
137
|
+
|
|
138
|
+
<rect x="396" y="488" width="16" height="10" rx="2" fill="rgba(45,49,66,0.05)" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
139
|
+
<text data-segment="Windows" data-role="key" x="420" y="497" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Windows</text>
|
|
140
|
+
|
|
141
|
+
<circle cx="500" cy="493" r="5" fill="#2d3142"/>
|
|
142
|
+
<text x="500" y="496" fill="#f5f5f5" font-size="7" font-weight="600" font-family="'Geist Mono', monospace" text-anchor="middle">i</text>
|
|
143
|
+
<text x="516" y="497" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">docs · 260 min on Linux, 2.6% — too narrow to label</text>
|
|
144
|
+
</svg>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
</body>
|
|
148
|
+
</html>
|