# Sprinter Commander: рекурсивный group F8 0.2/P17 Дата: 10 сентября 2026 года. Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. ## Контракт Если в панели есть выбранные записи, F8 показывает одно подтверждение для всей группы. После подтверждения: 1. выбранные обычные файлы верхнего уровня удаляются в порядке панели; 2. выбранные каталоги становятся корнями одного BFS-job; 3. содержимое каталогов перечисляется через `F_FIRST/F_NEXT`, файлы удаляются по мере обхода, а найденные подкаталоги добавляются в очередь; 4. после полного scan очередь проходится в обратном порядке, поэтому каждый дочерний каталог удаляется раньше родителя; 5. исходный CWD восстанавливается, динамическая EMM-страница освобождается, активная панель перечитывается. Очередь та же, что у recursive F5: одна динамическая 16-КБ страница, 1008 узлов по 16 байт, максимальная глубина 32. В W2 дерево не хранится. `Esc` проверяется между шагами; уже выполненные удаления при ошибке или отмене не откатываются, что явно отражается в статусе. При отсутствии группового выбора однообъектный F8 сохраняет прежний контракт: файл удаляется, а каталог должен быть пустым. ## Проверка Fixture содержит два выбранных дерева и выбранный файл, а также невыбранные `KEEPDIR/SAFE.BIN` и `KEEP.TXT`. Первое дерево имеет пустой каталог, четыре файла размеров 0/1/16/4097 и цепочку глубиной 12. Несколько файлов в одном каталоге отдельно проверяют продолжение `F_NEXT` после `unlink` текущей записи. Сценарий сначала отменяет общее подтверждение и убеждается, что выбор и панель не изменились, затем подтверждает удаление. После выхода содержимое CHD извлекается и проверяется побайтно: ```text PASS: selected file and two directory trees deleted; KEEP preserved. ``` Отдельный runtime-cancel fixture выбирает `TOP.BIN` и дерево из 180 подкаталогов. `TOP.BIN` удаляется до начала обхода, затем Lua подаёт `Esc` во время заполнения очереди. После отмены дерево остаётся доступным, завершённое удаление не откатывается, `KEEP.TXT` не меняется: ```text PASS: runtime cancel kept remaining tree; completed TOP delete remains. ``` Чтобы `Esc` не ждал завершения длинной серии `F_NEXT`, delete-итератор возвращает управление вызывающему коду после каждого добавленного каталога. Контрольные кадры: - [исходное дерево](../artifacts/mame-p17/tree-delete/before.png); - [два каталога и файл выбраны](../artifacts/mame-p17/tree-delete/selected-file-and-trees.png); - [общее подтверждение](../artifacts/mame-p17/tree-delete/group-confirm.png); - [отмена до mutation сохранила группу](../artifacts/mame-p17/tree-delete/cancel-preserves.png); - [после удаления остались только KEEP-объекты](../artifacts/mame-p17/tree-delete/deleted-keep-preserved.png); - [чистый возврат в DSS](../artifacts/mame-p17/tree-delete/clean-dss-return.png). Runtime-cancel: - [выбранное дерево и верхнеуровневый файл](../artifacts/mame-p17/tree-delete-cancel/selected-before-cancel.png); - [подтверждение](../artifacts/mame-p17/tree-delete-cancel/group-confirm.png); - [частичный результат после Esc](../artifacts/mame-p17/tree-delete-cancel/runtime-cancelled.png); - [чистый возврат в DSS](../artifacts/mame-p17/tree-delete-cancel/clean-dss-return.png). ## Компоновка P17 остаётся в двух банках и не увеличивает образ EXE: каждый дополнительный банк добавил бы 16 КБ независимо от фактического заполнения. Текущая сборка `--memory big --safe --max-allocs 3000`: ```text _CODE 9503; DATA 3524; heap 1821 BANK1 10562/16384; BANK2 15904/16384 SPRCMD.EXE 43080 ``` В BANK2 остаётся 480 байт, поэтому следующий функциональный этап потребует осмысленной перекладки модулей в BANK3. Межбанковый аудит чист. ## Воспроизведение ```sh make hdd-p17-tree-delete ALLOCS=3000 tests/run_mame_hdd.sh build/hdd/p17_tree_delete.chd \ tests/mame_p17_tree_delete.lua artifacts/mame-p17/local 58 tests/check_p17_tree_delete_hdd.sh build/hdd/p17_tree_delete.chd make hdd-p17-tree-delete-cancel ALLOCS=3000 tests/run_mame_hdd.sh build/hdd/p17_tree_delete_cancel.chd \ tests/mame_p17_tree_delete_cancel.lua artifacts/mame-p17/cancel-local 50 tests/check_p17_tree_delete_cancel_hdd.sh \ build/hdd/p17_tree_delete_cancel.chd ```