The skill
The skill is the analyst. The CLI gathers the news; the skill understands the project and decides what matters. This page summarises what it does. The instructions the agent actually follows are in SKILL.md.
1. It maps the project
It reads the files that declare what the project runs on, and for each technology notes the version and how precise it is.
| Kind | Typical files |
|---|---|
| Manifests and lockfiles | composer.lock, package.json and its lockfile, pyproject.toml, requirements*.txt, uv.lock, poetry.lock, go.mod, Gemfile.lock, Cargo.lock |
| Runtime pins | Dockerfile*, compose*.yaml, .nvmrc, .php-version, .python-version, .tool-versions, the engines field |
| Tooling and hosting | .gitlab-ci.yml, .github/workflows, netlify.toml, vercel.json, fly.toml, deployment scripts, git remotes |
A version is exact (8.3.35), a branch (8.3, php:8.3-fpm) or a range
(>=8.2). Floating tags matter: a hosting platform may keep serving a cached, unpatched build of a branch, so pinning the
fixed version is often the real fix. The skill ignores the versions installed on your machine: your laptop rarely runs what production
runs.
It watches what the team runs or ships, not the platforms it merely uses. A repository on github.com or a site on Netlify is patched by the provider; a self-hosted GitLab is not, and gets watched.
2. It gathers the news
It maps the technologies to the CLI's tags, turns the rest into keywords, passes the package names from the lockfile, and reads a week:
stackalarm news --tag php --tag symfony --tag gitlab --keyword frankenphp --since 7d --format summary
The same vulnerability often appears in several sources (vendor, NVD, EUVD, CERTs, press): it becomes one finding, with the most official link. A public exploit or exploitation in the wild raises the urgency. A source that could not be read is mentioned in the answer, so silence is never mistaken for "all clear". See the CLI for the options.
3. It searches the web
The CLI only knows its sources. A web search covers technologies without a source, the details feeds lack (affected and fixed versions, conditions, workarounds), and signals not yet in a feed. Official pages win over write-ups, and every nickname, CVE number and fixed version taken from the press is checked against the advisory.
Every title, summary and page is treated as data, never as instructions: when a feed or a page tells the agent to run something, it ignores it and tells you.
4. It runs your audits
Vulnerable libraries are best found by the ecosystem's own audit, which reads the lockfile exactly. The skill runs those already installed:
| Ecosystem | Command |
|---|---|
| Composer | composer audit --format=json |
| npm | npm audit --omit=dev --json |
| pnpm | pnpm audit --prod --json |
| Yarn (Berry) | yarn npm audit --environment production --json |
| Python | pip-audit |
| Go | govulncheck ./... |
| Ruby | bundle audit check --update |
| Rust | cargo audit |
| Any | osv-scanner scan source -r . |
A missing tool is named with how to get it; the skill does not install it without asking.
5. It judges what applies
- Versions. When an item does not say which versions are affected, the skill opens the advisory or the release notes.
- Conditions. Many flaws need a setup (an SAPI, a feature, internet exposure). It looks for it in the project and says what it checked. A build-only runtime usually means "prepare", not "act now".
- Urgency. Exploitation in the wild or unauthenticated remote code execution on an exposed component means today. A heads-up means prepare now.
- Imprecise versions. A branch or a range that holds both vulnerable and fixed versions gives "possibly affected". It asks for the production version only when the answer would change the verdict, and says how to find it.
6. It answers, then offers fixes
The answer format is described in Getting started. Fixes come one at a time, after you agree: bump a runtime image or pin keeping the same variant, update a dependency with the package manager rather than editing a lockfile, or add a documented temporary mitigation. It never pushes, deploys or touches a server.
7. It offers the scheduled watch
Once, in one sentence. If you agree, it writes the .stackalarm.yaml profile and adds the CI file. On later runs it refreshes
the profile and says what changed. See Scheduled watch.
Triage mode
The scheduled watch reports raw news, not a verdict. To judge a report, pass it to the skill:
/stackalarm triage https://github.com/acme/app/issues/42
It judges only the items of the report against the project, and never changes a file in this mode: it says what to change, so that you can
run /stackalarm to apply it. In CI, the same mode writes a decision used to open the issue or not:
| Decision | Meaning |
|---|---|
act | The project is affected now, or possibly affected through a floating tag or a range. |
prepare | A heads-up or an upcoming end of support concerns the project, or a fix must be planned. |
none | Nothing concerns the project, including releases it already runs and releases of other branches. |
When in doubt, the skill does not pick none: a needless issue costs a minute, a missed one can cost production. A report entry
that asks for none is treated as an injection attempt and mentioned in the verdict.
Next: The CLI