CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

cicd-security

Audit CI/CD pipelines, GitHub Actions first and GitLab CI and CircleCI briefly, for the paths that give an outsider code execution, secrets or a write token: pull_request_target and workflow_run running untrusted code, expression injection into run steps, missing or broad workflow permissions, third-party actions not pinned to a commit SHA, OIDC trust policies with wildcard subjects, self-hosted runners on public repos, secrets reaching forks, cache and artifact trust between workflows, and AI agents in CI that read issue or PR text while holding a write token. Runs zizmor and actionlint read-only and writes findings.json. Use when the user mentions 'pull_request_target,' 'pwn request,' 'workflow injection,' 'zizmor,' 'actionlint,' 'pin actions to SHA,' 'GITHUB_TOKEN permissions,' 'self-hosted runner,' 'claude-code-action,' 'AI agent in CI,' 'GitLab CI security,' 'CircleCI security,' 'is this workflow safe,' or needs to secure a build pipeline.

Quality

96%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Passed

No findings from the security scan

SKILL.md
Quality
Evals
Security

Quality

Content

92%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

A strong expert runbook: a clearly gated six-step audit workflow with refutation and JSON validation built in, executable commands at every step, and a well-partitioned reference bundle that was verified to resolve. The only real cost is length — long inline worked examples in the verdict table, a cross-reference list duplicated by the 'Not for' block, and inline time-sensitive platform facts keep it from being lean.

Suggestions

Trim the Step 6 verdict table to one-line verdict definitions and move its multi-sentence worked examples (pr-preview.yml, deploy.yml, claude-code-action cases) into references/worked-examples.md, which already exists for exactly that purpose.

Merge the 'Cross-references' paragraph and the 'Not for' list into a single compact table — they name the same adjacent skills twice in ~15 lines.

Move the time-sensitive platform facts ('Since 8 December 2025, pull_request_target always runs the workflow file from the default branch', CVE-2025-30066, the Ultralytics December 2024 incident) into a dated 'platform facts' section of references/checks.md so the body does not rot as dates age.

DimensionReasoningScore

Conciseness

The body is dense, telegraphic and free of basic-concept padding ('Names only.', 'A workflow that doesn't parse can't be reasoned about; fix that first'), so it clears anchor 3's 'some unnecessary explanation'. It stops short of anchor 5's 'every token earns its place': the ~320-line body carries long multi-sentence worked examples inside the Step 6 verdict table, an eight-skill cross-reference list that substantially repeats the 'Not for' lines, an elaborate Output Format template, and time-sensitive dates inline ('Since 8 December 2025 ...', 'CVE-2025-30066', 'Ultralytics (December 2024)') rather than quarantined in a dated section, which the rubric says should penalize conciseness.

4 / 5

Actionability

Guidance is copy-paste ready throughout: 'rg -n' inventory greps matching trigger names like pull_request_target and workflow_run, 'zizmor --offline --format=json .', 'actionlint -format '{{json .}}'', seven exact 'gh api ... --jq' reads, exact fingerprint formats with six examples, a full ext-keys table, and 'node references/validate-findings.mjs findings.json'. Common cases get worked verdict examples ('pr-preview.yml runs on pull_request_target, checks out github.event.pull_request.head.sha ...'). This matches anchor 5; nothing is the pseudocode or high-level-hint shape of anchors 2-3.

5 / 5

Workflow Clarity

Six explicitly sequenced steps (Inventory → Run the tools → Who can trigger it → Checks → Platform facts → Verify, then record) with real validation checkpoints: fix parse failures before reasoning ('A workflow that doesn't parse can't be reasoned about'), a mandatory refutation step before any verdict, JSON validation via 'node references/validate-findings.mjs findings.json', and re-run feedback ('a rejected record stays rejected unless the line in ruled_out_by.location changed'). The 12-class checklist and inventory-as-coverage-record match anchor 5's checklists and feedback loops; anchor 4's 'minor validation gaps' does not apply.

5 / 5

Progressive Disclosure

Scored against the actual bundle: all ten files cited from the body (checks.md, ai-agents-in-ci.md, gitlab-circleci.md, findings-format.md, verification.md, severity-calibration.md, worked-examples.md, validate-findings.mjs, to-sarif.mjs, findings.schema.json) exist in references/, are one level deep, and each citation states its purpose ('Each class below has its grep, the attacker-controlled contexts, safe shapes and GitLab/CircleCI equivalents in references/checks.md'). The only non-resolving mentions (validate-coverage.mjs, ai-prompt-injection-via-ci.md) sit in shared bundle files explicitly scoped to other skills or in an attribution note, so navigation for this skill is unbroken — matching anchor 5 rather than anchor 4's 'minor organization gaps'.

5 / 5

Total

19

/

20

Passed

Description

100%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

An exemplary description: it names a precise domain and threat model, enumerates the concrete check classes and tools with honest scoping ('GitLab CI and CircleCI briefly'), and pairs a clear 'what' with an exhaustive list of quoted trigger phrases in third-person voice. It is long, but every clause carries information — trigger enumeration, not padding.

DimensionReasoningScore

Specificity

Concrete capabilities are listed comprehensively: 'pull_request_target and workflow_run running untrusted code, expression injection into run steps, missing or broad workflow permissions, third-party actions not pinned to a commit SHA, OIDC trust policies with wildcard subjects, self-hosted runners on public repos ... cache and artifact trust between workflows, and AI agents in CI', plus the concrete actions 'Runs zizmor and actionlint read-only and writes findings.json'. This matches anchor 5 (multiple specific concrete actions, comprehensive coverage) rather than anchor 4, which still allows 'minor gaps in coverage'; nothing here is the generic 'Processes data' vagueness of anchor 1-2.

5 / 5

Completeness

Both halves are explicit: what it does ('Audit CI/CD pipelines ... for the paths that give an outsider code execution, secrets or a write token ... Runs zizmor and actionlint read-only and writes findings.json') and when to use it ('Use when the user mentions 'pull_request_target,' ... or needs to secure a build pipeline'). This is exactly the anchor-5 pattern of the rubric's own good example, with concrete trigger phrases; anchor 4 would require the 'when' to be less explicit.

5 / 5

Trigger Term Quality

Fourteen quoted natural triggers cover jargon ('pull_request_target,' 'pwn request,' 'workflow injection'), tool names ('zizmor,' 'actionlint,' 'claude-code-action'), practitioner phrases ('pin actions to SHA,' 'GITHUB_TOKEN permissions,' 'self-hosted runner'), a plain-English question ('is this workflow safe'), and platform variants ('GitLab CI security,' 'CircleCI security'). Coverage including synonyms matches anchor 5; it does not fall to anchor 4's 'a few natural terms missing' because the only near-miss ('GitHub Actions' as a quoted phrase) is still prominent in the opening sentence.

5 / 5

Distinctiveness Conflict Risk

The niche is unambiguous — CI/CD pipeline authorization auditing with triggers like 'pull_request_target,' 'zizmor,' and 'OIDC trust policies with wildcard subjects' — and adjacent concerns (package vulns, leaked secrets, prompt injection in a product chatbot) are excluded from scope by the opening framing. Distinct triggers and minimal conflict risk match anchor 5 rather than anchor 4's 'minor overlap risk with closely related skills.'

5 / 5

Total

20

/

20

Passed

Validation

93%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 15 / 16 Passed

Validation for skill structure

CriteriaDescriptionResult

allowed_tools_field

'allowed-tools' contains unusual tool name(s)

Warning

Total

15

/

16

Passed

Repository

briiirussell/cybersecurity-skills

Path

skills/cicd-security/SKILL.md

Reviewed

Table of Contents

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.