# RECENT_VIOLET_34D_fb34431 ## What This Work Was This pass continued the VIOLET plan after `V3.4c` by wiring the launcher-side shadow path to the live BLUE factor plane. The goal stayed read-only. BLUE code, BLUE schemas, and BLUE data structures were not modified. The change was entirely on the VIOLET side. ## Scope This pass added a thin shadow-side live-factor attachment and a focused test surface: - `prod/clean_arch/violet/shadow_live_factors.py` - `prod/clean_arch/violet/test_violet_launcher_shadow_live_factors.py` - `prod/launch_dolphin_violet.py` It reused the existing V3.4c live BLUE source adapter: - `prod/clean_arch/violet/live_blue_source.py` - `prod/clean_arch/violet/live_factor_source.py` - `prod/clean_arch/violet/live_factors.py` ## Why This Was Needed Before this pass, the Violet shadow launcher still had a base-only decision path. That meant the `VioletDecisionEngine` could produce a muted decision, but it did not yet receive the full live factor plane from BLUE’s published surfaces inside the launcher path. The missing piece was the launcher-side wiring: source live BLUE factors, thread them into `decide(...)`, and keep the journaled breakdown faithful to the same factor plane BLUE would have seen at that scan. ## What Was Added ### 1. Shadow live-factor helper `shadow_live_factors.py` now provides two small helpers: - `build_shadow_live_source(...)` - `shadow_decision_step(...)` `build_shadow_live_source(...)` assembles the read-only BLUE live factor mirror for the shadow path. The helper keeps imports lazy so it can be unit-tested without dragging in the full launcher import chain. `shadow_decision_step(...)` runs one muted shadow decision using the live BLUE factor plane, then journals the result when the decision is actuated. ### 2. Launcher wiring `launch_dolphin_violet.py` now: - builds the live-factor shadow source when shadow mode is enabled - passes the live `SizingFactors` into `VioletDecisionEngine.decide(...)` - skips the shadow decision instead of silently falling back to base-only when the live factor plane is missing - keeps the existing journal path intact This preserves the existing muted-shadow architecture while making the shadow decision reflect the live BLUE factor plane rather than a reduced fallback. ### 3. Focused tests `test_violet_launcher_shadow_live_factors.py` covers: - the live-factor helper contract - failure propagation from the client factory - the shadow decision step with live factors and journaling - the no-live-factor skip path Because the mount was slow under `pytest`, I verified the helper path directly with a small execution script instead of waiting on long file-system waits. ## Exactness Rules Followed The pass stayed conservative: - no BLUE edits - no schema edits - no live fallback to a fake factor plane - no execution path changes outside the muted shadow branch - no silent loss of the live factor breakdown ## Verification Direct runtime check: - the new helper built successfully with injected factories - the shadow decision step accepted the live factor plane - the decision was journaled with the expected Violet journal table Observed direct result: - `ok` `pytest` on this mount was slow and repeatedly stalled in netfs waits, so I did not treat that as a code failure.