plugins/generating-quality-gate-workflows/skills/generating-quality-gate-workflows/SKILL.md
Generates the CI workflow that enforces a quality contract: layered jobs from fast local hooks to release gates, per-practice steps for JS/TS toolchains, diff-scoped checks, sticky PR reporting, required-check wiring, and a severity policy deciding what fails the build. Use when quality practices are agreed but not enforced, when CI runs everything on every commit, when a gate reports green while the check it runs cannot fail, or when a per-change gate needs to post findings on the pull request.
npx skillsauth add jaktestowac/awesome-copilot-for-testers generating-quality-gate-workflowsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill to turn an agreed set of quality practices into CI that actually enforces them.
Two failures are common and opposite. A workflow that runs everything on every commit, so it is slow, so people stop gating on it. And a workflow full of steps that cannot fail - || true, continue-on-error, thresholds at zero, jobs that are not required checks - so it reports green regardless. The second is worse, because it produces the feeling of a gate.
A gate that cannot fail is worse than no gate. Every rule here follows from that.
paths: filters derived from the change-relevance recipes.continue-on-error or a lowered threshold carries a waiver id and an expiry in a comment..qa/quality-contract.md if it exists; otherwise the agreed list, and say it is un-contracted.| Layer | Where | What belongs here | Blocking |
| --- | --- | --- | --- |
| 1 - Local | pre-commit / pre-push hook | format, lint on staged files, typecheck, fast unit tests, secret scan | bypassable by design |
| 2 - CI, every PR | deterministic jobs | lint with --max-warnings 0, strict typecheck, tests with no skips, diff coverage, duplication, SAST, dependency audit, contract checks | yes |
| 3 - Review | review jobs and agents | assertion quality, standards review, security review | advisory or blocking, stated |
| 4 - Release | pre-release pipeline | production readiness, performance thresholds, DAST, release sign-off | yes, on the release path |
The allocation rule: anything a developer needs within seconds goes to layer 1 and must not block; anything the team relies on goes to layer 2 and must.
./resources/github-actions-jobs.md and ./resources/gitlab-ci-jobs.md have working per-practice steps for JS/TS: lint, typecheck, unit, diff coverage, E2E with sharding, contract validation, SAST, secret scan, dependency audit, accessibility, evals, mutation, performance.
Per-job hygiene, every time:
timeout-minutes; a hung job is an unresolvable required checkpermissions:, adding pull-requests: write only where a comment is postedfetch-depth: 0 / GIT_DEPTH: 0 wherever a merge base is neededretries to mask flake - measure it and quarantine with an owner and a dateMake it explicit and put it in the repo, not in people's heads:
| Practice level | Verdict | CI behaviour | | --- | --- | --- | | MUST unmet on escalated surface | BLOCK | job fails, required check red | | MUST unmet elsewhere | BLOCK or WARN per policy | fails, or soft-fails visibly | | SHOULD unmet | WARN | soft gate, amber, visible | | COULD unmet | INFO | reported, never fails | | Advisory practices (comprehension) | NUDGE | reported, never fails, ever |
Then write the escape hatch: a suppression is allowed, it needs a waiver id and an expiry in a comment, and an expired waiver fails its own check (governing-quality-waivers). A gate with no documented escape hatch gets an undocumented one.
::error file=…,line=…, GitLab coverage reports. Annotations get fixed; log lines get scrolled past.The step everyone omits. For each new blocking job, prove it works:
Specifically verify: the changed-line count is non-zero when the diff is non-empty (path matching is the usual silent failure), the threshold is above the current value rather than below it, and the job appears in required checks.
A gate nobody has watched fail is a gate nobody knows works. This is the same rule as "every guardrail needs a test that proves it fires".
|| true and friends. npm audit || true, tool || echo "non-blocking", set +e. Reports green whatever happens, and continue-on-error: false next to it reads as strictness.paths-ignore: ['**']../resources/github-actions-jobs.md - per-practice GitHub Actions jobs, soft gates, sticky comments, fork handling, monorepo and sharding patterns./resources/gitlab-ci-jobs.md - the GitLab equivalents: allow_failure, rules, MR notes, coverage reports, and merge-request pipelinesderiving-a-quality-contract - supplies the practices, levels and thresholds this workflow enforcesscoping-change-relevance - supplies the paths: filters for expensive jobsverifying-change-coverage - the diff-coverage job in detail, including artifact merginggoverning-quality-waivers - the suppression register and the expiry check this workflow runscreating-hooks - layer 1: local hooks, which must stay fast and bypassabletesting-llm-features - the eval job, its trigger paths and its fork-safe formassessing-release-readiness - layer 4, where the release gate reports intoThis skill is complete when:
continue-on-error / allow_failure rather than || truepaths: filters, timeouts, pinned versions and least-privilege permissionstesting
Tests the customization assets themselves - skills, prompts, custom agents, instructions - the way a product is tested: activation cases that check an asset fires when it should and stays quiet when it should not, output-contract cases, safety cases, collision cases between assets competing for the same trigger, a weighted rubric scored blind, and a baseline-versus-candidate gate before an edit ships. Use when a skill is edited and nobody knows whether behaviour changed, when two skills fight over the same request, when a description is being tuned for discoverability, when a collection has grown past manual spot-checking, or when the request mentions skill evals, prompt regression, or "does this skill actually work".
development
Shapes QA output for the person who has to act on it: result and blocker in the first two lines, one decision per report, findings ordered by what they cost, the long artifact in a file and the decisions in the message, and magnitude stated in units the reader can count. Use when a report is accurate but nobody acts on it, when a finding set is too long to read under time pressure, when the same findings must be retold for a developer, a release manager, and an on-call engineer, or when the request mentions "too long", "make this readable", "just tell me what to do", "so what", or "summarize this for stakeholders". Pairs with unslop-answers, which makes the same report honest.
testing
Verifies that the lines and branches a change actually touched are executed by tests, using LCOV or Cobertura diff coverage instead of whole-repo percentages, and escalates uncovered high-risk changes into a blocking finding. Use when a pull request needs a coverage gate that unrelated tests cannot satisfy, when total coverage looks healthy but the diff is untested, when wiring diff coverage into CI, or when someone claims a change is covered because the suite is green.
development
Cuts AI tells from test code: tests that pass without proving anything, tautological assertions, mock-only tests, hardcoded waits, coverage theater, vague names, swallowed errors, retries used as fixes. Use whenever test code is written, changed, or reviewed, including tests produced as a side effect of a feature task, and when the request mentions "review these tests", "are these tests any good", "this test always passes", "this suite is flaky", or "clean up these tests". Must always apply to test code.