Owner: Kristerpher Henderson Last updated: 2026-05-03 Anchor epic: #256 Deliverable card: #265
| Gate | Status | Owner | Notes |
|---|---|---|---|
| All Wave 1 polish merged (#922 #923 #924) | ✅ 2026-05-03 03:53 UTC | feature-dev | Settings, StrategyComparison, Trading |
| Wave 2 polish merged (#926 #927 #928 #930) | ✅ 2026-05-03 04:05 UTC | feature-dev | Backtest, HistoricalData, Dashboard, SetupWizard |
ENABLE_OPTIONS_BACKTEST gate (#929/#257) |
✅ 2026-05-03 03:59 UTC | feature-dev | Default false — flag-gated, no UI exposure |
Backend deploy to raxx-api-prod |
⏳ Blocked on HEROKU_API_KEY GH secret refresh (#925) |
operator | Vault token valid; GH Actions secret stale |
| Antlers deploy to CF Pages | ✅ — auto-deploys per merge | CF Pages | Live within ~3 min of each merge |
Smoke test on raxx-api-staging (post-token-fix) |
⏳ | release owner | Run after HEROKU_API_KEY resync |
| Attorney sign-off (#197) | ⏳ | Matthew Crosby | Out of scope — last gate before GA |
app.raxx.app for the first time → redirected to /setup-wizard/dashboard/api/historical-data resolves.feed_unavailable, rate_limited, feed_disabled, feed_credentials_missing — each with a Retry button.settings.tradingMode.ENABLE_OPTIONS_BACKTEST=false, renders the OptionsBacktestComingSoon panel instead of the options form. No options backtest can be triggered.friendlyError() — no raw delayed_sip / internal feed IDs leak to UI copy.settings.tradingMode.broker-credentials-missing, broker-rate-limited, broker-feed-disabled, broker-unavailable.<button> elements (not bare <div>).LIVE TRADING exactly before commit.ENABLE_OPTIONS_BACKTEST: false with a "Coming soon" badge + tooltip explaining the data-licensing gate.ENABLE_OPTIONS_BACKTEST=false./options-backtest route, the StrategyComparison "Add options strategy" affordance.<OptionsBacktestComingSoon /> instead of the actual options-backtest UI./api/backtest/options route returns 503 {"feature": "options_backtest", "enabled": false} when the flag is off (defense in depth — frontend may be cached).| Page / surface | Loading state | Empty state | Typed error states | Paper/live badge | Vendor-name-free | Mobile 390 px | 44 px tap targets |
|---|---|---|---|---|---|---|---|
| Dashboard | ✅ #928 | ✅ #928 | ✅ is_mock → demo |
n/a | ✅ #928 | ✅ | ✅ |
| HistoricalData | ✅ #927 | ✅ #927 | ✅ 4 feed states | n/a | ✅ #927 | ✅ | ✅ |
| Backtest | ✅ #926 | ✅ #926 | ✅ friendlyError() |
✅ | ✅ #926 | ✅ | ✅ |
| Backtesting | ✅ #926 | ✅ #926 | ✅ friendlyError() |
✅ | ✅ #926 | ✅ | ✅ |
| StrategyComparison | ✅ #923 | ✅ #923 | ✅ | n/a | ✅ #923 | ✅ scroll-x | ✅ |
| Settings | ✅ #922 | ✅ #922 | ✅ live-mode guard | n/a (controls mode) | ✅ #922 | ✅ | ✅ |
| Trading | ✅ #924 | ✅ #924 | ✅ 4 broker states | ✅ persistent header | ✅ #924 | ✅ | ✅ |
| SetupWizard | ✅ #930 | ✅ #930 | ✅ symbol validation | n/a | ✅ #930 | ✅ | ✅ |
Smoke-test contract (frontend/trademaster_ui/src/tests/smoke.contract.test.js):
- Setup wizard shell renders ✅
- Setup data-retrieval contract ✅ (regex tolerates pre/post-polish copy)
- Historical data chart shell renders ✅
Backend smoke (scripts/ci/run_smoke.sh):
- /api/health 200 ✅
- /api/settings 200 with feature_flags.ENABLE_OPTIONS_BACKTEST: false ✅ (after Heroku deploy)
- /api/backtest/options returns 503 when flag off ✅ (after Heroku deploy)
⏳ Cannot run until
HEROKU_API_KEYGH Actions secret is refreshed (#925). After that:
# 1. Trigger deploy
gh workflow run deploy-heroku.yml -f environment=staging -f ref=main
# 2. Wait for deploy
gh run watch # pick the deploy-heroku.yml run
# 3. Verify staging
curl -sS https://api-staging.raxx.app/api/health
curl -sS https://api-staging.raxx.app/api/settings | jq '.feature_flags'
# expect: { "ENABLE_OPTIONS_BACKTEST": false }
# 4. Toggle flag on staging only
heroku config:set ENABLE_OPTIONS_BACKTEST=true -a raxx-api-staging >/dev/null 2>&1
curl -sS https://api-staging.raxx.app/api/settings | jq '.feature_flags.ENABLE_OPTIONS_BACKTEST'
# expect: true
# 5. Toggle back off before customer demo
heroku config:set ENABLE_OPTIONS_BACKTEST=false -a raxx-api-staging >/dev/null 2>&1
Walk Flows 1–7 against staging at https://app-staging.raxx.app (or local CRA proxied to staging API). Capture screenshots for the launch-readiness artifact.
HEROKU_API_KEY GH Actions secret (operator action #925)gh workflow run deploy-heroku.yml -f environment=staging -f ref=main → soak ~30 min on staginggh workflow run deploy-heroku.yml -f environment=production -f ref=maincurl https://api.raxx.app/api/settings | jq '.feature_flags'If the deploy is bad:
- heroku rollback v<previous> -a raxx-api-prod (Heroku release rollback is instant)
- Revert the offending PR via gh pr revert <num> and force-deploy
- Antlers: CF Pages preserves prior builds — toggle via CF dashboard if needed (no Antlers-side rollback strategy is automated yet — file as follow-up)
If ENABLE_OPTIONS_BACKTEST was flipped on by mistake:
- heroku config:set ENABLE_OPTIONS_BACKTEST=false -a raxx-api-prod >/dev/null 2>&1 (instant; takes effect on next request)
- Frontend cached settings refresh on next page load — communicate via Slack DM if customers active
GITHUB_API_SECRETS_TOKEN for autonomous secret rotation