6.4 KiB
evelyn-status-index-history Specification
Purpose
Provide typed process-local Evelyn status measurements and visualize the currently implemented live indexes over time in Mission Control while preserving the six-index model for future work.
Requirements
Requirement: Evelyn calculates the live price index
Evelyn SHALL obtain the actual EVE/USDT price from the latest AssetAZ Ticker observation for the canonical EVE/USDT trading pair. It SHALL treat USDT as USD for this calculation and SHALL NOT access Raydium directly. At sampling instant t, on or after 2026-07-31T22:00:00Z, the expected price SHALL be 15 × 1.20^(elapsedSeconds / 31,536,000) and the Evelyn Price Index SHALL be ((actualPrice / expectedPrice) - 1) × 10, calculated with adequate decimal precision and without arbitrary history rounding.
Scenario: Calculate expected price at the configured start
- WHEN the sampling instant is
2026-07-31T22:00:00Z - THEN the expected EVE price is exactly 15 USD
Scenario: Calculate expected price after one year
- WHEN exactly 31,536,000 seconds have elapsed since the configured start
- THEN the expected EVE price is exactly 18 USD
Scenario: Calculate representative fractional-year growth
- WHEN 18 days, 3 hours, 8 minutes, and 14 seconds have elapsed
- THEN the expected EVE price is approximately
15.136464436276USD
Scenario: Calculate index from actual price
- WHEN actual price equals expected price, is 10 percent above, is 10 percent below, is double, or is half the expected price
- THEN the respective index is 0, 1, -1, 10, or -5
Requirement: Evelyn samples without overlapping or catch-up attempts
Each started Evelyn environment SHALL own its sampling executor, attempt its first sample immediately, and make subsequent attempts approximately one minute after the preceding attempt completes. Sampling SHALL remain active for the Evelyn lifecycle independently of whether Mission Control is open. Evelyn SHALL add exactly one timestamped point per successful attempt and SHALL isolate a failed or temporarily unavailable Ticker lookup without adding a fake point, terminating Evelyn, or cancelling the next attempt. Stopping Evelyn SHALL terminate its sampling executor.
Scenario: Initial Ticker data is unavailable
- WHEN the immediate sampling attempt cannot obtain a latest EVE/USDT price
- THEN no point is added, diagnostic context is logged, and the next fixed-delay attempt remains scheduled
Scenario: A later sample succeeds
- WHEN a later attempt obtains a latest EVE/USDT price
- THEN exactly one point is appended using the sampling instant for both expected-price calculation and point timestamp
Requirement: Evelyn provides historical status-index measurements
Each Evelyn instance SHALL begin with an empty, process-local in-memory history and expose a safe, non-null snapshot of typed measurement points ordered from oldest to newest while sampling may continue concurrently. Each successful point SHALL contain its sampling timestamp, the calculated Evelyn Price Index, and BigDecimal.ZERO placeholders for EVE_SYRUP Pool Depth Index, EVE_SYRUP Pool Balance Index, AAZDKK_USDT Pool Balance Index, AAZDKK_USDT Pool Price Index, and AAZDKK_USDT Pool Depth Index. Production and Test SHALL use separate history collections, and no point SHALL be persisted, restored, or backfilled.
Scenario: Status-index history is requested during sampling
- WHEN a caller requests an Evelyn environment's status-index history while points may be appended
- THEN it receives a safe, non-null, oldest-to-newest snapshot containing all six typed fields
Scenario: A process starts two Evelyn environments
- WHEN Production and Test Evelyn instances are created for a new process
- THEN both histories start empty and remain separate even if their calculated values are identical
Scenario: A real point is sampled
- WHEN Evelyn appends a successful price-index point
- THEN its Evelyn Price Index contains the calculated value and each of the other five fields contains zero
Scenario: An Evelyn instance is stopped
- WHEN a Production or Test Evelyn instance is stopped
- THEN its sampling executor terminates and its complete process-local history is discarded without affecting the other environment
Requirement: Evelyn Mission Control visualizes status-index measurements
Evelyn Mission Control SHALL display separate live Production and Test Overview charts from their corresponding authoritative Evelyn snapshots. Each chart SHALL contain one enabled series named Evelyn Price Index; the five future series and their typed fields SHALL remain available as disabled source scaffolding. Opening or reopening EMC SHALL immediately reconstruct each chart from the complete current snapshot before periodically refreshing it. Successful points SHALL be added to chart objects only on the JavaFX Application Thread while the window remains open. Timestamp bounds SHALL expand as points arrive, and only enabled Evelyn Price Index values SHALL determine a dynamic Y-axis range that is symmetric around and always displays zero, using a reasonable default range for empty or all-zero history. Hiding or closing EMC SHALL release only EMC's JavaFX refresh resources and SHALL NOT start, stop, or clear either Evelyn environment.
Scenario: Production and Test Overviews start empty
- WHEN Mission Control opens with two newly created Evelyn environments
- THEN it displays two separate empty one-series charts with valid timestamp axes and symmetric Y-axes containing zero
Scenario: A successful point appears while EMC is open
- WHEN an Evelyn history receives a new successful point
- THEN the corresponding chart adds it on the JavaFX Application Thread and updates its timestamp and symmetric price-index bounds without reopening EMC
Scenario: EMC reopens after collecting hidden-window samples
- WHEN the same EMC instance is reopened after Evelyn collected additional points while its window was hidden
- THEN each chart is reconstructed immediately from its environment's complete current history without missing points because of stale rendering state
Scenario: Future fields contain larger values
- WHEN any disabled future-index field has a greater absolute value than Evelyn Price Index
- THEN that disabled value does not affect the visible Y-axis bounds