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.
Create valid Opentrons Python API protocols for OT-2 and Flex robots.
$ npx skills add Opentrons/opentrons --skill protocol-authoring -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Opentrons/opentrons protocol-authoring --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-authoring .claude/skills/protocol-authoring && 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-authoring" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-authoring into .claude/skills/protocol-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-authoring", 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-authoringType 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-authoring -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Opentrons/opentrons protocol-authoring --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-authoring .agents/skills/protocol-authoring && 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-authoring" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-authoring into .agents/skills/protocol-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-authoring", 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-authoring -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Opentrons/opentrons protocol-authoring --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-authoring .cursor/skills/protocol-authoring && 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-authoring" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-authoring into .cursor/skills/protocol-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-authoring", 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-authoring--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-authoring -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Opentrons/opentrons protocol-authoring --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-authoring .gemini/skills/protocol-authoring && 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-authoring" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-authoring into .gemini/skills/protocol-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-authoring", 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-authoringInstalls 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-authoring -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-authoring .github/skills/protocol-authoring && 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-authoring" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-authoring into .github/skills/protocol-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-authoring", 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-authoring -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-authoring --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-authoring .opencode/skills/protocol-authoring && 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-authoring" agent skill from https://github.com/Opentrons/opentrons/tree/edge/.cursor/skills/protocol-authoring into .opencode/skills/protocol-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "protocol-authoring", 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-authoringCreate valid Opentrons Python API protocols for OT-2 and Flex robots.
Protocol Authoring is an agent skill from Opentrons/opentrons. Create valid Opentrons Python API protocols for OT-2 and Flex robots. Use when creating, writing, editing, or helping with protocol files, liquid handling automation, or Opentrons protocol development. Also use when debugging protocol errors to trace into API source code.
Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files (for example `reference-96channel.md`, `reference-examples-index.md` and `reference-labware-deck.md`).
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.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit a14fef9. 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 python and json).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
labware.opentrons.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 Authoring loads about 4.9k tokens when it runs. Until then it costs about 73 tokens; SKILL.md has 1,242 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 a14fef9, republished under its Apache-2.0 licence (© Opentrons). 1,242 words, ~4,933 tokens.
.claude/skills/protocol-authoring/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.This skill is primarily used by developers, SDETs, and QA who need protocols for testing and development. Follow these defaults unless the user explicitly says otherwise:
protocol.define_liquid() and well.load_liquid() for all source wells.transfer_with_liquid_class, distribute_with_liquid_class, consolidate_with_liquid_class) on Flex with API >= 2.24. Fall back to plain transfer/distribute/consolidate only for OT-2 or when the user explicitly asks.MAX_SUPPORTED_VERSION in api/src/opentrons/protocols/api_support/definitions.py to get the current value.water. Use glycerol_50 or ethanol_80 if the protocol context calls for viscous or volatile liquids.flex_1channel_1000 pipette, opentrons_flex_96_tiprack_1000ul tip rack, nest_96_wellplate_2ml_deep plate, 100 µL transfer volume.from opentrons import protocol_api
metadata = {
"protocolName": "Liquid Class Transfer Demo",
"author": "Opentrons",
"description": "Minimal transfer using liquid classes",
}
requirements = {"robotType": "Flex", "apiLevel": "<MAX_SUPPORTED_VERSION>"}
# ^^^ Replace <MAX_SUPPORTED_VERSION> with the value from
# api/src/opentrons/protocols/api_support/definitions.py
def run(protocol: protocol_api.ProtocolContext) -> None:
trash = protocol.load_trash_bin("A3")
tiprack = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "D2")
source_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "D1")
dest_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "C1")
pipette = protocol.load_instrument(
"flex_1channel_1000", mount="left", tip_racks=[tiprack]
)
# Define and load liquids
sample = protocol.define_liquid(
name="Sample", description="Aqueous sample", display_color="#0088FF"
)
source_plate["A1"].load_liquid(liquid=sample, volume=500)
source_plate["A2"].load_liquid(liquid=sample, volume=500)
# Use liquid class transfer (default: water)
water = protocol.get_liquid_class(name="water")
pipette.transfer_with_liquid_class(
liquid_class=water,
volume=100,
source=[source_plate["A1"], source_plate["A2"]],
dest=[dest_plate["A1"], dest_plate["A2"]],
new_tip="always",
)from opentrons import protocol_api
metadata = {
"protocolName": "OT-2 Transfer Demo",
"author": "Opentrons",
"description": "Minimal transfer for OT-2",
}
requirements = {"robotType": "OT-2", "apiLevel": "<MAX_SUPPORTED_VERSION>"}
def run(protocol: protocol_api.ProtocolContext) -> None:
tiprack = protocol.load_labware("opentrons_96_tiprack_300ul", "1")
source_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "2")
dest_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "3")
pipette = protocol.load_instrument(
"p300_single_gen2", mount="left", tip_racks=[tiprack]
)
sample = protocol.define_liquid(
name="Sample", description="Aqueous sample", display_color="#0088FF"
)
source_plate["A1"].load_liquid(liquid=sample, volume=500)
pipette.transfer(100, source_plate["A1"], dest_plate["A1"])requirements dict — robotType ("Flex" or "OT-2") and apiLeveldef run(protocol): — entry point receiving ProtocolContextdrop_tipmetadata dict is optional but recommended. apiLevel goes in metadata OR requirements, not both.
Look up the current max API version from MAX_SUPPORTED_VERSION in api/src/opentrons/protocols/api_support/definitions.py. Flex requires >= 2.15.
Available liquid classes (Flex, API >= 2.24):
| Name | Type | When to Use |
|---|---|---|
water | Aqueous | Default for most protocols |
glycerol_50 | Viscous | Viscous samples, glycerol solutions |
ethanol_80 | Volatile | Ethanol, volatile solvents |
water = protocol.get_liquid_class(name="water")
# Transfer (1-to-1)
pipette.transfer_with_liquid_class(
liquid_class=water, volume=100,
source=[plate["A1"]], dest=[plate["B1"]],
new_tip="always",
)
# Distribute (1-to-many)
pipette.distribute_with_liquid_class(
liquid_class=water, volume=50,
source=reservoir["A1"], dest=plate.rows()[0][:4],
new_tip="once",
)
# Consolidate (many-to-1)
pipette.consolidate_with_liquid_class(
liquid_class=water, volume=50,
source=plate.rows()[0][:4], dest=reservoir["A1"],
new_tip="once",
)sample = protocol.define_liquid(
name="Sample", description="Aqueous sample", display_color="#0088FF"
)
buffer = protocol.define_liquid(
name="Buffer", description="Wash buffer", display_color="#00CC66"
)
reagent = protocol.define_liquid(
name="Reagent", description="Reaction reagent", display_color="#FF4444"
)
source_plate["A1"].load_liquid(liquid=sample, volume=500)
reservoir["A1"].load_liquid(liquid=buffer, volume=10000)Common display colors: #0088FF (blue/sample), #00CC66 (green/buffer), #FF4444 (red/reagent), #FFB800 (yellow/media), #9933FF (purple/enzyme), #FF6B35 (orange/beads).
| Feature | OT-2 | Flex |
|---|---|---|
| Deck slots | 1–11 (numeric) | A1–D4 (alphanumeric) |
| Trash | Fixed (slot 12) | Must call load_trash_bin() |
| Liquid classes | Not supported | get_liquid_class() (API 2.24+) |
| Gripper | N/A | move_labware(lw, dest, use_gripper=True) |
| 96-channel | N/A | flex_96channel_1000 |
1 2 3 4 (staging)
A [ A1 ] [ A2 ] [ A3 ] [ A4 ]
B [ B1 ] [ B2 ] [ B3 ] [ B4 ]
C [ C1 ] [ C2 ] [ C3 ] [ C4 ]
D [ D1 ] [ D2 ] [ D3 ] [ D4 ] 10 11 12(trash)
7 8 9
4 5 6
1 2 3| Name | Channels | Range |
|---|---|---|
flex_1channel_50 | 1 | 1–50 µL |
flex_1channel_200 | 1 | 1–200 µL |
flex_1channel_1000 | 1 | 5–1000 µL |
flex_8channel_50 | 8 | 1–50 µL |
flex_8channel_200 | 8 | 1–200 µL |
flex_8channel_1000 | 8 | 5–1000 µL |
flex_96channel_200 | 96 | 1–200 µL |
flex_96channel_1000 | 96 | 5–1000 µL |
| Name | Channels | Range |
|---|---|---|
p20_single_gen2 | 1 | 1–20 µL |
p300_single_gen2 | 1 | 20–300 µL |
p1000_single_gen2 | 1 | 100–1000 µL |
p20_multi_gen2 | 8 | 1–20 µL |
p300_multi_gen2 | 8 | 20–300 µL |
Flex tip racks: opentrons_flex_96_tiprack_50ul, opentrons_flex_96_tiprack_200ul, opentrons_flex_96_tiprack_1000ul
OT-2 tip racks: opentrons_96_tiprack_20ul, opentrons_96_tiprack_300ul, opentrons_96_tiprack_1000ul
Plates: nest_96_wellplate_2ml_deep, corning_96_wellplate_360ul_flat, opentrons_96_wellplate_200ul_pcr_full_skirt, nest_96_wellplate_200ul_flat
Reservoirs: nest_12_reservoir_15ml, nest_1_reservoir_195ml, nest_1_reservoir_290ml
Tube racks: opentrons_24_tuberack_nest_1.5ml_snapcap, opentrons_6_tuberack_nest_50ml_conical
temp_mod = protocol.load_module("temperature module gen2", "D1")
tc = protocol.load_module("thermocycler module gen2") # A1+B1 on Flex
hs = protocol.load_module("heaterShakerModuleV1", "C1")
mag_block = protocol.load_module("magneticBlockV1", "C1") # Flex only
mag_mod = protocol.load_module("magnetic module gen2", "1") # OT-2 only
apr = protocol.load_module("absorbanceReaderV1", "B3") # Flex, API 2.21+
stacker = protocol.load_module("flexStackerModuleV1", "D4") # Flex, API 2.25+For detailed module operations, see reference-modules.md.
def add_parameters(parameters: protocol_api.Parameters) -> None:
parameters.add_int(variable_name="sample_count", display_name="Samples",
default=8, minimum=1, maximum=96)
parameters.add_bool(variable_name="dry_run", display_name="Dry Run", default=False)
def run(protocol: protocol_api.ProtocolContext) -> None:
count = protocol.params.sample_countFor complete RTP guide, see reference-rtp.md.
All local dev artifacts live in these gitignored directories:
| Directory | Purpose |
|---|---|
tmp-protocols/ | Protocol .py files |
tmp-custom-labware/ | Custom labware .json definitions |
tmp-csv/ | CSV files for RTP inputs |
Custom labware JSON files go in tmp-custom-labware/. The parameters.loadName in the JSON is the string passed to load_labware().
The easiest starting point is copying an existing definition from shared-data/labware/definitions/2/<name>/<version>.json and modifying the key fields:
{
"namespace": "custom",
"version": 1,
"parameters": {
"loadName": "my_custom_plate"
},
"metadata": {
"displayName": "My Custom Plate"
}
...
}Required changes when deriving from an existing definition:
parameters.loadName → your unique load name (no spaces, underscores OK)namespace → "custom" (must not be "opentrons")version → 1metadata.displayName → human-readable nameSave as tmp-custom-labware/<loadName>.json (file name convention matches loadName).
plate = protocol.load_labware("my_custom_plate", "D1")No special import needed — the CLI handles loading the definition at run time.
CSV files go in tmp-csv/. They are used exclusively via the add_csv_file RTP type (API 2.20+).
def add_parameters(parameters: protocol_api.Parameters) -> None:
parameters.add_csv_file(
variable_name="transfer_map",
display_name="Transfer Map",
description="CSV with columns: source_well, dest_well, volume_ul",
)run()rows = protocol.params.transfer_map.parse_as_csv()
# rows is a list of lists; rows[0] is the header row
for row in rows[1:]:
src, dst, vol = row[0].strip(), row[1].strip(), float(row[2].strip())
pipette.transfer(vol, source[src], dest[dst])tmp-csv/transfer_map.csv)source_well,dest_well,volume_ul
A1,A1,100
A2,A2,150
A3,A3,75Note:
opentrons_simulatecannot accept RTP files. Protocols with CSV RTPs must be verified withopentrons analyze. See theprotocol-verificationskill.
| File | When to use |
|---|---|
| reference-liquid-handling.md | Detailed liquid handling patterns, tip math, transfer anti-patterns |
| reference-modules.md | Module load names, operations, Flex Stacker, APR |
| reference-rtp.md | Runtime parameters — all types, CSV RTPs |
| reference-source-map.md | Source code navigation for debugging |
| reference-labware-deck.md | Common labware load names, deck layout rules (Flex + OT-2), OT-2→Flex migration |
| reference-96channel.md | 96-channel pipette constraints, nozzle configs, tip adapter rules |
| reference-examples-index.md | Index of AI server example docs — what each covers and when to read it |
Located in opentrons-ai-server/api/storage/docs/. Use reference-examples-index.md to decide which file to read. Do not read all of them — they total ~10,000 lines. Read only what the current task needs.
| File | Contents |
|---|---|
full-examples.md | Complete production protocols (PCR, reagent transfer, HS) |
casual_examples.md | Casual NL → protocol mappings, pooling, triplicates |
serial_dilution_examples.md | Serial dilution patterns (single/multi-channel, row/column-wise) |
pcr_protocols_with_csv.md | PCR + CSV RTP well mapping, thermocycler profiles |
transfer_function_notes.md | transfer() deep dive — loops, tip behavior, modules |
out_of_tips_error_219.md | Tip math, multi-channel capacity, index error prevention |
commands-v0.0.1.md | Common command patterns and pitfalls |
standard-loadname-info.md | Full labware catalog (86 items) |
96-channel-pipette.md | Full 96-channel guide (see reference-96channel.md for summary) |
deck_layout.md | Full deck rules (see reference-labware-deck.md for summary) |
OT2ToFlex.md | Full migration guide (see reference-labware-deck.md for summary) |
transfer_with_liquid_class.md | Liquid class transfer differences and custom properties |
flex_stacker_usage.md | Flex Stacker patterns (see reference-modules.md for summary) |
runtime_parameters.md | RTP examples (see reference-rtp.md for summary) |
Update this skill whenever you discover something new. These files are the team's shared knowledge base — stale information hurts everyone.
| Trigger | What to update |
|---|---|
| A new API method, parameter, or behavior is used | Add it to the relevant section in SKILL.md or the appropriate reference-*.md |
| A bug or constraint is found via source inspection | Add it to reference-source-map.md under the relevant debugging section |
MAX_SUPPORTED_VERSION changes | Check api/src/opentrons/protocols/api_support/definitions.py and add any new API-version-gated features to the skill |
| A new labware load name is used | Add it to the Common Labware list |
A new liquid class becomes available in shared-data/liquid-class/definitions/ | Add it to the Liquid Classes table |
| Actual behavior differs from what this skill says | Correct the skill, not just the protocol |
| A new module is supported | Add it to the Modules section and reference-modules.md |
How to update: use the Write or StrReplace tools on the relevant skill file. Keep edits focused — fix only what changed. Don't rewrite sections that are still accurate.
load_trash_bin() on FlexapiLevel in both metadata and requirementstransfer with new_tip="never" without calling pick_up_tip() firstdefine_liquid / load_liquid for source wellstransfer on Flex when transfer_with_liquid_class is availableapr.initialize() without apr.close_lid() first (APR lid must be closed before init)plate["A1"]) to 8-channel *_with_liquid_class — must pass full column or set group_wells=Falsemetadata dict — the parser requires static literals only (no f"...", no {var}, no function calls)transfer() in a for loop over wells — transfer() handles iteration internally; pass lists insteadwells() instead of columns() — 8-channel picks up an entire column at oncepick_up_tip() = 8 tips; a single 96-well rack supports only 12 column operationsadapter="opentrons_flex_96_tiprack_adapter" for full (ALL) tip pickupstart="A1" for 96-channel COLUMN mode — always use start="A12" to avoid deck edge collision© 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
SKILL.md and 7 other files in .cursor/skills/protocol-authoring of Opentrons/opentrons.
Open the folder on GitHubat commit a14fef9
Protocol Authoring 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 Authoring this skillOpentrons/opentrons | 521 | — | ~4.9k | Automated safety check: Pass | Apache-2.0 | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 5 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Summarise Ecosystem Resultsastral-sh/ruff | 50k | 1 repos | ~2.2k | 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 | |
| Code Graph Mermaid Diagramstrailofbits/skills | 7.4k | 1 repos | ~1.7k | Automated safety check: Pass | CC-BY-SA-4.0 |
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 "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…
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…
trailofbits/skills
Generates Mermaid diagrams from Trailmark code graphs, including call graphs, class hierarchies, module dependency maps, complexity heatmaps and attack surface data flows.
Jeffallan/claude-skills
Walks through designing, building and polishing a command-line tool: user workflow and command hierarchy, implementation in commander, click, typer or cobra, completions and cross-platform testing.
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
Create valid Opentrons Python API protocols for OT-2 and Flex robots. Protocol Authoring is an agent skill from Opentrons/opentrons. Create valid Opentrons Python API protocols for OT-2 and Flex robots.
Protocol Authoring fits situations like: helping with protocol files; liquid handling automation; opentrons protocol development; debugging protocol errors to trace into API source code.
Run `npx skills add Opentrons/opentrons --skill protocol-authoring -a claude-code`. Or copy the skill folder (.cursor/skills/protocol-authoring in Opentrons/opentrons) into .claude/skills/protocol-authoring in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Opentrons/opentrons --skill protocol-authoring -a codex`. Or copy the skill folder (.cursor/skills/protocol-authoring in Opentrons/opentrons) into .agents/skills/protocol-authoring 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-authoring -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-authoring, .gemini/skills/protocol-authoring, .github/skills/protocol-authoring and .opencode/skills/protocol-authoring in your project.
SKILL.md names no scripts, command-line tools or credentials: Protocol Authoring is instructions for the agent only. Our summary lists: Python 3.
SKILL.md names 1 domain. As links in the text: labware.opentrons.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 Authoring 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 4.9k tokens (SKILL.md is roughly 20k 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 Authoring: Code Review Checklist (shareAI-lab/learn-claude-code, 78k stars), Summarise Ecosystem Results (astral-sh/ruff, 50k stars), Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars) and Merge Dependabot PRs (onyx-dot-app/onyx, 32k 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 521 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 7, 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.