feat(kidscleancar_knob_cover): friction-fit childproof speed-knob cover (pst-8bj) - #58
Conversation
…er (pst-8bj) Original parametric cover that grips the KidsCleanCar ride-on's lower speed-knob flange (48.1mm OD, 3.15mm grip band) via tunable vertical crush ribs, deliberately decoupled from the knob so twisting the cover never turns it. Round bore over round flange = free spin (no anti-rotation); a straight adult pull with a between-rib pry recess removes it. Stepped interior clears the 3 proud screw heads and floats the knob untouched. Prints mouth-up, support-free. Ships the four new-model artifacts: .scad + invariants sidecar (single body, round OD, knob/screw clearance, rib bite + free-spin bore), sweep test, catalog entry (toys), and committed renders. Export watertight (single solid); check-invariants green; wasm sweep 53/53 green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YPcLxyLs693J2H9CYq7Wr2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Codex gate review — changes requestedReviewed exact head
Default geometry is otherwise watertight and single-body; the artifact set, catalog entry, license, and vendored pins are correct. Full evidence is recorded on review bead |
…n documented print orientation (pst-8bj) Addresses codex gate review (pst-u2m); all three findings reproduced on the pinned engine (2025.06.12.ai25773) and fixed: 1. knob_d max 60->40 so the knob cavity always fits inside the flange bore (a cavity wider than the body made shell_profile self-cross -> non-closed mesh). Defensive clamp: knob_cav_r = min(.., bore_r-0.6). 2. skirt_gap max 4->2 so the skirt always reaches past the flange top (skirt_gap >= flange_h left the ribs entirely off the flange = zero retention). rib_leadin now clamped to the rib's straight height so a shallow rib can never invert the profile into a non-closed mesh. 3. Final assembly now flips ROOF-DOWN into the print frame: the exported STL matches the documented mouth-up/support-free orientation (dome on the bed at z=0, mouth up), instead of the previous mouth-on-bed export that would have bridged the ~48mm interior roof. Invariant probes map deck-frame -> print-frame accordingly. Verified: every declared @param min/mid/max exports a closed mesh on the pinned CGAL engine (53 one-at-a-time cases); wasm sweep 53/53 green; check-invariants green; STL watertight single body, z=0..13.05. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YPcLxyLs693J2H9CYq7Wr2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Review fixes pushed (074a8f9)All three findings reproduced on the pinned engine (
Verification: every declared |
Codex gate review — changes requestedReviewed exact assigned head
Default geometry is otherwise correctly oriented, watertight, single-body, invariant-clean, and correctly licensed. Full evidence is recorded on review bead |
Codex gate review — changes requestedReviewed exact head
Default geometry is otherwise correctly oriented, watertight, single-body, correctly licensed, and registered in the catalog/sweep. Full evidence is recorded on bead |
…truction (pst-8bj) Addresses codex gate review round 2 (pst-bu9); all three findings reproduced on the pinned engine (2025.06.12.ai25773) and fixed by derivation so no accepted parameter combination misbehaves: 1. Knob contact at flange_d=min: the previous defensive clamp shrank the cavity BELOW the knob (14.7 < 14.75mm at flange_d=30), letting the cover key to the knob. Now knob_cav_r = knob_d/2 + knob_clear ALWAYS (never shrinks) and the bore/body GROWS to hold it: bore_r = max(flange_r + fit_clearance, knob_cav_r + annulus_min). 2. Zero retention at flange_h=min + skirt_gap=max: ribs started above the flange (z 2.0 vs flange top 1.5). Skirt bottom is now derived — skirt_z0 = max(0, min(skirt_gap, flange_h - engage_min)), engage_min 1.5 > the rib lead-in — so a full-depth rib band always bites the flange. rib_z0 and the skirt/pry geometry use skirt_z0. 3. Screw pocket punching the roof at large screw_head_h/screw_clear: top_z ignored the annulus roof. Now top_z = max(knob_roof_z, annulus_roof_z) + wall, so the roof always caps the higher pocket with a full wall (the cover just gets taller). Invariant transform updated to match; knob-cavity probe extended to the upper knob envelope. Default geometry byte-identical (bbox 53.5x53.5x13.05, watertight, single body, invariants green, renders unchanged). Verified: all 51 one-at-a-time extremes AND the flagged combinations (screw_head_h=8+screw_clear=6, flange_d=30, flange_h=1.5+skirt_gap=2, knob_d=40+flange_d=40) export CLOSED on the pinned CGAL engine; flange_d=30 knob envelope now clear; flange_h=1.5 +skirt_gap=2 ribs engaged. wasm sweep 53/53 green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YPcLxyLs693J2H9CYq7Wr2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Review round 2 fixes pushed (14d3ab6)All three findings (pst-bu9) reproduced on the pinned engine and are fixed by derivation — no accepted parameter combination misbehaves now, and the default geometry is byte-identical:
Verification: all 51 one-at-a-time extremes and the flagged combinations ( |
…truction (pst-8bj) Per mayor steering — stop point-fixing individual reviewer combos and close the whole class. The domain is now valid by construction: - Single-param bounds tightened so EVERY min/max excursion from the measured defaults renders valid geometry on its own: flange_d min 30->34 (smallest flange still fits the default knob's cleared cavity + screw annulus), knob_d max 40->44 (cleared cavity stays inside the default flange bore), skirt_gap max 2->1 (>=2mm rib/flange overlap at the default flange_h). - Cross-parameter preconditions that no single bound can express now fail LOUDLY via assert() with a fix-hint message instead of emitting broken or silently-wrong geometry: (1) cleared knob cavity + annulus must fit the flange bore, (2) the skirt must reach >=1mm past the flange top, (3) the rib must have positive height. - Reverted the round-2 body-growth hack: the cover OD tracks the flange again (bore_r = flange_r + fit_clearance); the cavity is never shrunk (always clears the knob) and never overruns the bore (the assert guarantees it). Kept the derived skirt_z0 (guarantees flange overlap at small flange_h) and top_z = max(knob_roof_z, annulus_roof_z) + wall (roof always caps the higher interior pocket). Measured defaults untouched: STL byte-identical (bbox 53.5x53.5x13.05, roof-on-bed z=0..13.05 support-free orientation, watertight single body, invariants green). Verified: all 51 single-param min/max excursions build valid with no assert; genuinely-incompatible combos (e.g. flange_d=34 + knob_d=44) assert loudly with rc=1; wasm sweep green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YPcLxyLs693J2H9CYq7Wr2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Domain made sound by construction (8654605) — per mayor steeringStopped point-fixing individual combos; closed the whole class instead. The parameter domain is now valid by construction: 1. Single-param bounds tightened so every min/max excursion from the measured defaults renders valid geometry on its own:
2. Cross-param preconditions that no single bound can express now
3. Reverted the round-2 body-growth hack — the cover OD tracks the flange again ( Orientation (finding 3): still fully addressed — the exported STL is roof-on-bed ( Verification: measured defaults byte-identical (bbox |
Codex gate review — changes requestedReviewed exact assigned head Two PR-introduced correctness defects block the gate:
Default geometry is otherwise watertight, one body, correctly oriented, correctly licensed, and fully registered. Full evidence is recorded on bead |
Codex gate review — changes requestedReviewed exact head
The default model is otherwise watertight, one body, correctly oriented, correctly licensed, and fully registered. Full evidence is recorded on review bead |
…easured knob class (pst-8bj) Per mayor decision after 6 review rounds: converge by SHRINKING scope, not hardening wider. This model childproofs one knob class; it doesn't need to render a 30mm flange or a 1.5mm grip band. - Narrowed every @param to a tight envelope around the measured device: flange_d 44-52, flange_h 2.5-4, knob_d 26-33, knob_h 4-8, screw_head_h 0-4, fit_clearance 0.2-0.6, knob_clear 0.8-2.5, knob_vclear 1-3, screw_clear 1-3.5, rib_count 4-8, rib_interference 0.1-0.5, rib_width 1-2.5, wall 2-3.5, top_chamfer 0-2, pry_notch_w 8-16, pry_notch_h 2-5, skirt_gap 0-1. Defaults unchanged. - Kept the derivations that make each corner valid: top_chamfer_eff clamped to wall (no roof self-cross), rib_leadin clamped so a full-depth grip_band survives, top_z = max(knob_roof_z, annulus_roof_z) + wall, pry width clamped to the between-rib gap. - Explicit domain asserts (fail loudly with fix hints) for the combos the ranges still can't exclude: knob cavity + annulus must fit the bore; grip_band >= 1.5mm (holds at flange_h-min + fit-max + rib_interference-max); chamfered exterior stays outside the bore at the annulus roof; rib height. Verified on the pinned native OpenSCAD (2025.06.12.ai25773): FULL corner matrix of 8105 cases — exhaustive 2^12 over the interacting params + 4000 random full-parameter corners + all 9 reviewer-cited combos — every case is either a valid export (closed mesh, single watertight body) or a loud assert. 8102 valid, 3 asserted (the incompatible knob-vs-flange combos), ZERO defects. Defaults byte-identical (53.5x53.5x13.05, roof-on-bed, watertight, invariants green); wasm sweep green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YPcLxyLs693J2H9CYq7Wr2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Converged — domain narrowed to the measured knob class (9c9de82)Per the mayor decision after 6 rounds: converge by shrinking scope, not hardening wider. This cover childproofs one knob class; it doesn't need to render a 30mm flange or a 1.5mm grip band. Narrowed every Kept the derivations that make each corner valid (chamfer clamped to wall; rib lead-in clamped so a full-depth grip band survives; Full corner matrix run locally on the pinned native OpenSCAD (2025.06.12.ai25773) before pushing — 8105 cases: exhaustive 2¹² over the interacting params + 4000 random full-parameter corners + all 9 reviewer-cited combos. Every case is either a valid export (closed mesh, single watertight body) or a loud assert: 8102 valid, 3 asserted (the incompatible knob-vs-flange combos), ZERO defects. Defaults byte-identical ( |
Codex gate review — changes requestedReviewed exact head
Default geometry and the focused prior-failure corners are otherwise watertight, single-body, correctly oriented, correctly licensed, and fully registered. Full evidence is recorded on review bead |
…ry corner (pst-8bj) Addresses codex review pst-yc4: at flange_h=2.5 + skirt_gap=1 the previous grip-band clamp consumed the whole lead-in (rib_leadin -> 0), leaving a square full-interference shoulder at the mouth that snags instead of self- centering. The rib now must present BOTH a positive insertion ramp AND the full crush band. The skirt bottom is derived to reserve room for both: rib_leadin_min = max(0.4, rib_interference) (deeper rib -> longer ramp) engage_min = rib_bite(1.5) + rib_leadin_min skirt_z0 = clamp(skirt_gap, flange_h - engage_min) so every accepted corner keeps rib_leadin >= rib_leadin_min AND grip_band >= 1.5mm. New assert makes a collapsed lead-in fail loudly. Default unchanged (skirt_z0 still 0.5, rib_leadin still 0.8 -> byte-identical STL, 53.5x53.5x13.05, watertight, invariants green). Re-verified the FULL corner matrix on pinned native OpenSCAD (2025.06.12.ai25773): 8105 cases (exhaustive 2^12 + 4000 random full-parameter corners + 9 reviewer combos) — 8100 valid, 5 asserted, ZERO defects. flange_h=min + skirt_gap=max now exports one watertight body with a nonzero lead-in ramp and >=1.5mm bite. wasm sweep green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YPcLxyLs693J2H9CYq7Wr2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Lead-in guaranteed at every corner (e4aad97)Fixes the pst-yc4 finding: at The rib now reserves room for both a positive insertion ramp and the full crush band: so every accepted corner keeps Verification: default byte-identical ( |
Codex gate review — changes requestedReviewed exact head
The focused accepted-corner native exports, default topology, print orientation, catalog/artifact set, license, vendored pins, and reported CI checks are otherwise clean. Full evidence is on review bead |
…f the screw annulus (pst-8bj) Addresses codex review pst-s4l: rib_top_z = flange_h + 1 left each rib solid for 1mm above the flange, intruding into the screw-head annulus (solid at r=23.95, z=3.65 on every rib azimuth). A stock screw head reaching that outer annulus could stop full seating or catch the free-spinning cover. Fix: rib_top_z = flange_h — the rib grips only the flange edge and never rises into the annulus. Grip is unchanged (grip_band was already measured only up to flange_h; the removed 1mm sat above the flange and gripped nothing). Sidecar gains an above-flange annulus probe at rib azimuths (was only sampling the annulus midpoint). Verified: rib now clears r=23.95,z=3.65 on all azimuths while the flange-band bite (z=2.075) stays solid; STL watertight, single body, bbox unchanged 53.5x53.5x13.05, invariants green (incl. the new probe). Full corner matrix on pinned native OpenSCAD: 8105 cases, 8100 valid + 5 asserted, ZERO defects; wasm sweep green. Renders updated (ribs 1mm shorter; internal, bbox unchanged). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YPcLxyLs693J2H9CYq7Wr2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Ribs ended at the flange top (bcd15c8)Fixes pst-s4l: Fix: Verified: the rib now clears |
Codex gate review — passReviewed exact head Verified the exact-SHA default export and invariant sidecar on pinned OpenSCAD Gate verdict: pass. |
What
New original parametric model: a friction-fit childproof cover for the speed-adjust knob on a KidsCleanCar kids' ride-on (bead pst-8bj). Stops a toddler changing the speed; no vehicle modification, fully reversible.
How it works
rib_countvertical crush ribs standingrib_interferencepast the flange edge — the short 3mm band can't hold a plain interference bore, but ribs deform predictably and survive re-fits (PETG-friendly). These are the per-printer tuning knobs.Print
Mouth-up, support-free — every interior ceiling becomes an up-facing floor, the only exterior overhang is a self-supporting 45° top chamfer. ~53mm OD × ~13mm tall, wall ~2.4mm.
Params exposed
flange_d,flange_h,knob_d,knob_h,screw_head_h,fit_clearance,knob_clear,knob_vclear,screw_clear,skirt_gap,rib_count,rib_interference,rib_width,wall,top_chamfer,pry_notch(+ width/height) — retunable for any similar ride-on knob.Gates
check-invariants.pygreen — pins single-body, round OD, knob/screw clearance, rib bite past the flange edge + free-spinning bore between ribs.Ships all four new-model artifacts (scad + invariants sidecar + sweep test + catalog entry) plus committed renders. Original design under
models/LICENSE(CC BY-NC-SA 4.0); no QuackWorks/openGrid dependency.🤖 Generated with Claude Code