Перейти к содержанию

Правила обнаружения файлов (Discovery)

Правила этой группы сообщают о выборе файлов самим прогоном, а не о коде, который он проанализировал. Фильтр, который ничего не убрал, выглядит ровно как отсутствие фильтра: отчёт покрывает файлы, которые автор собирался исключить, и каждое число в нём посчитано по набору, о котором никто не просил.


Непривязанное исключение

Rule ID: discovery.unmatched-exclude

Что измеряется

Каждый эффективный авторский exact, subtree или regex селектор сверяется с наблюдёнными записями: файлами, каталогами, ссылками и special entries. Все совпавшие селекторы привязываются до пропуска записи. Равные записи из файла, CLI и пресетов группируются по canonical display с сохранением истории источников.

Измеренный исход Что сообщает прогон
Селектор привязался Removed, без unmatched-предупреждения
Ничего не привязалось и скрытого места нет Предупреждение о непривязанном селекторе
Совпадение могло быть в снятом каталоге своего источника Ограниченное предупреждение о совпадениях вне того, что убирает hider
Возможный hider имеет источник вне набора источников селектора Значение не судится; scope reason называет hider и его foreign origins
Возможное место нельзя перечислить Названный недоступный каталог; абсолютное отсутствие не утверждается
Неизвестен состав кода или неполны PHP-пути Ещё не привязанный селектор не судится

Область и severity

Канал сообщает на уровне проекта с severity warning под итоговой селекцией producer. Он спрашивает полноту PHP-путей и известность состава кода отдельно от отсутствия деклараций: авторское снятие PHP и generated-файлы сами по себе не выключают эту проверку. Привязанный селектор остаётся Removed на узком прогоне. Git --report ограничивает публикацию, а не анализ; этот канал сохраняется и в strict-режиме. См. охват проекта.

Внутрь снятого каталога аудит не спускается. Возможные hider — физические каталоги, включая цель допустимого named directory alias, но не walked links и не отдельные файлы. Regex мог совпасть в любом таком каталоге; exact/subtree использует буквальное вложение. Любой источник hider, отсутствующий среди источников проверяемого селектора, делает его other-source; пересечение наборов допустимо, other-source имеет приоритет. Одинаковые наборы дают same-source.

Снятый каталог вне выбранных путей имеет невидимых потомков: это именованная неизвестность состава кода, без listing или PHP-поиска внутри него. Селектор остаётся привязанным, но остальные отсутствие-селекторы могут не судиться. Недоступная запись внутри выбранного прогона делает coverage неполным и даёт код 4; одного severity-предупреждения недостаточно для авторитетного результата.

Как уточнить ответ

Уберите названное CLI/preset исключение и повторите полный прогон. Same-source предупреждение не доказывает, что селектор нигде не нужен; other-source пропуск не означает, что он устарел. Исправьте опечатку или удалите запись только после проверки. Существующие occurrence kinds остаются разными для unmatched и недоступного места: принятие первого в baseline не принимает второе.

Сообщение называет конфигурацию, записавшую селектор (Written by configuration file "…" (imported by configuration file "qmx.yaml").). Селектор, который записали только файлы, установленные пакетом Composer, — импортированные из каталога установки проекта, vendor/, если config.vendor-dir не говорит иного, — и который ничему не соответствует, не судится: проект не может поправить этот файл, а следующий слой не может убрать запись exclude. Он перечисляется в projectScope.unjudgedValues с причиной installed-configuration, называющей файл. Селектор, который обход не смог решить из-за нечитаемого каталога в дереве самого проекта, по-прежнему показывается.

Опции

Опция По умолчанию Описание
enabled true Включает или выключает правило

Конфигурация

# qmx.yaml
rules:
  discovery.unmatched-exclude:
    enabled: true
bin/qmx check src/ --disable-rule=discovery.unmatched-exclude

Selection не создаёт coverage

Discovery audit исполняется только при активном producer в итоговом selection. enabled:true — точное авторское включение, не reset; оно может снять нижний disable. Итоговый projectScope judgement отдельно отвечает о полноте selector/path, а не использует вопрос об отсутствии деклараций. Only filter не превращает partial paths в полное coverage. См. конфигурацию.