Skip to content

design(mechanical): rigorous observatory mechanical-design proof-out - #105

Merged
THOClabs merged 2 commits into
mainfrom
design/mechanical-proveout
Aug 6, 2026
Merged

design(mechanical): rigorous observatory mechanical-design proof-out#105
THOClabs merged 2 commits into
mainfrom
design/mechanical-proveout

Conversation

@THOClabs

@THOClabs THOClabs commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Summary

Turns the repo's documented-but-unproven mechanical design (NIGHTWATCH_Build_Package.md + the pos/ expert-persona reviews) into a rigorous, reproducible, self-consistent engineering proof-out under a new design/mechanical/ tree. It runs the selection permutations as a weighted trade study, proves out every choice with first-principles calculations carrying stated assumptions and margins, makes and defends the bold choices the numbers justify, and fills the CAD and environmental-load voids. 121/121 tests green.

Type of Change

  • New feature (non-breaking change that adds functionality)
  • Documentation update

Changes Made

  • design/mechanical/calc/params.py — single source of truth for every mechanical parameter, sourced/derived/assumed tagged; resolves 7 cross-file contradictions (MN76 vs MN78 mass, 2048 vs 8192 PPR, temp units, site coords, deep-groove-vs-angular-contact bearings) in one place.
  • 11 first-principles budget modules (pure-stdlib), each evaluate() -> BudgetResult + a pytest asserting its margin: torque, stiffness, dynamics, encoder tracking, balance, bearings, wind, pier, thermal, enclosure, power.
  • design/mechanical/tradestudy/ — morphological (Zwicky) + weighted-Pugh matrices with a precision/cost sensitivity pass; a pass/fail gate on the 1″ tracking target disqualifies the baseline encoder a naive weighted sum would have kept.
  • design/mechanical/cad/ — parametric OpenSCAD (RA/DEC housings, pier adapter, counterweight shaft, assembly) + a zero-dependency SVG elevation previewer, filling the empty "all .step Pending" appendix.
  • design/mechanical/MECHANICAL_DESIGN.md — generated by report.py from the calculator; test_report.py byte-compares so it can never drift from the code.

Results — 6 PASS / 5 FAIL (the FAILs are the value)

Proof Verdict Governing number
Torque ✅ PASS counterweight-FREE MN78: RA 49.9 Nm vs 127 rated (SF 2.5), DEC 26.5 vs 70 (SF 2.6) — deleting ~9 kg of counterweights is sound
Stiffness ❌ FAIL 43.5″ vs 5″ — the deep-groove 6008/6006 bearings are 98% of the error (not the walls) → angular-contact 7008/7006 required
Dynamics ✅ PASS first mode 65 Hz vs 10 Hz (SF 6.5)
Encoder ❌ FAIL baseline 5.02″ RMS vs 1″; on-axis ring 0.54″ → on-axis high-res absolute encoder REQUIRED for sub-arcsec
Balance ✅ PASS 12.5 kg balances 18 kg; CW-free deletes 15.4 kg + 29% RA inertia
Bearings ✅ PASS load never governs; deep-groove mislabel flagged
Wind ❌ FAIL survival 105 mph → 9.2 kN roof uplift (SF 0.19) → hold-down anchors mandatory & unspecced
Pier ✅ PASS tilt 0.70″, f_n 152 Hz, seismic SF 7.0 (embedment governs)
Thermal ❌ FAIL 22 K diurnal swing walks focus ~10× depth-of-focus → temp-compensated focuser
Enclosure ✅ PASS drive SF 2.1; snow governs the roof → snow interlock required
Power ❌ FAIL off-grid: 12 V pack 3.3 h vs 10 h night → 48 V (13.4 h) or DGX duty-cycle

Safety Checklist

  • Changes do not bypass safety interlocks — this PR adds a design-analysis package only; it does not touch runtime control, safety, or enclosure code.

Testing

  • python3 -m pytest design/mechanical/tests/ -q121 passed
  • Report-vs-calculator drift test green (single source of truth enforced)
  • SVG previewer regenerates byte-identically; every .scad carries its render command

Documentation

  • design/mechanical/MECHANICAL_DESIGN.md (generated, 780 lines) — resolved-contradiction & filled-void tables, 11 proofs, provenance ledger, trade study, CAD, selected-config + cost-delta + roadmap, risk register.

Additional Notes

Every input is labelled Sourced / Derived / Assumed — nothing is measured field data; the observatory has never been built. The three governing structural loads the repo omits (survival wind, snow, seismic) are added as clearly-labelled assumptions. Left as a draft for your review; the design/ tree is isolated from the runtime code and from CI's services/ voice/ nightwatch/ lint/type scope.

🤖 Generated with Claude Code

claude added 2 commits August 2, 2026 08:11
… torque proof

First slice of the mechanical-design proof-out. Establishes the single-source-of-
truth parameter set (params.py) with sourced/derived/assumed provenance tags, the
SI units layer, the common BudgetResult type, and the exemplar axis-torque budget.

The torque proof already lands the boldest result: MN78 counterweight-FREE needs
49.9 Nm at RA vs the CSF-32 127 Nm rating (SF 2.5) and 26.5 Nm at DEC vs 70 Nm
(SF 2.6) — deleting the ~9 kg of counterweights is quantitatively feasible, the
same principle the ZWO AM5 / RST-135 exploit. 5/5 tests green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SKZMQ755R7q38SKqJsCQsg
…nerated report

Completes the rigorous mechanical-design proof-out. Turns the repo's asserted-but-
uncomputed design into 11 first-principles budgets (torque, stiffness, dynamics,
encoder tracking, balance, bearings, wind, pier, thermal, enclosure, power), each a
calc module + pytest asserting its margin. A weighted-Pugh trade study runs the
selection permutations with a sensitivity pass, parametric OpenSCAD + an SVG preview
fill the empty CAD appendix, and report.py generates MECHANICAL_DESIGN.md from the
calculator (a diff-test forbids drift). 121/121 tests green.

Honest tally: 6 PASS / 5 FAIL — the FAILs are real findings the repo's prose hid:
- stiffness 43.5" vs 5": the deep-groove 6008/6006 bearings (not the walls) are 98%
  of the error -> angular-contact 7008/7006 pairs required.
- tracking: baseline dual-encoder chain 5.02" RMS vs 1" -> on-axis high-res absolute
  encoder REQUIRED (proposed ring reaches 0.54").
- survival wind: 9.2 kN roof uplift, SF 0.19 -> hold-down anchors mandatory (unspecced).
- thermal: 22 K diurnal swing walks focus ~10x depth-of-focus -> temp-comp focuser.
- off-grid power: 12 V pack 3.3 h vs 10 h night -> 48 V pack (13.4 h) or DGX duty-cycle.

Selected build banks two won bold picks (counterweight-FREE GEM, active-thermal roof)
plus the mandatory on-axis encoder; keeps baselines where they already pass. Every
input tagged sourced/derived/assumed; the three governing voids the repo omits
(survival wind, snow, seismic) are filled as labelled assumptions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SKZMQ755R7q38SKqJsCQsg
@THOClabs
THOClabs merged commit ed68708 into main Aug 6, 2026
9 checks passed
@THOClabs
THOClabs deleted the design/mechanical-proveout branch August 7, 2026 04:22
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.

2 participants