Skip to content

feat: MarketWatch finance app (#185)#192

Merged
robbiebyrd merged 8 commits into
mainfrom
feat/marketwatch
Jul 12, 2026
Merged

feat: MarketWatch finance app (#185)#192
robbiebyrd merged 8 commits into
mainfrom
feat/marketwatch

Conversation

@robbiebyrd

Copy link
Copy Markdown
Collaborator

Closes #185.

A Mac OS 8-style MarketWatch finance app that replays the September 2001 market timeline in sync with the virtual clock: quote board (2001 Dow 30 + airlines/insurers/brokers/defense/travel), index tiles (DJIA, S&P 500, Nasdaq, 10-yr Treasury yield), a market-status banner, and a CNBC-style scrolling ticker tape.

How it works

  • Data: one static, immutable JSON bundle (56 symbols, 472 daily bars, Sep 4–21 2001) generated offline by the new packages/tools/market-data tool (Yahoo chart API un-adjusted back to as-printed prices + FRED DGS10 + hand-curated archival overrides), uploaded to Wasabi, served at files.911realtime.org/market/market-data.json (infra allow-list: Keeping-History/infra@e91234c). No backend/streamer changes.
  • Market state: marketClock.ts reduces the virtual clock over the bundle's session/closure calendar to open | closed | halted. On 9/11 the open never arrives; the tape freezes at 9/10 closes under a TRADING HALTED banner until the 9/17 reopening. The bond market resumes 9/13 (visible in the 10-yr tile during the equity halt).
  • Intraday movement: syntheticIntraday.ts builds a deterministic per-symbol path pinned to each day's real open/high/low/close (seeded PRNG keyed on symbol+date — same minute, same price, every client). This module is the single seam to swap in real minute bars later.

Delisted-symbol data provenance

Free sources don't carry AMR, UAL, LEH, MER, EK, old-GM, old-AT&T, etc. — today's same-name tickers are different companies. market_data/overrides.json hand-curates all 15 with full real OHLC (except old-AT&T: conservative endpoint spans) from:

  • Wayback-archived Yahoo daily CSVs whose capture date precedes the ticker's lineage break (several archived in 2001 itself); they matched archived CNNfn Dow-30/sector tables to the penny wherever both exist
  • A GitHub unadjusted dataset admitted per-symbol only where its 9/10, 9/17, 9/18 closes match independently established CNN values exactly
  • Contemporaneous CNN/CNNfn articles via Wayback (each override carries its citations)

The generator is fail-loud: it refuses to emit on any missing required date, anchor mismatch (DJIA 9605.51 → 8920.70), or spot-check drift.

Verification

  • 453/453 frontend tests, tsc -b, eslint, 27 pytest, ruff — all green
  • Runtime-verified via Playwright against the dev server + live Wasabi bundle:
    • 9/10 1:40 PM ET — MARKET OPEN, prices re-derive per clock step (DJIA tile changes minute to minute)
    • 9/11–9/16 — TRADING HALTED + closure reason, tape frozen at exact 9/10 closes (AMR 29.70 ▼0.45), 10-yr yield resumes 9/13
    • 9/17 9:36 AM — reopening crash: AMR 16.02 ▼13.68 (real 16.00 open), UAL 18.19, RTN ▲9.98 defense rally, Boeing −17.02% on the board

🤖 Generated with Claude Code

https://claude.ai/code/session_01QUazFBgLE84XSuHeAYkmbF

Robbie Byrd and others added 8 commits July 10, 2026 22:25
…ch (#185)

Defines the market-data.json contract (calendar with sessions/closures,
per-symbol daily bars in as-printed 2001 prices) and the curated ~55-symbol
list with verified Yahoo lineage mappings (HWP→HPQ, MWD→MS, UTX→RTX, SBC→T)
and the 14 delisted symbols that need hand-entered overrides.

Co-Authored-By: Claude Fable 5 <[email protected]>
…l-loud validation

Fetches daily bars for all 41 sourced symbols (verified live: anchors match,
DJIA 9/10 = 9605.51), un-adjusts Yahoo's split-adjusted closes back to
as-printed 2001 prices, parses FRED DGS10, builds the Sept-2001 equity/bond
calendar, and refuses to emit unless every symbol covers the required dates
and matches archival spot-checks. 27 offline tests, ruff clean.

MMC moved to override sourcing (Yahoo no longer serves any MMC data).

Co-Authored-By: Claude Fable 5 <[email protected]>
…raday (#185)

marketClock reduces a virtual-clock UTC instant over the bundled market
calendar (closure outranks session: 9/11's open never rings) and picks the
display session (frozen on 9/10 through the closure week). syntheticIntraday
builds a deterministic per-(symbol,date) minute path from daily OHLC via
chained seeded Brownian bridges through explicit high/low touch points —
open/close pins and extreme touches are exact by construction. 21 tests.

Co-Authored-By: Claude Fable 5 <[email protected]>
…symbols (#185)

Every bar carries a citation; sources are pre-lineage-break Wayback captures
of Yahoo daily CSVs (several archived in 2001 itself), a GitHub unadjusted
dataset admitted only where its closes match independently-established CNN
values, and contemporaneous CNN/CNNfn articles. All 15 symbols have full
real OHLC for 9/7, 9/10, 9/17, 9/18 except old-AT&T (T), whose high/lows
are conservative endpoint spans.

Co-Authored-By: Claude Fable 5 <[email protected]>
@robbiebyrd robbiebyrd enabled auto-merge July 12, 2026 20:51
@github-actions

Copy link
Copy Markdown

Playwright E2E — 1 passed · 0 failed · 0 flaky · 0 skipped

Full report

@robbiebyrd robbiebyrd merged commit ab51376 into main Jul 12, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add financial app

1 participant