S18 Added OR Tools rules for scheduling show
All checks were successful
Build, test and publish / verify (push) Successful in 6m12s

This commit is contained in:
2026-11-03 11:03:47 +01:00
parent c965f9b41d
commit a7f7730ea0
48 changed files with 2262 additions and 256 deletions

70
docs/s18-validation.md Normal file
View File

@@ -0,0 +1,70 @@
# S18 implementation validation
Validated on 2026-11-03 against the confirmed S18 specification.
## Automated checks
- JDK 25 `mvn clean verify`: passed, 52 backend tests and 19 standards-tool
regression tests, with no failures or skipped tests.
- Clean backend line coverage: 1175/1215 lines, 96.70781893004116%, above the
exact 80% gate. No handwritten-code exclusions were introduced.
- Frontend `npm test`: 24 tests across six files passed.
- Frontend production build and ESLint: passed.
- Playwright with the real REST backend: all three scenarios passed, covering school management,
shared memberships, automatic scheduling, manual draft editing and finalization,
a coach accompanying preschoolers across dates, and connection-error recovery.
Focused solver tests cover showcase bookends (including extra showcases), single
and absent showcases, changing gaps, coach exemptions, infeasibility, the strict
priority of showcase attendance over balance, and style/age scores. Lifecycle
and HTTP tests cover skipped empty groups, first-show-date ages, retained x after
daypart removal, atomic structural validation, invalid drafts, final status
invalidation, stale solver results, timeout preservation, coach identity links,
and ordered JSON round trips including version-2 migration.
## Manual standards assessment
The standards report passes without new waivers. Retained review signals were
assessed against `CODING_STANDARDS.md` and `docs/backend-review.md`:
- `GroupRequirement`, `SchedulingInput`, `Performance` and `ShowView` carry six
or seven related snapshot/API values. Collections are defensively copied;
coach identity and group membership use IDs across the solver boundary.
The larger record shapes make the scheduling contract explicit. Other added
records are small. `OrderedAssignments` deliberately owns mutable OR-Tools
variables and arrays internally during one solve; it is not an API snapshot.
- `ScheduleRules` has cyclomatic signals for independent configuration checks
and showcase cases. Each rule family is isolated in a short method and shared
between finalization and solver-result validation.
- `ShowSchedules` retains branching for nullable initial settings, retained x,
and structural draft validation. It stages complete replacement lists before
mutation and uses the existing aggregate lock. It separates schedule lifecycle
from the already broad `SchoolManagementService` aggregate owner.
- The aggregate owner's fan-out and public-method signals are retained for its
repository and transaction ownership. Scheduling-input preparation, coach
identity operations, lifecycle rules and scoring reside in separate focused
classes. Its new revision operation invalidates final status as well as pending
solver results.
- `SchoolSnapshot` retains orchestration size, fan-out and cognitive signals for
validating and reconstructing an entire graph. Import resolves coach/dancer
links explicitly, retains order, rejects unknown references, accepts invalid
assignment drafts and resets imported final status. Graph construction remains
staged before repository mutation.
- REST resource fan-out is mainly endpoint annotations, request/view types and
domain/service collaborators. OR-Tools stays inside the solver package.
`SchedulingInputs` uses domain types to produce one immutable solver snapshot.
- `OrToolsSchedulingEngine` retains a length/cognitive signal for the ordered
optimization stages and their feasible/optimal/timeout outcomes. Keeping the
incumbent and freezing only proven optima preserves strict objective priority
and valid results within one total deadline.
- Solver objective helpers retain five-parameter review signals where a model,
variables, group pair and objective coefficient are needed. Replacing those
with additional transient wrapper types would obscure the constraint mapping.
Common adjacency penalties are algebraically removed without changing scores.
- Test fan-out and scenario length signals reflect full HTTP/import/concurrency
workflows. Shared fixture setup is extracted where it aids readability; every
executable remains within the blocking limits.
Public behavior is documented in `show-scheduling-rules.md`, the README and the
school JSON format reference. No new standards waiver, threshold change or
analysis exclusion is required.