Copilot repository skills
DOCUMENTEDGitHub publishes the three skill directories. Loading SecHelix inside Copilot was not observed here, so it stays documented.
GitHub documents .github/skills, .claude/skills, and .agents/skills as repository skill directories. Copy the portable SecHelix bundle into one of them so Copilot reviews against an evidence contract rather than a paragraph of instructions.
Part of the AppSec agent guide.
GitHub documents three repository skill directories that Copilot reads: .github/skills, .claude/skills, and .agents/skills. A security skill for Copilot is therefore a directory you commit, not an extension you install. Copy the portable SecHelix bundle into one of them and the review contract travels with the repository, applies to every contributor, and is reviewable in a pull request like any other file.
The repository does not ship a pre-made .github/skills/ directory, so you create it. That path is documented by GitHub; a Copilot session loading SecHelix from it is not something we have observed and recorded, and this page does not claim otherwise.
git clone https://github.com/omarmohelal/SecHelix.git
mkdir -p .github/skills
cp -R SecHelix/skills/sechelix .github/skills/sechelix
git add .github/skills/sechelix && git commit -m "chore: add the SecHelix review contract"Committing it is the point. A prompt in someone's editor settings reviews one person's work. A directory in the repository reviews everyone's, survives onboarding, and shows up in the diff when someone changes the rules.
| Directory | Documented for | Notes |
|---|---|---|
.github/skills/sechelix/ | GitHub Copilot and VS Code agents | Create it yourself. Nothing else in the repository competes for the path. |
.agents/skills/sechelix/ | Copilot and Codex both | Where the Agent Skills CLI installs. One placement covers two hosts. |
.claude/skills/sechelix/ | Copilot and Claude Code both | Useful when the team is already on Claude Code and adding Copilot. |
Both a prompt and a skill are text the model reads. The difference is that the skill brings a vocabulary with defined edges, and refuses to let a claim skip a state.
APPLICABLE, NOT_APPLICABLE, UNKNOWN, BLOCKED. Missing evidence is UNKNOWN and is never quietly rewritten as NOT_APPLICABLE.HYPOTHESIS, VERIFIED, LIKELY_BUT_UNPROVEN, FALSE_POSITIVE, DUPLICATE_ROOT_CAUSE, BLOCKED_BY_ENVIRONMENT.PASS, PASS_WITH_KNOWN_RISK, BLOCKED, INCOMPLETE. Missing evidence fails closed rather than passing quietly.Re-reviewing a whole repository on every pull request is slow and returns the same findings each time. The narrower question is what the diff did. A deterministic classifier answers it without a model, and it ships in the repository.
git diff main...HEAD | python scripts/diff_review.py -
python scripts/diff_review.py change.patch --json-output
gh pr diff 42 | python scripts/diff_review.py - --fail-on-new-riskEighteen rules map a changed line to a direction. The directions are deliberately conservative: removing a control is new risk, adding a control is reduced risk, and adding a new surface is new risk.
| Change | Added | Removed |
|---|---|---|
| A new route | NEW_RISK | RISK_REDUCED |
| An authorization guard | RISK_REDUCED | NEW_RISK |
| A row-level security policy | RISK_REDUCED | NEW_RISK |
| A response security header | RISK_REDUCED | NEW_RISK |
| An agent tool definition | NEW_RISK | UNCHANGED |
| A dependency | UNKNOWN | UNKNOWN |
| A payment state transition | NEW_RISK | UNKNOWN |
| A webhook handler | NEW_RISK | NEW_RISK |
Then hand the same diff to the model with the review framing.
Use SecHelix to security-review the current pull request/diff.
Map changed trust boundaries and dataflows, identify new or weakened controls, verify important
candidates, and state whether the PR introduces a verified blocker, known risk, or no
evidence-backed security regression.- name: Classify the security delta
run: git diff origin/main...HEAD | python scripts/diff_review.py - --fail-on-new-risk
- name: Gate the release on the canonical report
run: python scripts/security_gate.py report.json --policy policies/default.jsonKeep report generation and gating in separate steps. The gate reads a canonical report and returns an exit code: 0 for PASS and PASS_WITH_KNOWN_RISK, 1 for BLOCKED, and 2 for INCOMPLETE or malformed input. Treat both 1 and 2 as non-green, because a run that could not produce evidence is not a run that found nothing.
GitHub publishes the three skill directories. Loading SecHelix inside Copilot was not observed here, so it stays documented.
Self-contained with no parent-directory references. Copied out of the repository and exercised from inside the copy.
The diff classifier and the release gate are standard-library Python. They run identically in Actions and on a laptop.
npx skills@latest add omarmohelal/SecHelix --skill sechelix