STEP assembly checks · Burr 0.40.5
CAD interference detection in GitHub Actions
A STEP file can change in a pull request without a useful text diff. Add an interference check on the exported assembly so a clash or an incomplete check appears in the workflow result before you merge.
Commit the exported geometry
The check reads STEP files already in the checkout. If CAD source generates the STEP, run your trusted export step first and select the generated path with files. The default action checks added, modified, and renamed STEP/STP files in a pull request; changing only CAD source does not regenerate exports automatically.
Keep failures and evidence together
Use the workflow below with comment disabled. It needs only repository read access and retains the JSON even when the check fails. Proven interference fails by default, and unresolved pairs fail separately. Use pull_request for untrusted changes; do not execute pull-request CAD under pull_request_target.
Review intended fits explicitly
After inspecting a finding, a reviewed .burr/accepted.yml can record a specific intended pair and its reason. Acceptance does not turn unresolved geometry into a pass. Do not generate and automatically approve a baseline from each pull request; that would hide the change you wanted to catch.
Install the release used here
Run this on macOS (Apple Silicon or Intel) or Linux x64. The installer downloads a prebuilt release and verifies its checksum. Linux ARM64 is not available in this release; x64 requires AVX and FMA. Checks run locally and need no Burr account.
curl -fsSL https://burr.sh/install.sh | BURR_VERSION=0.40.5 sh
export PATH="$HOME/.local/bin:$PATH"
burr --versionRead the installer before running it.
Reproduce two real open-hardware checks
These unmodified STEP files come from the Voron-0 Manta M4P DIN mount (GPL-3.0) and the openAMR cover assembly (CERN-OHL-P-2.0). The URLs pin their source revisions. We ran the released Burr 0.40.5 Linux x64 binary on October 21, 2026.
mkdir -p models
curl -fL 'https://raw.githubusercontent.com/VoronDesign/Voron-0/a53fc87562fd630c846af38d7de850c894dc3d85/CAD/Electronics%20Mounts/Manta_M4P_Din_Mount_2pc.step' -o models/manta-mount.step
burr check --json models/manta-mount.step > manta-mount.json
# Exit 0
curl -fL 'https://raw.githubusercontent.com/openAMRobot/openamr-platform-hw/9703a5f13ffc009db8ff3fa979470179afe3d26b/mechanical/cad/production_files/MMP.01.00.00.000%20Cover%20assembly.STEP' -o models/openamr-cover.step
burr check --json models/openamr-cover.step > openamr-cover.json
# Exit 1: interference AND unresolved pairs; inspect the reportThe second command intentionally returns a failure. Run it separately if your shell stops on nonzero exits.
// Selected fields from the real Burr 0.40.5 reports:
// Voron Manta mount (exit 0)
"outcome": "pass",
"summary": "No assembly interference detected across 1 pairs",
"component_count": 2,
"pair_set_complete": true
// openAMR cover (exit 1)
"outcome": "fail",
"summary": "16 interfering component pairs detected; 25 component pairs unresolved",
"component_count": 53,
"pair_set_complete": falseThe mount has two components and one complete checked pair. The cover has 53 components, with 16 reported interfering pairs and 25 pairs Burr could not check completely. Some possible overlaps fall below coordinate/placement or tessellation resolution. That is not a clean assembly result. Reported overlap also does not establish a design defect: intentional fastener engagement needs review.
Full unedited reports: Manta mount JSON and openAMR cover JSON. Some source part labels in the cover appear with encoding artifacts; the report preserves them.
Model attribution and licenses: VoronDesign/Voron-0, openAMRobot/openamr-platform-hw. These checks do not imply endorsement by either project.
Repeat the check in GitHub Actions
Save this as .github/workflows/step-check.yml in a repository containing models/**/*.step. This workflow uses the same checker version. The action fails on interference and on unresolved checks by default; it uploads the report even after a failure.
name: STEP interference
on: [pull_request]
permissions:
contents: read
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: fraylabs/burr-action@v1
id: burr
with:
version: '0.40.5'
files: 'models/**/*.step'
comment: 'false'
- uses: actions/upload-artifact@v4
if: always() && steps.burr.outputs.report-path != ''
with:
name: burr-report
path: ${{ steps.burr.outputs.report-path }}For this exact example, download the two models above into models/ and commit them. The workflow will fail on the cover, for the reasons shown. Action options and accepted-fit policy explain how to review intended fits without hiding incomplete checks.