Часть [Вне очереди](README.md). Соседей по папке не читать, если задача не про них. # Пропуск сборки при запуске ### Зачем `run-aspire.cmd` каждый раз вызывает `dotnet run`, а тот — MSBuild графа Aspire, даже когда исходники не менялись. Повторный запуск после Ctrl+C стоит десятки секунд впустую: SDK пересчитывает хост, хотя dll на месте. ### Было / Стало / Почему **Было.** Скрипт всегда `dotnet run --project src/HSchool.AppHost`. Аргументы проходили насквозь. **Стало.** Если `HSchool.AppHost.dll` и `HSchool.Server.dll` новее входов (C#, csproj, props, `global.json`), скрипт делает `dotnet run --no-build`. Иначе — `dotnet build`, потом `--no-build`. `--rebuild` собирает всегда. Конфигурация (`-c` / `--configuration`) выбирает, какие dll сравнивать и с какой конфигурацией звать `dotnet run`; по умолчанию Debug. **Почему.** Инкрементальный MSBuild всё равно оценивает Aspire SDK. `--no-build` это пропускает. Клиентский TypeScript и JSONC модов не входы: Vite и каталог читают диск (`ContentRoot`), а не `bin`. Тестовые проекты AppHost не ссылается — их правки запуск не пересобирают. Правила «устарел ли билд» живут в трёх местах: `tools/apphost-uptodate.ps1` (Windows), `needs_build` в `run-aspire.sh` (Ubuntu) и `LaunchBuildStamp` (то, что проверяют тесты). Менять надо все три. ### Что не входит Голый `dotnet run --project src/HSchool.AppHost` по-прежнему собирает — так удобнее агентам с грязным деревом. Протокол, HTTP и сейв не трогаем.