Skip to content

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 ​

FeatureEquities (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 belowSame 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 validationwiki 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=false reverts to the old full-block behavior (dataclass default is off). Configuration in core/config/defaults.yaml, code in core/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 ​

  1. When a new feature goes live, add a row to the matrix. Explicitly mark ✅/❌/⚠️ for each asset class. No default inheritance is allowed.
  2. 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.
  3. 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.