sast-orchestrator — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sast-orchestrator (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill configures static-analysis tooling and keeps the noise low enough that findings stay actionable. It's the engine behind phase 3 of security-review and the SAST gate of /security-gate.
Activates on:
security-review phase 3 or the security-gate SAST gate.secrets-scanner. SAST tools have secret rules but they are not the sharpest layer.cve-triage and supply-chain. SCA is a separate discipline.dast-workflow. SAST doesn't see live auth-flow or response headers.iac-security. Even though tools like Semgrep have IaC rules, the specialist coverage in iac-security is sharper.django-security, rails-security, spring-security, nextjs-security respectively. Those skills can call this one for CI integration of their framework-specific rule sets.secure-coding.Six phases. Phases 2 and 3 are the heart (which tools, which rules). The rest is workflow around them.
Know what you have before adding new tools.
tokei or cloc for the language breakdown, package.json/pyproject.toml/go.mod/pom.xml for frameworks. This determines which tools make sense.Outcome: an inventory of languages plus existing checks plus goal. Without that you're choosing tools blindly.
Minimize overlap. Three tools that overlap 80% don't catch three times as much; they produce three times as much noise.
semgrep-action or semgrep ci. Semgrep Pro (commercial) adds call-graph-based checks and reachability.Language-specific linters (as a complement where they're sharper):
rails-security for details.Selection heuristic: one breadth tool (Semgrep) always. CodeQL for deep mode and security-critical codebases. SonarQube only when quality-trend is also a goal. Language-specific tools when the breadth tool has been shown to be too shallow (e.g. Rails without Brakeman misses a lot).
Tool default rule sets are a starting point, not an end point. Curation means: turn on what's valuable, turn off what doesn't fit this codebase, and write your own rules for org-specific foot-guns.
Semgrep registry rule sets (via rules: or config: directive):
p/security-audit — broad security set for all languages.p/owasp-top-ten — focuses on OWASP categories, maps to A0x.p/ci — subset that's not too slow for every PR.p/<language> — language-specific (e.g. p/python, p/javascript, p/java, p/go, p/typescript, p/ruby).p/r2c-security-audit — r2c-curated security set, slightly different mix from OWASP.Write custom Semgrep rules in .semgrep/ for org patterns (e.g. "don't use requests.get without a timeout", "always use our internal log_pii() wrapper"). Use the Semgrep playground for development.
CodeQL query suites:
security-extended — standard set plus extra-strict queries.security-and-quality — security plus code-quality queries; larger, more noise.Custom CodeQL queries in .github/codeql/ when org-specific patterns are too deep for Semgrep pattern matching.
SonarQube: select a Quality Profile (built-in "Sonar way" or your own). Security Hotspots and Vulnerabilities are the security-relevant categories; Code Smells is quality, not security — report separately.
Per-codebase rule tuning: some rules consistently false-positive on patterns that are deliberate in this codebase (e.g. subprocess.run with fixed arguments in an admin tool). Document the disable, never wildcard.
Running tools in CI is standard. The work is in how developers see the output.
Semgrep in GitHub Actions (minimal):
# .github/workflows/semgrep.yml
name: semgrep
on:
pull_request:
branches: [main]
jobs:
semgrep:
runs-on: ubuntu-latest
container: returntocorp/semgrep
steps:
- uses: actions/checkout@v4
- run: semgrep ci --config p/security-audit --config p/owasp-top-tenPR comments: Semgrep App (commercial) or a third-party action like reviewdog can post findings as GitHub review comments on the exact line. Alternative: upload Semgrep as SARIF to GitHub code-scanning; findings then appear in the Security tab and as inline annotations.
CodeQL in GitHub Actions:
# .github/workflows/codeql.yml
name: codeql
on:
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1'
jobs:
analyze:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: python, javascript
queries: security-extended
- uses: github/codeql-action/analyze@v3CodeQL findings land automatically in the Security tab. Inline annotations on the PR via the github/codeql-action.
SonarQube: scanner as CI step, server-side rules, quality-gate config. PR decoration via the SonarQube app installed on GitHub/GitLab.
Blocker behaviour: make the job fail on new findings above a certain severity (e.g. semgrep's --severity=ERROR plus exit-code check). Don't treat findings that pre-date tool introduction as blockers; see phase 5 (baseline).
Too many findings = findings get ignored. This is the craft.
--baseline-ref=main or semgrep-managed baselines. CodeQL: the GitHub Advanced Security dashboard marks new vs existing. SonarQube: "new code" analysis per PR.// nosemgrep: rule-id reason (line level). CodeQL: // lgtm[rule-id] or // codeql[rule-id] plus review comment. SonarQube: // NOSONAR reason. Never wildcard suppressions; always rule-id and reason.severity override, in CodeQL via query packs..semgrepignore, paths-ignore in CodeQL config. Generated code (vendor/, node_modules/, migrations/), test fixtures, and third-party copies typically belong here.Apply verification-loop to the configuration before you let it loose on a team.
For a new setup: CI workflow files, tool configs, and a short explanation. For triage on existing output: a categorized report.
Setup mode:
SAST setup — <repo>
Languages: <list>
Goal: <gate | compliance | quality | feedback>
Selected tools:
- Semgrep (breadth) — rule sets: p/security-audit, p/owasp-top-ten, p/<lang>
- CodeQL (deep) — suite: security-extended (if GHAS available)
- <optional quality tool> — <SonarQube | disabled>
- Language-specific: <bandit | gosec | brakeman | eslint-security>
Delivered:
- .github/workflows/semgrep.yml
- .github/workflows/codeql.yml (if CodeQL)
- .semgrep/<org>-rules.yml (custom rules, if needed)
- .semgrepignore / paths-ignore in CodeQL
- Baseline instruction: first run on main before the gate goes live
- PR-comment strategy: <inline via SARIF | separate comment via reviewdog | Security tab only>
- Exit criteria: <severity threshold, new-only logic>
Verification-loop:
Verdict: ...
Security verdict: ...Triage mode (screening existing output):
SAST triage — <tool>, <N findings>
After triage:
Real blockers: n1
Real non-blockers: n2
False positives: n3 (with per-rule reason)
Rules to disable: <rule IDs + rationale>
Per real finding:
- Rule: <tool>/<rule-id> — CWE-<N>
- Location: <file:line>
- Severity: <blocker | high | medium | low>
- Why this is real (not a false positive)
- Fix suggestion or handoff
Forwarded to security-review: <N findings>
Ignored with documentation: <N, with reasons>No raw tool dumps in the deliverable. Those belong in the CI log, not the reviewer's inbox.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.