Skip to content

[bug] memory-drift-scan: словарь статусов не знает ⏸ и русских слов — ложные расхождения на 0.38.3 #429

Description

@AVNechaev

Что произошло

Найдено 13.08.2026 на уже исправленной версии: предыдущий дефект этой же сверки (#414, сравнение ячейки статуса целиком) закрыт и проверен на месте — ложных расхождений стало 2 вместо 12. Спасибо. Оставшиеся два имеют другую причину.

python3 .claude/scripts/memory-drift-scan.py печатает:

Drift-scan (структурный): 2 расхождений
- РП-23: MEMORY.md=`⏸ ЗАБЛОКИРОВАН 11.08: ждёт внешнего вердикта…` vs WP-context=`blocked`
- РП-29: MEMORY.md=`⏸ ЗАБЛОКИРОВАН и снят с недели 11.08…` vs WP-context=`blocked`

Расхождения по существу нет: карточки обоих РП несут status: blocked, оперативная память говорит «ЗАБЛОКИРОВАН», реестр ставит . Все три источника согласны.

Где ломается

В normalize_status() две таблицы, и обе не покрывают случай:

  • _EMOJI_TO_STATUS (строки 59-64) знает 🔄 ⏳ 🏭 ⚠️ ✅. Значка нет, 🚧 тоже нет — хотя ровно эти два платформа считает своими: scripts/build-active-wp.py держит их в ACTIVE_STATUSES (строка 46) и печатает в генерируемой легенде 🚧 = blocked, ⏸ = paused (строки 150-151);
  • _TEXT_STATUS_PATTERNS (строки 68-74) ищет только английские слова.

Значок без записи в словаре проваливается сквозь оба прохода, функция возвращает очищенную ячейку целиком, сравнение с blocked не совпадает.

Что ожидалось

Значок, который платформа печатает в собственной легенде активных статусов, распознаётся её же сверкой.

Плюс русские слова: .claude/rules/formatting.md требует русских статусов («НЕ: HIGH / MEDIUM / DONE. ДА: критический, высокий, выполнено»), поэтому английский словарь противоречит правилу самой платформы. Комментарий в скрипте (строки 55-58) приглашает расширять словарь по мере встречи новых значений — этим и пользуюсь.

Предлагаемое пополнение:

  • _EMOJI_TO_STATUS: , 🚧, 📦, ↗️, , 🧪
  • _TEXT_STATUS_PATTERNS: «заблокирован», «ждёт», «в работе», «выполнено», «закрыт», «отменён»

Оговорка по . У генератора он означает «на паузе», у меня в реестре — «ждёт внешнего условия, часов не даётся». Если платформа держит паузу и блокировку раздельными состояниями, правильнее завести paused отдельным значением, а не сводить к blocked. Это ваше решение: у меня обе формулировки описывают одно и то же.

Шаги воспроизведения

  1. В MEMORY.md поставить в колонке статуса ⏸ ЗАБЛОКИРОВАН для РП, чья карточка несёт status: blocked.
  2. Прогнать python3 .claude/scripts/memory-drift-scan.py.
  3. Сверка сообщает расхождение, хотя состояния совпадают.

Контекст

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions