Agent skill

Vero Plan

by sunblaze-ucb in sunblaze-ucb/vero

Use after vero-select to write a detailed translation plan as .vero/plan.json — the authoritative contract the TRANSLATE stage executes.

Apache-2.0Auto-check: notesWriting & Content

Install Vero Plan

skills CLI
$ npx skills add sunblaze-ucb/vero --skill vero-plan -a claude-code

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

GitHub CLI
$ gh skill install sunblaze-ucb/vero vero-plan --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/sunblaze-ucb/vero.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/vero-plan .claude/skills/vero-plan && 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
vero-plan
GitHub stars
107
Token cost
~3.6k tokens
SKILL.md length
1,448 words
Files
1
Skills in repo
16
Repo updated
First seen
Licence
Apache-2.0

At a glance

Use after vero-select to write a detailed translation plan as .vero/plan.json — the authoritative contract the TRANSLATE stage executes.

  • Works in 9 steps: Read config for project_name,… → Read .vero/select.json — walk… → Also read .vero/discover.json — lets you… → …
  • Tasks that involve Translation
  • SKILL.md covers When to use, Inputs, Output: .vero/plan.json and Output:…, plus 4 more sections
  • Calls python

What it does

Vero Plan is an agent skill from sunblaze-ucb/vero. Use after vero-select to write a detailed translation plan as .vero/plan.json — the authoritative contract the TRANSLATE stage executes. Captures apinamespace, packages, modules, types, APIs (with sig abbrevs + types), specs (with NL descriptions), ref impls, and test cases. Pair with vero-source-{dafny,verus,coq}.

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Writing & Content, covering Translation and Test generation. The licence is Apache-2.0.

When your agent uses it

  • Tasks that involve Translation
  • Tasks that involve Test generation

Example prompts

  • “/vero-plan”

Requirements

  • Python 3
  • Pre-approved tools (allowed-tools): Read, Write, Bash, Grep, Glob

Workflow steps

9 steps, taken from the first numbered list in SKILL.md.

  1. Read config for project_name, benchmark_id, lean_version.
  2. Read .vero/select.json — walk proposed_packages[].modules[].
  3. Also read .vero/discover.json — lets you look up items by
  4. Also read .vero/source_index.json — every translated item must
  5. Scaffold the JSON first. Write .vero/plan.json with the
  6. For each module in select.json (one at a time, not batched)
  7. After all modules are done, Edit plan.json to populate
  8. If any decision is ambiguous, Write .vero/plan/questions.md
  9. No ref_impls field — the reference implementation is the body

What it can do on your machine

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

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Bash
    • Grep
    • Glob

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • python

    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

Vero Plan loads about 3.6k tokens when it runs. Until then it costs about 83 tokens; SKILL.md has 1,448 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~83
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k

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: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Write, Bash, Grep, Glob

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 sunblaze-ucb/vero at commit 0a7325d, republished under its Apache-2.0 licence (© sunblaze-ucb). 1,448 words, ~3,577 tokens.

Download SKILL.mdSave it as .claude/skills/vero-plan/SKILL.md (or your agent's skills folder).
name
vero-plan
description
Use after vero-select to write a detailed translation plan as `.vero/plan.json` — the authoritative contract the TRANSLATE stage executes. Captures api_namespace, packages, modules, types, APIs (with sig abbrevs + types), specs (with NL descriptions), ref impls, and test cases. Pair with `vero-source-{dafny,verus,coq}`.
allowed-tools
Read, Write, Bash, Grep, Glob

VCG Plan: Emit plan.json

Write a detailed translation plan as JSON, pinning every Lean signature the TRANSLATE stage will emit. The plan is reviewed by a human before translate executes.

This stage does NOT write any Lean code. It writes .vero/plan.json (authoritative machine-readable contract) and .vero/plan/questions.md (human-facing questions, if any).

Canonical example: reference/BankLedger/manifest.json + reference/BankLedger/ — the manifest is what translate produces; this stage produces the richer plan.json that translate consumes to produce it.

When to use

  • After .vero/select.json is approved by the human.
  • Before the TRANSLATE stage runs.

Inputs

FileDescription
.vero/select.jsonApproved selection with proposed packages + module grouping
.vero/discover.jsonEntity catalog (for signatures + doc strings)
.vero/config.json (or config.yaml)project_name, benchmark_id, lean_version
Source code filesTo look up exact signatures, ensures clauses, test values

Output: .vero/plan.json

Full schema: docs/pipeline-schema.md (plan.json section). Minimum required structure:

json
{
  "version": 1,
  "api_namespace": "Bank",
  "packages": [
    {
      "name": "BankLedger",
      "is_root": true,
      "bundle_type": "BankLedgerBundle",
      "repo_impl_field": "bankLedger",
      "modules": [
        {
          "name": "Account",
          "upstream_files": ["src/account.rs"],
          "types": [
            {
              "name": "AccountId",
              "lean_form": "abbrev AccountId := Nat",
              "is_foundation": true
            }
          ],
          "apis": [
            {
              "upstream_name": "create_account",
              "lean_name": "createAccount",
              "sig_abbrev": "CreateAccountSig",
              "lean_type": "AccountId → Ledger → Ledger",
              "opaque": false,
              "nl_description": "Add a new account with the given id to the ledger."
            }
          ],
          "spec_helpers": [
            {
              "name": "toSeq",
              "lean_name": "toSeq",
              "lean_form": "def toSeq : Ledger → List (AccountId × Balance)\n  | []            => []\n  | a :: rest     => (a.id, a.balance) :: toSeq rest",
              "nl_description": "Flatten a ledger to a list of (id, balance) pairs; used by specs to state list-level properties."
            }
          ],
          "specs": [
            {
              "name": "spec_create_zero_balance",
              "nl_description": "Creating a new account gives it zero balance.",
              "lean_form": "∀ (id : AccountId) (ledger : Ledger), impl.bankLedger.accountExists id ledger = false → impl.bankLedger.getBalance id (impl.bankLedger.createAccount id ledger) = some 0",
              "apis_referenced": ["createAccount", "accountExists", "getBalance"],
              "spec_helpers_referenced": [],
              "curator_intended_truth": "prove"
            }
          ]
        }
      ]
    }
  ],
  "test_cases": [
    {
      "name": "guard_create_zero_balance",
      "nl_description": "After creating an account it has balance 0.",
      "lean_form": "#guard getBalance 1 (createAccount 1 []) == some 0"
    }
  ]
}

Category mapping from select.json:

select.json categoryplan.json location
typepackages[].modules[].types[]
apipackages[].modules[].apis[] (sig + reference implementation slot + Bundle field)
api_helperTypically absent from plan.json. If the curator wants to pre-provide a helper, add it as packages[].modules[].api_helpers[] (same shape as spec_helpers[], no Bundle entry), but it must still be backed by a real upstream source item. Do not invent helpers.
spec_helperpackages[].modules[].spec_helpers[] — each with lean_form being the full definition body (not just a type). These end up as fully-defined defs in Impl/<Module>.lean with no markers.
specpackages[].modules[].specs[]
testtest_cases[] at plan top-level
Field-by-field guidance

Top-level:

  • version: always 1 for now.
  • api_namespace: one Lean namespace for the public API (e.g. "Bank" for BankLedger). Soft convention; may be null for multi-namespace projects.
  • packages: exactly one entry has is_root: true — its name must match config.project_name. Multi-package projects add non-root entries.

Per-package:

  • name: e.g. "BankLedger". Becomes the package directory name.
  • bundle_type: PascalCase, typically "<Name>Bundle".
  • repo_impl_field: lowerCamelCase of name, the field inside structure RepoImpl.

Per-module:

  • name: PascalCase module name ("Account", "Transaction").
  • upstream_files: list of source files this module consolidates.

types[]:

  • name: Lean type name.
  • lean_form: full Lean declaration text (the curator inspects this verbatim). "abbrev X := …", "structure X where …", or "inductive X where …".
  • is_foundation: true if this type must live in the foundation Impl file (the one every other Impl imports).
  • source_id, source_file, source_line, upstream_name, and source_signature: provenance for the exact upstream declaration.

apis[]:

  • upstream_name: source-side name (create_account in Rust).
  • lean_name: Lean-side name after casing (createAccount).
  • sig_abbrev: PascalCase abbrev, conventionally <LeanName>Sig with first letter uppercased (CreateAccountSig).
  • lean_type: the type body — exactly what goes after := in abbrev <sig_abbrev> := <type>. Use Unicode arrows (→), not ASCII.
  • opaque: true for FFI / external functions — translate emits opaque + axioms instead of a translated reference implementation slot.
  • nl_description: one-sentence English summary. Used later by vero-validate for spec-intent alignment.
  • source_id, source_file, source_line, and source_signature: provenance for the exact upstream declaration.

specs[]:

  • name: must start with spec_.
  • nl_description: one-sentence English summary of what the spec asserts.
  • lean_form: the body of def spec_<…> (impl : RepoImpl) : Prop := …. Access APIs via impl.<repo_impl_field>.<lean_name> — never bare impl.<lean_name> (RepoImpl is one-level-nested).
  • apis_referenced: list of lean_names the spec touches. Helps the validator's spec_completeness check.
  • curator_intended_truth: "prove" | "disprove" | "unsat" | "sat" | "unknown". Curator's ground-truth label for coverage scoring; may be "unknown" if undecided.
  • source_id, source_file, source_line, source_theorem, and source_signature: provenance for the exact upstream theorem/lemma.

Source-provenance rule (hard requirement). Every translated plan item in types[], apis[], api_helpers[], spec_helpers[], specs[], and ref_impls[] must be backed by a real upstream source item. Prefer the exact source_id from .vero/source_index.json; also carry source_file, source_line, and the source signature when available. Do not create generated source ids, blank source files, sentinel predicates, token wrappers, placeholder helpers, or review marker definitions to preserve an item whose Lean translation is not known. If a selected item cannot be faithfully translated now, do not emit it as a translated/scored item; move it to review-only/untranslated metadata with a reason.

Disposition vocabulary (hard requirement). Use only unclassified, provided, scored, hidden, dropped, axiomatized, or opaque. Use provided for fixed source-backed vocabulary that is translated and supplied to the benchmark, such as types and spec helpers. Do not write given; it is a deprecated synonym and will be normalized or rejected by validation.

requires_human_review and equivalence_status: "unclear" are not allowed inside translated/scored item lists. They mean the item is not ready to translate. Keep such items out of types[], apis[], api_helpers[], spec_helpers[], and specs[] until a faithful Lean form is available.

Reference implementations (no separate field). The reference implementation of each non-opaque API is written directly inside the code marker in Impl/<Module>.lean by the TRANSLATE stage — not in a separate Bank.Ref namespace, not in a ref_impls[] plan field. Pre-agent-gen replaces marker content with sorry before the LLM sees the benchmark. This keeps one source of truth and lets #guard tests hit real code at curation / build time.

test_cases[]: #guard assertions against Bank.* directly. Each with an English description and the Lean form. Prefer boundary cases (empty inputs, duplicates, partial-function failure paths).

Output: .vero/plan/questions.md (optional)

If any decision is genuinely ambiguous (the source doesn't commit to a shape), write a bulleted list of questions for the human:

markdown
## Questions

- `pop` — source uses `requires s.nonEmpty`. Map to `Option (Stack α)` or
  `(s : Stack α) → s.size > 0 → Stack α`? Recommendation: `Option`
  (simpler, works with `#guard`).

The human answers inline by editing the file; re-run vero-plan on resume to pick up the answers.

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

How to run (incremental — module by module)

Plan the repo one module at a time. The final plan.json is built up by appending a complete module entry each pass, so partial progress is observable and the run is restartable.

  1. Read config for project_name, benchmark_id, lean_version.
  2. Read .vero/select.json — walk proposed_packages[].modules[].
  3. Also read .vero/discover.json — lets you look up items by qualified name without re-reading source.
  4. Also read .vero/source_index.json — every translated item must resolve to one of these source entities.
  5. Scaffold the JSON first. Write .vero/plan.json with the top-level fields filled in (version, api_namespace, packages with empty modules: []), plus an empty test_cases: []. This is a valid JSON anchor to Edit into.
  6. For each module in select.json (one at a time, not batched): a. Read ONLY the upstream source files for that module's selected entities (typically 1–3 files). Do not read files for other modules yet. b. Work out this module's types[], apis[], specs[] per the field guidance above. Use vero-source-<lang> for type mappings. c. Edit plan.json to append this module's fully-specified entry to the enclosing package's modules[]. Keep the JSON valid after every edit (parse it back with a one-line Bash python -c "import json; json.load(open('…'))" as a lightweight check). d. Announce before and after: "Planning module Merkle (3 types, 5 APIs, 12 specs)." ... "Merkle appended. Moving on to Contract."
  7. After all modules are done, Edit plan.json to populate test_cases[] — emit them in small groups, grouped by the primary API they exercise.
  8. If any decision is ambiguous, Write .vero/plan/questions.md with a bulleted list. Do this at the end so the file tracks every open question in one place.
  9. No ref_impls field — the reference implementation is the body the TRANSLATE stage writes inside each API's code marker directly.

Do not compose the whole plan.json as one giant string and then Write it once. That is the failure mode that loses everything on interrupt.

Quality bar

  • Every category=api item in select.json appears in exactly one module's apis[].
  • Every category=spec item appears in exactly one module's specs[].
  • Every category=spec_helper item appears in exactly one module's spec_helpers[] with a full lean_form definition body.
  • Every category=type item appears in exactly one module's types[].
  • Every translated item has source provenance resolving to .vero/source_index.json. Any generated, placeholder, blank, or unresolved source provenance is a plan-stage failure.
  • No translated item is marked requires_human_review; no translated spec has equivalence_status: "unclear". These must be review-only/untranslated, not benchmark specs.
  • Spec lean_form bodies use impl.<pkg>.<fn> for API references and bare names for spec-helper / type / stdlib references — never bare for an API, never impl.<…> for a spec helper.
  • Spec name-resolution check. For every specs[].lean_form body, every bare identifier it mentions (other than Lean keywords, lambda binders, and stdlib) must resolve to a types[], spec_helpers[], or api_helpers[] entry in the same or a dependency module. Every impl.<pkg>.<name> reference must resolve to an apis[] entry. A reference that doesn't resolve is a hard error — fail the plan stage with a clear message and a pointer to which spec is broken.
  • Each sig_abbrev is unique across the project.
  • The foundation module's types[] cover everything the other modules need to import.
  • No two modules declare the same type name (types live in exactly one Impl file).
  • spec_helpers[].name is unique across the project (one definition per helper).

Non-goals

  • No Lean code in plan.json beyond lean_form strings. This is planning, not translation.
  • No proof bodies. The proofs are materialized downstream.
  • No marker placement. !benchmark markers are emitted by TRANSLATE; the plan only names the slots that will exist.
  • No Proof/ — proof files are NOT a curation artifact.

Pair with

  • vero-source-{dafny,verus,coq} — per-language type mappings and classification rules.
  • vero-translate — consumes this plan.
  • vero-validate — checks the translated output against this plan during the validate stage.

© sunblaze-ucb, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/vero-plan of sunblaze-ucb/vero.

Open the folder on GitHubat commit 0a7325d

Compare with similar skills

Vero Plan 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.

Vero Plan compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Vero Plan this skillsunblaze-ucb/vero107—~3.6kAutomated safety check: NotesApache-2.0
Module Level Code TranslatorArabelaTso/Skills-4-SE253—~1.9kAutomated safety check: PassApache-2.0
Manage Project TranslationsAOSSIE-Org/Website101—~915Automated safety check: PassCustom licence
Migrate E2E To Integrationopenshift/oc-mirror124—~1.5kAutomated safety check: PassApache-2.0
Translation Diff ExportDevolutions/UniGetUI26k—~1.1kAutomated safety check: PassMIT
Sync Translationssymfony/symfony31k—~1.9kAutomated safety check: PassMIT

Similar skills

  • Module Level Code Translator

    ArabelaTso/Skills-4-SE

    Translate source code between programming languages at function, class, and module levels while preserving behavior and generating verification tests.

    253 GitHub stars~1.9k tokensUpdated 1 mo ago
    Writing & ContentAuto-check passed
  • Manage Project Translations

    AOSSIE-Org/Website

    A skill your agent uses whenever adding, updating, or removing projects and UI strings in the AOSSIE website repository, to automatically synchronize translations, enforce translation rules, update…

    101 GitHub stars~915 tokensUpdated 9 days ago
    Writing & ContentAuto-check passed
  • Migrate E2E To Integration

    openshift/oc-mirror

    Migrate an oc-mirror e2e test case to the integration test suite, translating framework, registry, invocation, and assertion patterns

    124 GitHub stars~1.5k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Translation Diff Export

    Devolutions/UniGetUI

    Compares UniGetUI JSON locale files against English, identifies untranslated or source-changed keys, and generates patch, reference, and handoff files for a target language.

    26k GitHub stars~1.1k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Sync Translations

    symfony/symfony

    Synchronize translation catalogs across maintained Symfony branches: find messages that newer branches added to the English catalogs but that are still missing from the oldest maintained branch…

    31k GitHub stars~1.9k tokensUpdated today
    Writing & ContentAuto-check passed
  • Translation Diff Import

    Devolutions/UniGetUI

    Merges translated key-value pairs from a UniGetUI JSON localization patch back into the full language file and validates the merged result.

    26k GitHub stars~750 tokensUpdated yesterday
    Writing & ContentAuto-check passed

More from sunblaze-ucb/vero

All 16 skills in this repo
  • Vero Discover

    sunblaze-ucb/vero

    A skill your agent uses when scanning a verified source repo (Dafny, Verus, or Coq) to classify every item and produce per-file discovery markdown for human curation.

    107 GitHub stars~3.9k tokensUpdated 1 mo ago
    Auto-check: notes
  • Vero Translate

    sunblaze-ucb/vero

    A skill your agent uses when translating selected verified items from Dafny/Verus/Coq into a compilable Lean 4 benchmark.

    107 GitHub stars~4.9k tokensUpdated 1 mo ago
    Auto-check: notes
  • Vero Coq Pitfalls

    sunblaze-ucb/vero

    Load BEFORE translating any Coq item to Lean 4 to avoid known Coq→Lean pitfalls.

    107 GitHub stars~1.5k tokensUpdated 1 mo ago
    Auto-check: notes
  • Vero Dafny Pitfalls

    sunblaze-ucb/vero

    Load BEFORE translating any Dafny item to Lean 4 to avoid known Dafny→Lean pitfalls.

    107 GitHub stars~1.2k tokensUpdated 1 mo ago
    Auto-check: notes
  • Vero Lean Pitfalls

    sunblaze-ucb/vero

    Load BEFORE writing any Lean 4 translation to avoid common Lean pitfalls (universes, coercions, type-class resolution, notation).

    107 GitHub stars~1.4k tokensUpdated 1 mo ago
    Auto-check: notes
  • Vero Python Pitfalls

    sunblaze-ucb/vero

    Load BEFORE translating any Python item to Lean 4 to avoid known Python→Lean pitfalls.

    107 GitHub stars~1.7k tokensUpdated 1 mo ago
    Auto-check passed

Questions about Vero Plan

What does Vero Plan do?

Use after vero-select to write a detailed translation plan as .vero/plan.json — the authoritative contract the TRANSLATE stage executes. Vero Plan is an agent skill from sunblaze-ucb/vero.json — the authoritative contract the TRANSLATE stage executes.

When should I use Vero Plan?

Vero Plan fits situations like: tasks that involve Translation; tasks that involve Test generation.

How do I install Vero Plan in Claude Code?

Run `npx skills add sunblaze-ucb/vero --skill vero-plan -a claude-code`. Or copy the skill folder (.claude/skills/vero-plan in sunblaze-ucb/vero) into .claude/skills/vero-plan in your project. Claude Code loads it when a task matches its description.

How do I install Vero Plan in Codex?

Run `npx skills add sunblaze-ucb/vero --skill vero-plan -a codex`. Or copy the skill folder (.claude/skills/vero-plan in sunblaze-ucb/vero) into .agents/skills/vero-plan in your project. Codex loads it when a task matches its description.

Can I use Vero Plan 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 sunblaze-ucb/vero --skill vero-plan -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/vero-plan, .gemini/skills/vero-plan, .github/skills/vero-plan and .opencode/skills/vero-plan in your project.

What does Vero Plan need to run?

Going by SKILL.md and its folder, Vero Plan needs the command-line tools its instructions call (python). Our summary lists: Python 3. Its frontmatter pre-approves these tools: Read, Write, Bash, Grep, Glob.

Does Vero Plan 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 Vero Plan safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Vero Plan use?

Vero Plan is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Vero Plan use?

About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Vero Plan?

Skills that share tags, products or a category with Vero Plan: Module Level Code Translator (ArabelaTso/Skills-4-SE, 253 stars), Manage Project Translations (AOSSIE-Org/Website, 101 stars), Migrate E2E To Integration (openshift/oc-mirror, 124 stars) and Translation Diff Export (Devolutions/UniGetUI, 26k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Vero Plan?

sunblaze-ucb (a GitHub organization) maintains it in sunblaze-ucb/vero, which has 107 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on August 17, 2026.

Source: sunblaze-ucb/vero on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.