)]}'
{
  "log": [
    {
      "commit": "6a4477f8cbeb762e414c81c03da13e9241d48592",
      "tree": "fb86d0c922a6928183466a666c9005af753284cd",
      "parents": [
        "f2c7def9245f0d7c7c4218add4fdb80b909b8a3e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Nov 06 17:28:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 17:28:14 2026 +0100"
      },
      "message": "chore(deps): bump the npm-dependencies group across 1 directory with 6 updates (#274)\n\nBumps the npm-dependencies group with 6 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) | `7.4.2` | `7.4.4` |\n| [@astrojs/markdown-satteri](https://github.com/withastro/astro/tree/HEAD/packages/markdown/satteri) | `0.4.5` | `0.4.6` |\n| [@astrojs/react](https://github.com/withastro/astro/tree/HEAD/packages/integrations/react) | `7.1.1` | `7.1.2` |\n| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.6.5` | `26.6.6` |\n| [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.43.0` | `6.44.0` |\n| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.63.0` | `1.64.0` |\n\n\n\nUpdates `astro` from 7.4.2 to 7.4.4\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/astro@7.4.4/packages/astro)\n\nUpdates `@astrojs/markdown-satteri` from 0.4.5 to 0.4.6\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/satteri/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-satteri@0.4.6/packages/markdown/satteri)\n\nUpdates `@astrojs/react` from 7.1.1 to 7.1.2\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/react/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/react@7.1.2/packages/integrations/react)\n\nUpdates `@types/node` from 26.6.5 to 26.6.6\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\nUpdates `knip` from 6.43.0 to 6.44.0\n- [Release notes](https://github.com/webpro-nl/knip/releases)\n- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.44.0/packages/knip)\n\nUpdates `lucide-react` from 1.63.0 to 1.64.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.64.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: astro\n  dependency-version: 7.4.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/markdown-satteri\"\n  dependency-version: 0.4.6\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/react\"\n  dependency-version: 7.1.2\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@types/node\"\n  dependency-version: 26.6.6\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: knip\n  dependency-version: 6.44.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.64.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f2c7def9245f0d7c7c4218add4fdb80b909b8a3e",
      "tree": "f52e654ce90a5415d98b03813c8ddf4d18ebb07c",
      "parents": [
        "00d30a99a40ca3983911006a8751d04e124af230"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Nov 04 09:41:00 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 09:41:00 2026 +0000"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 2 updates (#272)\n\nBumps the npm-dependencies group with 2 updates: [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) and [postcss](https://github.com/postcss/postcss).\n\n\nUpdates `lucide-react` from 1.61.0 to 1.63.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.63.0/packages/lucide-react)\n\nUpdates `postcss` from 8.5.31 to 8.5.32\n- [Release notes](https://github.com/postcss/postcss/releases)\n- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/postcss/postcss/compare/8.5.31...8.5.32)\n\n---\nupdated-dependencies:\n- dependency-name: lucide-react\n  dependency-version: 1.63.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: postcss\n  dependency-version: 8.5.32\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "00d30a99a40ca3983911006a8751d04e124af230",
      "tree": "0cdf6a1d4146ecac20a3beb044d1a1ee40174c1a",
      "parents": [
        "0dde0a43d00a5b1a21f4ecfd8a13b39d077fd3cd"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Nov 04 09:48:04 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 08:48:04 2026 +0000"
      },
      "message": "Hold satteri at 0.10 until the Astro integration supports newer versions (#271)\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "0dde0a43d00a5b1a21f4ecfd8a13b39d077fd3cd",
      "tree": "44e1fbd0f4797738e3823dcd27c5a1e8d0c68cf5",
      "parents": [
        "f771de945e7c6d10c97f35c947a1bdc6ec2ee5af"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Nov 02 07:55:48 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 07:55:48 2026 +0100"
      },
      "message": "chore(deps): bump apache/infrastructure-actions/website-comment/preview-annotate (#267)\n\nBumps the github-actions group with 1 update: [apache/infrastructure-actions/website-comment/preview-annotate](https://github.com/apache/infrastructure-actions).\n\n\nUpdates `apache/infrastructure-actions/website-comment/preview-annotate` from 1.0.0 to 1.1.0\n- [Commits](https://github.com/apache/infrastructure-actions/compare/65a538352531210f043ebee7cb6f87d3773a73e2...9ef89ae3b50c5a404b06e200efaa6143dad61d83)\n\n---\nupdated-dependencies:\n- dependency-name: apache/infrastructure-actions/website-comment/preview-annotate\n  dependency-version: 1.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f771de945e7c6d10c97f35c947a1bdc6ec2ee5af",
      "tree": "e70f7168d7dcc481636bb58d641838ff94408520",
      "parents": [
        "1d32f648ad3c042af1ef07ebcb4883d3f16e6a66"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Nov 02 07:55:36 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 07:55:36 2026 +0100"
      },
      "message": "chore(deps-dev): bump knip (#268)\n\nBumps the npm-dependencies group with 1 update: [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip).\n\n\nUpdates `knip` from 6.42.1 to 6.43.0\n- [Release notes](https://github.com/webpro-nl/knip/releases)\n- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.43.0/packages/knip)\n\n---\nupdated-dependencies:\n- dependency-name: knip\n  dependency-version: 6.43.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "1d32f648ad3c042af1ef07ebcb4883d3f16e6a66",
      "tree": "61387b1c91f9c9ed439cbb0b4828230a940112f1",
      "parents": [
        "508e605689e617c454688d66809791001d3ff20d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 30 00:43:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 00:43:24 2026 +0100"
      },
      "message": "chore(deps): bump the npm-dependencies group with 6 updates (#266)\n\nBumps the npm-dependencies group with 6 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) | `7.4.1` | `7.4.2` |\n| [@astrojs/check](https://github.com/withastro/astro/tree/HEAD/packages/language-tools/astro-check) | `0.9.11` | `0.9.12` |\n| [@astrojs/markdown-satteri](https://github.com/withastro/astro/tree/HEAD/packages/markdown/satteri) | `0.4.4` | `0.4.5` |\n| [@astrojs/react](https://github.com/withastro/astro/tree/HEAD/packages/integrations/react) | `7.1.0` | `7.1.1` |\n| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.60.0` | `1.61.0` |\n| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.3.4` | `8.3.5` |\n\n\nUpdates `astro` from 7.4.1 to 7.4.2\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/astro@7.4.2/packages/astro)\n\nUpdates `@astrojs/check` from 0.9.11 to 0.9.12\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/language-tools/astro-check/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/check@0.9.12/packages/language-tools/astro-check)\n\nUpdates `@astrojs/markdown-satteri` from 0.4.4 to 0.4.5\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/satteri/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-satteri@0.4.5/packages/markdown/satteri)\n\nUpdates `@astrojs/react` from 7.1.0 to 7.1.1\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/react/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/react@7.1.1/packages/integrations/react)\n\nUpdates `lucide-react` from 1.60.0 to 1.61.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.61.0/packages/lucide-react)\n\nUpdates `vite` from 8.3.4 to 8.3.5\n- [Release notes](https://github.com/vitejs/vite/releases)\n- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)\n- [Commits](https://github.com/vitejs/vite/commits/v8.3.5/packages/vite)\n\n---\nupdated-dependencies:\n- dependency-name: astro\n  dependency-version: 7.4.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/check\"\n  dependency-version: 0.9.12\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/markdown-satteri\"\n  dependency-version: 0.4.5\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/react\"\n  dependency-version: 7.1.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.61.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: vite\n  dependency-version: 8.3.5\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "508e605689e617c454688d66809791001d3ff20d",
      "tree": "7da12a4bdb0b3caab6da5b219e6556cbc737f0e7",
      "parents": [
        "fc7a3d562a2af57c28357bf01445c53e186ed1ee"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 28 03:30:23 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 03:30:23 2026 +0000"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 3 updates (#265)\n\nBumps the npm-dependencies group with 3 updates: [html-validate](https://gitlab.com/html-validate/html-validate), [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) and [postcss-selector-parser](https://github.com/postcss/postcss-selector-parser).\n\n\nUpdates `html-validate` from 11.16.4 to 11.17.0\n- [Release notes](https://gitlab.com/html-validate/html-validate/tags)\n- [Commits](https://gitlab.com/html-validate/html-validate/compare/v11.16.4...v11.17.0)\n\nUpdates `lucide-react` from 1.59.0 to 1.60.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.60.0/packages/lucide-react)\n\nUpdates `postcss-selector-parser` from 7.1.6 to 7.1.7\n- [Release notes](https://github.com/postcss/postcss-selector-parser/releases)\n- [Changelog](https://github.com/postcss/postcss-selector-parser/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/postcss/postcss-selector-parser/compare/7.1.6...7.1.7)\n\n---\nupdated-dependencies:\n- dependency-name: html-validate\n  dependency-version: 11.17.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.60.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: postcss-selector-parser\n  dependency-version: 7.1.7\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "fc7a3d562a2af57c28357bf01445c53e186ed1ee",
      "tree": "54074e6ff4c291782cca17a51ce2f11c6e7d534c",
      "parents": [
        "9cd154a2ead1749a0b2a5f94e8c6595e99d7eebf"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 27 01:46:49 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 01:46:49 2026 +0000"
      },
      "message": "chore(deps): bump the npm-dependencies group with 3 updates (#264)\n\nBumps the npm-dependencies group with 3 updates: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro), [@astrojs/check](https://github.com/withastro/astro/tree/HEAD/packages/language-tools/astro-check) and [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip).\n\n\nUpdates `astro` from 7.4.0 to 7.4.1\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/astro@7.4.1/packages/astro)\n\nUpdates `@astrojs/check` from 0.9.10 to 0.9.11\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/language-tools/astro-check/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/check@0.9.11/packages/language-tools/astro-check)\n\nUpdates `knip` from 6.42.0 to 6.42.1\n- [Release notes](https://github.com/webpro-nl/knip/releases)\n- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.42.1/packages/knip)\n\n---\nupdated-dependencies:\n- dependency-name: astro\n  dependency-version: 7.4.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/check\"\n  dependency-version: 0.9.11\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: knip\n  dependency-version: 6.42.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9cd154a2ead1749a0b2a5f94e8c6595e99d7eebf",
      "tree": "4516d00c3a25aa2ee9bf976890c80f599d07a0d1",
      "parents": [
        "a033be5145f59b693846ebbdd45afbb200c79a50"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Tue Oct 27 02:04:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 01:04:42 2026 +0000"
      },
      "message": "Replace Gemini CLI with Antigravity on the site (#263)\n\nUpstream docs replaced the \"Google Gemini CLI\" install section with\n\"Google Antigravity\" after Google retired Gemini CLI for individual\naccounts. The start page reads its install command from that section,\nso point it, the homepage agent row, llms.txt and the search index at\nAntigravity, and swap the Gemini icon for the official Antigravity one.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "a033be5145f59b693846ebbdd45afbb200c79a50",
      "tree": "0229d7fd4fc16ae7c4a7267b80673efb12f15402",
      "parents": [
        "7d85a38fd1b1f458c6bae00e8f2579f8b7bec9d5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 26 10:57:30 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 10:57:30 2026 +0100"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 4 updates (#262)\n\nBumps the npm-dependencies group with 4 updates: [html-validate](https://gitlab.com/html-validate/html-validate), [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip), [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) and [postcss](https://github.com/postcss/postcss).\n\n\nUpdates `html-validate` from 11.16.2 to 11.16.4\n- [Release notes](https://gitlab.com/html-validate/html-validate/tags)\n- [Commits](https://gitlab.com/html-validate/html-validate/compare/v11.16.2...v11.16.4)\n\nUpdates `knip` from 6.41.0 to 6.42.0\n- [Release notes](https://github.com/webpro-nl/knip/releases)\n- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.42.0/packages/knip)\n\nUpdates `lucide-react` from 1.57.0 to 1.59.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.59.0/packages/lucide-react)\n\nUpdates `postcss` from 8.5.30 to 8.5.31\n- [Release notes](https://github.com/postcss/postcss/releases)\n- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/postcss/postcss/compare/8.5.30...8.5.31)\n\n---\nupdated-dependencies:\n- dependency-name: html-validate\n  dependency-version: 11.16.4\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: knip\n  dependency-version: 6.42.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.59.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: postcss\n  dependency-version: 8.5.31\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7d85a38fd1b1f458c6bae00e8f2579f8b7bec9d5",
      "tree": "0ed38bff9074e19dc78355f8bca0871db7969c3a",
      "parents": [
        "3aa57815b05286334759657955d0a7436a1dd5ce"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sun Oct 25 11:45:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 10:45:38 2026 +0000"
      },
      "message": "Adopt Magpie through the marketplace and add CONTRIBUTING.md (#261)\n\n* Adopt Magpie through the marketplace and add CONTRIBUTING.md\n\nReplace the pinned-snapshot adoption with a marketplace floor: the\nlock now records method: marketplace, a minimum version and the four\nseeded floor plugins, plus the reconciliation stamp for the configured\nrepo-health skills. The committed setup skill copy, its relays and the\nsnapshot-specific .gitignore blocks go; .claude/settings.json is\nun-ignored so the derived plugin wiring can be committed.\n\nPromote the repo-health, fix-workflow and runtime-invocation\nconfiguration and a generated-by commit-attribution policy into\n.apache-magpie-overrides/, and update the Magpie sections of README.md\nand AGENTS.md to match.\n\nAdd a CONTRIBUTING.md adapted from apache/magpie\u0027s for the website:\nwhere changes belong, setup, agent-assisted contributions under the\nmarketplace adoption, the check loop, and PR conventions.\n\nGenerated-by: Claude Opus 5\n\n* Commit the Magpie plugin floor wiring in .claude/settings.json\n\nDerived from .apache-magpie.lock: the apache-magpie marketplace and the four floor plugins, so Claude Code offers them when the repo is trusted.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "3aa57815b05286334759657955d0a7436a1dd5ce",
      "tree": "621fccaee46061c73fdc72bb258a9be99e3cdf00",
      "parents": [
        "164dc5a91fed4b3b23a6585ab84e9bbfdb568eb9"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 19:02:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 17:02:48 2026 +0000"
      },
      "message": "Keep an early hero choice, and retry the dev test\u0027s setup clicks (#259)\n\nThe dev suite\u0027s build-survival test failed on #255, #256 and #258 at its\nfirst click: the trace from #258 shows the click reaching the dot (it takes\nfocus) while the selection stays the server-rendered default, so React was\nnot yet handling events although the island had dropped its ssr attribute.\nThe test\u0027s setup clicks now retry until the choice takes; what survives the\nbuild is still checked strictly.\n\nThe hero\u0027s random first pick, which runs after hydration, could also replace\na choice made before it ran. select() now marks the choice, and the random\npick is skipped once one was made.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "164dc5a91fed4b3b23a6585ab84e9bbfdb568eb9",
      "tree": "dd6e627effb1b089c44294a1c3eaafa3a9128f63",
      "parents": [
        "b15798074df88fd933fe275d5744d548515cda35"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 18:48:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 18:48:32 2026 +0200"
      },
      "message": "Keep the traces of failed browser tests (#258)\n\nPlaywright records a trace, a screenshot and the error context of every\nfailed test, but the browser suites never uploaded them, so a failure such\nas the dev suite\u0027s lost hero click (#255, #256) left only \"Received:\nfalse\" in the log, and could not be reproduced locally. Upload them as an\nartifact when a suite fails, kept for 7 days.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "b15798074df88fd933fe275d5744d548515cda35",
      "tree": "0960025747855850d2a4732830fe1ad3dc999f85",
      "parents": [
        "5b6fe53f048c779b1668cbbd1f9025caf4f4dff4"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 18:40:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 16:40:19 2026 +0000"
      },
      "message": "Wait for the puzzle introduction before measuring workflow slides (#253)\n\n* Wait for the puzzle introduction before measuring workflow slides\n\nThe software workbench introduces its puzzle once, on the first panel that\nis both active and seen. On a slow runner the observer reporting the first\npanel seen can come after the test\u0027s next click, so the introduction plays\non the panel that just slid in, and the check that a slide starts no\npuzzle-fit animation fails (shard 20 of #251: 3 running). settle() now waits\nfor the active panel to be seen and for its puzzle animations to finish, so\nthe slide is measured from rest, as its comment says.\n\nGenerated-by: Claude Opus 5\n\n* Wait for a workflow slide to start before sampling it\n\nOn a slow runner a tab\u0027s slide can start a frame or two after the click,\nand the first sample then found no transform transition (moving: 0, shard\n20 of #253 at 1524). sampleSlide now waits for it in the page, up to two\nseconds, and pauses it in the frame it is found. A panel that does not\nslide still fails the same check.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "5b6fe53f048c779b1668cbbd1f9025caf4f4dff4",
      "tree": "3e36ecb77aac166acdeba193b2c2bbb6e302ba48",
      "parents": [
        "b8fa62be7dcf4cb28fcaeaca48c56884d09d2543"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Oct 24 16:38:15 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 16:38:15 2026 +0000"
      },
      "message": "chore(deps): bump undici from 7.30.0 to 7.30.1 (#256)\n\nBumps [undici](https://github.com/nodejs/undici) from 7.30.0 to 7.30.1.\n- [Release notes](https://github.com/nodejs/undici/releases)\n- [Commits](https://github.com/nodejs/undici/compare/v7.30.0...v7.30.1)\n\n---\nupdated-dependencies:\n- dependency-name: undici\n  dependency-version: 7.30.1\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Jarek Potiuk \u003cjarek@potiuk.com\u003e"
    },
    {
      "commit": "b8fa62be7dcf4cb28fcaeaca48c56884d09d2543",
      "tree": "bc54bbca693be083825dcf34b3ab68493ccfdce3",
      "parents": [
        "e2269899177c5f1e92d31f823010c0c14a42a61b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Oct 24 18:32:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 18:32:47 2026 +0200"
      },
      "message": "chore(deps): bump fast-uri from 3.1.7 to 3.1.9 (#255)\n\nBumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.7 to 3.1.9.\n- [Release notes](https://github.com/fastify/fast-uri/releases)\n- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.7...v3.1.9)\n\n---\nupdated-dependencies:\n- dependency-name: fast-uri\n  dependency-version: 3.1.9\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Jarek Potiuk \u003cjarek@potiuk.com\u003e"
    },
    {
      "commit": "e2269899177c5f1e92d31f823010c0c14a42a61b",
      "tree": "c853a41823fca8d9e607c19c1c90b1f353c2f96b",
      "parents": [
        "16bec59c02fe6349ebee0cf9faa1865fd209c14f"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 15:29:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 13:29:55 2026 +0000"
      },
      "message": "Take the timing races out of the progression tests (#257)\n\nThree progression tests failed on the dev suite today on PRs that changed\nnothing they test, each from waiting on time rather than on the page:\n\n- The transition check polled for 500ms for a 150-400ms transition, which a\n  slow runner can start and finish between polls. Transitions are now\n  recorded as they start, and the reduced-motion check waits for the new\n  content before asserting nothing animates.\n- The arrow-key check read the selection before the wheel scroll had\n  landed, and a scroll-driven sequence moves the selection as it lands. It\n  now waits for scrolling to stop.\n- Each lifecycle scene\u0027s test drove about sixty stage changes in one test,\n  1.1 to 2.1 minutes on the dev server against a two-minute limit. It is\n  split into its controls, wheel scrolling and responsive modes.\n\nEvery assertion is unchanged.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "16bec59c02fe6349ebee0cf9faa1865fd209c14f",
      "tree": "04d1dd0127ddd2db4356aa20a764209ee9cd0525",
      "parents": [
        "9328d0262695b389ddb2cd246a465ed57d1980d1"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 14:45:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:45:48 2026 +0000"
      },
      "message": "Install Playwright\u0027s packages from Ubuntu\u0027s sources only (#254)\n\nThe runner image also lists Microsoft\u0027s and Docker\u0027s apt repositories, and\napt-get update fails the install when any of them errors: a 403 from\npackages.microsoft.com failed shard 6 of #251. None of Playwright\u0027s packages\ncome from them, so drop every source that does not point at Ubuntu\u0027s archive\nor the Azure mirror list.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "9328d0262695b389ddb2cd246a465ed57d1980d1",
      "tree": "6c2efd8f5d056339b7870885ca15df8e5ae8356e",
      "parents": [
        "2d29c635c6e3cb105b48b06ae04b60748144e24c"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 14:35:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:35:00 2026 +0000"
      },
      "message": "Manage the main history ruleset from .asf.yaml again (#252)\n\n#251 meant to replace the main history ruleset with classic protection, but\nthe ruleset was not deleted and classic protection was not created: asfyaml\napparently never recorded main history as its own, as every run after #246\nfailed. List it again, matching what is on GitHub, and drop the unused\nclassic protection, so .asf.yaml describes main as it is.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "2d29c635c6e3cb105b48b06ae04b60748144e24c",
      "tree": "5ce27d362138d9e95fe16a613d7caa6dc4af44e6",
      "parents": [
        "93041a595c893de8b4af5cebc8728ff7cf6cd3f0"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 14:16:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 14:16:13 2026 +0200"
      },
      "message": "Speed up the Playwright install on slow runners (#250)\n\nOn a slow runner, shard 10 of #248 spent ten of its fifteen minutes before\nits first test: nearly three installing the cached packages and almost two\ndownloading browsers. dpkg now skips syncing each file (force-unsafe-io; the\nrunner is thrown away after the job), only the headless shell the suites run\nis installed (--only-shell), and the browser is cached in the workspace,\nkeyed by the Playwright version, alongside the apt cache.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "93041a595c893de8b4af5cebc8728ff7cf6cd3f0",
      "tree": "0caa8cb6af68112fc5de342521aa712e733988c0",
      "parents": [
        "4abc214f8c4f60dc8100b50ee8501998dd0fc834"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 14:08:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 14:08:13 2026 +0200"
      },
      "message": "Require one ci-passed check on main, with a committer bypass and auto-merge (#251)\n\n* Require one ci-passed check on main, and let PRs auto-merge\n\n#246\u0027s \"main checks\" ruleset was never created: GitHub refused the\nmagpie-committers team as a bypass actor, so main has had no required check\nsince. Go back to classic protection, as in apache/magpie, requiring a new\nci-passed job that always runs and fails when any job before it failed or was\ncancelled; build alone could not be required, as a job skipped after a\nfailed need counts as passing. Remove the rulesets, and allow auto-merge.\n\nGenerated-by: Claude Opus 5\n\n* Let committers merge past ci-passed, as in infrastructure-actions\n\nRequire ci-passed through a ruleset whose bypass actors are repository\nroles, not a team: write access may merge a pull request past the checks\n(never push past them), admins always. GitHub refused the magpie-committers\nteam; apache/infrastructure-actions uses the same roles, and its ruleset\nreports a committer can bypass it on pull requests. Classic protection stays\nonly to keep main from being force-pushed or deleted.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "4abc214f8c4f60dc8100b50ee8501998dd0fc834",
      "tree": "613243c033d7ee7c1ee9cda31b66421b942b5534",
      "parents": [
        "fb5bd755c74158f4ebf8689e6cf16975a0fa7d4d"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 13:53:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 13:53:36 2026 +0200"
      },
      "message": "Run previews and browser suites only for PRs that change the site (#248)\n\n* Offer PR previews only when the site\u0027s sources or dependencies change\n\nBump website-comment to v1.1.0 and use its new inputs: preview-artifact\u0027s\npaths skips the upload for a PR that changes none of the site\u0027s sources,\ndocs or dependencies, and preview-publish\u0027s howto: with-preview-artifact\nposts the explainer only where a preview was uploaded, and tells an armed\nPR without one why there is no preview.\n\nGenerated-by: Claude Opus 5\n\n* Run the browser suites only when a PR changes the site or the suites\n\nA changes job decides from the PR\u0027s changed files, against one list of the\nsite\u0027s paths: a preview when the PR changes the site, and the browser suites\nwhen it changes the site or what the suites are made of. A PR touching only\nworkflows or repository settings now skips the 22 browser jobs. The preview\nupload uses the same decision, so the two cannot drift; build waits for it,\nso a failed decision fails the PR rather than skipping its tests. Pushes,\nthe weekly run and dispatches run everything.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "fb5bd755c74158f4ebf8689e6cf16975a0fa7d4d",
      "tree": "84e7a7f33c0d6cc34fb04d5e339b43634636bb31",
      "parents": [
        "4bb6341371a1a0bd101ddac6a21614bc5e0a3e72"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 12:46:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:46:22 2026 +0200"
      },
      "message": "Keep the Playwright apt cache inside the workspace (#249)\n\nactions/cache refuses a path with \u0027..\u0027, so #247\u0027s ../apt-cache/*.deb saved\nnothing (\"Relative pathing \u0027.\u0027 and \u0027..\u0027 is not allowed\"). Inside the\nworkspace is the same relative place on the container and on ubuntu-slim,\nand a relative path is the same literal, and so the same cache version, on\nboth.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "4bb6341371a1a0bd101ddac6a21614bc5e0a3e72",
      "tree": "2b1a367dbf6c42e2f87fc4628f7a88584afb3f6c",
      "parents": [
        "b81c76392cbbb99043d0af2aba3ba3138f4cda05"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Oct 24 12:40:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:40:11 2026 +0200"
      },
      "message": "chore(deps): bump https://github.com/woodruffw/zizmor-pre-commit (#243)\n\nBumps the pre-commit-hooks group with 1 update: [https://github.com/woodruffw/zizmor-pre-commit](https://github.com/woodruffw/zizmor-pre-commit).\n\n\nUpdates `https://github.com/woodruffw/zizmor-pre-commit` from v1.30.1 to 1.31.1\n- [Release notes](https://github.com/woodruffw/zizmor-pre-commit/releases)\n- [Commits](https://github.com/woodruffw/zizmor-pre-commit/compare/fa412071e4f5d44d44f9e365f4676f9df92456a2...c92afdf2c6ca336aaa8f39e2bd8d48f62dbd8e1f)\n\n---\nupdated-dependencies:\n- dependency-name: https://github.com/woodruffw/zizmor-pre-commit\n  dependency-version: 1.31.1\n  dependency-type: direct:production\n  dependency-group: pre-commit-hooks\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b81c76392cbbb99043d0af2aba3ba3138f4cda05",
      "tree": "7140140b2afad26d50addf7e95dfda042766216e",
      "parents": [
        "6d561653519885f2393fd09d5daae0e762489908"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 12:40:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:40:00 2026 +0200"
      },
      "message": "Keep the Playwright apt cache next to the workspace (#247)\n\nactions/cache stores paths relative to the workspace. The cache job\u0027s\ncontainer has its home and workspace at /github/home and /__w/..., ubuntu-slim\nat /home/runner and /home/runner/work/..., so a cache of ~/apt-cache saved in\nthe container unpacked outside apt\u0027s archive on the shards: #244\u0027s shards hit\nthe cache and still downloaded all 27.7 MB. Next to the workspace is the same\nrelative place on both.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "6d561653519885f2393fd09d5daae0e762489908",
      "tree": "23bed65cdab4178d1491f1e48b5ccc762cf7a966",
      "parents": [
        "eb08154859e4a54207053215e29882c226165e7f"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 12:39:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:39:28 2026 +0200"
      },
      "message": "Let committers merge a pull request over failed checks (#246)\n\nMove main\u0027s protection from classic branch protection, which cannot be\nbypassed from .asf.yaml, to two rulesets: one that blocks force-pushes and\ndeletion with no bypass, and one requiring lint and build that the\nmagpie-committers team may bypass through a pull request only. A browser\nshard that times out on a slow Ubuntu mirror then no longer blocks a merge\nthat is otherwise ready.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "eb08154859e4a54207053215e29882c226165e7f",
      "tree": "205a14eec0453ca03c2fe4870e0d42662011ccff",
      "parents": [
        "966a9a12b193b26c870fe9b46ff18cdad7043407"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 24 12:28:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:28:17 2026 +0200"
      },
      "message": "Save the Playwright apt cache with zstd, as the shards restore it (#245)\n\nThe plain ubuntu:24.04 container has no zstd, so actions/cache saved the\napt cache gzip-compressed. ubuntu-slim has zstd, and a cache saved with\nanother compression method has a different version, so every shard missed\nit (#244). Install zstd in the container before the cache steps.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "966a9a12b193b26c870fe9b46ff18cdad7043407",
      "tree": "83955f1e93b796a081b94094b9bae65395c151e4",
      "parents": [
        "011a169f23ba9a8759e907ca32547204353e60e6"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Oct 23 18:05:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 18:05:07 2026 +0200"
      },
      "message": "Only build and deploy on push to main (#241)\n\n* Only build and deploy on push to main, skip lint and browser tests\n\nLint and the browser suites already gate the pull request; rerunning them\nafter merge only delays the deploy.\n\nGenerated-by: Claude Opus 5\n\n* Run the ASF allowlist check on pull requests only\n\nGenerated-by: Claude Opus 5\n\n* Keep the build gated on browser shards that time out\n\nA shard that hits its timeout ends cancelled, not failed, so !failure()\nlet build run, and pass, on a PR whose browser tests had not finished.\nGate on the needs\u0027 results instead.\n\nGenerated-by: Claude Opus 5\n\n* Refresh the Playwright apt cache on main, weekly and on every push\n\nPushes to main no longer run the browser suites, and a pull request\ncannot restore another PR\u0027s cache, so nothing would save the apt cache\non main any more. A small workflow now does, on every push and weekly.\nThe key carries the ISO week so the weekly run saves a fresh entry with\nthat week\u0027s Ubuntu updates, and autoclean drops superseded packages.\nThe install steps move into a composite action both workflows share.\n\nGenerated-by: Claude Opus 5\n\n* Build and deploy main weekly so synced docs stay current\n\nThe site\u0027s docs pages are synced from apache/magpie at build time, so\nwithout a push here the published copy goes stale. The scheduled run\nbuilds and deploys like a push, without lint or the browser suites.\n\nGenerated-by: Claude Opus 5\n\n* Run the full gate in the weekly build of main\n\nThe weekly run now runs lint and the browser suites too, so main is\ntested against the latest synced docs and dependencies. Its browser\nsuites save that week\u0027s apt cache, so the cache workflow no longer\nneeds a schedule of its own.\n\nGenerated-by: Claude Opus 5\n\n* Cancel the build in progress when a newer commit arrives\n\nGenerated-by: Claude Opus 5\n\n* Save the Playwright apt cache from one ubuntu-latest job, weekly\n\nThe cache job ran on ubuntu-slim, so the slow mirror it exists to avoid\ncould time it out at the 15-minute cap. It now runs on ubuntu-latest in\nthe plain ubuntu:24.04 image ubuntu-slim is built from, since the\nubuntu-latest image already has most of the packages and apt would not\ndownload them. It is the only job that saves the cache, weekly ahead of\nthe scheduled build and on pushes; the shards only restore it. It also\nruns on pull requests that change what it runs.\n\nGenerated-by: Claude Opus 5\n\n* Tie the Playwright apt cache to ubuntu-slim\u0027s Ubuntu release\n\nubuntu-slim is not published as an image, so a job on an ubuntu-slim\nrunner now reports which Ubuntu release it is, and the cache job fails\nunless its container is that release. The cache key carries the release\ntoo, so packages are only restored onto the release they were built for.\n\nGenerated-by: Claude Opus 5\n\n* Save the Playwright apt cache on the weekly schedule only\n\nOne weekly job is the cache\u0027s only writer, so the lockfile hash no\nlonger belongs in the key: it only caused misses until the next weekly\nsave. The key is now the Ubuntu release and the ISO week. The job can\nstill be run by hand to seed a missing cache.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "011a169f23ba9a8759e907ca32547204353e60e6",
      "tree": "829e60af8702f31d5c2e98d44e7211fa89c2384f",
      "parents": [
        "bf77b515441159e24dc4e6569501beb9f8b42580"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 23 12:45:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 12:45:09 2026 +0200"
      },
      "message": "chore(deps): bump the npm-dependencies group with 4 updates (#240)\n\nBumps the npm-dependencies group with 4 updates: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro), [@astrojs/markdown-satteri](https://github.com/withastro/astro/tree/HEAD/packages/markdown/satteri), [@astrojs/react](https://github.com/withastro/astro/tree/HEAD/packages/integrations/react) and [@axe-core/playwright](https://github.com/dequelabs/axe-core-npm).\n\n\nUpdates `astro` from 7.3.8 to 7.4.0\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/astro@7.4.0/packages/astro)\n\nUpdates `@astrojs/markdown-satteri` from 0.4.3 to 0.4.4\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/satteri/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-satteri@0.4.4/packages/markdown/satteri)\n\nUpdates `@astrojs/react` from 7.0.1 to 7.1.0\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/react/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/react@7.1.0/packages/integrations/react)\n\nUpdates `@axe-core/playwright` from 4.13.0 to 4.14.0\n- [Release notes](https://github.com/dequelabs/axe-core-npm/releases)\n- [Changelog](https://github.com/dequelabs/axe-core-npm/blob/develop/CHANGELOG.md)\n- [Commits](https://github.com/dequelabs/axe-core-npm/compare/v4.13.0...v4.14.0)\n\n---\nupdated-dependencies:\n- dependency-name: astro\n  dependency-version: 7.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/markdown-satteri\"\n  dependency-version: 0.4.4\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/react\"\n  dependency-version: 7.1.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: \"@axe-core/playwright\"\n  dependency-version: 4.14.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "bf77b515441159e24dc4e6569501beb9f8b42580",
      "tree": "1db976638a8221509b6e7b67e18cfe063d17c270",
      "parents": [
        "68a3938665c8cede0f791f70a5fc4d194e0253aa"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Oct 23 12:31:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 12:31:12 2026 +0200"
      },
      "message": "Cache Playwright\u0027s apt packages so slow mirrors stop timing out shards (#242)\n\nSome runners reach the Ubuntu mirror at ~40 kB/s, so installing\nPlaywright\u0027s ~28 MB of system packages took 10-13 of a shard\u0027s 15\nminutes and the suite was cut off. Keep the downloaded .debs in the\nActions cache so apt installs them locally.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "68a3938665c8cede0f791f70a5fc4d194e0253aa",
      "tree": "3bd083dc0061bf09ac23af0d717ecd0f710521ff",
      "parents": [
        "27c21739fdf790f6074e5d2a21af6a2679489540"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Oct 23 00:03:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 00:03:42 2026 +0200"
      },
      "message": "Use the shared preview actions from apache/infrastructure-actions (#239)\n\nThe PR-preview system that grew in scripts/preview/ was upstreamed as\napache/infrastructure-actions/website-comment (#1332) and tagged v1.0.0.\nSwitch to those actions, pinned by SHA, and delete the local copy and the\nvendored html2canvas-pro that only it used.\n\nEvery local change is carried by the upstream code, which adds hardening\non top (lease-guarded branch deletes, refusal handling, a vouched arming\nrecord for publisher-added labels, latin1-safe injection and more). The\nsite-specific values the local copy hard-coded become inputs:\nsite-name: magpie, generated: src/content/docs/, and reap-head-branches,\nwhich the in-repo publisher always did.\n\n- build.yml: preview-annotate (with its production-output check),\n  preview-main-overlay and preview-artifact replace the local scripts;\n  the build checks out the PR head so diff anchors match stamped lines;\n  the jekyll-adapter job is dropped, as the adapter is tested upstream.\n- preview-publish.yml: the preview-publish action replaces the checkout\n  and script; no checkout remains.\n- astro.config.mjs: load the Vite plugin the action hands over\n  (PREVIEW_ANNOTATE / PREVIEW_VITE_PLUGIN); attributes are now\n  data-preview-src.\n- The workflow-boundary assertions on preview-publish.yml and\n  preview-signal.yml move to scripts/preview-workflows.test.mjs, tightened\n  to the single pinned action and no checkout.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "27c21739fdf790f6074e5d2a21af6a2679489540",
      "tree": "fe8d1739c3288bb61e22512d91718ddb8e507883",
      "parents": [
        "9e4b1e64420e0cdd3221a24ea8be1573b642aae6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 22 16:49:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 16:49:28 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 4 updates (#238)\n\nBumps the npm-dependencies group with 4 updates: [@playwright/test](https://github.com/microsoft/playwright), [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react), [react](https://github.com/react/react/tree/HEAD/packages/react) and [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom).\n\n\nUpdates `@playwright/test` from 1.64.0 to 1.64.1\n- [Release notes](https://github.com/microsoft/playwright/releases)\n- [Commits](https://github.com/microsoft/playwright/compare/v1.64.0...v1.64.1)\n\nUpdates `lucide-react` from 1.56.0 to 1.57.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.57.0/packages/lucide-react)\n\nUpdates `react` from 19.3.0 to 19.3.1\n- [Release notes](https://github.com/react/react/releases)\n- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/react/react/commits/v19.3.1/packages/react)\n\nUpdates `react-dom` from 19.3.0 to 19.3.1\n- [Release notes](https://github.com/react/react/releases)\n- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/react/react/commits/v19.3.1/packages/react-dom)\n\n---\nupdated-dependencies:\n- dependency-name: \"@playwright/test\"\n  dependency-version: 1.64.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.57.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: react\n  dependency-version: 19.3.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: react-dom\n  dependency-version: 19.3.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9e4b1e64420e0cdd3221a24ea8be1573b642aae6",
      "tree": "0ff831e2dbe52eff2dfddb74cc3b6a604e7af1c1",
      "parents": [
        "de896ba7397a80812159b02ecbf9d147642244de"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 21 11:31:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 11:31:04 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group across 1 directory with 2 updates (#237)\n\nBumps the npm-dependencies group with 2 updates in the / directory: [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) and [postcss](https://github.com/postcss/postcss).\n\n\nUpdates `lucide-react` from 1.55.0 to 1.56.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.56.0/packages/lucide-react)\n\nUpdates `postcss` from 8.5.29 to 8.5.30\n- [Release notes](https://github.com/postcss/postcss/releases)\n- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/postcss/postcss/compare/8.5.29...8.5.30)\n\n---\nupdated-dependencies:\n- dependency-name: lucide-react\n  dependency-version: 1.56.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: postcss\n  dependency-version: 8.5.30\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "de896ba7397a80812159b02ecbf9d147642244de",
      "tree": "1cf688a2bc83cb2f4e074076c88b4796eaef4abc",
      "parents": [
        "3a72b19ffcf16cab0968f91ba5f7c2292d6d536b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 11:46:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:46:08 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 3 updates (#235)\n\nBumps the npm-dependencies group with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) and [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).\n\n\nUpdates `@types/node` from 26.6.4 to 26.6.5\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\nUpdates `knip` from 6.40.0 to 6.41.0\n- [Release notes](https://github.com/webpro-nl/knip/releases)\n- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.41.0/packages/knip)\n\nUpdates `lucide-react` from 1.53.0 to 1.55.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.55.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: \"@types/node\"\n  dependency-version: 26.6.5\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: knip\n  dependency-version: 6.41.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.55.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "3a72b19ffcf16cab0968f91ba5f7c2292d6d536b",
      "tree": "34a156f60ceed1ee7d6433b659dce16e1b0abf36",
      "parents": [
        "000841df2c07f5e8bd38c9be208962adafd9b246"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Oct 17 00:04:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 00:04:01 2026 +0100"
      },
      "message": "Add SVG and die-cut downloads to the brand page (#234)\n\nEach bird illustration now offers SVG, PNG and Die-cut downloads, and\nthe Mark and Wordmark gain a Die-cut link. The bird PNGs are re-rendered\nfrom the new vector sources in public/brand/, keeping their 1254 px\ntransparent square so existing page layouts are unchanged. Asset link\nrows now wrap whole links instead of breaking words in narrow cards.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "000841df2c07f5e8bd38c9be208962adafd9b246",
      "tree": "61003b04da9dc38c371ede5c38a2f090d14e37b3",
      "parents": [
        "ae47cd6a2ed5a105da79340c80b7ca8b860db2aa"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 16 06:36:10 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 06:36:10 2026 +0100"
      },
      "message": "chore(deps): bump the github-actions group with 3 updates (#231)\n\n* chore(deps): bump the github-actions group with 3 updates\n\nBumps the github-actions group with 3 updates: [actions/setup-node](https://github.com/actions/setup-node), [actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact).\n\n\nUpdates `actions/setup-node` from 7.0.0 to 7.1.0\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/820762786026740c76f36085b0efc47a31fe5020...949feb2413d6458794dcd2491c4babbbce0c15c1)\n\nUpdates `actions/upload-artifact` from 7.0.1 to 7.0.2\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a...cf430e030ddbb5b0abf93d22962f4752f3646cd9)\n\nUpdates `actions/download-artifact` from 8.0.1 to 8.0.2\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c...9000827ccba6bdab643e8b6fd33ac0654aef8333)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n  dependency-version: 7.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: actions/upload-artifact\n  dependency-version: 7.0.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/download-artifact\n  dependency-version: 8.0.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\n\n* fix(test): poll for CSS transition instead of fixed delay (#231)\n\nThe test \u0027content changes animate subtly and respect reduced motion\u0027 was\nchecking getAnimations() immediately after a click, without waiting for the\nbrowser to start the CSS transition. A fixed requestAnimationFrame delay was\nnot reliable — the transition could already be complete. Replace with\nexpect.poll() that retries until an opacity transition is found within 500ms,\nor times out with a clear failure.\n\nGenerated-by: Junie (Qwen3.6-27B-FP8)\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Jarek Potiuk \u003cjarek@potiuk.com\u003e"
    },
    {
      "commit": "ae47cd6a2ed5a105da79340c80b7ca8b860db2aa",
      "tree": "82e952370f6a7219564d3f093664b97fefcf8909",
      "parents": [
        "5c4258b672cbc7fd7c69772e22a6191aac84eb4d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 16 03:32:05 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 03:32:05 2026 +0100"
      },
      "message": "chore(deps): bump the npm-dependencies group across 1 directory with 8 updates (#233)\n\nBumps the npm-dependencies group with 8 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) | `7.3.5` | `7.3.8` |\n| [@astrojs/markdown-satteri](https://github.com/withastro/astro/tree/HEAD/packages/markdown/satteri) | `0.4.2` | `0.4.3` |\n| [@astrojs/react](https://github.com/withastro/astro/tree/HEAD/packages/integrations/react) | `7.0.0` | `7.0.1` |\n| [@playwright/test](https://github.com/microsoft/playwright) | `1.63.0` | `1.64.0` |\n| [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.39.0` | `6.40.0` |\n| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.52.0` | `1.53.0` |\n| [postcss](https://github.com/postcss/postcss) | `8.5.28` | `8.5.29` |\n| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.3.2` | `8.3.4` |\n\n\n\nUpdates `astro` from 7.3.5 to 7.3.8\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/astro@7.3.8/packages/astro)\n\nUpdates `@astrojs/markdown-satteri` from 0.4.2 to 0.4.3\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/satteri/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-satteri@0.4.3/packages/markdown/satteri)\n\nUpdates `@astrojs/react` from 7.0.0 to 7.0.1\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/react/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/react@7.0.1/packages/integrations/react)\n\nUpdates `@playwright/test` from 1.63.0 to 1.64.0\n- [Release notes](https://github.com/microsoft/playwright/releases)\n- [Commits](https://github.com/microsoft/playwright/compare/v1.63.0...v1.64.0)\n\nUpdates `knip` from 6.39.0 to 6.40.0\n- [Release notes](https://github.com/webpro-nl/knip/releases)\n- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.40.0/packages/knip)\n\nUpdates `lucide-react` from 1.52.0 to 1.53.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.53.0/packages/lucide-react)\n\nUpdates `postcss` from 8.5.28 to 8.5.29\n- [Release notes](https://github.com/postcss/postcss/releases)\n- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/postcss/postcss/compare/8.5.28...8.5.29)\n\nUpdates `vite` from 8.3.2 to 8.3.4\n- [Release notes](https://github.com/vitejs/vite/releases)\n- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)\n- [Commits](https://github.com/vitejs/vite/commits/v8.3.4/packages/vite)\n\n---\nupdated-dependencies:\n- dependency-name: astro\n  dependency-version: 7.3.8\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/markdown-satteri\"\n  dependency-version: 0.4.3\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/react\"\n  dependency-version: 7.0.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@playwright/test\"\n  dependency-version: 1.64.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: knip\n  dependency-version: 6.40.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.53.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: postcss\n  dependency-version: 8.5.29\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: vite\n  dependency-version: 8.3.4\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "5c4258b672cbc7fd7c69772e22a6191aac84eb4d",
      "tree": "11e7e3ec8b3736b86afd3439eeecce831d0fad03",
      "parents": [
        "633c25a2829895c8aade63e1e44aaa87957a47fd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:18:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:18:24 2026 +0100"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 2 updates (#229)\n\nBumps the npm-dependencies group with 2 updates: [html-validate](https://gitlab.com/html-validate/html-validate) and [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).\n\n\nUpdates `html-validate` from 11.16.1 to 11.16.2\n- [Release notes](https://gitlab.com/html-validate/html-validate/tags)\n- [Changelog](https://gitlab.com/html-validate/html-validate/blob/master/CHANGELOG.md)\n- [Commits](https://gitlab.com/html-validate/html-validate/compare/v11.16.1...v11.16.2)\n\nUpdates `lucide-react` from 1.49.0 to 1.52.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.52.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: html-validate\n  dependency-version: 11.16.2\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.52.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "633c25a2829895c8aade63e1e44aaa87957a47fd",
      "tree": "336d39396b5af3df839619f1b633a8d8f8264b04",
      "parents": [
        "0794c7c281e4d0cc847eee6a7bc0176e2e6d11ee"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 09 08:38:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 08:38:31 2026 +0200"
      },
      "message": "chore(deps): bump smol-toml from 1.8.0 to 1.9.0 (#226)\n\nBumps [smol-toml](https://github.com/squirrelchat/smol-toml) from 1.8.0 to 1.9.0.\n- [Release notes](https://github.com/squirrelchat/smol-toml/releases)\n- [Commits](https://github.com/squirrelchat/smol-toml/compare/v1.8.0...v1.9.0)\n\n---\nupdated-dependencies:\n- dependency-name: smol-toml\n  dependency-version: 1.9.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "0794c7c281e4d0cc847eee6a7bc0176e2e6d11ee",
      "tree": "9948a8cb6bf8bb9fc86995bd55f7912f3bb2de6b",
      "parents": [
        "a375fa88f909c4efed3c69e47eb41d016348c62c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 09 08:38:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 08:38:21 2026 +0200"
      },
      "message": "chore(deps): bump sharp from 0.35.4 to 0.35.5 (#227)\n\nBumps [sharp](https://github.com/lovell/sharp) from 0.35.4 to 0.35.5.\n- [Release notes](https://github.com/lovell/sharp/releases)\n- [Commits](https://github.com/lovell/sharp/compare/v0.35.4...v0.35.5)\n\n---\nupdated-dependencies:\n- dependency-name: sharp\n  dependency-version: 0.35.5\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a375fa88f909c4efed3c69e47eb41d016348c62c",
      "tree": "c51da49ffde98ff4baf5d854a0eaaef78c16bc7b",
      "parents": [
        "a634ce5fbe6186da0f9a964ed3f9ce390ec6889d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 09 08:38:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 08:38:09 2026 +0200"
      },
      "message": "chore(deps): bump source-map-js from 1.2.1 to 1.2.2 (#228)\n\nBumps [source-map-js](https://github.com/7rulnik/source-map-js) from 1.2.1 to 1.2.2.\n- [Release notes](https://github.com/7rulnik/source-map-js/releases)\n- [Changelog](https://github.com/7rulnik/source-map-js/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/7rulnik/source-map-js/compare/v1.2.1...v1.2.2)\n\n---\nupdated-dependencies:\n- dependency-name: source-map-js\n  dependency-version: 1.2.2\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a634ce5fbe6186da0f9a964ed3f9ce390ec6889d",
      "tree": "98434838725e367c8a9189a4d1f1f07229b37e5a",
      "parents": [
        "65338fa204328cba6a381d7814bc2c17b6df7a39"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 09 08:16:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 08:16:31 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group across 1 directory with 3 updates (#225)\n\nBumps the npm-dependencies group with 3 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) and [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).\n\n\nUpdates `@types/node` from 26.6.3 to 26.6.4\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\nUpdates `knip` from 6.38.0 to 6.39.0\n- [Release notes](https://github.com/webpro-nl/knip/releases)\n- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.39.0/packages/knip)\n\nUpdates `lucide-react` from 1.48.0 to 1.49.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.49.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: \"@types/node\"\n  dependency-version: 26.6.4\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: knip\n  dependency-version: 6.39.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.49.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "65338fa204328cba6a381d7814bc2c17b6df7a39",
      "tree": "ba0e09d6518d4f270dc79120c49c1e4c8b6dfa68",
      "parents": [
        "59f0101c8d40027ab380fd438c22cb568cb2fe60"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Oct 08 13:08:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 13:08:54 2026 +0200"
      },
      "message": "footer: add LinkedIn and service logos (#224)\n\n* feat(footer): link Apache Magpie on LinkedIn\n\nAdd service marks to external footer destinations. Fix exact-text matching in the tool card test so the full browser suite passes on main.\n\nGenerated-by: Copilot SDK in VS Code\n\nCo-authored-by: Copilot \u003c223556219+Copilot@users.noreply.github.com\u003e\n\n* feat(footer): add icons to explore links\n\nUse the same Lucide icon language as the corresponding site pages, and check each Explore link has an icon in the footer browser test.\n\nGenerated-by: Copilot SDK in VS Code\n\nCo-authored-by: Copilot \u003c223556219+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot \u003c223556219+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "59f0101c8d40027ab380fd438c22cb568cb2fe60",
      "tree": "2530c82c9b2e46d2bfb724e6b82c800b81e146d3",
      "parents": [
        "43212d887d94c3e1d65e4929456758d33a49a653"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 06 00:32:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 00:32:49 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group across 1 directory with 3 updates (#220)\n\n* chore(deps-dev): bump the npm-dependencies group across 1 directory with 3 updates\n\nBumps the npm-dependencies group with 3 updates in the / directory: [@astrojs/markdown-satteri](https://github.com/withastro/astro/tree/HEAD/packages/markdown/satteri), [@astrojs/react](https://github.com/withastro/astro/tree/HEAD/packages/integrations/react) and [html-validate](https://gitlab.com/html-validate/html-validate).\n\n\nUpdates `@astrojs/markdown-satteri` from 0.4.1 to 0.4.2\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/satteri/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-satteri@0.4.2/packages/markdown/satteri)\n\nUpdates `@astrojs/react` from 6.0.6 to 7.0.0\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/react/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/react@7.0.0/packages/integrations/react)\n\nUpdates `html-validate` from 11.16.0 to 11.16.1\n- [Release notes](https://gitlab.com/html-validate/html-validate/tags)\n- [Changelog](https://gitlab.com/html-validate/html-validate/blob/master/CHANGELOG.md)\n- [Commits](https://gitlab.com/html-validate/html-validate/compare/v11.16.0...v11.16.1)\n\n---\nupdated-dependencies:\n- dependency-name: \"@astrojs/markdown-satteri\"\n  dependency-version: 0.4.2\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/react\"\n  dependency-version: 7.0.0\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n  dependency-group: npm-dependencies\n- dependency-name: html-validate\n  dependency-version: 11.16.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\n\n* Replace the Babel source annotation with a native Vite plugin\n\n@astrojs/react 7 (on @vitejs/plugin-react 6) no longer runs Babel and\ndropped the `babel` option, which failed `astro check` on this bump.\nStamp data-magpie-src with Vite\u0027s own oxc parser instead, removing\n@babel/core, and document the Astro preview adapter.\n\nGenerated-by: Claude Opus 5\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Jarek Potiuk \u003cjarek@potiuk.com\u003e"
    },
    {
      "commit": "43212d887d94c3e1d65e4929456758d33a49a653",
      "tree": "dd06ce03345f63db257dc8c66b15cfa08ae8374b",
      "parents": [
        "5474bf4055ad3475931c3b00aa17aaf63dbb9052"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Tue Oct 06 00:32:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 00:32:37 2026 +0200"
      },
      "message": "Stop tracking generated tools data and local Magpie runtime state (#221)\n\nsrc/data/tools.json is regenerated by sync-docs on every build and in\nevery CI job before use, so the committed copy never ships; tracking it\nonly leaves a dirty tree after each local build and needs periodic\nrefresh commits. Ignore it like the synced docs. Also ignore\n.apache-magpie-local/, which holds per-machine container gateway state.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "5474bf4055ad3475931c3b00aa17aaf63dbb9052",
      "tree": "a79cd9ee3dc9be7612f19c3ec7ef854ac9d69f05",
      "parents": [
        "9425944133d612bbebec8230c10e34d6ec06244b"
      ],
      "author": {
        "name": "Calvin Kirs",
        "email": "kirs@apache.org",
        "time": "Wed Sep 30 15:17:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 15:17:36 2026 +0800"
      },
      "message": "Add the ASF Events and Thanks links and rename Sponsorship in the footer (#219)\n\nThe ASF site scan identifies the required navigation links by their text\nor target. The footer had no Events or Thanks link, and the sponsorship\nlink was labelled \"Support Apache\", which the scan does not recognise."
    },
    {
      "commit": "9425944133d612bbebec8230c10e34d6ec06244b",
      "tree": "0ca8d8c0f8d0e8e5c2c129ed4fef559179aa44d0",
      "parents": [
        "9a1897d642e9c6547ca001c624a648eb81b6bad8"
      ],
      "author": {
        "name": "Calvin Kirs",
        "email": "kirs@apache.org",
        "time": "Wed Sep 30 10:57:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 10:57:03 2026 +0800"
      },
      "message": "Link docs to the real path of a symlinked skill so GitHub serves it (#218)\n\nGitHub does not follow a symlink in the middle of a path, so every docs\nlink rewritten to skills/\u003cname\u003e/SKILL.md (557 links on 70 pages) was a\n404. Resolve the path in the framework checkout first, so the URL names\nthe real plugins/\u003cfamily\u003e/skills/\u003cskill\u003e file.\n\nA \u003cproject-config\u003e placeholder rewritten to a GitHub URL now renders as\ntext, like one rewritten to a /docs/ route already did.\n\nGenerated-by: Claude Code (Fable 5.1)"
    },
    {
      "commit": "9a1897d642e9c6547ca001c624a648eb81b6bad8",
      "tree": "686cb337b47ab247755a7a28e84ecc5c718da750",
      "parents": [
        "dd4519e3d8233417d346c1d0fdd506ea6307f715"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Tue Sep 29 09:53:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 09:53:41 2026 +0200"
      },
      "message": "Restore the tools page filters, card layouts for architecture and resources, and tidy docs tables (#216)\n\n* Restore the tools page\u0027s filters and cards, and put Sections in every header\n\nTools page:\n- Tools are shared surface cards: summary, vendor (with its logo),\n  organization, MCP, implemented / adapter-spec, experimental, and the\n  tool\u0027s capabilities.\n- The filters are styled menus with icons for contract, substrate,\n  vendor and organization, each allowing several choices with per-option\n  counts and logos: any choice within a menu, every menu together, as the\n  page worked before the redesign. Plus the MCP switch, removable chips\n  for active filters, a result count, the meaning of each chosen\n  capability, and a filter bar that stays under the header.\n- Restores the vendor logos the redesign removed; the ASF is its oak\n  leaf, never the feather.\n- tests/browser/tools.spec.mjs: every option shows exactly its count,\n  the filter semantics against the tool data, the card details, logos,\n  keyboard use, the pinned bar and a phone layout in both themes.\n\nHeader: every page now has the home page\u0027s Sections menu, linking back\nto the home page\u0027s sections from elsewhere.\n\nGenerated-by: Claude Opus 5\n\n* Card layouts for architecture and resources; tidy tables and the agent picker\n\nArchitecture:\n- Skills, capabilities and tools are linked cards with their counts\n  from the generated data (77 skills, 20 capabilities, 56 tools), leading\n  to the skills overview, labels and capabilities, and the tools page.\n- Vendor neutrality: the score, the six axes as linked cards, and every\n  capability contract with its backends and coverage; links into the\n  vendor-neutrality document.\n- Organizations: how a project inherits its organization\u0027s defaults,\n  each profile (the ASF as its oak leaf), where to add your own; links\n  into the docs.\n- The reference tables get cell padding and a header row.\n\nResources: the guides are the same linked cards, with icons.\n\nDocs tables: cells keep words whole instead of breaking anywhere, and a\nshort first-column label stays on one line (scripts/markdown-table-labels.mjs\nmarks it at build time); tables are focusable since they may scroll.\n\nStart: the agent picker shows the chosen agent\u0027s mark and a styled\nchevron, keeping the shared field.\n\nTests: content-pages.spec.mjs (numbers and links against the data, docs\nanchors, organizations, resources, the agent picker), docs-tables.spec.mjs\n(every docs page on a phone), and unit tests for the table plugin.\n\nGenerated-by: Claude Opus 5\n\n* Fix the tools-page PR\u0027s failing checks\n\n- The architecture coverage and reference tables scroll within themselves\n  on a phone instead of widening the page (document overflow at 320 and\n  375 px); they are focusable so the keyboard can scroll them.\n- Card grids choose their column count from the width, so titles never\n  wrap away from their arrow (resources between 801 and 1150 px).\n- The architecture test reads only the summary cards, now that the axes\n  are cards too.\n- The docs-table test counts a label\u0027s lines by vertical overlap: a link\n  around code sits a pixel or two apart on the same line.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "dd4519e3d8233417d346c1d0fdd506ea6307f715",
      "tree": "22bb20a62175b14f99c530dc5e656872cab0f2b6",
      "parents": [
        "aeb264c435d896a0b06e7dd0d7801cfcf26aa913"
      ],
      "author": {
        "name": "Bartosz Sławecki",
        "email": "bartosz@ilikepython.com",
        "time": "Tue Sep 29 01:33:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 01:33:51 2026 +0200"
      },
      "message": "Rework the Magpie website around maintainer workflows (#206)\n\n* Rework the site around maintainer workflows\n\nGenerated-by: Codex (GPT-6)\n\n* Keep project stories distinct from their section\n\nGenerated-by: Codex (GPT-6)\n\n* Refine story spacing and preserve reading position\n\nUse shared heading styles for project stories, restore the maintainer portrait, and give chart captions the shared responsive spacing. Keep passive section URLs in sync without changing focus, selected content, or navigation history.\n\nGenerated-by: Codex (GPT-6)\n\n* Use ordinary prose for project story introductions\n\nKeep the Airflow outcome sentence in the shared introductory paragraph style beneath its logo. Use the normal Knip parser in the small CI runner to avoid the raw-transfer buffer allocation failure while retaining the same checks.\n\nGenerated-by: Codex (GPT-6)\n\n* Make the site theme warmer and less promotional\n\nUse quieter surfaces, contained workflow icons, a connected testimonial and open learning columns while preserving Magpie illustrations and reading sizes.\n\nGenerated-by: Codex (GPT-6)\n\n* Use plain language for project examples and getting started\n\nReplace promotional headings with concrete descriptions of how maintainers use Magpie.\n\nGenerated-by: Codex (GPT-6)\n\n* Address navigation, carousel and isolation review feedback\n\nGenerated-by: Codex (GPT-6)\n\n* Keep section links quiet and closed navigation out of layout\n\nGenerated-by: Codex (GPT-6)\n\n* Align documentation with shared page and card layouts\n\nKeep permalink icons outside centered heading text and reveal them on hover or keyboard focus.\n\nGenerated-by: Codex (GPT-6)\n\n* Unify card interactions and restore color and centered headings\n\nGenerated-by: Codex (GPT-6)\n\n* Clarify isolation risks and align semantic card colors\n\nGenerated-by: Codex (GPT-6)\n\n* Join process steps with responsive puzzle pieces\n\nGive Magpie distinct input and output joins and deepen surface shadows across the site.\n\nGenerated-by: Codex (GPT-6)\n\n* Check puzzle joins across every process family\n\nGenerated-by: Codex (GPT-6)\n\n* Refine puzzle shapes and add a gentle connection sheen\n\nGenerated-by: Codex (GPT-6)\n\n* Close puzzle seams and copy section links on activation\n\nGenerated-by: Codex (GPT-6)\n\n* Cast one shadow around connected puzzle pieces\n\nGenerated-by: Codex (GPT-6)\n\n* Refine card entry cues and show protected agent access\n\nGenerated-by: Codex (GPT-6)\n\n* Slide workflow panels without replaying puzzle assembly\n\nShare horizontal transitions across all three sequences and keep keyboard focus from scrolling their clipped viewport. Allow the complete browser and development-preview suites to finish within the CI job budget.\n\nGenerated-by: Codex (GPT-6)\n\n* Preserve sequence shadows and scroll progression\n\nKeep shadow paint outside the horizontal clip without adding layout height. Enforce the fitting desktop scroll behavior and compare shadow pixels against an unclipped reference in both themes and phone layouts.\n\nGenerated-by: Codex (GPT-6)\n\n* Let the workflow slide test start from rest\n\nReaching a scroll-driven walkthrough can already move it off its first\nstage, so selecting the first stage starts a slide of its own. The test\nthen clicked the next stage before that 400 ms slide ended, and the\nmeasured transition began mid-flight: 311-774 px of travel instead of\nmore than 80% of the 1120 px panel. It failed about 1 run in 13 under\nparallel load (CI, 1524 px). Wait for running transform transitions to\nfinish before measuring; 80 of 80 runs pass under 8 workers.\n\nGenerated-by: Claude Opus 5\n\n* Keep workflow scroll progression in laptop windows\n\nLet the introduction scroll away when the stage content fits below the header. Share compact desktop spacing and enforce real wheel and keyboard progression across laptop and tall viewports in production and development.\n\nGenerated-by: Codex (GPT-6)\n\n* Run the browser suites as an ubuntu-slim matrix\n\ntest:browser is split into 16 shards and test:dev is a 17th matrix entry,\neach on ubuntu-slim with one Playwright worker. Measured on a fork:\n1.5-5.4 minutes of tests per shard and at most 9.3 minutes per job with\nsetup, inside slim\u0027s 15-minute job cap. All 17 passed.\n\nGenerated-by: Claude Opus 5\n\n* Group the browser matrix in a reusable workflow\n\nbuild.yml\u0027s browser job now calls browser-tests.yml, which holds the\n17-entry ubuntu-slim matrix, so the checks list shows them grouped as\n\"browser / shard N/16\" and \"browser / dev\" instead of 17 top-level jobs.\nThe call uses GitHub\u0027s self-repository form ($/...), which zizmor\nrequires: it cannot load a workflow changed on disk by an earlier step.\n\nGenerated-by: Claude Opus 5\n\n* Upgrade the ASF allowlist check to v1.0.4\n\nThe pinned commit predated support for GitHub\u0027s self-repository syntax,\nso it treated `uses: $/.github/workflows/browser-tests.yml` as an\nexternal action that needed allowlisting. v1.0.4 recognises `$/`.\n\nThe pin\u0027s comment named the `main` branch, and Dependabot only bumps a\nSHA pin whose comment is a release tag, so it was never updated. It now\nnames allowlist-check/v1.0.4, which puts it under the existing\ngithub-actions Dependabot group.\n\nGenerated-by: Claude Opus 5\n\n* Start the browser tests without waiting for lint\n\nThe browser matrix is the longest part of the run, so it now starts\nalongside lint instead of after it. build still needs both.\n\nGenerated-by: Claude Opus 5\n\n* Split the homepage visual checks into one test per viewport and theme\n\n\"homepage growth, protection layers and learning paths\" captured every\nsection and interactive state at 3 widths x 2 themes in one test. On a\none-CPU ubuntu-slim shard it overran the 2-minute per-test timeout\n(2.2m, in a screenshot). The width/theme loop is now six tests with the\nsame checks, which also lets the shards spread them.\n\nGenerated-by: Claude Opus 5\n\n* Give mobile visitors a compact reading flow\n\nReplace narrow-screen scroll sequences with native example selection and focused disclosures. Keep workflow details reachable, simplify isolation and documentation navigation, and retain desktop progression. Enforce the mobile contract in production and development browser checks.\n\nGenerated-by: Codex (GPT-6)\n\n* Wait for hydration before the phone-bounds test edits island markup\n\nThe test writes a width onto .mobile-workflow-body to prove overflow is\ndetected. On the dev server the island had not hydrated yet, so React\nfound the style and reported a hydration mismatch, which the fixture\nfails on. Wait until no client:load island is left unhydrated, as the\nfile\u0027s other tests do. 8 of 8 pass on the dev server.\n\nGenerated-by: Claude Opus 5\n\n* Bring back \"Suggest a change\"\n\nThe redesign dropped the edit button and the editUrl plumbing. Every\npage except 404 again passes its GitHub edit link, through ContentLayout\nand DocsLayout, and BaseLayout renders the button in the redesign\u0027s own\naction colours. Site pages link to their src/pages file (siteEditUrl);\nsynced docs pages link to their file in apache/magpie, as before.\n\nWhere the review overlay runs it hides this button and offers the same\nlink from its \"Comment / Suggest a change\" menu.\n\nGenerated-by: Claude Opus 5\n\n* Split the dev-preview suite into two shards\n\ntest:dev now runs as \"dev 1/2\" and \"dev 2/2\". Its one spec file imports\nthe other suites, so file-level sharding put all 19 tests in the first\nshard; --fully-parallel shards by test instead (10 and 9), each shard\nstill on one worker. Locally: 1.7 minutes and 36 seconds.\n\nGenerated-by: Claude Opus 5\n\n* Warm the dev server before the dev-preview tests\n\nA fresh dev server optimises dependencies on the first page load and\nthen forces a full reload. On a one-CPU runner that reload landed after\n\"mobile reading flow stays usable at 320\" had seen hydration and picked\nan example, so the pick was thrown away and the slide stayed on 1 of 9.\nReproduced locally: a cold server navigates the page twice about a\nsecond apart.\n\nA globalSetup now loads each page the suite visits until it loads with\nno reload for three seconds, so the optimiser has settled before the\nfirst test.\n\nGenerated-by: Claude Opus 5\n\n* Give the longest page more time, and split the routes into 20 shards\n\n\"responsive and accessible /docs/setup/secure-agent-setup/\" ran out of\nits 2-minute budget on a one-CPU shard (2.3m, in a reload). Its layout\nand accessibility checks scale with the page, and at ~400 KB it is more\nthan twice the next largest; locally it takes 17s against 3s for \"/\".\nPages over 300 KB now get test.slow(); every other route keeps the\ndefault, so a stuck page still fails.\n\nThat shard still ran 9 minutes of tests, so test:browser now uses 20\nshards instead of 16 to keep each under 8 minutes.\n\nGenerated-by: Claude Opus 5\n\n* Wait for React itself before the phone-bounds test edits its markup\n\nWaiting for Astro\u0027s ssr marker to go was not enough: Astro removes it\nwhen it starts hydrating, while React hydrates concurrently and finishes\nlater. On a one-CPU runner the test still wrote its width in between and\nReact reported a mismatch. Wait until React has attached its props to\nthe very node the test edits.\n\nGenerated-by: Claude Opus 5\n\n---------\n\nCo-authored-by: Jarek Potiuk \u003cjarek@potiuk.com\u003e"
    },
    {
      "commit": "aeb264c435d896a0b06e7dd0d7801cfcf26aa913",
      "tree": "b632e316535ce7b6b1bfc46a85505db6c05f5fe8",
      "parents": [
        "3fe4089883134779bee7d0540473a481c72c7514"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 29 00:21:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 00:21:10 2026 +0200"
      },
      "message": "chore(deps): bump undici (#215)\n\nBumps  and [undici](https://github.com/nodejs/undici). These dependencies needed to be updated together.\n\nUpdates `undici` from 8.10.0 to 8.11.2\n- [Release notes](https://github.com/nodejs/undici/releases)\n- [Commits](https://github.com/nodejs/undici/compare/v8.10.0...v8.11.2)\n\nUpdates `undici` from 7.29.0 to 7.30.0\n- [Release notes](https://github.com/nodejs/undici/releases)\n- [Commits](https://github.com/nodejs/undici/compare/v8.10.0...v8.11.2)\n\n---\nupdated-dependencies:\n- dependency-name: undici\n  dependency-version: 8.11.2\n  dependency-type: indirect\n- dependency-name: undici\n  dependency-version: 7.30.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "3fe4089883134779bee7d0540473a481c72c7514",
      "tree": "7300194f358ad114dbd839b4fbd3a9d6a1f596bc",
      "parents": [
        "216984cc12ab0c61e3841c780c8cac2633e58708"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 23:57:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 23:57:55 2026 +0200"
      },
      "message": "chore(deps): bump ip-address from 10.4.0 to 10.7.2 (#213)\n\nBumps [ip-address](https://github.com/beaugunderson/ip-address) from 10.4.0 to 10.7.2.\n- [Release notes](https://github.com/beaugunderson/ip-address/releases)\n- [Commits](https://github.com/beaugunderson/ip-address/compare/v10.4.0...v10.7.2)\n\n---\nupdated-dependencies:\n- dependency-name: ip-address\n  dependency-version: 10.7.2\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "216984cc12ab0c61e3841c780c8cac2633e58708",
      "tree": "ad5466cf649f20d5493a2375985ead05501d5dde",
      "parents": [
        "ae1aaca0fb2814f63e28bca7680b40493ec94a86"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 28 23:57:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 23:57:40 2026 +0200"
      },
      "message": "Put the review overlay on the published site, with one button (#214)\n\nOptionally (MAIN_REVIEW_OVERLAY in build.yml, on for this site) the main\nbuild is annotated and inject-main.mjs adds the review overlay in \"main\"\nmode: no preview banner, since it is the published site, and a marked\nregion\u0027s result offers \"Open an issue\" — a new issue prefilled with the\npage, the build\u0027s commit and the source line on main, for the screenshot\nto be pasted into. The plain build is still checked for annotation first.\n\nOn every page it runs, the overlay replaces the site\u0027s \"Suggest a change\"\npencil with one \"Comment / Suggest a change\" button: a menu with the\nscreenshot comment and the page\u0027s edit link, unchanged. PR previews keep\ntheir banner and \"Open PR #N at this line\".\n\noverlay-files.mjs now generates the overlay for both the PR publisher and\nthe main build.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "ae1aaca0fb2814f63e28bca7680b40493ec94a86",
      "tree": "fd7c61e9e7f844076946b6a2e41adee5986cbb85",
      "parents": [
        "da853c9c71da091e502e528a5565fd931677b37d"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 28 23:45:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 23:45:45 2026 +0200"
      },
      "message": "Leave the preview URL out of the explainer comment (#212)\n\nThe explainer is posted on every PR, armed or not, and a PR that has\nnot been marked for preview has no preview: its URL does not resolve.\nThe link is posted by the publish announcement once the preview exists.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "da853c9c71da091e502e528a5565fd931677b37d",
      "tree": "7a86f3d6597d0ffbfb233a3ad09f8fb63b5203e6",
      "parents": [
        "9a84844f343a0c79e11385125ad66be7471e3b6a"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 28 23:45:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 23:45:18 2026 +0200"
      },
      "message": "Run the Jekyll adapter test on ubuntu-slim (#211)\n\nubuntu-slim cannot start a job container, so the Ruby image is replaced\nby apt\u0027s Ruby, Bundler and a C toolchain. Bundler switches itself to the\nversion the lockfile\u0027s BUNDLED WITH names, so no unpinned gem install is\nadded. Measured on a fork: passes in 1m24s.\n\nAlso set the preview publisher\u0027s timeout to 15 minutes, the ubuntu-slim\njob cap; the previous 20 could never apply.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "9a84844f343a0c79e11385125ad66be7471e3b6a",
      "tree": "a8075ed606f1e80e91a08ba58f56c672f52bb9ea",
      "parents": [
        "22e8480df9955c201654a8e53156e4fd9ac47aa1"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 28 20:30:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 20:30:56 2026 +0200"
      },
      "message": "Publish previews on workflow_run, and pin what the publisher may read (#210)\n\npull_request_target is being restricted, so the publisher no longer uses\nit. It runs on workflow_run when build.yml completes, which publishes a\npush to an armed PR the moment its build ends with no polling, and when\npreview-signal.yml completes: a no-op pull_request workflow with no\npermissions that only signals label changes, opens and closes. Any PR\ncomment (issue_comment) and manual dispatch also trigger it. Every run\nchecks out the default branch and takes nothing from the event.\n\nWhat the publisher may learn about a pull request is now enforced in\ncode. Every GitHub response goes through a projection in github.mjs:\nPR number, label names, head SHA, author login/type, comment bodies only\nwhen they are exactly /show-preview or bot-authored, and the labeled\nactor. Workflow-run objects are reduced to their id. The diff-derived\nanchor manifest moves to the unprivileged build (write-meta.mjs) and is\nsanitised by the publisher, so /pulls/N/files is no longer read.\n\nboundary.test.mjs checks this deterministically: the workflows (no\npull_request_target, no checkout ref/repository, no event data in any\nstep, a fixed set of github.* contexts), a full publisher run against\nresponses whose every forbidden field carries a marker, and a fixed\nendpoint allowlist.\n\nEvery preview comment now leads with the preview URL.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "22e8480df9955c201654a8e53156e4fd9ac47aa1",
      "tree": "a4d1ce8ccbd5cbaf7db7161698b7cc466d889847",
      "parents": [
        "713e605586f5fa27b19d1e36f271b5c9416f8e9f"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 28 17:29:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 17:29:39 2026 +0200"
      },
      "message": "Arm PR previews with a label and publish on events, not a schedule (#208)\n\n* Publish armed previews on push and announce each publish\n\nA push to an armed pull request took up to ~40 minutes to reach its\npreview: GitHub delays the 15-minute schedule well past its interval, and\nthe PR build itself takes up to half an hour. The publish then only\nedited the sticky status comment, which notifies nobody, so it looked\nas if nothing had been published.\n\n- Run the schedule every 5 minutes.\n- Add an optional pull_request_target trigger. An await-build job with a\n  read-only token waits for the build of the pushed SHA, only for PRs with\n  a live preview; the publish job then runs publish.mjs --pr N --if-armed.\n  Both jobs check out the base branch only and take nothing from the event\n  but the PR number and head SHA; --if-armed never arms or forces.\n- Post a new comment on every publish, besides the sticky status edit.\n- Amend the design doc\u0027s pull_request_target constraint to match.\n\nGenerated-by: Claude Opus 5\n\n* Arm previews with a label and drop the schedule\n\nThe `preview` label is now the armed state. A maintainer adds it\ndirectly, by commenting /show-preview (the publisher adds the label and\nacknowledges the comment with a reaction, so removing the label disarms\nfor good), or by dispatching the workflow for the PR. Arming checks who\nlast added the label: triagers can label without being committers, so\nonly write access, or the publisher\u0027s own login, counts.\n\nWith the label as a durable, event-visible state, the schedule is no\nlonger needed. pull_request_target (opened, reopened, synchronize,\nlabeled, unlabeled, closed) and issue_comment trigger the workflow, used\nas signals only: both jobs check out the default branch, and only the PR\nnumber reaches a step. await-build waits for the build of the PR\u0027s head\ncommit (re-read from the API); every publish run is a full reconcile, so\nruns dropped by the concurrency group are covered by the next one.\n\n--if-armed is gone: a full reconcile publishes only armed PRs anyway.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "713e605586f5fa27b19d1e36f271b5c9416f8e9f",
      "tree": "9891ea9b8fc30695af9f3c99a68117d37aa50809",
      "parents": [
        "ce07e8831731eb6b53dc35e815dc70ce65919f5d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 08:45:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 08:45:25 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 2 updates (#207)\n\nBumps the npm-dependencies group with 2 updates: [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).\n\n\nUpdates `@babel/core` from 8.0.5 to 8.0.6\n- [Release notes](https://github.com/babel/babel/releases)\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/babel/babel/commits/v8.0.6/packages/babel-core)\n\nUpdates `@types/node` from 26.6.1 to 26.6.2\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\n---\nupdated-dependencies:\n- dependency-name: \"@babel/core\"\n  dependency-version: 8.0.6\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: \"@types/node\"\n  dependency-version: 26.6.2\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ce07e8831731eb6b53dc35e815dc70ce65919f5d",
      "tree": "25d8bf9f68a4e0555e486c7049136b095529feed",
      "parents": [
        "26f0f8b76e05e60f7fe0455de488696dc625d30e"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sun Sep 27 20:23:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 20:23:13 2026 +0200"
      },
      "message": "feat(preview): support Jekyll sites, including file-and-line lookup (#205)\n\nAdd a Jekyll adapter that stamps data-magpie-src on a preview build:\nMarkdown blocks from kramdown\u0027s source lines, and opening tags in\nlayouts and includes before Liquid runs. prepare.sh installs it into\n_plugins/ for the preview build only.\n\nGenerator-specific code now lives under scripts/preview/adapters/; the\nAstro Babel plugin moves there unchanged. The build contract is written\ndown in scripts/preview/README.md, and PREVIEW_SITE_NAME and\nPREVIEW_BUILD_WORKFLOW replace the hardcoded staging label and build\nworkflow, defaulting to this site\u0027s values.\n\nA jekyll-adapter CI job builds a fixture site with the plugin in a\ndigest-pinned ruby:3.3 container, from a checksummed Gemfile.lock.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "26f0f8b76e05e60f7fe0455de488696dc625d30e",
      "tree": "6e1e0c78fadcdd11cb804ece4e08a1f3bbd22e1a",
      "parents": [
        "08724c36fe1c374118912d0013d19a624c058528"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sun Sep 27 17:59:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 17:59:15 2026 +0200"
      },
      "message": "Preview overlay panel and branch reap (#204)\n\n* fix(preview): show the capture and an Open PR button instead of jumping to the PR\n\nAfter marking a region the overlay opened the pull request straight\naway. It now keeps the region outlined, says the screenshot was copied\n(or downloaded), and offers an Open PR button plus Dismiss. The tab is\nopened by the reviewer\u0027s own click, so it is no longer blocked as a\npopup after the awaited clipboard write.\n\nGenerated-by: Claude Opus 5\n\n* feat(preview): delete head branches of closed pull requests\n\nThe scheduled publish run now also deletes branches in this repository\nthat pull requests were opened from, once all of them have closed.\nProtected, main, publish, preview/* and asf-* branches, branches that\nnever had a PR, and branches pushed to after the PR closed are kept.\n\nAlso treat GitHub\u0027s empty 204 response as success: DELETE answered 204\nand res.json() threw, so every successful delete counted as a failure.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "08724c36fe1c374118912d0013d19a624c058528",
      "tree": "5dc885389c501acafe01106000e7d43162df5274",
      "parents": [
        "23e813b23742f4f143cd508dc4ce3d1d1251cf39"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Sep 26 13:52:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 26 13:52:34 2026 +0200"
      },
      "message": "feat(docs-sync): render the skill token table from measured_tokens stamps (#203)\n\napache/magpie#1394 moved each skill\u0027s token count into its own\nmeasured_tokens frontmatter stamp and replaced the committed table in\ndocs/mode-economics.md with a marker. Render the table from the stamps\nduring sync-docs, before the link rewrite, so the page keeps its table\nand the rows link to GitHub as before.\n\nGenerated-by: Claude Opus 5"
    },
    {
      "commit": "23e813b23742f4f143cd508dc4ce3d1d1251cf39",
      "tree": "272901cb14e62a4fc5a257b3a47b024cb8ae503b",
      "parents": [
        "7d33c88acbbb15032a78c09c6684dd6197b3f1fb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 25 09:41:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 09:41:46 2026 +0200"
      },
      "message": "chore(deps-dev): bump lucide-react in the npm-dependencies group (#202)\n\nBumps the npm-dependencies group with 1 update: [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).\n\n\nUpdates `lucide-react` from 1.46.0 to 1.47.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.47.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: lucide-react\n  dependency-version: 1.47.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7d33c88acbbb15032a78c09c6684dd6197b3f1fb",
      "tree": "d958fb3857022516ba8836cfd5b03ef3da6490f2",
      "parents": [
        "63517fcc8458eb4589df436c5443267d48c66baf"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Sep 24 16:02:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 16:02:31 2026 +0200"
      },
      "message": "chore(deps): bump the npm-dependencies group with 3 updates (#201)\n\nBumps the npm-dependencies group with 3 updates: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro), [motion](https://github.com/motiondivision/motion) and [@astrojs/react](https://github.com/withastro/astro/tree/HEAD/packages/integrations/react).\n\n\nUpdates `astro` from 7.3.2 to 7.3.3\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/astro@7.3.3/packages/astro)\n\nUpdates `motion` from 13.3.0 to 13.4.0\n- [Changelog](https://github.com/motiondivision/motion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/motiondivision/motion/compare/v13.3.0...v13.4.0)\n\nUpdates `@astrojs/react` from 6.0.5 to 6.0.6\n- [Release notes](https://github.com/withastro/astro/releases)\n- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/react/CHANGELOG.md)\n- [Commits](https://github.com/withastro/astro/commits/@astrojs/react@6.0.6/packages/integrations/react)\n\n---\nupdated-dependencies:\n- dependency-name: astro\n  dependency-version: 7.3.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: motion\n  dependency-version: 13.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: \"@astrojs/react\"\n  dependency-version: 6.0.6\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "63517fcc8458eb4589df436c5443267d48c66baf",
      "tree": "9125d36367ec98e350d4dc5ddbfd7d7fc6da1615",
      "parents": [
        "d448563d6ede1c39499ac7bbc148ac3b6d98f597"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 11:36:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 11:36:46 2026 +0200"
      },
      "message": "chore(deps-dev): bump @types/node in the npm-dependencies group (#200)\n\nBumps the npm-dependencies group with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).\n\n\nUpdates `@types/node` from 26.5.1 to 26.6.1\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\n---\nupdated-dependencies:\n- dependency-name: \"@types/node\"\n  dependency-version: 26.6.1\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "d448563d6ede1c39499ac7bbc148ac3b6d98f597",
      "tree": "2dcccb57602ff52cc8131c970c8085c3c4ce18ee",
      "parents": [
        "8d797a1bee882f1941c226adfe99ac8b58137cb4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 22 06:34:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 06:34:45 2026 +0200"
      },
      "message": "chore(deps): bump the npm-dependencies group with 2 updates (#199)\n\nBumps the npm-dependencies group with 2 updates: [motion](https://github.com/motiondivision/motion) and [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).\n\n\nUpdates `motion` from 13.2.0 to 13.3.0\n- [Changelog](https://github.com/motiondivision/motion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/motiondivision/motion/compare/v13.2.0...v13.3.0)\n\nUpdates `lucide-react` from 1.45.0 to 1.46.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.46.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: motion\n  dependency-version: 13.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.46.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8d797a1bee882f1941c226adfe99ac8b58137cb4",
      "tree": "36ef74d39bfdb3e85951d2b7cff8f7c74a3e2336",
      "parents": [
        "89dd81fa49f5a1d1d780628be2c63c44bef57617"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 21 03:59:21 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 21 04:04:12 2026 +0200"
      },
      "message": "chore: allow only squash merges on pull requests\n\nGitHub\u0027s repository settings had rebase-and-merge enabled, which is not\nreflected anywhere in the repo. Pin the merge buttons in .asf.yaml so\nsquash is the only way a pull request lands: main then keeps one commit\nper change, which stays readable and bisectable.\n\nasfyaml applies the github: block from the default branch, so this takes\neffect once it is on main.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "89dd81fa49f5a1d1d780628be2c63c44bef57617",
      "tree": "2b64a4e98eb716d43262c7045c82dcec29144725",
      "parents": [
        "286cae1cc4d0e9ff5f2115cc24881c348f59d5e9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 21 01:35:22 2026 +0000"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Mon Sep 21 03:57:06 2026 +0200"
      },
      "message": "chore(deps): bump the npm-dependencies group with 2 updates\n\nBumps the npm-dependencies group with 2 updates: [tailwind-merge](https://github.com/dcastil/tailwind-merge/tree/HEAD/packages/tailwind-merge) and [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).\n\n\nUpdates `tailwind-merge` from 3.6.0 to 3.7.0\n- [Release notes](https://github.com/dcastil/tailwind-merge/releases)\n- [Commits](https://github.com/dcastil/tailwind-merge/commits/tailwind-merge@3.7.0/packages/tailwind-merge)\n\nUpdates `lucide-react` from 1.44.0 to 1.45.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.45.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: tailwind-merge\n  dependency-version: 3.7.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.45.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "286cae1cc4d0e9ff5f2115cc24881c348f59d5e9",
      "tree": "fa070fcd1ea663742bd33e6353c133d5ae50c3a6",
      "parents": [
        "1f310518ed6ee770698fde6149b8d4e4eefc7e31"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Sep 19 01:32:50 2026 +0000"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Sep 19 10:53:19 2026 +0200"
      },
      "message": "chore(deps): bump https://github.com/woodruffw/zizmor-pre-commit\n\nBumps the pre-commit-hooks group with 1 update: [https://github.com/woodruffw/zizmor-pre-commit](https://github.com/woodruffw/zizmor-pre-commit).\n\n\nUpdates `https://github.com/woodruffw/zizmor-pre-commit` from v1.30.0 to 1.30.1\n- [Release notes](https://github.com/woodruffw/zizmor-pre-commit/releases)\n- [Commits](https://github.com/woodruffw/zizmor-pre-commit/compare/cef8b8350da46d8114c7e6b7272aebdccdf193ce...fa412071e4f5d44d44f9e365f4676f9df92456a2)\n\n---\nupdated-dependencies:\n- dependency-name: https://github.com/woodruffw/zizmor-pre-commit\n  dependency-version: 1.30.1\n  dependency-type: direct:production\n  dependency-group: pre-commit-hooks\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "1f310518ed6ee770698fde6149b8d4e4eefc7e31",
      "tree": "5b8b8f28546c9972a6daf91fd461061f60f022cb",
      "parents": [
        "caf85c2edb27624559c93fc620b45f9bee1d2a3b"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 06:43:18 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 06:49:12 2026 +0200"
      },
      "message": "fix(preview): do not offer previews to bots\n\nThe publisher announced itself on every open pull request, which on this\nrepository means every dependabot bump gets an explainer comment telling it it\ncan run /show-preview. The bot does not read comments, the comment lands on\ncommits@, and a dependency bump is the last thing anyone wants a rendered\npreview of.\n\nAnnouncements are now for humans: a pull request whose author reports as a Bot,\nor whose login ends in [bot], is skipped.\n\nArming is deliberately NOT gated the same way. A maintainer may well want to\nsee a bot\u0027s PR rendered - a CSS dependency bump is exactly the case where a\npreview earns its keep - so commenting /show-preview on one still publishes.\nWhat is suppressed is the unsolicited offer, not the capability.\n\nVerified by removing the guard in a structurally faithful copy: exactly one\ntest fails, and the \"still publishes when armed\" test keeps passing, which is\nwhat makes the two behaviours independent rather than merely untested.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "caf85c2edb27624559c93fc620b45f9bee1d2a3b",
      "tree": "2d7718b9e5b64f09ab89cd4ac2b95a47dfae90e8",
      "parents": [
        "a2a934caa9e0afd445b014e3bf7758234bfe08be"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 05:50:41 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 06:19:17 2026 +0200"
      },
      "message": "fix: clear the type-check hints, and let the check fail on errors again\n\n`astro check` reported nine hints, all of them real:\n\n- Three body builders in the preview publisher took a `pr` argument they never\n  read. Removed, with the call sites updated - a parameter that is never used\n  is a parameter that lies about what the function needs. The test suite caught\n  an incomplete first pass at this, where three `refusedBody` calls still\n  passed the PR number and it silently became the refusal reason.\n- `astro:content` no longer re-exports `z`; it comes from `astro/zod`.\n- The JSON-LD script carries an attribute, so Astro already treats it as\n  `is:inline`. Saying so explicitly matches what happens.\n- review.js is browser script, not a module: the publisher concatenates\n  logic.mjs ahead of it with the `export` keywords stripped, so its three\n  helpers arrive as globals. A .d.ts declares them, which both silences the\n  hint and documents a contract that was previously only implied.\n\nThe step also carried `continue-on-error: true`, so even genuine type errors\ncould not fail the build. With the tree clean, that only served to hide the\nnext regression. astro check fails a step on errors alone, so warnings and\nhints still print without blocking - and the synced docs cannot break CI by\nacquiring a hint.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "a2a934caa9e0afd445b014e3bf7758234bfe08be",
      "tree": "0fe0a686cb25cba78814c16328d2c6666b3b80ef",
      "parents": [
        "b9a5b65fd0ce4610465b75c6219d08e946322379"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 05:44:48 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 05:50:49 2026 +0200"
      },
      "message": "docs(preview): describe the capture library we actually ship\n\nThe design still said the overlay captures with html2canvas. It does not, and\ncould not: html2canvas 1.4.1 parses CSS colours itself and predates oklch, and\nthis site is Tailwind 4, so the capture failed on every page. The design now\nnames html2canvas-pro, records why the fork was needed, and notes that the\noverlay resolves the library\u0027s export shape rather than assuming it - a\nfile-only swap would have traded the colour error for \"not a function\".\n\nIt also describes the preview banner, which shipped without ever being\ndesigned: previews look exactly like the published site, and a staged URL gets\nforwarded, so every preview now says which pull request it is and links to it.\n\nBoth were found by someone opening a preview and dragging a box, not by review\n- which is worth recording next to the design that review approved.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "b9a5b65fd0ce4610465b75c6219d08e946322379",
      "tree": "965945dd5786ec8926ce2233ec14affc19fbbcd0",
      "parents": [
        "3eac634a86ca9ee5cfef9e722af9c1a06db9e5e6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 18 01:34:08 2026 +0000"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 05:47:25 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 2 updates\n\nBumps the npm-dependencies group with 2 updates: [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) and [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react).\n\n\nUpdates `@babel/core` from 7.29.7 to 8.0.5\n- [Release notes](https://github.com/babel/babel/releases)\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/babel/babel/commits/v8.0.5/packages/babel-core)\n\nUpdates `lucide-react` from 1.43.0 to 1.44.0\n- [Release notes](https://github.com/lucide-icons/lucide/releases)\n- [Commits](https://github.com/lucide-icons/lucide/commits/1.44.0/packages/lucide-react)\n\n---\nupdated-dependencies:\n- dependency-name: \"@babel/core\"\n  dependency-version: 8.0.5\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n  dependency-group: npm-dependencies\n- dependency-name: lucide-react\n  dependency-version: 1.44.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "3eac634a86ca9ee5cfef9e722af9c1a06db9e5e6",
      "tree": "10361d45249b3548ab9cbe3fd7ce146aa07c6785",
      "parents": [
        "0f3acc94b4f4de0a95b92cb248eee5e4dd5222e5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 18 02:17:14 2026 +0000"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Sep 18 05:47:16 2026 +0200"
      },
      "message": "chore(deps): bump devalue from 5.8.1 to 5.9.2\n\nBumps [devalue](https://github.com/sveltejs/devalue) from 5.8.1 to 5.9.2.\n- [Release notes](https://github.com/sveltejs/devalue/releases)\n- [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/sveltejs/devalue/compare/v5.8.1...v5.9.2)\n\n---\nupdated-dependencies:\n- dependency-name: devalue\n  dependency-version: 5.9.2\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "0f3acc94b4f4de0a95b92cb248eee5e4dd5222e5",
      "tree": "42fc40c0cdf4b323636c0f2ed9271405cbe205eb",
      "parents": [
        "0fcfe5aedc89c745dfcede8978138383cf2ba042"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 16:02:45 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 16:13:39 2026 +0200"
      },
      "message": "feat(preview): say on the page that it is a preview, and of which PR\n\nA staged URL gets sent to people. Without a marker on the page there is nothing\nto tell a reader that magpie-pr180.staged.apache.org is one pull request\u0027s\nproposal rather than the published site - and the two look identical.\n\nA small amber bar now sits at the top right of every preview, naming the\nrepository, the pull request and the commit it was built from, and linking to\nthe pull request. It is deliberately not dismissible: the moment it can be\nturned off is the moment someone screenshots a preview and calls it the site.\n\nIt hides with the rest of the overlay chrome during a capture, so it never\nappears in a screenshot - the caption strip already carries the same\ninformation, in a form that survives being pasted.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "0fcfe5aedc89c745dfcede8978138383cf2ba042",
      "tree": "237e26c20c2566d1c3a6431faa857bd0dc66a4a9",
      "parents": [
        "529e5aff03786651c4b22276d64a7a01a4f4d831"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 16:00:02 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 16:13:39 2026 +0200"
      },
      "message": "fix(preview): swap html2canvas for html2canvas-pro\n\nCapturing failed on every page with:\n\n  Could not capture the page: Attempting to parse an unsupported color\n  function \"oklch\"\n\nhtml2canvas 1.4.1 parses CSS colours itself and predates the modern colour\nfunctions. This site is Tailwind 4, whose palette is oklch throughout, so the\ncapture could never have worked here - not on one page, on all of them.\n\nhtml2canvas-pro 2.4.3 is the maintained fork that added oklch, lab, lch and\ncolor() support. MIT, same licence class, vendored the same way.\n\nIts UMD bundle does NOT expose a callable: window.html2canvas is a module\nnamespace whose .default is the function, where the old package exposed the\nfunction directly. Swapping the file alone would have replaced the colour\nerror with \"window.html2canvas is not a function\", so the overlay now resolves\nboth shapes and fails with a clear message if neither is there.\n\n  npm integrity  sha512 (see npm view html2canvas-pro@2.4.3)\n  file sha256    22d7b55530426ae0652748225ba1fedccb207ec9da0dff83a52dedd6fbe24611\n  250,171 bytes\n\nVerified by loading the vendored bundle in a VM context and applying the\noverlay\u0027s own resolution expression: it resolves to a function, and the\nconcatenated published script parses.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "529e5aff03786651c4b22276d64a7a01a4f4d831",
      "tree": "929d35bfc706237cc7e15561a630e046a7733c93",
      "parents": [
        "33a503e2b7bcbfaec09ad0839320fd39dc96e685"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:31:44 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "ci: install dependencies before running the unit tests\n\nThe `lint` job ran `npm test` with no install step. That worked for as long as\nevery test imported Node built-ins alone, which was true until this branch: the\nfirst test to import a real dependency failed with\n\n    Error [ERR_MODULE_NOT_FOUND]: Cannot find package \u0027@babel/core\u0027\n    imported from scripts/preview/babel-plugin-magpie-src.test.mjs\n\nwhich reads as a missing dependency and is not one. `@babel/core` is declared in\ndevDependencies and present in package-lock.json; nothing had ever installed it.\n\nAdds `npm ci` and `cache: npm`, matching what the `build` job below has always\ndone. Locally the suite is 110 passing with dependencies installed, against\nCI\u0027s 107-with-1-failure — the three missing are the babel test\u0027s subtests, which\nnever registered because the import threw first.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "33a503e2b7bcbfaec09ad0839320fd39dc96e685",
      "tree": "0cd5ed9d40470a8ae502d0b5f33d132008b3df6a",
      "parents": [
        "90c59abe722525d569877ef33ccfe49bf1eb391a"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:22:57 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "docs(preview): stop describing two behaviours that were not built\n\nThe failure table promised the blocked-popup toast would carry \"the PR link as\na plain anchor to click\". say() sets textContent, so it is unclickable text;\nthe table now says what actually happens.\n\nThe testing and vendoring sections both claimed the CI check asserts a\nproduction build contains \"neither a preview-only asset nor any\ndata-magpie-src\". It greps for the attribute only. There is no preview-asset\nassertion, and there is nothing to assert: those files are written by the\npublisher into a preview branch and never enter a production build.\n\nFound by the re-review of the final fix wave. These two are the last of the\ndesign\u0027s claims that outran the code.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "90c59abe722525d569877ef33ccfe49bf1eb391a",
      "tree": "8ab5ee1a0dd738448490a1b31fb2158f0498a0d2",
      "parents": [
        "e89299c032998ee09d0d4a72fd072f443a16d1b3"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:55:56 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "docs(preview): correct the design to describe what was built\n\n- Anchors are embedded in the window.__MAGPIE_PREVIEW__ payload, not\n  written to a separate _preview/anchors.json file. Corrected every\n  mention (the design had more than the two the review flagged: Landing\n  it on the diff line, the failure-handling table, Testing, and Open\n  questions).\n- Annotation only covers .tsx/.jsx (wired through @astrojs/react\u0027s babel\n  option); .astro templates and synced markdown docs resolve no source\n  and always fall back to the Conversation tab. Documented in the design\n  and in the babel plugin\u0027s own docblock, which read broader than the\n  truth.\n- sessionStorage-backed armed state and an Enter/Submit-button\n  confirmation were never built (a mouseup confirms directly); removed\n  those sentences rather than leaving the design describe behaviour that\n  does not exist.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "e89299c032998ee09d0d4a72fd072f443a16d1b3",
      "tree": "c7b00f2b723a0341016488ceb62127bbfda9ca12",
      "parents": [
        "599b8d95d332444caf445462942eee240b51c08e"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:55:48 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "ci(preview): assert the production build carries no preview annotation\n\nThe design\u0027s Constraints and Vendoring sections both claim a build check\nasserts this, but no such step existed — data-magpie-src could leak into\na production build with nothing catching it. Add the assertion between\nthe production Build step and the annotated preview rebuild.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "599b8d95d332444caf445462942eee240b51c08e",
      "tree": "aae218abcdc08a0daee61abf09498ecae39cd00a",
      "parents": [
        "444578ca5036b90733a2ff3eedc90170bca89b8d"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:55:42 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "fix(preview): guard overlay injection on a marker, inject at the last \u003c/body\u003e\n\ninjectOverlay guarded on the literal string \"/_preview/review.js\", so a\npage whose own content mentioned that path — this feature\u0027s design\ndocument, once published — would be mistaken for already-injected and\nsilently get no overlay. It also replaced the first \u003c/body\u003e, which can\nappear inside an inline script or a serialised island prop and corrupt\nthe page.\n\nGuard on a dedicated marker comment instead, and inject at the LAST\n\u003c/body\u003e.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "444578ca5036b90733a2ff3eedc90170bca89b8d",
      "tree": "2251445c2f289ccba8853b00156601d5c779ef33",
      "parents": [
        "c422810fde2e04ed735a348b32b1200d35b2b6dd"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:55:34 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "fix(preview): resolve source before hiding the overlay, not after\n\nsubmit() called sourceUnder() while root — the full-viewport,\npointer-events-accepting overlay — was still displayed, so\nelementFromPoint always hit root itself and the walk up the tree ended\nat \u003cbody\u003e. The source was always null, and every capture silently fell\nback to the Conversation tab with \"source not resolved\". hideChrome()\nnow runs first.\n\nAlso: clipboard.write() is reached synchronously via a ClipboardItem\nholding a promise, so transient activation survives the capture (Safari\notherwise refuses); window.open() is called without \"noopener\" so a\nsuccessful popup isn\u0027t mistaken for a blocked one; toBlob\u0027s SecurityError\non a tainted canvas is now reported instead of leaving the overlay stuck;\nthe c shortcut ignores Cmd/Ctrl/Alt so copying selected text no longer\narms the overlay; disarm() clears a stale marking box, and window\nmouseup/blur listeners recover drag state from a release the overlay\nnever saw.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "c422810fde2e04ed735a348b32b1200d35b2b6dd",
      "tree": "be3656b435f70647bb285b2d73913e7f52279b75",
      "parents": [
        "d8e9a92dd77040d0c4042260ddc133bc5ce354c3"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:47:36 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "feat(preview): build the preview artifact with source annotation\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "d8e9a92dd77040d0c4042260ddc133bc5ce354c3",
      "tree": "89d128d9c2d8832b3b89b42abdcf0fe8641e49db",
      "parents": [
        "f550420f86fc31120dfe81fb83caf288b8d6f774"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:46:04 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "feat(preview): publish the review overlay into every preview\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "f550420f86fc31120dfe81fb83caf288b8d6f774",
      "tree": "b69e4440d2085ed8100d458ad2026f3cd9026cd4",
      "parents": [
        "25a1b549262df43ceb6f70f031dd0e2647e0e587"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:42:53 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "fix(preview): hide button and toast before capture\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "25a1b549262df43ceb6f70f031dd0e2647e0e587",
      "tree": "fbe7c4e9fdde10bf0a5edfd54ad06412b8ddf571",
      "parents": [
        "fdc22d7b24a5af5a8b2bb0201c2e3791599f2ee5"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:41:35 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "feat(preview): the review overlay\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "fdc22d7b24a5af5a8b2bb0201c2e3791599f2ee5",
      "tree": "6851ac0f9d5c11dde2aa22ad362e4de0ce2b8197",
      "parents": [
        "08d163ca2498e070c4d1246caa1bbf512a8db12b"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:37:33 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "fix(preview): proper viewport clamping and inclusive range boundaries\n\n- Fix clampRegion to clamp all four corners, preventing negative width/height\n- Add boundary tests to prevent regression in targetUrl range check\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "08d163ca2498e070c4d1246caa1bbf512a8db12b",
      "tree": "be46f5a46b524b9abf9b3677d999687c16da28fa",
      "parents": [
        "ae805b1f958c2ce156807f1771a85e0c5185052e"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:34:38 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "feat(preview): region clamping, caption text and diff-line URL resolution\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "ae805b1f958c2ce156807f1771a85e0c5185052e",
      "tree": "ee8510863019c205a5b987f3d7f305d722996c80",
      "parents": [
        "a25fc25487c2a9f9f2fa9c73641061b20df53cda"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 13:30:20 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "feat(preview): stamp JSX host elements with their source location\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "a25fc25487c2a9f9f2fa9c73641061b20df53cda",
      "tree": "cc9e1c1d9c8d2eb7d5d3b58c36408aceb283bfdf",
      "parents": [
        "6766fbf4c9d0e8d5e885c9116cf8d75a3a50293e"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:55:26 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "chore: vendor html2canvas 1.4.1 and add LICENSE entry\n\nVendors html2canvas 1.4.1 (dist/html2canvas.min.js + upstream LICENSE)\nunder vendor/html2canvas/ for the preview publisher to copy into\npreviews at publish time. It is not a package.json dependency.\n\nExcludes vendor/ from the three pre-commit hooks that mutate file\nbytes (end-of-file-fixer, mixed-line-ending, trailing-whitespace) so\nthe vendored file stays byte-identical to what npm distributes and\nits checksum stays verifiable. detect-private-key and\ncheck-added-large-files still run over vendor/.\n\nProvenance:\n  npm registry integrity (html2canvas@1.4.1 tarball):\n    sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA\u003d\u003d\n  sha256 of vendor/html2canvas/html2canvas.min.js:\n    e87e550794322e574a1fda0c1549a3c70dae5a93d9113417a429016838eab8cb\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "6766fbf4c9d0e8d5e885c9116cf8d75a3a50293e",
      "tree": "898dc4cc1a9841a6c993a872f65444c9a06d46bc",
      "parents": [
        "f7fa3277b3451bff5a56c70fd44a662920268a57"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:47:49 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "fix(preview): removals do not advance new-file line numbers in diff parsing\n\nDeletions in a unified diff exist only in the old file, so the new-file\nline cursor must not advance past them. This ensures comments anchored to\nchanged lines link to the correct location—off-by-one errors cause reviews\nto point to the wrong line with no warning.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "f7fa3277b3451bff5a56c70fd44a662920268a57",
      "tree": "8bad6df099ab9c0676abb2d7ebb33512145f645c",
      "parents": [
        "65c1e2a96e2c6f2c1d9548605fd3e549345fa4fd"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:45:48 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:37:00 2026 +0200"
      },
      "message": "feat(preview): compute GitHub diff anchors and added-line ranges\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "65c1e2a96e2c6f2c1d9548605fd3e549345fa4fd",
      "tree": "ac6684fbeb52d2314b20820b51fb45d3146cb899",
      "parents": [
        "3e960ed9183a9ebd2b4b0c3b77c2e2e00995e071"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:42:56 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 15:23:59 2026 +0200"
      },
      "message": "chore: add LICENSE and NOTICE\n\nThis repository carried neither. Both are copied from apache/magpie, the\nsibling repository of the same project: LICENSE is the standard Apache-2.0\ntext with that repository\u0027s framework-specific third-party section omitted,\nand NOTICE is the standard attribution for a project with no bundled\nthird-party content.\n\nOne question is left for the PMC rather than decided here. apache/magpie\u0027s\nNOTICE reproduces attributions for Apache Airflow and Apache Groovy, for\ncontent originating in those projects. This site syncs that repository\u0027s docs\nat build time and publishes them, so if the PMC considers the rendered docs\npart of what this repository distributes, those attributions belong here too.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "3e960ed9183a9ebd2b4b0c3b77c2e2e00995e071",
      "tree": "9fe7dfd1632d48286683bb7dfaad871a0fdde1e9",
      "parents": [
        "97c3ae08d83ee0d352dcefac168fde25eb5d0dfb"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:25:17 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:35:28 2026 +0200"
      },
      "message": "docs: land preview feedback on the diff line, not the conversation\n\nThe overlay now resolves the marked region to the source line that produced it\nand opens the pull request\u0027s Files tab anchored there, so the reviewer\u0027s\ncomment attaches to the code rather than to the conversation.\n\nThat reinstates the build-time data-magpie-src plugin an earlier revision of\nthis design dropped, and with it the divergence between a preview build and a\nproduction build. The design says so plainly rather than losing the property\nquietly: the divergence is additive, and a check asserts the production build\ncarries none of it.\n\nWhere the source line falls outside the diff, or nothing under the marked\nregion is annotated, the overlay opens the Conversation tab instead. It never\nguesses a line.\n\nAlso corrects two claims that the reversal made stale - the supersede note on\nthe 2026-09-16 design, and this design\u0027s own account of what it replaces.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "97c3ae08d83ee0d352dcefac168fde25eb5d0dfb",
      "tree": "3368935d63c95f72d8e9509e3f98d96b8f5256f4",
      "parents": [
        "1d350adbfe57e8e6e6eb8ad454d86dd5b0867467"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:20:40 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:35:28 2026 +0200"
      },
      "message": "docs: design for the preview review overlay\n\nA reviewer marks a rectangle on a PR preview and gets a screenshot of it on\nthe clipboard with the pull request\u0027s comment box open, ready to paste into\nand write in.\n\nThis supersedes the \"Reviewing in place\" section of the preview-deployments\ndesign, which was specified but never built. That version clicked an element\nand resolved its source file and line, which needed a build-time plugin and a\npreview-only build mode; this one needs neither, so previews stay\nbyte-identical to what production serves.\n\nThe shape is forced by two facts: GitHub has no public API for attaching an\nimage to a comment, so the clipboard is the floor at one paste; and the\nreviewer writes their prose in GitHub rather than in the overlay, which avoids\ntransferring text through a clipboard that can only hold one thing.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "1d350adbfe57e8e6e6eb8ad454d86dd5b0867467",
      "tree": "ec6bca4d0ce40aed37ea87725d8199a7eab26dd8",
      "parents": [
        "8b5dd0818e6f7b715c5da1d03c41ce33b7a85172"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:31:11 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:35:14 2026 +0200"
      },
      "message": "fix(preview): only republish a preview when the PR has changed\n\nEvery scheduled run was republishing every armed PR unconditionally. On #180\nthat meant a force-push of an identical tree and a rewritten status comment\nevery fifteen minutes, each one a commits@ mail, for a preview whose source\ncommit had not moved since it was first published.\n\nA preview branch\u0027s head commit subject already records what it was built from\n- \"Publish preview for #180 (14fdc13)\" - and the publisher already reads that\nsubject to detect tombstones. So the check costs no extra API call: if the\nrecorded commit equals the PR\u0027s current head, the run does nothing for that PR.\n\nA manual dispatch republishes regardless, since asking for a preview explicitly\nis a request to rebuild it. A tombstoned branch\u0027s subject carries no SHA, so a\nre-armed pull request publishes rather than looking up to date.\n\nVerified by removing the guard from a scratch copy: the new test fails, naming\nthe push that should not have happened.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "8b5dd0818e6f7b715c5da1d03c41ce33b7a85172",
      "tree": "4b2a863835c5a15a5787e7c7bbe2c23510575a51",
      "parents": [
        "c118b66093c4e3cd58af00b79d717d0c8f2e3acf"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Sep 17 01:34:27 2026 +0000"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 12:14:42 2026 +0200"
      },
      "message": "chore(deps-dev): bump the npm-dependencies group with 5 updates\n\nBumps the npm-dependencies group with 5 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.5.0` | `26.5.1` |\n| [react](https://github.com/react/react/tree/HEAD/packages/react) | `19.2.8` | `19.3.0` |\n| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.2.18` | `19.3.0` |\n| [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom) | `19.2.8` | `19.3.0` |\n| [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) | `19.2.7` | `19.3.0` |\n\n\nUpdates `@types/node` from 26.5.0 to 26.5.1\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)\n\nUpdates `react` from 19.2.8 to 19.3.0\n- [Release notes](https://github.com/react/react/releases)\n- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/react/react/commits/v19.3.0/packages/react)\n\nUpdates `@types/react` from 19.2.18 to 19.3.0\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)\n\nUpdates `react-dom` from 19.2.8 to 19.3.0\n- [Release notes](https://github.com/react/react/releases)\n- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/react/react/commits/v19.3.0/packages/react-dom)\n\nUpdates `@types/react-dom` from 19.2.7 to 19.3.0\n- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)\n- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)\n\n---\nupdated-dependencies:\n- dependency-name: \"@types/node\"\n  dependency-version: 26.5.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: npm-dependencies\n- dependency-name: react\n  dependency-version: 19.3.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: \"@types/react\"\n  dependency-version: 19.3.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: react-dom\n  dependency-version: 19.3.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n- dependency-name: \"@types/react-dom\"\n  dependency-version: 19.3.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: npm-dependencies\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "c118b66093c4e3cd58af00b79d717d0c8f2e3acf",
      "tree": "233cd5ba4b98a2414d64c7ba1688332334c09155",
      "parents": [
        "4a8ed4bbed632decdf56c70e8448137935956267"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Sep 16 22:50:27 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Thu Sep 17 00:34:51 2026 +0200"
      },
      "message": "fix(preview): commenting on a PR needs pull-requests: write\n\nThe first scheduled run of the preview publisher failed with 403 on every\ncomment it tried to post:\n\n  POST /repos/apache/magpie-site/issues/180/comments -\u003e 403\n  POST /repos/apache/magpie-site/issues/172/comments -\u003e 403\n\nThe token for that run carried Issues: write and PullRequests: read. The\nendpoint is issue-shaped, but the target is a pull request, and GitHub gates\nthat on the Pull requests permission — issues: write covers real issues only.\n\nThis restores pull-requests: write, which the workflow had before I narrowed\nit on a review comment that had the mapping backwards. issues: write stays for\nthe case where the target genuinely is an issue.\n\nThe run failed loudly rather than passing silently because of the failure\ncounter added in the same review, which is the only reason this surfaced on\nthe first run instead of going unnoticed.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "4a8ed4bbed632decdf56c70e8448137935956267",
      "tree": "a798d2c1d3ac80fe576dfe3f4b3f9167fd07b733",
      "parents": [
        "9cfeaf5db8ade0b4b2ff78c42c66e12399efb1d8"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Sep 16 17:36:58 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Sep 16 17:46:21 2026 +0200"
      },
      "message": "ci: require lint and build to pass before merging to main\n\nAdds a protected_branches block to .asf.yaml so main requires the two checks\nthat run on every pull request.\n\nThe other three jobs are deliberately left out, and the file says why: a\nrequired context whose workflow does not trigger is never reported, and the\npull request then blocks forever with nothing to re-run. asf-allowlist-check\nis path-filtered to .github/**, deploy is gated to refs/heads/main, and\npublish only runs on a schedule.\n\nstrict is false: main moves quickly, and requiring every branch to be current\nwould mean rebasing each open PR whenever anything merges.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "9cfeaf5db8ade0b4b2ff78c42c66e12399efb1d8",
      "tree": "9d5ef1b320bbb49a6e01f17cbd5e20af74005b6a",
      "parents": [
        "d060c6feccf5a3e3594fd1d90f54b224cd2e48a0",
        "d98440d987f11e9cc3662d3baee0b4c455903b96"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Sep 16 17:45:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 17:45:43 2026 +0200"
      },
      "message": "Merge pull request #181 from potiuk/chore/runs-on-ubuntu-slim\n\nci: run every job on ubuntu-slim"
    },
    {
      "commit": "d98440d987f11e9cc3662d3baee0b4c455903b96",
      "tree": "9d5ef1b320bbb49a6e01f17cbd5e20af74005b6a",
      "parents": [
        "d060c6feccf5a3e3594fd1d90f54b224cd2e48a0"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Sep 16 17:34:05 2026 +0200"
      },
      "committer": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Sep 16 17:34:05 2026 +0200"
      },
      "message": "ci: run every job on ubuntu-slim\n\nMoves all five jobs across the three workflows off ubuntu-latest.\n\nGenerated-by: Claude Opus 5\n"
    },
    {
      "commit": "d060c6feccf5a3e3594fd1d90f54b224cd2e48a0",
      "tree": "19b925303652dfeb7d3a33b3f9d8fcba67b79e02",
      "parents": [
        "217e0d536c3b610eb2bdcf0e1a8c3f5b4b520dbf",
        "d37421ccdce2bc4378cea2c21f384666741c3b02"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Wed Sep 16 17:24:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 17:24:39 2026 +0200"
      },
      "message": "Merge pull request #179 from potiuk/chore/designs-in-docs\n\ndocs: keep design documents in docs/designs/"
    }
  ],
  "next": "d37421ccdce2bc4378cea2c21f384666741c3b02"
}
