Generated banner for Lab Hardware Cad
Generated logo for Lab Hardware Cad

Lab Hardware Cad

K-DenseCommunityCreated by K-Dense Inc.

  • Skill
  • Workflow
  • Science and research
  • MIT
  • Low risk
  • Has scripts

From the author

Designs custom laboratory hardware as parametric build123d models and exports fabrication artifacts as STEP, STL, and DXF files - microfluidic chips and molds, optomechanical mounts and breadboard adapters, cuvette and microplate holders, tube racks, animal-behavior rigs, and 3D-printed instrument fixtures. Use when a research task needs a physical part that must mate with standardized labware, an optical table, a cage system, or a printer, CNC, or laser process.
— the description by K-Dense Inc.

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured workflow for designing custom laboratory hardware using parametric Python code with the build123d library. It prioritizes the accurate mating of physical parts with standardized lab equipment, such as optical tables, cage systems, and microplate holders. The workflow mandates a rigorous process: defining interface dimensions from trusted standards, authoring parametric models, running automated geometric checks, and performing visual verification via orthographic snapshots. It is designed to prevent common failure modes in lab hardware fabrication, such as incorrect bolt patterns or incompatible tolerances, by ensuring that every design is numerically and visually validated before production.

What it does

  • Designs custom lab hardware as parametric Python models.
  • Exports fabrication-ready STEP, STL, and DXF files.
  • Verifies interface dimensions against a database of laboratory standards.
  • Performs automated go/no-go gauge checks on the generated solid geometry.
  • Generates orthographic snapshots for mandatory visual inspection.
  • Maintains a provenance manifest for every generated artifact.

When to use it

  • When designing custom mounts, adapters, holders, or fixtures for laboratory equipment.
  • When a part must mate with standardized hardware like optical breadboards or microplates.
  • When you need to ensure a part meets specific tolerance and clearance requirements.
  • When you need to verify that a design will fit its intended environment before fabrication.

Advantages

  • Reduces costly fabrication errors through automated interface checking.
  • Ensures design reproducibility by using parametric source code.
  • Provides clear documentation of interface sources and fabrication limits.
  • Integrates visual and numerical validation into the design loop.

Usage examples

“Design a custom holder for a 96-well microplate that mounts onto a standard metric optical breadboard.”
The agent will define the microplate footprint using the slas-microplate-footprint standard, calculate the necessary clearances for the pocket, add mounting holes for the 25mm metric breadboard grid, and generate the STEP file along with a validation report.
“Check if my existing STEP file for a lens tube mount will fit a 30mm cage system.”
The agent will load the STEP file, perform a clearance check against the cage-system-30mm standard, and report whether the bores and dimensions align with the required specifications.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/k-dense-ai/lab-hardware-cad/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip lab-hardware-cad.zip -d .agents/skills

Documentation by K-Dense Inc.

Lab Hardware CAD

Design physical research hardware as parametric Python source, export STEP as the authoritative artifact, and verify the result both numerically and visually before anything is fabricated.

The hard part of lab hardware is almost never the geometry. It is that the part must mate with equipment whose dimensions are fixed by a published standard or a vendor drawing. A holder that is 0.5 mm too wide does not fit the plate reader; a channel with the wrong aspect ratio collapses during bonding; a mount whose bolt pattern is 25.4 mm instead of 25.0 mm will not reach the optical table. This skill exists to keep those numbers correct and checked.

When to use

Use for any request to design, model, or fabricate a physical part for a lab: chip, mold, mount, adapter, holder, rack, bracket, enclosure, jig, fixture, arena, or maze. Also use to inspect or modify an existing STEP file.

Do not use for finite-element analysis, computational fluid dynamics, molecular structure, or scientific plotting. Those are different skills.

Setup

uv venv --python 3.12 .venv-labcad
uv pip install --python .venv-labcad/bin/python "build123d==0.13.0" "matplotlib>=3.8"

build123d 0.13.0 requires Python >=3.11,<3.15 and pulls in the OpenCascade kernel through cadquery-ocp-novtk. The wheel is large; install once per project and reuse it.

All bundled scripts take --help. check.py standards runs without build123d installed.

Model files are executed, not parsed. gen.py, check.py, and snapshot.py import a *_model.py and call its build(), which runs arbitrary Python in the current environment. That is inherent to parametric CAD — the source is the design. Only run model files authored in this session or supplied by the user from a trusted location. If a model came from the internet, a shared drive, or an untrusted colleague, read it before running it and say that you did.

Required workflow

Follow these steps in order. Steps 5 and 6 are not optional, and step 6 is not waived by step 5 passing.

1. Route to a device family

Read the request, classify it, and load exactly one family reference. Do not load all four — they are long, and mixing conventions between families is a common source of error.

If the part isLoad
A chip, mold, channel network, flow cell, gasket, or anything with fluid portsreferences/microfluidics.md
A mount, post, breadboard adapter, cage-system part, filter or sample holder in a beam pathreferences/optomechanics.md
An adapter, insert, rack, or holder for plates, cuvettes, tubes, slides, or dishesreferences/labware-adapters.md
An arena, maze, head-fixation part, spout, tether, or extrusion-mounted enclosure for animal workreferences/behavior-rigs.md

If the part genuinely spans two families — a microfluidic chip that bolts to an optical table — load the family that owns the critical interface, then read only the interface section of the second. State in your response which family you routed to.

2. Establish the interface dimensions before any geometry

Every part has at least one mating interface. Before writing code, write down for each interface:

  • the source of the dimension: a published standard, a vendor drawing, or a user measurement;

  • the nominal value and tolerance;

  • the clearance or interference you intend, and why.

Look the number up in assets/standards.json or the family reference. Never write an interface dimension from memory. If the number is not in the standards file or the reference, ask the user for the vendor drawing or the measurement rather than guessing. A guessed interface dimension is the single most expensive failure mode in this skill.

A pocket receiving an external component is sized against that component's maximum material envelope — nominal plus its plus-tolerance — and only then given clearance. A shaft entering a hole instead uses the hole's minimum diameter; envelope does not model that case.

python scripts/check.py standards --list
python scripts/check.py standards --show slas-microplate-footprint

The bundled standard IDs (exact strings; do not guess variants): slas-microplate-footprint, slas-microplate-height, slas-microplate-flange, slas-well-positions-96, slas-well-positions-384, slas-well-positions-1536, cuvette-standard-10mm, optical-breadboard-metric, optical-breadboard-imperial, cage-system-30mm, sm1-lens-tube-thread.

If the part mates with nothing in this list, that is common and fine: declare no interfaces, and name every interface dimension with its source (user spec, vendor drawing, measurement) as unchecked in the report. Never declare against an unrelated standard to fill the gap — a fabricated declaration is worse than an honest "nobody checked this".

3. Choose the process before choosing the geometry

Read references/fabrication-limits.md. Process determines minimum wall, minimum feature, achievable tolerance, and whether the part survives autoclaving or contact with your solvent. Do not assume FDM can hold ±0.05 mm without calibration. Cell-contact SLA parts need a validated material and post-processing workflow plus assay-specific testing. Record the process and material in the model docstring.

4. Author a parametric model

Write <part>_model.py. The source is the authoritative artifact — never hand-edit an exported STEP file, and never regenerate from a mesh.

Requirements:

  • Every dimension that a user might change is a module-level named constant with units in the name: bore_d_mm, wall_t_mm, post_h_mm. No bare numbers in the body except 0, 1, and 2.

  • Expose build() -> Part. gen.py calls it.

  • Group parameters into an INTERFACE block (dimensions fixed by a standard, annotated with the standard ID) and a DESIGN block (dimensions you are free to choose).

  • Derive every computed dimension inside a function, never at module level, so --param overrides actually reach it.

  • Declare an interfaces() function returning the dimensions the part must fit, each with its standard ID and intent. This is what makes the interface machine-checkable in step 5. intent is "envelope" when the feature must accept any conforming part (a pocket, bore, or slot — checked one-sided at maximum material condition plus your clearance) and "match" when comparing against the nominal band, expanded by any explicit allowance. This is not a conformance certificate. clearance is the total intended clearance in mm and must be non-negative. Declare only dimensions that constrain this part's mating features — a property of the mating equipment (a table's edge border, a typical plate thickness) is not an interface of yours. If no bundled standard applies, return [].

  • Declare a checks() function of go/no-go gauges measured from the built solid: a clear region for everything that must pass through or fit in (screw shafts, beam corridors, the mating part at maximum material condition dropping into its pocket), a material region with a requirement-sized minimum volume for everything that must remain (a ridge, a ledge, a screw seat), and a bbox_* bound for every size limit the user stated. Map every geometric requirement in the request to one entry; these catch the errors that is_valid, the bounding box, and declared numbers cannot see. gen.py runs them on every generation and fails the build when one fails. Schema and worked examples: references/build123d-patterns.md.

  • Put the process, material, and every interface source in the module docstring.

"""SLAS base-footprint fit coupon; confirm upper plate body/draft before a full holder.

Process: FDM, PETG, 0.2 mm layer.  Tolerance budget +/-0.3 mm.
Interfaces:
  - Plate pocket: ANSI/SLAS 1-2004 (R2012) footprint 127.76 x 85.48 mm, +/-0.50 overall.
  - Upper plate body, lid and stage mounting: not represented in this coupon.
"""
from build123d import *

# --- INTERFACE (fixed by standard; do not tune) ---
plate_l_mm = 127.76   # ANSI/SLAS 1-2004 nominal
plate_w_mm = 85.48    # ANSI/SLAS 1-2004 nominal
plate_tol_mm = 0.50   # ANSI/SLAS 1-2004; the pocket is sized to nominal + this
# --- DESIGN (free) ---
pocket_clearance_mm = 0.40   # per-side; FDM, see fabrication-limits.md
wall_t_mm = 3.0
floor_t_mm = 2.5
body_h_mm = 12.0


def pocket_mm() -> tuple[float, float]:
    """Pocket at the plate's maximum material condition plus clearance per side.

    A pocket sized from nominal can jam on conforming plates.
    """
    growth = plate_tol_mm + 2 * pocket_clearance_mm
    return plate_l_mm + growth, plate_w_mm + growth


def interfaces() -> list[dict]:
    """What this part must fit. `check.py interfaces` verifies every entry."""
    pocket_l, pocket_w = pocket_mm()
    return [
        {"feature": "plate pocket length", "standard": "slas-microplate-footprint",
         "dimension": "footprint_length", "value": pocket_l,
         "intent": "envelope", "clearance": 2 * pocket_clearance_mm},
        {"feature": "plate pocket width", "standard": "slas-microplate-footprint",
         "dimension": "footprint_width", "value": pocket_w,
         "intent": "envelope", "clearance": 2 * pocket_clearance_mm},
    ]


def checks() -> list[dict]:
    """Gauges measured from the built solid. Sized from the REQUIREMENT's numbers
    (plate MMC, the user's height limit), not from the pocket parameters, so a
    wrong parameter cannot shrink the gauge to match the wrong geometry."""
    depth = body_h_mm - floor_t_mm
    return [
        {"feature": "plate at MMC drops into the pocket",
         "clear": {"box": (plate_l_mm + plate_tol_mm, plate_w_mm + plate_tol_mm, depth),
                   "at": [(0.0, 0.0, floor_t_mm + depth / 2)]}},
        {"feature": "under 15 mm for the stage", "bbox_z": {"max": 15.0}},
    ]


def build() -> Part:
    pocket_l, pocket_w = pocket_mm()
    with BuildPart() as carrier:
        Box(pocket_l + 2 * wall_t_mm, pocket_w + 2 * wall_t_mm, body_h_mm,
            align=(Align.CENTER, Align.CENTER, Align.MIN))
        with Locations((0, 0, floor_t_mm)):
            Box(pocket_l, pocket_w, body_h_mm, mode=Mode.SUBTRACT,
                align=(Align.CENTER, Align.CENTER, Align.MIN))
    return carrier.part

See references/build123d-patterns.md for the builder-vs-algebra choice, the interfaces() contract, sketching, selectors, fillets, and threaded-insert bores.

5. Generate and run the checks
python scripts/gen.py carrier_model.py --outdir out/
python scripts/check.py facts out/carrier.step
python scripts/check.py interfaces out/carrier.manifest.json
python scripts/check.py geometry out/carrier.step --model carrier_model.py

gen.py also evaluates the model's checks() gauges against the solid it just built, prints each PASS/FAIL, records them in the manifest, and exits non-zero on a failure — so a part that violates its own declared geometry never silently becomes an artifact. check.py geometry re-runs the same gauges against the exported STEP. Repeat any gen.py --param overrides with check.py geometry --param; otherwise the gauges use the source defaults.

out/ is a scratch convention, not a requirement. When the user asked for deliverables in a specific place, generate there (--outdir .) or copy the STEP, manifest, and DXF to it before finishing — a deliverable that exists only inside out/ has not been delivered.

gen.py writes carrier.step (authoritative), carrier.stl (mesh preview and printing), and carrier.manifest.json recording the source hash, resolved parameters, declared interfaces, library versions, and measured bounding box, volume, and validity. The manifest is the provenance record — keep it with the artifact.

check.py facts reports is_valid, bounding box, volume, surface area, centre of mass, and solid count. A part that reports is_valid: false is broken geometry; fix the source before going further.

check.py interfaces evaluates every entry the model declared against the standards database and exits non-zero on failure. Be clear about what it does and does not verify: it checks the declared numbers — catching a transcribed dimension, the wrong standard, and nominal-instead-of-MMC sizing — but it never measures the built geometry, and a value computed from the same constants it is checked against passes with zero headroom by construction. Do not cite it as evidence the geometry is right; facts and the snapshot are the geometry checks. An empty declaration list passes: a part that mates with nothing in the bundled database has nothing to declare, and its interface dimensions are instead named as unchecked in the report. A manifest must contain an explicit interfaces list; a missing field or null is a malformed manifest, not evidence that interfaces were reviewed and none applied.

Use interfaces rather than check.py fit for anything internal — a pocket, bore, or slot does not appear in the part's outer bounding box, which is what fit measures. Reach for fit only to check one number by hand (--value footprint_length=129.06), or when the part's own outline is the interface, such as a gasket cut to a plate footprint.

For assemblies, check that parts do not interfere:

python scripts/check.py clearance out/carrier.step out/lid.step --min 0.3
6. Snapshot and actually look at it
python scripts/snapshot.py out/carrier.step --out out/carrier.png

Then read the PNG. This step is mandatory after every generation and every modification. Deterministic checks passing is not a reason to skip it: is_valid and a correct bounding box are both fully consistent with a pocket cut on the wrong face, a boss placed outside the body, or a fillet that ate a feature. Those errors are obvious in a picture and invisible in the numbers.

Know the render's limits too. A feature much smaller than the frame — a 0.3 mm mold ridge on a 40 mm part, a counterbore step on a plate — may not be decidable from the views at all. Do not report seeing something the image cannot resolve; that is worse than not looking. For such features the skill has instruments: check.py bores prints every cylindrical face (diameter, axis, position, span, sweep) so you can reconcile the drilling against the model's intent, and check.py probe answers a one-off "is this region clear / is material present here" without editing the model. Cite the measured numbers; report from the picture only what the picture actually shows.

The six views are true orthographic projections, and the outlines are the model's real edges drawn without hidden-line removal. So a circle visible "through" material is a bore on the far side, not a window — the part is not transparent. Read it that way rather than reporting a hole that is not there.

State in your response what you saw in the snapshot, not merely that you generated one.

7. Repair through the source

If any check fails, edit the parameters or the model code, rerun gen.py, and rerun both step 5 and step 6. Never patch the STEP.

8. Report before fabrication

Work through references/validation.md and give the user: the process and material, every interface dimension with its source and tolerance, the clearances chosen, what the snapshot showed, and any check that did not pass.

Flag explicitly every interface the automatic check could not cover — a vendor drawing, a user measurement, a standard not in the bundled database. check.py interfaces reports only what the model declared against a known standard, so silence there is not confirmation; a dimension nobody could check has to be named as such.

Units

build123d is unitless internally. Geometry uses millimetres and degrees; mesh angular_tolerance uses radians (0.1 rad ≈ 5.7°). export_step is called with Unit.MM. Imperial hardware appears throughout optomechanics (1/4-20 screws, 1 inch grids, SM1 threads); convert to millimetres in a single named constant at the point of definition and never mix systems inside an expression. 1 inch is exactly 25.4 mm, and a 25 mm metric optical grid is not interchangeable with a 1 inch imperial grid — the error accumulates to 1.6 mm over four pitches (five hole centres).

Tolerances and fits

A nominal dimension is not a fit. Every mating dimension needs a deliberate clearance chosen from the process tolerance in references/fabrication-limits.md. Common defaults, per side:

FitFDMSLACNC
Free-sliding (plate in a pocket)0.40 mm0.20 mm0.10 mm
Located but removable0.25 mm0.10 mm0.05 mm
Press / interferenceCoupon-specificCoupon-specificToleranced fit design

Budget the receiving part's worst-case undersize separately: minimum actual pocket size must exceed the mating part's maximum size plus the required functional gap. These are starting points for a first article, not guarantees. Say so when you report them, and recommend printing a test coupon of the critical interface before committing to a full part.

Scientific caveats

  • Material compatibility governs. A geometrically perfect part in the wrong polymer fails in service: autoclave cycles distort PLA, many solvents craze acrylic, and uncured SLA resin is cytotoxic. Check references/fabrication-limits.md before recommending a material for anything contacting cells, tissue, solvents, or heat.

  • Optical parts have non-geometric requirements. Autofluorescence, surface roughness, and stray-light scatter are not visible in a STEP file. Black resin is not automatically low-scatter.

  • Vendor labware varies. The SLAS standards fix the plate footprint but not well geometry, skirt profile, or lid fit, and consumable tubes differ between suppliers. Design to the standard where one exists; otherwise require a measurement.

  • A passing bounding box is not a passing part. fit checks the dimensions it is given. It cannot see a missing feature, and it does not replace the snapshot.

References

FileContents
references/microfluidics.mdChannel cross-sections and aspect ratios, mold vs chip polarity, minimum features by process, port and tubing interfaces, bonding lands, dead volume
references/optomechanics.mdBreadboard grids and screw clearances, post and pedestal heights, 30 mm cage geometry, SM lens-tube threads, beam height
references/labware-adapters.mdANSI/SLAS 1-4 microplate dimensions, cuvettes, tubes, slides, dishes, deck and stage constraints
references/behavior-rigs.mdArena and maze geometry, head-fixation interfaces, spouts and ports, T-slot extrusion, cleaning and durability
references/fabrication-limits.mdProcess tolerances, minimum walls and features, clearance and thread inserts, materials, autoclave and solvent and biocompatibility
references/validation.mdPre-fabrication checklist and the failure modes each item catches
references/build123d-patterns.mdbuild123d 0.13.0 API cookbook: builder vs algebra, sketches, selectors, joints, exports

Scripts

CommandPurpose
gen.py <model.py> --outdir DIRRun build(), export STEP and STL, write the provenance manifest
gen.py <model.py> --dxf [--dxf-z MM]Also slice a 2D DXF profile for laser cutting (default plane: mid-height)
check.py facts <step>Validity, bounding box, volume, area, centre of mass, solid count
check.py interfaces <manifest|model.py>Check every declared interface number against its standard; non-zero exit on failure
check.py geometry <model.py|step --model M>Evaluate the model's checks() gauges against the built solid — measured, not declared
check.py probe <step> --cyl D|--box X,Y,Z --at ...One ad-hoc gauge: is this region clear of material, or filled with it
check.py bores <step>Census of every cylindrical face: diameter, axis, position, span, sweep
check.py fit --standard ID --value DIM=MMCheck one dimension by hand, or a part whose outer envelope is the interface
check.py clearance <a> <b> --min MMMinimum distance between two solids; detects interference
check.py standards [--list|--show ID]Browse the bundled standards data (standard library only)
snapshot.py <step> --out PNGSix-view orthographic and isometric render for visual review

gen.py accepts --json; place check.py --json before its subcommand. snapshot.py writes a PNG and has no --json option. Progress goes to stderr. check.py standards, and check.py interfaces on a manifest, run without build123d installed.

Citing Scientific Agent Skills

This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a manuscript, report, presentation, or code release, add the paper to the references or software section and tell the user you did so:

Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065

Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the latest arXiv version, so never append a version suffix such as v1. When network access is available, fetch https://arxiv.org/abs/2609.00065 (or http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take the author list, year, and version from that record. If the record lists a journal reference or publisher DOI, cite the published version instead.

Files

assets/standards.json

{
  "schema_version": "1.0",
  "units": "mm",
  "note": "Dimensions in mm unless a dimension carries unit. Verified means the stated nominal source was checked, not that a fabrication tolerance or material fit is guaranteed. Zero tolerance on basic/vendor nominal data is not a physical zero-tolerance specification. Unverified entries require a vendor drawing or measurement.",
  "last_reviewed": "2026-10-01",
  "standards": {
    "slas-microplate-footprint": {
      "title": "Microplate footprint (base outline)",
      "authority": "ANSI/SLAS",
      "document": "ANSI/SLAS 1-2004 (R2012) Footprint Dimensions",
      "url": "https://www.slas.org/SLAS/assets/File/public/standards/ANSI_SLAS_1-2004_FootprintDimensions.pdf",
      "verified": true,
      "dimensions": {
        "footprint_length": {"nominal": 127.76, "tol_plus": 0.5, "tol_minus": 0.5, "note": "Section 4.1.1.2: overall base footprint at any point along the side. Use this band for a continuous receiving pocket. Does not specify the plate wall, lid, or draft above the base."},
        "footprint_width": {"nominal": 85.48, "tol_plus": 0.5, "tol_minus": 0.5, "note": "Section 4.1.1.2: overall base footprint at any point along the side. Use this band for a continuous receiving pocket. Does not specify the plate wall, lid, or draft above the base."},
        "corner_radius": {"nominal": 3.18, "tol_plus": 1.6, "tol_minus": 1.6, "note": "Outside radius of the four bottom-flange corners (convex). A receiving pocket's internal fillet must be no LARGER than the minimum (1.58) or it bulges into the plate corner and binds; a sharp pocket corner or a corner-relief cut always clears. Do not size the pocket fillet to the maximum radius."},
        "footprint_length_at_corners": {"nominal": 127.76, "tol_plus": 0.25, "tol_minus": 0.25, "note": "Section 4.1.1.1: only within 12.7 mm of outside corners; do not use for a continuous pocket."},
        "footprint_width_at_corners": {"nominal": 85.48, "tol_plus": 0.25, "tol_minus": 0.25, "note": "Section 4.1.1.1: only within 12.7 mm of outside corners; do not use for a continuous pocket."}
      },
      "fit_checks": [
        {"measure": "bbox_x", "dimension": "footprint_length"},
        {"measure": "bbox_y", "dimension": "footprint_width"}
      ],
      "design_note": "Continuous base pocket: size from 128.26 x 85.98 mm overall maximum envelope, then add process allowance and functional clearance. Near-corner locating pads may use the separate _at_corners dimensions. Upper plate body, draft and lid require the vendor drawing."
    },
    "slas-microplate-height": {
      "title": "Microplate height",
      "authority": "ANSI/SLAS",
      "document": "ANSI/SLAS 2-2004 (R2012) Height Dimensions",
      "url": "https://www.slas.org/SLAS/assets/File/public/standards/ANSI_SLAS_2-2004_HeightDimensions.pdf",
      "verified": true,
      "dimensions": {
        "plate_height": {"nominal": 14.35, "tol_plus": 0.25, "tol_minus": 0.25, "note": "Sections 4.1.1.1 and 4.2.1.1: resting plane to perimeter wells, not the overall bounding box. Deep-well and lidded plates require vendor dimensions."},
        "overall_plate_height": {"nominal": 14.35, "tol_plus": 0.76, "tol_minus": 0.76, "note": "Sections 4.1.1.2 and 4.2.1.2: resting plane to maximum protrusion of the plate; maximum 15.11 mm."}
      },
      "fit_checks": [
        {"measure": "bbox_z", "dimension": "overall_plate_height"}
      ]
    },
    "slas-microplate-flange": {
      "title": "Microplate bottom outside flange height",
      "authority": "ANSI/SLAS",
      "document": "ANSI/SLAS 3-2004 (R2012) Bottom Outside Flange Dimensions",
      "url": "https://www.slas.org/SLAS/assets/File/public/standards/ANSI_SLAS_3-2004_BottomOutsideFlangeDimensions.pdf",
      "verified": true,
      "dimensions": {
        "flange_height_short": {"nominal": 2.41, "tol_plus": 0.38, "tol_minus": 0.38},
        "flange_height_medium": {"nominal": 6.1, "tol_plus": 0.38, "tol_minus": 0.38},
        "flange_height_tall": {"nominal": 7.62, "tol_plus": 0.38, "tol_minus": 0.38}
      },
      "fit_checks": [],
      "design_note": "Sections 4.1-4.3 define three uniform heights. Sections 4.4 and 4.5 also permit interrupted short flanges and dual heights. Obtain the actual flange class/profile before designing a gripper."
    },
    "slas-well-positions-96": {
      "title": "96-well plate well positions",
      "authority": "ANSI/SLAS",
      "document": "ANSI/SLAS 4-2004 (R2012) Well Positions",
      "url": "https://www.slas.org/SLAS/assets/File/public/standards/ANSI_SLAS_4-2004_WellPositions.pdf",
      "verified": true,
      "dimensions": {
        "well_pitch": {"nominal": 9.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Centre-to-centre in both x and y."},
        "a1_offset_x": {"nominal": 14.38, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Left outside edge to the centre of column 1."},
        "a1_offset_y": {"nominal": 11.24, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Top outside edge to the centre of row A."},
        "well_position_tolerance": {"nominal": 0.7, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Each well centre lies within a 0.70 mm diameter of nominal. This is a positional tolerance zone, not a +/- band."}
      },
      "fit_checks": [],
      "design_note": "Grid layout: x = a1_offset_x + 9.0 * column_index, y = a1_offset_y + 9.0 * row_index, measured from the plate outline corner."
    },
    "slas-well-positions-384": {
      "title": "384-well plate well positions",
      "authority": "ANSI/SLAS",
      "document": "ANSI/SLAS 4-2004 (R2012) Well Positions",
      "url": "https://www.slas.org/SLAS/assets/File/public/standards/ANSI_SLAS_4-2004_WellPositions.pdf",
      "verified": true,
      "dimensions": {
        "well_pitch": {"nominal": 4.5, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Centre-to-centre in both x and y."},
        "a1_offset_x": {"nominal": 12.13, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Verified directly in ANSI/SLAS 4-2004, section 4.2. Datum is the near-corner edge zones, not a bowed side midpoint."},
        "a1_offset_y": {"nominal": 8.99, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Verified directly in ANSI/SLAS 4-2004, section 4.2. Datum is the near-corner edge zones, not a bowed side midpoint."},
        "well_position_tolerance": {"nominal": 0.7, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Diameter of true-position zone at RFS; not a bilateral +/- band."}
      },
      "fit_checks": [],
      "design_note": "Nominal coordinates are basic dimensions; apply the radial half of well_position_tolerance plus registration and manufacturing error for a clearance gauge."
    },
    "slas-well-positions-1536": {
      "title": "1536-well plate well positions",
      "authority": "ANSI/SLAS",
      "document": "ANSI/SLAS 4-2004 (R2012) Well Positions",
      "url": "https://www.slas.org/SLAS/assets/File/public/standards/ANSI_SLAS_4-2004_WellPositions.pdf",
      "verified": true,
      "dimensions": {
        "well_pitch": {"nominal": 2.25, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Centre-to-centre in both x and y."},
        "a1_offset_x": {"nominal": 11.005, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Verified directly in ANSI/SLAS 4-2004, section 4.3. Datum is the near-corner edge zones, not a bowed side midpoint."},
        "a1_offset_y": {"nominal": 7.865, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Verified directly in ANSI/SLAS 4-2004, section 4.3. Datum is the near-corner edge zones, not a bowed side midpoint."},
        "well_position_tolerance": {"nominal": 0.5, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Diameter of true-position zone at RFS; not a bilateral +/- band."}
      },
      "fit_checks": [],
      "design_note": "Nominal coordinates are basic dimensions; apply the radial half of well_position_tolerance plus registration and manufacturing error for a clearance gauge."
    },
    "cuvette-standard-10mm": {
      "title": "Standard 10 mm path-length spectrophotometer cuvette",
      "authority": "De facto industry convention",
      "document": "Hellma 2025 cuvette catalogue: common 10 mm path-length rectangular formats; not a universal dimensional standard.",
      "url": "https://www.hellma.com/fileadmin/fos/Website/Broschueren_Flyer_Handhabung/Hellma_Analytics/Englisch/Hellma_Kuevettenkatalog_EN_2025_gross.pdf",
      "verified": false,
      "dimensions": {
        "external_width": {"nominal": 12.5, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance: illustrative nominal only; require the selected catalogue number drawing or measurement. Zero here does not mean zero manufacturing tolerance."},
        "external_depth": {"nominal": 12.5, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance: illustrative nominal only; require the selected catalogue number drawing or measurement. Zero here does not mean zero manufacturing tolerance."},
        "external_height": {"nominal": 45.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance: illustrative nominal only; require the selected catalogue number drawing or measurement. Zero here does not mean zero manufacturing tolerance."},
        "path_length": {"nominal": 10.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance: illustrative nominal only; require the selected catalogue number drawing or measurement. Zero here does not mean zero manufacturing tolerance."},
        "wall_thickness": {"nominal": 1.25, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED illustrative optical-wall thickness, not all four walls. Internal width and base thickness differ by cuvette model."}
      },
      "fit_checks": [
        {"measure": "bbox_x", "dimension": "external_width"},
        {"measure": "bbox_y", "dimension": "external_depth"}
      ],
      "design_note": "Nominal 45 x 12.5 x 12.5 mm rectangular formats exist, but no common tolerance is asserted. Fit output remains unverified; use the actual cuvette envelope including cap and optical-window height."
    },
    "optical-breadboard-metric": {
      "title": "Metric optical breadboard hole grid",
      "authority": "De facto industry convention",
      "document": "Thorlabs Imperial and Metric Threading: grid and thread conventions; hole and counterbore numbers below are planning examples.",
      "url": "https://www.thorlabs.com/imperial-and-metric-threading",
      "verified": true,
      "dimensions": {
        "grid_pitch": {"nominal": 25.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Metric grid. NOT interchangeable with the 25.4 mm imperial grid."},
        "thread": {"nominal": 6.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "M6 x 1.0 tapped holes."},
        "clearance_hole_close": {"nominal": 6.4, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. Close-fit clearance for an M6 cap screw.", "verified": false},
        "clearance_hole_normal": {"nominal": 6.6, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. Normal-fit clearance for M6. Prefer this on printed parts.", "verified": false},
        "counterbore_dia": {"nominal": 11.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. For an M6 socket head cap screw head (nominal head dia 10 mm).", "verified": false},
        "screw_head_height": {"nominal": 6.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. M6 socket head cap screw head height (ISO 4762). A counterbore shallower than this leaves the head proud, not flush.", "verified": false},
        "border": {"nominal": 12.5, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. Typical edge-to-first-hole distance. A property of the TABLE, not of your part: your plate's edge margin is a free design choice, so do not declare this as an interface.", "verified": false}
      },
      "fit_checks": [],
      "design_note": "Slot rather than hole one of any pair of mounting features to absorb grid and print tolerance."
    },
    "optical-breadboard-imperial": {
      "title": "Imperial optical breadboard hole grid",
      "authority": "De facto industry convention",
      "document": "Thorlabs Imperial and Metric Threading: grid and thread conventions; hole and counterbore numbers below are planning examples.",
      "url": "https://www.thorlabs.com/imperial-and-metric-threading",
      "verified": true,
      "dimensions": {
        "grid_pitch": {"nominal": 25.4, "tol_plus": 0.0, "tol_minus": 0.0, "note": "1 inch exactly. Over four holes this differs from the metric grid by 1.6 mm."},
        "thread_major_dia": {"nominal": 6.35, "tol_plus": 0.0, "tol_minus": 0.0, "note": "1/4-20 UNC: 0.25 inch major diameter, 20 threads per inch."},
        "clearance_hole_normal": {"nominal": 6.8, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. Normal-fit clearance for a 1/4-20 screw.", "verified": false},
        "counterbore_dia": {"nominal": 11.2, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. For a 1/4-20 socket head cap screw head.", "verified": false},
        "screw_head_height": {"nominal": 6.35, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. 1/4-20 socket head cap screw head height (0.25 inch). A counterbore shallower than this leaves the head proud, not flush.", "verified": false},
        "border": {"nominal": 12.7, "tol_plus": 0.0, "tol_minus": 0.0, "note": "UNVERIFIED tolerance/fit. Planning example, not a tolerance specification. Confirm the actual fastener/table drawing and process. Typical 0.5 inch edge-to-first-hole distance. A property of the TABLE, not of your part: your plate's edge margin is a free design choice, so do not declare this as an interface.", "verified": false}
      },
      "fit_checks": [],
      "design_note": "Ask which table the user has. Assuming the wrong system is the most common optomechanical design error."
    },
    "cage-system-30mm": {
      "title": "30 mm cage system",
      "authority": "Thorlabs (de facto standard, second-sourced by others)",
      "document": "Thorlabs 30 mm cage system construction rods and cage plates",
      "url": "https://www.thorlabs.com/standard-30-mm-cage-plates",
      "verified": true,
      "dimensions": {
        "rod_spacing": {"nominal": 30.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "Rod centre to rod centre, on a square pattern. 1.18 inch."},
        "rod_diameter": {"nominal": 6.0, "tol_plus": 0.0, "tol_minus": 0.0, "note": "ER series cage rods."},
        "plate_thickness_typical": {"nominal": 8.9, "tol_plus": 0.0, "tol_minus": 0.0, "note": "0.35 inch, the CP33 standard cage plate. Informational, not a mating dimension: custom plates may be any thickness, but matching it keeps optical path budgets simple."}
      },
      "fit_checks": [],
      "design_note": "The 30 mm rod square is centred on the optical axis. A custom plate must place its aperture at the centroid of the four rod bores. Bore diameter is rod_diameter plus twice the free-sliding per-side clearance for YOUR process (fabrication-limits.md): about 6.2 CNC, 6.4 SLA, 6.8 FDM. A 6.1 mm nominal bore is not a reliable uncalibrated printed fit; validate the actual process and rod drawing. Four bores on a common square over-constrain each other, so do not go tighter than the fits table. Declare the bore against rod_diameter with intent envelope and the clearance you chose."
    },
    "sm1-lens-tube-thread": {
      "title": "SM1 lens tube thread",
      "authority": "Thorlabs (de facto standard)",
      "document": "Thorlabs SM1 series threading",
      "url": "https://www.thorlabs.com/imperial-and-metric-threading",
      "verified": true,
      "dimensions": {
        "thread_major_dia": {"nominal": 26.289, "tol_plus": 0.0, "tol_minus": 0.0, "note": "1.035 inch-40 thread. Holds 1 inch diameter optics."},
        "threads_per_inch": {"nominal": 40.0, "tol_plus": 0.0, "tol_minus": 0.0, "unit": "1/in"},
        "pitch": {"nominal": 0.635, "tol_plus": 0.0, "tol_minus": 0.0, "note": "25.4 / 40 mm."},
        "optic_dia": {"nominal": 25.4, "tol_plus": 0.0, "tol_minus": 0.0, "note": "1 inch optic."}
      },
      "fit_checks": [],
      "design_note": "A 40 TPI thread has a 0.635 mm pitch, which is at or below the resolution of most FDM printers. Print a clearance bore and use a purchased SM1 adapter or a tapped insert rather than printing the thread."
    }
  }
}

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Declares allowed tools, Needs network access, Needs Python

The author says: Python 3.11-3.14 with build123d 0.13.0 and matplotlib for snapshots. Geometry commands require build123d; the standards lookup and the interface check run on the standard library alone. Network needed for installation and current vendor drawings; local geometry checks run offline.

Security

What our scanner noticed· Low risk

  • Instructions that use the network
  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
K-Dense Inc.
Publisher
K-Dense (Community)
Source
K-Dense-AI/scientific-agent-skills · skills/lab-hardware-cad · commit a25cf9e
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE.md)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by K-Dense Inc. or K-Dense.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download lab-hardware-cad.zip