qv-merge-guard-wire
Skill697 starsChanged 18 days agoApache-2.0View on GitHub
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
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 28
Read .github/workflows/pr-gate-merge.yml, specifically the final qvac-merge-guard job's needs: list and the three with: booleans it passes …
- Distinctive: line 39
When there truly are multiple targets, check matrix vs.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Merge Guard Wire — hook a new job into the required status check
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.
When to use
- Adding any new job/workflow that should block merges — regardless of domain (addon package check, SDK check, docs validation, security scan, licensing gate, anything).
- A PR review flags a new job that isn't reflected in
qvac-merge-guard's pass/fail.
Hard rule: nothing but pr-gate-merge.yml may produce the qvac-merge-guard / validate-pr check name
grep -rl "^ qvac-merge-guard:$" .github/workflows/*.ymlMust 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.
Step 1 — Read the current job graph
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 as sdk-pod-checks / SDK Pod Checks on PRs into main and as SDK Pod Checks on PRs into release-*/feature-*/tmp-*. See the doc's "Gotcha" section.
Step 2 — Ask the user which of the three patterns fits — do not silently infer it
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:
- Folds into an existing category (another instance of a check already gated on, whatever its domain) — if matrix/filter-driven, add it to the
changesjob'sdorny/paths-filtermap; no other wiring needed. Otherwise add the job to an existing category'sneeds:and AND its result into that category's boolean expression. A repeated, growing family of similarly-shaped jobs — more than one or two near-identical jobs differing only by target (one per package, one per platform, one per service, whatever naming pattern). Only one target today? This is not your pattern — use 1 or 3 instead and wire the single job directly. A caller workflow's value is dispatching to multiple targets from one place; building one for a single target is pure indirection. Refactor into a caller once a second target genuinely shows up.
When there truly are multiple targets, check matrix vs. caller before building anything — this repo has both shapes for the same problem:
- Uniform job body across targets (same composite action/steps, only e.g.
workdirdiffers) → use a matrix likesanity-checks(strategy.matrix.include: ...). No caller workflow at all; the matrix job itself is whatqvac-merge-guarddepends on. - Heterogeneous per-target jobs (different
uses:/inputs/secrets per target, or steps that genuinely diverge) → use a caller workflow with one named job per target, likeprebuilds-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'sneeds:. Whichever shape you land on (matrix or caller), wire only that one job/caller intopr-gate-merge.yml, and feed its result intopublic-pr.yml's existing spareintegration-tests-statusinput if unclaimed (don't invent a new one if a spare already fits).- Uniform job body across targets (same composite action/steps, only e.g.
- Genuinely new category — a one-off job that isn't a repeated family and doesn't fit any existing boolean. Add the job, add it to
qvac-merge-guard'sneeds:, and either reusepublic-pr.yml's other spare input (build-with-model-status) or add a brand new boolean to both thewith:block andpublic-pr.yml'sworkflow_call.inputs+ shell check block.
Step 3 — Wire it, following the exact code shape in docs/ci/MERGE-GUARD.md
Copy 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 used by pr-checks-sdk-pod.yml: workflow_call for main, plus its own pull_request/pull_request_target trigger limited to the other branches so main PRs do not run it twice. It reports under a different check-context string on each path; document both wherever the check is referenced by name.
Step 4 — Validate
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).
Verification checklist before calling this done
- Confirmed
grep -rl "^ qvac-merge-guard:$" .github/workflows/*.ymlreturns onlypr-gate-merge.yml— no other workflow produces theqvac-merge-guard / validate-prcheck name. - Picked the right pattern (fold-in / caller-workflow / new-boolean) per Step 2 — did not add a job to
needs:with no aggregation for a repeated family. - If a caller workflow was built, confirmed there are genuinely 2+ targets today — not built preemptively for a single target.
- No new top-level
pull_request_targettrigger with zeroneeds:link intoqvac-merge-guardwas created. - Checked for a spare unused
public-pr.ymlinput (integration-tests-status,build-with-model-status) before adding a new one. - Validated post-merge (not pre-merge) that
qvac-merge-guard / validate-prreflects the new job — exactly one check name, no duplicate. - If the new job has its own independent trigger in addition to being wired into
qvac-merge-guard, confirmed and documented both resulting check-name strings (see thesdk-pod-checksgotcha) — no check-name regex/match written against only one of them.
In this repository56 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .github/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .cursor/rules/agent-integrations.mdcCursor rule
- .cursor/rules/cpp/string-api-conventions.mdcCursor rule
- .cursor/rules/devops/main.mdcCursor rule
- .cursor/rules/no-remote-code-execution.mdcCursor rule
- .cursor/rules/qip-triage.mdcCursor rule
- .cursor/rules/sdk/commit-and-pr-format.mdcCursor rule
- .cursor/rules/sdk/error-handling.mdcCursor rule
- .cursor/rules/sdk/first-class-product-parity.mdcCursor rule
- .cursor/rules/sdk/main.mdcCursor rule
- .cursor/rules/sdk/public-constants-contract.mdcCursor rule
- .cursor/rules/sdk/request-lifecycle-primitives.mdcCursor rule
- .cursor/rules/sdk/sdk-pod-packages.mdcCursor rule
- .cursor/rules/sdk/skill-authoring-guidelines.mdcCursor rule
- cpp-string-api-reviewSkill
- qv-addon-changelogSkill
- qv-addon-pr-createSkill
- qv-addon-release-notesSkill
- qv-agent-stack-syncSkill
- qv-asana-syncSkill
- qv-daily-work-updateSkill
- qv-dev-diary-setupSkill
- qv-dev-diarySkill
- qv-devops-daily-updateSkill
- qv-devops-pr-createSkill
- qv-devops-pr-reviewSkill
- qv-devops-pr-statusSkill
- qv-devops-runner-queueSkill
- qv-devops-why-my-pr-notSkill
- qv-docs-solution-createSkill
- qv-docs-updateSkill
- qv-holepunch-devSkill
- qv-mobile-test-dispatchSkill
- qv-notice-generateSkill
- qv-pr-mineSkill
- qv-pr-reviewSkill
- qv-pr-testSkill
- qv-qip-createSkill
- qv-qip-reviewSkill
- qv-qip-triageSkill
- qv-quality-reportingSkill
- qv-registry-autobase-patternsSkill
- qv-release-trainSkill
- qv-sdk-backmergeSkill
- qv-sdk-changelogSkill
- qv-sdk-e2e-createSkill
- qv-sdk-inference-versionSkill
- qv-sdk-pr-createSkill
- qv-sdk-pr-statusSkill
- qv-sdk-update-modelsSkill
- qv-skill-listSkill
- setupSkill
- setupSkill
- qv-nx-ciSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

