suede-ship-gate — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited suede-ship-gate (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.
Set up CI and branch protection that actually block a bad merge — in any repo, any stack. The output is a working pipeline plus the exact protection settings, not advice.
Run this in whatever folder you point it at. Detect first, never assume. Nothing here is hardcoded to a specific project, monorepo layout, or package manager.
From the repo root, inventory:
package.json, requirements.txt / pyproject.toml, go.mod, Cargo.toml, Gemfile. A repo may hold one app or many; build for what's actually there.package-lock.json (npm), pnpm-lock.yaml (pnpm), yarn.lock (yarn), bun.lockb (bun). Two lockfiles in one app is a bug to fix first (Lane 3)..github/workflows/*. Do not duplicate a job that already exists — extend or reconcile it..nvmrc, package.json engines, .python-version, pytest.ini/pyproject. Pin CI to these; never hardcode a guess.vercel.json / .vercel, netlify.toml, a Dockerfile. If the platform skips non-prod builds (e.g. Vercel ignoreCommand kills previews), CI is the only pre-merge build signal — so a build job is mandatory.scripts / test config and use the real ones (test, test:run, lint, build). Don't invent commands.Path-filtered jobs skip when their paths aren't touched. A skipped job that is a required status check leaves the PR pending forever. So never require the path-filtered jobs directly. Instead add one aggregator that depends on all of them:
ci-success:
if: always()
needs: [<every app job>]
runs-on: ubuntu-latest
steps:
- name: Gate on all jobs
run: |
for r in ${{ join(needs.*.result, ' ') }}; do
[ "$r" = "success" ] || [ "$r" = "skipped" ] || { echo "blocked by: $r"; exit 1; }
doneIn branch protection, require only `ci-success` — never the individual jobs. This is the single thing that makes "protect main" work with change-based CI.
changes job (dorny/paths-filter or native paths:). Add an escape hatch so edits to the workflow file itself run everything.ci-success.npm ci, pnpm i --frozen-lockfile, yarn --immutable, bun install --frozen-lockfile). Two lockfiles means CI can install a different tree than ships — resolve before wiring CI..nvmrc / engines / .python-version, falling back to the platform default. Never a hardcoded guess that drifts from prod.permissions: contents: read unless a job genuinely needs more.ci-success, require branches up to date before merge, optional required PR review, block force-push and deletion, optionally include administrators.npm ci with no committed lockfile, or a lockfile for a different manager → fails or installs the wrong tree.node-version / python-version that doesn't match the app → green in CI, broken in prod.paths: never match → always skipped → a "green" check that tested nothing..github/workflows/.gh api calls, if asked).End with a Simple explanation (plain, for a 10-year-old) — see the umbrella workflow — so a non-coder gets the gist.
After a deploy lands:
Ship verdict after post-deploy: verified (all checks pass) | watch (minor anomalies, monitoring) | rollback (critical failure, initiate rollback immediately).
Generate; don't enforce. This skill writes workflow files and tells you the protection settings — it does not push, flip branch protection, or change repo access on its own. Verify the detected stack before applying. Works in any repo: it detects rather than assumes Suede or any specific project.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.