Skip to content

feat(lego): PerpendicularHolesLiftarm — studless liftarm with perpendicular pin holes#79

Open
fa-mc wants to merge 3 commits into
mainfrom
feat/perpendicular-holes-liftarm
Open

feat(lego): PerpendicularHolesLiftarm — studless liftarm with perpendicular pin holes#79
fa-mc wants to merge 3 commits into
mainfrom
feat/perpendicular-holes-liftarm

Conversation

@fa-mc

@fa-mc fa-mc commented Jun 26, 2026

Copy link
Copy Markdown
Owner

Summary

Adds a parametric thick studless liftarm where each hole position bores along either the flat-face axis (+Z, "main") or the narrow side-face axis (±Y, "perp") — generalizing the LEGO 6435016 / design-2391 "Liftarm Thick with Perpendicular Holes" family. hole_axes=None defaults to the alternating [perp, main, …] pattern (the reference image's layout).

PerpendicularHolesLiftarm(num_holes=5)                              # default: perp,main,perp,main,perp
PerpendicularHolesLiftarm(num_holes=5, hole_axes=["main"]*5)        # == LegoTechnicBeam(5)
PerpendicularHolesLiftarm(num_holes=3, hole_axes=["perp","main","perp"])

Default 5-hole part: 3 perpendicular (±Y) + 2 main (+Z) counterbored pin holes, single solid, lead-in chamfers on all 10 mouths. Visual contracts: visual_contracts/2026-06-26-perpendicular-holes-liftarm_design_{iso_ne,front}.svg.

Architecture

  • New sibling class vibe_cading/lego/technic_beam_perp.PerpendicularHolesLiftarmnot a widening of LegoTechnicBeam's narrow (length_in_studs) contract (dual-lens deletion-test reasoning in the design doc).
  • Extracted a shared stadium_beam_body() helper from LegoTechnicBeam — removes body duplication, zero behavior change.
  • _HoleMouthSelector gained a purely-additive axis="z"|"y" knob; the existing LegoTechnicBeam and LegoTechnicLLiftarm call sites are unchanged.
  • No cross-drilling (one axis per position); single-solid + main ∩ perp == 0 intersection guards.

Design flow

Artifacts under docs/design_plans/2026-06-26-perpendicular-holes-liftarm_* (requirements + design with human gates). Independent fresh-context TL + developer review plus a 6-dimension adversarial verification pass caught two real defects:

  1. The first selector design would have broken LegoTechnicLLiftarm (a second consumer with non-zero-Y rims) — reworked to be purely additive.
  2. A CI-red engine_api.json omission (falsely reported as done) + a "lying" selector comment (perp rims claimed off-center; they're at mid-height for n≥2) — both fixed and independently re-verified.

Validation

  • 41/41 tests (new tests/test_technic_beam_perp.py + NFC on beam & L-liftarm)
  • NFC: PerpendicularHolesLiftarm(N, all-main) == LegoTechnicBeam(N) at 0.00% volume delta (boolean-residual checked)
  • 18/18 visual contracts fresh; flake8 / no-__main__ clean; engine_api.json deterministic
  • Real build.py manifest pipeline builds the registered entry (897 KB STEP)
  • Version 0.1.4 → 0.1.5 (public-surface addition)

Reviewer notes

  • build.toml entry added (user-approved): lego/perpendicular_holes_liftarm_5hole.step.
  • Branch is off main; an unrelated concurrent crossed-helical-mesh_review.md from a parallel session is intentionally not included.

🤖 Generated with Claude Code

fa-mc and others added 3 commits June 26, 2026 17:27
…icular pin holes

Add a parametric thick studless liftarm that bores each hole position along either the flat-face axis (+Z, "main") or the narrow side-face axis (±Y, "perp"), generalizing the LEGO 6435016 / design-2391 "perpendicular holes" liftarm family. hole_axes=None defaults to the alternating [perp, main, ...] pattern.

- New sibling class vibe_cading.lego.technic_beam_perp.PerpendicularHolesLiftarm
- Extract shared stadium_beam_body() helper from LegoTechnicBeam (no behavior change)
- Generalize _HoleMouthSelector with an additive axis="z"|"y" knob (existing LegoTechnicBeam + LegoTechnicLLiftarm call sites unchanged)
- Counterbored pin holes + lead-in chamfers on both axes; single-solid + no-cross-drill intersection guards
- Tests, iso_ne/front visual contracts (registered), build.toml entry, engine_api.json refresh; version 0.1.4 → 0.1.5 (public-surface addition)

Design flow artifacts under docs/design_plans/2026-06-26-perpendicular-holes-liftarm_*; independent TL+developer review caught a CI-red engine_api omission and a selector doc-honesty defect, both fixed and re-verified.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…wed-values registry

Adding the new public class introduced a new engine_api allowed-values emitted site (PerpendicularHolesLiftarm.__init__.fit, a Literal["free","slip","press"]). tests/tools/test_engine_api_allowed_values.py keeps a hardcoded registry of every emitted site + a count literal; both must track new Literal-param classes. Add the Group-E entry and bump the count 35→36 (+ docstring E(3)→E(4)). Caught by CI full-suite (the engine-api workflow only checks JSON regenerability, not this registry).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant