7.7 KiB
Handover — Trading Web Redesign + Cross-Workspace Audit
Last updated: 2026-05-04
Last session: Claude Code, single contributor
Repos touched: learning_ai_invt_trdg (this repo), learning_ai_common_plat (sibling)
TL;DR
This repo had a recent web-dashboard redesign (commits f62c3b1, 938ed86)
that wired up live Alpaca + FMP data, a strategy builder (visual + code),
and a screener. A subsequent audit (4a09d4b) catalogued 52 issues across
7 buckets; commits ddbffb6 and 255bb07 cleared the 5 critical broken
integrations and the stray-lockfile mess. Buckets B–G remain open and
documented in docs/AUDIT_REDESIGN.md.
What's working right now
| Path | Status |
|---|---|
web/ build |
✅ npm --prefix web run build → 1.08 MB bundle, no errors |
web/ typecheck |
✅ npm --prefix web run typecheck → 0 errors |
web/ tests |
⚠️ 151 / 155 pass — 4 pre-existing failures (see audit F7, F8) |
backend/ typecheck |
✅ npx tsc --noEmit -p backend/tsconfig.json → 0 errors |
/api/chart/bars (equity+crypto) |
✅ Routes equities to v2/stocks, crypto (BTC/USD) to v1beta3/crypto |
/api/news + RightPanel |
✅ Auth header now sent (was 401-ing every render before commit ddbffb6) |
/api/backtest/run from CodeStrategyEditor |
✅ Correct endpoint + payload shape after ddbffb6 |
/api/profiles from VisualRuleBuilder |
✅ Uses canonical createTradeProfile() shape |
Strategy builder (/research → Visual Builder, Code Editor) |
✅ UIs land; persistence verified by typecheck only — no e2e |
Screener (/screener) |
✅ Live FMP, sortable, click-to-load |
| Live market indices in Header | ✅ SPY/DIA/QQQ poll every 60s |
Critical context for the next dev
1. Lockfile situation (READ THIS FIRST)
web/package.json declares react-router-dom, @monaco-editor/react,
@dnd-kit/{core,sortable,utilities} but the root pnpm-lock.yaml
doesn't reflect them yet. The previous session installed those via
npm install inside web/ as a workaround for a Vite vendor-resolve
issue, which left stray web/package-lock.json etc. — those are now
git-ignored (commit 255bb07).
Action required before CI green: regenerate the root lockfile from a
consistent package source, then commit the result. For a sibling
learning_ai_common_plat checkout on this host, run:
pnpm run install:common-plat -- --no-frozen-lockfile
git add pnpm-lock.yaml
git commit -m "chore(E2): regen root lockfile with new web deps"
git push
If you need the registry path instead, run
BYTELYST_PACKAGE_SOURCE=gitea pnpm install -r --no-frozen-lockfile with
GITEA_NPM_TOKEN exported.
This is item E2 in docs/AUDIT_REDESIGN.md. CI will fail until it lands.
2. Pre-existing test failures (NOT my regressions)
Four tests fail on npm --prefix web test. All pre-date this redesign:
useTabFeatureFlags.dom.test.tsx(3 failures): module-level cache leaks between tests — test 2 cachesmarketplace: false, tests 3–5 expect the defaulttrue. Fix:vi.resetModules()inbeforeEachor expose a cache-reset helper from the hook.EntryForm.dom.test.tsx > alerts error when trade execution fails: pre-existing intermittent — test waits foralertMockbut the component no longer callsalert()synchronously after the trade-API change.
These are tracked as audit items F7 and F8.
3. The audit doc is the source of truth
docs/AUDIT_REDESIGN.md has the full issue list (52 items, 7 buckets).
Each row has a status box (⬜ open / 🟦 in PR / ✅ fixed) and a slot for
the fix-commit hash. Update it as you close items — the format is:
| # | Issue | Severity | Status | Fix commit |
|---|
Keep commits scoped (one bucket or one item per commit) and reference the
ID in the subject — e.g. fix(B1): wire RSI/MACD/BB indicator overlays.
That's the convention we used for the 5 already-closed items.
Suggested next steps (in priority order)
- E2 — regenerate root lockfile (1 command, 1 commit). Unblocks CI.
- B1 — Build the RSI/MACD/Bollinger indicator overlays under
StockChartinweb/src/views/HomeView.tsx. The plan called for them and theIndicatorPanelcomponent was never built. Pure client-side compute from existing OHLCV bars; no new endpoints needed. - B2 + B3 — Wire the Watchlist (★) and notifications (🔔) buttons in
TickerHeader, and pull the company name fromfetchResearchProfileinstead of using the symbol as a placeholder. - C1 — Sandboxing for code strategies.
CodeStrategyEditorPOSTs user-authored JS to/api/backtest/runwithstrategyConfig.type == 'code'. Backend currently has no handler for that type — first step is to either (a) add a sandboxedvm2/isolated-vmrunner, or (b) rejecttype: 'code'with 400 and document the escape hatch. - C2 — Add an in-memory FMP response cache (key by URL, 30-min TTL). Free tier is 250 req/day; one Home view = 3 reqs.
- F6 — Tests for the 7 new backend endpoints. Easy wins.
- G1–G4 — Mobile parity. Mobile app (
mobile/) has none of the new features (news, research, screener). Decide scope first — code editor probably shouldn't ship to mobile.
Buckets D (UX polish) and W (lint warnings) are nice-to-haves.
Repo state checklist
# Verify clean state before starting
cd /Users/saravana/BytelystAI/trading/learning_ai_invt_trdg
git status # should show only nomgap WIP if any
git log --oneline -10 # last commit should be 4a09d4b or later
ls -la .claude/ 2>&1 | head -1 # gitignored — won't show in status
# Run the verification gates
npm --prefix web run typecheck # → 0 errors
npm --prefix web run build # → ✓ built
npm --prefix web test # → 151 pass / 4 known fails
npx tsc --noEmit -p backend/tsconfig.json # → 0 errors
Branches & backups
main— current workbackup/main-20260504-061739— snapshot ofmaintaken before the audit-fix commits. Roll back withgit reset --hard backup/main-20260504-061739if anything goes wrong.
Sibling repo learning_ai_common_plat also has a backup branch
backup/main-20260504-062733 taken from its origin/main HEAD 46a16f0.
Vendored @bytelyst/* packages
web/ consumes 9 vendored packages from vendor/bytelyst/. These are
read-only copies of the platform packages (sourced from
learning_ai_common_plat). Don't edit them here — fix upstream and
re-vendor.
The Vite alias config (web/vite.config.ts) has a bytelystAlias()
helper that prefers web/node_modules/@bytelyst/* and falls back to
vendor/bytelyst/*. If you add new platform deps to web/package.json,
they'll resolve from web/node_modules (the npm-installed copy) — not
the vendored one. That's intentional but worth knowing if you debug
weird "two copies of React" errors.
Contact / context
Original redesign plan lived at
/Users/saravana/.claude/plans/i-want-to-build-woolly-adleman.md (local
file, not in repo). It described the 6-phase build (UI shell → live
data → strategy builder → screener → mobile). Phases 1–6 web-side are
landed; mobile (phase 7 implicitly) is the remaining greenfield.