17 — Asset Class Feature Set Declaration (Explicit Contract)
Why this page exists: Features were added incrementally based on "equity intuition." Non-equity assets like gold inherited the entire suite by default—which features are meaningful and which carry misapplied semantics was never explicitly declared. The 2026-06-12 gold VIX defense leg verification (see 12-verification negative result #6) exposed this issue. This page is the single source of truth: Adding or removing a feature for an asset class must be updated here.
Feature × Asset Class Matrix
| Feature | Equities (NDQ.AX, etc.) | Gold / Precious Metals (GC=F) | Source |
|---|---|---|---|
| Regime classification (MA120/250 + ATR + drawdown) | ✅ | ✅ (per-asset threshold override: trend 5.0 / crash_atr 3.5) | core/regime.py |
| Path probability (regime-conditional OHLC distribution + calibration layer) | ✅ | ✅ | core/regime_probability.py |
| VIX 2y percentile → Fear/Greed tier | ✅ | ✅ (Semantically questionable, see below) | utils/sentiment.py |
| VIX sentinel → INDEP_DEFENSE_FLAG blocks buys | ✅ Full block & downgrade | 🔁 Switch to phased DCA (2026-06-13 ruling): No full block, allow 1/3 per batch, ≥5 trading days between batches, ≤3 batches per 20-trading-day window; see below | Same as above |
| ATR mutation ratio defense leg (asset-level self-calibration) | ✅ Full block & downgrade | 🔁 Also follows phased DCA (OR-ed with VIX leg into a single plan, 2026-06-13 ruling) | Same as above |
| Trailing PE valuation tier | ✅ | ❌ Not fed (Gold has no earnings; valuation brief only for equities) | utils/valuation.py |
| CNN Fear & Greed | ✅ (graceful degradation) | Follows market-level sentiment brief (not a gold-specific signal) | utils/sentiment.py |
| Currency factors (DXY + TIP real rate proxy) | ❌ | ✅ (Fed into Macro prompt) | Macro dimension |
| Event layer (News RAG + EVENT_STANCE) | ✅ (via symbol_map proxy mapping) | ✅ (gold/bullion/xau entity fallback + persistent gold queries) | services/symbol_map.py |
| COT positioning (CFTC non-commercial net positions) | ❌ | ❌ Not fed for now — test_ta experiment mechanically mapped 2022: 61.3% vs baseline 51.4% (not significant); queued for forward validation | wiki 16 §5b residual clue |
Gold Defense Semantics: Phased DCA (2026-06-13 Ruling, Replaces Old "Full Block")
- Hypothesis: Gold is biphasic (sold off during liquidity crunches → safe-haven buying takes over). Therefore, "high VIX fully blocks buys" is both wrong (median is right-skewed, typical rallies are missed) and cannot be fully allowed (thick left tail, crunch drawdowns are real and deeper during fit periods).
- What this defense leg protects me from (User §0-C ruling): Liquidity crunch deep drawdowns during high VIX periods (left-tail risk), not the frequency of losses, nor missing typical rallies. Both original statistical criteria (p_below / median right-skew) are rejected—they measure "frequency of ups and downs," not "left-tail protection."
- Action: When high VIX/ATR defense triggers, gold buys are no longer fully blocked, but forced into phased DCA—allow ⌈intent × 1/3⌉ per batch, at least 5 trading days between batches, maximum 3 batches per rolling 20-trading-day window; batches not meeting spacing/quota are temporarily held as HOLD. The VIX leg (market-level) and ATR leg (asset-level) are already OR-ed into a single
defense_flag_on, thus forming a single combined phased plan (not independent phasing per leg, which would compound to 1/9). - Parameter Nature: N=3 / 1/3 / 5 trading days = mechanism-chosen round numbers, not data-optimized—left-tail signals are based on only ~6-20 samples, statistically fragile. The direction relies on mechanism (gold biphasic nature), not these specific numbers. Future adjustments will be based on counterfactual ledger (
memory/.dreams/interventions.jsonl, rule=defense_gold_dca_*) verifying how much "phased vs lump sum" saves in drawdowns and how much it misses in typical rallies. - Cost (Honest Labeling): In typical scenarios, you will "pay the tuition of missed rallies for crash drawdown protection"—this is the trade-off the ruling accepts.
- Reversible:
verdict.gold_defense_dca_enabled=falsereverts to the old full-block behavior (dataclass default is off). Configuration incore/config/defaults.yaml, code incore/committee/cio_parse.py:parse_cio_memo+core/runner/intervention.py:_gold_defense_dca_gate. - The old validation script
scripts/validate_gold_defense.py(testing if "full block" PASSes) is now a historical artifact—the ruling no longer uses PASS/FAIL as the metric, but instead uses long-term ledger-based cost verification (comparing "full block vs phased vs no block" as a three-arm trial from the ledger perspective). Background in wiki 12 #6, wiki 18 §5.
Maintenance Rules
- When a new feature goes live, add a row to the matrix. Explicitly mark ✅/❌/⚠️ for each asset class. No default inheritance is allowed.
- A change from ❌→✅ or a change in ⚠️ status requires: a pre-registered validation script + fit/OOS PASS (ADR-010 rule 4) or counterfactual ledger evidence with ≥20 independent samples from a cost perspective.
- Consistent with the [strategy decision constraints] and 16-ta-analysts-experiment principle of "data on the table, LLM does not add votes": Features are deterministic fact blocks, not voting seats.