Official agent skill

Writing Lean Proofs

by trailofbits in trailofbits/skills

Structures Lean 4 proofs and library design along Mathlib conventions, from stating theorems to refactoring long tactic proofs and fixing slow or timing-out ones.

OfficialCC-BY-SA-4.0Auto-check passedDevelopment

Install Writing Lean Proofs

skills CLI
$ npx skills add trailofbits/skills --skill writing-lean-proofs -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install trailofbits/skills writing-lean-proofs --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/trailofbits/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/writing-lean-proofs/skills/writing-lean-proofs .claude/skills/writing-lean-proofs && rm -rf skills-src

Use ~/.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/

Facts

Skill name
writing-lean-proofs
GitHub stars
7.4k
Token cost
~4k tokens
SKILL.md length
1,912 words
Files
9 (incl. references)
Skills in repo
79
Repo updated
First seen
Licence
CC-BY-SA-4.0

At a glance

Structures Lean 4 proofs and library design along Mathlib conventions, from stating theorems to refactoring long tactic proofs and fixing slow or timing-out ones.

  • Works in 4 steps: Design definitions and their API first → Build a sorry skeleton → Fill goals, one focused goal at a time → …
  • Proving a theorem in Lean 4 with a clean top-down structure
  • SKILL.md covers Contents, When to Use, When NOT to Use and The workflow, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

This skill is built on Mathlib's style and review conventions and on the methods of large formalization projects. Its core principle is to design top-down and prove bottom-up: statements and definitions are the stable interface and proofs can be swapped freely, so design effort goes into definitions and statements first, and proofs are filled in against skeletons that already compile apart from sorry placeholders.

It covers proving theorems, formalizing mathematics or specifications, defining new types in a library, reviewing proofs for readability, splitting long tactic proofs into lemmas, setting up CI and linters, diagnosing slow proofs and maxHeartbeats timeouts, and writing custom tactics, macros or linters. Reference files cover anti-patterns, library design, linting, naming conventions, performance, proof style, tactics and LLM techniques. It is not aimed at Lean 4 as a general programming language, Lean 3, Coq, Isabelle or Agda.

When your agent uses it

  • Proving a theorem in Lean 4 with a clean top-down structure
  • Refactoring a long, fragile tactic proof into lemmas
  • Diagnosing slow proofs or maxHeartbeats timeouts
  • Setting up CI and linters for a Lean formalization project
  • Reviewing Lean code for readability and Mathlib readiness

Example prompts

  • “State and prove in Lean 4 that the sum of two even numbers is even, leaving sorry placeholders for the steps first.”
  • “Split the long tactic proof in Basic.lean into smaller named lemmas.”
  • “Why does this simp call hit maxHeartbeats, and how can I speed it up?”
  • “Review my Lean definitions against Mathlib naming conventions.”

Requirements

  • A Lean 4 project

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Design definitions and their API first
  2. Build a sorry skeleton
  3. Fill goals, one focused goal at a time
  4. Verify mechanically

What it can do on your machine

Read from SKILL.md and the folder at commit 82fe822. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are lean).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Writing Lean Proofs loads about 4k tokens when it runs, and up to ~23k if it reads all its reference files. Until then it costs about 140 tokens; SKILL.md has 1,912 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~140
When it runs · the whole SKILL.md, loaded when a task matches
~4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~23k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from trailofbits/skills at commit 82fe822, republished under its CC-BY-SA-4.0 licence (© trailofbits). 1,912 words, ~3,978 tokens.

Download SKILL.mdSave it as .claude/skills/writing-lean-proofs/SKILL.md (or your agent's skills folder). This skill also uses 8 other files; get the full folder from GitHub.
name
writing-lean-proofs
description
Writes and reviews structured Lean 4 proofs and designs Lean libraries following Mathlib conventions. Use when proving theorems in Lean, formalizing mathematics or specifications in Lean 4, defining new types or definitions in a Lean library, reviewing Lean proofs for readability and maintainability, refactoring long tactic proofs into lemmas, filling in sorry placeholders in a Lean development, setting up CI or linters for a Lean project, diagnosing slow proofs or maxHeartbeats timeouts, or writing custom tactics, macros, or linters.

Writing Lean Proofs

Contents

Structured Lean 4 proof writing and library design, distilled from Mathlib's style and review conventions and from the methodology of large formalization projects (Liquid Tensor Experiment, PFR, Fermat's Last Theorem).

Core principle: design top-down, prove bottom-up. Lean propositions are proof-irrelevant — only a theorem's statement can affect later declarations. Statements are the stable interface; proofs are disposable and freely replaceable. Put design effort into definitions and statements, then fill in proofs against skeletons that already compile (modulo sorry).

When to Use

  • Proving theorems in Lean 4, from single lemmas to multi-file developments
  • Formalizing mathematics, protocols, or software specifications in Lean
  • Defining new types, structures, or functions in a Lean library
  • Reviewing Lean code for readability, maintainability, or Mathlib readiness
  • Refactoring a long or fragile tactic proof into lemmas
  • Setting up a formalization project that several people or agents will contribute to in parallel
  • Setting up CI, linters, or verification gates for a Lean project — do this at project start, before patterns propagate
  • Diagnosing slow proofs, maxHeartbeats timeouts, or expensive reduction
  • Writing custom tactics, macros, or project-specific linters

When NOT to Use

  • Lean 4 as a general-purpose programming language (no proofs involved) — most of this skill targets proof and API structure
  • Coq, Isabelle, Agda, or Lean 3 — conventions and tactic names differ; Lean 3 idioms (ge_or_gt linting, discrete_field) are obsolete
  • Verified-software Lean projects with their own house style (e.g. spec-traceability-first codebases): Mathlib conventions are the community default, but check the project's CONTRIBUTING first and defer to it

The workflow

1. Design definitions and their API first

Definitions carry the design weight. Before proving anything about a new concept:

  • Prefer total functions with junk values over subtypes or Option in signatures (Mathlib: (0 : ℝ)⁻¹ = 0). Side conditions then appear only on the lemmas that need them, not at every use site.
  • Bundle: new morphism kinds are structures with a FunLike instance; new subobject kinds use SetLike; carry property proofs as structure fields, not separate IsHom-style predicates.
  • Pick the canonical spelling (simp-normal form) for every concept with multiple equivalent forms, and state all API lemmas for that form only.
  • Write the API in the same file, immediately: ext, @[simp], coercion, and injectivity lemmas — before the definition is used anywhere. Downstream proofs use the API, never unfold/show ... from rfl.

See library-design.md for the full set of design rules with rationale.

2. Build a sorry skeleton

State everything before proving anything, at every scale:

  • Project scale: state the target theorem and the lemmas it needs, all with := sorry, and make the file compile. Each sorry is now an independent work unit — a contributor (human or LLM) can discharge one without understanding the rest. This is how LTE, PFR, and FLT scale to dozens of parallel contributors.
  • Proof scale: inside a proof, lay out the have/suffices/calc skeleton with sorry justifications, get Lean to accept the structure, then fill each step. Keeping the structure intact is what produces useful error messages while you work.
lean
example (a b c d : ℝ) (h : c = d * a + b) (h' : b = a * d) : c = 2 * a * d := by
  calc
    c = d * a + b     := sorry
    _ = d * a + a * d := sorry
    _ = 2 * a * d     := sorry
3. Fill goals, one focused goal at a time
  • Every new subgoal gets a focusing dot · with an indented block — never leave several goals active in unfocused sequence (Mathlib's multiGoal linter enforces this). This is what kills fragile goal-ordering dependence.
  • Open each block with a redundant show stating its goal. The proof works without it; reviewers and future editors need it. If show would change the goal, use change instead — keep stated goals honest.
  • Chained rewrites of (in)equalities become calc blocks, relations aligned vertically.
  • have for forward stepping stones ("we first establish X"); suffices for backward reduction ("it suffices to show X").
  • While drafting, annotate the goal state as a comment before non-obvious tactics — emitted by Lean, never imagined. In a headless workflow, insert trace_state at the point of interest or a deliberate done where goals should be closed, then run lake env lean Path/To/File.lean; copy the reported hypotheses, case name, and target. Strip routine probes after the proof works. This is the single most effective technique for LLM-written proofs (see llm-techniques.md).

See proof-style.md for the full tactic-style rules, and naming-conventions.md for naming lemmas so their names are guessable from their statements.

4. Verify mechanically

Do not eyeball-check style — run the checkers. lake build is the floor, and it is only the floor: sorry is a warning, so a green build exits 0 with sorries still present.

  • Gate unproved obligations by asking the kernel, never by grepping. #print axioms myTheorem for a spot check; for CI, collect axioms per declaration with Lean.collectAxioms and assert the whole expected footprint ([propext, Classical.choice, Quot.sound] unless deliberately widened), so a stray sorry or a new trust assumption like native_decide fails loudly. Grep is wrong in both directions: it matches the word in comments, and it misses a theorem whose own text is clean but which applies an unproved helper. Working script in linting.md.
  • Choose lints by project role and put them in CI at project start. Do not enable linter.mathlibStandardSet wholesale in a downstream project: it combines proof-maintenance checks with public-API checks, house style, and Mathlib-specific repository policy. For a self-contained proof, start with linter.auxLemma, linter.style.maxHeartbeats, linter.style.multiGoal, linter.style.setOption, and linter.style.show. A reusable library should additionally enable linter.flexible, linter.style.missingEnd, linter.style.openClassical, and the two unused*InType checks. Treat nativeDecide as a trust-policy choice and formatting or deprecated-syntax checks as project style. No warning gates anything unless warnings fail the build. Run Batteries' declaration-level #lint checks, including simpNF, separately. Verify every option against the pinned Mathlib source and with a known-trigger fixture: a misspelled weak. option is intentionally ignored. The complete 26-member audit and lakefile profiles are in linting.md.
  • Write a custom linter for every project-specific convention (simp-set discipline, summary-lemma coverage, required attributes) — a declaration-level @[env_linter] is one structure, and it is the only thing that reliably catches "the attribute is missing on 29 of 30 declarations". See linting.md for the recipe and the engineering rules (vacuity anchors, prove-it-can-fail, allowlists).

The extraction ladder

When does proof structure graduate into separate lemmas?

  1. Before extracting, state the fragment's type and search by shape. Put the proposed statement in a scratch example, run exact? and apply? on the bare goal, then try a type-pattern and source search. If an existing theorem fits, use it. Do not report an API gap without recording the searches that failed.

  2. A sub-argument repeats within one proof → name it as a local have.

    lean
    theorem min_comm (a b : ℝ) : min a b = min b a := by
      have h : ∀ x y : ℝ, min x y ≤ min y x := by
        intro x y
        apply le_min
        · show min x y ≤ y
          exact min_le_right x y
        · show min x y ≤ x
          exact min_le_left x y
      apply le_antisymm
      · show min a b ≤ min b a
        exact h a b
      · show min b a ≤ min a b
        exact h b a
  3. The statement is independently interesting, or extraction sheds hypotheses the sub-argument does not need → standalone lemma. Dropping unneeded hypotheses is the stronger trigger: the extracted lemma becomes more general than the proof it came from.

  4. The proof reads as "long and unwieldy" → split it. This is Mathlib's review criterion, and it is deliberately qualitative — there is no line threshold. Resolve doubt by attempting the extraction: if a fragment has a clean statement, it wanted to be a lemma.

Show full SKILL.md (765 more words)Show less

Quick reference

RuleWhyEnforced by
Never unfold definitions downstream; erw or trailing rfl = missing APIAPI lemmas are the abstraction boundaryreview ("missing API" smell)
Terminal simp stays unsqueezed; non-terminal simp becomes simp only [...]squeezed terminal calls bury the key lemmas and break on renamesstyle guide
One focused goal at a time (· blocks)kills goal-ordering fragilitylinter.style.multiGoal
show must not change the goal (use change)stated goals stay honestlinter.style.show
No set_option debug/trace/profiler or unscoped maxHeartbeats in final codedebugging scaffoldinglinter.style.setOption
State lemmas in simp-normal form, < not >simp matches syntacticallysimpNF linter
Golf only when the result is at least as readable; trivial results exemptshort ≠ betterreview
Fact instances are local, never globalglobal instances degrade all typeclass searchreview
Name lemmas from their statements (see naming reference)names become guessable without searchlinter.style.nameCheck catches only __; #lint defsWithUnderscore and review cover more
Search a bare goal by shape before writing a helper or claiming an API gapnames are not always guessable from the targetexact?, apply?, type/source search
Generally one tactic invocation per line; a one-line closing proof is the exceptionpreserves readable proof structure without inventing an absolute rulestyle guide
Gate sorry with collectAxioms/#print axioms, never grepgrep matches comments, misses unproved helpersaxiom audit in CI
Prefer simp-lemma LHSs keyed on structure, not numerals; one spelling per constant2 ^ 32 never matches a goal normalized to 4294967296simpNF, review
Re-derive every simp only list with simp? at its own sitelists do not transfer between look-alike goalslinter.flexible
Every maxHeartbeats override is an unproven claim — measure before believingcopy-pasted budgets carry no information#count_heartbeats, bisection
Conditional simp lemma fires shallow but not deep → raise maxDischargeDepth (default 2)chained side conditions truncate silently, no diagnosticdiagnosis (proof-style, simp discipline)
Every project-specific convention gets a custom linter, in CI from day onereview misses the 29-of-30 failure mode@[env_linter] + #lint

Full rationale for each row, plus the library-level anti-patterns, in anti-patterns.md.

Rationalizations to reject

ExcuseReality
"The proof compiles, ship it"Compiling is the floor. A monolithic tactic block that only Lean can read will break silently at the next Mathlib bump and no one will be able to repair it.
"Unfolding the definition is simpler than writing API lemmas"Every downstream unfold couples a proof to the implementation. The first refactor breaks all of them at once. Write the missing lemma.
"Squeezing every simp makes the proof faster and more robust"Backwards for terminal simp calls: the squeezed list breaks on every rename and drowns the signal. Squeeze non-terminal calls only.
"It's shorter, therefore better"Mathlib review policy: golfing is fine only when it does not sacrifice readability. Length is not the target; legibility is.
"I'll restructure it into lemmas after it works"After it works, the structure is load-bearing and tangled. State the skeleton first; the lemmas fall out for free.
"Adding show lines is redundant noise"They are redundant to the kernel and essential to every human or model that reads the proof next.
"This helper is too specific to be a lemma"If it has a clean statement, extract it — dropping the hypotheses it doesn't need usually reveals it was general all along.
"We'll add linters once the library stabilizes"Backwards: patterns propagate by copy-paste, so a deferred linter meets a 400-warning backlog instead of one bad line. Enable what is already clean and gate it now.
"The check passed, so we're clean"A check that can't fail proves nothing — sweeps reach zero files, misspelled weak. options are ignored, pipelines swallow exit codes. Prove every gate can fail before trusting that it passes.
"The proof is slow, raise maxHeartbeats"An unmeasured budget is a claim, not a fix — and it masks the regression the next reader needs to see. Measure with #count_heartbeats; restructure the definition or decompose the goal.

References

  • library-design.md — definitions, APIs, bundling, abstraction boundaries, spec-driven project decomposition
  • proof-style.md — tactic proof structure: calc, have/suffices, focusing, and simp discipline including the why-doesn't-this-lemma-fire diagnoses (discharge depth, traversal order, numeral spellings)
  • naming-conventions.md — Mathlib naming so lemma names are computable from statements
  • anti-patterns.md — recognized anti-patterns, why each is harmful, and which linter catches it
  • llm-techniques.md — evidence-based techniques specific to LLM-written proofs
  • linting.md — axiom-based sorry gates, enabling project-specific linter profiles in CI early, the full Mathlib standard-set audit, adopting linters with a backlog, writing custom linters for project-specific constructs, and proving every gate can fail
  • performance.md — measuring per-declaration cost, where reduction cost comes from, optimizing definitions without losing semantics
  • tactics.md — metaprogramming discipline: extension-point selection, metavariable and recovery safeguards, bounded search, actionable errors, structured tracing, generated declarations, and failure-surface testing

© 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

Files

SKILL.md and 8 other files (references) in plugins/writing-lean-proofs/skills/writing-lean-proofs of trailofbits/skills.

  • SKILL.md
  • references/anti-patterns.md
  • references/library-design.md
  • references/linting.md
  • references/llm-techniques.md
  • references/naming-conventions.md
  • references/performance.md
  • references/proof-style.md
  • references/tactics.md

Open the folder on GitHubat commit 82fe822

Compare with similar skills

Writing Lean Proofs 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.

Writing Lean Proofs compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Writing Lean Proofs this skilltrailofbits/skills7.4k—~4kAutomated safety check: PassCC-BY-SA-4.0
Rust Best Practicesfarm-fe/farm5.6k3 repos~1.1kAutomated safety check: PassMIT
File Good First BugBrowserWorks/waterfox-android3761 repos~2kAutomated safety check: PassCustom licence
Unslop CodeJCarterJohnson/vibecoded-design-tells508—~2.5kAutomated safety check: PassCustom licence
Code Quality Gatefengshao1227/ccg-workflow5.9k—~593Automated safety check: NotesMIT
Rust Hygiene Audittsz-org/tsz572—~1.5kAutomated safety check: PassApache-2.0

Similar skills

  • Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.

    5.6k GitHub starsUsed in 3 repos~1.1k tokens
    DevelopmentAuto-check passed
  • File Good First Bug

    BrowserWorks/waterfox-android

    A skill your agent uses when the user wants to file good-first-bugs in Bugzilla for Firefox.

    376 GitHub starsUsed in 1 repo~2k tokens
    DevelopmentAuto-check passed
  • Unslop Code

    JCarterJohnson/vibecoded-design-tells

    Strips the tells that make source code read as AI-generated and forces code that fits the project instead of the model's default average.

    508 GitHub stars~2.5k tokensUpdated 3 mo ago
    DevelopmentAuto-check passed
  • Code Quality Gate

    fengshao1227/ccg-workflow

    Scans code for complexity, long functions, duplicated blocks, naming problems and code smells with a Node script, then reports and suggests refactors.

    5.9k GitHub stars~593 tokensUpdated 22 days ago
    DevelopmentAuto-check: notes
  • Run a deep DRY + code-hygiene audit of the Rust workspace and turn the findings into verified, deduplicated, hierarchical GitHub tech-debt issues.

    572 GitHub stars~1.5k tokensUpdated 27 days ago
    DevelopmentAuto-check passed
  • Dep Validate

    blokadaorg/blokada

    A skill your agent uses to validate risky dependency bumps end to end as a local or cloud-launched agent.

    3.3k GitHub stars~5.7k tokensUpdated today
    DevelopmentAuto-check: notes

More from trailofbits/skills

All 79 skills in this repo
  • CodeQL Security Scan

    trailofbits/skills

    Official

    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.

    7.4k GitHub stars~4.6k tokensUpdated 5 days ago
    Auto-check: notes
  • Code Graph Mermaid Diagrams

    trailofbits/skills

    Official

    Generates Mermaid diagrams from Trailmark code graphs, including call graphs, class hierarchies, module dependency maps, complexity heatmaps and attack surface data flows.

    7.4k GitHub stars~1.7k tokensUpdated 5 days ago
    Auto-check passed
  • Trailmark Graph Evolution

    trailofbits/skills

    Official

    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.

    7.4k GitHub stars~3.4k tokensUpdated 5 days ago
    Auto-check passed
  • Let Fate Decide

    trailofbits/skills

    Official

    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.

    7.4k GitHub stars~2.5k tokensUpdated 5 days ago
    Auto-check: notes
  • Semgrep Security Scan

    trailofbits/skills

    Official

    Detects languages, proposes rulesets for approval, then runs the approved Semgrep scan across a codebase and merges the output into one SARIF file.

    7.4k GitHub stars~3.7k tokensUpdated 5 days ago
    Auto-check: notes
  • Burp Suite Project Parser

    trailofbits/skills

    Official

    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.

    7.4k GitHub starsUsed in 3 repos~4.2k tokens
    Auto-check: notes

Questions about Writing Lean Proofs

What does Writing Lean Proofs do?

Structures Lean 4 proofs and library design along Mathlib conventions, from stating theorems to refactoring long tactic proofs and fixing slow or timing-out ones. This skill is built on Mathlib's style and review conventions and on the methods of large formalization projects. Its core principle is to design top-down and prove bottom-up: statements and definitions are the stable interface and proofs can be swapped freely, so design effort goes into definitions and statements first, and proofs are filled in against skeletons that already compile apart from sorry placeholders.

When should I use Writing Lean Proofs?

Writing Lean Proofs fits situations like: proving a theorem in Lean 4 with a clean top-down structure; refactoring a long, fragile tactic proof into lemmas; diagnosing slow proofs or maxHeartbeats timeouts; setting up CI and linters for a Lean formalization project.

How do I install Writing Lean Proofs in Claude Code?

Run `npx skills add trailofbits/skills --skill writing-lean-proofs -a claude-code`. Or copy the skill folder (plugins/writing-lean-proofs/skills/writing-lean-proofs in trailofbits/skills) into .claude/skills/writing-lean-proofs in your project. Claude Code loads it when a task matches its description.

How do I install Writing Lean Proofs in Codex?

Run `npx skills add trailofbits/skills --skill writing-lean-proofs -a codex`. Or copy the skill folder (plugins/writing-lean-proofs/skills/writing-lean-proofs in trailofbits/skills) into .agents/skills/writing-lean-proofs in your project. Codex loads it when a task matches its description.

Can I use Writing Lean Proofs in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add trailofbits/skills --skill writing-lean-proofs -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/writing-lean-proofs, .gemini/skills/writing-lean-proofs, .github/skills/writing-lean-proofs and .opencode/skills/writing-lean-proofs in your project.

What does Writing Lean Proofs need to run?

SKILL.md names no scripts, command-line tools or credentials: Writing Lean Proofs is instructions for the agent only. Our summary lists: A Lean 4 project.

Does Writing Lean Proofs access the network?

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.

Is Writing Lean Proofs safe to install?

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.

What licence does Writing Lean Proofs use?

Writing Lean Proofs 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.

How many tokens does Writing Lean Proofs use?

About 4k tokens (SKILL.md is roughly 16k 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 19k tokens, read only when the agent opens those files.

What are the alternatives to Writing Lean Proofs?

Skills that share tags, products or a category with Writing Lean Proofs: Rust Best Practices (farm-fe/farm, 5.6k stars), File Good First Bug (BrowserWorks/waterfox-android, 376 stars), Unslop Code (JCarterJohnson/vibecoded-design-tells, 508 stars) and Code Quality Gate (fengshao1227/ccg-workflow, 5.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Writing Lean Proofs?

trailofbits (a GitHub organization, an official publisher) maintains it in trailofbits/skills, which has 7,400 GitHub stars. The repository holds 79 skills in this directory. The repository was last updated on October 2, 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.