Files
h-school/docs/phases/18-presence-walking.md
T
Leonid Pershin 4137400621
ci / server (push) Failing after 3m39s
ci / client (push) Successful in 14s
Enhance AI and simulation components with presence management and routing capabilities
- Introduced the `HSchool.Ai` project, responsible for routing, day plans, and presence management.
- Updated the `HSchool.Simulation` project to integrate with the new AI functionalities, improving decision-making and presence tracking.
- Added `travelMinutes` to room and territory definitions, ensuring accurate movement calculations within the simulation.
- Enhanced the `School` class to manage presence and implement empty-time skipping functionality.
- Updated documentation to reflect the new AI features and their impact on school simulation.
- Added tests for presence management and routing to ensure robust functionality and reliability.
2026-08-19 16:33:52 +03:00

80 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Фаза 18. Присутствие и ходьба
## Зависимости
- [Фаза 16](16-timetable-in-school.md)
## Зачем
Человек перестаёт быть записью в расписании и получает **место**. Он приходит утром, идёт
коридором в кабинет и уходит после последнего урока. Экрана ещё нет — всё проверяется тестами
и логом.
## Задачи
- [x] Новый проект `HSchool.Ai` рядом с `People` и `Schedule`: зависит на `Content`, `People` и
`Schedule`, без Arch и ASP.NET. Рядом — `tests/HSchool.Ai.Tests`
- [x] `travelMinutes` на `RoomDef` и `TerritoryDef`; в `core` проставлены кабинет 0.5, коридор
1.5, лестница 1.5, вестибюль 1, двор 3
- [x] Маршрутизация по `MapLayout.Links` — в библиотеке: матрица следующих шагов считается
**один раз** при загрузке школы, не на каждом шаге
- [x] План дня человека — тоже в библиотеке: во сколько выходить, чтобы успеть, и когда уходить.
Часы, компоненты и мир туда не проникают
- [x] Место человека — компонент в `World`: узел, остаток пути, минуты до выхода из узла.
Человек всегда в узле; рёбер как состояний нет
- [x] Состояние «вне школы» — не удаление сущности: человек остаётся в списке и в карточке
- [x] Приход и уход: у кого сегодня нет уроков, тот не приходит вовсе. Ученик и учитель — по
своим урокам, прочий штат — по дню школы
- [x] Запас на дорогу свой у каждого: путь от двора плюс несколько минут из своего потока
случайности, с поправкой на черты
- [x] Обязанность как место назначения: урок — кабинет из расписания, должность — комната из
`RoomDef.works`. Выбора действий пока нет
- [x] Движение по тику: остаток минут в узле уменьшается, при нуле человек переходит в следующий
узел пути
- [x] Стабильный порядок обхода людей — собственный список, а не порядок сущностей в Arch
- [x] Адаптер в `HSchool.Simulation`: собирает значения из компонентов, зовёт библиотеку,
записывает ответ обратно. Горячий путь — движение — границу не пересекает
- [x] Ориентир в `AGENTS.md`, `docs/architecture.md` и `docs/design/projects.md` знает про новый
проект
- [x] Место, путь и назначение едут в файл часов; кого в файле нет, тот расставляется по
обязанности
- [x] Потолок решений за тик — в `SimulationOptions`, как очередь, а не как отсечка
- [x] Предикат «школа пуста»: в здании и во дворе нет никого
- [x] Рабочее окно дня — от шести утра до последнего звонка по **каркасу дня**, а не по
фактическому расписанию
- [x] «Ближайшее шесть утра рабочего дня впереди»: ночь ведёт в то же утро, вечер — в следующее,
выходные, праздники и каникулы пропускаются. Поиск ограничен разумным числом дней и
честно отвечает «нет такого»
- [x] Прыжок часов туда одним шагом: разрешён только при пустой школе и вне рабочего окна,
отрабатывает первое сентября и обновление пула за весь пропуск, после себя пишет сейв
## Тесты, без которых фаза не закрыта
- [x] Путь из кабинета 201 в санузел первого этажа идёт через лестницу и коридор, а не напрямую
- [x] Сумма `travelMinutes` совпадает с временем, за которое человек реально доходит
- [x] В воскресенье и в каникулы школа пуста: все вне школы
- [x] Класс без уроков сегодня не приходит, а его учитель с уроками у другого класса — приходит
- [x] К началу первого урока ученик находится в своём кабинете
- [x] Физкультура после урока в главном корпусе: класс доходит до спортзала, и видно, что
перемены на это едва хватает
- [x] Тот же сид и та же карта дают то же расположение людей на тот же момент
- [x] Сохранение и загрузка посреди перемены не телепортируют людей
- [x] Прыжок с субботы попадает в понедельник, 6:00; с трёх ночи вторника — в утро того же
вторника; с десяти вечера — в утро среды
- [x] Прыжок в учебное время отклоняется. В семь утра рабочего дня, когда школа ещё пуста, —
тоже: это уже рабочее окно
- [x] У школы без единого учителя рабочий день не пропускается
- [x] Прыжок через летние каникулы проводит первое сентября: классы перешли, выпуск состоялся,
набор пришёл
- [x] Промотанная неделя и прожитая неделя дают одно состояние школы
## Критерий готовности
- `dotnet test` проходит
- Маршруты и план дня проверены без мира: в `HSchool.Ai.Tests` нет Arch
- В `HSchool.Ai` нет упоминаний Arch, ASP.NET и `DateTime.Now`; в `HSchool.Simulation` — сокетов
## Стоп
Не трогать протокол и клиент. Не заводить нужды, действия и выбор — это фазы 20 и 21.