PQAP Dashboard Verification Plan

Created: 2025-12-25 Target: localhost:8080 Purpose: Comprehensive verification of all dashboard data feeds and views after recent fixes


Executive Summary

This verification plan coordinates parallel checks across all PQAP dashboard pages to ensure: 1. All data displays correctly after recent fixes 2. Cross-page data consistency is maintained 3. No regressions in existing functionality

Recent Fixes Being Verified

  1. Signals Page - TIME and DIRECTION columns now show proper values
  2. Dashboard Page - Data consistency with Trades page (paper trading as source of truth)
  3. Position Display - Field name transformations from raw data to template

Verification Tasks

TASK GROUP A: Dashboard Page (localhost:8080/dashboard)

Priority: HIGH Dependencies: None (can run in parallel with B, C, D, E)

A1: Portfolio Stats Card Verification

Element Expected Behavior Check
Portfolio Value Shows paper trading total_value (e.g., $100+) [ ]
Total P&L Shows paper trading total_pnl, colored green/red [ ]
Today's P&L Shows daily_pnl value (may be 0 if no daily tracking) [ ]
Active Positions Count matches actual open positions list [ ]
Win Rate Percentage from strategy wins/total_trades [ ]
Total Trades Sum of all strategy trades [ ]

A2: P&L Chart Verification

Element Expected Behavior Check
Chart canvas Renders if > 1 data point exists [ ]
Empty state Shows "Collecting data" if insufficient data [ ]
Labels Show date format MM/DD [ ]
Values Show dollar amounts [ ]

A3: Active Positions Section

Element Expected Behavior Check
Position cards Each has: market_title, side badge, size, entry, current, unrealized P&L [ ]
Side badge Shows LONG (green) or SHORT (red) based on position.side [ ]
Unrealized P&L Colored appropriately (positive=green, negative=red) [ ]
Empty state Shows "No active positions yet" if positions array is empty [ ]

A4: Recent Trades Section

Element Expected Behavior Check
Trade items Show market_title or outcome_name as fallback [ ]
Trade meta Shows strategy_id and timestamp (first 16 chars) [ ]
Trade value Formatted as dollar amount [ ]
Trade P&L Shows +/- with appropriate coloring [ ]
Limit Shows last 5 trades only [ ]

A5: Strategy Status Table

Element Expected Behavior Check
Strategy ID Primary identifier in bold [ ]
Name Shows below strategy_id in gray [ ]
Status badge "Active" (green) or "Inactive" (red), plus "Auto-disabled" if applicable [ ]
Capital Shows allocated_capital formatted [ ]
P&L Shows total_pnl with color coding [ ]
Trades Shows total_trades count [ ]
Win Rate Shows percentage [ ]
24h Signals Format: "X (Y exec)" [ ]

TASK GROUP B: Trades Page (localhost:8080/trades)

Priority: HIGH Dependencies: None

B1: Tab Navigation

Element Expected Behavior Check
Positions tab Active by default, highlighted [ ]
Trade History tab Clickable, switches content [ ]
Tab switching Content changes appropriately [ ]

B2: Positions Tab - Key Metrics

Element Expected Behavior Check
Total Value Matches dashboard portfolio value [ ]
Return Shows return_pct with % symbol [ ]
Cash/Positions Shows available_capital / position_value [ ]
Total Trades Matches dashboard total_trades [ ]

B3: Positions Tab - Open Positions Table

Element Expected Behavior Check
Market column Shows market_question [ ]
Outcome column Shows outcome name [ ]
Size column Formatted number [ ]
Entry column Price with 4 decimal places [ ]
Current column Price with 4 decimal places [ ]
P&L column Unrealized P&L with color [ ]
Closed filter Positions with closed=True are hidden [ ]

B4: Positions Tab - Recent Trades Preview

Element Expected Behavior Check
Time column Timestamp first 19 chars [ ]
Strategy column Strategy ID [ ]
Side column BUY/SELL with direction class [ ]
Outcome column Outcome name [ ]
Size/Price/Value Formatted numbers [ ]
Limit Shows last 20 trades [ ]

B5: Trade History Tab - Summary Stats

Element Expected Behavior Check
Total Trades Count of filtered trades [ ]
Total P&L Sum of P&L with coloring [ ]
Win Rate Percentage [ ]
Total Fees Sum of fees [ ]

B6: Trade History Tab - Filters

Element Expected Behavior Check
Strategy dropdown Lists all available strategies [ ]
Side dropdown BUY/SELL options [ ]
Date From/To Date picker inputs [ ]
Apply Filters Submits form, reloads with filters [ ]
Reset Clears all filters [ ]
Export CSV Downloads CSV file [ ]

B7: Trade History Tab - Trades Table

Element Expected Behavior Check
Time Formatted datetime [ ]
Strategy Strategy ID in bold [ ]
Market Market title (truncated if long) [ ]
Side badge BUY (green) / SELL (red) [ ]
Price/Size/Fee/P&L Formatted numbers [ ]
Pagination Shows page X of Y, Previous/Next buttons [ ]

B8: Portfolio Chart

Element Expected Behavior Check
Chart renders Fetches from /api/paper/history [ ]
Time range selector Options: 1h, 6h, 12h, 24h, 48h, All [ ]
Chart updates Responds to time range changes [ ]

TASK GROUP C: Signals Page (localhost:8080/signals)

Priority: CRITICAL (Recent fixes) Dependencies: None

C1: Summary Stats Cards

Element Expected Behavior Check
Total Signals Count of all signals [ ]
Executed Count where executed=1 (green) [ ]
Rejected Count where rejected_reason exists (red) [ ]
Pending Count of non-executed, non-rejected [ ]

C2: Signals Table - TIME Column (FIX VERIFICATION)

Element Expected Behavior Check
Timestamp display Shows actual timestamp, NOT "-" [ ]
Format First 19 characters of timestamp or created_at [ ]
Fallback Uses created_at if timestamp is null [ ]

C3: Signals Table - DIRECTION Column (FIX VERIFICATION)

Element Expected Behavior Check
Direction badge Shows BUY (green) or SELL (red), NOT "UNKNOWN" [ ]
Data source Uses signal_type field, uppercased [ ]
Badge styling Correct CSS class applied [ ]

C4: Signals Table - Other Columns

Element Expected Behavior Check
Strategy Shows strategy_id [ ]
Confidence Shows strength as percentage if <= 1, raw value otherwise [ ]
Market ID Truncated if > 20 chars, with title tooltip [ ]
Executed badge "Yes" (green) or "No" (gray) [ ]
Rejected Reason Shows reason or "-" [ ]

C5: Pagination

Element Expected Behavior Check
Info text "Showing X-Y of Z items" [ ]
Page size 25 rows per page [ ]
Previous/Next Disabled appropriately at bounds [ ]
Page numbers With ellipsis for large sets [ ]

TASK GROUP D: Markets Page (localhost:8080/markets)

Priority: MEDIUM Dependencies: None

D1: Stats Section

Element Expected Behavior Check
Total Markets Shows total_markets count [ ]
Showing Shows markets array length (max 100) [ ]

D2: Markets Table

Element Expected Behavior Check
Question column Market question text (truncated) [ ]
YES Price Price value [ ]
NO Price Price value [ ]
Sum YES + NO price sum [ ]
24h Volume Volume figure [ ]
Actions "View" link to Polymarket if slug exists [ ]
Arb highlight Row highlighted if sum < 0.98 [ ]

D3: Pagination

Element Expected Behavior Check
Page controls Same as Signals page pagination [ ]
25 rows per page Default page size [ ]

TASK GROUP E: Strategies Page (localhost:8080/strategies)

Priority: MEDIUM Dependencies: None

E1: Summary Stats

Element Expected Behavior Check
Total Strategies Count of strategies [ ]
Active Strategies Count of enabled strategies [ ]
Total P&L Sum of all strategy P&L with coloring [ ]
Avg Win Rate Average win rate percentage [ ]

E2: Strategy Cards

Element Expected Behavior Check
Card border Green (active), gray (inactive), orange (auto-disabled) [ ]
Strategy ID Header text [ ]
Version/Name Shows version and name [ ]
Toggle switch Checkbox state matches enabled [ ]
Status badge Correct badge type and text [ ]

E3: Strategy Card Stats

Element Expected Behavior Check
Allocated Capital Formatted dollar amount [ ]
P&L With color coding [ ]
Total Trades Count [ ]
Win Rate Percentage [ ]
Wins/Losses Colored counts [ ]
Last Trade Formatted timestamp or "Never" [ ]

E4: Signal Chart

Element Expected Behavior Check
24h summary "X (Y executed)" format [ ]
Bar chart 24 bars representing hours [ ]
Bar height Proportional to signal count [ ]

E5: Control Buttons

Element Expected Behavior Check
Edit Capital Opens modal [ ]
Disable Triggers disable API call [ ]
Toggle switch Enables/disables strategy [ ]

TASK GROUP F: Cross-Page Data Consistency

Priority: CRITICAL Dependencies: Complete A, B first

F1: Portfolio Value Consistency

Check Pages to Compare Expected
Total Value Dashboard vs Trades (Positions tab) MUST MATCH
Source Both use paper_trading_provider Same data source

F2: Position Count Consistency

Check Pages to Compare Expected
Open Positions Dashboard (count) vs Trades (table rows) MUST MATCH
Filter logic Both exclude closed positions Same filtering

F3: P&L Consistency

Check Pages to Compare Expected
Total P&L Dashboard vs Trades summary MUST MATCH
Per Strategy Dashboard table vs Strategies page MUST MATCH

F4: Trade Count Consistency

Check Pages to Compare Expected
Total Trades Dashboard vs Trades (summary) MUST MATCH
Sum of strategies Dashboard table sum vs displayed total MUST MATCH

F5: Win Rate Consistency

Check Pages to Compare Expected
Portfolio Win Rate Dashboard vs calculated from strategies MUST MATCH
Strategy Win Rates Dashboard table vs Strategies page MUST MATCH

Data Source Reference

Paper Trading Provider (Source of Truth for Positions/Trades)

# Returns:
{
    "summary": {
        "total_value": float,
        "total_pnl": float,
        "return_pct": float,
        "starting_capital": float,
        "available_capital": float,
        "position_value": float,
        "open_positions": int,
        "total_trades": int,
        "unrealized_pnl": float
    },
    "positions": [...],
    "trades": [...]
}

Strategy Controller (Source of Truth for Strategy Metrics)

# get_strategy_status returns:
{
    "strategy_id": str,
    "name": str,
    "version": str,
    "enabled": bool,
    "auto_disabled": bool,
    "auto_disable_reason": str | None,
    "allocated_capital": float,
    "performance": {
        "total_trades": int,
        "total_pnl": float,
        "wins": int,
        "losses": int,
        "win_rate": float
    },
    "signals_24h": {...},
    "last_signal_at": str | None,
    "last_trade_at": str | None
}

Signals Provider

# Each signal:
{
    "signal_id": str,
    "strategy_id": str,
    "market_id": str,
    "signal_type": str,  # "BUY" or "SELL"
    "strength": str | float,
    "executed": int,  # 0 or 1
    "rejected_reason": str | None,
    "timestamp": str,  # or created_at
    "created_at": str
}

Verification Execution Plan

Phase 1: Parallel Page Checks (Can run simultaneously)

  1. Agent A: Execute Task Groups A, F (Dashboard + Cross-page)
  2. Agent B: Execute Task Group B (Trades page)
  3. Agent C: Execute Task Group C (Signals page - CRITICAL)
  4. Agent D: Execute Task Groups D, E (Markets + Strategies)

Phase 2: Integration Verification

After Phase 1 completes: 1. Collate all F (cross-page consistency) results 2. Identify any discrepancies 3. Report findings

Expected Verification Time

  • Phase 1: 5-10 minutes per agent (parallel)
  • Phase 2: 5 minutes (sequential)
  • Total: ~15 minutes

Success Criteria

Critical (Must Pass)

  • [ ] Signals page TIME column shows actual timestamps
  • [ ] Signals page DIRECTION shows BUY/SELL badges
  • [ ] Dashboard and Trades page portfolio values match
  • [ ] Position counts are consistent across pages
  • [ ] No JavaScript console errors on any page

High Priority (Should Pass)

  • [ ] All pagination works correctly
  • [ ] All charts render (or show proper empty states)
  • [ ] Strategy enable/disable toggles function
  • [ ] Filter forms submit and apply correctly

Medium Priority (Nice to Have)

  • [ ] Auto-refresh timers working
  • [ ] Export CSV downloads successfully
  • [ ] All tooltips display correctly
  • [ ] Responsive layout on smaller screens

Issue Reporting Template

For any failures, use this format:

Page: [Page Name]
Task: [Task ID]
Element: [Element Name]
Expected: [Expected Behavior]
Actual: [What Actually Happened]
Screenshot: [If applicable]
Console Errors: [Any JS errors]

Post-Verification Actions

  1. All Pass: Update research_log.md with verification completion
  2. Critical Failures: Create fix tasks, re-verify after fixes
  3. Minor Issues: Log for future improvement, not blocking

System Overview

Polymarket API

Market data source

Data Collector

Every 5 minutes

SQLite Database

Price history + trades

Strategy Engine

Signal generation

ML Model

XGBoost (72% acc)

Execution Engine

Paper trading

Dashboard

You are here!

Telegram

Alerts & updates

Trading Strategies

Each strategy looks for different market inefficiencies:

Dual Arbitrage Active

Finds when YES + NO prices don't add to 100%. Risk-free profit.

Mean Reversion Active

Buys when price drops too far from average, sells when it recovers.

Market Maker Active

Places bid/ask orders to capture the spread.

Time Arbitrage Active

Exploits predictable price patterns at certain hours.

ML Prediction Active

Uses machine learning to predict 6-hour price direction.

Value Betting Disabled

Finds underpriced outcomes based on implied probability.

Data Storage (Single Source of Truth)

All data lives on EC2. Local machines are for development only. The EC2 instance is the authoritative source for all market data, trades, and positions.
Database Purpose Location
market_history.db Price snapshots every 5 minutes (8.2 MB) EC2 (primary)
pqap_staging.db Trades, positions, P&L history EC2 (primary)
paper_trading_state.json Current portfolio state EC2 (primary)

Environment Architecture

EC2 (Production)

  • Runs 24/7
  • All databases live here
  • Executes all trades
  • Single source of truth

Local (Development)

  • For code changes only
  • Syncs code to EC2
  • No production data
  • Can be turned off

Environment Details

Component Details
Dashboard URL https://pqap.tailwindtech.ai
Server AWS EC2 (us-east-1)
SSL Let's Encrypt via Traefik
Mode Paper Trading (simulated)

How It Works (Simple Version)

1. Data Collection: Every 5 minutes, we fetch prices from Polymarket for 50 markets and save them to our database.

2. Analysis: Our strategies analyze this data looking for patterns - like prices that moved too far from normal, or markets where the math doesn't add up.

3. Signals: When a strategy finds an opportunity, it generates a "signal" - a recommendation to buy or sell.

4. Execution: The execution engine takes these signals and simulates trades (paper trading). Eventually, this will place real orders.

5. Monitoring: This dashboard shows you what's happening. Telegram sends alerts for important events.