Files
siloqy/prod/docs/RECENT_VIOLET_34D_pending.md

103 lines
3.3 KiB
Markdown
Raw Normal View History

# RECENT_VIOLET_34D_pending
## 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 BLUEs 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.