Security Vulnerabilities Patcher
axelixlabs/axelix
Create batched Dependabot-style pull requests for GitHub security findings in axelixlabs/axelix, grouped by dependency surface such as master/front-end, master/build.gradle.kts, or starter Gradle…
Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add, review, or retire an entry in…
$ npx skills add malloydata/publisher --skill fix-scan-finding -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install malloydata/publisher fix-scan-finding --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/fix-scan-finding .claude/skills/fix-scan-finding && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fix-scan-finding" agent skill from https://github.com/malloydata/publisher/tree/main/.claude/skills/fix-scan-finding into .claude/skills/fix-scan-finding/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-scan-finding", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/malloydata/publisher/tree/main/.claude/skills/fix-scan-findingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add malloydata/publisher --skill fix-scan-finding -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install malloydata/publisher fix-scan-finding --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/fix-scan-finding .agents/skills/fix-scan-finding && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fix-scan-finding" agent skill from https://github.com/malloydata/publisher/tree/main/.claude/skills/fix-scan-finding into .agents/skills/fix-scan-finding/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-scan-finding", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add malloydata/publisher --skill fix-scan-finding -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install malloydata/publisher fix-scan-finding --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/fix-scan-finding .cursor/skills/fix-scan-finding && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fix-scan-finding" agent skill from https://github.com/malloydata/publisher/tree/main/.claude/skills/fix-scan-finding into .cursor/skills/fix-scan-finding/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-scan-finding", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/malloydata/publisher.git --path .claude/skills/fix-scan-finding--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add malloydata/publisher --skill fix-scan-finding -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install malloydata/publisher fix-scan-finding --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/fix-scan-finding .gemini/skills/fix-scan-finding && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fix-scan-finding" agent skill from https://github.com/malloydata/publisher/tree/main/.claude/skills/fix-scan-finding into .gemini/skills/fix-scan-finding/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-scan-finding", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install malloydata/publisher fix-scan-findingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add malloydata/publisher --skill fix-scan-finding -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/fix-scan-finding .github/skills/fix-scan-finding && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fix-scan-finding" agent skill from https://github.com/malloydata/publisher/tree/main/.claude/skills/fix-scan-finding into .github/skills/fix-scan-finding/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-scan-finding", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add malloydata/publisher --skill fix-scan-finding -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install malloydata/publisher fix-scan-finding --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/fix-scan-finding .opencode/skills/fix-scan-finding && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fix-scan-finding" agent skill from https://github.com/malloydata/publisher/tree/main/.claude/skills/fix-scan-finding into .opencode/skills/fix-scan-finding/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-scan-finding", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fix-scan-findingFix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add, review, or retire an entry in…
Fix Scan Finding is an agent skill from malloydata/publisher. Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add, review, or retire an entry in .trivyignore.yaml. Drives the decision the gate forces: fix it upstream, or accept it with an expiry. Read it before the first scanner command or security-motivated dependency bump, including on a gate that is already green. Trigger on "CVE", "trivy", "trivyignore", "code scanning", "scan finding", "vulnerability", "image scan"…
Its SKILL.md is about 5.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/ecosystems.md` and `references/root-cause-grouping.md`).
It sits in Security, covering Security review, Vulnerability scanning and Pull requests. It works with Trivy and GitHub Actions. The repository describes itself as: Publisher is the open-source analytics engine for Malloy. It lets you define data models once — and use them everywhere. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit acc1acd. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
buntrivygitnpmdockerghapt-getjqnodebrewFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, npm, docker and gh, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fix Scan Finding loads about 5.1k tokens when it runs, and up to ~9.3k if it reads all its reference files. Until then it costs about 167 tokens; SKILL.md has 2,885 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from malloydata/publisher at commit acc1acd, republished under its MIT licence (© malloydata). 2,885 words, ~5,088 tokens.
.claude/skills/fix-scan-finding/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.<!--
Copyright (c) Credible Data Inc.
SPDX-License-Identifier: MIT
-->
Audience: a contributor or agent working a CVE, Trivy, or code-scan finding in this repository --
fixing a red CRITICAL gate, or verifying a finding on a gate that is already green. No prior Trivy
expertise assumed.
Prerequisites: trivy on PATH (brew install trivy, or see the Trivy install docs), bun at
the version in the root package.json engines, and Docker with buildx for image findings. No
cloud credentials are needed -- everything here is local and read-only against public registries.
| Workflow | Job | Reads |
|---|---|---|
.github/workflows/security-scan.yml | Trivy filesystem scan (vulnerabilities) | every lockfile in the tree |
.github/workflows/security-scan.yml | Trivy config scan (Dockerfiles) | the Dockerfiles only: Trivy's misconfiguration scanner does not read GitHub Actions workflows |
.github/workflows/security-scan.yml | Trivy secret scan | the working tree |
.github/workflows/image-scan.yml | Trivy image scan (built from source, <platform>) | the Dockerfile built from the PR, once per platform the release publishes (linux/amd64, linux/arm64) |
.github/workflows/image-scan.yml | Trivy image scan (published latest, <platform>) | ms2data/malloy-publisher:latest on both platforms, weekly schedule and dispatch |
Each job uploads its full SARIF to Code Scanning, then runs a second scan scoped to CRITICAL with
exit-code: 1. CRITICAL fails the job, and the secret gate fails on HIGH as well: a committed
credential is an incident whatever its rating. GitHub's own "Trivy" Code Scanning check on a pull
request is set, in the repository's code scanning settings, to fail only on critical alerts. It
treats every alert in a file the PR touches as new, and a lockfile is one file, so at a high
threshold every dependency PR went red on alerts already open on main. If that check goes red on
high again, the setting was changed; that is the fix, not a lockfile edit. GitHub rates an alert
by the SARIF's CVSS score, not Trivy's label, so the two can disagree: a Trivy MEDIUM can show as
high, and a Trivy HIGH with CVSS 9.0 or more is critical to GitHub and still fails the check. HIGHs
still land in Code Scanning, and one with a reachable fix is still worth fixing. Every job reads
the same .trivyignore.yaml. On a pull request from a fork the SARIF upload is skipped (the token
is read-only), but the gate still runs, so read the job log there.
Prefer the upstream fix. Accept only what you cannot fix. In order:
package.json resolutions entry only when 2 is
genuinely blocked -- in range where possible, and only if it actually clears the finding
(verify; see the traps below).expired_at when no reachable fix exists, with a statement: that is the review
record.Do not skip to 5 because it is quick. Do not do 2 or 3 without the delta check in step B.
Do not trust the GitHub Code Scanning alert list. GitHub maps Trivy's CVE severity onto its own
scale, so genuine CRITICALs can appear there as high. Always scan locally with the gate's flags:
trivy fs . --scanners vuln --severity CRITICAL \
--ignorefile .trivyignore.yaml \
--skip-dirs node_modules --skip-dirs .venv \
--skip-dirs '**/dist' --skip-dirs '**/build' \
--format json --quiet > /tmp/crit.json
jq -r '.Results[]? | .Target as $t | (.Vulnerabilities // [])[]
| "\($t)\t\(.PkgName)@\(.InstalledVersion)\t\(.VulnerabilityID)\tfix=\(.FixedVersion)"' \
/tmp/crit.json | sort -u**/... globs. Unquoted, zsh expands them, Trivy prints its usage text, and the run
looks like a failure of the tree rather than of the command.Results key at all (what Trivy emits for a directory with no lockfiles), means nothing was scanned and exit=0 proves nothing. Running from the wrong directory is
the usual cause. A gate that scanned nothing is the one failure mode that looks exactly like
success.linux/amd64 and
linux/arm64, with the DuckDB version derived from Malloy. A local build covers only the platform
you ask for, and the per-architecture base images and prebuilt binaries differ enough that the two
report different findings. Build the platform whose job is red (linux/amd64 or linux/arm64),
and pass APT_REFRESH as the CI builds do, or a stale cached apt-get upgrade layer can report
Debian packages CI has already upgraded:docker buildx build --platform <platform> --load \
--build-arg DUCKDB_VERSION=$(node scripts/duckdb-version.js) \
--build-arg APT_REFRESH=$(date -u +%F) -t publisher:scan .
trivy image publisher:scan --scanners vuln --severity CRITICAL --ignorefile .trivyignore.yaml--include-dev-deps. Trivy skips devDependencies in Node lockfiles by
default, and so does the gate. On this repo the flag has surfaced CRITICALs in dev tooling in the
root bun.lock (dompurify, ejs, shell-quote) that the gate does not see. A
finding that appears only with the flag is not gating, but it is real.Then group by root cause before touching anything -- see references/root-cause-grouping.md. Several CVEs against one lockfile are usually one lagging parent, not several pins.
Never raise a pinned version or add a resolution without checking what the old version was protecting. If a pin carries a comment, that comment is the spec -- read it, then verify whether it still holds against the target version rather than assuming either way.
resolutions entry often carries a reason in a
nearby comment or in the commit that added it: git log -S'"<pkg>": "<ver>"' -- package.json.npm view <pkg> dist-tags
npm view <parent>@latest dependencies.<pkg>Then classify and act:
Match the ecosystem; details and commands, including the Bun traps that make a targeted refresh rewrite half the tree, are in references/ecosystems.md.
Whatever you touch, the stale-pin comment is part of the diff. A pin comment that survives its own removal becomes a lie the next reader believes -- rewrite it to describe the new state and the invariant that still matters, not the change you made.
Run builds, image builds, and test suites with run_in_background: true; an image build for a
platform other than your machine's runs under emulation and takes minutes.
The test suite is the oracle for "did I break it"; the scanner is the oracle for "did I fix it". Both, in that order, and neither substitutes for the other.
bun run test for server dependencies;
bun install --frozen-lockfile && bun run generate-clients in packages/server/k6-tests for its
codegen; an image build of the red job's platform (step A) for anything in the Dockerfile.bun run generate-clients exits 0 even when it generates
no files. Count the output files, and diff them against the previous version.docker run --rm --entrypoint sh publisher:scan -c 'cd /publisher && bun why esbuild', then
re-scan the image.An acceptance has three parts, and skipping any one of them is how a suppression becomes permanent by accident:
id: suppresses the finding repo-wide, including in a lockfile
added next month that inherits the same vulnerable dependency. paths: resolve against the scan
root, which is the repository root: packages/server/k6-tests/bun.lock, not k6-tests/bun.lock.
An entry with the wrong prefix parses fine and silently never matches. Verify the scoping holds:
copy the affected bun.lock and package.json to a new directory, re-scan, and confirm the
finding still fires there. Delete the copy.expired_at on anything that will be fixed (yyyy-mm-dd; Trivy stops honouring the entry
that day and the gate reds again). Omit it only for a genuine won't-fix, where an expiry would
red the gate on a date certain for something nobody intends to change -- that is recurring noise,
not a forcing function. A risk-accepted entry must name the compensating control, not assert
safety.statement: that says the package and version, how it is reached, why the vulnerable path
is not exercised here, and what upgrade retires the entry. The statement in .trivyignore.yaml,
plus the PR description, is the review record -- an entry without one is an unexplained
suppression. Follow the shape of the entries already in the file rather than inventing a new one.OS-package (Debian) findings in an image scan cannot be path-scoped. They carry no package
path, so no paths: value matches them: tested on the built image with CVE-2019-16224
(liblmdb0), a bare id: suppressed it, while paths: ["nonexistent"],
paths: ["usr/share/doc/liblmdb0/copyright"], and paths: ["var/lib/dpkg/status"] all left it
firing. So an OS-package acceptance must be a bare id: entry. That is safe here because the
filesystem scan never reports OS packages, so the entry cannot hide a lockfile finding; to make up
for the missing scope, the statement: must name the Debian package and the image it was found in.
Prefer fixing these in the Dockerfile first (see references/ecosystems.md):
Trivy Status: fixed means apt-get upgrade clears it; Status: affected means Debian has no fix
yet, so first ask what installed the package (apt-cache rdepends --installed <pkg> inside the
image) -- removing an unused parent package is option 4 of the rule, and is how this repo's unfixed
liblmdb0 and libxml2 findings were cleared rather than accepted.
packages/server/k6-tests are fixed only in 8.21.0+ (npm latest is 8.38.0), but
@grafana/openapi-to-k6 0.3.2 and its latest, 0.4.1, both declare orval ^7.5.0. Forcing orval
8.38.0 makes bun run generate-clients fail under both ("Cannot read properties of undefined", no
files written). So the finding is unfixable on this line, not un-upgraded, and was accepted with
expired_at. Always check npm view <pkg> dist-tags and test forcing the fixed version against
the real consumer before accepting -- and before planning a move around it.bun update <transitive-pkg> adds it as a direct dependency. Run against basic-ftp and
protobufjs, it wrote both into the root package.json dependencies at their latest majors
(6.2.1 and 8.8.0) instead of refreshing them in range. Use resolutions for a transitive package.bun.lock and running bun install --lockfile-only re-resolved most of the tree,
moving unrelated packages such as the whole AWS SDK. That is not a targeted fix.resolutions are top-level only. A nested key such as "snowflake-sdk/fast-xml-parser"
is accepted and silently ignored; the lockfile does not change.packages/server/k6-tests, e2e, examples/data-app each have their own lockfile) is not in the
image. It still fails the filesystem gate, so fix it or accept it with that reasoning stated -- do
not argue it away without an entry.--include-dev-deps. Neither the gate nor
the default local scan passes that flag. When sweeping one vulnerable chain repo-wide, re-run with
it before concluding a lockfile is unaffected -- a clean default scan is not evidence the chain is
absent, only that nothing in it is a production dependency.bun.lock scan can still hide nested copies. After this repo's lockfile refresh
reported zero HIGH, the image scan of the same tree still found nested lodash 4.17.21,
ip-address 10.0.1 and ws 5.2.4 that the filesystem scan never listed. Scan the built image
before calling a Node finding gone, or list every lockfile key still at the vulnerable version.@vitejs/plugin-react in packages/app dependencies
pulled vite, and through it esbuild (with a Go stdlib CVE in its binary), into the image
despite bun install --production. bun why <pkg> inside the built image names the path.--platform before concluding an image finding is gone.ignore-unfixed, so a critical with no
upstream patch blocks like any other. When there is nothing to upgrade to, the answer is an
explicit path-scoped .trivyignore.yaml entry with a statement: -- a reviewed acceptance, not a
silent one.Trivy ... check required in branch protection, a rename leaves the old required check
pending forever. Ask a maintainer before renaming one.State plainly which findings are fixed (with the version that fixed them), which are accepted (with the expiry and why no fix is reachable), and which are still open. If a change needed approval and you got it, say what was approved. Never report a finding as fixed on the strength of a scan that covered no targets.
A green local run is necessary and not sufficient. A dependency move changes the resolved tree for
every consumer, and CI is the only place the image is built and scanned on both published
platforms the way the gate runs it, and the only place the full build and test matrix runs against the new lockfile. Local
runs also use your machine's node_modules and Docker cache, which can hold artifacts CI resolves
differently.
So end every fix by handing the user the PR step and waiting for CI:
main, or would
rather do it themselves. Give the exact commands either way, for example:git add <changed files>
git commit -m "fix(deps): <what moved and which findings it clears>"
git push -u origin <branch>
gh pr create --repo malloydata/publisher --base main --title "<title>" --body-file <file>
gh pr checks <pr-number> --repo malloydata/publisher --watchmalloydata/publisher main.Trivy ... checks to pass on that PR. That is the gate the work exists to clear,
and it re-runs against the PR head with .trivyignore.yaml as committed.Report the fix as verified locally, pending CI until those checks report. Do not describe a dependency move as safe or complete on local evidence alone.
© malloydata, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in .claude/skills/fix-scan-finding of malloydata/publisher.
Open the folder on GitHubat commit acc1acd
Fix Scan Finding next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fix Scan Finding this skillmalloydata/publisher | 116 | — | ~5.1k | Automated safety check: Pass | MIT | |
| Security Vulnerabilities Patcheraxelixlabs/axelix | 147 | — | ~4.2k | Automated safety check: Pass | LGPL-3.0 | |
| Claude Securityanthropics/claude-plugins-official | 37k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Security ReviewerJeffallan/claude-skills | 12k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Security AuditAedelon/claude-code-blueprint | 120 | — | ~1.6k | Automated safety check: Notes | Custom licence | |
| GitHub Actions Hardeninggithub/awesome-copilot | 40k | 1 repos | ~2.4k | Automated safety check: Pass | MIT |
axelixlabs/axelix
Create batched Dependabot-style pull requests for GitHub security findings in axelixlabs/axelix, grouped by dependency surface such as master/front-end, master/build.gradle.kts, or starter Gradle…
anthropics/claude-plugins-official
Scans a whole codebase or a set of changes for security issues, and turns findings into verified patch files that you apply yourself.
Jeffallan/claude-skills
Audits code and infrastructure for vulnerabilities and produces a severity-rated report with locations and remediation, using SAST, dependency and secrets scans plus manual review.
Aedelon/claude-code-blueprint
Proactive security audit: OWASP top 10, dependency vulnerabilities, secrets detection, input validation, auth patterns, and secure defaults.
github/awesome-copilot
Security hardening reviewer for GitHub Actions workflow files (.github/workflows/.yml).
pskoett/pskoett-ai-skills
CI-only Simplify & Harden workflow for pull requests using gh-aw (GitHub Agentic Workflows).
malloydata/publisher
Score one analytical answer against a verified golden, and score which of the entities the golden depends on retrieval delivered to the answerer.
malloydata/publisher
Turn a list of questions into an eval set, whatever shape it arrived in: a JSONL a customer sent, a CSV, a spreadsheet export, a markdown doc, an email thread, or a pull from production logs.
malloydata/publisher
Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint.
malloydata/publisher
Make the smallest safe Malloy model edit that closes a diagnosed model-owned gap, with a probe receipt for every factual claim.
malloydata/publisher
Decide whether ONE answer matches its golden, and say whether you believe the golden.
malloydata/publisher
Combine validated Malloy queries into a notebook report. An agent skill from malloydata/publisher.
Works with
Categories
Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add, review, or retire an entry in…. Fix Scan Finding is an agent skill from malloydata/publisher.yaml.
Fix Scan Finding fits situations like: A red Trivy check on a pull request; tasks that involve Security review; tasks that involve Vulnerability scanning.
Run `npx skills add malloydata/publisher --skill fix-scan-finding -a claude-code`. Or copy the skill folder (.claude/skills/fix-scan-finding in malloydata/publisher) into .claude/skills/fix-scan-finding in your project. Claude Code loads it when a task matches its description.
Run `npx skills add malloydata/publisher --skill fix-scan-finding -a codex`. Or copy the skill folder (.claude/skills/fix-scan-finding in malloydata/publisher) into .agents/skills/fix-scan-finding in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add malloydata/publisher --skill fix-scan-finding -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fix-scan-finding, .gemini/skills/fix-scan-finding, .github/skills/fix-scan-finding and .opencode/skills/fix-scan-finding in your project.
Going by SKILL.md and its folder, Fix Scan Finding needs the command-line tools its instructions call (bun, trivy, git, npm, docker and gh). Our summary lists: Docker.
SKILL.md contains no URLs. Its commands use git, npm, docker and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Fix Scan Finding is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Fix Scan Finding: Security Vulnerabilities Patcher (axelixlabs/axelix, 147 stars), Claude Security (anthropics/claude-plugins-official, 37k stars), Security Reviewer (Jeffallan/claude-skills, 12k stars) and Security Audit (Aedelon/claude-code-blueprint, 120 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
malloydata (a GitHub organization) maintains it in malloydata/publisher, which has 116 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 7, 2026.
Source: malloydata/publisher on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.