Primacode
Skill: security-audit
Find vulnerabilities in code that already exists, in the order they are actually the way in.
Live Built and working today on the surface this card describes.
What it does
Its own description: use when asked for a security review, whether something is safe, an audit for vulnerabilities, hardening a service before release, or investigating a suspected weakness in authentication, authorization, input handling, secrets, or dependencies.
Work runs in a fixed order, sorted by how often each one is actually the way in rather than by how interesting it is to read about: authentication, authorization, input handling, secrets, transport and storage, dependencies, then rate limiting and resource exhaustion.
Authorization is the big one. For every endpoint that takes an id, the question is whether the handler checks that this caller may touch that object. Missing object-level checks are the most common serious finding in almost every codebase.
A finding marked confirmed has to carry an exploit path. A finding you cannot describe a path to is a suspicion, and belongs under unverified with what would settle it.
Unverified prints first, with its reason.
Inputs and outputs
| Input | Code that already exists. This surveys a codebase; for a check on a pending change, the compliance skill is the one. |
|---|---|
| Output | One block per finding, most severe first: Risk, How, Exploit, Recommendation, Severity, Verdict. |
| Secrets | Checked in history, not just in the working tree. |
| Verdicts | confirmed checked and the risk is real, and say what you read · refuted checked and it does not apply here, and say why not · unverified could not be determined, and say what would settle it. |
Configuration
| How it is chosen | By name, or by the model matching the description this card opens with. That description is the routing rule, and it is what decides which of the nine runs. |
|---|---|
| Where it lives | Embedded in the binary as <name>/SKILL.md, on the branch that ships it. The same file is what the published catalog serves, so there is one copy in one layout. The catalog itself is built and verified and not yet uploaded to the portal. |
PRIMACODE_SKILLS_URL | Points the tool at a catalog of skills. Leave it alone unless you are serving a separate catalog. The nine that ship in the binary are already loaded without it. |
Limits
- It surveys existing code. It is not a check on a pending diff.
- Exploit is required on anything marked confirmed, which means a plausible-sounding risk with no described path is not allowed to render as one.
- Do not point the tool at the published catalog for these nine. The binary already embeds them, and the loader keys skills by name: a duplicate logs a warning and silently replaces rather than merging.
Example
the shape of one finding
Risk:
Any authenticated user can read any other user's order
How:
GET /api/v1/orders/{id} loads by id and never compares
order.user_id to the caller - OrderController.php:52
Exploit:
Log in as user A, request an order id belonging to user B, receive it
Recommendation:
Scope the query to the caller, or authorize the loaded object
Severity: high
Verdict: confirmed Source of truth
primacode/.opencode/skills/security-audit/SKILL.md (the checked-out copy; on branch `claim-event-model` the same file is embedded at packages/core/src/plugin/skill/primacode/security-audit/SKILL.md, which is what a released binary carries)philosophers_stone/platform/primacode.md § Status (the nine skills ship in the binary, 2026-08-27)