Summary
Production publishes all 12 sector price records, but valuation enrichment is completely absent. Both the direct Yahoo quoteSummary request and the Decodo proxy fallback return HTTP 401, so every five-minute cycle writes market:sectors:v2 with 0 valuations while reporting Redis success.
This is a persistent partial-coverage bug, not a total market-data outage: price changes remain available, but trailing/forward P/E, beta, YTD return, three-year return, and five-year return are missing for every sector ETF.
Priority: P2. Core 12/12 sector prices remain available, but an entire enrichment dimension is continuously lost and current health semantics mask it.
Production evidence
Observed on Railway production on 2026-07-31.
Three consecutive cycles:
2026-07-31T05:22:24Z [Market] Seeded 12/12 sectors, 0 valuations (redis: OK)
2026-07-31T05:27:27Z [Market] Seeded 12/12 sectors, 0 valuations (redis: OK)
2026-07-31T05:32:34Z [Market] Seeded 12/12 sectors, 0 valuations (redis: OK)
Latest bounded 15-minute sample:
- 46 direct
Yahoo quoteSummary <symbol> HTTP 401 log entries
- 10 proxy
Yahoo quoteSummary <symbol> proxy HTTP 401 log entries
- proxy cooldown activates after repeated failures
- sector price publishing remains 12/12 and Redis writes remain OK
No overlapping WorldMonitor issue or pull request was found using searches for sector valuation, quoteSummary, 0 valuations, and Yahoo 401.
Current code path
scripts/ais-relay.cjs:
fetchYahooQuoteSummary() calls Yahoo /v10/finance/quoteSummary/<symbol> directly.
_yahooQuoteSummaryProxyFallback() retries the same endpoint through Decodo.
seedSectorSummary() accepts an empty valuations object and still publishes the 12 sector price records and healthy seed metadata.
Because direct and proxy egress receive the same 401 class, repeatedly retrying this route is not a credible restoration strategy.
Impact
market:sectors:v2 has current sector price changes but no valuation records.
- UI, bootstrap, and MCP consumers can present sector performance while silently lacking valuation context.
seed-meta:market:sectors records only the 12 price rows, so health cannot distinguish full coverage from 12 prices plus 0 valuations.
- The relay generates repeated provider-error noise and unnecessary proxy traffic every five minutes.
Scope
Diagnose the Yahoo authentication/endpoint behavior from Railway and restore valuation enrichment using a sustainable route or provider. Do not merely add more retries to the same direct/proxy request.
Preserve truthful partial-coverage semantics if valuation data is temporarily unavailable. A last-good valuation fallback is acceptable only with explicit source timestamp and stale/degraded status.
Acceptance criteria
Summary
Production publishes all 12 sector price records, but valuation enrichment is completely absent. Both the direct Yahoo
quoteSummaryrequest and the Decodo proxy fallback return HTTP 401, so every five-minute cycle writesmarket:sectors:v2with0 valuationswhile reporting Redis success.This is a persistent partial-coverage bug, not a total market-data outage: price changes remain available, but trailing/forward P/E, beta, YTD return, three-year return, and five-year return are missing for every sector ETF.
Priority: P2. Core 12/12 sector prices remain available, but an entire enrichment dimension is continuously lost and current health semantics mask it.
Production evidence
Observed on Railway production on 2026-07-31.
Three consecutive cycles:
Latest bounded 15-minute sample:
Yahoo quoteSummary <symbol> HTTP 401log entriesYahoo quoteSummary <symbol> proxy HTTP 401log entriesNo overlapping WorldMonitor issue or pull request was found using searches for
sector valuation,quoteSummary,0 valuations, andYahoo 401.Current code path
scripts/ais-relay.cjs:fetchYahooQuoteSummary()calls Yahoo/v10/finance/quoteSummary/<symbol>directly._yahooQuoteSummaryProxyFallback()retries the same endpoint through Decodo.seedSectorSummary()accepts an emptyvaluationsobject and still publishes the 12 sector price records and healthy seed metadata.Because direct and proxy egress receive the same 401 class, repeatedly retrying this route is not a credible restoration strategy.
Impact
market:sectors:v2has current sector price changes but no valuation records.seed-meta:market:sectorsrecords only the 12 price rows, so health cannot distinguish full coverage from 12 prices plus 0 valuations.Scope
Diagnose the Yahoo authentication/endpoint behavior from Railway and restore valuation enrichment using a sustainable route or provider. Do not merely add more retries to the same direct/proxy request.
Preserve truthful partial-coverage semantics if valuation data is temporarily unavailable. A last-good valuation fallback is acceptable only with explicit source timestamp and stale/degraded status.
Acceptance criteria
12/12 sectors, 0 valuationsas fully healthy.