The current Evelyn service collects and persists status-index history. Its name suggests that it represents the entire Evelyn system, although Evelyn already consists of independently managed services such as the IOU burner and Mission Control.
The service also already uses the calculated EVE reference price internally, through EvelynPriceIndexCalculator, but other services cannot request that price through its public interface.
Rename the existing service to EvelynStatusService and expose the existing reference-price calculation through that same service. This gives Evelyn's services one authoritative calculation without introducing a separate EvelynReferenceDataService.
Service rename and integration
Rename and move com.fanitas.evelyn.core.Evelyn to com.r35157.evelyn.service.status.EvelynStatusService.
Rename and move com.fanitas.evelyn.core.impl.ref.EvelynImpl to com.r35157.evelyn.service.status.impl.ref.EvelynStatusServiceImpl.
Move the package-private EvelynPriceIndexCalculator into com.r35157.evelyn.service.status.impl.ref together with the implementation, preserving its internal visibility and calculation.
Leave other Evelyn classes and packages in their current locations, including EvelynStatusIndexPoint. Their package cleanup is a later task.
Update imports, constructors, typed dependencies, fields, diagnostics, documentation, specifications, and directly affected verification code. Keep package changes limited to what this rename requires.
Update Hub construction and registration, Mission Control's Production/Test dependencies, and Process Manager references where applicable.
Update the Hub's recognized IDs and document the corresponding change required in a deployment's private NenjimHub.conf. Update any versioned examples that mention the old IDs, while preserving their existing enabled/disabled selections.
Evelyn remains the name of the overall system. NenjimHub continues to own startup of its individual processes; this issue does not introduce a new Evelyn service container or orchestration framework.
Calculate the reference price for the supplied instant when requested.
Return the existing AssetPrice value type with the service's canonical EVE/USDT trading pair, so the quote currency is explicit. Preserve the existing convention used for Evelyn Price Index; do not introduce a USDT/USD conversion in this task.
Delegate to the existing reference-price calculation. Status-index sampling and the public operation must use the same formula and constants, with no duplicated calculation or second configuration source.
Do not return a cached historical measurement or depend on a sampling interval.
The operation must work on a constructed service before sampling starts and while sampling is stopped. It must not fetch market prices, read or write history files, start a worker, or mutate history.
Reject a null timestamp and preserve the existing rejection of instants before the reference curve's start.
The existing index formula remains ((actualPrice / referencePrice) - 1) × 10, using the same instant for the reference price as for the status sample.
Preserve current operation and stored data
Preserve Production and Test as separate named instances, including their storage identities.
Keep data/evelyn/<instance-name>/status.log, its format/version, and all existing history data unchanged. Do not rename directories, migrate, truncate, or provision files as a consequence of the service rename.
Preserve sampling frequency, persist-before-publish behavior, history restoration, immutable history snapshots, and existing lifecycle behavior.
Preserve EvelynStatusIndexPoint and its six fields. Only Evelyn Price Index continues to be calculated/displayed; the other five fields remain zero placeholders.
Preserve Mission Control's separate Production/Test charts.
Keep the legacy rebalancing code inactive. Do not enable trading or change the selected processes in a deployment.
Verification and acceptance
Main sources and existing verification code compile with the renamed types and updated component IDs.
A consumer can request the reference price through EvelynStatusService, without accessing its implementation helper.
Deterministic checks confirm that the public operation returns 15 at the start instant and 18 after one 365-day year, with the canonical trading pair.
Verify that the public operation works without active sampling or provisioned history storage and does not change status history; verify null and pre-start timestamp rejection.
Reuse existing checks for index calculation, persistence, restart behavior, and Mission Control rather than adding tests that only mirror the rename.
Update the existing OpenSpec capabilities and relevant documentation to describe the renamed service and public reference-price operation. Validate the OpenSpec change and run git diff --check.
Verification must not execute swaps, burns, transfers, or other live financial operations.
Scope
This issue contains the service rename and the public reference-price operation only. Creating EvelynLiquidityService, changing burner policy, making the price curve configurable, implementing more status indexes, and changing lifecycle contracts are separate tasks.
Related completed work: #64 (live Evelyn Price Index) and #65 (persistent per-instance status-index history).
## Problem and outcome
The current `Evelyn` service collects and persists status-index history. Its name suggests that it represents the entire Evelyn system, although Evelyn already consists of independently managed services such as the IOU burner and Mission Control.
The service also already uses the calculated EVE reference price internally, through `EvelynPriceIndexCalculator`, but other services cannot request that price through its public interface.
Rename the existing service to `EvelynStatusService` and expose the existing reference-price calculation through that same service. This gives Evelyn's services one authoritative calculation without introducing a separate `EvelynReferenceDataService`.
## Service rename and integration
- Rename and move `com.fanitas.evelyn.core.Evelyn` to `com.r35157.evelyn.service.status.EvelynStatusService`.
- Rename and move `com.fanitas.evelyn.core.impl.ref.EvelynImpl` to `com.r35157.evelyn.service.status.impl.ref.EvelynStatusServiceImpl`.
- Move the package-private `EvelynPriceIndexCalculator` into `com.r35157.evelyn.service.status.impl.ref` together with the implementation, preserving its internal visibility and calculation.
- Leave other Evelyn classes and packages in their current locations, including `EvelynStatusIndexPoint`. Their package cleanup is a later task.
- Update imports, constructors, typed dependencies, fields, diagnostics, documentation, specifications, and directly affected verification code. Keep package changes limited to what this rename requires.
- Update Hub construction and registration, Mission Control's Production/Test dependencies, and Process Manager references where applicable.
- Rename component IDs consistently: `evelyn.service.prod` becomes `evelyn.status.prod`, and `evelyn.service.test` becomes `evelyn.status.test`.
- Update the Hub's recognized IDs and document the corresponding change required in a deployment's private `NenjimHub.conf`. Update any versioned examples that mention the old IDs, while preserving their existing enabled/disabled selections.
Evelyn remains the name of the overall system. NenjimHub continues to own startup of its individual processes; this issue does not introduce a new Evelyn service container or orchestration framework.
## Public reference-price operation
Add a public operation equivalent to:
```java
@NotNull AssetPrice getReferencePrice(@NotNull Instant timestamp);
```
Required behavior:
- Calculate the reference price for the supplied instant when requested.
- Return the existing `AssetPrice` value type with the service's canonical EVE/USDT trading pair, so the quote currency is explicit. Preserve the existing convention used for Evelyn Price Index; do not introduce a USDT/USD conversion in this task.
- Delegate to the existing reference-price calculation. Status-index sampling and the public operation must use the same formula and constants, with no duplicated calculation or second configuration source.
- Do not return a cached historical measurement or depend on a sampling interval.
- The operation must work on a constructed service before sampling starts and while sampling is stopped. It must not fetch market prices, read or write history files, start a worker, or mutate history.
- Reject a null timestamp and preserve the existing rejection of instants before the reference curve's start.
Preserve the existing curve:
```text
Start instant: 2026-07-31T22:00:00Z
Start price: 15.00
Annual factor: 1.20
Year length: 31,536,000 seconds
referencePrice(t) = 15.00 × 1.20^(elapsedSeconds / 31,536,000)
```
The existing index formula remains `((actualPrice / referencePrice) - 1) × 10`, using the same instant for the reference price as for the status sample.
## Preserve current operation and stored data
- Preserve Production and Test as separate named instances, including their storage identities.
- Keep `data/evelyn/<instance-name>/status.log`, its format/version, and all existing history data unchanged. Do not rename directories, migrate, truncate, or provision files as a consequence of the service rename.
- Preserve sampling frequency, persist-before-publish behavior, history restoration, immutable history snapshots, and existing lifecycle behavior.
- Preserve `EvelynStatusIndexPoint` and its six fields. Only Evelyn Price Index continues to be calculated/displayed; the other five fields remain zero placeholders.
- Preserve Mission Control's separate Production/Test charts.
- Keep the legacy rebalancing code inactive. Do not enable trading or change the selected processes in a deployment.
## Verification and acceptance
- Main sources and existing verification code compile with the renamed types and updated component IDs.
- A consumer can request the reference price through `EvelynStatusService`, without accessing its implementation helper.
- Deterministic checks confirm that the public operation returns 15 at the start instant and 18 after one 365-day year, with the canonical trading pair.
- Verify that the public operation works without active sampling or provisioned history storage and does not change status history; verify null and pre-start timestamp rejection.
- Reuse existing checks for index calculation, persistence, restart behavior, and Mission Control rather than adding tests that only mirror the rename.
- Update the existing OpenSpec capabilities and relevant documentation to describe the renamed service and public reference-price operation. Validate the OpenSpec change and run `git diff --check`.
- Verification must not execute swaps, burns, transfers, or other live financial operations.
## Scope
This issue contains the service rename and the public reference-price operation only. Creating `EvelynLiquidityService`, changing burner policy, making the price curve configurable, implementing more status indexes, and changing lifecycle contracts are separate tasks.
Related completed work: #64 (live Evelyn Price Index) and #65 (persistent per-instance status-index history).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem and outcome
The current
Evelynservice collects and persists status-index history. Its name suggests that it represents the entire Evelyn system, although Evelyn already consists of independently managed services such as the IOU burner and Mission Control.The service also already uses the calculated EVE reference price internally, through
EvelynPriceIndexCalculator, but other services cannot request that price through its public interface.Rename the existing service to
EvelynStatusServiceand expose the existing reference-price calculation through that same service. This gives Evelyn's services one authoritative calculation without introducing a separateEvelynReferenceDataService.Service rename and integration
com.fanitas.evelyn.core.Evelyntocom.r35157.evelyn.service.status.EvelynStatusService.com.fanitas.evelyn.core.impl.ref.EvelynImpltocom.r35157.evelyn.service.status.impl.ref.EvelynStatusServiceImpl.EvelynPriceIndexCalculatorintocom.r35157.evelyn.service.status.impl.reftogether with the implementation, preserving its internal visibility and calculation.EvelynStatusIndexPoint. Their package cleanup is a later task.evelyn.service.prodbecomesevelyn.status.prod, andevelyn.service.testbecomesevelyn.status.test.NenjimHub.conf. Update any versioned examples that mention the old IDs, while preserving their existing enabled/disabled selections.Evelyn remains the name of the overall system. NenjimHub continues to own startup of its individual processes; this issue does not introduce a new Evelyn service container or orchestration framework.
Public reference-price operation
Add a public operation equivalent to:
Required behavior:
AssetPricevalue type with the service's canonical EVE/USDT trading pair, so the quote currency is explicit. Preserve the existing convention used for Evelyn Price Index; do not introduce a USDT/USD conversion in this task.Preserve the existing curve:
The existing index formula remains
((actualPrice / referencePrice) - 1) × 10, using the same instant for the reference price as for the status sample.Preserve current operation and stored data
data/evelyn/<instance-name>/status.log, its format/version, and all existing history data unchanged. Do not rename directories, migrate, truncate, or provision files as a consequence of the service rename.EvelynStatusIndexPointand its six fields. Only Evelyn Price Index continues to be calculated/displayed; the other five fields remain zero placeholders.Verification and acceptance
EvelynStatusService, without accessing its implementation helper.git diff --check.Scope
This issue contains the service rename and the public reference-price operation only. Creating
EvelynLiquidityService, changing burner policy, making the price curve configurable, implementing more status indexes, and changing lifecycle contracts are separate tasks.Related completed work: #64 (live Evelyn Price Index) and #65 (persistent per-instance status-index history).