diff --git a/analysts/froggy.enrichment_adapter.ts b/analysts/froggy.enrichment_adapter.ts index 5d7bdbe..f9a58f0 100644 --- a/analysts/froggy.enrichment_adapter.ts +++ b/analysts/froggy.enrichment_adapter.ts @@ -48,7 +48,29 @@ export interface FroggyEnrichedView { emaDistancePct?: number | null; isInValueSweetSpot?: boolean | null; brokeEmaWithBody?: boolean | null; - indicators?: Record | null; + /** + * Raw indicator readings projected from the technical lane + * (rsi / ema_20 / ema_50 / volume_ratio). Context only — NOT read by this + * adapter or any scorer input; wiring one into an axis is a separately + * governed change. Documented here to match its siblings below, which + * already carry this annotation. + * + * Values are `| undefined` because the producing lane payload marks some + * readings optional (e.g. TechnicalLensV1.volumeRatio): the projecting node + * writes the key with an `undefined` value rather than omitting it or + * substituting null. + * + * The type is widened to match that rather than coercing at the producer + * because widening is the only option that provably changes nothing. The + * alternatives do not: canonical JSON drops an `undefined`-valued key but + * retains a `null`-valued one, and omitting the key changes `Object.keys()`. + * This view reaches no live hash preimage today (`enrichmentHash` is taken + * over the raw lane payloads, not this renamed projection), but + * `strategyLocalViewHash` is a declared-but-unproduced pin over exactly this + * view — so a coercion here would become hash-relevant the moment that + * producer is wired up. + */ + indicators?: Record | null; /** * ATR(14) projected from the technical lane. Context only — NOT read by * this adapter or any scorer input; wiring it into an axis is a separately