| # API And Solver Policy |
|
|
| This page holds the longer reference material that must stay aligned with |
| `src/api/routes.rs`, `src/api/dto.rs`, `src/solver/service.rs`, `solver.toml`, |
| and the visible API guide in `static/app/shell/api-guide.mjs`. |
|
|
| ## REST API |
|
|
| - `GET /health` |
| - `GET /info` |
| - `GET /demo-data` |
| - `GET /demo-data/{id}` |
| - `POST /jobs` |
| - `GET /jobs/{id}` |
| - `GET /jobs/{id}/status` |
| - `GET /jobs/{id}/snapshot` |
| - `GET /jobs/{id}/analysis` |
| - `POST /jobs/{id}/pause` |
| - `POST /jobs/{id}/resume` |
| - `POST /jobs/{id}/cancel` |
| - `DELETE /jobs/{id}` |
| - `GET /jobs/{id}/events` |
|
|
| ## Lifecycle Semantics |
|
|
| - `pause` requests an exact runtime-managed pause and checkpoint |
| - `resume` continues from the retained checkpoint |
| - the user-facing Stop control calls `cancel` to stop a live or paused job |
| - `delete` removes a terminal retained job before the next fresh solve |
| - `GET /jobs/{id}` and `GET /jobs/{id}/status` return the same summary payload |
| - `snapshot_revision={n}` is optional on both snapshot and analysis requests |
| - reconnects bootstrap from current runtime status plus retained snapshot |
| revision, not from cached SSE text |
|
|
| ## Payload Shape |
|
|
| The transport payload mirrors the domain model directly. The important field is |
| `employeeIdx`, which is the scalar planning assignment chosen for each shift. |
|
|
| ```json |
| { |
| "employees": [ |
| { |
| "id": "employee-0", |
| "name": "Alex Smith", |
| "homeHub": "critical_care", |
| "skills": ["Critical care doctor"], |
| "unavailableDates": [], |
| "undesiredDates": [], |
| "desiredDates": [] |
| } |
| ], |
| "shifts": [ |
| { |
| "id": "shift-1", |
| "start": "2024-01-01T08:00:00", |
| "end": "2024-01-01T16:00:00", |
| "location": "Critical care", |
| "careHub": "critical_care", |
| "requiredSkill": "Critical care doctor", |
| "employeeIdx": 0 |
| } |
| ], |
| "score": "0hard/0soft" |
| } |
| ``` |
|
|
| Telemetry is intentionally a UI-facing projection, not the raw runtime type. |
| Fields like `elapsedMs`, `movesPerSecond`, and `acceptanceRate` are derived for |
| display. |
|
|
| ## Solver Policy |
|
|
| The runtime source of truth is [../solver.toml](../solver.toml). |
|
|
| The currently shipped policy is deliberately narrow: |
|
|
| - `construction_heuristic = cheapest_insertion` |
| - one local-search phase |
| - nearby scalar change/swap selectors |
| - `late_acceptance` |
| - `accepted_count` |
|
|
| That is not an accident. A candidate sweep against broader scalar phase-2/3 |
| variants showed that the current nearby baseline remained the best balanced |
| policy for this dataset and 30-second budget. |
|
|
| The canonical description of current behavior is `solver.toml`, the code, |
| `README.md`, this file, and `WIREFRAME.md`. |
|
|