scrum-skills 0.3.2 → 0.3.3
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 +413 -0
- package/.agents/skills/diagram-design/UPSTREAM.json +76 -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 +146 -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 +224 -201
- package/assets/board/200.html +1 -1
- package/assets/board/404.html +1 -1
- package/assets/board/_nuxt/1XlYaCp9.js +1 -0
- 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/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/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/BbxmvdIF.js +1 -0
- package/assets/board/_nuxt/BiWrMOsL.js +1 -0
- package/assets/board/_nuxt/BizDeOK5.js +1 -0
- package/assets/board/_nuxt/BkcaOYQ_.js +95 -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/BrWE0up6.js +1 -0
- package/assets/board/_nuxt/Bs52qkgk.js +1 -0
- package/assets/board/_nuxt/BtzUbHO_.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/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/COecDWbb.js +1 -0
- package/assets/board/_nuxt/COmtTtfB.js +1 -0
- package/assets/board/_nuxt/CPYm4J_K.js +1 -0
- package/assets/board/_nuxt/CReA4TEB.js +3 -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/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/ChUHb39z.js +1 -0
- package/assets/board/_nuxt/Ck0-FqVI.js +1 -0
- package/assets/board/_nuxt/CkWKLtjO.js +1 -0
- package/assets/board/_nuxt/Cq7hsCKB.js +1 -0
- package/assets/board/_nuxt/CtFknnHZ.js +1 -0
- package/assets/board/_nuxt/D166WVUG.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/DZ--fXuU.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/DjzLR9Bl.js +1 -0
- package/assets/board/_nuxt/Dki9VkAL.js +3 -0
- package/assets/board/_nuxt/DlNJhOoc.js +1 -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/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/Zv9-SOQF.js +1 -0
- package/assets/board/_nuxt/_id_.ItzoSaBL.css +1 -0
- package/assets/board/_nuxt/builds/latest.json +1 -1
- package/assets/board/_nuxt/builds/meta/2218461a-f45b-41d6-ae44-b0d2332a9511.json +1 -0
- package/assets/board/_nuxt/burndown.CT8fx1Ge.css +1 -0
- package/assets/board/_nuxt/diagrams.D1ybqBem.css +1 -0
- package/assets/board/_nuxt/{entry.CKHePurH.css → entry.BCuHiFgF.css} +1 -1
- package/assets/board/_nuxt/epics.CUeDIEa0.css +1 -0
- package/assets/board/_nuxt/error-404.Y9imKiDC.css +1 -0
- package/assets/board/_nuxt/error-500.DufSBGVC.css +1 -0
- package/assets/board/_nuxt/gantt.CiC2Ts1t.css +1 -0
- package/assets/board/_nuxt/jbri6q1p.js +1 -0
- package/assets/board/_nuxt/last-change.C05Vc3BF.css +1 -0
- package/assets/board/_nuxt/milestones.Civ3sMiQ.css +1 -0
- package/assets/board/_nuxt/oSJF4yHw.js +1 -0
- package/assets/board/_nuxt/pages.BshWbOyo.css +1 -0
- package/assets/board/_nuxt/q_8bxRMt.js +1 -0
- package/assets/board/_nuxt/tests.Ci9fBCka.css +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/favicon.svg +16 -16
- 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 +204 -191
- package/docs/ai-assistant-guide.md +1008 -1008
- package/package.json +42 -41
- package/templates/AGENTS.md +84 -74
- package/tools/agile-tools.mjs +510 -510
- package/tools/ai.mjs +464 -464
- package/tools/diagram-import.mjs +238 -0
- package/tools/diagram-lint.mjs +518 -0
- package/tools/diagram.mjs +299 -0
- package/tools/git-commit.mjs +216 -216
- package/tools/last-change.mjs +326 -326
- package/tools/projects.mjs +240 -215
- package/tools/serve.mjs +180 -154
- 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/burndown.Do6IbM6o.css +0 -1
- package/assets/board/_nuxt/epics.Dmessplu.css +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/gantt.Dmp00GUo.css +0 -1
- package/assets/board/_nuxt/last-change.1Su4GrCN.css +0 -1
- package/assets/board/_nuxt/milestones.U0xKCsEo.css +0 -1
- package/assets/board/_nuxt/pages.Dbj2IVk8.css +0 -1
- package/assets/board/_nuxt/rlePnzpc.js +0 -1
- package/assets/board/_nuxt/tests.dXlUX16A.css +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,184 @@
|
|
|
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>Reporting, first release · User story map</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">User story map · Diagram Design</p>
|
|
59
|
+
<h1>Reporting, first release</h1>
|
|
60
|
+
|
|
61
|
+
<svg viewBox="0 0 1032 540" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="story-map-title story-map-desc">
|
|
62
|
+
<title id="story-map-title">Reporting, first release · User story map</title>
|
|
63
|
+
<desc id="story-map-desc">User story map for a reporting tool's first release: four narrative activities from finding data to trusting it, walking-skeleton steps beneath each, and three release slices sliced by an MVP release-cut line, with the row-level-permissions story flagged as the riskiest bet in Release 2.</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
|
+
<!-- Release slice bands (alternating fill) -->
|
|
74
|
+
<rect x="32" y="216" width="968" height="80" fill="rgba(45,49,66,0.02)"/>
|
|
75
|
+
<rect x="32" y="376" width="968" height="80" fill="rgba(45,49,66,0.02)"/>
|
|
76
|
+
|
|
77
|
+
<text x="48" y="260" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em">MVP</text>
|
|
78
|
+
<text x="48" y="340" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em">RELEASE 2</text>
|
|
79
|
+
<text x="48" y="420" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.14em">LATER</text>
|
|
80
|
+
|
|
81
|
+
<!-- Column separators: tie each card row to its activity column -->
|
|
82
|
+
<line x1="116" y1="108" x2="116" y2="456" stroke="rgba(45,49,66,0.10)" stroke-width="0.8" stroke-dasharray="4,4"/>
|
|
83
|
+
<line x1="340" y1="108" x2="340" y2="456" stroke="rgba(45,49,66,0.10)" stroke-width="0.8" stroke-dasharray="4,4"/>
|
|
84
|
+
<line x1="564" y1="108" x2="564" y2="456" stroke="rgba(45,49,66,0.10)" stroke-width="0.8" stroke-dasharray="4,4"/>
|
|
85
|
+
<line x1="788" y1="108" x2="788" y2="456" stroke="rgba(45,49,66,0.10)" stroke-width="0.8" stroke-dasharray="4,4"/>
|
|
86
|
+
<line x1="1012" y1="108" x2="1012" y2="456" stroke="rgba(45,49,66,0.10)" stroke-width="0.8" stroke-dasharray="4,4"/>
|
|
87
|
+
|
|
88
|
+
<!-- Backbone: 4 activities, narrative left-to-right order -->
|
|
89
|
+
<rect x="128" y="40" width="200" height="64" rx="6" fill="rgba(45,49,66,0.05)" stroke="#4f5d75" stroke-width="1"/>
|
|
90
|
+
<text x="228" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Find the data</text>
|
|
91
|
+
<text x="228" y="88" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">ACTIVITY 1</text>
|
|
92
|
+
|
|
93
|
+
<rect x="352" y="40" width="200" height="64" rx="6" fill="rgba(45,49,66,0.05)" stroke="#4f5d75" stroke-width="1"/>
|
|
94
|
+
<text x="452" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Build the report</text>
|
|
95
|
+
<text x="452" y="88" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">ACTIVITY 2</text>
|
|
96
|
+
|
|
97
|
+
<rect x="576" y="40" width="200" height="64" rx="6" fill="rgba(45,49,66,0.05)" stroke="#4f5d75" stroke-width="1"/>
|
|
98
|
+
<text x="676" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Share it</text>
|
|
99
|
+
<text x="676" y="88" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">ACTIVITY 3</text>
|
|
100
|
+
|
|
101
|
+
<rect x="800" y="40" width="200" height="64" rx="6" fill="rgba(45,49,66,0.05)" stroke="#4f5d75" stroke-width="1"/>
|
|
102
|
+
<text x="900" y="68" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Trust it</text>
|
|
103
|
+
<text x="900" y="88" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">ACTIVITY 4</text>
|
|
104
|
+
|
|
105
|
+
<!-- Walking skeleton: user steps under each activity -->
|
|
106
|
+
<rect x="144" y="120" width="168" height="32" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="0.8"/>
|
|
107
|
+
<text x="156" y="140" fill="#2d3142" font-size="12" font-family="'Geist', sans-serif">Search datasets</text>
|
|
108
|
+
<rect x="144" y="160" width="168" height="32" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="0.8"/>
|
|
109
|
+
<text x="156" y="180" fill="#2d3142" font-size="12" font-family="'Geist', sans-serif">Preview rows</text>
|
|
110
|
+
|
|
111
|
+
<rect x="368" y="120" width="168" height="32" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="0.8"/>
|
|
112
|
+
<text x="380" y="140" fill="#2d3142" font-size="12" font-family="'Geist', sans-serif">Pick columns</text>
|
|
113
|
+
<rect x="368" y="160" width="168" height="32" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="0.8"/>
|
|
114
|
+
<text x="380" y="180" fill="#2d3142" font-size="12" font-family="'Geist', sans-serif">Add a chart</text>
|
|
115
|
+
|
|
116
|
+
<rect x="592" y="120" width="168" height="32" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="0.8"/>
|
|
117
|
+
<text x="604" y="140" fill="#2d3142" font-size="12" font-family="'Geist', sans-serif">Send a link</text>
|
|
118
|
+
|
|
119
|
+
<rect x="816" y="120" width="168" height="32" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="0.8"/>
|
|
120
|
+
<text x="828" y="140" fill="#2d3142" font-size="12" font-family="'Geist', sans-serif">Check freshness</text>
|
|
121
|
+
|
|
122
|
+
<!-- MVP row story cards -->
|
|
123
|
+
<rect x="144" y="232" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
124
|
+
<text x="156" y="250" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Keyword search</text>
|
|
125
|
+
<text x="156" y="266" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-101 · 3pt</text>
|
|
126
|
+
|
|
127
|
+
<rect x="368" y="232" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
128
|
+
<text x="380" y="250" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Table + one chart</text>
|
|
129
|
+
<text x="380" y="266" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-102 · 5pt</text>
|
|
130
|
+
|
|
131
|
+
<rect x="592" y="232" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
132
|
+
<text x="604" y="250" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Public link</text>
|
|
133
|
+
<text x="604" y="266" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-103 · 2pt</text>
|
|
134
|
+
|
|
135
|
+
<rect x="816" y="232" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
136
|
+
<text x="828" y="250" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Last-updated stamp</text>
|
|
137
|
+
<text x="828" y="266" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-104 · 1pt</text>
|
|
138
|
+
|
|
139
|
+
<!-- Release cut line — accent element 1 -->
|
|
140
|
+
<line x1="32" y1="296" x2="1000" y2="296" stroke="#bf4520" stroke-width="1.5"/>
|
|
141
|
+
<rect x="736" y="280" width="104" height="8" rx="2" fill="#f5f5f5"/>
|
|
142
|
+
<text x="788" y="285" fill="#bf4520" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.10em">RELEASE CUT</text>
|
|
143
|
+
|
|
144
|
+
<!-- Release 2 row story cards -->
|
|
145
|
+
<rect x="144" y="312" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
146
|
+
<text x="156" y="330" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Saved filters</text>
|
|
147
|
+
<text x="156" y="346" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-110 · 3pt</text>
|
|
148
|
+
|
|
149
|
+
<rect x="592" y="312" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
150
|
+
<text x="604" y="330" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Scheduled email</text>
|
|
151
|
+
<text x="604" y="346" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-112 · 5pt</text>
|
|
152
|
+
|
|
153
|
+
<!-- Riskiest story — accent element 2 -->
|
|
154
|
+
<rect x="816" y="312" width="168" height="48" rx="4" fill="rgba(191,69,32,0.05)" stroke="#bf4520" stroke-width="1" stroke-dasharray="4,4"/>
|
|
155
|
+
<text x="828" y="330" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Row-level permissions</text>
|
|
156
|
+
<text x="828" y="346" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-114 · 3pt</text>
|
|
157
|
+
<rect x="936" y="336" width="40" height="12" rx="2" fill="transparent" stroke="#bf4520" stroke-width="0.8"/>
|
|
158
|
+
<text x="956" y="345" fill="#bf4520" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.08em">RISK</text>
|
|
159
|
+
|
|
160
|
+
<!-- Later row story cards -->
|
|
161
|
+
<rect x="144" y="392" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
162
|
+
<text x="156" y="410" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Natural-language query</text>
|
|
163
|
+
<text x="156" y="426" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-120 · 8pt</text>
|
|
164
|
+
|
|
165
|
+
<rect x="816" y="392" width="168" height="48" rx="4" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
166
|
+
<text x="828" y="410" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif">Alerting on anomalies</text>
|
|
167
|
+
<text x="828" y="426" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace">RPT-121 · 5pt</text>
|
|
168
|
+
|
|
169
|
+
<!-- Legend -->
|
|
170
|
+
<line x1="32" y1="480" x2="1000" y2="480" stroke="rgba(45,49,66,0.10)" stroke-width="0.8"/>
|
|
171
|
+
<text x="32" y="496" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">LEGEND</text>
|
|
172
|
+
|
|
173
|
+
<rect x="32" y="508" width="16" height="8" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
174
|
+
<text x="56" y="516" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Story card</text>
|
|
175
|
+
|
|
176
|
+
<rect x="232" y="508" width="16" height="8" fill="rgba(191,69,32,0.05)" stroke="#bf4520" stroke-width="1" stroke-dasharray="4,4"/>
|
|
177
|
+
<text x="256" y="516" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Highest risk</text>
|
|
178
|
+
|
|
179
|
+
<line x1="432" y1="512" x2="464" y2="512" stroke="#bf4520" stroke-width="1.5"/>
|
|
180
|
+
<text x="480" y="516" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Release cut</text>
|
|
181
|
+
</svg>
|
|
182
|
+
</div>
|
|
183
|
+
</body>
|
|
184
|
+
</html>
|
|
@@ -0,0 +1,99 @@
|
|
|
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>Build minutes by pipeline, twelve weeks · Streamgraph</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
|
+
svg { width: 100%; min-width: 760px; display: block; }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body>
|
|
27
|
+
<div class="frame">
|
|
28
|
+
<p class="eyebrow">Streamgraph · Diagram Design</p>
|
|
29
|
+
<h1>Where the extra build minutes went</h1>
|
|
30
|
+
|
|
31
|
+
<svg viewBox="0 0 1000 500" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="streamgraph-title streamgraph-desc">
|
|
32
|
+
<title id="streamgraph-title">Where the extra build minutes went</title>
|
|
33
|
+
<desc id="streamgraph-desc">Streamgraph of weekly CI build minutes by pipeline across twelve weeks, stacked on a symmetric baseline so the envelope height reads as the total; the end-to-end suite grows from 12 to 118 minutes a week and passes the unit suite in week eight, while the docs pipeline pauses to zero in weeks five and six.</desc>
|
|
34
|
+
<defs>
|
|
35
|
+
<pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse">
|
|
36
|
+
<circle cx="1" cy="1" r="0.9" fill="rgba(45,49,66,0.10)"/>
|
|
37
|
+
</pattern>
|
|
38
|
+
</defs>
|
|
39
|
+
|
|
40
|
+
<rect width="100%" height="100%" fill="#f5f5f5"/>
|
|
41
|
+
<rect width="100%" height="100%" fill="url(#dots)" opacity="0.55"/>
|
|
42
|
+
|
|
43
|
+
<!-- Symmetric baseline: every period is centred on y=230, so the top and
|
|
44
|
+
bottom of the envelope always average to the midline and the envelope
|
|
45
|
+
height IS the weekly total at 1.25px per minute. Boundaries are
|
|
46
|
+
Catmull-Rom smoothed (control points at 1/6 chord) with every vertex
|
|
47
|
+
on its true stacked value; scripts/verify-streamgraph.py enforces
|
|
48
|
+
both against the values each layer declares. -->
|
|
49
|
+
<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">BUILD MINUTES PER WEEK</text>
|
|
50
|
+
|
|
51
|
+
<!-- No y-axis ticks: the form is about the shape of the envelope and the
|
|
52
|
+
layers inside it; per-pipeline totals are printed in the legend. -->
|
|
53
|
+
<path data-layer="Docs" data-values="8,9,7,6,0,0,5,7,8,8,9,9" d="M 80 297.5 C 93.3 298.1, 133.3 299.4, 160 301.2 C 186.7 303, 213.3 305.9, 240 308.1 C 266.7 310.3, 293.3 311.3, 320 314.4 C 346.7 317.5, 373.3 323, 400 326.9 C 426.7 330.8, 453.3 334.9, 480 337.5 C 506.7 340.1, 533.3 339.7, 560 342.5 C 586.7 345.3, 613.3 350.8, 640 354.4 C 666.7 358, 693.3 361.4, 720 364.4 C 746.7 367.4, 773.3 369.4, 800 372.5 C 826.7 375.6, 853.3 379.8, 880 383.1 C 906.7 386.4, 946.7 390.9, 960 392.5 L 960 403.8 C 946.7 402.2, 906.7 397.9, 880 394.4 C 853.3 390.8, 826.7 385.8, 800 382.5 C 773.3 379.2, 746.7 377.6, 720 374.4 C 693.3 371.2, 666.7 367.4, 640 363.1 C 613.3 358.8, 586.7 353.1, 560 348.8 C 533.3 344.5, 506.7 341.1, 480 337.5 C 453.3 333.9, 426.7 329.5, 400 326.9 C 373.3 324.3, 346.7 323.6, 320 321.9 C 293.3 320.2, 266.7 318.5, 240 316.9 C 213.3 315.3, 186.7 314.1, 160 312.5 C 133.3 310.9, 93.3 308.3, 80 307.5 Z" fill="rgba(45,49,66,0.30)" stroke="#f5f5f5" stroke-width="1"/>
|
|
54
|
+
<path data-layer="Integration" data-values="34,36,38,42,44,47,49,52,54,56,59,61" d="M 80 255 C 93.3 255.2, 133.3 255.3, 160 256.2 C 186.7 257.1, 213.3 259.7, 240 260.6 C 266.7 261.6, 293.3 260, 320 261.9 C 346.7 263.8, 373.3 269.1, 400 271.9 C 426.7 274.7, 453.3 277.2, 480 278.8 C 506.7 280.4, 533.3 279.4, 560 281.2 C 586.7 283, 613.3 286.8, 640 289.4 C 666.7 292, 693.3 294.7, 720 296.9 C 746.7 299.1, 773.3 300.4, 800 302.5 C 826.7 304.6, 853.3 307.1, 880 309.4 C 906.7 311.7, 946.7 315.1, 960 316.2 L 960 392.5 C 946.7 390.9, 906.7 386.4, 880 383.1 C 853.3 379.8, 826.7 375.6, 800 372.5 C 773.3 369.4, 746.7 367.4, 720 364.4 C 693.3 361.4, 666.7 358, 640 354.4 C 613.3 350.8, 586.7 345.3, 560 342.5 C 533.3 339.7, 506.7 340.1, 480 337.5 C 453.3 334.9, 426.7 330.8, 400 326.9 C 373.3 323, 346.7 317.5, 320 314.4 C 293.3 311.3, 266.7 310.3, 240 308.1 C 213.3 305.9, 186.7 303, 160 301.2 C 133.3 299.4, 93.3 298.1, 80 297.5 Z" fill="rgba(45,49,66,0.62)" stroke="#f5f5f5" stroke-width="1"/>
|
|
55
|
+
<path data-layer="Unit" data-values="58,60,62,61,64,66,65,68,70,69,72,74" d="M 80 182.5 C 93.3 182.3, 133.3 181.1, 160 181.2 C 186.7 181.3, 213.3 182.4, 240 183.1 C 266.7 183.8, 293.3 184.1, 320 185.6 C 346.7 187.1, 373.3 190.1, 400 191.9 C 426.7 193.7, 453.3 194.8, 480 196.2 C 506.7 197.5, 533.3 198.6, 560 200 C 586.7 201.4, 613.3 202.8, 640 204.4 C 666.7 206, 693.3 207.4, 720 209.4 C 746.7 211.4, 773.3 214.5, 800 216.2 C 826.7 217.9, 853.3 218.1, 880 219.4 C 906.7 220.7, 946.7 223.1, 960 223.8 L 960 316.2 C 946.7 315.1, 906.7 311.7, 880 309.4 C 853.3 307.1, 826.7 304.6, 800 302.5 C 773.3 300.4, 746.7 299.1, 720 296.9 C 693.3 294.7, 666.7 292, 640 289.4 C 613.3 286.8, 586.7 283, 560 281.2 C 533.3 279.4, 506.7 280.4, 480 278.8 C 453.3 277.2, 426.7 274.7, 400 271.9 C 373.3 269.1, 346.7 263.8, 320 261.9 C 293.3 260, 266.7 261.6, 240 260.6 C 213.3 259.7, 186.7 257.1, 160 256.2 C 133.3 255.3, 93.3 255.2, 80 255 Z" fill="rgba(45,49,66,0.78)" stroke="#f5f5f5" stroke-width="1"/>
|
|
56
|
+
<!-- End-to-end FOCAL: the accent marks the editorially focal layer --
|
|
57
|
+
the pipeline whose growth is the story -- and it is also the one
|
|
58
|
+
eating the budget. Every other layer rides the ink-opacity ramp,
|
|
59
|
+
strongest tone on the largest pipeline. -->
|
|
60
|
+
<path data-layer="End-to-end" data-values="12,15,19,26,34,45,58,72,85,96,108,118" d="M 80 167.5 C 93.3 166.7, 133.3 163.8, 160 162.5 C 186.7 161.2, 213.3 161, 240 159.4 C 266.7 157.8, 293.3 154.8, 320 153.1 C 346.7 151.4, 373.3 151.6, 400 149.4 C 426.7 147.2, 453.3 143.7, 480 140 C 506.7 136.3, 533.3 131.8, 560 127.5 C 586.7 123.2, 613.3 118.5, 640 114.4 C 666.7 110.3, 693.3 106.1, 720 103.1 C 746.7 100.1, 773.3 99.3, 800 96.2 C 826.7 93.1, 853.3 87.7, 880 84.4 C 906.7 81.1, 946.7 77.6, 960 76.2 L 960 223.8 C 946.7 223.1, 906.7 220.7, 880 219.4 C 853.3 218.1, 826.7 217.9, 800 216.2 C 773.3 214.5, 746.7 211.4, 720 209.4 C 693.3 207.4, 666.7 206, 640 204.4 C 613.3 202.8, 586.7 201.4, 560 200 C 533.3 198.6, 506.7 197.5, 480 196.2 C 453.3 194.8, 426.7 193.7, 400 191.9 C 373.3 190.1, 346.7 187.1, 320 185.6 C 293.3 184.1, 266.7 183.8, 240 183.1 C 213.3 182.4, 186.7 181.3, 160 181.2 C 133.3 181.1, 93.3 182.3, 80 182.5 Z" fill="#bf4520" stroke="#f5f5f5" stroke-width="1"/>
|
|
61
|
+
<path data-layer="Lint" data-values="12,12,13,12,13,14,13,14,14,15,15,16" d="M 80 152.5 C 93.3 151.7, 133.3 149.1, 160 147.5 C 186.7 145.9, 213.3 144.7, 240 143.1 C 266.7 141.5, 293.3 139.8, 320 138.1 C 346.7 136.4, 373.3 135.7, 400 133.1 C 426.7 130.5, 453.3 126.2, 480 122.5 C 506.7 118.8, 533.3 115.5, 560 111.2 C 586.7 106.9, 613.3 101.2, 640 96.9 C 666.7 92.6, 693.3 88.8, 720 85.6 C 746.7 82.4, 773.3 80.8, 800 77.5 C 826.7 74.2, 853.3 69.1, 880 65.6 C 906.7 62, 946.7 57.8, 960 56.2 L 960 76.2 C 946.7 77.6, 906.7 81.1, 880 84.4 C 853.3 87.7, 826.7 93.1, 800 96.2 C 773.3 99.3, 746.7 100.1, 720 103.1 C 693.3 106.1, 666.7 110.3, 640 114.4 C 613.3 118.5, 586.7 123.2, 560 127.5 C 533.3 131.8, 506.7 136.3, 480 140 C 453.3 143.7, 426.7 147.2, 400 149.4 C 373.3 151.6, 346.7 151.4, 320 153.1 C 293.3 154.8, 266.7 157.8, 240 159.4 C 213.3 161, 186.7 161.2, 160 162.5 C 133.3 163.8, 93.3 166.7, 80 167.5 Z" fill="rgba(45,49,66,0.46)" stroke="#f5f5f5" stroke-width="1"/>
|
|
62
|
+
|
|
63
|
+
<!-- One landmark, one hairline: the week the end-to-end suite becomes the
|
|
64
|
+
largest pipeline. Nothing else is annotated -- the shape is the story. -->
|
|
65
|
+
<line x1="640" y1="52" x2="640" y2="92" stroke="rgba(45,49,66,0.35)" stroke-width="1"/>
|
|
66
|
+
<text x="640" y="44" fill="#4f5d75" font-size="7" font-family="'Geist Mono', monospace" letter-spacing="0.14em" text-anchor="middle">END-TO-END PASSES UNIT</text>
|
|
67
|
+
|
|
68
|
+
<text data-period="W01" data-index="0" x="80" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W01</text>
|
|
69
|
+
<text data-period="W02" data-index="1" x="160" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W02</text>
|
|
70
|
+
<text data-period="W03" data-index="2" x="240" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W03</text>
|
|
71
|
+
<text data-period="W04" data-index="3" x="320" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W04</text>
|
|
72
|
+
<text data-period="W05" data-index="4" x="400" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W05</text>
|
|
73
|
+
<text data-period="W06" data-index="5" x="480" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W06</text>
|
|
74
|
+
<text data-period="W07" data-index="6" x="560" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W07</text>
|
|
75
|
+
<text data-period="W08" data-index="7" x="640" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W08</text>
|
|
76
|
+
<text data-period="W09" data-index="8" x="720" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W09</text>
|
|
77
|
+
<text data-period="W10" data-index="9" x="800" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W10</text>
|
|
78
|
+
<text data-period="W11" data-index="10" x="880" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W11</text>
|
|
79
|
+
<text data-period="W12" data-index="11" x="960" y="440" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.08em" text-anchor="middle">W12</text>
|
|
80
|
+
|
|
81
|
+
<!-- Legend -->
|
|
82
|
+
<line x1="40" y1="462" x2="960" y2="462" stroke="rgba(45,49,66,0.10)" stroke-width="0.8"/>
|
|
83
|
+
<text x="40" y="478" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">LEGEND</text>
|
|
84
|
+
<text x="960" y="478" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.06em" text-anchor="end">BUILD MINUTES PER WEEK BY PIPELINE · WEEKLY BUCKETS · SYMMETRIC BASELINE, ENVELOPE HEIGHT = WEEKLY TOTAL · ILLUSTRATIVE FIGURES, NOT A MEASURED PROJECT</text>
|
|
85
|
+
|
|
86
|
+
<rect x="40" y="488" width="16" height="8" fill="#bf4520"/>
|
|
87
|
+
<text data-layer="End-to-end" data-total="688" x="64" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">End-to-end · 688 min · focal</text>
|
|
88
|
+
<rect x="264" y="488" width="16" height="8" fill="rgba(45,49,66,0.78)"/>
|
|
89
|
+
<text data-layer="Unit" data-total="789" x="288" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Unit · 789 min</text>
|
|
90
|
+
<rect x="424" y="488" width="16" height="8" fill="rgba(45,49,66,0.62)"/>
|
|
91
|
+
<text data-layer="Integration" data-total="572" x="448" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Integration · 572 min</text>
|
|
92
|
+
<rect x="624" y="488" width="16" height="8" fill="rgba(45,49,66,0.46)"/>
|
|
93
|
+
<text data-layer="Lint" data-total="163" x="648" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Lint · 163 min</text>
|
|
94
|
+
<rect x="784" y="488" width="16" height="8" fill="rgba(45,49,66,0.30)"/>
|
|
95
|
+
<text data-layer="Docs" data-total="76" x="808" y="496" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Docs · 76 min · paused</text>
|
|
96
|
+
</svg>
|
|
97
|
+
</div>
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|
|
@@ -0,0 +1,172 @@
|
|
|
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>Publishing an article · Swimlane</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">Swimlane · Diagram Design</p>
|
|
59
|
+
<h1>Publishing an article</h1>
|
|
60
|
+
|
|
61
|
+
<svg viewBox="0 0 1000 480" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="swimlane-title swimlane-desc">
|
|
62
|
+
<title id="swimlane-title">Publishing an article</title>
|
|
63
|
+
<desc id="swimlane-desc">Swimlane diagram showing an article moving from MDX draft through review, editing, approval, build, and Cloudflare Pages deployment.</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
|
+
<marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#4f5d75"/></marker>
|
|
69
|
+
<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>
|
|
70
|
+
</defs>
|
|
71
|
+
|
|
72
|
+
<rect width="100%" height="100%" fill="#f5f5f5"/>
|
|
73
|
+
<rect width="100%" height="100%" fill="url(#dots)" opacity="0.55"/>
|
|
74
|
+
|
|
75
|
+
<!-- Lane dividers -->
|
|
76
|
+
<line x1="40" y1="80" x2="960" y2="80" stroke="rgba(45,49,66,0.22)" stroke-width="1"/>
|
|
77
|
+
<line x1="40" y1="160" x2="960" y2="160" stroke="rgba(45,49,66,0.10)" stroke-width="1"/>
|
|
78
|
+
<line x1="40" y1="240" x2="960" y2="240" stroke="rgba(45,49,66,0.10)" stroke-width="1"/>
|
|
79
|
+
<line x1="40" y1="320" x2="960" y2="320" stroke="rgba(45,49,66,0.10)" stroke-width="1"/>
|
|
80
|
+
<line x1="40" y1="400" x2="960" y2="400" stroke="rgba(45,49,66,0.22)" stroke-width="1"/>
|
|
81
|
+
|
|
82
|
+
<!-- Actor column divider -->
|
|
83
|
+
<line x1="160" y1="80" x2="160" y2="400" stroke="rgba(45,49,66,0.22)" stroke-width="1"/>
|
|
84
|
+
|
|
85
|
+
<!-- Lane labels -->
|
|
86
|
+
<text x="60" y="124" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.18em">AUTHOR</text>
|
|
87
|
+
<text x="60" y="204" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.18em">REVIEWER</text>
|
|
88
|
+
<text x="60" y="284" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.18em">EDITOR</text>
|
|
89
|
+
<text x="60" y="364" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" letter-spacing="0.18em">CI / CD</text>
|
|
90
|
+
|
|
91
|
+
<!-- Arrows (drawn first) -->
|
|
92
|
+
<!-- 1. Draft → Open PR (within Author) -->
|
|
93
|
+
<line x1="300" y1="120" x2="340" y2="120" stroke="#4f5d75" stroke-width="1.2" marker-end="url(#arrow)"/>
|
|
94
|
+
<!-- 2. Open PR → Review (Author → Reviewer handoff: right edge, one turn, down into Review's top) -->
|
|
95
|
+
<path d="M 460,120 H 512 Q 520,120 520,128 V 176" fill="none" stroke="#4f5d75" stroke-width="1.2" marker-end="url(#arrow)"/>
|
|
96
|
+
<!-- 3. Review → Polish (Reviewer → Editor, vertical down) -->
|
|
97
|
+
<line x1="570" y1="224" x2="570" y2="256" stroke="#4f5d75" stroke-width="1.2" stroke-dasharray="5,4" marker-end="url(#arrow)"/>
|
|
98
|
+
<!-- 4. Polish → Approve (within Editor) -->
|
|
99
|
+
<line x1="640" y1="280" x2="680" y2="280" stroke="#4f5d75" stroke-width="1.2" marker-end="url(#arrow)"/>
|
|
100
|
+
<!-- 5. Approve → Build (Editor → CI/CD, coral handoff, straight down) -->
|
|
101
|
+
<line x1="720" y1="304" x2="720" y2="336" stroke="#bf4520" stroke-width="1.4" marker-end="url(#arrow-accent)"/>
|
|
102
|
+
<!-- 6. Build → Deploy (within CI/CD) -->
|
|
103
|
+
<line x1="760" y1="360" x2="800" y2="360" stroke="#4f5d75" stroke-width="1.2" marker-end="url(#arrow)"/>
|
|
104
|
+
|
|
105
|
+
<!-- Arrow labels -->
|
|
106
|
+
<rect x="528" y="140" width="60" height="12" rx="2" fill="#f5f5f5"/>
|
|
107
|
+
<text x="558" y="150" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.12em">HANDOFF</text>
|
|
108
|
+
|
|
109
|
+
<rect x="578" y="234" width="52" height="12" rx="2" fill="#ececec"/>
|
|
110
|
+
<text x="604" y="244" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.12em">REVISE</text>
|
|
111
|
+
|
|
112
|
+
<rect x="728" y="314" width="80" height="12" rx="2" fill="#f5f5f5"/>
|
|
113
|
+
<text x="768" y="324" fill="#bf4520" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.12em">DEPLOY TRIGGER</text>
|
|
114
|
+
|
|
115
|
+
<!-- Steps -->
|
|
116
|
+
<!-- Author: Draft MDX -->
|
|
117
|
+
<rect x="180" y="96" width="120" height="48" rx="6" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
118
|
+
<text x="240" y="118" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Draft MDX</text>
|
|
119
|
+
<text x="240" y="132" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle">src/content/…</text>
|
|
120
|
+
|
|
121
|
+
<!-- Author: Open PR -->
|
|
122
|
+
<rect x="340" y="96" width="120" height="48" rx="6" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
123
|
+
<text x="400" y="118" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Open PR</text>
|
|
124
|
+
<text x="400" y="132" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle">gh pr create</text>
|
|
125
|
+
|
|
126
|
+
<!-- Reviewer: Review content -->
|
|
127
|
+
<rect x="500" y="176" width="140" height="48" rx="6" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
128
|
+
<text x="570" y="198" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Review content</text>
|
|
129
|
+
<text x="570" y="212" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle">fact-check · voice</text>
|
|
130
|
+
|
|
131
|
+
<!-- Editor: Polish copy -->
|
|
132
|
+
<rect x="500" y="256" width="140" height="48" rx="6" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
133
|
+
<text x="570" y="278" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Polish copy</text>
|
|
134
|
+
<text x="570" y="292" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle">style · line edits</text>
|
|
135
|
+
|
|
136
|
+
<!-- Editor: Approve merge -->
|
|
137
|
+
<rect x="680" y="256" width="140" height="48" rx="6" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
138
|
+
<text x="750" y="278" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Approve merge</text>
|
|
139
|
+
<text x="750" y="292" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle">squash · main</text>
|
|
140
|
+
|
|
141
|
+
<!-- CI/CD: Build -->
|
|
142
|
+
<rect x="680" y="336" width="80" height="48" rx="6" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
143
|
+
<text x="720" y="358" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Build</text>
|
|
144
|
+
<text x="720" y="372" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle">astro build</text>
|
|
145
|
+
|
|
146
|
+
<!-- CI/CD: Deploy (coral focal) -->
|
|
147
|
+
<rect x="800" y="336" width="120" height="48" rx="6" fill="rgba(191,69,32,0.08)" stroke="#bf4520" stroke-width="1"/>
|
|
148
|
+
<text x="860" y="358" fill="#2d3142" font-size="11" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Deploy</text>
|
|
149
|
+
<text x="860" y="372" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle">cloudflare pages</text>
|
|
150
|
+
|
|
151
|
+
<!-- Legend -->
|
|
152
|
+
<line x1="40" y1="428" x2="960" y2="428" stroke="rgba(45,49,66,0.10)" stroke-width="0.8"/>
|
|
153
|
+
<text x="40" y="444" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">LEGEND</text>
|
|
154
|
+
|
|
155
|
+
<rect x="40" y="460" width="14" height="10" rx="2" fill="#ffffff" stroke="#2d3142" stroke-width="1"/>
|
|
156
|
+
<text x="60" y="468" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Step</text>
|
|
157
|
+
|
|
158
|
+
<rect x="132" y="460" width="14" height="10" rx="2" fill="rgba(191,69,32,0.08)" stroke="#bf4520" stroke-width="1"/>
|
|
159
|
+
<text x="152" y="468" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Focal outcome</text>
|
|
160
|
+
|
|
161
|
+
<line x1="268" y1="466" x2="296" y2="466" stroke="#4f5d75" stroke-width="1.2" marker-end="url(#arrow)"/>
|
|
162
|
+
<text x="304" y="468" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Within-lane step</text>
|
|
163
|
+
|
|
164
|
+
<line x1="444" y1="466" x2="472" y2="466" stroke="#4f5d75" stroke-width="1.2" stroke-dasharray="4,3" marker-end="url(#arrow)"/>
|
|
165
|
+
<text x="480" y="468" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Revision loop</text>
|
|
166
|
+
|
|
167
|
+
<line x1="608" y1="466" x2="636" y2="466" stroke="#bf4520" stroke-width="1.4" marker-end="url(#arrow-accent)"/>
|
|
168
|
+
<text x="644" y="468" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Critical handoff</text>
|
|
169
|
+
</svg>
|
|
170
|
+
</div>
|
|
171
|
+
</body>
|
|
172
|
+
</html>
|
|
@@ -0,0 +1,135 @@
|
|
|
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>Product milestones · Timeline</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">Timeline · Diagram Design</p>
|
|
59
|
+
<h1>Product launch · fourteen months</h1>
|
|
60
|
+
|
|
61
|
+
<svg viewBox="0 0 1000 420" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="timeline-title timeline-desc">
|
|
62
|
+
<title id="timeline-title">Product launch · fourteen months</title>
|
|
63
|
+
<desc id="timeline-desc">Timeline showing product milestones from the first post in February 2025 through three design versions and the schematic skill in April 2026.</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
|
+
<!-- Year markers (background) -->
|
|
74
|
+
<text x="60" y="340" fill="rgba(45,49,66,0.06)" font-size="72" font-weight="600" font-family="'Geist Mono', monospace">2025</text>
|
|
75
|
+
<text x="700" y="340" fill="rgba(45,49,66,0.06)" font-size="72" font-weight="600" font-family="'Geist Mono', monospace">2026</text>
|
|
76
|
+
|
|
77
|
+
<!-- Baseline -->
|
|
78
|
+
<line x1="80" y1="240" x2="920" y2="240" stroke="rgba(79,93,117,0.45)" stroke-width="1"/>
|
|
79
|
+
|
|
80
|
+
<!-- Year boundary tick (between 2025 and 2026) -->
|
|
81
|
+
<line x1="680" y1="232" x2="680" y2="248" stroke="rgba(45,49,66,0.20)" stroke-width="1"/>
|
|
82
|
+
<text x="680" y="260" fill="#5a6580" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">JAN '26</text>
|
|
83
|
+
|
|
84
|
+
<!-- Start / end caps -->
|
|
85
|
+
<line x1="80" y1="232" x2="80" y2="248" stroke="rgba(45,49,66,0.20)" stroke-width="1"/>
|
|
86
|
+
<line x1="920" y1="232" x2="920" y2="248" stroke="rgba(45,49,66,0.20)" stroke-width="1"/>
|
|
87
|
+
|
|
88
|
+
<!-- Event 1: FEB 2025 · First post (below) -->
|
|
89
|
+
<line x1="100" y1="240" x2="100" y2="296" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
90
|
+
<circle cx="100" cy="240" r="4" fill="#2d3142"/>
|
|
91
|
+
<text x="100" y="312" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">FEB 2025</text>
|
|
92
|
+
<text x="100" y="328" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">First post</text>
|
|
93
|
+
|
|
94
|
+
<!-- Event 2: APR 2025 · Design v1 (above) -->
|
|
95
|
+
<line x1="240" y1="184" x2="240" y2="240" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
96
|
+
<circle cx="240" cy="240" r="4" fill="#2d3142"/>
|
|
97
|
+
<text x="240" y="156" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">APR 2025</text>
|
|
98
|
+
<text x="240" y="172" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Design v1</text>
|
|
99
|
+
|
|
100
|
+
<!-- Event 3: SEP 2025 · Design v2 (below) -->
|
|
101
|
+
<line x1="500" y1="240" x2="500" y2="296" stroke="rgba(45,49,66,0.30)" stroke-width="1"/>
|
|
102
|
+
<circle cx="500" cy="240" r="4" fill="#2d3142"/>
|
|
103
|
+
<text x="500" y="312" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">SEP 2025</text>
|
|
104
|
+
<text x="500" y="328" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Design v2</text>
|
|
105
|
+
<text x="500" y="344" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">typography pass</text>
|
|
106
|
+
|
|
107
|
+
<!-- Event 4: JAN 2026 · Design v3 (above, coral major) -->
|
|
108
|
+
<line x1="740" y1="160" x2="740" y2="240" stroke="#bf4520" stroke-width="1"/>
|
|
109
|
+
<circle cx="740" cy="240" r="6" fill="#bf4520"/>
|
|
110
|
+
<text x="740" y="128" fill="#bf4520" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">JAN 2026</text>
|
|
111
|
+
<text x="740" y="148" fill="#2d3142" font-size="14" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Design v3</text>
|
|
112
|
+
<text x="740" y="164" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">complexity budget</text>
|
|
113
|
+
|
|
114
|
+
<!-- Event 5: APR 2026 · now · Diagram Design skill (below, coral) -->
|
|
115
|
+
<line x1="900" y1="240" x2="900" y2="296" stroke="#bf4520" stroke-width="1"/>
|
|
116
|
+
<circle cx="900" cy="240" r="6" fill="#bf4520"/>
|
|
117
|
+
<text x="900" y="312" fill="#bf4520" font-size="8" font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.14em">APR 2026 · NOW</text>
|
|
118
|
+
<text x="900" y="328" fill="#2d3142" font-size="12" font-weight="600" font-family="'Geist', sans-serif" text-anchor="middle">Schematic skill</text>
|
|
119
|
+
<text x="900" y="344" fill="#4f5d75" font-size="9" font-family="'Geist Mono', monospace" text-anchor="middle">eight diagram types</text>
|
|
120
|
+
|
|
121
|
+
<!-- Legend -->
|
|
122
|
+
<line x1="40" y1="376" x2="960" y2="376" stroke="rgba(45,49,66,0.10)" stroke-width="0.8"/>
|
|
123
|
+
<text x="40" y="392" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace" letter-spacing="0.18em">LEGEND</text>
|
|
124
|
+
|
|
125
|
+
<circle cx="52" cy="408" r="4" fill="#2d3142"/>
|
|
126
|
+
<text x="68" y="412" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Event</text>
|
|
127
|
+
|
|
128
|
+
<circle cx="148" cy="408" r="6" fill="#bf4520"/>
|
|
129
|
+
<text x="164" y="412" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif">Major milestone</text>
|
|
130
|
+
|
|
131
|
+
<text x="296" y="412" fill="#4f5d75" font-size="8.5" font-family="'Geist', sans-serif" font-style="italic">Spacing is proportional to real elapsed time.</text>
|
|
132
|
+
</svg>
|
|
133
|
+
</div>
|
|
134
|
+
</body>
|
|
135
|
+
</html>
|