Audit Flow
zebbern/claude-code-guide
Interactive system flow tracing across CODE, API, AUTH, DATA, NETWORK layers with SQLite persistence and Mermaid export.
Converts a Mermaid sequence diagram of a cryptographic protocol into a ProVerif model file ready for checking secrecy, authentication and forward secrecy.
$ npx skills add trailofbits/skills --skill mermaid-to-proverif -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install trailofbits/skills mermaid-to-proverif --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/trailofbits/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/trailmark/skills/mermaid-to-proverif .claude/skills/mermaid-to-proverif && 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 "mermaid-to-proverif" agent skill from https://github.com/trailofbits/skills/tree/main/plugins/trailmark/skills/mermaid-to-proverif into .claude/skills/mermaid-to-proverif/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mermaid-to-proverif", 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/trailofbits/skills/tree/main/plugins/trailmark/skills/mermaid-to-proverifType 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 trailofbits/skills --skill mermaid-to-proverif -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install trailofbits/skills mermaid-to-proverif --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trailofbits/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/trailmark/skills/mermaid-to-proverif .agents/skills/mermaid-to-proverif && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "mermaid-to-proverif" agent skill from https://github.com/trailofbits/skills/tree/main/plugins/trailmark/skills/mermaid-to-proverif into .agents/skills/mermaid-to-proverif/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mermaid-to-proverif", 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 trailofbits/skills --skill mermaid-to-proverif -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install trailofbits/skills mermaid-to-proverif --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trailofbits/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/trailmark/skills/mermaid-to-proverif .cursor/skills/mermaid-to-proverif && 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 "mermaid-to-proverif" agent skill from https://github.com/trailofbits/skills/tree/main/plugins/trailmark/skills/mermaid-to-proverif into .cursor/skills/mermaid-to-proverif/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mermaid-to-proverif", 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/trailofbits/skills.git --path plugins/trailmark/skills/mermaid-to-proverif--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 trailofbits/skills --skill mermaid-to-proverif -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install trailofbits/skills mermaid-to-proverif --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trailofbits/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/trailmark/skills/mermaid-to-proverif .gemini/skills/mermaid-to-proverif && 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 "mermaid-to-proverif" agent skill from https://github.com/trailofbits/skills/tree/main/plugins/trailmark/skills/mermaid-to-proverif into .gemini/skills/mermaid-to-proverif/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mermaid-to-proverif", 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 trailofbits/skills mermaid-to-proverifInstalls 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 trailofbits/skills --skill mermaid-to-proverif -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/trailofbits/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/trailmark/skills/mermaid-to-proverif .github/skills/mermaid-to-proverif && 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 "mermaid-to-proverif" agent skill from https://github.com/trailofbits/skills/tree/main/plugins/trailmark/skills/mermaid-to-proverif into .github/skills/mermaid-to-proverif/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mermaid-to-proverif", 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 trailofbits/skills --skill mermaid-to-proverif -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install trailofbits/skills mermaid-to-proverif --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trailofbits/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/trailmark/skills/mermaid-to-proverif .opencode/skills/mermaid-to-proverif && 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 "mermaid-to-proverif" agent skill from https://github.com/trailofbits/skills/tree/main/plugins/trailmark/skills/mermaid-to-proverif into .opencode/skills/mermaid-to-proverif/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mermaid-to-proverif", 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.
mermaid-to-proverifConverts a Mermaid sequence diagram of a cryptographic protocol into a ProVerif model file ready for checking secrecy, authentication and forward secrecy.
The agent reads a Mermaid sequenceDiagram, usually the annotated output of the crypto-protocol-diagram skill with operations such as Sign, Verify, DH, HKDF, Enc and Dec, and writes a .pv model for the ProVerif verifier. It works through a checklist that begins with parsing participants and channels and taking an inventory of the cryptographic operations, with reference notes on how those operations map to ProVerif constructs, on ProVerif syntax and on security properties.
It adds reachability queries first as a sanity check, uses private channels for internal state, adds a forward secrecy test when the diagram shows ephemeral keys and removes unused declarations, because a model that compiles can still make queries vacuously true. A worked example with a diagram and sample output sets the expected quality. It writes the model only; to run an existing .pv file you call proverif directly.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 442fc9d. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are proverif).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
Mermaid to ProVerif Model loads about 4.5k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 104 tokens; SKILL.md has 1,391 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 trailofbits/skills at commit 442fc9d, republished under its CC-BY-SA-4.0 licence (© trailofbits). 1,391 words, ~4,528 tokens.
.claude/skills/mermaid-to-proverif/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Reads a Mermaid sequenceDiagram describing a cryptographic protocol and
produces a ProVerif model (.pv file) that can be passed directly to the
ProVerif verifier.
Tools used: Read, Write, Grep, Glob.
The typical input is the output of the crypto-protocol-diagram skill — a
Mermaid sequenceDiagram annotated with cryptographic operations (Sign,
Verify, DH, HKDF, Enc, Dec, etc.) and message arrows.
crypto-protocol-diagram skillcrypto-protocol-diagram first to generate oneproverif model.pv directly| Rationalization | Why It's Wrong | Required Action |
|---|---|---|
| "Reachability queries are just busywork" | If events aren't reachable, all other query results are meaningless | Always add reachability queries first as a sanity check |
| "Public channels are fine for all messages" | Private channels for internal state prevent false attacks | Use private channels for intra-process state threading |
| "I'll skip the forward secrecy test" | Ephemeral keys demand forward secrecy verification | Add the ForwardSecrecyTest process whenever the diagram shows ephemeral keys |
| "Unused declarations are harmless" | ProVerif may report spurious results from orphan declarations | Clean up all unused types, functions, and events |
| "The model compiles, so it's correct" | A compiling model can have dead receives, type mismatches, or impossible guards that make queries vacuously true | Validate reachability before trusting any security query |
| "I don't need to check the example first" | The example defines the expected output quality bar | Study examples/simple-handshake/ before working on unfamiliar protocols |
ProVerif Model Progress:
- [ ] Step 1: Parse participants and channels
- [ ] Step 2: Inventory cryptographic operations
- [ ] Step 3: Declare types, functions, and equations
- [ ] Step 4: Identify and declare events
- [ ] Step 5: Formulate security queries
- [ ] Step 6: Write participant processes
- [ ] Step 7: Write main process and finalize
- [ ] Step 8: Verify and deliverFrom the Mermaid diagram:
participant or actor declaration. Each becomes a
ProVerif process.->>, -->>, -x, --x). Each distinct
A ->> B: label creates a communication step on a channel.c for all cross-party
messages. Add per-flow channels only when two distinct parallel sessions
must be independent.free c: channel.Walk through every Note over annotation and message label. Build a list of
all distinct operations used. Map each to a ProVerif declaration category:
| Mermaid annotation | ProVerif category |
|---|---|
keygen() → sk, pk | New name (new sk), public key derived via function |
DH(sk_A, pk_B) | DH function or exp with group |
Sign(sk, msg) → σ | Signature function |
Verify(pk, msg, σ) | Equation or destructor |
Enc(key, msg) → ct | Symmetric or asymmetric encryption function |
Dec(key, ct) → msg | Destructor (equation) |
HKDF(ikm, info) → k | PRF/KDF function |
HMAC(key, msg) → tag | MAC function |
H(msg) → digest | Hash function |
Commit(v, r) → C | Commitment function |
Open(C, v, r) | Commitment equation |
Consult references/crypto-to-proverif-mapping.md for exact ProVerif syntax for each.
Build the cryptographic preamble in this order:
type key.
type pkey. (* public key *)
type skey. (* secret key *)
type nonce.const msg1_label: bitstring.
const msg2_label: bitstring.
const info_session_key: bitstring.reduc
so that the process aborts on verification or decryption failure:(* Asymmetric encryption *)
fun aenc(bitstring, pkey): bitstring.
fun adec(bitstring, skey): bitstring
reduc forall m: bitstring, k: skey;
adec(aenc(m, pk(k)), k) = m.
fun pk(skey): pkey.
(* Symmetric encryption / AEAD *)
fun aead_enc(bitstring, key): bitstring.
fun aead_dec(bitstring, key): bitstring
reduc forall m: bitstring, k: key;
aead_dec(aead_enc(m, k), k) = m.
(* Digital signatures — verify returns the message on success, aborts on failure *)
fun sign(bitstring, skey): bitstring.
fun verify(bitstring, bitstring, pkey): bitstring
reduc forall m: bitstring, k: skey;
verify(sign(m, k), m, pk(k)) = m.
(* KDF — first arg is key (from DH), second is bitstring (info/context) *)
fun hkdf(key, bitstring): key.
(* MAC *)
fun mac(bitstring, key): bitstring.
(* Hash *)
fun hash(bitstring): bitstring.
(* DH *)
fun dh(skey, pkey): key.
fun dhpk(skey): pkey.
(* Serialization — ProVerif is strongly typed: pkey cannot appear
* where bitstring is expected. Use these to build signed payloads. *)
fun pkey2bs(pkey): bitstring.
fun concat(bitstring, bitstring): bitstring.equation forall sk_a: skey, sk_b: skey;
dh(sk_a, dhpk(sk_b)) = dh(sk_b, dhpk(sk_a)).Only declare what the diagram actually uses. Do not add functions for operations not present.
Events mark security-relevant moments in the protocol execution. Extract them by identifying:
event beginRole(params)): triggered immediately before a
party sends a message that depends on a long-term identity commitment (e.g.,
right before sending a signed message or a MAC'd message).event endRole(params)): triggered immediately after a party
successfully verifies the peer's identity (e.g., after Verify(...) or MAC
check passes, session key confirmed).event beginI(pkey, pkey). (* pk_I, pk_R — fired before sending the signed message *)
event endI(pkey, pkey, key). (* pk_I, pk_R, session_key — fired after accepting *)
event beginR(pkey, pkey).
event endR(pkey, pkey, key).Parameters should uniquely identify the session: the parties' public keys, plus the session key or a transcript hash.
Write one query per security property. Choose from:
Reachability (always add first — structural sanity check):
Verify that the success events are actually reachable. If ProVerif reports any
of these as false, the model has a structural bug (dead receive, type mismatch,
impossible guard) and no other query result should be trusted. Once the model
is validated, comment them out if they slow down the main property checks:
(* Sanity: both endpoints must be reachable — comment out once validated. *)
(*
query pk_i: pkey, pk_r: pkey, k: key; event(endI(pk_i, pk_r, k)).
query pk_i: pkey, pk_r: pkey, k: key; event(endR(pk_i, pk_r, k)).
*)Secrecy (key not derivable by attacker):
Declare a private free name and encrypt it under the session key. The attacker
knowing private_I is equivalent to breaking the session key:
free private_I: bitstring [private].
(* In process, after deriving sk_session: *)
out(c, aead_enc(private_I, sk_session));
(* Query: *)
query attacker(private_I).Weak authentication (if B accepted, A ran at some point with matching params — does not prevent replay):
query pk_i: pkey, pk_r: pkey, k: key;
event(endR(pk_i, pk_r, k)) ==> event(beginI(pk_i, pk_r)).Injective authentication (prevents replay — each B-accept corresponds to a distinct A-run):
query pk_i: pkey, pk_r: pkey, k: key;
inj-event(endR(pk_i, pk_r, k)) ==>
inj-event(beginI(pk_i, pk_r)).Forward secrecy: add a ForwardSecrecyTest process to the main process
that leaks both long-term secret keys to the attacker, then check that a past
session key remains secret. Pair it with a free fs_witness: key [private]
declaration and query attacker(fs_witness). See
references/security-properties.md →
Forward Secrecy, and the worked example in
examples/simple-handshake/sample-output.pv.
Choose the strongest applicable query for each property. See references/security-properties.md for the full decision tree.
Write one let process per participant. Structure each process to mirror the
Mermaid diagram step-by-step, in order.
Template for a two-party protocol:
let Initiator(sk_I: skey, pk_R: pkey) =
(* Step: generate ephemeral key *)
new ek_I: skey;
let epk_I = dhpk(ek_I) in
(* Step: sign and send msg1 — pkey2bs casts pkey to bitstring *)
let sig_I = sign(concat(msg1_label, pkey2bs(epk_I)), sk_I) in
event beginI(pk(sk_I), pk_R);
out(c, (epk_I, sig_I));
(* Step: receive msg2 *)
in(c, (epk_R: pkey, sig_R: bitstring));
(* Step: verify responder signature — destructor aborts on failure *)
let transcript = concat(pkey2bs(epk_I), pkey2bs(epk_R)) in
let _ = verify(sig_R, concat(msg2_label, transcript), pk_R) in
(* Step: derive session key *)
let dh_val = dh(ek_I, epk_R) in
let sk_session = hkdf(dh_val, concat(info_session_key, transcript)) in
event endI(pk(sk_I), pk_R, sk_session);
(* Secrecy witness: encrypt private_I under the session key.
* Declared as: free private_I: bitstring [private].
* The query attacker(private_I) checks the attacker cannot derive it. *)
out(c, aead_enc(private_I, sk_session)).Rules for writing processes:
A ->> B: msg_contents in the diagram becomes:out(c, msg_contents) in A's processin(c, x) (with matching destructuring) in B's processNote over A: op → result becomes a let result = op in bindingNote over A: Verify(...) becomes a let _ = verify(...) in
binding (the destructor aborts on failure — no explicit else needed,
modeling abort)alt blocks in the diagram as if/then/else in the processnewN-party or MPC protocols: write one process per distinct role. For
threshold protocols, write a single role process and replicate it !N times
in the main process.
The main process:
newout(c, pk(sk))!) to allow
multiple sessionsprocess
new sk_I: skey; let pk_I = pk(sk_I) in out(c, pk_I);
new sk_R: skey; let pk_R = pk(sk_R) in out(c, pk_R);
(
!Initiator(sk_I, pk_R)
| !Responder(sk_R, pk_I)
)Place the full file in this order:
(* 1. Channel declarations (free c: channel. / free ch: channel [private].) *)
(* 2. noselect directives (if needed for termination) *)
(* 3. Type declarations *)
(* 4. Constants *)
(* 5. Function declarations *)
(* 6. Equations (algebraic identities on constructors only) *)
(* 7. Table declarations *)
(* 8. Events *)
(* 9. Queries *)
(* 10. Let processes *)
(* 11. Main process *)Before writing the file:
let processout(c, ...) has a matching in(c, ...) on the other side with
compatible typesreduc (not a separate equation block)c in the main process
(attacker can see them — that is the Dolev-Yao model)table declarations are present: every insert T(...) has a
corresponding get T(...) with compatible column types and matching
pattern constraints (=key vs bare name)noselect is used: its tuple structure matches the actual message
shapes sent on c (e.g., pairs → mess(c, (x, y)))event key_exposed(sk_type)
is declared, the oracle in(c, guess: sk_type); if pk(guess) = pk_new then event key_exposed(guess) appears at the end of the process that holds the
secret, and the query is query x: sk_type; event(key_exposed(x))Write the model to a .pv file. Choose a filename from the protocol name,
e.g. noise-xx-handshake.pv or x3dh-key-agreement.pv.
After writing, print a brief summary:
Protocol: <Name>
Output: <filename>
Queries: <list each query and what property it tests>
Assumptions: <list modeling decisions and simplifications>├─ No Mermaid diagram provided?
│ └─ Ask the user: "Please provide the Mermaid sequenceDiagram,
│ or run the crypto-protocol-diagram skill first."
│
├─ Diagram uses DH (not just symmetric crypto)?
│ └─ Use dh/dhpk with commutativity equation
│ See references/crypto-to-proverif-mapping.md → DH section
│
├─ Diagram uses asymmetric signatures (Sign/Verify)?
│ └─ Use sign/verify with inline reduc (not equation)
│ verify returns the message on success; let _ = verify(...) in to abort on failure
│ Distinguish signing key (skey) from verification key (pkey)
│
├─ Diagram has an "alt" block (abort path)?
│ └─ Model as if/then only — the else branch aborts (process terminates)
│ Do NOT add out(c, error_message) unless the diagram shows it
│
├─ Protocol has N > 2 parties?
│ └─ Write one process per role, use ! for replication
│ Pass participant index as a parameter if roles differ by index only
│
├─ Forward secrecy requested?
│ └─ Add a ForwardSecrecy variant in the main process that leaks
│ long-term sk after session; add secrecy query for past session_key
│ See references/security-properties.md → Forward Secrecy
│
├─ Type-checker rejects the model?
│ └─ ProVerif is typed: check every function arg type matches declaration.
│ bitstring is the catch-all; key/pkey/skey/nonce are stricter.
│ Cast with explicit constructors when needed.
│
├─ Protocol has cross-process state coordination (e.g., one process must wait
│ for another to record acceptance before proceeding)?
│ └─ Use ProVerif tables (table/insert/get)
│ See references/proverif-syntax.md → Tables
│
├─ Verification does not terminate after several minutes?
│ └─ Add noselect directive matching the message tuple structure on c
│ See references/proverif-syntax.md → noselect
│
├─ Protocol generates a private-type key (type sk [private]) that is never
│ output directly but whose secrecy should be verified?
│ └─ Use the Key Exposure Oracle pattern instead of query attacker(sk)
│ See references/security-properties.md → Key Exposure Oracle
│
└─ Unsure which security properties to verify?
└─ Default set: secrecy of session key + injective authentication
(both directions). Add forward secrecy if diagram shows ephemeral keys.examples/simple-handshake/ contains a worked example:
diagram.md — Mermaid sequenceDiagram for a two-party authenticated key
exchange (X25519 DH + Ed25519 signing + HKDF)sample-output.pv — exact ProVerif model the skill should produce,
with secrecy and injective authentication queriesStudy this before working on an unfamiliar protocol.
© trailofbits, CC-BY-SA-4.0. 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 7 other files (references, assets) in plugins/trailmark/skills/mermaid-to-proverif of trailofbits/skills.
Open the folder on GitHubat commit 442fc9d
Mermaid to ProVerif Model 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 |
|---|---|---|---|---|---|---|
| Mermaid to ProVerif Model this skilltrailofbits/skills | 7.5k | — | ~4.5k | Automated safety check: Pass | CC-BY-SA-4.0 | |
| Audit Flowzebbern/claude-code-guide | 4.7k | — | ~4.2k | Automated safety check: Pass | MIT | |
| Archify Diagramstt-a1i/archify | 82k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Diagram Designcathrynlavery/diagram-design | 49k | 1 repos | ~7.6k | Automated safety check: Pass | MIT | |
| Draw.io Diagram StudioAgents365-ai/drawio-skill | 10k | — | ~2.4k | Automated safety check: Notes | MIT | |
| Pretty Mermaid Rendererimxv/Pretty-mermaid-skills | 1.5k | — | ~2k | Automated safety check: Pass | MIT |
zebbern/claude-code-guide
Interactive system flow tracing across CODE, API, AUTH, DATA, NETWORK layers with SQLite persistence and Mermaid export.
tt-a1i/archify
Creates interactive architecture, workflow, sequence, data-flow and lifecycle diagrams as standalone HTML with inline SVG, themes and image or video export.
cathrynlavery/diagram-design
Creates branded diagrams, from architecture, flowchart and sequence to charts and maps, as self-contained HTML with inline SVG, with import from draw.io, Mermaid and Excalidraw.
Agents365-ai/drawio-skill
Creates and edits editable draw.io diagrams from descriptions, code, infrastructure files, SQL and API schemas, with sync, review, test and export tools.
imxv/Pretty-mermaid-skills
Writes and renders Mermaid diagrams as themed SVG, PNG or terminal ASCII and Unicode art with a bundled Node.js CLI that needs no browser.
Unclecheng-li/AI_Animation
Builds validated architecture, workflow, sequence, data-flow and lifecycle diagrams as standalone interactive HTML from a small JSON spec, with optional motion and image export.
trailofbits/skills
Scans a codebase for vulnerabilities with CodeQL's data flow and taint tracking in run-all or important-only modes, including data extensions for project-specific sources and sinks.
trailofbits/skills
Generates Mermaid diagrams from Trailmark code graphs, including call graphs, class hierarchies, module dependency maps, complexity heatmaps and attack surface data flows.
trailofbits/skills
Compares Trailmark code graphs at two snapshots, such as commits, tags or directories, to surface attack paths, blast radius and taint changes that text diffs miss.
trailofbits/skills
Draws a 12 Houses tarot spread to break ties when a request is vague or casually delegated, then reads the cards to pick the next step.
trailofbits/skills
Detects languages, proposes rulesets for approval, then runs the approved Semgrep scan across a codebase and merges the output into one SARIF file.
trailofbits/skills
Searches and extracts data from Burp Suite project files on the command line: regex searches over responses, audit findings, proxy history and site map data.
Works with
Categories
Converts a Mermaid sequence diagram of a cryptographic protocol into a ProVerif model file ready for checking secrecy, authentication and forward secrecy. pv model for the ProVerif verifier. It works through a checklist that begins with parsing participants and channels and taking an inventory of the cryptographic operations, with reference notes on how those operations map to ProVerif constructs, on ProVerif syntax and on security properties.
Mermaid to ProVerif Model fits situations like: turning a protocol sequence diagram into a ProVerif model; checking a handshake for secrecy and authentication properties; testing whether a protocol with ephemeral keys has forward secrecy; looking for replay attacks in a modeled protocol.
Run `npx skills add trailofbits/skills --skill mermaid-to-proverif -a claude-code`. Or copy the skill folder (plugins/trailmark/skills/mermaid-to-proverif in trailofbits/skills) into .claude/skills/mermaid-to-proverif in your project. Claude Code loads it when a task matches its description.
Run `npx skills add trailofbits/skills --skill mermaid-to-proverif -a codex`. Or copy the skill folder (plugins/trailmark/skills/mermaid-to-proverif in trailofbits/skills) into .agents/skills/mermaid-to-proverif 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 trailofbits/skills --skill mermaid-to-proverif -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/mermaid-to-proverif, .gemini/skills/mermaid-to-proverif, .github/skills/mermaid-to-proverif and .opencode/skills/mermaid-to-proverif in your project.
SKILL.md names no scripts, command-line tools or credentials: Mermaid to ProVerif Model is instructions for the agent only. Our summary lists: A Mermaid sequenceDiagram of the protocol; ProVerif, to run the generated .pv file.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Mermaid to ProVerif Model is published under the CC-BY-SA-4.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k 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 9.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Mermaid to ProVerif Model: Audit Flow (zebbern/claude-code-guide, 4.7k stars), Archify Diagrams (tt-a1i/archify, 82k stars), Diagram Design (cathrynlavery/diagram-design, 49k stars) and Draw.io Diagram Studio (Agents365-ai/drawio-skill, 10k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
trailofbits (a GitHub organization, an official publisher) maintains it in trailofbits/skills, which has 7,455 GitHub stars. The repository holds 79 skills in this directory. The repository was last updated on October 9, 2026.
Source: trailofbits/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.