# Sprinter Commander: план разработки Статус: рабочий план Связанные документы: [требования](commander-requirements.md), [архитектура](commander-architecture.md), [клавиши и команды](commander-keymap.md), [платформенные пробы P1](p1-platform-probes.md), [экранный backend P2](p2-screen-backend.md), [результаты P2.1](p2-screen-probe-results.md), [результаты P2.2](p2-palette-results.md), [результаты skeleton P2](p2-skeleton-results.md), [результаты файловых панелей P3](p3-panel-results.md), [результаты копирования P4.1](p4-copy-results.md), [результаты запуска EXE P4.2](p4-exec-results.md), [результаты P5](p5-stability-results.md), [результаты F7/P9](p9-mkdir-results.md), [результаты F6/P10](p10-rename-results.md), [результаты F8/P11](p11-delete-results.md), [результаты group-copy/P12](p12-group-copy-results.md), [результаты group-delete/P13](p13-group-delete-results.md), [результаты стандартных цветов/P14](p14-default-colors-results.md), [результаты recursive copy/P15](p15-tree-copy-results.md), [результаты recursive group-copy/P16](p16-group-tree-copy-results.md), [результаты recursive group-delete/P17](p17-tree-delete-results.md), [результаты сохранения метаданных/P18](p18-metadata-results.md), [результаты conflict-policy/P19](p19-copy-policy-results.md), [UI-ориентир VC](ui-reference.md) Текущее состояние: - P0 — завершена первая редакция документации; - P1 — обязательные платформенные примитивы подтверждены в MAME 0.287; проверка на реальном Sprinter ожидается; - P2.1 — ядро координатного экранного backend прошло MAME 0.287; - P2 — многоцветный двухпанельный skeleton прошёл полный MAME-сценарий, включая scroll, диалоги и повторный cleanup; аппаратная проверка ожидается; - P2.2 — системная многоцветная палитра прошла отдельный MAME-тест; аппаратная проверка ожидается; - P3 — реальные две панели, EMM-store с границей 640/641, сортировка, навигация, синтетическая `..` и предел DSS 35 прошли диагностические и интеграционные MAME-тесты; аппаратная проверка ожидается. - P4 — безопасное однофайловое копирование через EMM/W3 и запуск `.EXE` с полным восстановлением окружения прошли HDD-сценарии MAME; аппаратная проверка ожидается. - P5 — завершён в MAME: пройдены 20 последовательных copy со всеми граничными размерами, 100 refresh, три lifecycle, ENOSPC, readonly, ошибки read/rename/ENOENT, отмена перед commit, смена носителя, отсутствующий EXE и реальный `mdview2`. Аппаратный smoke-тест остаётся внешней проверкой. - 0.2 — начат: независимые сортировки name/ext/size/date и reverse, выбор `Insert`, `*`, `+`/`-` с масками, F7 mkdir и локальный F6 rename реализованы и прошли target/UI-сценарии MAME; следующим идёт расширение файловой job и рекурсивная обработка каталогов. Групповые F5 и F8 уже обрабатывают файлы и выбранные directory roots; для F8 каталоги удаляются после файлов обратным проходом очереди. F5 сохраняет FAT date/time и файловые атрибуты R/H/S/A. Conflict-policy overwrite/skip/rename и all, readonly re-prompt, backup/rollback выполнены; P5/P18 повторно пройдены. Также досрочно реализован стандартный fallback цветов имён без файла конфигурации. ## 1. Целевые результаты Проект делится на три продуктовых рубежа: 1. **PoC 0.1** — доказана работа архитектуры на Sprinter. 2. **Рабочая версия 0.4** — Commander пригоден для повседневных файловых операций. 3. **Полная версия 1.0** — реализован основной набор возможностей VC 4.99 с адаптацией к Sprinter. Dos Navigator задаёт идеи для расширяемости, но не объём версии 1.0. Вся линейка до 1.0 включительно использует одну EMM-страницу на панель и жёсткий предел 640 показываемых записей. Его снятие — отдельная архитектурная задача 2.0+. ## 2. Допущения для оценки Оценки приведены для одного разработчика, знакомого с текущим Sprinter C-Compiler и имеющего доступ к MAME. Один рабочий день означает день сосредоточенной разработки, а не календарный день. В оценку входят: - реализация; - целевые тесты; - анализ `.asm`/`.map` при платформенной проблеме; - MAME-прогон; - обновление документации. В оценку не входят: - исправление неизвестных дефектов DSS; - разработка отсутствующего архиватора; - длительное ожидание доступа к реальному железу; - перенос стороннего editor/viewer; - создание графического режима интерфейса. Ожидаемая точность оценки: - PoC: `-20% / +40%`; - этапы после PoC: `-25% / +60%`; - архивы и editor: оцениваются повторно после исследования доступных программ. ## 3. Сводный план | Этап | Результат | Оценка | |---|---|---:| | P0 | Спецификация и архитектура | 2–3 дня | | P1 | Проверенные платформенные примитивы | 3–5 дней | | P2 | Запускаемый двухпанельный skeleton | 4–5 дней | | P3 | Полноценная навигация по двум панелям | 5–7 дней | | P4 | Копирование одного файла и EXEC | 5–7 дней | | P5 | Стабилизация PoC | 3–5 дней | | 0.2 | Безопасное файловое ядро | 5–7 недель | | 0.4 | Рабочая оболочка и внешние инструменты | 4–6 недель | | 0.6 | Поиск, дерево и расширенные панели | 5–7 недель | | 0.8 | Виртуальные источники и архивы | 6–10 недель | | 1.0 | Надёжность, производительность, релиз | 5–8 недель | PoC требует ориентировочно 22–32 рабочих дня. Полная версия 1.0 — примерно 29–44 рабочих недели с учётом PoC. После исследования P1 оценки должны быть пересмотрены по фактической скорости разработки. ## 4. Зависимости этапов ```text P0 documentation | v P1 platform probes | +------> EXEC probe -------------------+ | | v v P2 app/screen/input skeleton P4 EXEC | ^ v | P3 panel/store/filesystem --------> P4 copy | | +------------------+-------------------+ v P5 PoC hardening | v 0.2 safe file core | +----------+-----------+ v v 0.4 shell/helpers 0.6 search/tree +----------+-----------+ v 0.8 virtual sources | v 1.0 | v 2.0+ dynamic panel store ``` 0.6 допускается начинать после стабилизации интерфейса панелей 0.2, но релиз 0.8 требует законченных 0.4 и 0.6. ## 5. Фаза P0 — проектирование ### Цель Превратить общую идею Commander в набор контрактов, по которым можно писать и проверять код без постоянного возврата к исходникам VC. ### Работы - зафиксировать границы PoC и версии 1.0; - определить компоновку экрана; - определить `ScDirEntry`, `ScPanel`, события и команды; - выбрать режим памяти и владение EMM; - описать безопасное копирование; - описать запуск дочерней программы; - определить клавиши PoC и будущий keymap; - составить acceptance tests; - зафиксировать лицензионное правило для референсов. ### Артефакты - `docs/commander-requirements.md`; - `docs/commander-architecture.md`; - `docs/commander-keymap.md`; - `docs/commander-roadmap.md`. ### Критерий выхода Нет неизвестного продуктового решения, мешающего начать платформенные тесты. Непроверенные технические детали перечислены как задачи P1, а не скрыты в предположениях архитектуры. ## 6. Фаза P1 — платформенные пробы ### Цель Получить минимальные воспроизводимые программы для всех примитивов, от которых зависит PoC. ### P1.1. Каталоги и пути Проверить: - `getcwd`, абсолютные и относительные пути; - `chdir` между двумя каталогами и дисками; - шаблон для перечисления всех файлов; - возвращает ли DSS `.` и `..`; - конец `fnext()` и значение `errno`; - имя корня и переход к родителю; - максимальную практическую длину пути; - поведение при смене/отсутствии носителя. Результат: таблица фактического поведения и тестовый `.exe`. ### P1.2. EMM Проверить: - выделение блока из трёх страниц; - получение всех физических страниц; - чтение/запись начала и конца каждой страницы; - сохранение W3 вокруг `bank_read/bank_write`; - повторное выделение/освобождение; - понятную ошибку при нехватке памяти. Результат: подтверждённая схема трёх страниц PoC. ### P1.3. Экран На базе существующего теста `winrest` проверить app-local wrapper: - полный экран 80x32; - вывод с ненулевого offset; - частичный диапазон строк; - все используемые атрибуты; - восстановление после смены видеорежима; - сохранность IX и W3. Результат: утверждённый ABI `sc_platform_winrest()`. ### P1.4. Клавиатура Записать фактические `ascii`, `scan`, `kbd_mod_state` для клавиш из `commander-keymap.md`. Отдельно проверить быстрое отпускание Ctrl после `Ctrl+PgUp` и `Ctrl+R`. Результат: тестовая таблица и список подтверждённых комбинаций. ### P1.5. EXEC Проверить: - формат параметров ESTEX `EXEC`; - требуется ли отдельный `WAIT`; - возврат к вызывающей программе; - состояние W1/W2/W3 после возврата; - состояние видеорежима и CWD; - коды ошибок отсутствующего и повреждённого `.EXE`; - взаимодействие с открытым загрузочным fd multi-bank программы. Результат: app-local wrapper и отдельный repro. ### P1.6. Информация о диске и метаданные `DSKINFO` подтверждён в P1. `ATTRIB`, получение и установка даты/времени не блокируют базовый PoC и проверяются перед реализацией соответствующих операций версии 0.2. ### Критерий выхода P1 - Все обязательные wrappers имеют воспроизводимый тест. - Необъяснённых регистровых соглашений нет. - Известно минимальное число требуемых страниц и fd. - Архитектура обновлена по результатам проб. Критерий достигнут для MAME 0.287 / BIOS 3.06. Подтверждены EMM, DSKINFO, F_FIRST/F_NEXT, полный и частичный WINREST, клавиши PoC, EXEC обоих режимов, WAIT=`0x5A`, восстановление W1/W2/W3 и повторный EMM-тест после child. Фактические значения и скриншоты приведены в [p1-platform-probes.md](p1-platform-probes.md). Расширенные отрицательные случаи не блокируют skeleton P2 и перенесены к этапам, где появится использующий их код: - переходы между дисками, корень, длинный путь и смена носителя — P3/P5; - исчерпание EMM — P5; - отсутствующий/повреждённый EXE и multi-bank loader fd — P4/P5; - ATTRIB и изменение даты/времени — версия 0.2. ## 7. Фаза P2 — skeleton приложения ### Цель Получить запускаемое приложение с двумя пустыми панелями, экранной моделью и управлением, но без чтения каталога. ### Работы 1. Создать `Makefile`, `src/`, `include/`, `banks/`, `tests/`. 2. Добавить `ScApp` и init/cleanup. 3. Настроить сборку `--memory big --safe`. 4. Выделить EMM-блок и получить три страницы. 5. Зафиксировать прошедший P2.1 coordinate-screen probe: полный и частичный `WINREST`, `RDCHAR`, оба направления прямоугольного `SCROLL`, 1000 операций и сохранение W3. 6. Реализовать `sc_video_system` на `WINREST`/`WRCHAR`/`SCROLL`; не использовать BIOS window descriptors и прямой доступ к VRAM. 7. Реализовать screen buffer и полный/частичный present через `sc_video`. 8. Добавить `sc_glyphs.h` с CP866-глифами и test рамок, стрелок и block- элементов. 9. Реализовать прямоугольный scroll одной панели в обоих направлениях; синхронно сдвигать экранную EMM-модель и проверять границы прямоугольника. 10. Нарисовать две панели и нижнюю строку клавиш. 11. Реализовать `ScKeyEvent`, `ScCommand` и главный цикл. 12. Реализовать `Tab`, навигационные команды-заглушки и подтверждение `F10`. 13. Добавить единый message dialog. 14. Настроить первый интерактивный MAME-тест со скриншотом. 15. Подключить прошедший P2.2 модуль темы: сохранить затрагиваемые записи четырёх планов, задать одинаковые normal/FLASH-пары и восстановить их при cleanup. Повторить тот же тест на реальном Sprinter. ### Критерий выхода P2 - `SPRCMD.EXE` собирается в `big`. - Экран соответствует схеме 80x32. - `Tab` меняет активную рамку. - Однострочный scroll не двигает рамку, соседнюю панель и общие строки. - Все соединения рамок, стрелки и block-элементы отображаются ожидаемыми CP866-глифами. - Экран остаётся читаемым во времени с подключённым многоцветным профилем. - Диалог F10 работает в обоих направлениях. - Выход освобождает EMM; повторные запуски не уменьшают свободную память. - В `.map` есть зафиксированный запас HOME и банков. MAME-часть этих критериев достигнута 6 сентября 2026 года. Текущий skeleton имеет 7 276 байт heap в HOME, пока не использует W1-банки и дважды подряд восстановил число свободных EMM-страниц после выхода. Отдельный `sc_theme` сохранил/установил/восстановил четыре палитровых плана. Подробный сценарий и кадры: [p2-skeleton-results.md](p2-skeleton-results.md). Аппаратный прогон остаётся внешним gate. Многоцветная тема P2.2 прошла MAME; на реальном Sprinter она проверяется вместе с остальными критериями P2. ## 8. Фаза P3 — панели и каталог ### Цель Реализовать независимую навигацию по настоящей файловой системе. ### Работы - `ScDirEntry` и build-time проверка размера 24 байта; - EMM store get/put/clear; - scan настоящего каталога; - синтетический `..`; - сортировка каталогов и файлов; - panel renderer; - cursor/top и постраничная навигация; - вход в каталог, parent, refresh; - сохранение позиции по имени; - отдельные пути панелей; - предупреждение о пределе 640 записей и отдельный красный маркер ограничения DSS после ошибки 35; - отображение ошибок носителя. ### Порядок реализации 1. Одна панель, маленький каталог. 2. Пустой каталог и корень. 3. Сортировка. 4. Прокрутка за 27 строк. 5. Вторая независимая панель. 6. Большой каталог и предел страницы. 7. Ошибки и восстановление CWD. ### Критерий выхода P3 - Выполнены `REQ-PANEL`, `REQ-NAV` и `REQ-FS` PoC. - Сто переходов/refresh не меняют EMM free pages. - Каталог на пределе не повреждает screen page. - Перемещение курсора не вызывает `ffirst/fnext`. - После ошибки обе панели остаются управляемыми. ## 9. Фаза P4 — копирование и запуск ### P4.1. Копирование Порядок работ: 1. Проверка выбранной записи и построение путей. 2. Проверка отсутствия конечного имени. 3. Генерация temp с `O_EXCL`. 4. Зарезервировать четвёртую EMM-страницу как рабочую область copy job. 5. Добавить симметричные операции `bank_read_page()`/`bank_write_page()` для файлового обмена через W3 без полноразмерного буфера в W2. 6. Копирование логическими блоками 4096 байт; возможное увеличение блока — только после измерения отзывчивости и скорости. 5. 32-битный прогресс. 6. Отмена через `Esc`. 7. Cleanup на каждой точке ошибки. 8. Повторная проверка конечного имени. 9. Rename temp и refresh пассивной панели. 10. Тесты размеров и побайтовое сравнение. ### P4.2. EXEC Порядок работ: 1. Запуск минимального дочернего `.EXE`. 2. Восстановление видеорежима и экрана. 3. Восстановление CWD. 4. Refresh панелей. 5. Обработка ошибки запуска. 6. Запуск существующего viewer как интеграционный тест. ### Критерий выхода P4 - Выполнены `REQ-COPY` и `REQ-EXEC`. - Большой файл копируется без 16-битного переполнения. - Cancel/error не оставляют temp. - Существующий файл не изменяется. - После дочерней программы Commander продолжает принимать команды. ## 10. Фаза P5 — стабилизация PoC 0.1 ### Обязательная матрица | Область | Сценарии | |---|---| | Каталог | пустой, один файл, 27/28, synthetic 640/641, DSS >512 физических записей | | Навигация | границы, repeat, две разные глубины каталогов | | Файлы | 0, 1, 4095, 4096, 65535, 65536, более 1 МБ | | Ошибки | ENOENT, EACCES/readonly, ENOSPC, смена носителя | | Copy cleanup | cancel в начале/середине/конце, ошибка read/write/rename | | EXEC | успех, отсутствующий файл, плохой EXE, возврат с другим экраном | | Ресурсы | 100 refresh, 20 copy, повторные запуск/выход | | Экран | полный redraw, dirty rows, диалог, возврат из EXE | ### Артефакты релиза PoC - `SPRCMD.EXE`; - Makefile с `floppy`, `hdd` и `run`; - MAME-тесты и контрольные скриншоты; - test files с известными размерами/checksum; - отчёт размеров HOME/банков; - список известных ограничений; - инструкция запуска. ### Release gate 0.1 Все десять критериев раздела 10 требований выполнены. Наличие известной ошибки, способной повредить чужой файл или потерять EMM-блок, блокирует релиз. Release gate выполнен в MAME 0.288 / BIOS 3.06 / DSS 1.71.57. Сводка, команды воспроизведения и ограничения зафиксированы в [p5-stability-results.md](p5-stability-results.md) и [poc-0.1-release.md](poc-0.1-release.md). Проверка на реальном Sprinter не подменяется MAME и остаётся обязательным последующим smoke-тестом. ## 11. Версия 0.2 — безопасное файловое ядро ### Цель Сделать Commander пригодным для реальной работы с файлами без viewer/editor. ### Функции - одна EMM-страница на панель и предел 640 записей сохраняются; - `Insert`, `*`, `+`/`-` и маски выбора — выполнены; - сортировки name/ext/size/date и reverse — выполнены и проверены в MAME; - последовательная очередь выбранных файлов F5 — выполнена; - рекурсивное копирование одного каталога и группы directory roots — выполнено; traversal hardening для больших деревьев остаётся; - F6 local rename — выполнено; межкаталожный/group move остаётся в работе; - F7 mkdir — выполнено и проверено в MAME; - F8 single file/empty-directory delete и recursive group delete выбранных файлов и каталогов — выполнены, включая runtime-cancel; защитная policy остаётся; - cancel между файлами и блоками; - overwrite/skip/rename и варианты all — выполнены для файлов, включая backup/rollback и readonly re-prompt; merge существующих каталогов позже; - проверка свободного места; - сохранение даты, времени и атрибутов обычных файлов — выполнено и проверено exact FAT-тестом; метаданные каталогов не входят в P18; - защита readonly при overwrite — выполнена; delete/move policy остаётся; - подсчёт итогов выбранной группы; - переключение дисков минимум через диалог. ### Внутренние работы - сохранить одностраничный store и добавить к `ScPanel` ключ и направление сортировки; - расширить `ScJob` очередью и стеком каталогов; - сохранить crash-safe temp/commit модель; - добавить единый policy object для ошибок; - определить поведение при частично успешной группе. ### Критерий выхода 0.2 - Неделя dogfood без повреждения данных. - Рекурсивные операции проходят дерево глубиной не менее 16 уровней. - Рекурсивная job обрабатывает более 640 файлов суммарно в нескольких каталогах, не превращая саму панель в многостраничную. - Cancel оставляет уже завершённые файлы в определённом документированном состоянии и не оставляет temp. - Все разрушительные команды требуют подтверждения. ## 12. Версия 0.4 — рабочая оболочка ### Функции - однострочная командная строка; - история команд и каталогов; - интерактивный полноэкранный pseudo-shell по `Ctrl+O`; - вставка имени/пути активной и пассивной панели; - запуск `.EXE` с параметрами; - file associations; - пользовательское меню; - F3 через отдельный viewer; - F4 через отдельный editor; - F9 и базовое меню; - режимы панелей `Brief`/`Details` по образцу VC; - конфигурационный файл; - сохранение путей, sort mode и палитры; - цветовые правила по расширениям; без файла: каталоги белые, EXE жёлтые, остальные файлы светло-серые; - `Ctrl+U`, `Ctrl+O`, root; - полноценный drive dialog; - краткая встроенная помощь. ### Протокол helper-программ До реализации F3/F4 фиксируется небольшой контракт: - полный путь передаётся аргументом; - код возврата различает успех, отмену и ошибку; - helper не обязан восстанавливать экран; - Commander всегда восстанавливает режим и перечитывает затронутую панель; - для editor предусматривается признак изменения файла. ### Критерий выхода 0.4 Commander можно использовать как основную оболочку DSS для навигации, операций, запуска программ, просмотра и редактирования файлов. ## 13. Версия 0.6 — возможности VC-класса ### Функции - quick search по текущей панели; - постоянные фильтры/маски панели; - quick-view panel; - info panel; - размеры каталогов; - сравнение каталогов; - поиск файлов по имени; - поиск текста в файлах, если скорость приемлема; - виртуальная панель результатов поиска; - дерево каталогов; - история посещённых каталогов; - descriptions (`description.ion`/настраиваемое имя), если формат выбран; - изменение атрибутов и времени через UI. ### Архитектурный gate Перед началом поиска должен быть стабилен интерфейс `ScSource`. Результаты поиска не должны притворяться настоящим каталогом с помощью специальных проверок по всему UI: они реализуются как отдельный source kind. ### Критерий выхода 0.6 Поиск и дерево работают на объёмах, превышающих near-memory, а возврат из виртуальной панели не теряет прежнее состояние настоящей панели. ## 14. Версия 0.8 — виртуальные источники и архивы ### Обязательные исследования - какие архиваторы реально существуют для Sprinter; - можно ли получить листинг без распаковки; - достаточно ли внешнего процесса и list-файла; - какие форматы стоит поддерживать первыми; - сколько памяти требует нативный decoder; - разрешает ли лицензия включать выбранную реализацию. ### Предпочтительная последовательность 1. Внешний архиватор по шаблону команды. 2. Просмотр архива как read-only `SC_SOURCE_ARCHIVE`. 3. Извлечение выбранных файлов. 4. Копирование файла в архив, если внешний инструмент поддерживает. 5. Только затем — нативный decoder для одного востребованного формата. ### Дополнительные функции - мышь; - локализация строк через resource file; - расширенная помощь; - bookmarks; - protocol внешних plugin/helper-программ; - сохранённые наборы конфигурации. ### Критерий выхода 0.8 Архивная и поисковая панели используют тот же panel UI без специальных ветвей в renderer и навигации. Ошибка внешнего архиватора не повреждает исходный архив. ## 15. Версия 1.0 — релизная стабилизация К этому этапу уже должны быть закончены все назначенные функции 0.2–0.8. Отдельно проверяются три обязательных релизных контракта: - командная строка и интерактивный полноэкранный pseudo-shell по `Ctrl+O`; - сортировка каждой панели по имени, расширению, размеру и дате, по возрастанию и убыванию; - подсветка по типу файла с настраиваемыми цветами и заданным поведением при отсутствии конфигурации. Предел панели 640 записей в 1.0 остаётся штатным документированным ограничением. ### Надёжность - проверка всех cleanup-path; - защита от двойного освобождения; - тесты нехватки EMM; - тесты предела файловых дескрипторов; - смена и извлечение носителя; - read-only и disk full; - повреждённые каталоги/архивы; - отмена каждой длительной операции; - безопасное обновление конфигурации через temp/rename. ### Производительность - профилирование чтения больших каталогов; - профилирование сортировок EMM; - минимизация переключений W3; - группировка dirty rows; - размер блока copy по фактическим измерениям; - размер HOME и каждого банка; - время холодного запуска и возврата из helper. ### Совместимость - MAME 0.287 / BIOS 3.06; - реальный Sprinter Sp2000; - DSS 1.71.57; - floppy и HDD; - минимум две конфигурации доступной EMM; - CP866 и Rus/Lat состояние клавиатуры. ### Документация релиза - руководство пользователя; - полный keymap; - описание конфигурации; - восстановление после прерванной операции; - ограничения файловой системы; - лицензии и благодарности; - руководство сборки; - архитектурная памятка для добавления source/job/bank. ### Release gate 1.0 - Нет известных дефектов потери или скрытой порчи данных. - Все обязательные функции требований 1.0 реализованы; перенос любой из них требует нового явного решения о составе релиза. - Пройдены автоматические MAME-тесты и ручной hardware checklist. - Размеры HOME/банков имеют документированный запас. - Чистая сборка воспроизводима штатной командой проекта. ## 16. Версия 2.0+ Первый архитектурный рубеж после 1.0 — просмотр каталогов, содержащих более 640 записей. Перед реализацией сравниваются два варианта. **Вариант A: потоковые логические страницы.** Рекомендуемый первый шаг: - в EMM по-прежнему находится только текущая страница и не более 640 строк; - виртуальные `<<< PAGE n` и `>>> PAGE n` занимают места в этом лимите; - при переходе каталог сканируется заново до требуемой логической позиции; - каталоги и файлы отбираются двумя проходами, чтобы каталоги оставались первыми во всём потоке; - сортировка выполняется только внутри текущей страницы и так обозначается в UI; - изменение каталога между проходами сбрасывает просмотр на первую страницу. Текущий DSS API `F_FIRST/F_NEXT` не принимает ключ или направление сортировки. Незавершённые итераторы двух панелей не сохраняются: каждый переход заканчивает перебор либо начинает новый. Платформенная предпосылка варианта A: стабильный DSS 1.71 не умеет перейти за 512-ю физическую FAT-запись и возвращает код 35. Потоковые страницы становятся реализуемыми только после перехода на расширенный режим `F_FIRST` (`B=0x80/0x81`) из экспериментальной ветки `beta_cdfs` либо после эквивалентного исправления DSS. До этого `>>> MORE...` является только информирующим маркером, а не переходом на страницу 2. Детали: [dss-large-directories.md](dss-large-directories.md). **Вариант B: динамический EMM-store.** Он нужен, только если потребуются глобальная сортировка и произвольный переход между страницами: - выбор модели 1024, 2048 или динамического предела по результатам замеров; - выделение и освобождение динамической цепочки EMM-страниц; - межстраничная сортировка или индекс без полной копии списка в W2; - определённое поведение при нехватке EMM на части каталога; - нагрузочные тесты многостраничных списков и отмены во время scan/sort. Для обоих вариантов виртуальные записи имеют отдельный тип и не участвуют в выделении, файловых операциях и сортировке. Точный номер версии после 1.0 фиксируется отдельным release gate; базовый релиз 1.0 от этого не зависит. Прочий backlog, не влияющий на релиз 1.0: - нативные архивные codecs; - FTP/serial/network source при наличии транспорта; - disk image source; - сравнение и синхронизация деревьев; - макросы; - очередь нескольких jobs; - background copy, только если появится безопасная модель многозадачности; - интеграция viewer/editor в банки Commander; - дополнительные режимы экрана. DOS-специфические функции DN — CD player, modem terminal, disk recovery, spreadsheet, games и desktop окон — остаются отдельными приложениями. ## 17. Правило изменения плана После каждого release gate обновляются: 1. Фактическое время этапа. 2. Размер HOME и банков. 3. Число обязательных EMM-страниц. 4. Открытые платформенные риски. 5. Состав следующей версии. Новая функция не добавляется в текущий этап без одного из решений: - она устраняет блокирующий риск текущего release gate; - она дешевле сейчас из-за уже изменяемого интерфейса; - другая функция того же объёма явно исключается из этапа. Такой обмен фиксируется в этом документе, чтобы PoC и 1.0 не расширялись неуправляемо.