pam ▸ docs/pam_trade_readiness_update_2026-05-30.md
updated 2026-05-30

Pam Trade Readiness Update - 2026-05-30

Current answer

Pam is still not ready for autonomous live trading. It is much closer to manual, tightly guarded order placement.

The immediate Polymarket issue is not a missing key. The configured key and proxy wallet initialize against CLOB v2, and Pam can sign a CLOB v2 order without posting it. The funding issue is that the proxy wallet holds legacy Polygon USDC.e, while current Polymarket CLOB v2 requires pUSD collateral and pUSD exchange allowance.

Verified state

Post-migration verification - 2026-05-30

After the Polymarket migration, Pam now sees the proxy wallet as funded for CLOB v2:

Live smoke-test result - 2026-05-30

A user-approved post-only BUY smoke test was attempted for 1 share at $0.01.

Result: Polymarket rejected the order with HTTP 403 before placement: Trading restricted in your region.

Follow-up checks:

This means Pam’s signing, funding, and allowance path is working, but this execution environment cannot currently place new Polymarket orders because of Polymarket’s geographic restrictions.

Kalshi live smoke test - 2026-05-30

A user-approved Kalshi post-only BUY smoke test was completed:

Pam can now place, inspect, and cancel a small Kalshi order through the live API path.

Post-test canaries:

Polymarket live smoke retry - 2026-05-30

After the geography change, the same one-share Polymarket smoke test reached the CLOB order endpoint but was rejected before placement because the order size was below Polymarket’s minimum:

The next Polymarket smoke test must use at least 5 shares. At $0.01, maximum risk is $0.05.

Polymarket live smoke test - 2026-05-30

A user-approved Polymarket post-only BUY smoke test was completed:

Pam can now place, inspect, and cancel a small Polymarket CLOB v2 order through the live API path from the current execution geography.

12-hour five-trade readiness plan - 2026-05-30

Goal: make it operationally possible to place five manually approved trades within the next 12 hours.

Current blockers:

What is now unblocked:

New operator tooling:

Candidate slate generated from fresh books, using 1 contract each, IOC, current marketable YES limit, and small max-cost caps:

# Venue Ticker Side Limit Max cost Title
1 Kalshi KXGOVTCUTS-28-750 YES $0.10 $0.10 Will government spending decrease by 750 before 2028?
2 Kalshi KXTRILLIONAIRE-30-MZ YES $0.08 $0.08 Will Mark Zuckerberg be the world’s first trillionaire?
3 Kalshi KXGOVTCUTS-28-2000 YES $0.26 $0.26 Will government spending decrease by 2000 before 2028?
4 Kalshi KXGOVTCUTS-28-500 YES $0.14 $0.14 Will government spending decrease by 500 before 2028?
5 Kalshi KXNEXTUKPM-30-ACAR YES $0.04 $0.04 Will Al Carns be the next Prime Minister of United Kingdom?

Total maximum entry cost for this proposed 5-ticket micro-slate: $0.62, before fees/slippage/rejection behavior.

Recommended execution workflow:

  1. Rerun python3 tools/production_canary.py.
  2. Rerun python3 tools/build_trade_tickets.py --count 5 --contracts 1 --max-resolution-days 1500 --max-price 0.30 --max-marketable-price-cents 35 --max-spread-bps 1000 --diversify-titles.
  3. Human explicitly approves the exact generated five-ticket slate.
  4. Execute one ticket at a time with tools/kalshi_order_post.py.
  5. After each order, immediately inspect status and balances.
  6. If any order rests unexpectedly under a non-IOC setting, cancel it before continuing.
  7. Stop after any API error, partial unexpected behavior, or slate mismatch.

This workflow is suitable for a small manual test slate. It is not yet suitable for unattended automated trading.

Higher-risk $50 cap update - 2026-05-30

User requested increasing total risk to $50.

Updated ticket-builder behavior:

Current regenerated five-ticket slate, capped by live top-of-book liquidity:

# Venue Ticker Side Limit Contracts Max cost
1 Kalshi KXNEXTISRAELPM-45JAN01-IKAT YES $0.24 37 $8.88
2 Kalshi KXNEWPOPE-70-PPIZ YES $0.11 90 $9.90
3 Kalshi KXTRILLIONAIRE-30-MZ YES $0.08 125 $10.00
4 Kalshi KXGOVTCUTS-28-2000 YES $0.26 38 $9.88
5 Kalshi KXNEXTISRAELPM-45JAN01-IBEN YES $0.16 62 $9.92

Total max cost: $48.58.

Command used:

python3 tools/build_trade_tickets.py \
  --count 5 \
  --total-risk-dollars 50 \
  --min-ticket-risk-dollars 8 \
  --max-contracts 250 \
  --any-horizon \
  --max-price 0.30 \
  --max-marketable-price-cents 35 \
  --max-spread-bps 1000 \
  --diversify-titles \
  --skip-malformed-titles

Execution still requires explicit human approval of the exact regenerated slate immediately before placing orders, because prices and visible size can change.

Mixed Kalshi/Polymarket slate update - 2026-05-30

User asked whether the $50 slate included both Kalshi and Polymarket. It did not; it was Kalshi-only. Pam now has mixed-slate tooling:

Current mixed slate generated from live books:

# Venue Ticker / Market Side Limit Size Max cost
1 Kalshi KXNEXTISRAELPM-45JAN01-IKAT YES $0.24 37 $8.88
2 Kalshi KXNEWPOPE-70-PPIZ YES $0.11 90 $9.90
3 Kalshi KXTRILLIONAIRE-30-MZ YES $0.08 125 $10.00
4 Polymarket Brazil wins 2026 FIFA World Cup YES $0.09 111 $9.99
5 Polymarket England wins 2026 FIFA World Cup YES $0.113 88 $9.94

Total max cost: $48.71.

Command used:

python3 tools/build_mixed_trade_tickets.py \
  --total-risk-dollars 50 \
  --kalshi-count 3 \
  --polymarket-count 2

Current pre-execution checks:

Execution still requires explicit approval of the exact regenerated mixed slate immediately before order placement.

Near-horizon constraint - 2026-05-30

User clarified that future trades should only target near-horizon markets, approximately two months or less. The mixed slate builder now defaults to --max-horizon-days 60.

Because the user manually bought Argentina after the initial replacement failed, future slate generation should exclude Argentina to avoid duplicate exposure. Brazil should also be excluded unless intentionally adding to the already filled Brazil position.

Current near-horizon mixed slate, excluding Argentina and Brazil, generated with:

python3 tools/build_mixed_trade_tickets.py \
  --total-risk-dollars 50 \
  --kalshi-count 1 \
  --polymarket-count 4 \
  --max-horizon-days 60 \
  --exclude-polymarket-title-contains Argentina \
  --exclude-polymarket-title-contains Brazil

Result:

# Venue Market Side Limit Size Max cost Expiry
1 Kalshi KXAGICO-COMP-26Q2 YES $0.12 83 $9.96 Jul 1, 2026
2 Polymarket England wins 2026 FIFA World Cup YES $0.113 88 $9.94 Jul 20, 2026
3 Polymarket Germany wins 2026 FIFA World Cup YES $0.052 192 $9.98 Jul 20, 2026
4 Polymarket Portugal wins 2026 FIFA World Cup YES $0.101 99 $10.00 Jul 20, 2026
5 Polymarket Netherlands wins 2026 FIFA World Cup YES $0.041 243 $9.96 Jul 20, 2026

Total max cost: $49.84.

No orders were placed from this updated near-horizon slate.

What changed in Pam

Polymarket interpretation

Polymarket migrated production CLOB to v2 on April 28, 2026. Official docs say old py-clob-client / CLOB v1 orders no longer work on production and current Python integrations should use py-clob-client-v2. They also say collateral changed from USDC.e to pUSD.

Pam was previously checking a CLOB collateral balance that now needs to be pUSD. The proxy wallet has funds, but they are sitting as USDC.e. That is why Pam reports no spendable Polymarket balance.

The next external step is to convert or deposit the proxy wallet’s USDC.e into pUSD, or otherwise fund the correct Polymarket wallet with pUSD. The official path is Polymarket’s pUSD flow: frontend auto-wrapping for normal users, or API-only wrapping through the Collateral Onramp after approving USDC.e.

Trade placement path

  1. Keep FORCE_DRY_RUN=1 while diagnosing.
  2. Use python3 tools/polymarket_funding_diagnostic.py to confirm where funds sit.
  3. In Polymarket, migrate/wrap/deposit the proxy wallet’s USDC.e into pUSD.
  4. Re-run python3 tools/polymarket_funding_diagnostic.py --refresh-clob; expected result is proxy pUSD greater than zero and CLOB collateral greater than zero.
  5. Use python3 tools/polymarket_order_sign_canary.py for a sign-only order check.
  6. For a real Polymarket manual order, use tools/polymarket_order_post.py only after choosing the exact token id, side, price, size, tick size, and negative-risk flag.

Example guarded command shape:

FORCE_DRY_RUN=0 python3 tools/polymarket_order_post.py \
  --token-id "<CLOB_TOKEN_ID>" \
  --side BUY \
  --price 0.01 \
  --size 1 \
  --tick-size 0.01 \
  --confirm LIVE_POLYMARKET_ORDER

Strategy status

Cross-venue Kalshi/Polymarket arbitrage is still present in code, but the latest scans do not show executable cross-venue arb. The practical landing point is still:

Sources