Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion analysts/froggy.enrichment_adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,29 @@ export interface FroggyEnrichedView {
emaDistancePct?: number | null;
isInValueSweetSpot?: boolean | null;
brokeEmaWithBody?: boolean | null;
indicators?: Record<string, number | null> | 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<string, number | null | undefined> | 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
Expand Down
Loading