[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C42TV73ZZ5TY86HHA682KG":3,"skill-same:01M6C42TV73ZZ5TY86HHA682KG":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":45,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":47,"updatedAt":48,"install":49,"resources":62},"01M6C42TV73ZZ5TY86HHA682KG","steward",null,"How to drive a QRCraftly pull request to merged. Use when opening a PR, handling CI or review events on it, updating its branch, or deciding whether to merge.","fderuiter\u002FQRCraftly-web","fderuiter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F127706008?v=4","01M6C40AWP9EPQBS3EG0RF5DRD","Frederick de Ruiter","01M6C40B116HSW5KCWXDPRX69M",5,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsteward\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"when","review","request","it","events","how to","drive","opening a pr","use","branch","how","ci","pull","pull request","pr","merge","2026-11-10 10:12:30",false,"---\nname: steward\ndescription: How to drive a QRCraftly pull request to merged. Use when opening a PR, handling CI or review events on it, updating its branch, or deciding whether to merge.\n---\n\n# Steward: driving a QRCraftly PR to merged\n\n`AGENTS.md` holds the invariants and `RELEASING.md` holds the release flow. This skill is the loop for one PR. Where they disagree, they win.\n\n## Before the first push\n\n1. Branch from current `main` with a prefix: `feat\u002F`, `fix\u002F`, `docs\u002F`, `refactor\u002F`, `chore\u002F`, `agent\u002F`, or `claude\u002F` for the branch a Claude session is given.\n2. While you work, use the targeted commands in the \"Fast loop\" section of `AGENTS.md`. Before pushing, run the checks a contributor runs locally, in this order, and fix everything:\n   - `pnpm run lint`\n   - `pnpm test -- --run`\n   - `pnpm build` when the change touches the build, routing, the generator or `public\u002F`\n   - `pnpm test:e2e` when the change touches navigation, rendering or input flows\n3. Run `pnpm run docs:sync` after changing anything in `src\u002Fcomponents\u002Fui\u002F`, `src\u002Fcomponents\u002Finputs\u002F`, `src\u002Fcomponents\u002Fstyle-controls\u002F`, `docs\u002Fpublic\u002F` or `docs\u002FSECURITY.md`, and commit what it writes.\n4. If you touch a file in `MAPPING` in `scripts\u002Fgit_lineage_auditor.js`, update the paired doc in the same PR.\n\n## Opening the PR\n\n- The title is a Conventional Commit (`fix(scanner): handle empty frames`). It becomes the squash commit and drives the version bump, so pick `feat` versus `fix` deliberately.\n- The base is always `main`. There is no `dev` branch.\n- Open it as a draft and keep it there until it is done. CI minutes are metered ([ADR 0050](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002F0050-ci-tiers-for-a-private-repository.md)): drafts skip unit tests, E2E and Lighthouse, and ready PRs run Chromium E2E only.\n- Add the `full-e2e` label when the change may behave differently in Firefox or WebKit (and on a release PR whose branch does not start with `release\u002F`). Add it before the push or ready toggle that should use it: `main.yml` does not run on `labeled`, so a label added later changes nothing until the next push or draft-to-ready toggle.\n- Write one closing keyword per issue (`Closes #12. Closes #13.`). In `Closes #12, #13` GitHub closes only #12.\n- Prefer one complete, tested PR over a chain of small ones. Every merge deploys to production.\n\n## Getting it green\n\nThe required checks are `CI`, `PR Title` and `Workers Builds: qrcraftly`.\n\n- **Out of date with `main`**: merge `main` into the branch (never rebase or force-push a branch someone else owns), re-run the local checks, push.\n- **`CI` red**: open the failing job's log, reproduce the failure locally, fix the root cause, show the same check passing, push. A failing test is never an infra flake until you have shown it fails the same way on `main`.\n- **`Workers Builds: qrcraftly` red**: the Cloudflare build runs `pnpm run build`; reproduce it with `pnpm build`.\n- **Bundle size**: CI runs `pnpm run check-bundle-size` after the build. Shrink the change rather than raising the budget.\n- Never skip, disable or quarantine a test, push an empty commit, or close and reopen a PR to re-trigger CI.\n\n- **Visual baselines**: screenshots taken locally or in a cloud session never match CI's fonts. For a PR that moves layout on purpose, add `full-e2e`, then the `update-snapshots` label; `.github\u002Fworkflows\u002Fupdate-snapshots.yml` commits refreshed baselines to the branch. CI runs on that bot commit wait as `action_required` until a maintainer approves them.\n\n## Reviews\n\n- Fix small, local review asks (nits, renames, an added test) and push.\n- Larger asks on someone else's PR: reply with a proposal and let the author decide.\n- Resolve the threads you addressed.\n\n## Merging\n\n- Merge only when every required check is green on the current head. Local checks alone never justify a merge.\n- The maintainer merges. Never merge a PR or enable auto-merge on one unless the maintainer has said so in words for that PR ([ADR 0020](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002F0020-trunk-based-releases-on-main.md), amendment).\n- Once the PR is complete and every required check is green on the current head, mark it ready for review and tell the maintainer it is ready. Remember that marking a PR ready starts the full CI tier, so let that run finish green before saying so.\n- **Never** enable auto-merge on, or merge, a `chore(release): vX.Y.Z` PR, even when asked to merge others. A maintainer merges those by hand.\n- No admin bypass of the `main` ruleset.\n\n## Merge conflicts\n\n- Merge `main` into the branch; never rebase or force-push a branch you did not create.\n- Regenerate lockfiles, `docs\u002Fpublic\u002FUI_CATALOG.md` (`pnpm run docs:sync`) and other generated files with their tools, never by hand.\n- When both sides changed the same logic, keep both behaviours if they are compatible. If keeping one loses the other, stop and ask the PR's owner.\n- Re-run the local checks before pushing the merge.\n\n## Merge queue\n\nGitHub's merge queue needs an organization-owned repository, so it is not on yet ([ADR 0051](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002F0051-merge-queue-readiness.md)). The workflows already run on `merge_group`. Once `.github\u002Frulesets\u002Fmain-merge-queue.json` is imported, auto-merge adds a PR to the queue, branches no longer need updating, and a PR that fails in the queue is removed from it: fix it and tell the maintainer, who re-queues it.\n\n## After the merge\n\nCheck that **Verify Production Deployment** (`deploy-verify.yml`; `CI` does not re-run on `main`) and the `Workers Builds: qrcraftly` check pass on the merge commit before merging the next PR. `curl -s https:\u002F\u002Fqrcraftly.com\u002Fversion.json` shows which commit production serves. If production broke, roll back in Cloudflare first, then fix forward with a PR (see `RELEASING.md`).\n\n## Things a PR must never add\n\nAds, analytics, telemetry, diagnostics pings or third-party scripts (`docs\u002FPLEDGE.md`); server-side redirects, D1 or Turnstile (dynamic QR codes were dropped for good); user input sent over the network or put in URL query strings; new persistent storage keys outside the allowlist in `AGENTS.md`.\n","# Steward: driving a QRCraftly PR to merged\n\n`AGENTS.md` holds the invariants and `RELEASING.md` holds the release flow. This skill is the loop for one PR. Where they disagree, they win.\n\n## Before the first push\n\n1. Branch from current `main` with a prefix: `feat\u002F`, `fix\u002F`, `docs\u002F`, `refactor\u002F`, `chore\u002F`, `agent\u002F`, or `claude\u002F` for the branch a Claude session is given.\n2. While you work, use the targeted commands in the \"Fast loop\" section of `AGENTS.md`. Before pushing, run the checks a contributor runs locally, in this order, and fix everything:\n   - `pnpm run lint`\n   - `pnpm test -- --run`\n   - `pnpm build` when the change touches the build, routing, the generator or `public\u002F`\n   - `pnpm test:e2e` when the change touches navigation, rendering or input flows\n3. Run `pnpm run docs:sync` after changing anything in `src\u002Fcomponents\u002Fui\u002F`, `src\u002Fcomponents\u002Finputs\u002F`, `src\u002Fcomponents\u002Fstyle-controls\u002F`, `docs\u002Fpublic\u002F` or `docs\u002FSECURITY.md`, and commit what it writes.\n4. If you touch a file in `MAPPING` in `scripts\u002Fgit_lineage_auditor.js`, update the paired doc in the same PR.\n\n## Opening the PR\n\n- The title is a Conventional Commit (`fix(scanner): handle empty frames`). It becomes the squash commit and drives the version bump, so pick `feat` versus `fix` deliberately.\n- The base is always `main`. There is no `dev` branch.\n- Open it as a draft and keep it there until it is done. CI minutes are metered ([ADR 0050](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002F0050-ci-tiers-for-a-private-repository.md)): drafts skip unit tests, E2E and Lighthouse, and ready PRs run Chromium E2E only.\n- Add the `full-e2e` label when the change may behave differently in Firefox or WebKit (and on a release PR whose branch does not start with `release\u002F`). Add it before the push or ready toggle that should use it: `main.yml` does not run on `labeled`, so a label added later changes nothing until the next push or draft-to-ready toggle.\n- Write one closing keyword per issue (`Closes #12. Closes #13.`). In `Closes #12, #13` GitHub closes only #12.\n- Prefer one complete, tested PR over a chain of small ones. Every merge deploys to production.\n\n## Getting it green\n\nThe required checks are `CI`, `PR Title` and `Workers Builds: qrcraftly`.\n\n- **Out of date with `main`**: merge `main` into the branch (never rebase or force-push a branch someone else owns), re-run the local checks, push.\n- **`CI` red**: open the failing job's log, reproduce the failure locally, fix the root cause, show the same check passing, push. A failing test is never an infra flake until you have shown it fails the same way on `main`.\n- **`Workers Builds: qrcraftly` red**: the Cloudflare build runs `pnpm run build`; reproduce it with `pnpm build`.\n- **Bundle size**: CI runs `pnpm run check-bundle-size` after the build. Shrink the change rather than raising the budget.\n- Never skip, disable or quarantine a test, push an empty commit, or close and reopen a PR to re-trigger CI.\n\n- **Visual baselines**: screenshots taken locally or in a cloud session never match CI's fonts. For a PR that moves layout on purpose, add `full-e2e`, then the `update-snapshots` label; `.github\u002Fworkflows\u002Fupdate-snapshots.yml` commits refreshed baselines to the branch. CI runs on that bot commit wait as `action_required` until a maintainer approves them.\n\n## Reviews\n\n- Fix small, local review asks (nits, renames, an added test) and push.\n- Larger asks on someone else's PR: reply with a proposal and let the author decide.\n- Resolve the threads you addressed.\n\n## Merging\n\n- Merge only when every required check is green on the current head. Local checks alone never justify a merge.\n- The maintainer merges. Never merge a PR or enable auto-merge on one unless the maintainer has said so in words for that PR ([ADR 0020](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002F0020-trunk-based-releases-on-main.md), amendment).\n- Once the PR is complete and every required check is green on the current head, mark it ready for review and tell the maintainer it is ready. Remember that marking a PR ready starts the full CI tier, so let that run finish green before saying so.\n- **Never** enable auto-merge on, or merge, a `chore(release): vX.Y.Z` PR, even when asked to merge others. A maintainer merges those by hand.\n- No admin bypass of the `main` ruleset.\n\n## Merge conflicts\n\n- Merge `main` into the branch; never rebase or force-push a branch you did not create.\n- Regenerate lockfiles, `docs\u002Fpublic\u002FUI_CATALOG.md` (`pnpm run docs:sync`) and other generated files with their tools, never by hand.\n- When both sides changed the same logic, keep both behaviours if they are compatible. If keeping one loses the other, stop and ask the PR's owner.\n- Re-run the local checks before pushing the merge.\n\n## Merge queue\n\nGitHub's merge queue needs an organization-owned repository, so it is not on yet ([ADR 0051](..\u002F..\u002F..\u002Fdocs\u002Fadr\u002F0051-merge-queue-readiness.md)). The workflows already run on `merge_group`. Once `.github\u002Frulesets\u002Fmain-merge-queue.json` is imported, auto-merge adds a PR to the queue, branches no longer need updating, and a PR that fails in the queue is removed from it: fix it and tell the maintainer, who re-queues it.\n\n## After the merge\n\nCheck that **Verify Production Deployment** (`deploy-verify.yml`; `CI` does not re-run on `main`) and the `Workers Builds: qrcraftly` check pass on the merge commit before merging the next PR. `curl -s https:\u002F\u002Fqrcraftly.com\u002Fversion.json` shows which commit production serves. If production broke, roll back in Cloudflare first, then fix forward with a PR (see `RELEASING.md`).\n\n## Things a PR must never add\n\nAds, analytics, telemetry, diagnostics pings or third-party scripts (`docs\u002FPLEDGE.md`); server-side redirects, D1 or Turnstile (dynamic QR codes were dropped for good); user input sent over the network or put in URL query strings; new persistent storage keys outside the allowlist in `AGENTS.md`.\n",{"name":5,"description":7},"main","5e9ab49e1cb8cac3dbf2019f3f975572fc7282f7",".claude\u002Fskills\u002Fsteward",0,"https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web","https:\u002F\u002Fqrcraftly.com","https:\u002F\u002Fgithub.com\u002Ffderuiter","Clinical Data Specialist at @Bright-Research \r\n\r\nInterests in Photogrammetry, Data Analytics + Pipelines, Mathematics, and AI\u002FML.\r\n\r\nPython, Rust, TS.","2026-11-11 07:27:14",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add fderuiter\u002FQRCraftly-web --skill steward",{"tool":55,"command":56},"bunx","bunx skills add fderuiter\u002FQRCraftly-web --skill steward",{"tool":58,"command":59},"pnpm","pnpm dlx skills add fderuiter\u002FQRCraftly-web --skill steward","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsteward\u002FSKILL.md",true,[],[64,81,124,145,158,171],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":68,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":35},"01M6C40FJCT5X27N59TX7RQZRY","claude-handoff","Hand the current conversation off to a fresh background agent that picks up the work immediately.","MIT","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclaude-handoff\u002FSKILL.md",[],[72,73,74,75,76,77,78,79,80],"handoff","claude handoff","matt pocock","work","up","conversation","fresh","hand","background",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":95,"publishedAt":35},"01M6C42QWPRJ0G7BXDXE3DK50N","run-qrcraftly","Build, run, and drive the QRCraftly web app (Vike + React on Vite). Use when asked to start the dev server or production preview, take a screenshot of a page, click through the generator or QR code checker, download a generated code, confirm a UI change works in the real app, call a src\u002Fpackages function directly, or run unit and Playwright e2e tests in this container.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frun-qrcraftly\u002FSKILL.md",[87,92],{"categoryNo":88,"categoryName":89,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":93,"categoryName":94,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000009","前端开发",[96,97,98,99,100,101,102,103,104,105,19,106,107,108,109,110,27,111,112,113,114,115,116,117,118,119,120,121,122,123],"run qrcraftly","run","packages","react","code","dev","server","start","e2e tests","change","e2e","src","page","qr code","generated","vite","container","call","preview","tests","app","click","unit","generator","checker","take a screenshot","web","playwright",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":68,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":138,"publishedAt":35},"01M6C42NHXSZNS2E96WP7VQR4K","writing-shape","Writing, exploit: shape raw material into an article, paragraph by paragraph.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-shape\u002FSKILL.md",[130,133],{"categoryNo":131,"categoryName":132,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":134,"categoryName":135,"taxonomyType":136,"taxonomyTypeDesc":137},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[139,140,141,74,142,143,144],"writing","writing shape","shape","exploit","article","material",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":68,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":153,"publishedAt":35},"01M6C42M1W5P95XKMR7B1HD7F3","writing-fragments","Writing, explore: mine raw fragments, no structure yet.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-fragments\u002FSKILL.md",[151,152],{"categoryNo":131,"categoryName":132,"taxonomyType":90,"taxonomyTypeDesc":91},{"categoryNo":134,"categoryName":135,"taxonomyType":136,"taxonomyTypeDesc":137},[139,154,155,74,156,157],"writing fragments","explore","structure","mine",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":68,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":166,"publishedAt":35},"01M6C42J3DYGGDFFKNV8QFFSS9","writing-for-agents","Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[164,165],{"categoryNo":131,"categoryName":132,"taxonomyType":90,"taxonomyTypeDesc":91},{"categoryNo":134,"categoryName":135,"taxonomyType":136,"taxonomyTypeDesc":137},[167,168,139,169,74,170,27,19],"for","writing for agents","documents","editing",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":68,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":179,"publishedAt":35},"01M6C42GJXR8YEKS8V085G4FH6","writing-beats","Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.","https:\u002F\u002Fgithub.com\u002Ffderuiter\u002FQRCraftly-web\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-beats\u002FSKILL.md",[177,178],{"categoryNo":131,"categoryName":132,"taxonomyType":90,"taxonomyTypeDesc":91},{"categoryNo":134,"categoryName":135,"taxonomyType":136,"taxonomyTypeDesc":137},[180,139,74,181,142,182,144,22,183],"writing beats","assemble","journey","grounding"]