name: analyses-snapshot-testing description: Conventions for the analyses snapshot testing framework in analyses-snapshot-testing/. Use when working with protocol analysis snapshots, adding protocols, updating snapshots, or running snapshot tests.
Analyses Snapshot Testing Instructions
Overview
The analyses-snapshot-testing directory validates that protocol analysis output remains consistent across code changes by comparing JSON results against committed snapshots.
- Regression testing: Detect unintended changes in protocol analysis behavior
- Protocol validation: Ensure Flex protocols analyze correctly
- CI/CD: Automated testing in GitHub Actions with matrix-based parallel execution
- Snapshot management: Track expected output and flag deviations
This repository is Flex-only. All protocols must target Flex (or OT-3) robots.
A standalone OT-2 compatibility test (tests/test_ot2_compatibility.py) runs via make ot2-compatibility-test. It uses a fixture protocol in tests/fixtures/ and is not part of chunk generation, protocols.py, or syrupy snapshots. CI runs it in analyses-snapshot-test.yaml (not the lint workflow).
Architecture
Core Components
- Protocol Files (
files/protocols/) — testing protocols organized by source (standard, Protocol Designer exports, Protocol Library imports, generators) - Analysis Engine (
automation/analyze.py) — runs protocol analysis in subprocess, 120-second timeout, JSON output - Snapshot Storage (
tests/__snapshots__/) — committed JSON snapshots managed bysyrupywith custom JSON extension - Test Suite (
tests/) —analyses_snapshot_test.py(main),audit_snapshot_test.py(audit),custom_json_snapshot_extension.py(serialization) - Audit (
automation/audit_snapshots.py) — validates snapshots:Flex_Sprotocols must have zero errors;Flex_Xand other failure-case protocols are expected to have errors - Protocol Registry (
automation/data/) —protocols.py(auto-generated),protocols_with_overrides.py(manual),protocol_registry.py(combined) - CI/CD (
citools/,.github/workflows/) — matrix-based parallel execution via Docker
Protocol Naming Convention
{Robot}_{Status}_{Version}_{Source}_{Pipettes}_{Modules}_{Overrides}\_{Description}
- Robot:
Flex - Status:
S(Success) orX(Failure expected) - Version: API version (e.g.,
v2_19) orPD(Protocol Designer) - Source (optional):
PL_(Protocol Library) orMPL_(Manual Protocol Library) - Pipettes: e.g.,
P1000M_P50M - Modules:
GRIP,HS,MM,MB,TC,TM - Overrides:
Overridesif protocol has parameter overrides - Description: Max 25 characters
Example: Flex_S_v2_19_P1000M_GRIP_HS_TM_MB_KAPALibraryQuant.py
Development Workflow
Adding New Protocols
- Create protocol file in
files/protocols/following naming convention - Run
make prep(auto-updatesautomation/data/protocols.py, displays snapshot command) - Generate snapshots:
make snapshot-test-update PROTOCOL_NAMES=YourProtocolName OVERRIDE_PROTOCOL_NAMES=none - Commit protocol file + snapshot + updated
protocols.py
Adding Override Protocols
- Create generator in
files/protocols/generators/ - Add entry to
automation/data/protocols_with_overrides.py - Generate snapshots:
make snapshot-test-update PROTOCOL_NAMES=none OVERRIDE_PROTOCOL_NAMES=YourOverrideProtocol - Commit generator + snapshot + updated registry
Updating Snapshots
make snapshot-test-update # All
make snapshot-test-update PROTOCOL_NAMES="P1,P2" OVERRIDE_PROTOCOL_NAMES=none # Specific
Running Tests Locally
make snapshot-test # All (reduced verbosity)
make snapshot-test PROTOCOL_NAMES=Flex_S_v2_19_Example OVERRIDE_PROTOCOL_NAMES=none # Specific
uv run python -m pytest -k analyses_snapshot_test -vv --tb=short # Verbose debugging
Code Modification Guidelines
When Modifying Analysis Logic (api/, shared-data/)
- Run snapshot tests to detect changes
- Review diffs carefully
- Update snapshots only if changes are intentional
- Document breaking changes in commit messages
Protocol Registry (automation/data/protocols.py)
- DO NOT manually edit — auto-generated by
make prep - Regenerate after adding/removing protocols
Snapshot Extension (tests/custom_json_snapshot_extension.py)
- Normalizes timestamps, IDs, file paths for stable comparisons
- Add new normalization rules to
replacement_patterns - Add new ID-like fields to
id_keys_to_replace
Environment Setup
Prerequisites: Python 3.12, uv, Node.js/pnpm (for prettier)
cd analyses-snapshot-testing
make setup # Creates uv venv and installs dependencies
The setup script (bootstrap_uv_env.py) installs api and shared-data as editable packages so analysis uses local code. It creates a Python 3.12 venv by default (UV_PY=3.12).
Common Commands
# Setup
make setup # Initial environment setup
make teardown # Remove virtual environment
# Testing
make snapshot-test # Run all snapshot tests
make snapshot-test-update # Update all snapshots
make snapshot-audit-test # Validate snapshot audit metadata
make ot2-compatibility-test # Standalone OT-2 rejection test (not in snapshot battery)
make snapshot-validation # snapshot-audit-test + ot2-compatibility-test
# Protocol Management
make prep # Regenerate protocol registry
make generate-protocols # Generate override protocols
# Formatting
make format # Format Python + Markdown
make ruff # Format and lint Python
# CI Simulation
make gen-chunks # Generate protocol chunks
make analyze-chunk CHUNK=chunk_0.json # Analyze specific chunk
CI/CD Integration
Workflow (analyses-snapshot-test.yaml) triggers on:
- PRs affecting
api/,shared-data/, or this directory - Scheduled daily at 7:26 AM UTC
- Manual dispatch
PR label gen-analyses-snapshot-pr auto-opens a PR with updated snapshots on failure.
Troubleshooting
- Snapshot mismatch: Review diff, update if intentional (
make snapshot-test-update PROTOCOL_NAMES=...), fix code if not - Protocol not found: Check registry, run
make prep, verify file exists and follows naming convention - Analysis timeout (120s): Simplify protocol or increase timeout in
automation/analyze.py - Environment issues: Run
make setup, ensureuvis installed and Python 3.12 is available