3.8 KiB
Verification — 2026-10-22
Build and specifications
JAVA_HOME=/usr/local/software/java/jfx-25 ./gradlew build: successful; 42 existing tests, no failures/errors.openspec validate 99-phoenix-perps-positions --strict: valid.- Relative file links in the changed project/system documentation resolve; whitespace checks pass.
- No repository test suite was added, in accordance with OpenSpec project context. Focused temporary execution harnesses are under
/tmp/emc99.
Phoenix reader
Temporary local HTTP responses exercised exact quantities beyond double's integer precision, negative lot exponents, precise decimal prices, nonzero filtering, both cross and isolated subaccounts holding the same symbol, deterministic sorting, immutable results and sequence-independent identity.
Verified valid empty states (including omitted optional positions), rejection of malformed/null state, metadata and prices, wrong authority/PDA/version, duplicate identities, missing markets, conversion overflow, HTTP 401/403/404/429/500, header and body timeouts, and interruption. The shared Jackson mapper is unchanged. The harness accepts GET only. Pacing, fail-fast cooldown and Retry-After seconds/HTTP-date parsing (including invalid/overflow fallback) were exercised.
Evelyn and EMC
Temporary readers exercised immediate asynchronous startup, defensive wallet configuration, 1,000 cached snapshot reads during a blocked integration request, immutable snapshots, unchanged Jupiter mapping, Phoenix subaccount identity/direction and deterministic ordering. Independent combinations of Jupiter/Phoenix success/failure/empty for two wallets confirmed retention and clearing per wallet/venue, including continued attempts after errors and cycle termination on interruption. The single scheduled worker and 60-second fixed delay remain in place. The existing six PROD/one TEST wallet lists are unchanged and validate.
A standalone JavaFX Perps view exercised same-symbol subaccounts, value updates, added/removed
positions and empty results while retaining row identity, selection and expansion. The existing
three columns and direction colors rendered the captured live data correctly. Screenshot:
/tmp/emc99/view.png. EMC code and its three-second snapshot polling are unchanged.
Live reference
The adapter read all seven configured wallets through a local recording proxy forwarding GET requests to the official Phoenix API. Captured trader state, metadata and mark-price responses were independently checked with Python Decimal against every adapter result, including exact quantity, notional, authority/subaccount/symbol identity and count.
| Environment / wallet prefix | Positions | Long | Short |
|---|---|---|---|
| PROD H5Yrdm7B… | 32 | 30 | 2 |
| PROD 7PttBqap… | 32 | 29 | 3 |
| PROD vshTPUDa… | 31 | 10 | 21 |
| PROD 8XGrkDQC… | 32 | 3 | 29 |
| PROD 4wzxcYQ8… | 29 | 6 | 23 |
| PROD HM13QYMv… | 14 | 7 | 7 |
| TEST 6NyYEoXm… | 0 | 0 | 0 |
All 170 nonzero positions matched; H5's short positions were FET and TLT. These are observations, not fixed expectations. Isolated positions were verified with controlled responses, as the live positions were cross-margin.
An initial burst of price requests hit HTTP 429. The final shared one-second pacing completed
the live check without errors. At this portfolio size the sequential reads take about three
minutes before the existing 60-second pause; this is not a fresh full portfolio every 60 seconds.
Positions and mark prices are not atomic snapshots. These limitations and retained old data
on errors are documented in docs/PhoenixPerps.md and the canonical Evelyn system page.
No full Hub, trading/signing flow or deployment was started. Code and documentation are left uncommitted; this OpenSpec change remains active for the owner's review/archive.