Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Wire a new CI job/workflow into the qvac-merge-guard / validate-pr aggregated required status check, instead of it becoming a disconnected standalone check
.claude/skills/tetherto-qv-merge-guard-wire/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 96% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 56% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 43% | 0% |
qvac-merge-guard / validate-pr is the single required status check on main. Adding a new CI job without wiring it into this aggregate creates a second, disconnected check the branch ruleset never requires — its failures become invisible. This skill is the checklist for wiring a job into the existing aggregate correctly.
Full reference with diagrams and worked examples: docs/ci/MERGE-GUARD.md.
qvac-merge-guard's pass/fail.pr-gate-merge.yml may produce the qvac-merge-guard / validate-pr check namebashgrep -rl "^ qvac-merge-guard:$" .github/workflows/*.yml
Must return only pr-gate-merge.yml. If any other file has a job id qvac-merge-guard (or a job calling a reusable workflow whose job id is validate-pr), that's a collision — it would silently satisfy the required check without going through the real gate. Fix before doing anything else in this skill.
Read .github/workflows/pr-gate-merge.yml, specifically the final qvac-merge-guard job's needs: list and the three with: booleans it passes to public-pr.yml. Read docs/ci/MERGE-GUARD.md for the diagram and worked examples.
Note: sdk-pod-checks reports under two check-context strings (SDK Pod Checks and sdk-pod-checks / SDK Pod Checks) — branch-coverage artifact, not a ruleset requirement. See the doc's "Gotcha" section.
Present these three options as an explicit question and let the human pick. Even if the repo state (an existing half-built caller workflow, an existing similar job, etc.) suggests one pattern, don't silently commit to it — surface the choice and its tradeoffs, then proceed with whichever the human confirms:
changes job's dorny/paths-filter map; no other wiring needed. Otherwise add the job to an existing category's needs: and AND its result into that category's boolean expression.When there truly are multiple targets, check matrix vs. caller before building anything — this repo has both shapes for the same problem:
workdir differs) → use a matrix like sanity-checks (strategy.matrix.include: ...). No caller workflow at all; the matrix job itself is what qvac-merge-guard depends on.uses:/inputs/secrets per target, or steps that genuinely diverge) → use a caller workflow with one named job per target, like prebuilds-caller.yml. This shape exists mainly for readability/separation, not because a matrix is technically impossible.Do not add each family member individually to qvac-merge-guard's needs:. Whichever shape you land on (matrix or caller), wire only that one job/caller into pr-gate-merge.yml, and feed its result into public-pr.yml's existing spare integration-tests-status input if unclaimed (don't invent a new one if a spare already fits).
qvac-merge-guard's needs:, and either reuse public-pr.yml's other spare input (build-with-model-status) or add a brand new boolean to both the with: block and public-pr.yml's workflow_call.inputs + shell check block.docs/ci/MERGE-GUARD.mdCopy the relevant snippet from the doc verbatim, substituting names. Do not invent a different needs:/if: shape from what's already established. If your new job's checks also need to run on branches Merge Guard doesn't cover (pr-gate-merge.yml is main-only), consider the two-trigger shape (own pull_request/pull_request_target + workflow_call) used by pr-checks-sdk-pod.yml — but understand upfront that produces two check-context strings for one piece of logic on main, and document both wherever the check is referenced by name.
Because pr-gate-merge.yml is pull_request_target-triggered, it always runs the version on main — a PR editing this file cannot validate its own change pre-merge. Merge first, then open a follow-up PR against updated main and confirm via gh pr checks <n> --repo tetherto/qvac that qvac-merge-guard / validate-pr appears exactly once and reflects the new job's result (force it to fail once to prove the aggregate check goes red).
grep -rl "^ qvac-merge-guard:$" .github/workflows/*.yml returns only pr-gate-merge.yml — no other workflow produces the qvac-merge-guard / validate-pr check name.needs: with no aggregation for a repeated family.pull_request_target trigger with zero needs: link into qvac-merge-guard was created.public-pr.yml input (integration-tests-status, build-with-model-status) before adding a new one.qvac-merge-guard / validate-pr reflects the new job — exactly one check name, no duplicate.qvac-merge-guard, confirmed and documented both resulting check-name strings (see the sdk-pod-checks gotcha) — no check-name regex/match written against only one of them.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 8,987 | 6,610 | -26% | 1 | 1 | 0% | 1,469 | 2,885 | +96% | 0 | 0 | — |
case-07 | pass→pass | 12,117 | 3,940 | -67% | 1 | 1 | 0% | 2,005 | 2,398 | +20% | 0 | 0 | — |
case-12 | pass→pass | 7,662 | 4,589 | -40% | 1 | 1 | 0% | 1,275 | 2,530 | +98% | 0 | 0 | — |
case-06 | pass→pass | 10,268 | 4,775 | -53% | 1 | 1 | 0% | 1,626 | 2,609 | +60% | 0 | 0 | — |
case-02 | fail→fail | 16,176 | 3,623 | -78% | 1 | 1 | 0% | 2,718 | 2,139 | -21% | 0 | 0 | — |
case-03 | fail→pass | 13,518 | 8,496 | -37% | 1 | 1 | 0% | 2,155 | 3,222 | +50% | 0 | 0 | — |
case-04 | fail→pass | 9,717 | 5,479 | -44% | 1 | 1 | 0% | 1,720 | 2,681 | +56% | 0 | 0 | — |
case-05 | fail→pass | 15,916 | 9,226 | -42% | 1 | 1 | 0% | 2,653 | 3,414 | +29% | 0 | 0 | — |
case-08 | fail→pass | 11,317 | 3,484 | -69% | 1 | 1 | 0% | 1,621 | 2,314 | +43% | 0 | 0 | — |
case-09 | pass→pass | 12,548 | 4,881 | -61% | 1 | 1 | 0% | 2,015 | 2,479 | +23% | 0 | 0 | — |
case-10 | pass→pass | 10,722 | 4,149 | -61% | 1 | 1 | 0% | 1,831 | 2,449 | +34% | 0 | 0 | — |
case-11 | pass→pass | 13,582 | 6,829 | -50% | 1 | 1 | 0% | 2,392 | 2,878 | +20% | 0 | 0 | — |
case-13 | pass→pass | 13,118 | 5,692 | -57% | 1 | 1 | 0% | 2,069 | 2,754 | +33% | 0 | 0 | — |
case-14 | fail→pass | 13,058 | 6,081 | -53% | 1 | 1 | 0% | 2,038 | 2,670 | +31% | 0 | 0 | — |
case-15 | fail→pass | 12,824 | 6,895 | -46% | 1 | 1 | 0% | 2,073 | 2,908 | +40% | 0 | 0 | — |
case-16 | fail→pass | 9,249 | 1,391 | -85% | 1 | 1 | 0% | 1,356 | 1,898 | +40% | 0 | 0 | — |
case-17 | fail→pass | 9,271 | 4,100 | -56% | 1 | 1 | 0% | 1,429 | 2,385 | +67% | 0 | 0 | — |
case-18 | pass→pass | 13,075 | 5,424 | -59% | 1 | 1 | 0% | 2,125 | 2,561 | +21% | 0 | 0 | — |
case-19 | pass→pass | 13,359 | 2,242 | -83% | 1 | 1 | 0% | 2,323 | 2,012 | -13% | 0 | 0 | — |
case-20 | pass→pass | 7,994 | 5,411 | -32% | 1 | 1 | 0% | 1,795 | 2,860 | +59% | 0 | 0 | — |
case-21 | pass→pass | 8,804 | 8,770 | -0% | 1 | 1 | 0% | 1,720 | 3,382 | +97% | 0 | 0 | — |
case-22 | pass→pass | 5,362 | 5,234 | -2% | 1 | 1 | 0% | 1,024 | 2,643 | +158% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.