Skip to content

[codex] Add and refine walking-beam alignment simulation#10

Draft
AdvancedImagingUTSW wants to merge 44 commits into
mainfrom
codex/walking-beam-alignment-quality-loop
Draft

[codex] Add and refine walking-beam alignment simulation#10
AdvancedImagingUTSW wants to merge 44 commits into
mainfrom
codex/walking-beam-alignment-quality-loop

Conversation

@AdvancedImagingUTSW

Copy link
Copy Markdown
Contributor

Summary

Adds the walking-beam alignment simulation and iteratively refines it for physical fidelity, educational clarity, and render quality.

Key changes include:

  • source-backed walking-beam hardware prescriptions and procedural builders for irises, posts, holders, and mirror mounts
  • import-safe walking-beam math for iterative M1/M2 alignment states
  • a Blender walking-beam scene with ray-traced Z-fold mirror anchors, same-height irises, animated beam segments, blocked-iris handling, and storyboard captions
  • render wrappers and still-export support for wide, iris close-up, hero, and stacked perspectives
  • documentation for the walking-beam alignment tutorial

Why

The earlier wide perspective renders had physically confusing mirror orientation and a visible beam discontinuity after M2. This branch corrects M1 so the reflective face points toward the incoming laser, derives the fold anchors from reflection/ray-plane math, and ensures the M1-to-M2 and post-M2 beam cylinders share the same animated M2 hit point.

User/developer impact

Users get a more accurate teaching animation showing that the beam starts misaligned, M1 centers Iris 1, M2 centers Iris 2, and repeated adjustments converge to both irises centered. The scene now also exports readable stills for each perspective and keeps new public helpers import-safe outside Blender.

Validation

  • uv run pytest tests/test_blender_import_contracts.py tests/test_blender_prescriptions.py tests/test_blender_optics_math.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py tests/test_optical_alignment_docs.py tests/test_simulation_code_quality.py -q -> 83 passed
  • uv run black --check simulations/blender tests -> passed
  • uv run ruff check simulations/blender tests -> passed
  • bash simulations/blender/scripts/render_walking_beam_alignment.sh --dry-run -> passed
  • bash simulations/blender/scripts/render_walking_beam_alignment_linux.sh --dry-run -> passed

PNG stills were exported locally for output/quality_loop/iteration_11 through output/quality_loop/iteration_20; the final reviewed preview set is output/quality_loop/iteration_20.

Increase the Iris 1 to Iris 2 spacing to five table holes, flip both mirror mount yaw defaults by 180 degrees for the visible setup, and route the rendered beam through explicit mirror-surface points instead of mount centers. The scene contract now pins these physical layout expectations.
Add explicit visual support controls for post-mounted irises and kinematic mirror mounts. Shorten iris supports below the aperture, offset mirror supports behind the frame, add rear support brackets, and attach adjuster shafts so knobs no longer float independently.
Add a dedicated one-frame PNG export workflow for wide, iris close-up, hero, and stacked perspectives. The script supports dry runs, render presets, frame selection, and resolution overrides so visual review iterations can be reproduced without rendering full movies.
Replace the solid ID25-style iris body with an annular mesh and add a display aperture control. This makes the laser visibly pass through real aperture openings in wide, hero, and close-up stills instead of appearing to enter a filled disk.
Add an import-safe close-up camera pose contract and use it to frame the midpoint between both irises with a wider lens from farther back. This makes the close-up and stacked stills show the beam relationship between both same-height apertures instead of only Iris 2.
Add named high-contrast optics palette constants for the laser, mirror, spots, labels, posts, and black anodized metal. Widen and back off the iris close-up camera so both irises stay in frame, and expose stronger softbox/fill/rim lighting controls for clearer hardware separation in draft stills.
Add an import-safe wide camera motion plan derived from the M1-to-Iris-2 span and use it for the rendered camera. Increase the final still distance and elevation so frame 168 keeps the whole optical table layout visible instead of cropping tightly around M1.
Replace radial mirror-center offsets with explicit face-plane intersections. M2 is solved on the iris-row Y coordinate, M1 is solved at the same X column, and the tests now verify the beam hits the visible local-negative-X mirror faces while preserving the incoming, folded, and iris-row straight legs.
Add an alignment-reference material and reticle geometry to post-mounted iris assemblies. The walking-beam scene now renders the irises at the 2.5 mm alignment aperture with a high-contrast target ring and ticks, making the centered final beam state easier to read in stills.
Add an import-safe iris reticle face-offset helper and a reticle_faces builder option. The walking-beam scene now requests double-sided reticles, making the narrow alignment apertures visible from both the wide and close-up camera angles.
Correct the walking-beam M1 default yaw from 225 degrees to 45 degrees so the local negative-X reflective face points toward the incoming laser from the left. Keep M2 at 135 degrees and add a scene-contract regression test that checks M1's reflective normal has a leftward component.
Add a reusable set_beam_between helper for keyframing beam cylinders and compute an import-safe downstream beam path from each storyboard state's Iris 1 and Iris 2 intercepts. The final beam after M2 is now created from the gross misalignment state and keyframed through the iterative M1/M2 alignment sequence instead of staying pre-aligned.
Use the same two-times display exaggeration for the animated downstream beam path and the iris spot readouts. Add a scene-contract test so the rendered beam and spot markers continue to describe the same iterative misalignment state.
Classify each storyboard state's physical iris intercepts against the aperture radius and keyframe the visible downstream beam only to the first blocking iris. Gross misalignment now terminates at Iris 1, M1-only correction terminates at Iris 2, and the beam extends beyond Iris 2 only when both irises pass.
Rotate M1 to -45 degrees so an incoming beam from the laser reflects toward M2, expose the existing optics reflection helper through a public import-safe API, and add scene-contract coverage for the two 90-degree reflections. Keyframe iris spot visibility from the blocking model so a blocked first iris no longer leaves a physically impossible second-iris readout.
Add an import-safe folded beam segment model whose endpoint is exactly the downstream beam start for each storyboard state. Drive the rendered M1-to-M2 cylinder from that model so the beam path stays continuous through M2 during misalignment and iterative correction. Verified with the full walking-beam scene contract tests and exported iteration_16 PNG stills.
Derive the nominal Z-fold anchors from mirror face planes, ray-plane intersections, and the shared optics reflection helper. The scene contract now proves the source-to-M1, M1-to-M2, and M2-to-iris-row directions are produced by the two 90-degree reflections rather than hand-placed convenience segments. Exported iteration_17 PNG stills at the M2-centering frame for quality review.
Add explicit visual beam and iris-spot size parameters so the walking-beam render remains legible while the physical one-millimeter beam diameter remains unchanged for the model. Route beam cylinders and iris spots through import-safe helpers, cover the separation in the scene contract, and export iteration_18 PNG stills at the M1-refinement frame.
Add one import-safe caption per alignment state and render them as keyframed scene labels so individual stills identify the protocol step being shown. The caption objects are hidden or shown at each storyboard frame without occluding the optical path. Exported iteration_19 PNG stills at the M2-refinement frame to review caption placement.
Apply a scene-local high-contrast label style to the generated walking-beam material palette so captions and component labels remain readable in preview and final renders. Cover the label style in the scene contract and export iteration_20 preview PNG stills at the final aligned frame to verify the caption, beam, and iris row remain clear.
Add full numpydoc Parameters and Returns sections for the new ray tracing, caption, label-style, and visual-radius helpers so the simulation code-quality test passes after the final walking-beam iteration.
Document the physical failures in the current walking-beam animation before replacing the model. The audit records the finite-aperture misses at M1 and early M2 states, explains why the current algebraic iris-offset model is not a continuous ray trace, and defines acceptance criteria for a reusable physics-driven implementation.

Add an implementation loop plan for ten autonomous iterations on the dedicated draft branch. Update the Blender simulation AGENTS note so future work starts from the audit and keeps the fix centered on a continuous laser-to-M1-to-M2-to-iris ray chain.
Add import-safe geometric ray primitives for the walking-beam model: finite-radius rays, finite plane mirrors, circular apertures, and interaction records. These helpers report local hit coordinates, radial offsets, clearance margins, and pass/clip/block status so future scene code can stop drawing impossible downstream beams.

Cover the new API with tests for finite mirror hits, mirror clear-aperture misses, and aperture pass/clip/block behavior. This starts replacing the previous algebraic-only iris-offset model with reusable physical trace components.
Add a reusable two-mirror/two-iris trace result that links source-to-M1-to-M2-to-Iris-1-to-Iris-2 into one ordered physical chain. The tracer returns renderable beam segments and stops at the first missed mirror or blocking aperture instead of allowing downstream beams to be drawn independently.

Extend walking-beam physics tests with a successful chain and a missed-M2 case. These tests lock in the requirement that later Blender rendering must be driven by trace results rather than independent hand-positioned beam cylinders.
Connect the walking-beam scene to the finite-element trace model. The nominal beam path now comes from a source ray propagated through M1, M2, Iris 1, and Iris 2, so the canonical path hits the finite mirror and iris elements rather than the previous independent offset-plane anchors.

Update scene contracts to require positive finite-element clearance margins and to retire the old assertion that beam anchors must avoid mount centers. This makes the aligned reference path physically valid before later iterations animate misalignment and correction states from the same trace machinery.
Add a MirrorAdjustment model and adjusted_plane_mirror helper so pitch and yaw perturb finite mirror normals directly. This lets beam motion be driven by mirror orientation and the law of reflection rather than by abstract downstream iris-offset terms.

Add a regression test for the factor-of-two relationship between small mirror yaw and reflected beam angle. This gives the walking-beam model a reusable physical control primitive for later animated alignment states.
Iteration 5 of the walking-beam quality loop.

Route the animated folded and downstream beam segments through the finite-element trace instead of the older algebraic intercept display model. This makes the visible beam stop at the first physical blocker and keeps iris spot visibility tied to actual reached interactions.

Add scene contracts that compare rendered path endpoints with RayTraceResult segments and cover the missed-M2 case with a nonzero hidden placeholder segment so Blender cylinder transforms do not fail.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 6 of the walking-beam quality loop.

Move iris spot placement from the older algebraic intercept display path to the actual traced iris interaction points. The scene now applies visual exaggeration after computing the finite-element trace, so spots cannot disagree with the rendered beam path.

Remove the unused scene-local display-intercept helper and stale compute_beam_intercepts import from the Blender scene script.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 7 of the walking-beam quality loop.

Add a reusable import-safe two-mirror alignment solver that traces finite mirror reflections and numerically adjusts M1/M2 pitch/yaw to hit requested iris offsets. The solver reports residuals and keeps iris planes as measurement surfaces while enforcing finite mirror clear apertures.

Route the walking-beam scene state conversion through the solver instead of treating abstract storyboard offsets as direct mirror tilt commands. The M1-centering storyboard state now physically centers the near iris in the finite trace, and downstream path construction can be tested from explicit trace results.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 8 of the walking-beam quality loop.

Reduce the default initial beam offset and angle so the finite two-mirror/iris trace shows the intended teaching sequence: gross misalignment stops at Iris 1, M1 centers Iris 1 while Iris 2 remains off, M2 reaches and centers Iris 2, and the refinement states converge.

Add a scene contract that requires the M2-centering state to physically reach both irises and center the far iris instead of being hidden behind an Iris 1 block.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 9 of the walking-beam quality loop.

Drive rendered M1/M2 mirror rotations from the same solved physical pitch/yaw adjustments used by the ray trace. This removes the remaining abstract-state mirror animation path, so the visible hardware motion now corresponds to the traced beam path.

Set the default mirror display scale to physical scale and add scene contracts that compare mirror Euler rotations against the solver adjustments.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 10 of the walking-beam quality loop.

Update the Blender simulation AGENTS notes so future work treats the walking-beam scene as a finite-aperture physical trace driven by the reusable two-mirror solver, rather than as a manual storyboard prototype.

Add a current-status section to the physical accuracy audit with the traced storyboard sequence, first blocking element, iris radii, and remaining limitations after the quality-loop fixes.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check; simulations/blender/scripts/render_walking_beam_alignment_stills.sh --draft --frame 168 --dry-run /tmp/altair_walking_beam_iter10_stills; RESOLUTION_X=640 RESOLUTION_Y=360 simulations/blender/scripts/render_walking_beam_alignment_stills.sh --draft --frame 168 /tmp/altair_walking_beam_iter10_stills
Iteration 1 of the second walking-beam fidelity loop.

Document the current rendered defects observed in the latest wide, hero, stacked, and iris-closeup movies: rectangular M1 glow, weak folded segment visibility, ambiguous M2 beam direction, glowing iris reticles, and insufficient clipped-spot fidelity.

Tie each visual issue to the likely source-code mechanism so later iterations can address root causes instead of isolated symptoms.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 2 of the second walking-beam fidelity loop.

Introduce a shared mirror optic surface center helper and use it for both the KM100CP visual mirror mesh and the import-safe physical mirror plane. This removes the separate hard-coded visual mirror offset that let the rendered ray endpoint land on a different mount plane than the visible mirror optic.

Add a scene contract that checks M1 and M2 physical mirror planes match the visible optic surface centers used by the Blender geometry.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 3 of the second walking-beam fidelity loop.

Add trace-derived M1 and M2 mirror footprint records and render them as thin circular disks oriented by the adjusted physical mirror normals. This gives the viewer an explicit circular laser hit point on each mirror instead of relying on ambiguous mount glow or hidden beam endpoints.

Keyframe the footprint disks across storyboard states and keep them tied to the same physical trace used by the beam path.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 4 of the second walking-beam fidelity loop replaces the scene's incoming/folded/final beam special cases with five stable display slots derived from the physical ray trace: incoming, M1-to-M2, M2-to-Iris1, Iris1-to-Iris2, and post-Iris2.

The rendered beam now shares visibility and power metadata with the trace, including hidden placeholder segments after blocking, so future visual tuning can act on a complete segment list instead of camera-specific beam shortcuts.

Verification: uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 5 of the second walking-beam fidelity loop adds dense trace keyframes between the six instructional storyboard states. Mirror controls are linearly interpolated at a bounded cadence so beam segments, iris spots, and mirror footprints are recomputed from physical traces during transitions instead of relying on sparse endpoint interpolation.

The six named states remain the caption/storyboard milestones, while the sampled state list drives physical object animation. This keeps the educational sequence readable and reduces wild-looking intermediate beam motion.

Verification: uv run --frozen pytest tests/test_walking_beam_scene_contract.py::test_sampled_alignment_states_fill_storyboard_intervals -q; uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 6 of the second walking-beam fidelity loop adds trace-derived iris spot visual records for passed, clipped, blocked, and unreached iris interactions. Clipped and blocked states now use larger, dimmer status-specific spot objects rather than the previous generic full-bright iris spots.

The scene animation keys those status-specific spot objects from sampled physical traces and scales beam segment radius by transmitted power, making downstream clipping loss visible in the rendered path.

Verification: uv run --frozen pytest tests/test_walking_beam_scene_contract.py::test_iris_spot_visuals_distinguish_passed_clipped_and_blocked -q; uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py simulations/blender/altair_blender/materials.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py simulations/blender/altair_blender/materials.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 7 of the second walking-beam fidelity loop changes the walking-beam iris reticles from double-sided bright reference rings to front-only, low-emission reference marks. This reduces the chance that the reticle ring reads as a laser impact spot in the close-up view.

The scene now exposes a trace-independent reticle style helper and applies it to the dedicated alignment_reference material during scene setup, keeping reticle styling separate from beam and spot materials.

Verification: uv run --frozen pytest tests/test_walking_beam_scene_contract.py::test_scene_uses_narrow_visible_iris_apertures_with_reticles -q; uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py simulations/blender/altair_blender/materials.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py simulations/blender/altair_blender/materials.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py; git diff --check
Iteration 8 of the second walking-beam fidelity loop adds a Top-Down Path Camera centered over the M1-to-Iris2 span so the folded beam route and beam-walking corrections are visible without perspective ambiguity.

The movie and still render scripts now emit top-down frames and outputs, including walking_beam_alignment_top_down.mp4, and stack wide, iris close-up, and top-down views for diagnostic review.

Verification: uv run --frozen pytest tests/test_walking_beam_scene_contract.py::test_scene_default_parameters_include_hardware_sources_and_video_contract tests/test_walking_beam_scene_contract.py::test_top_down_camera_pose_frames_folded_beam_path -q; uv run --frozen pytest tests/test_walking_beam_render_script.py::test_render_script_help_documents_artifacts_and_overrides tests/test_walking_beam_render_script.py::test_render_script_dry_run_lists_full_movie_pipeline tests/test_walking_beam_render_script.py::test_still_render_script_dry_run_lists_four_png_perspectives -q; bash -n simulations/blender/scripts/render_walking_beam_alignment.sh simulations/blender/scripts/render_walking_beam_alignment_stills.sh; uv run --frozen pytest tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py simulations/blender/altair_blender/materials.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/geometry.py simulations/blender/altair_blender/materials.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; git diff --check
Iteration 9 of the second walking-beam fidelity loop addresses visual QA feedback from the top-down stills: the mirror optic was visually recessed because the frame rails were centered around the optical plane.

The mirror surface remains the shared physical ray-trace plane, while the frame rails now sit behind that plane and the optic mesh is centered so its front face is flush with the mount front. This preserves the existing nominal Z-fold trace while making the mount read more like a real kinematic mirror holder.

Verification: rendered draft stills for frames 1, 36, 72, 108, 144, 168 under /tmp/altair_walking_beam_iteration9; rendered post-fix frame 72 still under /tmp/altair_walking_beam_iteration9_flush_frame_72; uv run --frozen pytest tests/test_blender_import_contracts.py::test_mirror_mount_frame_sits_behind_flush_optic_surface tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; uv run --frozen ruff check simulations/blender/altair_blender/beam_walking.py simulations/blender/altair_blender/geometry.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/materials.py tests/test_blender_import_contracts.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/altair_blender/geometry.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/materials.py tests/test_blender_import_contracts.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; git diff --check
Iteration 10 of the second walking-beam fidelity loop updates the simulation agent notes, README, and physical-accuracy audit with the current trace-derived render architecture, top-down review workflow, and flush mirror-mount convention.

The final verification pass also found two suite-level maintenance issues: a nested solver helper lacked a numpydoc docstring, and the docs linkcheck test left pytest in the docs directory. This commit fixes both so the full test suite is stable, not only the focused walking-beam subset.

Verification: uv run --frozen pytest; uv run --frozen ruff check simulations tests; black --check simulations/blender/altair_blender/beam_walking.py simulations/blender/altair_blender/geometry.py simulations/blender/scenes/walking_beam_alignment.py simulations/blender/altair_blender/materials.py tests/test_blender_import_contracts.py tests/test_docs.py tests/test_walking_beam_physics.py tests/test_walking_beam_scene_contract.py tests/test_walking_beam_render_script.py; git diff --check
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