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

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

Qualimetrix работает из коробки с разумными настройками по умолчанию. Файл конфигурации позволяет настроить пороговые значения, отключить правила и исключить пути, чтобы адаптировать инструмент под ваш проект.


Файл конфигурации

Автоматический поиск принимает только точные имена qmx.yaml и qmx.yml в рабочем каталоге, а когда их нет — qmx.dist.yaml и qmx.dist.yml. Если есть оба файла пары, команда отказывает с кодом 3 — оба dist-имени отклоняются и рядом с локальным файлом, потому что checkout без него их отклонит; выберите один через --config. Близкое написание, например QMX.yaml или qmx.yaml.dist, вызывает предупреждение и не загружается, когда локального имени нет. Локальный файл рядом с близким загружается без этого предупреждения; dist-файл, загруженный в его отсутствие, предупреждение сохраняет: такое имя обычно — неверно названный локальный файл. --config явно выбирает названный файл независимо от автоматического поиска.

Закоммиченные настройки и локальный файл. Закоммитьте qmx.dist.yaml, а qmx.yaml добавьте в .gitignore: checkout без qmx.yaml — CI, GitHub Action — читает qmx.dist.yaml. qmx.yaml разработчика побеждает и читается один: на закоммиченный файл он опирается, только импортируя его:

# qmx.yaml (не коммитится)
imports:
  - qmx.dist.yaml

fail_on: warning

Если найденный автоматически qmx.yaml или qmx.yml не импортирует лежащий рядом qmx.dist.yaml или qmx.dist.yml, прогон предупреждает, что dist-файл не используется: локальный прогон тогда расходится с CI. Если прогон без локального файла отказал бы в dist-файле — тот не читаемый обычный файл, не валидный YAML или называет импорт, который нельзя прочитать, — предупреждение приводит этот отказ. Если локальный файл — симлинк в другой каталог, импорты которого разрешаются рядом с его целью, совет называет dist-файл полным путём. Dist-файл, выбранный через --preset, читается только в полосе пресетов: он не находится поиском и предупреждения не вызывает.

Предупреждение о близком имени не выводится, только если тот же физический файл уже выбран как пользовательский пресет; такое же имя в другом каталоге его не подавляет. Отказ при двух точных файлах называет оба. Если рабочий каталог нельзя перечислить, поиск отказывает с кодом 3 и называет каталог.

Каждая команда, читающая документ, проверяет все его значения, для которых не нужен объединённый контекст, даже если использует только часть секций. Профиль CLI команды не скрывает ошибочную конфигурацию.

Команды Документ и пути Общие опции CLI
check, directives Читают документ и анализируют итоговые пути Их опции анализа
debug:layer-assignment Читает документ и анализирует настроенные пути --config, --preset и её настройки анализа
graph:export Читает документ; без аргументов путей использует итоговые пути --config, --preset, --exclude, --include-generated, --include-autoload-dev, --no-cache, --workers, --memory-limit
rules Читает документ без запроса путей анализа; включает именованные computed metrics и отмечает текущую селекцию only_rules/disabled_rules --config, --preset
baseline:generate, baseline:update, baseline:cleanup, baseline:explain Читают документ и измеряют итоговые пути --config, --preset, селекция правил, --include-generated, --include-autoload-dev, --no-cache, --workers, --memory-limit
baseline:rename-channels, hook:install, hook:status, hook:uninstall, help, list, completion Не читают документ конфигурации Собственные опции команд

--format/-f у графа выбирает dot или json отдельно от format анализа в документе. Граф использует настройки Run, Cache, Parallel, Coupling и памяти без создания селекции Finding или формата отчёта анализа.

Также можно указать файл явно:

vendor/bin/qmx check src/ --config=my-config.yaml

Найденный или указанный так файл — корневой файл конфигурации. Он может строиться на других файлах и встроенных пресетах через imports.


Секции конфигурации

Пути для анализа (paths)

Директории или PHP-файлы для анализа:

paths:
  - src/

Примечание

Если вы передаёте пути через аргументы командной строки (например, vendor/bin/qmx check src/ lib/), они имеют приоритет над конфигурационным файлом.

Если пути не написаны в CLI, YAML или пресетах, defaults берутся из снимка composer.json анализируемого проекта для текущего вызова. Когда выбранные записи автозагрузки непригодны, inferred defaults отклоняются с кодом 3, а не подменяются посторонними путями. Принятые фрагменты повреждённого манифеста можно анализировать, но такие частичные defaults не устанавливают весь проект. Явно выбранный целый корень может установить полноту ФС со статусом unknown; итоговое снятие/неизвестность всё ещё может удержать отсутствие деклараций. Выбранный срез без полной объявленной области даёт unmeasured. См. охват проекта. Отсутствующий путь и явно названный существующий обычный файл без расширения .php отклоняются с кодом 3 во всех измеряющих командах до discovery.

Входной каталог должен канонически указывать внутрь захваченного корня проекта; внешнее написание alias на внутренний каталог допустимо. Для файла проверяется канонический родитель, а последнее имя сохраняется буквально, включая file symlink. . и эквивалентные формы корня допустимы. Каталог с внешней целью отклоняется с кодом 3; --working-dir задаёт нужный корень.

Исключения (exclude)

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

exclude:
  - subtree: tests/Fixtures

Каждая запись — явный селектор exact, subtree или regex, как в suppress_paths; голая строка отклоняется. Встроенные исключения vendor, node_modules и .git отделены от авторских селекторов. Авторские исключения применяются к названным путям CLI, YAML и пресетов без отказа только из-за явно написанного корня. Все совпавшие селекторы привязываются до пропуска записи. Полный прогон с analyzed=0, failed=0 и excluded + generatedExcluded > 0 намеренно пуст и завершается успешно с объяснением измеренного охвата. baseline:generate создаёт пустой файл; любой сбой имеет приоритет с кодом 4. См. аргумент paths.

Включение сгенерированных файлов (include_generated)

По умолчанию файлы с аннотацией @generated в первых 2 КБ автоматически пропускаются при анализе. Чтобы включить их:

include_generated: true

Эквивалент в CLI: --include-generated

Код autoload-dev как часть проекта (include_autoload_dev)

По умолчанию код, объявленный в composer.json в секции autoload-dev, не входит в проект: прогон без paths анализирует только пути, которые объявляет autoload (в любой форме автозагрузки: psr-4, psr-0, classmap, files), и только по ним Qualimetrix судит, охватил ли прогон весь проект. Чтобы считать тестовый код частью проекта в обоих местах:

include_autoload_dev: true

Пути, которые вы пишете сами, не расширяются; при paths: [src] прогон будет отмечен как не охвативший пути autoload-dev. В обеих секциях запись, которая сама является каталогом vendor, node_modules или .git или лежит внутри него, не входит в проект: она не анализируется по умолчанию и не учитывается, а предупреждение её называет.

Эквивалент в CLI: --include-autoload-dev

Подавление путей в отчёте (suppress_paths)

Селекторы путей подавляют нарушения, но файлы всё равно анализируются. Каждый элемент YAML — отображение из одной пары: exact выбирает один project-relative путь, subtree также выбирает потомков через /, а regex принимает фрагмент PCRE без разделителей, который Qualimetrix привязывает ко всему пути:

suppress_paths:
  - subtree: src/Entity
  - exact: src/DTO/Address.php
  - regex: 'src/Metrics/.*Visitor\.php'

Также доступна как CLI-опция: --suppress-path (объединяется с YAML-конфигурацией).

Находки неймспейса и проекта не заимствуют файл исходника, поэтому селекторы путей их не подавляют. Перенеси нужное подавление неймспейса в suppress_namespaces или точную запись suppress_namespace_channels.

Объявленный project scope сохраняется

suppress_paths не подавляет циклы architecture.circular-dependency и объявленные project-scoped diagnostics. Исключение задаётся для каждого канала отдельно; префикс architecture. сам по себе его не даёт.

architecture.layer-violation относится к объявлению-источнику: глобальный suppress_paths сравнивается с файлом физического dependency site, а suppress_namespaces — с namespace источника. Исключение только цели не подавляет исходящее нарушение. Git-отчёт сохраняет его только при изменении source-файла в обоих режимах; см. Интеграцию с Git.

Inline-директивы и baseline по-прежнему применимы к нарушениям слоёв, но не к пяти configuration validators. Их отдельные способы настройки описаны в правилах архитектуры. Исключения на уровне правила остаются доступны независимо от глобального scope.

Подавление неймспейсов (suppress_namespaces)

Подавление нарушений для выбранных неймспейсов. Используются те же три явные формы; subtree следует границам \, а regex всегда сопоставляется со всем именем:

suppress_namespaces:
  - subtree: App\Tests
  - exact: App\Generated\BuildInfo
  - regex: 'App\\Legacy(?:\\[^\\]+)*'

Это полезно, когда целые поддеревья неймспейсов не должны генерировать нарушения. Для исключений на уровне отдельного правила используйте suppress_namespaces внутри конфигурации правила (см. ниже).

Также доступна как CLI-опция: --suppress-namespace (объединяется с YAML-конфигурацией).

Объявленный project scope сохраняется

suppress_namespaces не подавляет циклы architecture.circular-dependency и объявленные project-scoped diagnostics. Исключение задаётся для каждого канала отдельно; префикс architecture. сам по себе его не даёт. Форма этой опции на уровне правила для таких producer отказывается; см. примечание под «Работает для любого правила».

architecture.layer-violation относится к объявлению-источнику: глобальный suppress_paths сравнивается с файлом физического dependency site, а suppress_namespaces — с namespace источника. Исключение только цели не подавляет исходящее нарушение. Git-отчёт сохраняет его только при изменении source-файла в обоих режимах; см. Интеграцию с Git.

Inline-директивы и baseline по-прежнему применимы к нарушениям слоёв, но не к пяти configuration validators. Их отдельные способы настройки описаны в правилах архитектуры. Исключения на уровне правила остаются доступны независимо от глобального scope.

Правила (rules)

Управление активными правилами и настройка пороговых значений.

Полное отключение правила:

rules:
  code-smell.boolean-argument:
    enabled: false

Переопределение пороговых значений:

Каждое правило определяет уровни серьёзности. Когда метрика достигает порога или пересекает его в неблагоприятном для правила направлении, фиксируется нарушение соответствующего уровня. Например, правило цикломатической сложности имеет пороги для методов:

rules:
  complexity.ccn:
    callable:
      warning: 15
      error: 25

Это означает: выдавать предупреждение (warning), когда цикломатическая сложность метода достигает 15, и ошибку (error), когда достигает 25.

Сокращённая запись threshold:

Если вам нужен простой порог "прошёл/не прошёл" (все нарушения — ошибки), используйте threshold вместо отдельных warning и error:

rules:
  complexity.ccn:
    callable:
      threshold: 15    # warning=15 и error=15 → все нарушения становятся ошибками

  size.method-count:
    threshold: 25      # то же самое, что warning: 25, error: 25

Это эквивалентно warning: 15 + error: 15. Полезно в CI, где нужен бинарный результат.

Ограничение

Нельзя смешивать threshold с явными ключами warning/error в пределах одного слоя конфигурации (одного пресета, одного qmx.yaml, одного вызова CLI) для одного и того же уровня правила — это конфигурационная ошибка.

Переопределение режима между слоями: более приоритетный слой (файл конфигурации поверх пресета, CLI поверх файла конфигурации) может свободно переключать режим для уровня правила — например, пресет strict задаёт warning/error, а --rule-opt=size.method-count:threshold=25 в командной строке переключает это правило на единый порог. threshold из CLI перекрывает warning/error из пресета, а не конфликтует с ними:

# qmx.yaml (или пресет)
rules:
  size.method-count:
    warning: 10
    error: 20
# CLI переключает правило в режим простого порога "прошёл/не прошёл" — без ошибки "cannot mix"
bin/qmx check src/ --rule-opt=size.method-count:threshold=25

То же самое работает и в обратную сторону (threshold из нижнего слоя перекрывается парой warning/error из более приоритетного), а также для составных правил — на том уровне вложенности, где заданы ключи (например, callable:/class: у complexity.ccn). Для duplication.clone действует исключение: принимаются только положительные min_lines, min_tokens и error; warning и threshold отклоняются, а серьёзность зависит от покрытых строк кода конкретной копии. Схема этой опции приведена в таблице ниже.

Сокращение составного правила — форма одного слоя. Верхний threshold меняет callable-пару CCN/cognitive/NPath и сохраняет значения и defaults class. Если class не нужен, напиши class.enabled:false. Верхнее сокращение и явная запись того же раскрытого листа в одном слое отказывают; независимый дочерний ключ целевого блока может сосуществовать. Для обоих уровней в одном слое используй:

rules:
  complexity.ccn:
    callable:
      threshold: 5
    class:
      max_warning: 2
      max_error: 3

CBO и instability раскрывают верхнюю пару в class и namespace в написавшем слое. Явная запись конфликтует только с тем же раскрытым листом; независимые дочерние ключи уровня сосуществуют. Более высокий слой может перекрыть раскрытые листья нижнего, не стирая остальные значения.

Каждое измерение покрытия типами -- отдельное правило, и у каждого свой обычный threshold:

rules:
  design.type-coverage.param:
    threshold: 90
  design.type-coverage.return:
    threshold: 90
  design.type-coverage.property:
    threshold: 80

Вычисляемые метрики (computed metrics) также поддерживают threshold.

Написание ключа опции взаимозаменяемо, сам ключ — нет. max_warning, maxWarning и max-warning — один и тот же ключ, и все три применяются, на обеих глубинах. Раз ключ один, он пишется один раз: два его написания в одном блоке — max_warning: 1 рядом с maxWarning: 999 — завершают прогон с кодом 3, а не отдают победу последнему. Это верно для любого ключа документа, включая корневые. Ключ, которого у правила в этой позиции нет, не угадывается: прогон останавливается — см. «Неизвестные ключи опций правила» в разделе «Валидация конфигурации» ниже.

Пустой блок уровня ничего не пишет. callable: {} сохраняет нижний слой и берёт defaults только для листьев, которых никто не написал. Чтобы выключить уровень, пишите callable: {enabled: false} — callable: false отвергается: у уровня нет собственного выключателя, а значение выглядит как выключатель правила.

Подавление неймспейсов для правила:

Любое правило может использовать те же явные селекторы неймспейсов:

rules:
  complexity.ccn:
    suppress_namespaces:
      - subtree: App\Tests
      - subtree: App\Legacy
    callable:
      warning: 15
      error: 25

  coupling.cbo:
    suppress_namespaces:
      - subtree: App\Tests
    suppress_paths:
      - subtree: src/Infrastructure/DependencyInjection

Это полезно, когда определённые неймспейсы (например, тесты, сгенерированный код, legacy-модули) не должны вызывать нарушения для конкретного правила, но при этом всё равно анализируются для сбора метрик.

Подавление отдельных агрегатных каналов неймспейсов для правила:

Используйте suppress_namespace_channels, когда один канал нарушений неприменим к части дерева неймспейсов, но нарушения уровня классов и остальные каналы правила должны сохраниться:

rules:
  health.cohesion:
    suppress_namespace_channels:
      health.cohesion:
        - subtree: App\Metrics\Coupling
        - regex: 'App\\Generated(?:\\[^\\]+)*'

Опция представляет собой непустое отображение: селектор канала → непустой список явных селекторов неймспейсов. Ключ использует закрытую грамматику каналов: точное имя канала либо X.* для строгих потомков X, каждое из них можно сузить до уровня, дописав :namespace; см. «Селекторы правил и каналов» ниже. Голый префикс вроде health — ошибка, а не группа: пишите health.*. Точный health.cohesion не затрагивает соседний канал health.coupling.

Имя канала пишется точно так, как канал называется, вместе с дефисами: ключи этой карты не нормализуются, поэтому size.class-count, code-smell.* и вычисляемая метрика computed.my-score записываются здесь так же, как и везде.

Ключ обязан адресовать канал, который действительно эмитит то правило, под которым он написан. Ключ, называющий чужой канал или вовсе несуществующий, завершает прогон с кодом 3 и сообщением, перечисляющим каналы этого правила, — раньше он принимался и не исключал ничего. Ключ с уровнем проверяется как одно целое: названный канал обязан и производиться этим правилом, и сообщать на этом уровне, поэтому coupling.*:namespace под coupling.class-rank отвергается, хотя соседний канал семейства coupling на уровне неймспейса сообщает.

namespace — единственный уровень, который такой ключ может назвать: опции достаются только агрегатные нарушения уровня неймспейса. coupling.cbo:class отвергается по имени — раньше он принимался и не мог сработать никогда:

rules:
  coupling.cbo:
    suppress_namespace_channels:
      # только агрегат по неймспейсу; нарушения уровня класса того же канала остаются
      coupling.cbo:namespace:
        - subtree: App\Legacy

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

Удаляются только агрегатные нарушения уровня Namespace

Опция фильтрует нарушения, чей субъект — неймспейс. У правила, которое сообщает поштучно (code-smell.*, security.*, architecture.layer-violation) или только на уровне класса (cohesion.lcom), удалять ей нечего: ключ с таким каналом принимается и ничего не делает. Пять диагностик политики слоёв — architecture.coverage-gap, architecture.unreachable-layer, architecture.potential-shadow, architecture.empty-template, architecture.pending-layer-matched — сообщают о проекте целиком и тоже вне её досягаемости; для них используйте блок exclude: внутри конфигурации архитектурных слоёв.

Удаляются только агрегатные нарушения уровня Namespace. Нарушения уровня класса health.cohesion в том же неймспейсе и соседние каналы остаются. Существующая опция suppress_namespaces не меняется и по-прежнему действует на всё правило, включая нарушения классов и неймспейсов.

Работает для любого правила, включая архитектурные

suppress_namespaces, suppress_namespace_channels и suppress_paths извлекаются и применяются на уровне фреймворка для имён правил независимо от того, объявляет ли класс Options этого правила такое поле — это намеренно не opt-in для каждого правила по отдельности. Это касается и architecture.layer-violation. Глобальные исключения применяются к source-owned нарушениям слоёв. Форма на уровне правила явно называет producer, чьи находки нужно подавить. См. раздел «Подавление нарушений» архитектурного правила — там объяснена логика.

Producer только с project-scoped находками

Непустой suppress_namespaces или suppress_paths на уровне правила отказывается при загрузке (exit 3) у producer, все каналы которого project-scoped: его находки относятся к проекту, и ни путь, ни неймспейс их не адресует. Это architecture.circular-dependency, architecture.layer-declaration, architecture.unassigned-class, baseline.unused-entry, coupling.unmatched-framework-namespace, discovery.unmatched-exclude и suppression.configuration. Пустой список и null принимаются. Тот же отказ действует, когда опция записана через --rule-opt. Producer хотя бы с одним file-scoped каналом (например, cohesion.lcom) и вычисляемые метрики не затрагиваются, даже если вычисляемая метрика настроена отчитываться только на уровне проекта.

Отказ происходит в каждой команде, разрешающей опции правил: check, directives, debug:layer-assignment, rules, baseline:generate, baseline:update, baseline:cleanup, baseline:explain. graph:export опции правил не интерпретирует, поэтому не отказывает. Какие находки может принять baseline — см. страницу baseline; для циклов зависимостей — сузить, что считается ребром, опцией ignore-relations правила architecture.circular-dependency.

Подавление путей для правила:

Любое правило может использовать те же явные селекторы путей:

rules:
  coupling.cbo:
    suppress_paths:
      - subtree: src/Metrics
      - regex: 'src/Metrics/.*Visitor\.php'

Работает совместно с suppress_namespaces -- оба фильтра применяются. В отличие от глобального suppress_paths, эта опция на уровне правила влияет только на конкретное правило, а не на все.

Видимость: в отличие от @qmx-ignore, эти подавления по умолчанию происходят незаметно — ничто в стандартном выводе не намекает на то, что нарушения были отброшены. Запустите с -v, чтобы увидеть разбивку по правилам — сколько нарушений подавлено таким образом (namespace-бакет объединяет suppress_namespaces и suppress_namespace_channels и показывается отдельно от suppress_paths), и добавьте --show-suppressed, чтобы также вывести список каждого подавленного нарушения — вместе с нарушениями, подавленными через @qmx-ignore.

Переопределение порогов для символа через @qmx-threshold:

Помимо общих для проекта порогов в YAML, можно переопределять пороги для отдельных классов или методов с помощью аннотаций @qmx-threshold прямо в исходном коде:

/**
 * @qmx-threshold complexity.ccn warning=20 error=40
 */
class ComplexStateMachine
{
    // Методы этого класса используют повышенные пороги сложности
}

Переопределение на классе также применяется к проверкам методов внутри него; более узкое переопределение на методе имеет приоритет.

Полный синтаксис и примеры смотрите в разделе Baseline > @qmx-threshold.

Селекторы правил и каналов

Везде, где называется правило или канал нарушений — disabled_rules, only_rules, их CLI-эквиваленты, suppress_namespace_channels и семейство @qmx-ignore в исходном коде, — имя читается одинаково:

Форма Что означает
complexity.ccn ровно это имя и ничего больше
complexity.* строго потомки complexity — complexity.ccn, complexity.wmc и так далее. Сам complexity не входит; если имя одновременно называет правило и канал, адресуйте их отдельными записями
coupling.cbo:namespace канал, сужённый до одного уровня дерева агрегации. Уровень — один из callable, class, file, namespace, project, и канал обязан на нём сообщать

Голый префикс группой не является. complexity сам по себе не выбирает ничего и отвергается:

Configuration error: Rule selector "complexity" does not match any registered producer or channel. Write "complexity.*" to select its descendants.
Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt

X.*, у которого нет потомков, отвергается по той же причине. Большинство правил публикуют единственный канал, чьё имя равно имени правила, поэтому code-smell.eval.* — ошибка; пишите code-smell.eval.

Неразрешимый селектор в конфигурации или в командной строке завершает прогон с кодом 3 ещё до того, как будет сформирован отчёт. Прежнее поведение — догадка о намерении — молча превращало опечатку в «ничего не выбрано».

Какую половину пары называет имя, решает директива, а не само имя. Одна и та же строка означает разное в зависимости от того, где она написана:

  • @qmx-ignore code-smell.boolean-argument — всегда канал: подавление принадлежит каналу;
  • @qmx-threshold code-smell.boolean-argument — всегда правило: порог принадлежит единственному объекту опций правила. Поэтому @qmx-threshold принимает точное имя правила и не принимает wildcard вообще — групповая переустановка порогов была футганом, а не возможностью;
  • ключи секции rules: и владелец перед : в --rule-opt RULE:option=value называют правило, точно. Ключ вида rules: { complexity: {...} } раньше проходил валидацию и не настраивал ничего; теперь он отвергается.

Полный синтаксис инлайн-директив — в разделе «Baseline», а о том, что инструмент сообщает, когда директива ничего не адресует, — в разделе «Правила > Аннотации».

Отключение правил (disabled_rules)

Отключение конкретных правил, каналов или целых групп:

disabled_rules:
  - code-smell.boolean-argument
  - duplication.clone

Эквивалент в CLI: --disable-rule=code-smell.boolean-argument --disable-rule=duplication.clone

Чтобы отключить группу целиком, используйте wildcard:

disabled_rules:
  - code-smell.*

Только указанные правила (only_rules)

Запустить только указанные правила (все остальные отключаются):

only_rules:
  - complexity.ccn
  - complexity.cognitive

Эквивалент в CLI: --only-rule=complexity.ccn --only-rule=complexity.cognitive

Условие завершения с ошибкой (fail_on)

Управление тем, какие уровни серьёзности приводят к ненулевому коду завершения:

fail_on: error    # Завершение с ошибкой только при error (по умолчанию)
# fail_on: warning  # Завершение с ошибкой и при warning
# fail_on: none     # Никогда не завершаться с ошибкой из-за нарушений

Примечание

По умолчанию fail_on установлен в error. Предупреждения и Info-диагностики по-прежнему отображаются в выводе, но не приводят к ненулевому коду завершения. Используйте fail_on: warning, чтобы блокировать сборку и предупреждениями.

Чтобы находки не давали ошибку завершения, пишите fail_on: none. Прежнее YAML-значение fail_on: false отклоняется; замените его на none.

info — только для отчёта и не является значением fail_on

fail_on принимает лишь warning и error — значение fail_on: info отклоняется с ошибкой, перечисляющей допустимые значения. Severity info означает «наблюдать, но не гейтить»: прогон, где нашлись только Info-диагностики, всегда завершается кодом 0, независимо от fail_on. Чтобы гейтить диагностику, настроенную как info, поднимите серьёзность самого правила. annotation.unused-directive по умолчанию имеет warning; явное info сохраняет прежние тихие напоминания:

rules:
  annotation.directive:
    unused-directive-severity: info

fail_on не управляет ошибками конфигурации

Часть каналов сообщает об ошибке в конфигурации, а не о долге в коде: пять диагностик политики слоёв (architecture.coverage-gap, architecture.unreachable-layer, architecture.pending-layer-matched, architecture.potential-shadow, architecture.empty-template) и три диагностики инлайн-директив (annotation.unresolved-directive, annotation.unsupported-threshold, annotation.invalid-threshold). Они вообще не участвуют в сравнении с fail_on: прогон завершается ненулевым кодом даже при fail_on: none, и принять их не может ни запись в baseline, ни @qmx-ignore. Это не суждение о качестве кода, а сообщение «я не могу сделать то, что ты просишь».

Исключение измерений здоровья (exclude_health)

Исключить конкретные измерения здоровья из оценки. Исключённые измерения не отображаются в сводке здоровья и не влияют на общую оценку:

exclude_health:
  - typing
  - maintainability

Эквивалент в CLI: --exclude-health=typing --exclude-health=maintainability

Лимит памяти (memory_limit)

Лимит памяти PHP для анализа. По умолчанию используется значение memory_limit из php.ini. Лимит действует и в рабочих процессах, где файлы разбираются и измеряются; файл, который рабочий процесс не смог обработать в его пределах, отмечается как необработанный, и сообщение о сбое называет лимит.

memory_limit: 1G    # 1 гигабайт
# memory_limit: -1  # Без ограничений

Эквивалент в CLI: --memory-limit=1G. Значение свыше PHP_INT_MAX байт отклоняется с кодом 3.

Формат вывода (format)

Формат отчёта по умолчанию:

format: summary   # По умолчанию
# format: json
# format: html

Кэширование (cache)

Управление кэшированием AST для ускорения повторных запусков:

cache:
  enabled: true         # По умолчанию: true
  dir: /home/user/.cache/qmx  # Необязательный POSIX-путь вне проекта

dir разбирается как строка. Когда кэширование включено или --clear-cache использует каталог, абсолютный путь или путь относительно корня проекта должен разрешаться в поддерживаемый POSIX-путь вне проекта; например, ../external-cache может подойти. Числовое имя в кавычках остаётся строкой и затем проходит такую же проверку пути, если каталог используется. --no-cache без очистки не проверяет неиспользуемый корень. По умолчанию используется пользовательский каталог под qmx, общий для проектов; старый .qmx-cache не читается. Явный корень другого владельца или с доступом на запись группе либо остальным отклоняется при использовании; непригодное умолчание отключает кэш с одним предупреждением. Проверка корня не удостоверяет всех предков. Кэш использует текущий allowlisted AST-формат; старые форматы дают промах. Когда корень проекта — / (например, при запуске cron из /), вложенность не проверяется; остальные проверки расположения продолжают действовать. short_open_tag входит в ключ. Записи, не читавшиеся 30 дней, удаляются постепенно. При каждом открытии проверяются 16 из 256 сегментов; после 16 успешных шагов целевой объём каждого формата — 2 ГиБ плюс записи, добавленные после последней очистки своего сегмента, и по одной самой новой записи сверх лимита в каждом сегменте. Это не мгновенный жёсткий предел. Временные файлы публикации сохраняются до того же возрастного предела в 30 дней, чтобы очистка не удаляла активную запись; их объём добавляется к целевому объёму записей. Старые временные файлы удаляются и из сегментов, и из каталога метаданных формата. Очистка сохраняет посторонние файлы и завершается отказом, пока остаётся отделённый каталог кэша.

Эквивалент в CLI: --no-cache для отключения, --cache-dir=DIR для изменения директории.

Параллельная обработка (parallel)

Количество параллельных воркеров для анализа файлов:

parallel:
  workers: 4     # Фиксированное количество воркеров
  # workers: 0   # Отключить параллелизм (последовательно)
  # workers: 1   # Отключить параллелизм (один процесс)

По умолчанию Qualimetrix автоматически определяет число воркеров по ядрам CPU. Эквивалент в CLI: --workers=4. На подходящем прогоне явное значение больше одного использует процессы и даёт отказ среды с кодом 3, если первый воркер не стартует или не отвечает за 10 секунд; автоматический выбор предупреждает и переходит к последовательной работе. ext-parallel потоки и fork не служат транспортом.

Совет

Используйте workers: 1 для отладки или однопроцессного окружения. workers: 0 отключает параллелизм (последовательное выполнение); автоопределение — поведение по умолчанию, когда опция не задана.

Определение неймспейсов (namespace)

Qualimetrix определяет неймспейсы проекта по composer.json в рабочей директории запуска и при необходимости разбирает исходный код. Настройка определения неймспейсов не поддерживается: namespace.strategy и namespace.composer_json отклоняются как неизвестные ключи.

Связанность (coupling)

Настройка префиксов неймспейсов фреймворка для метрики CBO (Coupling Between Objects). Зависимости от неймспейсов фреймворка отслеживаются отдельно как coupling.cbo-app и coupling.ce-framework:

coupling:
  framework-namespaces:
    - subtree: Symfony
    - subtree: Doctrine
    - subtree: Psr
    - subtree: Illuminate

Если framework-namespaces не указаны, coupling.cbo-app равен coupling.cbo (без эффекта).

Агрегация (aggregation)

Агрегация неймспейсов следует анализируемым объявлениям. Пользовательские настройки aggregation.prefixes и aggregation.auto_depth больше не поддерживаются и отклоняются как неизвестные ключи.

Архитектура (architecture)

Правила слоёв и allow-list для правила architecture.layer-violation живут под верхнеуровневым ключом architecture:. Полная схема описана в правилах архитектуры; ключи, наиболее релевантные для общей конфигурации:

architecture:
  layers:
    - name: 'domain-{module}'                         # шаблонный слой с переменной захвата
      patterns: ['App\Module\{module}\Domain\**']
    - name: shared-kernel
      patterns: ['App\Shared\**']

  allow:
    'domain-{m}':
      - shared-kernel
      - target: 'domain-{m}'
        relations: [implements, extends]              # whitelist видов зависимостей

  coverage-gap: ignore                                # ignore | warn | error
  max_expanded_layers: 500                            # кумулятивный лимит на раскрытие шаблонов

Переменные захвата в именах слоёв и паттернах используют синтаксис {name} (один сегмент namespace) или {name:**} (cross-segment). Одно и то же имя переменной в пределах одной записи слоя привязывается к одному значению (co-binding); переменные в разных записях независимы. Полную грамматику см. в секции про шаблонные слои.

Слой и его exclude: принимают шесть списков критериев: patterns, attributes, member_attributes, implements, extends и suffix. attributes читает атрибуты самого class-like объявления, а member_attributes — его собственных членов. По умолчанию match: any; all требует каждый заполненный вид критерия. Паттерны захвата слоя и публичные селекторы exact | subtree | regex — разные грамматики. Membership называет допустимый паттерн при отказе публичной форме; публичные селекторы в YAML/CLI требуют явного kind и не переводят голый Architecture pattern в эквивалент. Шаблон с match: any отклоняет паттерн без захватов; при match: all он допустим рядом с паттерном, который создаёт захват.

architecture.layer-declaration независимо владеет диагностикой объявлений и имеет только enabled. Пять каналов ошибок конфигурации остаются активны при чужом --only-rule; четыре обычных канала следуют выбору публикации. Отключение architecture.layer-violation не отключает диагностику объявлений. См. таблицу выбора.

Включённый architecture.unassigned-class с mode: warn или error требует непустой итоговый architecture.layers, в том числе при явно написанном layers: []. Режим ignore, отключённое или невыбранное правило такого требования не накладывают. Отказ называет конфигурацию, написавшую mode.

max_expanded_layers ограничивает общее количество конкретных слоёв, производимых раскрытием шаблонов по всем шаблонам (по умолчанию 500). Лимит защищает от патологически широких шаблонов, чьи binding tuples взорвали бы число слоёв. Поднимайте предел явно, когда монорепо легитимно содержит больше bounded contexts, чем дефолт; превышение отклоняется на стадии раскрытия с понятной ошибкой.

Вычисляемые метрики (computed_metrics)

Корневой ключ computed_metrics: настраивает шесть встроенных оценок здоровья (health.complexity, health.cohesion, health.coupling, health.typing, health.maintainability, health.overall) и любые пользовательские вычисляемые метрики. Это достаточно большая поверхность — допустимые ключи, пороги, собственные формулы, доступные переменные и функции, — чтобы иметь собственный справочник: полную схему см. в «Оценки здоровья > Настройка».


Пресеты

Пресеты — это именованные наборы конфигурации, которые применяют предопределённые настройки: пороговые значения, отключённые правила, поведение при ошибках — одним флагом. Вместо ручной настройки десятков параметров выберите пресет, соответствующий зрелости вашего проекта.

Пресет Описание
strict Строгие пороговые значения для новых проектов. Устанавливает fail_on: warning
legacy Ослабленные пороговые значения для легаси-кодовых баз. Отключает шумные правила
ci Явный режим CI. Устанавливает fail_on: error
# Использовать один пресет
vendor/bin/qmx check src/ --preset=strict

# Комбинировать несколько пресетов
vendor/bin/qmx check src/ --preset=strict,ci

# Использовать пользовательский файл пресета
vendor/bin/qmx check src/ --preset=./my-preset.yaml

Порядок приоритетов: Пресеты применяются после обнаружения composer.json, но до qmx.yaml, слева направо. Ваш файл конфигурации стоит над всеми пресетами, командная строка — над файлом.

Несколько пресетов: Пресеты сливаются друг с другом ровно так же, как пресет с вашим файлом, — каждый ключ по своей политике, описанной в разделе Как сливаются слои. Например, --preset=legacy,ci даёт ослабленные пороговые значения с поведением CI при ошибках: fail_on — скаляр, и побеждает более поздний слой.

Внимание

only_rules не накапливается между слоями — последний написавший его слой заменяет список целиком. Это сделано намеренно: only_rules — это ограничивающий фильтр, и объединение расширяло бы область действия. disabled_rules сохраняет авторские отключающие statements, но более позднее точное rules.PRODUCER.enabled: true может их отменить. Итоговый resolver сравнивает слой и specificity; накопленный список сам по себе не означает постоянного запрета.

Пользовательские пресеты: Любой YAML-файл со структурой qmx.yaml можно использовать как пресет. Передайте путь к файлу вместо имени встроенного пресета.

Пресеты из файла конфигурации: встроенный пресет можно импортировать и по имени — imports: [strict] в qmx.yaml, — тогда по нему судят все инструменты, читающие файл, включая pre-commit-хук и GitHub Action (ни один не передаёт --preset). См. Встроенные пресеты. Файл, переданный в --preset, сам импортировать не может.


Разбиение конфигурации на файлы

Корневой файл конфигурации может перечислить в imports файлы, на которых он строится:

# qmx.yaml
imports:
  - strict                    # встроенный пресет, по имени
  - config/architecture.yaml  # один файл
  - subtree: config/teams     # все файлы .yaml / .yml ниже каталога

fail_on: error

Запись — это одно из трёх:

  1. Встроенный пресет — строка без /, без \ и без расширения: strict, legacy или ci.
  2. Путь к файлу — любая другая строка с расширением .yaml или .yml (в любом регистре). *, ? и [ в ней — обычные символы.
  3. Селектор — карта из одной записи, {subtree: …} или {regex: …}, обозначающая набор файлов; см. Селекторы.

Каждый импортированный файл — отдельный слой и пишется как любой файл конфигурации. Слои идут в порядке записи, затем корневой файл: для списка выше это strict, config/architecture.yaml, файлы ниже config/teams, qmx.yaml. Более поздняя запись переопределяет более раннюю, а корневой файл — их все; каждый ключ по своей политике, описанной в разделе Как сливаются слои. Вся цепочка стоит там же, где qmx.yaml: выше всех пресетов из командной строки, ниже самой командной строки. -v называет каждый файл в этом порядке (Configuration loaded from: defaults, strict, config/architecture.yaml, config/teams/a.yaml, config/teams/b.yaml, qmx.yaml, cli).

Пути. Запись imports разрешается относительно каталога файла, который её написал, поэтому --config=sub/qmx.yaml с imports: [base.yaml] читает sub/base.yaml, а импортированный config/a.yaml с imports: [b.yaml] читает config/b.yaml. Если файл — симлинк, это каталог файла, на который он указывает: конфигурация, подключённая в проект ссылкой, читает базы рядом с собой. Любой другой путь в любом файле цепочки — paths, exclude, cache.dir — по-прежнему отсчитывается от рабочего каталога, как в корневом файле. Отказы и -v называют импортированный файл этим путём, увиденным от имени файла, который его импортировал (./ отбрасывается, .. сохраняется), — или полным путём, если тот файл — симлинк, — вместе с файлом, который его импортировал.

Встроенные пресеты

imports: [strict] применяет встроенный пресет так же, как --preset=strict, но из файла конфигурации. Поэтому pre-commit-хук и GitHub Action — ни один из них не передаёт --preset — судят по тем же правилам, что и локальный qmx check --preset=strict.

  • Пресет стоит там же, где стоит назвавший его файл, поэтому ключи самого файла его переопределяют. Пресет из --preset остаётся ниже всей цепочки.
  • Называйте его голым именем. Голое имя, которого нет среди встроенных, отвергается на своей позиции: Unknown preset "x". Available presets: ci, legacy, strict. A file needs a .yaml or .yml extension. Чтобы импортировать свой файл, напишите расширение (team.yaml).
  • Отказы и -v называют его strict, а source[] в JSON — {"kind": "preset", "name": "strict", "imported_by": {…}}. Тот же пресет из --preset — отдельный слой с именем preset:strict; если назвать его обоими способами, он применится в обоих местах.
  • По имени импортируются только встроенные пресеты. Файл пресета, написанный вами, — это файл: импортируйте его по пути.

Селекторы

Селектор обозначает набор файлов, который меняется без правки корневого файла, например config/qmx, куда другие инструменты кладут свои части. Форма та же, что у селекторов suppress_paths:

imports:
  - subtree: config/qmx                                   # каталог и всё ниже него
  - regex: 'vendor/acme/[^/]+/qmx-extension\.yaml'         # совпадать должен весь относительный путь
  • Какие файлы. Каждый файл с именем на .yaml или .yml (в любом регистре) ниже каталога файла, написавшего запись, под своим путём от этого каталога. Селектор никогда не выходит выше этого каталога; файл выше — это запись-строка (../shared.yaml).
  • subtree называет каталог ниже каталога импортирующего файла и обозначает все файлы ниже него, на любой глубине. Каталог обязан существовать. {exact: …} отвергается: один файл — это обычная строка.
  • regex — фрагмент PCRE, который обязан совпасть со всем путём от каталога импортирующего файла (config/teams/a.yaml, а не a.yaml), как и в suppress_paths. Обход ограничивает литеральный каталог в начале фрагмента: vendor/[^/]+/qmx\.yaml смотрит только внутри vendor/, и этот каталог обязан существовать и сопоставляется с именами на диске буква в букву. Фрагмент, начинающийся со спецсимвола или содержащий | либо ) где угодно, обходит весь каталог импортирующего файла, включая vendor/ и node_modules/, и отвергается любым каталогом ниже, который нельзя перечислить или войти в него, даже если шаблон его никогда не выберет. Начинайте regex с литерального каталога (config/qmx/…), чтобы ограничить обход и избежать этого.
  • Порядок. Файлы одного селектора не упорядочены между собой, кроме того, что требуют их собственные импорты и другие записи списка (см. Вложенные импорты); если ничто не решает, действует байтовый порядок пути, и более позднее имя переопределяет более раннее. Если порядок важен, назовите файлы отдельными записями в нужном порядке.
  • Пропускаются, а не отвергаются. Файл, названный строкой где угодно в том же списке, файл, который уже обозначил более ранний селектор, и сам импортирующий файл. Каталог, достижимый под несколькими именами (симлинк), обходится под каждым именем; файл, найденный дважды, импортируется один раз, под первым путём в байтовом порядке.
  • Отвергаются. Каталог, который при обходе нужно перечислить или войти в него, но нельзя (нет права чтения или поиска — это отказ, а не пропуск); имя .yaml / .yml, которое селектор выбирает, но которое не обычный файл (битая ссылка, канал); subtree или префикс regex, не являющийся существующим каталогом. Имена файлов, которые селектор не выбирает, не проверяются; в каталоги заходят всегда.
  • Отсутствие совпадений допускается и не сообщается — ради этого селектор по файлам, которых может не быть, и нужен. Цена: опечатка в шаблоне ничему не соответствует и молчит (regex после литерального префикса; файлы .yml при шаблоне на \.yaml); один раз проверьте -v.

Не используйте селектор по vendor/

Каждый файл, который выбрал селектор, становится слоем вашей конфигурации и может изменить любой ключ, в том числе порог падения. {subtree: vendor} отдаёт эту власть каждому установленному пакету. По той же причине никогда не выбирайте имя, которым пакеты называют собственную конфигурацию (qmx.yaml): вы импортировали бы конфигурации, написанные для других проектов. Импортируйте доверенные пакеты по пути или сузьте regex до одного имени файла, которое задаёт соглашение расширений.

Вложенные импорты

Любой файл, прочитанный через imports, может сам писать imports: общий стандарт делится на части без того, чтобы потребитель перечислял их. Это относится и ко встроенным пресетам, хотя ни один из них imports не пишет. Файлу, переданному в --preset, нельзя: он отвергается, а подсказка велит импортировать файл из файла конфигурации или передать каждый как отдельный --preset.

# qmx.yaml
imports: [team/standard.yaml]
fail_on: error

# team/standard.yaml
imports: [strict, thresholds.yaml]   # team/thresholds.yaml

Слои: strict, team/thresholds.yaml, team/standard.yaml, qmx.yaml. Импортируемое файлом всегда стоит ниже самого файла, а внутри одного списка более поздняя запись стоит выше более ранней. Файл, достигнутый дважды, читается один раз и встаёт один раз — обычный случай показан ромбом ниже:

Граф Слои, от нижнего
F: [A, B] A B F
F: [A, B], A: [D], B: [D] (ромб) D A B F
F: [D, A], A: [D] D A F
F: [A, D], A: [D] отказ

Порядок — C3-линеаризация (порядок разрешения методов в Python), поэтому файл значит одно и то же, какой бы файл его ни импортировал (селектор в импортированном файле может это нарушить; см. ADR 0140). Отсюда два отказа:

  • Цикл отвергается на записи, которая его замыкает, с названием файлов: … closes an import cycle: "cfg/a.yaml" imports "cfg/b.yaml" imports "cfg/a.yaml".
  • Противоречивый приоритет отвергается на файле, чьи записи нельзя выполнить все сразу; отказ называет каждое требование вместе с записью, из которой оно следует, и то, как был достигнут каждый файл: F: [A, D] ставит D выше A, а A импортирует D и потому требует A выше D. Переставьте записи или уберите одну.

Отказ может возникнуть из пары файлов, которую вы вместе не писали: F: [a, b, c], c: [b, d], d: [a] отвергается, потому что c через d ставит a выше b. Отказ печатает этот выведенный порядок.

Прочие отказы

До чтения файла отвергаются: один файл дважды в списке (два написания одного файла или симлинк на него считаются одним файлом), файл, импортирующий сам себя, каталог или другой не обычный файл, URL, файл не с расширением .yaml или .yml и селектор exact. imports — список даже для одного файла; imports: ~ и imports: [] ничего не импортируют.

Что может изменить более поздний файл

Переопределение следует политике слияния каждого ключа, поэтому у некоторых правок нет написания:

Вид узла Более поздний файл…
скаляр (fail_on, memory_limit, пороги) заменяет значение
карта (cache, coupling, опции одного правила) сливается по ключам
карта по именам (rules, computed_metrics, architecture.allow) сливается запись за записью
список (paths, only_rules, architecture.layers, framework_namespaces) заменяет весь список — дописать нельзя
множество (exclude, suppress_*, disabled_rules, exclude_health) добавляет — убрать запись базы нельзя
сокращение (threshold) раскрывается в написавшем его файле: поздний warning сохраняет error базы
~ / {} «не записано» / «ничего не меняет» — никогда не сброс

То, что проект может захотеть изменить, — paths, exclude, suppress_* — держите в корневом файле, а не в общей базе: запись множества из базы забрать обратно нельзя. Находка о том, что настроенное значение ничему не соответствует, называет файл, который его записал. Если этот файл — база в каталоге установки Composer проекта (vendor/), то ничему не соответствующая запись exclude, suppress_paths или suppress_namespaces, а также значение записи suppress_namespace_channels правила перечисляются в projectScope.unjudgedValues вместо находки — проект не смог бы их убрать (см. правила подавления).

Baseline и architecture.unmatched-type

Находка architecture.unmatched-type идентифицируется типом и путём, по которому он записан, например architecture.layers[0].implements[1]. Перенос этого критерия в импортированный файл или добавление пресета сохраняют находку и её запись в baseline; перенос на другой путь меняет идентичность.


Полный пример

# Или начните с пресета и настройте:
# vendor/bin/qmx check src/ --preset=strict

paths:
  - src/

exclude:
  - subtree: vendor
  - subtree: tests/Fixtures

suppress_paths:
  - subtree: src/Entity
  - subtree: src/DTO

suppress_namespaces:
  - subtree: App\Tests

include_generated: false

format: summary
fail_on: error

cache:
  enabled: true
  dir: /home/user/.cache/qmx

parallel:
  workers: 4

coupling:
  framework-namespaces:
    - subtree: Symfony
    - subtree: Doctrine

exclude_health:
  - typing

disabled_rules:
  - code-smell.boolean-argument
  - duplication.clone

rules:
  complexity.ccn:
    suppress_namespaces:
      - subtree: App\Tests
    suppress_paths:
      - subtree: src/Generated
    callable:
      warning: 15
      error: 25

  size.method-count:
    warning: 25
    error: 40

Параметры CLI имеют приоритет

Параметры командной строки всегда имеют приоритет над значениями из конфигурационного файла. Например:

# В конфиге указано paths: [src/], но CLI переопределяет
vendor/bin/qmx check lib/

# Добавить дополнительное подавление поверх конфига
vendor/bin/qmx check src/ --suppress-path='subtree:src/Generated'

Это позволяет экспериментировать без редактирования файла конфигурации.


Как сливаются слои

Каждый источник конфигурации — это слой: встроенные умолчания, то, что находит обнаружение composer.json, каждый пресет в порядке перечисления, файлы и пресеты, которые импортирует qmx.yaml, сам qmx.yaml и командная строка — каждый стоит над предыдущими.

Каждый слой читается так, как он написан. Его ключи распознаются, а форма каждого написанного им значения судится в этом же слое, до всякого слияния, поэтому опечатка в ключе или неверное значение в пресете отклоняются, даже когда ваш файл их перекрывает. Затем слои сливаются, каждый ключ — по объявленной им политике. Ограничение, которому нужен слитый документ, — имя слоя, на которое ссылается architecture.allow, или метрика, к которой обращается формула, — судится один раз, по слитому значению. Синтаксис самой формулы проверяется в каждом написавшем её слое. Отказ о разрешённом значении и каждое предупреждение называют слой, написавший значение, о котором идёт речь; в --format=json это поле source (см. Форматы вывода). rules, only_rules и disabled_rules Finding объявлены в том же документе. Формы правил, нижние записи и пути сохраняют реальное происхождение; selection и effective bands завершаются до публикации runtime state.

Пять правил описывают движок документа; формы значений объявляют владельцы:

Значение, неверность которого видна без слитого контекста, отклоняется в каждом записавшем его слое: неверная форма, запрещённая пустота или значение вне закрытого словаря. format: bogus и cache: {dir: ""} в файле отклоняются даже под корректным --format или --cache-dir. Ограничение, зависящее от других слитых значений, проверяется у победителя. Текстовый отказ называет написавший слой; JSON публикует его в source.

Это относится и к каждому списку coupling.framework_namespaces: непустые шаблоны неймспейсов, корректный regex и предел 256 селекторов проверяются до замены списка. У каждого списка architecture.layers проверяются уникальность имён и шаблонов, критерии принадлежности и привязки шаблонных слоёв. Верхний список не скрывает эти дефекты. Ссылкам и циклам architecture.allow по-прежнему нужен слитый набор слоёв.

  • ~ значит «не написано». Ключ, записанный как ~ или оставленный пустым (key:), оставляет значение нижнему слою. Сам ключ при этом распознаётся: ключ с опечаткой отклоняется, даже если его значение — ~. В карте, ключами которой служат имена (computed_metrics, architecture.allow), у записи name: ~ имя всё равно проверяется.
  • Пустая карта ничего не меняет. cache: {} или computed_metrics: {} поверх пресета сохраняют всё, что написал пресет. Пустая карта не сбрасывает секцию к умолчаниям; напишите нужные значения явно.
  • Список заменяется или накапливается — в зависимости от ключа. paths, only_rules, architecture.layers, список целей одного слоя в architecture.allow и levels вычисляемой метрики заменяются целиком последним написавшим их слоем. Пустой список тоже заменяет, но должен удовлетворять ограничениям владельца: paths: [] отклоняется. exclude, suppress_paths, suppress_namespaces, disabled_rules и exclude_health накапливаются: каждый слой добавляет свои элементы. Элемент списка — это значение, а не ненаписанный ключ, поэтому элемент ~ отклоняется.
  • Сокращение раскрывается в написавшем его слое, до всякого слияния. threshold: 5 в пресете — это warning: 5 и error: 5 в этом пресете, поэтому файл, написавший поверх только warning: 3, получает warning 3 и error 5. Сокращение рядом с одним из его ключей в том же слое отклоняется.
  • У ключа три написания: snake_case, kebab-case и camelCase его слов — fail_on, fail-on, failOn. Любое другое написание тех же слов (Fail_On, FAILON, failon) отклоняется с подсказкой принятого — для каждого ключа из таблицы ниже.
# пресет
computed_metrics:
  computed.risk:
    formula: "m['complexity.ccn.max'] ?? 0"
    levels: [class]
    threshold: 20          # warning: 20 и error: 20 — в пресете
# qmx.yaml
computed_metrics:
  computed.risk:
    warning: 10            # формула, levels и error 20 по-прежнему из пресета
  health.typing:
    enabled: false         # единственный способ убрать метрику, написанную нижним слоем

Что написать нельзя

У трёх вещей нет написания — намеренно:

  • Удалить ключ, написанный нижним слоем. Верхний слой не может удалить вычисляемую метрику пресета или его запись architecture.allow для слоя. Вычисляемая метрика выключается через enabled: false; список разрешений слоя можно заменить, в том числе на [], — это запрещает слою всё, а не удаляет запись.
  • Заменить весь набор вычисляемых метрик пресета. Каждая метрика сливается сама по себе, по имени.
  • Вернуть умолчание, не написав его. И ~, и {} оставляют нижний слой; чтобы вернуть значение по умолчанию поверх пресета, напишите это значение.

В прежних версиях пустая карта сбрасывала свою секцию; что изменилось — см. журнал изменений.

Объявленный раздел правил

Generated table отражает зарегистрированные объявления и обновляется тем же штатным generator. Finding читает resolved nodes без второго raw merge.

  • rules — опции и блоки уровней сливаются по объявленным листьям. Сокращение раскрывается в написавшем слое, null/пустые maps сохраняют нижние записи. Boolean правила меняет только enabled. Defaults возвращаются явными значениями.
# пресет
rules: {complexity.ccn: {callable: {threshold: 5}}}
vendor/bin/qmx check src/ --preset=my-preset.yaml \
  --rule-opt='complexity.ccn:callable.warning=2'

Результат — warning 2 с командной строки и error 5 из сокращения пресета, а не скомпилированный дефолт правила.

Предупреждения о конфигурации

Конфигурация, законная, но, вероятно, означающая не то, что имелось в виду, принимается с предупреждением, а не отклоняется. Каждая команда, читающая конфигурацию, печатает такие предупреждения в stderr с префиксом Warning:, а --format=json дополнительно перечисляет их в configurationDiagnostics — каждое со слоями, к которым оно относится. Например, only_rules: [] в qmx.yaml поверх пресета, фильтрующего правила, законно — пустой only_rules не применяет фильтра — и об этом сказано:

Warning: "only_rules" is written empty in configuration file "qmx.yaml" and replaces the list preset "./ci-filter.yaml" wrote. An empty only_rules applies no rule filter: every enabled rule runs.

Все ключи

Таблица сгенерирована из объявлений, по которым сливает движок конфигурации. <name> обозначает имя, которое выбираете вы, а [] — любой элемент списка: ключи элемента читаются из слоя, записавшего список, и не сливаются. Владелец ключа всё ещё может отклонить слитое значение, которое политика пропустила, — формулу со ссылкой на неизвестную вычисляемую метрику или разрешение для слоя, которого layers не объявляет.

Таблица перечисляет suppress-namespaces и suppress-paths под каждым правилом, но у producer только с project-scoped находками они принимают лишь пустой список или null; см. Producer только с project-scoped находками. То же верно для suppress-namespace-channels: его записи должны называть канал, который отчитывается на уровне неймспейса.

Ключ Значение Между слоями Записано ~ Записано пустым ({}, [])
architecture карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
architecture.layers список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
architecture.layers[].name строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
architecture.layers[].patterns читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].suffix читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].attributes читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].member_attributes читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].implements читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].extends читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].match строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
architecture.layers[].pending boolean Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
architecture.layers[].exclude карта Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Ничего не записывает: как если бы ключа не было.
architecture.layers[].exclude.patterns читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].exclude.suffix читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].exclude.attributes читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].exclude.member_attributes читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].exclude.implements читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].exclude.extends читает владелец Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Решает владелец.
architecture.layers[].exclude.match строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
architecture.allow карта по имени: имена сверяются с architecture.layers после слияния всех слоёв Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
architecture.allow.<name> список (элемент: читает владелец) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Заменяет нижний список пустым.
architecture.coverage-gap строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
architecture.max_expanded_layers целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
cache карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
cache.dir строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
cache.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
computed_metrics.<name> карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
computed_metrics.<name>.description строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.formula строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.formulas карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
computed_metrics.<name>.formulas.class строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.formulas.namespace строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.formulas.project строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.inverted boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.levels список (элемент: строка) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
computed_metrics.<name>.warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
computed_metrics.<name>.threshold число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
coupling карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
coupling.framework_namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
coupling.framework_namespaces[].exact строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
coupling.framework_namespaces[].subtree строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
coupling.framework_namespaces[].regex строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
disabled_rules список (элемент: строка) Каждый слой добавляет свои элементы; повторы схлопываются. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Ничего не добавляет.
exclude список (элемент: карта) Каждый слой добавляет свои элементы; повторы схлопываются. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Ничего не добавляет.
exclude[].exact строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
exclude[].subtree строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
exclude[].regex строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
exclude_health список (элемент: строка) Каждый слой добавляет свои элементы; повторы схлопываются. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Ничего не добавляет.
fail_on строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
format строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
imports список (элемент: читает владелец) Читается из каждого файла отдельно, в корневом файле и в любом файле, прочитанном через imports; между слоями не сливается. Не записано: файл ничего не импортирует. Элемент ~ — отказ. Файл ничего не импортирует.
include_autoload_dev boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
include_generated boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
memory_limit строка или целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
only_rules список (элемент: строка) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым. Если нижний список не пуст, выводится предупреждение.
parallel карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
parallel.workers целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
paths список (элемент: строка) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.annotation.directive карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.annotation.directive.unused-directive-severity строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.annotation.directive.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.annotation.directive.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.annotation.directive.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.annotation.directive.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.annotation.directive.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.circular-dependency карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.architecture.circular-dependency.direct-as-error boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.circular-dependency.ignore-relations список (элемент: строка) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.circular-dependency.max-cycle-size целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.circular-dependency.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.circular-dependency.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.architecture.circular-dependency.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.circular-dependency.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.circular-dependency.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.layer-declaration карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.architecture.layer-declaration.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.layer-declaration.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.architecture.layer-declaration.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.layer-declaration.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.layer-declaration.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.layer-violation карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.architecture.layer-violation.severity строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.layer-violation.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.layer-violation.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.architecture.layer-violation.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.layer-violation.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.layer-violation.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.unassigned-class карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.architecture.unassigned-class.mode строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.unassigned-class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.architecture.unassigned-class.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.architecture.unassigned-class.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.unassigned-class.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.architecture.unassigned-class.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.baseline.unused-entry карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.baseline.unused-entry.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.baseline.unused-entry.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.baseline.unused-entry.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.baseline.unused-entry.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.baseline.unused-entry.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.boolean-argument карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.boolean-argument.allowed-prefixes список (элемент: строка) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.boolean-argument.flag-promoted-properties boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.boolean-argument.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.boolean-argument.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.boolean-argument.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.boolean-argument.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.boolean-argument.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.constructor-overinjection карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.constructor-overinjection.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.constructor-overinjection.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.constructor-overinjection.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.constructor-overinjection.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.constructor-overinjection.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.constructor-overinjection.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.constructor-overinjection.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.constructor-overinjection.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.count-in-loop карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.count-in-loop.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.count-in-loop.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.count-in-loop.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.count-in-loop.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.count-in-loop.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.debug-code карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.debug-code.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.debug-code.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.debug-code.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.debug-code.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.debug-code.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.empty-catch карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.empty-catch.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.empty-catch.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.empty-catch.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.empty-catch.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.empty-catch.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.error-suppression карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.error-suppression.allowed-functions список (элемент: строка) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.error-suppression.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.error-suppression.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.error-suppression.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.error-suppression.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.error-suppression.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.eval карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.eval.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.eval.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.eval.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.eval.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.eval.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.exit карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.exit.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.exit.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.exit.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.exit.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.exit.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.goto карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.goto.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.goto.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.goto.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.goto.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.goto.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.identical-subexpression карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.identical-subexpression.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.identical-subexpression.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.identical-subexpression.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.identical-subexpression.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.identical-subexpression.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.long-parameter-list карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.long-parameter-list.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.long-parameter-list.vo-error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.long-parameter-list.vo-warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.long-parameter-list.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.long-parameter-list.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.long-parameter-list.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.long-parameter-list.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.long-parameter-list.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.long-parameter-list.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.long-parameter-list.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.long-parameter-list.vo-threshold целое число Сокращение для vo-warning и vo-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.superglobals карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.superglobals.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.superglobals.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.superglobals.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.superglobals.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.superglobals.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.unreachable-code карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.unreachable-code.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.unreachable-code.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.unreachable-code.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.unreachable-code.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.unreachable-code.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.unreachable-code.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.unreachable-code.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.unreachable-code.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.unused-private карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.code-smell.unused-private.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.code-smell.unused-private.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.code-smell.unused-private.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.unused-private.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.code-smell.unused-private.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.cohesion.lcom карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.cohesion.lcom.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.cohesion.lcom.exclude-methods список (элемент: строка) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.cohesion.lcom.exclude-readonly boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.cohesion.lcom.min-methods целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.cohesion.lcom.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.cohesion.lcom.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.cohesion.lcom.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.cohesion.lcom.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.cohesion.lcom.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.cohesion.lcom.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.cohesion.lcom.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.complexity.ccn.callable карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.ccn.callable.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.callable.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.callable.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.callable.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.class карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.ccn.class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.class.max-error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.class.max-warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.class.threshold целое число Сокращение для max-warning и max-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.ccn.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.ccn.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.ccn.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.ccn.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.ccn.threshold целое число Сокращение для callable.threshold: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.complexity.cognitive.callable карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.cognitive.callable.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.callable.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.callable.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.callable.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.class карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.cognitive.class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.class.max-error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.class.max-warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.class.threshold целое число Сокращение для max-warning и max-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.cognitive.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.cognitive.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.cognitive.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.cognitive.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.cognitive.threshold целое число Сокращение для callable.threshold: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.complexity.npath.callable карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.npath.callable.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.callable.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.callable.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.callable.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.class карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.npath.class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.class.max-error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.class.max-warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.class.threshold целое число Сокращение для max-warning и max-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.npath.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.npath.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.npath.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.npath.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.npath.threshold целое число Сокращение для callable.threshold: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.wmc карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.complexity.wmc.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.wmc.exclude-data-classes boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.wmc.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.wmc.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.complexity.wmc.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.complexity.wmc.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.wmc.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.wmc.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.complexity.wmc.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.computed карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.computed.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.computed.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.computed.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.computed.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.computed.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.cbo карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.coupling.cbo.class карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.cbo.class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.class.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.class.scope строка Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.class.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.class.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.namespace карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.cbo.namespace.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.namespace.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.namespace.min-class-count целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.namespace.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.namespace.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.cbo.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.cbo.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.cbo.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.cbo.threshold целое число Сокращение для class.threshold и namespace.threshold: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.warning целое число Сокращение для class.warning и namespace.warning: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.error целое число Сокращение для class.error и namespace.error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.cbo.scope строка Сокращение для class.scope: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.class-rank карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.coupling.class-rank.error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.class-rank.warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.class-rank.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.class-rank.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.class-rank.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.class-rank.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.class-rank.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.class-rank.threshold число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.distance карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.coupling.distance.include-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.distance.max-distance-error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.distance.max-distance-warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.distance.min-type-count целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.distance.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.distance.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.distance.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.distance.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.distance.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.distance.threshold число Сокращение для max-distance-warning и max-distance-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.coupling.instability.class карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.instability.class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.class.max-error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.class.max-warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.class.min-afferent целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.class.threshold число Сокращение для max-warning и max-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.namespace карта Сливается по ключам; записанная пустая карта ничего не меняет. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.instability.namespace.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.namespace.max-error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.namespace.max-warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.namespace.min-afferent целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.namespace.min-type-count целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.namespace.threshold число Сокращение для max-warning и max-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.instability.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.instability.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.instability.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.instability.threshold число Сокращение для class.threshold и namespace.threshold: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.max-warning число Сокращение для class.max-warning и namespace.max-warning: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.instability.max-error число Сокращение для class.max-error и namespace.max-error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.unmatched-framework-namespace карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.coupling.unmatched-framework-namespace.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.coupling.unmatched-framework-namespace.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.coupling.unmatched-framework-namespace.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.unmatched-framework-namespace.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.coupling.unmatched-framework-namespace.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.data-class карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.design.data-class.exclude-exceptions boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.data-class.exclude-promoted-only boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.data-class.exclude-readonly boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.data-class.min-members целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.data-class.wmc-threshold целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.data-class.woc-threshold целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.data-class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.data-class.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.design.data-class.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.data-class.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.data-class.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.dit карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.design.dit.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.dit.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.dit.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.dit.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.design.dit.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.dit.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.dit.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.dit.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.design.god-class.class-loc-threshold целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.exclude-readonly boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.lcom-threshold целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.min-criteria целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.min-methods целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.tcc-threshold число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.wmc-threshold целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.god-class.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.design.god-class.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.god-class.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.god-class.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.noc карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.design.noc.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.noc.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.noc.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.noc.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.design.noc.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.noc.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.noc.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.noc.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.param карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.design.type-coverage.param.error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.param.warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.param.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.param.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.design.type-coverage.param.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.param.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.param.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.param.threshold число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.property карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.design.type-coverage.property.error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.property.warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.property.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.property.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.design.type-coverage.property.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.property.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.property.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.property.threshold число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.return карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.design.type-coverage.return.error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.return.warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.return.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.design.type-coverage.return.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.design.type-coverage.return.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.return.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.return.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.design.type-coverage.return.threshold число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.discovery.unmatched-exclude карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.discovery.unmatched-exclude.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.discovery.unmatched-exclude.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.discovery.unmatched-exclude.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.discovery.unmatched-exclude.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.discovery.unmatched-exclude.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.duplication.clone карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.duplication.clone.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.duplication.clone.min-lines целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.duplication.clone.min-tokens целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.duplication.clone.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.duplication.clone.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.duplication.clone.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.duplication.clone.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.duplication.clone.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.cohesion карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.health.cohesion.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.health.cohesion.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.health.cohesion.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.cohesion.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.cohesion.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.complexity карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.health.complexity.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.health.complexity.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.health.complexity.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.complexity.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.complexity.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.coupling карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.health.coupling.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.health.coupling.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.health.coupling.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.coupling.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.coupling.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.maintainability карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.health.maintainability.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.health.maintainability.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.health.maintainability.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.maintainability.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.maintainability.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.overall карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.health.overall.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.health.overall.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.health.overall.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.overall.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.overall.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.typing карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.health.typing.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.health.typing.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.health.typing.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.typing.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.health.typing.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.maintainability.mi карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.maintainability.mi.error число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.maintainability.mi.exclude-tests boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.maintainability.mi.min-statements целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.maintainability.mi.warning число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.maintainability.mi.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.maintainability.mi.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.maintainability.mi.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.maintainability.mi.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.maintainability.mi.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.maintainability.mi.threshold число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.security.command-injection карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.security.command-injection.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.security.command-injection.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.security.command-injection.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.command-injection.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.command-injection.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.hardcoded-credentials карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.security.hardcoded-credentials.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.security.hardcoded-credentials.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.security.hardcoded-credentials.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.hardcoded-credentials.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.hardcoded-credentials.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.sensitive-parameter карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.security.sensitive-parameter.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.security.sensitive-parameter.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.security.sensitive-parameter.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.sensitive-parameter.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.sensitive-parameter.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.sql-injection карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.security.sql-injection.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.security.sql-injection.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.security.sql-injection.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.sql-injection.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.sql-injection.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.xss карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.security.xss.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.security.xss.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.security.xss.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.xss.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.security.xss.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.class-count карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.size.class-count.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.class-count.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.class-count.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.class-count.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.size.class-count.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.class-count.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.class-count.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.class-count.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.method-count карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.size.method-count.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.method-count.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.method-count.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.method-count.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.size.method-count.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.method-count.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.method-count.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.method-count.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.property-count карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.size.property-count.error целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.property-count.exclude-promoted-only boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.property-count.exclude-readonly boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.property-count.warning целое число Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.property-count.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.size.property-count.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.size.property-count.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.property-count.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.property-count.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.size.property-count.threshold целое число Сокращение для warning и error: раскрывается в слое, который его записал, до слияния; дальше каждый ключ сливается сам. Сокращение рядом с одним из них в том же слое — отказ. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.suppression.configuration карта Сливается по ключам; записанная пустая карта ничего не меняет. Имя проверяется; тело остаётся за нижним слоем. Ничего не меняет.
rules.suppression.configuration.enabled boolean Побеждает последний слой, записавший значение. Не записано: остаётся значение нижнего слоя. Отказ: ожидается скаляр.
rules.suppression.configuration.suppress-namespace-channels карта по имени: имя проверяется по грамматике секции в слое, который его записал Сливается запись за записью по имени; каждая запись — по своей политике. Не записано: остаётся значение нижнего слоя. Ничего не меняет.
rules.suppression.configuration.suppress-namespace-channels.<name> список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Имя проверяется; тело остаётся за нижним слоем. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.suppression.configuration.suppress-namespaces список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
rules.suppression.configuration.suppress-paths список (элемент: карта) Последний записавший слой заменяет список целиком; пустой список тоже заменяет. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Заменяет нижний список пустым.
suppress_namespaces список (элемент: карта) Каждый слой добавляет свои элементы; повторы схлопываются. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Ничего не добавляет.
suppress_namespaces[].exact строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
suppress_namespaces[].subtree строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
suppress_namespaces[].regex строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
suppress_paths список (элемент: карта) Каждый слой добавляет свои элементы; повторы схлопываются. Не записано: остаётся значение нижнего слоя. Элемент ~ — отказ. Ничего не добавляет.
suppress_paths[].exact строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
suppress_paths[].subtree строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.
suppress_paths[].regex строка Читается из слоя, записавшего список; между слоями не сливается. Не записано: как если бы ключа не было. Отказ: ожидается скаляр.

Валидация конфигурации

Qualimetrix валидирует конфигурационный файл и сообщает о типичных ошибках понятными сообщениями.

Неизвестные ключи

Любой нераспознанный ключ — на верхнем уровне или внутри секции — вызывает ошибку с подсказкой:

Configuration error: Unknown key "parallel.workes" in configuration file "qmx.yaml" (did you mean "workers"?). Accepted keys: workers.
Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt

Ключ неизвестен при любом значении, включая ~, и в каком бы слое он ни был написан: опечатка пресета отклоняется так же, как опечатка вашего файла. Ключ, написанный не одним из трёх принятых способов, отклоняется с принятым написанием:

Configuration error: Key "Fail_On" in configuration file "qmx.yaml" is not written in an accepted spelling; write "fail_on" (its snake_case, camelCase and kebab-case spellings are accepted).
Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt

То же правило написания действует для ключей и уровней в --rule-opt. При неправильном регистре имени правила предлагается точное зарегистрированное имя. Отказ CLI сохраняет полную написанную запись флага и значения рядом с источником.

Ошибки типов

Symfony YAML читает +2 и 2.0 без кавычек как float. Целочисленные опции отказываются от обоих значений в файле, --rule-opt и специальных алиасах, называют прочитанное значение и объясняют, что целое надо писать как 2. Отказ файла называет путь; CLI также сохраняет полную написанную запись. "+2" остаётся строкой. Экспоненты и переполнение по-прежнему отклоняются целочисленными опциями.

Если значение имеет неверный тип, вы получите понятное сообщение вместо молчаливого отката на значение по умолчанию:

Configuration error: "cache.enabled" in configuration file "qmx.yaml" must be boolean, got string.
Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt

Неизвестные имена правил

Опечатки в именах правил в секции rules: отклоняются:

Configuration error: Rule option owner "complexty.ccn" does not match any registered producer rule. Did you mean "complexity.ccn"?
Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt

Неизвестные ключи опций правила

Ключ опции, которого у правила нет, — ошибка конфигурации на любой глубине, где его можно написать: прогон останавливается с кодом 3, анализ не выполняется:

Configuration error: Unknown key "rules.complexity.ccn.warning_threshold" in configuration file "qmx.yaml". Accepted keys: callable, class, enabled, suppress-namespace-channels, suppress-namespaces, suppress-paths, threshold.
Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt

Внутри слота уровня сообщение называет слот, потому что множество допустимых ключей своё у каждого уровня, а не у правила целиком:

Configuration error: Unknown key "rules.complexity.ccn.class.warning" in configuration file "qmx.yaml". Accepted keys: enabled, max-error, max-warning, threshold.
Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt

--rule-opt тоже отказывает с кодом 3, но называет свой флаг (Source: option --rule-opt.); текст и подсказки YAML и CLI могут различаться.

Ключ сохраняет авторское написание

Неизвестный ключ сохраняет разделители: max_warnign печатается как "max_warnign", без свёртки. Отказ файла называет полный авторский путь ключа и файл, отказ CLI — флаг. Допустимые ключи перечисляются в каноническом kebab-написании объявления.

Форма значения

Два правила ниже действуют для любого ключа этого документа — для корней, секций, поддерева rules: и слотов уровня внутри него одинаково. Это не свойство опций правил; опции правил — просто то место, где вы встречаете их чаще всего.

Каждый ключ объявляет форму, которую может принять его значение. Значение иной формы завершает прогон с кодом 3. Оно никогда не приводится к чему-то пригодному и никогда не отбрасывается в пользу значения по умолчанию при успешном отчёте. Судится каждый источник, из которого приходит значение, а не только победивший: неверный format: или cache_dir: в файле отклоняется даже тогда, когда его перекрыли из командной строки, — значение, которым никто не воспользуется, всё равно кем-то написано:

Configuration error: "rules.complexity.ccn.callable.warning" in configuration file "qmx.yaml" must be integer at least 0, got string.
Configuration error: "only_rules" in configuration file "qmx.yaml" must be a list, got a map.
Configuration error: "cache" in configuration file "qmx.yaml" must be a map, got a list.

Это три отдельных прогона, по одной ошибке на каждый, — реальный прогон останавливается на своей первой же ошибке. stderr каждого из них заканчивается той же строкой-указателем на документацию, что и по всей этой странице (например, Docs: https://qualimetrix.dev · AI agents: https://qualimetrix.dev/llms.txt); здесь она опущена, чтобы три сообщения можно было сравнить рядом друг с другом.

Формы, которые может запросить ключ, в тех словах, которыми их называет отказ:

Форма Принимает
a boolean true / false
a non-negative whole number 15 или 0 — не 10.5, не "15" и не -1
a non-negative number 15, 10.5 или 0 — не -0.5
a number число любого знака (только пороги вычисляемых метрик)
a string любую строку, включая пустую
a non-empty string строку хотя бы с одним непробельным символом
a list of X YAML-последовательность, каждый элемент формы X
a map of X YAML-отображение, ключи которого называете вы; значения формы X
a block of options отображение, за собственные ключи которого отвечает другое объявление

Шесть следствий стоит проговорить отдельно — каждое из них раньше проходило незамеченным:

  • Число в кавычках — это строка. warning: "15" отклоняется там, где объявлено целое; пишите warning: 15. Различие относится только к YAML: значения, пришедшие из командной строки, по построению являются текстом и приводятся до проверки формы, поэтому --rule-opt="size.method-count:threshold=25" и --rule-opt="complexity.ccn:enabled=false" работают как раньше.
  • Целое — это не дробь, кроме перечисленных здесь ключей, объявивших «a non-negative number». warning: 10.5 отклоняется там, где объявлено целое, а таким образом объявлено большинство порогов этого документа. Ключи ниже объявляют «a non-negative number» вместо этого и потому принимают дробь точно в написанном виде — каждый измеряет непрерывную величину, а не считает что-то: индекс сопровождаемости (maintainability.mi.error / .warning / .threshold), нестабильность (coupling.instability.max-error / .max-warning / .threshold, те же три и на слотах уровня class. и namespace.), дистанция от главной последовательности (coupling.distance.max-distance-error / .max-distance-warning / .threshold), ClassRank (coupling.class-rank.error / .warning / .threshold), покрытие типами (design.type-coverage.param.error / .warning / .threshold, те же три под .property. и .return.) и порог TCC на design.god-class.tcc-threshold. Это свойство объявленной формы КОНКРЕТНОГО ключа, а не его правила или семейства целиком: ключи, стоящие рядом с принимающим, остаются целыми и отклоняют дробь, потому что считают что-то, а не измеряют, — coupling.distance.min-type-count, coupling.instability.min-afferent (на каждом слоте уровня) и coupling.instability.namespace.min-type-count каждый раз считают типы или файлы, а не отношение.
  • Порог или счётчик не бывает отрицательным. Каждая числовая опция под rules: — это счётчик или граница измерения, которое не может быть отрицательным, а отрицательная граница не ужесточает правило, а переворачивает его: warning: -1 на size.method-count сообщил бы о каждом классе. Такое значение отклоняется с указанием самого значения — и из файла, и из --rule-opt, а сокращение threshold: -1 называется как threshold, то есть тем ключом, который был написан. Ноль принимается. warning / error / threshold вычисляемой метрики сохраняют оба знака: её формулу пишете вы, и она вполне может быть отрицательной.
  • Список и карта не взаимозаменяемы. only_rules: {a: complexity.ccn} и exclude_methods: {a: getName} отклоняются; пишите only_rules: [complexity.ccn] и exclude_methods: [getName]. То же в другую сторону: cache: [dir] отклоняется, потому что cache: — секция именованных ключей.
  • Списки селекторов состоят из отображений с одной парой, без scalar-сокращений. Для каталога с буквальным именем 2024 пишите - exact: '2024'; bare scalar одинаково отвергается в suppress_paths, suppress_namespaces, exclude, framework namespaces и per-rule списках.
  • Пустая строка — самостоятельная форма. Она отклоняется везде, где требуется непустое значение, в том числе в командной строке: --fail-on=, --format=, --cache-dir= и --memory-limit= называют, что они ожидали вместо неё, а не молча берут значение по умолчанию.

Ключ, написанный без значения

Написать ключ и оставить его пустым — key: или явный YAML null key: ~ — означает, что для значения этого ключа будет взято значение по умолчанию; это верно на любой глубине и в любой секции, включая rules::

cache: ~                 # то же, что не писать cache:
coupling: ~              # то же, что не писать coupling:
cache:
  dir: ~                 # то же, что не писать dir:
rules:
  complexity.ccn:
    enabled: ~           # то же, что не писать enabled:
    callable: ~          # то же, что не писать callable:

Это относится и к тем ключам внутри rules:, которые выбирают, как читать правило, а не только к тем, чьё значение читают. Пороговый ключ выбирает сокращённую форму иерархического правила — threshold: у complexity.ccn, complexity.cognitive и complexity.npath; threshold:, warning: или error: у coupling.cbo; threshold:, max_warning: или max_error: у coupling.instability, — и выбирает её значение, написанное в этом ключе. ~ не пишет значения, поэтому ничего не выбирает, и блоки callable: / class: / namespace:, стоящие рядом, читаются ровно так же, как если бы ключа не было:

rules:
  coupling.cbo:
    warning: ~       # то же, что не писать его
    class:
      warning: 0     # будет прочитано
      error: 0

По той же причине threshold: ~, написанный рядом с warning: / error:, не называет второго режима, и смешивать его не с чем:

rules:
  cohesion.lcom:
    threshold: ~     # значения нет, значит и режима нет
    warning: 5       # градуированный режим, как если бы threshold: не писали

Два значения — по-прежнему два режима, и это по-прежнему ошибка конфигурации:

rules:
  cohesion.lcom:
    threshold: 3     # Configuration error, exit 3:
    warning: 5       # Cannot mix "threshold" with "warning"/"error"

Элемент списка — единственное место, где это не действует, и по причине: элемент является значением, а не оставленным без значения ключом, поэтому означать ему нечего. Элемент ~ отклоняется с его индексом в любом списке вне rules: и в любом списке, который объявляют опции правила:

rules:
  complexity.ccn:
    suppress_namespaces:
      - subtree: App\Legacy
      - ~              # отказ: exit 3

Поддержка в редакторе

Qualimetrix поставляет JSON Schema своего файла конфигурации — qmx.schema.json. Укажите её редактору, который проверяет YAML по JSON Schema, и при работе с qmx.yaml вы получите:

  • автодополнение ключей, имён правил и опций каждого правила;
  • описание каждого правила в подсказке;
  • подсветку ошибок формы: неизвестный ключ, значение не того типа, число меньше допустимого минимума, слово вне фиксированного списка.

Схема проверяет форму одного файла, а не его смысл. Окончательный судья — qmx. Редактор не проверяет формулы, селекторы, регулярные выражения, пути, ссылки на объявленные архитектурные слои, ограничения, зависящие от других значений, и всё, что зависит от того, как сливаются пресеты и ваш файл. Конфликт сокращения с его целью в одном объекте, например threshold вместе с warning, схема ловит. Файл, который принял редактор, всё ещё может быть отклонён qmx check.

Обратного схема по построению избегает: она генерируется из тех же объявлений, которые читает qmx, и проверена тестами на то, что не подсвечивает файл, который qmx принимает, — кроме случаев, когда YAML-парсер редактора читает значение иначе (см. Ограничения).

Где взять схему

Источник Когда использовать
vendor/qualimetrix/qualimetrix/qmx.schema.json Рекомендуется. Qualimetrix установлен через Composer: файл всегда совпадает с установленной версией.
https://raw.githubusercontent.com/qualimetrix/qualimetrix/vX.Y.Z/qmx.schema.json Нужен неизменный адрес, например при работе с phar, в котором схемы нет. Замените vX.Y.Z на установленную версию; содержимое по этому адресу не меняется.
https://github.com/qualimetrix/qualimetrix/releases/latest/download/qmx.schema.json Вы всегда работаете с последним релизом. Адрес перенаправляет на файл новейшего релиза; следует ли каждый редактор такому перенаправлению, не проверялось.

У релизов, вышедших до появления схемы, файла по этим адресам нет.

VS Code

Установите расширение YAML от Red Hat и сделайте первой строкой qmx.yaml такую строку — с адресом или путём относительно файла:

# yaml-language-server: $schema=vendor/qualimetrix/qualimetrix/qmx.schema.json
paths: [src]

qmx.yaml.example уже начинается с такой строки. Путь разрешается относительно файла конфигурации, поэтому он работает, когда файл лежит в корне проекта рядом с vendor/.

Импортированному файлу нужен свой modeline с путём относительно этого файла (# yaml-language-server: $schema=../vendor/qualimetrix/qualimetrix/qmx.schema.json для config/a.yaml).

PhpStorm

Откройте Settings → Languages & Frameworks → Schemas and DTDs → JSON Schema Mappings, добавьте привязку, выберите схемой vendor/qualimetrix/qualimetrix/qmx.schema.json (или один из адресов выше) и добавьте к ней файлы qmx.yaml, qmx.yml, qmx.dist.yaml и qmx.dist.yml. Файл конфигурации с другим именем, переданный через --config или пресет, привязывается так же: добавьте его имя или путь в привязку (или поставьте modeline из раздела VS Code первой строкой). То же относится к файлу, который импортирует корень: редактор привязывает схему к файлу по его имени, а не по импортирующему файлу, поэтому config/*.yaml нужна своя привязка или modeline. Если диалог спрашивает версию схемы, выберите JSON Schema version 7.

Ограничения

  • Разные YAML-парсеры. qmx читает YAML через Symfony YAML, редакторы — своим парсером (расширение Red Hat следует YAML 1.2). Скаляр, который они типизируют по-разному, — 1_000, 0755, дата — один может принять, а другой подсветить. Если они расходятся на таком значении, прав qmx check.
  • Совпадение версий. Используйте схему той версии qmx, которую запускаете. Новый релиз может удалить ключи, которые ваша версия ещё принимает, а старая схема не знает ключей, добавленных позже.

Что дальше?

Смотрите справочник параметров CLI для полного списка параметров командной строки.

Объявленные формы правил и подготовленное исполнение

rules — объявленный раздел документа. Каждый зарегистрированный producer задаёт допустимые корневые опции, блоки уровней, формы значений и пороговые пары. Каждый написавший слой проверяется до слияния, даже если следующий его перекроет. Нет permissive raw option bag и второго словаря по constructor reflection. Неизвестные владельцы, удалённые ключи и неверные написания отказывают до Discovery с полным авторским producer/key path и источником.

Булева форма правила пишет только enabled. true сохраняет пороги, исключения и собственный switch каждого уровня; false выключает все уровни. {} ничего не пишет, ~ оставляет нижнее значение. Пустое тело не возвращает defaults: чтобы вернуть default поверх нижнего слоя, напиши его значение явно. Уровень требует своей объявленной map, например class: {enabled: false}, а не boolean правила.

Сокращения раскрываются в своём слое. threshold рядом с одной из половин его пары в одном слое отказывает. Верхнее сокращение конфликтует только с явной записью того же раскрытого листа; независимые ключи сосуществуют, а в разных слоях их раскрытые листья сливаются. Верхнее сокращение complexity меняет только callable и сохраняет class; плоские пары CBO и instability раскрываются в class и namespace. Написанная class-пара NPath действует без лишнего true. Явное class.enabled: false по-прежнему выключает уровень. Числовые defaults и формулы не меняются.

После слияния владельцы строят typed options для всех producers, включая неактивные, и проверяют итоговый порядок warning/error с учётом написанных половин и defaults. Отказ пары называет реальные участвующие источники. Затем selection дополняется option activity до публикации runtime state. После неудачного preflight готовый snapshot недоступен, а частичные опции отдельных producers не публикуются.

enabled: true — авторское точное включение, а не лишнее украшение: оно может снять нижний disable и должно быть допущено итоговым only filter. Сохрани его, если включение намеренно. mode: ignore остаётся неактивным: явное включение такого producer отказывает, а enabled:false с reportable mode законно. Правила слоёв, specificity, пустого selection и channel-level адресации см. в опциях правил.

Selection и built options используют один immutable channel snapshot этого запуска, включая авторские computed definitions. Producer metadata и finding channels — разные множества. Producer может иметь несколько channels; dynamic имена и объявленные уровни не являются фиксированным default catalogue.