21 июля 2026

Скил datarim-doctor — порядок в операционных файлах

Как скил datarim-doctor определяет тонкий однострочный контракт для операционных индексов Datarim и запускает миграцию из 8 проходов, не теряя ни одной записи о задаче.

По мере роста проекта tasks.md и backlog.md обрастают унаследованными блоковыми записями, устаревшими секциями и журналами завершённых задач, раздувающими контекст, который агент читает в начале каждой команды. Скил datarim-doctor определяет канонический тонкий контракт для этих файлов и алгоритм миграции, который приводит их к нужному виду.

Контракт тонкого индекса

Каждая строка в tasks.md и backlog.md отвечает на четыре вопроса — какая задача, какой статус, какая сложность и где лежит файл описания — и больше ничего. Канонический формат: один элемент списка, соответствующий строгому регулярному выражению: ID задачи, статус, приоритет, уровень, заголовок и стрелка-указатель на файл описания. Никаких абзацев, вложенных пунктов, встроенных требований.

Всё содержимое задачи хранится в отдельном файле datarim/tasks/{TASK-ID}-task-description.md. Этот файл содержит 12-ключевой YAML-фронтматтер и до 250 строк тела по пяти фиксированным секциям: Overview, Acceptance Criteria, Constraints, Out of Scope и Related. Доктор следит как за форматом строк индекса, так и за схемой файла описания.

Миграция из 8 проходов

Скрипт миграции применяет проходы в фиксированной последовательности. Проход 0 отклоняет секцию ## Backlog внутри tasks.md — доктор не мигрирует её автоматически, так как смысловое намерение каждого пункта неизвестно. Проход 1 обходит унаследованные блоковые заголовки и извлекает поля фронтматтера из текста тела, записывая каждый в новый файл описания. Проход 2 переписывает файлы индексов в тонкие однострочники. Проход 3 удаляет упразднённые секции с журналом завершённых из activeContext.md и удаляет progress.md. Проход 4 мигрирует унаследованный backlog-archive.md в отдельные архивные документы по задачам. Проход 6 удаляет архивные секции из операционных файлов. Проход 7 убирает верифицированные HTML-маркеры комментариев, указывающие на существующие архивные документы. Проход 5 повторно сканирует всё дерево после мутирующих проходов и проверяет результат на соответствие.

Контракт безопасности данных

Каждый вызов с флагом --fix перед любым изменением файлов проходит четыре уровня защиты. В /tmp сохраняется тарбол всей директории datarim/. Рядом с каждым унаследованным файлом, который мигрирует проход 4, создаётся боковая копия .pre-v2.bak. Инвариант счётчика требует, чтобы число выведенных записей о задачах было не меньше числа разобранных — при снижении счётчика скрипт восстанавливает состояние из тарбола и завершается с кодом 2. Файловая блокировка предотвращает конкурентный запуск.

Защита идемпотентности означает, что повторный --fix на уже корректном дереве завершается с кодом 0 немедленно. Флаг --quiet используется самовосстановлением /dr-init для проверки соответствия без какого-либо вывода — только код выхода.

Почему важны тонкие индексы

Агент, читающий монолитный tasks.md размером 100 КБ, тратит контекстный бюджет на содержимое, которое ему не нужно. Тонкий индекс сокращает этот объём до менее чем 1 КБ. Описания задач загружаются по требованию, когда над конкретной задачей ведётся работа. История завершений никогда не зеркалируется обратно в операционные файлы — она живёт только в documentation/archive/ и git log.

Полная схема операционных файлов, которую контролирует доктор, описана в посте о скиле datarim-system. Команда /dr-doctor оборачивает скрипт миграции для интерактивного использования.