Code Review Checklist
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
Simulate and analyze Opentrons protocols to verify correctness.
$ npx skills add Opentrons/opentrons --skill protocol-verification -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Opentrons/opentrons protocol-verification --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/Opentrons/opentrons.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.cursor/skills/protocol-verification .claude/skills/protocol-verification && 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 "protocol-verification" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-verification into .claude/skills/protocol-verification/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-verification", 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/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-verificationType 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 Opentrons/opentrons --skill protocol-verification -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Opentrons/opentrons protocol-verification --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Opentrons/opentrons.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.cursor/skills/protocol-verification .agents/skills/protocol-verification && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "protocol-verification" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-verification into .agents/skills/protocol-verification/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-verification", 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 Opentrons/opentrons --skill protocol-verification -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Opentrons/opentrons protocol-verification --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Opentrons/opentrons.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.cursor/skills/protocol-verification .cursor/skills/protocol-verification && 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 "protocol-verification" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-verification into .cursor/skills/protocol-verification/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-verification", 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/Opentrons/opentrons.git --path .cursor/skills/protocol-verification--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 Opentrons/opentrons --skill protocol-verification -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Opentrons/opentrons protocol-verification --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Opentrons/opentrons.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.cursor/skills/protocol-verification .gemini/skills/protocol-verification && 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 "protocol-verification" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-verification into .gemini/skills/protocol-verification/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-verification", 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 Opentrons/opentrons protocol-verificationInstalls 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 Opentrons/opentrons --skill protocol-verification -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Opentrons/opentrons.git skills-src && mkdir -p .github/skills && cp -r skills-src/.cursor/skills/protocol-verification .github/skills/protocol-verification && 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 "protocol-verification" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-verification into .github/skills/protocol-verification/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-verification", 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 Opentrons/opentrons --skill protocol-verification -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Opentrons/opentrons protocol-verification --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Opentrons/opentrons.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.cursor/skills/protocol-verification .opencode/skills/protocol-verification && 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 "protocol-verification" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-verification into .opencode/skills/protocol-verification/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-verification", 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.
protocol-verificationSimulate and analyze Opentrons protocols to verify correctness.
Protocol Verification is an agent skill from Opentrons/opentrons. Simulate and analyze Opentrons protocols to verify correctness. Use when asked to verify, simulate, analyze, validate, or check a protocol, or when needing to confirm a newly created protocol works.
Its SKILL.md is about 3k 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 Development. It works with Python. The repository describes itself as: Software for writing protocols and running them on the Opentrons Flex and Opentrons OT-2. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit adb4970. 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.
Shell commands in SKILL.md call:
pythonmakeuvFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom 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.
Protocol Verification loads about 3k tokens when it runs. Until then it costs about 55 tokens; SKILL.md has 811 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 Opentrons/opentrons at commit adb4970, republished under its Apache-2.0 licence (© Opentrons). 811 words, ~2,967 tokens.
.claude/skills/protocol-verification/SKILL.md (or your agent's skills folder).After creating or modifying a protocol, verify it using the binaries in api/.venv/bin/. All commands run from the monorepo root.
The api/ venv must exist. If it doesn't (first time, or after teardown):
make -C api setupThis creates api/.venv/ with all entry points installed. You only need to do this once.
api/.venv)OT-2 robot software and the Python API live in a separate fork (opentrons-ot2). This monorepo's api/ package (and api/.venv) is Flex-only: opentrons analyze and opentrons_simulate reject OT-2 protocols.
The same split applies on PyPI: opentrons==9.0.0 is the last release where one package could analyze or simulate both OT-2 and Flex. That wheel supports Python API through 2.28 (the last apiLevel shared across both robots before the fork). opentrons 9.1+ analyzes Flex only; use the OT-2 fork / OT-2 app stack for OT-2 protocols at 2.28 or below.
For mixed OT-2/Flex reference checks at apiLevel 2.28, create a separate Python 3.12 venv (do not commit it):
uv venv /path/to/opentrons-9.0-venv --python 3.12
uv pip install --python /path/to/opentrons-9.0-venv/bin/python 'opentrons==9.0.0'
/path/to/opentrons-9.0-venv/bin/python -m opentrons.cli analyze tmp-protocols/my_protocol.py --check --json-output=-
/path/to/opentrons-9.0-venv/bin/opentrons_simulate tmp-protocols/my_protocol.pyFlex-only checks use api/.venv/bin/... from this monorepo (or current PyPI opentrons for Flex).
| Tool | Binary | Notes |
|---|---|---|
| Simulate | api/.venv/bin/opentrons_simulate | Flex dev tree; OT-2 rejected |
| Analyze | api/.venv/bin/python -m opentrons.cli analyze | Flex dev tree; OT-2 rejected |
| Simulate / analyze (OT-2 or mixed @ ≤2.28) | Separate venv with opentrons==9.0.0 (see above) | Last unified PyPI release; not monorepo api/.venv |
Do not use
uv runfor one-off simulate/analyze calls. It checks and potentially rebuilds the venv on every invocation, adding significant latency. Call the venv binaries directly.
All local dev artifacts are gitignored and live at the monorepo root:
| Directory | Purpose |
|---|---|
tmp-protocols/ | Protocol .py files |
tmp-custom-labware/ | Custom labware .json definitions |
tmp-csv/ | CSV files for RTP inputs |
Produces a human-readable runlog of every command the robot would execute. Use for quick validation.
⛔ RTP protocols cannot be simulated.
opentrons_simulatehas no--rtp-valuesor--rtp-filesflag. If the protocol definesadd_parameters()(any RTP — including CSV, int, bool, str, or float), you must tell the user this upfront and useopentrons analyzeinstead. Do not attempt to simulate an RTP protocol and let it fail; explain the limitation first, then switch to analyze automatically.
# Standard
api/.venv/bin/opentrons_simulate tmp-protocols/my_protocol.py
# With custom labware (can be specified multiple times)
api/.venv/bin/opentrons_simulate tmp-protocols/my_protocol.py \
-L tmp-custom-labware/The current working directory is always searched for custom labware implicitly.
| Flag | Description |
|---|---|
-l, --log-level | debug, info, warning (default), error, none |
-L, --custom-labware-path | Directory to search for custom labware (repeatable) |
-e, --estimate-duration | Estimate protocol run time (experimental) |
-o, --output | runlog (default) or nothing |
Common errors:
DeckConflictError — labware placement conflictLabwareDefinitionDoesNotExist — invalid labware nameOutOfTipsError — not enough tips for the protocolLiquidHeightUnknownError — .meniscus() called on a well without load_liquid() — see reference-source-map.mdIncompatibleAddressableAreaError — wrong slot for robot typeProduces structured JSON with predicted commands, labware layout, pipettes, modules, and errors. Use for deep inspection or CI validation. Also the only way to verify protocols with CSV RTPs.
# Standard
api/.venv/bin/python -m opentrons.cli analyze tmp-protocols/my_protocol.py \
--check --human-json-output=-
# With custom labware — pass the JSON file(s) as extra positional arguments
api/.venv/bin/python -m opentrons.cli analyze \
tmp-protocols/my_protocol.py \
tmp-custom-labware/my_custom_plate.json \
--check --json-output=-
# With primitive RTP values (int, float, bool, str)
api/.venv/bin/python -m opentrons.cli analyze tmp-protocols/my_protocol.py \
--check --json-output=- \
--rtp-values='{"sample_count": 8, "dry_run": false}'
# With CSV RTP file
api/.venv/bin/python -m opentrons.cli analyze tmp-protocols/my_protocol.py \
--check --json-output=- \
--rtp-files='{"transfer_map": "tmp-csv/transfer_map.csv"}'
# Combined: custom labware + CSV RTP
api/.venv/bin/python -m opentrons.cli analyze \
tmp-protocols/my_protocol.py \
tmp-custom-labware/my_custom_plate.json \
--check --json-output=- \
--rtp-files='{"transfer_map": "tmp-csv/transfer_map.csv"}'| Flag | Description |
|---|---|
--json-output=FILE | Machine-readable JSON (- for stdout) |
--human-json-output=FILE | Pretty-printed JSON (- for stdout) |
--check | Exit non-zero if protocol has errors |
--rtp-values=JSON | Primitive RTP values as JSON string (int, float, bool, str) |
--rtp-files=JSON | CSV RTP file paths as JSON string — keys are variable_names |
--log-output=PATH | Log destination (- stdout, stderr default, or file path) |
--log-level | DEBUG, INFO, WARNING (default), ERROR |
Custom labware in analyze: there is no
-Lflag. Pass each labware JSON as an extra positional file argument. Theanalyzecommand recognizes them by their JSON schema and registers them before running.
{
"createdAt": "...",
"result": "ok",
"robotType": "OT-3",
"config": {"protocolType": "python", "apiVersion": [2, 28]},
"metadata": {"protocolName": "..."},
"commands": [...],
"labware": [...],
"pipettes": [...],
"modules": [...],
"liquids": [...],
"errors": [],
"runTimeParameters": [...]
}Key fields: result ("ok" / "not-ok" / "parameter-value-required"), errors (empty = valid), commands (full ordered command list).
api/.venv/bin/python -m opentrons.cli analyze protocol.py \
--check --json-output=output.json \
--rtp-values='{"sample_count": 48, "dry_run": false}'
# CSV parameter files
api/.venv/bin/python -m opentrons.cli analyze protocol.py \
--check --json-output=output.json \
--rtp-files='{"plate_map": "/path/to/map.csv"}'Before running anything, check whether the protocol defines add_parameters(). If it does, skip simulate entirely and go straight to analyze — then tell the user why.
# 1. Quick check — simulate (only if protocol has NO add_parameters())
api/.venv/bin/opentrons_simulate tmp-protocols/my_protocol.py
# 1b. Quick check — simulate with custom labware (still no RTPs)
api/.venv/bin/opentrons_simulate tmp-protocols/my_protocol.py \
-L tmp-custom-labware/
# 2. Deep check — analyze (required for any protocol with add_parameters())
api/.venv/bin/python -m opentrons.cli analyze \
tmp-protocols/my_protocol.py \
[tmp-custom-labware/my_plate.json] \
--check --human-json-output=- \
[--rtp-values='{"key": value}'] \
[--rtp-files='{"csv_param": "tmp-csv/file.csv"}']Decision guide:
| Scenario | Use | Agent behavior |
|---|---|---|
| No RTPs, no custom labware | simulate | Run simulate directly |
| Custom labware only | simulate with -L | Run simulate directly |
Any RTP (add_parameters() present) | analyze only | Tell the user: "opentrons_simulate cannot run RTP protocols — switching to opentrons analyze", then run analyze |
| Custom labware + any RTP | analyze with extra JSON args | Same — explain, then analyze |
For Flex protocols to be tracked for regression, use analyses-snapshot-testing/ (Flex-only in this repository):
cd analyses-snapshot-testing/
# Naming: {Robot}_{Status}_{Version}_{Pipettes}_{Modules}_{Description}.py
# Example: Flex_S_v2_28_P1000_GRIP_SerialDilution.py
make prep
make snapshot-test-update PROTOCOL_NAMES=Flex_S_v2_28_P1000_GRIP_SerialDilution OVERRIDE_PROTOCOL_NAMES=noneSee the analyses-snapshot-testing skill for full details.
When simulate or analyze surfaces a new error pattern, constraint, or CLI behavior that isn't already documented here, add it to the Troubleshooting section or update the relevant command example. The next person hitting the same issue will thank you.
api/.venv/ doesn't existmake -C api setupAnalysis is stricter. Check the errors array in JSON output for details.
Simulation doesn't verify physical constraints: actual tip presence, liquid volumes, module calibration, or physical deck geometry.
If you accidentally used uv run instead of the venv binaries, it checks/rebuilds the venv each time. Switch to api/.venv/bin/... for instant invocations.
© Opentrons, 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
Just SKILL.md in .cursor/skills/protocol-verification of Opentrons/opentrons.
Open the folder on GitHubat commit adb4970
Protocol Verification 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 |
|---|---|---|---|---|---|---|
| Protocol Verification this skillOpentrons/opentrons | 523 | — | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 5 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Minimizing Ty Ecosystem Changesastral-sh/ruff | 50k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Merge Dependabot PRsonyx-dot-app/onyx | 32k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Summarise Ecosystem Resultsastral-sh/ruff | 50k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Senior Architect Toolkitmaslennikov-ig/claude-code-orchestrator-kit | 260 | 8 repos | ~1.2k | Automated safety check: Notes | Custom licence |
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
astral-sh/ruff
A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…
onyx-dot-app/onyx
Triages and lands a batch of open Dependabot PRs in the Onyx repo, where main is gated exclusively by GitHub's merge queue: approves and enqueues green PRs, closes superseded duplicates, fixes…
astral-sh/ruff
A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive software architecture skill for designing scalable, maintainable systems using ReactJS, NextJS, NodeJS, Express, React Native, Swift, Kotlin…
kedro-org/kedro
Run Kedro's local lint / format / type-check / tests on changed files (uses the project's pre-commit hooks, ruff, mypy, pytest, lint-imports, detect-secrets, Make targets — in the right venv), or…
Opentrons/opentrons
Conventions for the opentrons-ai-client React/TypeScript frontend — project structure, API integration, state management (Jotai), feature flags, types, and testing.
Opentrons/opentrons
Conventions for the opentrons-ai-server FastAPI service — project structure, uv dependency management, settings, testing, Docker, and deployment.
Opentrons/opentrons
Conventions for the analyses snapshot testing framework in analyses-snapshot-testing/.
Opentrons/opentrons
CSS Modules conventions, Stylelint rules, design tokens (spacing, colors, typography, border-radius), and patterns for the Opentrons monorepo.
Opentrons/opentrons
Authoring and styling guidelines for the Opentrons /docs MkDocs project.
Opentrons/opentrons
E2E testing conventions for Protocol Designer and Labware Library using Playwright + pytest in e2e-testing/.
Works with
Categories
Simulate and analyze Opentrons protocols to verify correctness. Protocol Verification is an agent skill from Opentrons/opentrons. Simulate and analyze Opentrons protocols to verify correctness.
Protocol Verification fits situations like: asked to verify; check a protocol; needing to confirm a newly created protocol works.
Run `npx skills add Opentrons/opentrons --skill protocol-verification -a claude-code`. Or copy the skill folder (.cursor/skills/protocol-verification in Opentrons/opentrons) into .claude/skills/protocol-verification in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Opentrons/opentrons --skill protocol-verification -a codex`. Or copy the skill folder (.cursor/skills/protocol-verification in Opentrons/opentrons) into .agents/skills/protocol-verification 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 Opentrons/opentrons --skill protocol-verification -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/protocol-verification, .gemini/skills/protocol-verification, .github/skills/protocol-verification and .opencode/skills/protocol-verification in your project.
Going by SKILL.md and its folder, Protocol Verification needs the command-line tools its instructions call (python, make and uv). Our summary lists: Python 3.
SKILL.md names 1 domain. As links in the text: github.com. 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.
Protocol Verification 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.
About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Protocol Verification: Code Review Checklist (shareAI-lab/learn-claude-code, 78k stars), Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars), Merge Dependabot PRs (onyx-dot-app/onyx, 32k stars) and Summarise Ecosystem Results (astral-sh/ruff, 50k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Opentrons (a GitHub organization) maintains it in Opentrons/opentrons, which has 523 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 8, 2026.
Source: Opentrons/opentrons on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.