Dashboard (dashboard/src/dashboard.tsx, settings.tsx, apiAcademicPeriods.ts):
- Refactor loadHolidayStatus to useCallback with stable empty-deps reference;
removes location.pathname dependency that caused overlapping API calls at mount
and left the banner unresolved via request-sequence cancellation
- Add key prop derived from severity:text to Syncfusion MessageComponent to force
remount on state change, fixing stale banner that ignored React prop/children updates
- Correct German transliterated text to proper Umlauts throughout visible UI strings
(fuer -> für, oe -> ö, ae -> ä etc. across dashboard and settings views)
Backend (server/init_academic_periods.py):
- Refactor to idempotent two-phase flow: seed default periods only when table is
empty; on every run activate exactly the non-archived period covering date.today()
- Enforces single-active invariant by deactivating all periods before promoting match
- Emits explicit warning when no period covers current date instead of doing nothing
Deployment (docker-compose.prod.yml):
- Add init_academic_periods.py to server startup chain after migrations and defaults;
eliminates manual post-deploy step to set an active academic period
Release docs:
- program-info.json: bump to 2026.1.0-alpha.16; fix JSON parse error caused by
typographic curly quotes in the new changelog entry
- TECH-CHANGELOG.md: detailed alpha.16 section with root-cause motivation for both
dashboard refactoring decisions (unstable callback ref + Syncfusion stale render)
- DEV-CHANGELOG.md: document dashboard refactor, Syncfusion key fix, Umlaut changes,
and program-info JSON regression and fix
- README.md: add Latest Release Highlights section for alpha.16
- .github/copilot-instructions.md: sync file map, prod bootstrap note, backend and
frontend pattern additions for academic period init and Syncfusion remount pattern
- add period-scoped holiday architecture end-to-end
- model: scope `SchoolHoliday` to `academic_period_id`
- migrations: add holiday-period scoping, academic-period archive lifecycle, and merge migration head
- API: extend holidays with manual CRUD, period validation, duplicate prevention, and overlap merge/conflict handling
- recurrence: regenerate holiday exceptions using period-scoped holiday sets
- improve frontend settings and holiday workflows
- bind holiday import/list/manual CRUD to selected academic period
- show detailed import outcomes (inserted/updated/merged/skipped/conflicts)
- fix file-picker UX (visible selected filename)
- align settings controls/dialogs with defined frontend design rules
- scope appointments/dashboard holiday loading to active period
- add shared date formatting utility
- strengthen academic period lifecycle handling
- add archive/restore/delete flow and backend validations/blocker checks
- extend API client support for lifecycle operations
- release/docs updates and cleanup
- bump user-facing version to `2026.1.0-alpha.15` with new changelog entry
- add tech changelog entry for alpha.15 backend changes
- refactor README to concise index and archive historical implementation docs
- fix Copilot instruction link diagnostics via local `.github` design-rules reference