solverforge-lessons / WIREFRAME.md
github-actions[bot]
chore: sync uc-lessons Space
0502fea
|
Raw
History Blame Contribute Delete
6.55 kB
# solverforge-lessons WIREFRAME
This file is the architectural map for the lesson timetabling example.
`README.md` explains how to run and use the app. This document explains how the
pieces fit together and where each responsibility lives.
## Documentation Roles
- `README.md`
Quick start, dependency shape, API list, and user-facing orientation.
- `WIREFRAME.md`
Architecture, execution flow, and file-map walkthrough.
- `AGENTS.md`
Repo-specific contribution, validation, and documentation rules.
- `Makefile`
Local development, validation, and Space/Docker command surface. Its
`test-e2e` target contains the inline Playwright smoke for this app.
- `Dockerfile`
Hugging Face Docker Space image definition.
- `docs/screenshot.png`
Current browser screenshot embedded by the README.
## What This Repo Is Teaching
This repo is a complete `solverforge-lessons` scalar-variable SolverForge app
for weekly lesson timetabling.
It shows how to combine:
- a `Plan` solution with two scalar planning variables per lesson
- assignment-completeness, hard feasibility, and soft timetable-quality rules
- deterministic `LARGE` demo-data generation from domain facts
- retained jobs with snapshots, analysis, cancel, pause, resume, and SSE
- a browser timetable workspace built on stock `solverforge-ui` assets
## SolverForge Concepts In Plain Language
- `Timeslot`, `Teacher`, `Group`, and `Room`
Input facts. The solver reads them but does not move them.
- `Lesson`
Planning entity. Each lesson receives a timeslot and a room.
- `timeslot_idx` and `room_idx`
The two scalar planning variables on `Lesson`.
- `Plan`
Planning solution. It holds facts, lesson entities, derived indexes, and the
current `HardMediumSoftScore`.
- hard score
Teacher/group availability, room capacity, and teacher/group/room conflicts.
- medium score
Assignment completeness for timeslot and room decisions.
- soft score
Room-kind fit, late slots, and repeated subject days.
- retained job
A solve that lives in memory so the UI can stream events, fetch snapshots,
pause/resume, cancel, analyze, and delete terminal jobs.
## Runtime Flow
1. The browser loads `static/index.html`.
2. `static/app.js` loads `static/sf-config.json`,
`static/generated/ui-model.json`, and `solverforge-ui` assets from `/sf/*`.
3. The app fetches `/demo-data` to discover the default `LARGE` id, then loads
the plan from `/demo-data/LARGE`.
4. `src/data/data_seed/entrypoints.rs` dispatches to
`src/data/data_seed/large.rs`.
5. `Plan::new()` normalizes fact and lesson indexes and filters stale scalar
assignment indexes.
6. The browser renders group, room, teacher, data, and REST API views.
7. When the user clicks Solve, the browser posts the current plan to
`POST /jobs`.
8. `src/api/routes.rs` deserializes `PlanDto` back into `Plan`.
9. `SolverService` starts a retained solve through `SolverManager<Plan>`.
10. Solver events are converted by `src/solver/event_payload.rs` into
UI-facing JSON.
11. The browser consumes `/jobs/{id}/events` and fetches snapshots and analysis
for exact snapshot revisions.
## File Map
```text
.
β”œβ”€β”€ Cargo.toml
β”‚ Rust 1.95 crate metadata for the app package and registry dependency
β”‚ requests.
β”œβ”€β”€ solver.toml
β”‚ Embedded search policy for construction and local search.
β”œβ”€β”€ solverforge.app.toml
β”‚ App metadata, demo IDs, model facts/entities, registry dependency sources,
β”‚ and the `solverforge 0.19.3` runtime target.
β”œβ”€β”€ Makefile
β”‚ Local build, validation, inline browser smoke, and Space/Docker commands.
β”œβ”€β”€ Dockerfile
β”‚ Multi-stage Rust 1.95 Docker image for Hugging Face Spaces.
β”œβ”€β”€ README.md
β”‚ Run guide, dependency shape, API list, and learning path.
β”œβ”€β”€ AGENTS.md
β”‚ Repo-specific rules for future edits.
β”œβ”€β”€ WIREFRAME.md
β”‚ This architectural walkthrough.
β”œβ”€β”€ docs/screenshot.png
β”‚ Current browser screenshot used by the README.
β”œβ”€β”€ src/
β”‚ β”œβ”€β”€ domain/
β”‚ β”‚ `planning_model!` manifest, facts, `Lesson`, `Plan`, and indexes.
β”‚ β”œβ”€β”€ constraints/
β”‚ β”‚ One timetable score rule per file plus the assembler in `mod.rs`.
β”‚ β”œβ”€β”€ data/
β”‚ β”‚ Deterministic `LARGE` demo-data generator and entrypoints.
β”‚ β”œβ”€β”€ solver/
β”‚ β”‚ Retained-job service and runtime event payload formatting.
β”‚ └── api/
β”‚ DTOs, REST routes, and SSE streaming.
└── static/
β”œβ”€β”€ index.html
β”œβ”€β”€ sf-config.json
β”œβ”€β”€ generated/ui-model.json
β”œβ”€β”€ app.js
β”‚ Browser controller, solver lifecycle, and REST API guide.
└── views.js
Timetable view rendering for group, room, and teacher perspectives.
```
## Demo Data
`src/data/data_seed/entrypoints.rs` exposes one demo ID:
- `LARGE`
The generator is deterministic. It builds 40 weekly timeslots, 20 teachers, 12
student groups, 300 unassigned lessons, and 10 typed rooms. The initial score is
`0hard/-600medium/0soft` because each lesson starts without a timeslot and room.
## API And Retained Runtime
The REST API handles discovery, job control, and snapshot reads:
- `/health` and `/info` expose liveness and app metadata.
- `/demo-data` and `/demo-data/{id}` expose the deterministic demo catalog.
- `/jobs` creates a retained solver job.
- `/jobs/{id}` and `/jobs/{id}/status` expose summary state.
- `/jobs/{id}/snapshot` returns an exact or latest snapshot.
- `/jobs/{id}/analysis` runs constraint analysis for a snapshot.
- `/jobs/{id}/pause`, `/jobs/{id}/resume`, and `/jobs/{id}/cancel` control a
live job.
- `DELETE /jobs/{id}` removes a terminal retained job.
- `/jobs/{id}/events` streams typed lifecycle events.
## Frontend Layout
`static/app.js` owns the browser shell, tab state, demo loading, retained-job
controls, SSE handling, status bar, and visible REST API guide.
`static/views.js` owns lesson-specific presentation: group timetables, room
usage, teacher load, and data tables. The app intentionally uses an inline
Playwright smoke in `Makefile` instead of a `tests/e2e/` directory.
## Validation Surfaces
Use the Makefile as the repo-local workflow:
- `make fmt-check`
- `make clippy`
- `make build-release`
- `make test`
- `make test-e2e`
- `make test-slow`
- `make space-build`
- `make ci-local`
- `make pre-release`
`make test` runs Rust tests, frontend syntax checks, and the inline Playwright
browser smoke. `make ci-local` includes the Docker image build used by the
Hugging Face Space.