[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C69MN43YFEDGBTY9VHDVMW":3,"skill-same:01M6C69MN43YFEDGBTY9VHDVMW":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":6,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6C69MN43YFEDGBTY9VHDVMW","gates-and-baselines",null,"Governs quality gates and the unified-baseline snapshots. Use when authoring a baseline refresh commit (coverage, CRAP, maintainability, duplication, dead-exports), when setting up or modifying CI quality gates, or when introducing a new gate that asserts on pre-existing state without turning the base branch red.","dsj1984\u002Fmandrel","dsj1984","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20933070?v=4","01M6C69AY3555XWE3QAXETZH6W","01M6C69B26E25DHM9NTPQ7TZQ9",7,"MIT","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcore\u002Fgates-and-baselines\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"gates","gates and baselines","refresh","new","when","Existing","maintainability","snapshots","up","use","coverage","commit","write","read","branch","quality","Bash","baseline","ci","state","quality gates","2026-11-10 10:12:30",false,"---\nname: gates-and-baselines\ndescription:\n  Governs quality gates and the unified-baseline snapshots. Use when authoring\n  a baseline refresh commit (coverage, CRAP, maintainability, duplication,\n  dead-exports), when setting up or modifying CI quality gates, or when\n  introducing a new gate that asserts on pre-existing state without turning the\n  base branch red.\nallowed_tools:\n  - Read\n  - Write\n  - Bash\n---\n\n# Gates and Baselines\n\n## Policy Capsule\n\n- **No gate may be skipped.** Failing lint means fix lint; a failing test means fix the code, not `.skip` or delete the test. Feed CI failure output back verbatim and reproduce locally before re-pushing.\n- **Introducing a gate that asserts on pre-existing state** (doc-drift, lint-vocabulary, dependency-cycle, missing-coverage) MUST land green at merge: either advisory-first (report-only until the backlog is burned down) or with the populated baseline committed in the same change that turns the gate on. Never wire a gate into `requiredChecks` that lands red on latent findings nobody authored.\n- **Refresh a baseline only when the change is deliberate** — a rename\u002Fmove, an operator-approved complexity bump, a signed-off perf delta, an intentional API-surface change. Never refresh to paper over an unintentional regression; fix the regression instead.\n- **Pick the refresh that matches why you are refreshing** — the wrong scope silently no-ops. `npm run \u003Ckind>:update` is **diff-scoped**: it re-scores only files changed in `origin\u002Fmain..HEAD` and preserves every other row verbatim; that is what you want after changing code. `npm run \u003Ckind>:reanchor` is the same script with `--full-scope` and re-scores every file in every target dir; that is what you want when the baseline is **stale** (a scorer-version bump, a coverage-shape change, accumulated drift), because a diff-scoped run would leave the stale rows exactly as they were.\n- Kinds carrying both scopes: `coverage`, `crap`, `maintainability`, `duplication`. Dead-exports has no scope axis — knip scores the whole graph, so `npm run dead-exports:update` (both passes) is the only sanctioned way to write `baselines\u002Fdead-exports.json` \u002F `baselines\u002Fdead-exports-production.json`; never hand-edit them. Run any refresh on the **Story branch**, never on `main`.\n- Verify the refresh diff is scoped to the relevant `baselines\u002F\u003Ckind>.json` (plus cosmetic `package-lock.json` churn only). If unrelated files appear, STOP — the refresh is contaminated. Stage baseline files **explicitly** (`git add baselines\u002F\u003Ckind>.json`); never `git add -A` in a refresh commit.\n- Commit-subject contract: the **Conventional-Commits** subject `chore(baselines): refresh \u003Ckind> snapshot for \u003Creason>` — never an ad-hoc leading token like `baseline-refresh:` (commitlint and the planner validator reject it). The body is **mandatory** and non-empty: what changed, why the new floor is correct, and the Story that triggered it.\n- Add the machine-readable trailer `baseline-refresh: true` (git-trailer `Key: value` style) and `Story: #\u003CstoryId>` to that body. Never pass `--no-verify`; the `commit-msg` hook (commitlint) MUST run and pass.\n- After the refresh lands, re-run `node .agents\u002Fscripts\u002Fcheck-baselines.js` to confirm the gate passes against the new snapshot; if it still fails, a sibling kind drifted — refresh that kind too.\n- Open a [`reference.md`](reference.md) section only when the task engages it: the baseline roster, the per-kind refresh table, and the step-by-step procedure live there.\n","# Gates and Baselines\n\n## Policy Capsule\n\n- **No gate may be skipped.** Failing lint means fix lint; a failing test means fix the code, not `.skip` or delete the test. Feed CI failure output back verbatim and reproduce locally before re-pushing.\n- **Introducing a gate that asserts on pre-existing state** (doc-drift, lint-vocabulary, dependency-cycle, missing-coverage) MUST land green at merge: either advisory-first (report-only until the backlog is burned down) or with the populated baseline committed in the same change that turns the gate on. Never wire a gate into `requiredChecks` that lands red on latent findings nobody authored.\n- **Refresh a baseline only when the change is deliberate** — a rename\u002Fmove, an operator-approved complexity bump, a signed-off perf delta, an intentional API-surface change. Never refresh to paper over an unintentional regression; fix the regression instead.\n- **Pick the refresh that matches why you are refreshing** — the wrong scope silently no-ops. `npm run \u003Ckind>:update` is **diff-scoped**: it re-scores only files changed in `origin\u002Fmain..HEAD` and preserves every other row verbatim; that is what you want after changing code. `npm run \u003Ckind>:reanchor` is the same script with `--full-scope` and re-scores every file in every target dir; that is what you want when the baseline is **stale** (a scorer-version bump, a coverage-shape change, accumulated drift), because a diff-scoped run would leave the stale rows exactly as they were.\n- Kinds carrying both scopes: `coverage`, `crap`, `maintainability`, `duplication`. Dead-exports has no scope axis — knip scores the whole graph, so `npm run dead-exports:update` (both passes) is the only sanctioned way to write `baselines\u002Fdead-exports.json` \u002F `baselines\u002Fdead-exports-production.json`; never hand-edit them. Run any refresh on the **Story branch**, never on `main`.\n- Verify the refresh diff is scoped to the relevant `baselines\u002F\u003Ckind>.json` (plus cosmetic `package-lock.json` churn only). If unrelated files appear, STOP — the refresh is contaminated. Stage baseline files **explicitly** (`git add baselines\u002F\u003Ckind>.json`); never `git add -A` in a refresh commit.\n- Commit-subject contract: the **Conventional-Commits** subject `chore(baselines): refresh \u003Ckind> snapshot for \u003Creason>` — never an ad-hoc leading token like `baseline-refresh:` (commitlint and the planner validator reject it). The body is **mandatory** and non-empty: what changed, why the new floor is correct, and the Story that triggered it.\n- Add the machine-readable trailer `baseline-refresh: true` (git-trailer `Key: value` style) and `Story: #\u003CstoryId>` to that body. Never pass `--no-verify`; the `commit-msg` hook (commitlint) MUST run and pass.\n- After the refresh lands, re-run `node .agents\u002Fscripts\u002Fcheck-baselines.js` to confirm the gate passes against the new snapshot; if it still fails, a sibling kind drifted — refresh that kind too.\n- Open a [`reference.md`](reference.md) section only when the task engages it: the baseline roster, the per-kind refresh table, and the step-by-step procedure live there.\n",{"name":5,"description":7,"allowed_tools":44},[45,46,34],"Read","Write","main","1ebd42c768218cb54c92d3dfd25b42c9ec41c85c",".agents\u002Fskills\u002Fcore\u002Fgates-and-baselines",1,"https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel","https:\u002F\u002Fgithub.com\u002Fdsj1984","2026-11-13 20:41:44",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add dsj1984\u002Fmandrel --skill gates-and-baselines",{"tool":60,"command":61},"bunx","bunx skills add dsj1984\u002Fmandrel --skill gates-and-baselines",{"tool":63,"command":64},"pnpm","pnpm dlx skills add dsj1984\u002Fmandrel --skill gates-and-baselines","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcore\u002Fgates-and-baselines\u002FSKILL.md",true,[68],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"reference.md","REFERENCE","参考文档",4982,"https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcore\u002Fgates-and-baselines\u002Freference.md",[75,91,128,163,185,206],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":86,"publishedAt":39},"01M6C6A5QVWE0AEWJYC362G9BY","no-capsule-skill","Fixture without a Policy Capsule section.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002Ftests\u002Forchestration\u002Ffixtures\u002Fskill-capsule\u002Fno-capsule-skill\u002FSKILL.md",[81],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[87,88,89,90],"no capsule skill","policy","fixture","section",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":101,"publishedAt":39},"01M6C6A2VK7QVY7H5NC6SG89DT","qa-harness","Conventions for agent-driven QA driving — the one driving-conventions reference behind both `\u002Fqa-run` (the known-scenario sweep through a real browser) and `\u002Fqa-explore` (agent-led exploratory driving). Use when instrumenting a live surface — covers navigation-first execution, per-surface console and network capture, design-token visual checks, the `F#` finding shape, per-environment resolution, and static driving as the documented interim. The run procedures live in `.agents\u002Fworkflows\u002Fqa-run.md` and `.agents\u002Fworkflows\u002Fqa-explore.md`; this skill is the conventions reference they lean on.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fqa-harness\u002FSKILL.md",[97,100],{"categoryNo":98,"categoryName":99,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},[102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,27,118,119,120,121,122,123,124,125,126,127,22],"qa","harness","qa harness","design","workflows","run","console","browser","network","execution","first","explore","sweep","capture","environment","lean","shape","reference","navigation","real browser","token","live","scenario","as","for","static",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":142,"publishedAt":39},"01M6C6A01GDNYJWG3647322JR3","playwright","Robust E2E browser testing with Playwright. Use when writing browser-driven tests — leverage auto-waiting (no `waitForTimeout`), prefer user-visible locators (`getByRole`, `getByText`, `getByLabel`) over CSS\u002FXPath, reuse `storageState` for auth, and enable trace-on-first-retry for CI debugging. Also carries the `data-testid` contract a UI change states in its acceptance criteria.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fplaywright\u002FSKILL.md",[134,137],{"categoryNo":135,"categoryName":136,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":138,"categoryName":139,"taxonomyType":140,"taxonomyTypeDesc":141},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[130,143,144,145,146,147,148,149,109,150,151,36,152,153,112,154,155,27,156,157,158,159,160,161,162,126,22],"testing","writing","css","change","auth","debugging","acceptance","browser testing","ui","data","e2e","trace","user","auto","contract","tests","leverage","reuse","states","retry",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":170,"publishedAt":39},"01M6C69Y3SR8BJ8XRT0E0S6Z4S","playwright-bdd","Wires Gherkin `.feature` files to Playwright via the `playwright-bdd` library. Use when running BDD scenarios on a Playwright runtime — pairs with the `gherkin-authoring` skill (scenario prose) and the `playwright` skill (browser conventions). Drives execution by tag expression with trace-first debugging and Playwright-native sharding.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fplaywright-bdd\u002FSKILL.md",[169],{"categoryNo":135,"categoryName":136,"taxonomyType":84,"taxonomyTypeDesc":85},[130,171,172,148,109,173,111,112,154,27,174,175,176,177,178,179,180,181,182,183,22,184],"bdd","playwright bdd","library","bdd scenarios","files","runtime","feature","authoring","expression","via","native","with","Sharding","running",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":191,"publishedAt":39},"01M6C69VESMZC07ACCXGJ1MQ8W","gherkin-authoring","Authors `.feature` files that stay business-readable, translate cleanly from PRD acceptance criteria, and reuse a shared step-definition library. Use when writing or editing scenarios — the SSOT enforcement rules live in `.agents\u002Frules\u002Fgherkin-standards.md`; this skill shows authors how to apply them.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fstack\u002Fqa\u002Fgherkin-authoring\u002FSKILL.md",[],[192,178,144,193,149,173,194,195,196,197,198,27,199,200,175,201,202,177,203,160,204,205,22],"gherkin authoring","translate","prd","how","Rules","editing","business","standards","enforcement","acceptance criteria","shared","how to","definition","apply",{"skillNo":207,"name":208,"nameZh":6,"description":209,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":210,"categories":211,"keywords":212,"publishedAt":39},"01M6C69RYKQDPM0C1QGJZ8B4ZV","security-and-hardening","Hardens code against vulnerabilities. Use when handling user input, authentication, data storage, or external integrations. The non-negotiable security MUSTs live in `.agents\u002Frules\u002Fsecurity-baseline.md`; this skill shows how to apply them, with the project's surfacing and validation-response process.","https:\u002F\u002Fgithub.com\u002Fdsj1984\u002Fmandrel\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcore\u002Fsecurity-and-hardening\u002FSKILL.md",[],[213,214,215,216,217,218,219,220,152,35,195,221,196,155,222,27,223,224,203,182,205,22],"security","hardening","security and hardening","vulnerabilities","storage","code","authentication","validation","integrations","process","project","data storage"]