From c399e0b43b4bc36fe4d0e87f8addbb42e4ac5b13 Mon Sep 17 00:00:00 2001 From: Marten Veldthuis Date: Fri, 14 Aug 2026 13:33:03 +0200 Subject: [PATCH 1/5] init release policy --- astro.config.mjs | 9 + package-lock.json | 1323 ++++++++++++++++++++-- package.json | 2 + src/content/docs/beleid/releasebeleid.md | 94 ++ 4 files changed, 1318 insertions(+), 110 deletions(-) create mode 100644 src/content/docs/beleid/releasebeleid.md diff --git a/astro.config.mjs b/astro.config.mjs index e4e9333a..54bf7076 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -2,6 +2,7 @@ import { defineConfig } from "astro/config"; import starlight from "@astrojs/starlight"; import starlightLinksValidator from "starlight-links-validator"; +import mermaid from "astro-mermaid"; export default defineConfig({ site: "https://docs.roqua.net", @@ -14,6 +15,9 @@ export default defineConfig({ }, integrations: [ + // Must come before starlight, so it claims mermaid code blocks before + // starlight's syntax highlighting does. + mermaid({ autoTheme: true }), starlight({ plugins: [ starlightLinksValidator({ @@ -93,6 +97,11 @@ export default defineConfig({ translations: { en: "Technical documentation" }, items: [{ autogenerate: { directory: "technical", collapsed: true } }], }, + { + label: "Beleidsinformatie", + translations: { en: "Policies" }, + items: [{ autogenerate: { directory: "beleid", collapsed: true } }], + }, { slug: "status" }, ], }), diff --git a/package-lock.json b/package-lock.json index ab08ec72..b9afb647 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,8 @@ "@astrojs/starlight": "^0.41.4", "@fontsource-variable/roboto": "^5.3.0", "astro": "^7.1.3", + "astro-mermaid": "^2.1.0", + "mermaid": "^11.16.1", "sharp": "^0.35.3" }, "devDependencies": { @@ -22,6 +24,19 @@ "node": ">=20.3.0" } }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@astrojs/check": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.9.tgz", @@ -524,6 +539,12 @@ "node": ">=6.9.0" } }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, "node_modules/@bruits/satteri-darwin-arm64": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", @@ -689,6 +710,12 @@ "node": ">=18" } }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, "node_modules/@clack/core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", @@ -1291,6 +1318,23 @@ "url": "https://github.com/sponsors/ayuhito" } }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1834,6 +1878,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@mermaid-js/parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.0.tgz", + "integrity": "sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==", + "license": "MIT", + "dependencies": { + "@chevrotain/types": "~11.1.2" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", @@ -2381,6 +2434,259 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -2405,6 +2711,12 @@ "@types/estree": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/hast": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", @@ -2475,6 +2787,13 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -2487,6 +2806,16 @@ "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, "node_modules/@volar/kit": { "version": "2.4.28", "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", @@ -2871,6 +3200,27 @@ "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" } }, + "node_modules/astro-mermaid": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/astro-mermaid/-/astro-mermaid-2.1.0.tgz", + "integrity": "sha512-fFRUN0BTZh+DZhDiLyblXoO26XqJ1Rr+qK3JGgSu7OBspKHDm59jkztg/aHsrdo1vO/tIq/+xhP/vgT8Mp92XA==", + "license": "MIT", + "dependencies": { + "import-meta-resolve": "^4.2.0", + "mdast-util-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "peerDependencies": { + "@mermaid-js/layout-elk": "^0.2.0", + "astro": ">=4", + "mermaid": "^10.0.0 || ^11.0.0" + }, + "peerDependenciesMeta": { + "@mermaid-js/layout-elk": { + "optional": true + } + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -3065,153 +3415,676 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", - "engines": { - "node": ">=16" + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/cytoscape": { + "version": "3.34.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.1.tgz", + "integrity": "sha512-Lr0RvH9H75y9ar8h9Toy6u4lxRSCcxUq+hHcQ26sVWo6BnaQp1gwEZOYqwuYTZhyW7npyKnNLP8oJ2p1/3OZ7g==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" } }, - "node_modules/common-ancestor-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", - "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", - "license": "BlueOak-1.0.0", + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, "engines": { - "node": ">= 18" + "node": ">=12" } }, - "node_modules/cookie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", - "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", - "license": "MIT", - "engines": { - "node": ">=22" + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": ">=12" } }, - "node_modules/cookie-es": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", - "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", - "license": "MIT" + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "node_modules/crossws": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", - "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", - "license": "MIT", + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { - "uncrypto": "^0.1.3" + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "d3-array": "2 - 3" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=12" } }, - "node_modules/css-selector-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", - "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "license": "MIT", + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" + "d3-time": "1 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=12" } }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">=12" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { - "css-tree": "~2.2.0" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=12" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", "license": "MIT", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "d3": "^7.9.0", + "lodash-es": "^4.17.21" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" + "node_modules/dayjs": { + "version": "1.11.22", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.22.tgz", + "integrity": "sha512-1YRnxzt/AabP3GHxnaB9/b+ZScCKu5TeF+co+BWG+lnWVIwEcTFc1FVE0WLNmNO3sA6GGXL40i5qkHfbLzpwrg==", + "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", @@ -3249,6 +4122,15 @@ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3367,6 +4249,15 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.13.tgz", + "integrity": "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", @@ -3445,6 +4336,18 @@ "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "license": "MIT" }, + "node_modules/es-toolkit": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.51.0.tgz", + "integrity": "sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types", + "tests/browser-compat" + ] + }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -3812,6 +4715,12 @@ "uncrypto": "^0.1.3" } }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, "node_modules/has-flag": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", @@ -4250,12 +5159,43 @@ } } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/inline-style-parser": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -4394,6 +5334,36 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -4413,6 +5383,12 @@ "node": ">= 8" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, "node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -4662,6 +5638,12 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -4723,6 +5705,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/mdast-util-definitions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", @@ -5052,6 +6046,35 @@ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, + "node_modules/mermaid": { + "version": "11.16.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.16.1.tgz", + "integrity": "sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.2", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.2.0", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.20", + "dompurify": "^3.3.3", + "es-toolkit": "^1.45.1", + "katex": "^0.16.45", + "khroma": "^2.1.0", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + } + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -6059,6 +7082,12 @@ "dev": true, "license": "MIT" }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, "node_modules/piccolore": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", @@ -6083,6 +7112,22 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/postcss": { "version": "8.5.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", @@ -6610,6 +7655,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, "node_modules/rolldown": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", @@ -6643,6 +7694,30 @@ "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/satteri": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", @@ -6914,6 +7989,12 @@ "inline-style-parser": "0.2.7" } }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", @@ -7046,6 +8127,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -7388,6 +8478,19 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", diff --git a/package.json b/package.json index de6c561d..66826e61 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "@astrojs/starlight": "^0.41.4", "@fontsource-variable/roboto": "^5.3.0", "astro": "^7.1.3", + "astro-mermaid": "^2.1.0", + "mermaid": "^11.16.1", "sharp": "^0.35.3" }, "engines": { diff --git a/src/content/docs/beleid/releasebeleid.md b/src/content/docs/beleid/releasebeleid.md new file mode 100644 index 00000000..4af62227 --- /dev/null +++ b/src/content/docs/beleid/releasebeleid.md @@ -0,0 +1,94 @@ +--- +title: Release- en wijzigingscommunicatie +status: draft +--- + +Dit document beschrijft hoe RoQua wijzigingen uitrolt en daarover communiceert met klantorganisaties. Het gaat over de applicaties die eindgebruikers en functioneel beheerders zien; interne infrastructuurwijzigingen zonder gebruikerseffect vallen erbuiten. + + +```mermaid +graph TD + W[Wijziging] --> T{Werkwijze aanpassen
of instructiemateriaal
bijwerken?} + + T -- "Ja: grote feature" --> M[Aankondiging per mail,
met de drie datums] + M --> B[Uitproberen, 2 weken
nieuw naast oud beschikbaar] + B --> C[Nieuw is standaard, 1 week
tijdelijk terug kan nog] + C --> D[Oude versie vervalt] + + T -- "Nee: klein" --> K[Direct uitgerold] + K --> Z{Merken gebruikers
er iets van?} + Z -- Ja --> G[Maandelijkse digest-mail] + Z -- Nee --> S[Geen aparte communicatie] +``` + +## Uitgangspunt: hoe RoQua releaset + +RoQua werkt niet met grote periodieke releases, maar rolt wijzigingen doorlopend in kleine stappen uit - meestal een of enkele keren per week. Elke wijziging wordt door een tweede ontwikkelaar beoordeeld en doorloopt vóór uitrol een uitgebreide geautomatiseerde testsuite. Kleine stappen betekenen: klein risico per stap voor onze klanten, en als er toch iets misgaat is de oorzaak snel gevonden en hersteld. Het halfjaarlijkse "grote release"-risico dat je wellicht van andere leveranciers kent, bestaat in dit model niet. Dit is ook terug te zien in de werkelijkheid: er zijn soms wel storingen, maar die zijn zelden het gevolg van een uitrol van een nieuwe softwareversie. + +## Soorten wijzigingen + +We onderscheiden een aantal verschillende soorten wijzigingen in de applicatie, elk met een eigen aanpak: + + +| Soort | Wat | Communicatie | +|---|---|---| +| **Grote features** | Nieuwe of vernieuwde schermen/functionaliteit die gebruikers merken en waar instructie of training bij kan horen | Aankondiging per mail bij start van de uitrol, met de datums hieronder | +| **Kleine verbeteringen** | Zichtbare maar kleine aanpassingen die geen instructie vergen | Maandelijkse digest-mail | +| **Bugfixes, LCM** | Herstel van fouten, technisch onderhoud (bibliotheek- en platformupdates) | In de digest als gebruikers er iets van merken; anders stil | +| **Vragenlijstwijzigingen** | Eigen releaseproces en cadans (zie hieronder) | Eigen release notes in de applicatie; ook opgenomen in de digest | + +En nog één vaste afspraak: **koppelingen blijven werken.** Wijzigingen aan koppelvlakken (HL7, FHIR, API's) zijn altijd backwards-compatible. De aanpak is: nieuwe route ernaast neerzetten, oude deprecaten, overleggen met de partijen die de koppelingen gebruiken, en de oude route pas verwijderen zodra alle partijen over zijn. + +## Wat is groot of klein? + +De grens tussen "groot" en "klein" bepalen we met deze toets: **moeten gebruikers hun werkwijze aanpassen, of moet functioneel beheer instructiemateriaal of training bijwerken?** Zo ja, dan is het een grote feature. + +Wijzigingen die alleen impact hebben op de RoQua Admin-omgeving, en dus alleen voor beheerders en coördinatoren merkbaar zijn, zullen we eerder als "klein" bestempelen. + +De indeling wordt bepaald door de ontwikkelaar bij de wijziging zelf en gecontroleerd in de collegiale review; bij twijfel kiezen we de zwaardere categorie. + +## Uitrol van grote features + +Waar een grote feature een bestaand scherm vervangt, rollen we uit via een overgangsperiode met drie vaste datums, die alle drie in de aankondiging staan: + +1. **Vanaf de aankondiging: uitproberen (opt-in), 2 weken.** De nieuwe versie is beschikbaar naast de oude. Gebruikers kunnen zelf overstappen ("probeer de nieuwe versie") en terug. Functioneel beheer kan in deze periode schermafbeeldingen en instructiemateriaal maken en de eigen organisatie informeren — de rest van de organisatie merkt nog niets. +2. **Daarna: nieuw is standaard (opt-out), 1 week.** Iedereen krijgt de nieuwe versie; wie tegen een probleem aanloopt kan tijdelijk terug naar de oude versie en meldt het probleem via de helpdesk. +3. **Daarna: oude versie vervalt.** + +Deze termijnen (2 + 1 weken) zijn de standaard; bij zeer ingrijpende wijzigingen kunnen we ruimer plannen — de aankondiging is altijd leidend. + +Afhankelijk van de aard van de feature verloopt de keuze per individuele gebruiker of per organisatie (instelbaar door functioneel beheer). Wijzigingen aan de cliëntomgeving (de inlogpagina, de pagina's voor het invullen van vragenlijsten) gaan per organisatie, we laten niet de cliënt zelf tussen versies springen. + +Incidenteel kan het voorkomen dat het technisch niet mogelijk is om beide versies naast elkaar te hebben, in dat geval komt de aankondiging, met schermafbeeldingen, 2 weken voordat de wijziging uitgerold gaat worden. + +Volledig nieuwe functionaliteit zonder bestaande voorganger kent geen overgangsperiode; die kondigen we aan en activeren we op de genoemde datum. We beperken het aantal features dat tegelijk in een overgangsperiode zit, zodat helpdesk en documentatie bij te houden zijn. + +**Bij problemen** schuiven de datums op; dat melden we via hetzelfde kanaal als de aankondiging. + +## Vragenlijsten + +Vragenlijstwijzigingen staan los van software-uitrol: ze hebben hun eigen releaseproces en een eigen cadans — vragenlijst-updates komen zelfs vaker uit dan softwarewijzigingen. Aanpassingen gebeuren vrijwel altijd op verzoek van een klant; gevalideerde instrumenten worden niet inhoudelijk aangepast. Elke vragenlijstwijziging doorloopt een dubbele review (inhoudelijk én op scoring). Vragenlijsten hebben eigen release notes, die nu al in de applicatie zichtbaar zijn; die nemen we voortaan ook mee in de maandelijkse e-mail. + +## Communicatie en contactbeheer + +- **Alle release notes zijn direct na uitrol te lezen** in de applicatie (tot die functie er is: op https://docs.roqua.net/changelog/roqua/production). Wie wil, kan dus altijd meteen zien wat er veranderd is. +- **Grote features mailen we direct bij de uitrol.** +- Kleine verbeteringen, bugfixes en vragenlijst-updates bundelen we in de maandelijkse digest e-mail (die alleen verschijnt als er iets te melden is). +- **Verzonden aankondigingen passen we achteraf niet stilletjes inhoudelijk aan.** Typefouten verbeteren we direct; inhoudelijke wijzigingen — zoals een verschoven datum — voegen we toe als gedateerde updateregel aan de release note ("Update [datum]: …") en versturen we opnieuw. +- In de RoQua Admin bouwen we een nieuw scherm waarin functioneel beheer zelf de lijst van e-mailadressen beheert die onze releasecommunicatie ontvangen — wie in de lijst staat, krijgt zowel de aankondigingen van grote features als de maandelijkse digest. Dit doen we los van gebruikers-accounts, zodat je ook een gedeelde mailbox of helpdesk-adres kunt opgeven. De beheerpagina toont wie binnen jullie organisatie de mails ontvangt — de organisatie is er zelf verantwoordelijk voor dat de lijst niet leeg raakt. + +## Verantwoordelijkheden + +| Wie | Wat | +|---|---| +| Ontwikkelteam RoQua | Schrijft bij elke gebruikerszichtbare wijziging een release note en bepaalt daarbij de categorie, beide gecontroleerd in de collegiale review (bij twijfel de zwaardere categorie); stelt aankondigingen en digest op; bewaakt de uitroldatums | +| Functioneel beheer klant | Beheert de contactlijst van de eigen organisatie; gebruikt de opt-in-periode voor instructiemateriaal en interne aankondiging | +| Helpdesk RoQua | Neemt probleemmeldingen tijdens de overgangsperiode aan; kan aanleiding zijn om datums op te schuiven | + +## Bewijs van naleving + +*(na implementatie invullen in evidence-index)* Beoogd: release-note-files met PR-reviewhistorie; deploylog (DB-records met deploydatum); verzonden aankondigingen/digests; logging van flag-omzettingen. + +## Ingangsdatum + +Dit beleid gaat in na de feedbackronde met de coördinatoren en vaststelling. De ondersteunende techniek (digest-mail, contactbeheer, in-app notes) bouwen we in de maanden daarna; je ontvangt bericht zodra die live gaat. Tot die tijd blijven de huidige release notes op https://docs.roqua.net/changelog/roqua/production bestaan. From 3f9e1d4fe6f5c6fb87f74cc852be0d60f59e7df9 Mon Sep 17 00:00:00 2001 From: Marten Veldthuis Date: Fri, 14 Aug 2026 20:19:30 +0200 Subject: [PATCH 2/5] Refine the release communication policy - Clarify change categories, rollout phases, and communication channels - Mark the policy and supporting email features as unfinished --- src/content/docs/beleid/releasebeleid.md | 86 ++++++++++++------------ 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/src/content/docs/beleid/releasebeleid.md b/src/content/docs/beleid/releasebeleid.md index 4af62227..65c9bef8 100644 --- a/src/content/docs/beleid/releasebeleid.md +++ b/src/content/docs/beleid/releasebeleid.md @@ -3,21 +3,25 @@ title: Release- en wijzigingscommunicatie status: draft --- +:::caution[Status] +Dit beleid is nog een concept. Ook de ondersteunende techniek is nog in aanbouw: de release notes zijn inmiddels zichtbaar in de RoQua Admin, maar het versturen van e-mails (aankondigingen en het maandoverzicht) en het bijbehorende contactbeheer zijn nog niet gereed. +::: + Dit document beschrijft hoe RoQua wijzigingen uitrolt en daarover communiceert met klantorganisaties. Het gaat over de applicaties die eindgebruikers en functioneel beheerders zien; interne infrastructuurwijzigingen zonder gebruikerseffect vallen erbuiten. ```mermaid graph TD - W[Wijziging] --> T{Werkwijze aanpassen
of instructiemateriaal
bijwerken?} + W[Wijziging] --> T{Moeten gebruikers
nadenken of wennen,
of is instructie nodig?} - T -- "Ja: grote feature" --> M[Aankondiging per mail,
met de drie datums] + T -- "Ja: ingrijpend" --> M[Aankondiging per mail,
met de drie datums] M --> B[Uitproberen, 2 weken
nieuw naast oud beschikbaar] B --> C[Nieuw is standaard, 1 week
tijdelijk terug kan nog] C --> D[Oude versie vervalt] - T -- "Nee: klein" --> K[Direct uitgerold] + T -- "Nee: doorlopende verbetering" --> K[Direct uitgerold] K --> Z{Merken gebruikers
er iets van?} - Z -- Ja --> G[Maandelijkse digest-mail] + Z -- Ja --> G[Maandoverzicht per mail] Z -- Nee --> S[Geen aparte communicatie] ``` @@ -29,66 +33,60 @@ RoQua werkt niet met grote periodieke releases, maar rolt wijzigingen doorlopend We onderscheiden een aantal verschillende soorten wijzigingen in de applicatie, elk met een eigen aanpak: - | Soort | Wat | Communicatie | |---|---|---| -| **Grote features** | Nieuwe of vernieuwde schermen/functionaliteit die gebruikers merken en waar instructie of training bij kan horen | Aankondiging per mail bij start van de uitrol, met de datums hieronder | -| **Kleine verbeteringen** | Zichtbare maar kleine aanpassingen die geen instructie vergen | Maandelijkse digest-mail | -| **Bugfixes, LCM** | Herstel van fouten, technisch onderhoud (bibliotheek- en platformupdates) | In de digest als gebruikers er iets van merken; anders stil | -| **Vragenlijstwijzigingen** | Eigen releaseproces en cadans (zie hieronder) | Eigen release notes in de applicatie; ook opgenomen in de digest | - -En nog één vaste afspraak: **koppelingen blijven werken.** Wijzigingen aan koppelvlakken (HL7, FHIR, API's) zijn altijd backwards-compatible. De aanpak is: nieuwe route ernaast neerzetten, oude deprecaten, overleggen met de partijen die de koppelingen gebruiken, en de oude route pas verwijderen zodra alle partijen over zijn. +| **Ingrijpende wijzigingen** | Nieuwe of vernieuwde schermen/functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, en waar instructie of training bij hoort | Aankondiging per mail bij start van de uitrol, met de datums hieronder | +| **Doorlopende verbeteringen** | Zichtbare aanpassingen waar gebruikers zonder instructie of gewenning mee verder kunnen | Maandoverzicht per e-mail | +| **Bugfixes, LCM** | Herstel van fouten, technisch onderhoud (bibliotheek- en platformupdates) | In het maandoverzicht als gebruikers er iets van merken; anders stil | +| **Koppelvlakwijzigingen** | Wijzigingen aan HL7, FHIR of API's — altijd backwards-compatible: bestaande koppelingen blijven werken | Rechtstreeks overleg met de koppelende partijen; nieuwe route komt naast de oude, de oude vervalt pas als alle partijen over zijn | +| **Vragenlijstwijzigingen** | Eigen releaseproces en cadans (zie hieronder) | Eigen release notes in de applicatie; ook opgenomen in het maandoverzicht | -## Wat is groot of klein? +### Ingrijpende wijzigingen -De grens tussen "groot" en "klein" bepalen we met deze toets: **moeten gebruikers hun werkwijze aanpassen, of moet functioneel beheer instructiemateriaal of training bijwerken?** Zo ja, dan is het een grote feature. +Onder ingrijpende wijzigingen verstaan we nieuwe of vernieuwde schermen of functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, en waar instructie of training bij hoort. Wanneer een uitrol van RoQua een ingrijpende wijziging bevat, dan gaat hierover een mail naar de contactpersonen van de organisatie op het moment van uitrol. -Wijzigingen die alleen impact hebben op de RoQua Admin-omgeving, en dus alleen voor beheerders en coördinatoren merkbaar zijn, zullen we eerder als "klein" bestempelen. +Zo'n ingrijpende wijziging rollen we gefaseerd uit: -De indeling wordt bepaald door de ontwikkelaar bij de wijziging zelf en gecontroleerd in de collegiale review; bij twijfel kiezen we de zwaardere categorie. - -## Uitrol van grote features +1. **Vanaf de uitrol: uitproberen (opt-in), 2 weken.** De nieuwe versie is beschikbaar naast de oude. Gebruikers kunnen zelf overstappen (op het oude scherm staat ergens een knopje "probeer de nieuwe versie"), en ze kunnen ook weer terug naar de oude versie. Functioneel beheer kan in deze periode schermafbeeldingen en instructiemateriaal maken en de eigen organisatie informeren — de rest van de organisatie merkt nog niets. +2. **Daarna: nieuw is standaard (opt-out), 1 week.** Iedereen krijgt standaard de nieuwe versie te zien; wie tegen een probleem aanloopt kan tijdelijk terug naar de oude versie en meldt het probleem via de helpdesk. +3. **Daarna: oude versie vervalt.** -Waar een grote feature een bestaand scherm vervangt, rollen we uit via een overgangsperiode met drie vaste datums, die alle drie in de aankondiging staan: +Deze termijnen (2 + 1 weken) zijn de standaard; waar nodig plannen we ruimer. De precieze datums staan in de aankondiging aangegeven. En als er problemen zijn, schuiven de datums op; dat melden we via hetzelfde kanaal als de aankondiging. -1. **Vanaf de aankondiging: uitproberen (opt-in), 2 weken.** De nieuwe versie is beschikbaar naast de oude. Gebruikers kunnen zelf overstappen ("probeer de nieuwe versie") en terug. Functioneel beheer kan in deze periode schermafbeeldingen en instructiemateriaal maken en de eigen organisatie informeren — de rest van de organisatie merkt nog niets. -2. **Daarna: nieuw is standaard (opt-out), 1 week.** Iedereen krijgt de nieuwe versie; wie tegen een probleem aanloopt kan tijdelijk terug naar de oude versie en meldt het probleem via de helpdesk. -3. **Daarna: oude versie vervalt.** +Normaal gesproken laten we gebruikers zelf de opt-in/out doen, dan kan iedereen een handig moment kiezen. Er zijn wijzigingen denkbaar waarbij het niet handig is dat verschillende gebruikers verschillende interfaces zien, dan kan het een vinkje zijn dat functioneel beheer in de admin instelt. Wijzigingen zichtbaar voor cliënten zullen in elk geval op die manier gaan, we laten niet de cliënt zelf tussen versies springen. -Deze termijnen (2 + 1 weken) zijn de standaard; bij zeer ingrijpende wijzigingen kunnen we ruimer plannen — de aankondiging is altijd leidend. +Incidenteel kan het voorkomen dat het technisch niet mogelijk is om beide versies naast elkaar te hebben, in dat geval komt de aankondiging, met schermafbeeldingen, 2 weken voordat de wijziging uitgerold gaat worden op productie en zorgen we dat het op dat moment al beschikbaar is op de acceptatieomgeving. De uitrol op productie gebeurt dan op de aangekondigde datum, en de overgangsperiode vervalt. -Afhankelijk van de aard van de feature verloopt de keuze per individuele gebruiker of per organisatie (instelbaar door functioneel beheer). Wijzigingen aan de cliëntomgeving (de inlogpagina, de pagina's voor het invullen van vragenlijsten) gaan per organisatie, we laten niet de cliënt zelf tussen versies springen. +Volledig nieuwe functionaliteit zonder bestaande voorganger kent geen overgangsperiode; die kondigen we aan en activeren we op de genoemde datum. We beperken het aantal wijzigingen dat tegelijk in een overgangsperiode zit, zodat helpdesk en documentatie bij te houden zijn. -Incidenteel kan het voorkomen dat het technisch niet mogelijk is om beide versies naast elkaar te hebben, in dat geval komt de aankondiging, met schermafbeeldingen, 2 weken voordat de wijziging uitgerold gaat worden. +:::note[Wanneer is een wijziging ingrijpend?] +In de basis is een wijziging ingrijpend wanneer hij de werkwijze van gebruikers zó verandert dat ze moeten nadenken of wennen om de nieuwe versie te kunnen gebruiken. Een aanpassing die strikt genomen de werkwijze raakt maar waar iedereen zonder uitleg mee verder kan, valt onder de doorlopende verbeteringen. Nieuwe functies zijn meestal niet ingrijpend (als je gewoon niet naar die pagina gaat merk je er verder niets van), een extra formulierveld in een bestaande pagina ook meestal niet, maar een herontwerp van een scherm kan dat wel zijn. -Volledig nieuwe functionaliteit zonder bestaande voorganger kent geen overgangsperiode; die kondigen we aan en activeren we op de genoemde datum. We beperken het aantal features dat tegelijk in een overgangsperiode zit, zodat helpdesk en documentatie bij te houden zijn. +Wijzigingen die alleen impact hebben op de RoQua Admin-omgeving, en dus alleen voor beheerders en coördinatoren merkbaar zijn, zullen we eerder als doorlopende verbetering bestempelen. Het heeft geen zin om coördinatoren tijd te geven om een overstap te begeleiden die ze zelf moeten maken tenslotte. -**Bij problemen** schuiven de datums op; dat melden we via hetzelfde kanaal als de aankondiging. +Zo'n indeling blijft uiteindelijk een inschatting: wat voor de ene organisatie een kleine aanpassing is, kan voor de andere een ingesleten werkwijze raken. Vind je als coördinator dat we een wijziging te licht (of juist te zwaar) hebben ingeschat, dan horen we dat graag via de helpdesk — die terugkoppeling nemen we mee bij de indeling van volgende wijzigingen. +::: -## Vragenlijsten +### Doorlopende verbeteringen -Vragenlijstwijzigingen staan los van software-uitrol: ze hebben hun eigen releaseproces en een eigen cadans — vragenlijst-updates komen zelfs vaker uit dan softwarewijzigingen. Aanpassingen gebeuren vrijwel altijd op verzoek van een klant; gevalideerde instrumenten worden niet inhoudelijk aangepast. Elke vragenlijstwijziging doorloopt een dubbele review (inhoudelijk én op scoring). Vragenlijsten hebben eigen release notes, die nu al in de applicatie zichtbaar zijn; die nemen we voortaan ook mee in de maandelijkse e-mail. +Doorlopende verbeteringen zijn zichtbare aanpassingen waar gebruikers zonder instructie of gewenning mee verder kunnen. Dat kan een kleine wijziging in de interface zijn die van zichzelf duidelijk genoeg is, of een verbetering van de werking van een scherm. Doorlopende verbeteringen worden direct uitgerold; er is geen overgangsperiode. Als gebruikers er iets van merken, nemen we het op in het maandoverzicht per e-mail. -## Communicatie en contactbeheer +### Bugfixes & life-cycle management -- **Alle release notes zijn direct na uitrol te lezen** in de applicatie (tot die functie er is: op https://docs.roqua.net/changelog/roqua/production). Wie wil, kan dus altijd meteen zien wat er veranderd is. -- **Grote features mailen we direct bij de uitrol.** -- Kleine verbeteringen, bugfixes en vragenlijst-updates bundelen we in de maandelijkse digest e-mail (die alleen verschijnt als er iets te melden is). -- **Verzonden aankondigingen passen we achteraf niet stilletjes inhoudelijk aan.** Typefouten verbeteren we direct; inhoudelijke wijzigingen — zoals een verschoven datum — voegen we toe als gedateerde updateregel aan de release note ("Update [datum]: …") en versturen we opnieuw. -- In de RoQua Admin bouwen we een nieuw scherm waarin functioneel beheer zelf de lijst van e-mailadressen beheert die onze releasecommunicatie ontvangen — wie in de lijst staat, krijgt zowel de aankondigingen van grote features als de maandelijkse digest. Dit doen we los van gebruikers-accounts, zodat je ook een gedeelde mailbox of helpdesk-adres kunt opgeven. De beheerpagina toont wie binnen jullie organisatie de mails ontvangt — de organisatie is er zelf verantwoordelijk voor dat de lijst niet leeg raakt. +Bugfixes zijn herstel van fouten, en life-cycle management (LCM) is technisch onderhoud zoals bibliotheek- en platformupdates. Bugfixes en LCM worden direct uitgerold; er is geen overgangsperiode. Als gebruikers er iets van merken, nemen we het op in het maandoverzicht per e-mail. -## Verantwoordelijkheden +### Koppelvlakwijzigingen -| Wie | Wat | -|---|---| -| Ontwikkelteam RoQua | Schrijft bij elke gebruikerszichtbare wijziging een release note en bepaalt daarbij de categorie, beide gecontroleerd in de collegiale review (bij twijfel de zwaardere categorie); stelt aankondigingen en digest op; bewaakt de uitroldatums | -| Functioneel beheer klant | Beheert de contactlijst van de eigen organisatie; gebruikt de opt-in-periode voor instructiemateriaal en interne aankondiging | -| Helpdesk RoQua | Neemt probleemmeldingen tijdens de overgangsperiode aan; kan aanleiding zijn om datums op te schuiven | +Wijzigingen aan HL7, FHIR of API's zijn altijd backwards-compatible: bestaande koppelingen blijven werken. Nieuwe routes komen naast de oude, en de oude route vervalt pas als alle partijen over zijn. Over koppelvlakwijzigingen gaan we rechtstreeks in overleg met de koppelende partijen. -## Bewijs van naleving +### Vragenlijsten -*(na implementatie invullen in evidence-index)* Beoogd: release-note-files met PR-reviewhistorie; deploylog (DB-records met deploydatum); verzonden aankondigingen/digests; logging van flag-omzettingen. +Vragenlijstwijzigingen staan los van software-uitrol: ze hebben hun eigen releaseproces en een eigen cadans — vragenlijst-updates komen zelfs vaker uit dan softwarewijzigingen. Aanpassingen gebeuren vrijwel altijd op verzoek van een klant; gevalideerde instrumenten worden niet inhoudelijk aangepast. Elke vragenlijstwijziging doorloopt een dubbele review (inhoudelijk én op scoring). Vragenlijsten hebben eigen release notes, die nu al in de applicatie zichtbaar zijn; die nemen we voortaan ook mee in het maandoverzicht. -## Ingangsdatum +## Communicatie en contactbeheer -Dit beleid gaat in na de feedbackronde met de coördinatoren en vaststelling. De ondersteunende techniek (digest-mail, contactbeheer, in-app notes) bouwen we in de maanden daarna; je ontvangt bericht zodra die live gaat. Tot die tijd blijven de huidige release notes op https://docs.roqua.net/changelog/roqua/production bestaan. +- **Alle release notes zijn direct na uitrol te lezen** in de applicatie. Wie wil, kan dus altijd meteen zien wat er veranderd is. +- **Ingrijpende wijzigingen mailen we direct bij de start van de uitrol.** +- Doorlopende verbeteringen, bugfixes en vragenlijst-updates bundelen we in het maandoverzicht per e-mail (dat alleen verschijnt als er iets te melden is). +- **Verzonden aankondigingen passen we achteraf niet stilletjes inhoudelijk aan.** Typefouten verbeteren we direct; inhoudelijke wijzigingen — zoals een verschoven datum — voegen we toe als gedateerde updateregel aan de release note ("Update [datum]: …") en versturen we opnieuw. +- In de RoQua Admin bouwen we een nieuw scherm waarin functioneel beheer zelf de lijst van e-mailadressen beheert die onze releasecommunicatie ontvangen — wie in de lijst staat, krijgt zowel de aankondigingen van ingrijpende wijzigingen als het maandoverzicht. Dit doen we los van gebruikers-accounts, zodat je ook een gedeelde mailbox of helpdesk-adres kunt opgeven. De beheerpagina toont wie binnen jullie organisatie de mails ontvangt — de organisatie is er zelf verantwoordelijk voor dat de lijst niet leeg raakt. From 70e060ec3ecf6c7c453f0a66bfc387197c17cd6e Mon Sep 17 00:00:00 2001 From: Marten Veldthuis Date: Sun, 16 Aug 2026 22:20:15 +0200 Subject: [PATCH 3/5] Refine further --- src/content/docs/beleid/releasebeleid.md | 34 +++++++++++++----------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/content/docs/beleid/releasebeleid.md b/src/content/docs/beleid/releasebeleid.md index 65c9bef8..8dd29900 100644 --- a/src/content/docs/beleid/releasebeleid.md +++ b/src/content/docs/beleid/releasebeleid.md @@ -9,33 +9,31 @@ Dit beleid is nog een concept. Ook de ondersteunende techniek is nog in aanbouw: Dit document beschrijft hoe RoQua wijzigingen uitrolt en daarover communiceert met klantorganisaties. Het gaat over de applicaties die eindgebruikers en functioneel beheerders zien; interne infrastructuurwijzigingen zonder gebruikerseffect vallen erbuiten. - ```mermaid graph TD - W[Wijziging] --> T{Moeten gebruikers
nadenken of wennen,
of is instructie nodig?} + W[Uitrol] --> T{Moeten gebruikers
nadenken of wennen,
of is instructie nodig?} - T -- "Ja: ingrijpend" --> M[Aankondiging per mail,
met de drie datums] - M --> B[Uitproberen, 2 weken
nieuw naast oud beschikbaar] - B --> C[Nieuw is standaard, 1 week
tijdelijk terug kan nog] + T -- "Ja: ingrijpend" --> M[Melding per mail] + M --> B[2 weken #quot;oud#quot; is standaard
wijziging is uit te proberen] + B --> C[1 week #quot;nieuw#quot; is standaard] C --> D[Oude versie vervalt] - T -- "Nee: doorlopende verbetering" --> K[Direct uitgerold] - K --> Z{Merken gebruikers
er iets van?} + T -- "Nee: doorlopende verbetering" --> Z{Merken gebruikers
er iets van?} Z -- Ja --> G[Maandoverzicht per mail] Z -- Nee --> S[Geen aparte communicatie] ``` ## Uitgangspunt: hoe RoQua releaset -RoQua werkt niet met grote periodieke releases, maar rolt wijzigingen doorlopend in kleine stappen uit - meestal een of enkele keren per week. Elke wijziging wordt door een tweede ontwikkelaar beoordeeld en doorloopt vóór uitrol een uitgebreide geautomatiseerde testsuite. Kleine stappen betekenen: klein risico per stap voor onze klanten, en als er toch iets misgaat is de oorzaak snel gevonden en hersteld. Het halfjaarlijkse "grote release"-risico dat je wellicht van andere leveranciers kent, bestaat in dit model niet. Dit is ook terug te zien in de werkelijkheid: er zijn soms wel storingen, maar die zijn zelden het gevolg van een uitrol van een nieuwe softwareversie. +RoQua werkt niet met grote periodieke releases, maar rolt wijzigingen regelmatig in kleine stappen uit. Elke wijziging wordt door een tweede ontwikkelaar beoordeeld en doorloopt vóór uitrol een uitgebreide geautomatiseerde testsuite. Kleine stappen betekenen: klein risico per stap voor onze klanten, en als er toch iets misgaat, is de oorzaak snel gevonden en hersteld. Dit is ook terug te zien in de werkelijkheid: er zijn soms wel storingen, maar die zijn zelden het gevolg van een uitrol van een nieuwe softwareversie. ## Soorten wijzigingen -We onderscheiden een aantal verschillende soorten wijzigingen in de applicatie, elk met een eigen aanpak: +We onderscheiden een aantal verschillende soorten wijzigingen in de applicatie, elk met een eigen aanpak. Hieronder een kort overzicht, in de secties daaronder gaan we uitgebreider in op de werkwijze per soort wijziging. | Soort | Wat | Communicatie | |---|---|---| -| **Ingrijpende wijzigingen** | Nieuwe of vernieuwde schermen/functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, en waar instructie of training bij hoort | Aankondiging per mail bij start van de uitrol, met de datums hieronder | +| **Ingrijpende wijzigingen** | Nieuwe of vernieuwde schermen/functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, en waar instructie of training bij hoort | Melding direct na uitrol met informatie over het migratietraject | | **Doorlopende verbeteringen** | Zichtbare aanpassingen waar gebruikers zonder instructie of gewenning mee verder kunnen | Maandoverzicht per e-mail | | **Bugfixes, LCM** | Herstel van fouten, technisch onderhoud (bibliotheek- en platformupdates) | In het maandoverzicht als gebruikers er iets van merken; anders stil | | **Koppelvlakwijzigingen** | Wijzigingen aan HL7, FHIR of API's — altijd backwards-compatible: bestaande koppelingen blijven werken | Rechtstreeks overleg met de koppelende partijen; nieuwe route komt naast de oude, de oude vervalt pas als alle partijen over zijn | @@ -48,14 +46,14 @@ Onder ingrijpende wijzigingen verstaan we nieuwe of vernieuwde schermen of funct Zo'n ingrijpende wijziging rollen we gefaseerd uit: 1. **Vanaf de uitrol: uitproberen (opt-in), 2 weken.** De nieuwe versie is beschikbaar naast de oude. Gebruikers kunnen zelf overstappen (op het oude scherm staat ergens een knopje "probeer de nieuwe versie"), en ze kunnen ook weer terug naar de oude versie. Functioneel beheer kan in deze periode schermafbeeldingen en instructiemateriaal maken en de eigen organisatie informeren — de rest van de organisatie merkt nog niets. -2. **Daarna: nieuw is standaard (opt-out), 1 week.** Iedereen krijgt standaard de nieuwe versie te zien; wie tegen een probleem aanloopt kan tijdelijk terug naar de oude versie en meldt het probleem via de helpdesk. +2. **Daarna: nieuw is standaard (opt-out), 1 week.** Iedereen krijgt standaard de nieuwe versie te zien; wie tegen een probleem aanloopt, kan tijdelijk terug naar de oude versie en meldt het probleem via de helpdesk. 3. **Daarna: oude versie vervalt.** Deze termijnen (2 + 1 weken) zijn de standaard; waar nodig plannen we ruimer. De precieze datums staan in de aankondiging aangegeven. En als er problemen zijn, schuiven de datums op; dat melden we via hetzelfde kanaal als de aankondiging. Normaal gesproken laten we gebruikers zelf de opt-in/out doen, dan kan iedereen een handig moment kiezen. Er zijn wijzigingen denkbaar waarbij het niet handig is dat verschillende gebruikers verschillende interfaces zien, dan kan het een vinkje zijn dat functioneel beheer in de admin instelt. Wijzigingen zichtbaar voor cliënten zullen in elk geval op die manier gaan, we laten niet de cliënt zelf tussen versies springen. -Incidenteel kan het voorkomen dat het technisch niet mogelijk is om beide versies naast elkaar te hebben, in dat geval komt de aankondiging, met schermafbeeldingen, 2 weken voordat de wijziging uitgerold gaat worden op productie en zorgen we dat het op dat moment al beschikbaar is op de acceptatieomgeving. De uitrol op productie gebeurt dan op de aangekondigde datum, en de overgangsperiode vervalt. +Incidenteel kan het voorkomen dat het technisch niet mogelijk is om beide versies naast elkaar te hebben. In dat geval komt de aankondiging, met schermafbeeldingen, 2 weken voordat de wijziging uitgerold gaat worden op productie en zorgen we dat het op dat moment al beschikbaar is op de acceptatieomgeving. De uitrol op productie gebeurt dan op de aangekondigde datum, en de overgangsperiode vervalt. Volledig nieuwe functionaliteit zonder bestaande voorganger kent geen overgangsperiode; die kondigen we aan en activeren we op de genoemde datum. We beperken het aantal wijzigingen dat tegelijk in een overgangsperiode zit, zodat helpdesk en documentatie bij te houden zijn. @@ -73,11 +71,17 @@ Doorlopende verbeteringen zijn zichtbare aanpassingen waar gebruikers zonder ins ### Bugfixes & life-cycle management -Bugfixes zijn herstel van fouten, en life-cycle management (LCM) is technisch onderhoud zoals bibliotheek- en platformupdates. Bugfixes en LCM worden direct uitgerold; er is geen overgangsperiode. Als gebruikers er iets van merken, nemen we het op in het maandoverzicht per e-mail. +Bugfixes zijn herstel van fouten, en life-cycle management (LCM) is technisch onderhoud zoals bibliotheek- en platformupdates. Bugfixes en LCM worden direct uitgerold; er is geen overgangsperiode. Als gebruikers er iets van merken, nemen we het op in het maandoverzicht per e-mail. + +Security fixes worden indien nodig gecommuniceerd via de CISO van uw organisatie. ### Koppelvlakwijzigingen -Wijzigingen aan HL7, FHIR of API's zijn altijd backwards-compatible: bestaande koppelingen blijven werken. Nieuwe routes komen naast de oude, en de oude route vervalt pas als alle partijen over zijn. Over koppelvlakwijzigingen gaan we rechtstreeks in overleg met de koppelende partijen. +Wijzigingen aan HL7, FHIR of API's zijn altijd backwards-compatible: bestaande koppelingen blijven werken. Als we toch wijzigingen willen doorvoeren die niet backwards-compatible zijn, communiceren we dat tijdig met de betrokken partijen. Nieuwe routes komen naast de oude, en de oude route vervalt pas als alle partijen over zijn. + +De SQLite exports van RoQua zijn eveneens backwards-compatible: de kolommen in de export blijven bestaan, en nieuwe kolommen worden toegevoegd. Als we een wijziging willen doorvoeren die niet backwards-compatible is, brengen we hiervoor eerst een nieuwe versie uit parallel naast de oude, en de oude versie vervalt pas na een overgangsperiode en in overleg met de betrokken partijen. + +De CSV exports van RoQua zijn niet backwards-compatible: kolommen kunnen vervallen. In de praktijk komt dit echter zeer zelden voor. Ook bevat de export documentatie over de kolommen en hun betekenis, en scripts waarmee het huidige formaat in SPSS ingelezen kan worden. RoQua verwacht van betrokken partijen dat ze werken op basis van kolomnaam, niet kolompositie, zodat het invoegen van een extra kolom geen probleem is. ### Vragenlijsten @@ -88,5 +92,5 @@ Vragenlijstwijzigingen staan los van software-uitrol: ze hebben hun eigen releas - **Alle release notes zijn direct na uitrol te lezen** in de applicatie. Wie wil, kan dus altijd meteen zien wat er veranderd is. - **Ingrijpende wijzigingen mailen we direct bij de start van de uitrol.** - Doorlopende verbeteringen, bugfixes en vragenlijst-updates bundelen we in het maandoverzicht per e-mail (dat alleen verschijnt als er iets te melden is). -- **Verzonden aankondigingen passen we achteraf niet stilletjes inhoudelijk aan.** Typefouten verbeteren we direct; inhoudelijke wijzigingen — zoals een verschoven datum — voegen we toe als gedateerde updateregel aan de release note ("Update [datum]: …") en versturen we opnieuw. +- **Verzonden release notes passen we achteraf niet stilletjes inhoudelijk aan.** Typefouten verbeteren we direct; inhoudelijke wijzigingen — zoals een verschoven datum — voegen we toe als gedateerde updateregel aan de release note ("Update [datum]: …") en versturen we opnieuw. - In de RoQua Admin bouwen we een nieuw scherm waarin functioneel beheer zelf de lijst van e-mailadressen beheert die onze releasecommunicatie ontvangen — wie in de lijst staat, krijgt zowel de aankondigingen van ingrijpende wijzigingen als het maandoverzicht. Dit doen we los van gebruikers-accounts, zodat je ook een gedeelde mailbox of helpdesk-adres kunt opgeven. De beheerpagina toont wie binnen jullie organisatie de mails ontvangt — de organisatie is er zelf verantwoordelijk voor dat de lijst niet leeg raakt. From a75bc7c3877a6efd5aa1b7cfeaedae0372b46a16 Mon Sep 17 00:00:00 2001 From: Marten Veldthuis Date: Mon, 17 Aug 2026 09:43:55 +0200 Subject: [PATCH 4/5] normalize instructie clause --- src/content/docs/beleid/releasebeleid.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/beleid/releasebeleid.md b/src/content/docs/beleid/releasebeleid.md index 8dd29900..10be8fdf 100644 --- a/src/content/docs/beleid/releasebeleid.md +++ b/src/content/docs/beleid/releasebeleid.md @@ -33,7 +33,7 @@ We onderscheiden een aantal verschillende soorten wijzigingen in de applicatie, | Soort | Wat | Communicatie | |---|---|---| -| **Ingrijpende wijzigingen** | Nieuwe of vernieuwde schermen/functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, en waar instructie of training bij hoort | Melding direct na uitrol met informatie over het migratietraject | +| **Ingrijpende wijzigingen** | Nieuwe of vernieuwde schermen/functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, of waar instructie of training bij kan horen | Melding direct na uitrol met informatie over het migratietraject | | **Doorlopende verbeteringen** | Zichtbare aanpassingen waar gebruikers zonder instructie of gewenning mee verder kunnen | Maandoverzicht per e-mail | | **Bugfixes, LCM** | Herstel van fouten, technisch onderhoud (bibliotheek- en platformupdates) | In het maandoverzicht als gebruikers er iets van merken; anders stil | | **Koppelvlakwijzigingen** | Wijzigingen aan HL7, FHIR of API's — altijd backwards-compatible: bestaande koppelingen blijven werken | Rechtstreeks overleg met de koppelende partijen; nieuwe route komt naast de oude, de oude vervalt pas als alle partijen over zijn | @@ -41,7 +41,7 @@ We onderscheiden een aantal verschillende soorten wijzigingen in de applicatie, ### Ingrijpende wijzigingen -Onder ingrijpende wijzigingen verstaan we nieuwe of vernieuwde schermen of functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, en waar instructie of training bij hoort. Wanneer een uitrol van RoQua een ingrijpende wijziging bevat, dan gaat hierover een mail naar de contactpersonen van de organisatie op het moment van uitrol. +Onder ingrijpende wijzigingen verstaan we nieuwe of vernieuwde schermen of functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, of waar instructie of training bij kan horen. Wanneer een uitrol van RoQua een ingrijpende wijziging bevat, dan gaat hierover een mail naar de contactpersonen van de organisatie op het moment van uitrol. Zo'n ingrijpende wijziging rollen we gefaseerd uit: From e7aff4c43d866db186b6a90f4e78e784d4523a92 Mon Sep 17 00:00:00 2001 From: Marten Veldthuis Date: Mon, 17 Aug 2026 10:34:27 +0200 Subject: [PATCH 5/5] Consistent woordgebruik in releasebeleid Overal "melding" i.p.v. "aankondiging" (mail gaat na de deploy, niet vooraf), "e-mail" i.p.v. "mail", tutoyeren (je i.p.v. uw), "RoQua Admin" voluit, en HTML-entity in de bugfixes-kop gerepareerd. Claude-Session: https://claude.ai/code/session_01G2enLmgAyNYm39gEm3DD3s --- src/content/docs/beleid/releasebeleid.md | 28 +++++++++++------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/content/docs/beleid/releasebeleid.md b/src/content/docs/beleid/releasebeleid.md index 10be8fdf..65875814 100644 --- a/src/content/docs/beleid/releasebeleid.md +++ b/src/content/docs/beleid/releasebeleid.md @@ -4,7 +4,7 @@ status: draft --- :::caution[Status] -Dit beleid is nog een concept. Ook de ondersteunende techniek is nog in aanbouw: de release notes zijn inmiddels zichtbaar in de RoQua Admin, maar het versturen van e-mails (aankondigingen en het maandoverzicht) en het bijbehorende contactbeheer zijn nog niet gereed. +Dit beleid is nog een concept. Ook de ondersteunende techniek is nog in aanbouw: de release notes zijn inmiddels zichtbaar in de RoQua Admin, maar het versturen van e-mails (meldingen en het maandoverzicht) en het bijbehorende contactbeheer zijn nog niet gereed. ::: Dit document beschrijft hoe RoQua wijzigingen uitrolt en daarover communiceert met klantorganisaties. Het gaat over de applicaties die eindgebruikers en functioneel beheerders zien; interne infrastructuurwijzigingen zonder gebruikerseffect vallen erbuiten. @@ -13,13 +13,13 @@ Dit document beschrijft hoe RoQua wijzigingen uitrolt en daarover communiceert m graph TD W[Uitrol] --> T{Moeten gebruikers
nadenken of wennen,
of is instructie nodig?} - T -- "Ja: ingrijpend" --> M[Melding per mail] + T -- "Ja: ingrijpend" --> M[Melding per e-mail] M --> B[2 weken #quot;oud#quot; is standaard
wijziging is uit te proberen] B --> C[1 week #quot;nieuw#quot; is standaard] C --> D[Oude versie vervalt] T -- "Nee: doorlopende verbetering" --> Z{Merken gebruikers
er iets van?} - Z -- Ja --> G[Maandoverzicht per mail] + Z -- Ja --> G[Maandoverzicht per e-mail] Z -- Nee --> S[Geen aparte communicatie] ``` @@ -41,7 +41,7 @@ We onderscheiden een aantal verschillende soorten wijzigingen in de applicatie, ### Ingrijpende wijzigingen -Onder ingrijpende wijzigingen verstaan we nieuwe of vernieuwde schermen of functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, of waar instructie of training bij kan horen. Wanneer een uitrol van RoQua een ingrijpende wijziging bevat, dan gaat hierover een mail naar de contactpersonen van de organisatie op het moment van uitrol. +Onder ingrijpende wijzigingen verstaan we nieuwe of vernieuwde schermen of functionaliteit waar gebruikers over moeten nadenken of aan moeten wennen, of waar instructie of training bij kan horen. Wanneer een uitrol van RoQua een ingrijpende wijziging bevat, dan gaat hierover een e-mail naar de contactpersonen van de organisatie op het moment van uitrol. Zo'n ingrijpende wijziging rollen we gefaseerd uit: @@ -49,13 +49,13 @@ Zo'n ingrijpende wijziging rollen we gefaseerd uit: 2. **Daarna: nieuw is standaard (opt-out), 1 week.** Iedereen krijgt standaard de nieuwe versie te zien; wie tegen een probleem aanloopt, kan tijdelijk terug naar de oude versie en meldt het probleem via de helpdesk. 3. **Daarna: oude versie vervalt.** -Deze termijnen (2 + 1 weken) zijn de standaard; waar nodig plannen we ruimer. De precieze datums staan in de aankondiging aangegeven. En als er problemen zijn, schuiven de datums op; dat melden we via hetzelfde kanaal als de aankondiging. +Deze termijnen (2 + 1 weken) zijn de standaard; waar nodig plannen we ruimer. De precieze datums staan in de melding aangegeven. En als er problemen zijn, schuiven de datums op; dat laten we weten via hetzelfde kanaal als de melding. -Normaal gesproken laten we gebruikers zelf de opt-in/out doen, dan kan iedereen een handig moment kiezen. Er zijn wijzigingen denkbaar waarbij het niet handig is dat verschillende gebruikers verschillende interfaces zien, dan kan het een vinkje zijn dat functioneel beheer in de admin instelt. Wijzigingen zichtbaar voor cliënten zullen in elk geval op die manier gaan, we laten niet de cliënt zelf tussen versies springen. +Normaal gesproken laten we gebruikers zelf de opt-in/out doen, dan kan iedereen een handig moment kiezen. Er zijn wijzigingen denkbaar waarbij het niet handig is dat verschillende gebruikers verschillende interfaces zien, dan kan het een vinkje zijn dat functioneel beheer in de RoQua Admin instelt. Wijzigingen zichtbaar voor cliënten zullen in elk geval op die manier gaan, we laten niet de cliënt zelf tussen versies springen. -Incidenteel kan het voorkomen dat het technisch niet mogelijk is om beide versies naast elkaar te hebben. In dat geval komt de aankondiging, met schermafbeeldingen, 2 weken voordat de wijziging uitgerold gaat worden op productie en zorgen we dat het op dat moment al beschikbaar is op de acceptatieomgeving. De uitrol op productie gebeurt dan op de aangekondigde datum, en de overgangsperiode vervalt. +Incidenteel kan het voorkomen dat het technisch niet mogelijk is om beide versies naast elkaar te hebben. In dat geval komt de melding, met schermafbeeldingen, 2 weken voordat de wijziging uitgerold gaat worden op productie en zorgen we dat het op dat moment al beschikbaar is op de acceptatieomgeving. De uitrol op productie gebeurt dan op de aangekondigde datum, en de overgangsperiode vervalt. -Volledig nieuwe functionaliteit zonder bestaande voorganger kent geen overgangsperiode; die kondigen we aan en activeren we op de genoemde datum. We beperken het aantal wijzigingen dat tegelijk in een overgangsperiode zit, zodat helpdesk en documentatie bij te houden zijn. +Volledig nieuwe functionaliteit zonder bestaande voorganger kent geen overgangsperiode; daarover sturen we een melding en we activeren de functionaliteit op de genoemde datum. We beperken het aantal wijzigingen dat tegelijk in een overgangsperiode zit, zodat helpdesk en documentatie bij te houden zijn. :::note[Wanneer is een wijziging ingrijpend?] In de basis is een wijziging ingrijpend wanneer hij de werkwijze van gebruikers zó verandert dat ze moeten nadenken of wennen om de nieuwe versie te kunnen gebruiken. Een aanpassing die strikt genomen de werkwijze raakt maar waar iedereen zonder uitleg mee verder kan, valt onder de doorlopende verbeteringen. Nieuwe functies zijn meestal niet ingrijpend (als je gewoon niet naar die pagina gaat merk je er verder niets van), een extra formulierveld in een bestaande pagina ook meestal niet, maar een herontwerp van een scherm kan dat wel zijn. @@ -69,11 +69,11 @@ Zo'n indeling blijft uiteindelijk een inschatting: wat voor de ene organisatie e Doorlopende verbeteringen zijn zichtbare aanpassingen waar gebruikers zonder instructie of gewenning mee verder kunnen. Dat kan een kleine wijziging in de interface zijn die van zichzelf duidelijk genoeg is, of een verbetering van de werking van een scherm. Doorlopende verbeteringen worden direct uitgerold; er is geen overgangsperiode. Als gebruikers er iets van merken, nemen we het op in het maandoverzicht per e-mail. -### Bugfixes & life-cycle management +### Bugfixes & life-cycle management Bugfixes zijn herstel van fouten, en life-cycle management (LCM) is technisch onderhoud zoals bibliotheek- en platformupdates. Bugfixes en LCM worden direct uitgerold; er is geen overgangsperiode. Als gebruikers er iets van merken, nemen we het op in het maandoverzicht per e-mail. -Security fixes worden indien nodig gecommuniceerd via de CISO van uw organisatie. +Security fixes worden indien nodig gecommuniceerd via de CISO van je organisatie. ### Koppelvlakwijzigingen @@ -89,8 +89,6 @@ Vragenlijstwijzigingen staan los van software-uitrol: ze hebben hun eigen releas ## Communicatie en contactbeheer -- **Alle release notes zijn direct na uitrol te lezen** in de applicatie. Wie wil, kan dus altijd meteen zien wat er veranderd is. -- **Ingrijpende wijzigingen mailen we direct bij de start van de uitrol.** -- Doorlopende verbeteringen, bugfixes en vragenlijst-updates bundelen we in het maandoverzicht per e-mail (dat alleen verschijnt als er iets te melden is). -- **Verzonden release notes passen we achteraf niet stilletjes inhoudelijk aan.** Typefouten verbeteren we direct; inhoudelijke wijzigingen — zoals een verschoven datum — voegen we toe als gedateerde updateregel aan de release note ("Update [datum]: …") en versturen we opnieuw. -- In de RoQua Admin bouwen we een nieuw scherm waarin functioneel beheer zelf de lijst van e-mailadressen beheert die onze releasecommunicatie ontvangen — wie in de lijst staat, krijgt zowel de aankondigingen van ingrijpende wijzigingen als het maandoverzicht. Dit doen we los van gebruikers-accounts, zodat je ook een gedeelde mailbox of helpdesk-adres kunt opgeven. De beheerpagina toont wie binnen jullie organisatie de mails ontvangt — de organisatie is er zelf verantwoordelijk voor dat de lijst niet leeg raakt. +In de RoQua Admin bouwen we een nieuw scherm waarin functioneel beheer zelf de lijst van e-mailadressen beheert die onze releasecommunicatie ontvangen — wie in de lijst staat, krijgt zowel de meldingen van ingrijpende wijzigingen als het maandoverzicht. Dit doen we los van gebruikers-accounts, zodat je ook een gedeelde mailbox of helpdesk-adres kunt opgeven. + +De beheerpagina toont wie binnen jullie organisatie de mails ontvangt — de organisatie is er zelf verantwoordelijk voor dat de lijst niet leeg raakt.