configuration/quality/data/dependency.data.json

configuration/quality/data/dependency.data.json is a file in GovLab Quality. 1011 lines of code and 0 definitions.

{
    "records": [
        {
            "tool": "eslint",
            "ecosystem": "javascript",
            "npm": "eslint",
            "isPlugin": false,
            "configTarget": "eslint.config.js",
            "emitter": "eslint",
            "disposition": "full-gate"
        },
        {
            "tool": "govlab-eslint",
            "ecosystem": "javascript",
            "npm": "@govlab/quality/eslint-plugin",
            "pluginNamespace": "govlab",
            "ruleIdPrefix": "govlab",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "govlab-context",
            "ecosystem": "javascript",
            "npm": "@govlab/quality/context-lint",
            "pluginNamespace": "govlab-context",
            "ruleIdPrefix": "govlab-context",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "unused-imports",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-unused-imports",
            "pluginNamespace": "unused-imports",
            "ruleIdPrefix": "unused-imports",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "jsonc",
            "ecosystem": "json",
            "npm": "eslint-plugin-jsonc",
            "pluginNamespace": "jsonc",
            "ruleIdPrefix": "jsonc",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-boundaries",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-boundaries",
            "pluginNamespace": "boundaries",
            "ruleIdPrefix": "boundaries",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-eslint-plugin",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-eslint-plugin",
            "pluginNamespace": "eslint-plugin",
            "ruleIdPrefix": "eslint-plugin",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-i18next",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-i18next",
            "pluginNamespace": "i18next",
            "ruleIdPrefix": "i18next",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-import",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-import",
            "pluginNamespace": "import",
            "ruleIdPrefix": "import",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-jest",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-jest",
            "pluginNamespace": "jest",
            "ruleIdPrefix": "jest",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-jsdoc",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-jsdoc",
            "pluginNamespace": "jsdoc",
            "ruleIdPrefix": "jsdoc",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-jsx-a11y",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-jsx-a11y",
            "pluginNamespace": "jsx-a11y",
            "ruleIdPrefix": "jsx-a11y",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-lodash",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-lodash",
            "pluginNamespace": "lodash",
            "ruleIdPrefix": "lodash",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-n",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-n",
            "pluginNamespace": "n",
            "ruleIdPrefix": "n",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-no-unsanitized",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-no-unsanitized",
            "pluginNamespace": "no-unsanitized",
            "ruleIdPrefix": "no-unsanitized",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-perfectionist",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-perfectionist",
            "pluginNamespace": "perfectionist",
            "ruleIdPrefix": "perfectionist",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-promise",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-promise",
            "pluginNamespace": "promise",
            "ruleIdPrefix": "promise",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-react",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-react",
            "pluginNamespace": "react",
            "ruleIdPrefix": "react",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-react-hooks",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-react-hooks",
            "pluginNamespace": "react-hooks",
            "ruleIdPrefix": "react-hooks",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-regexp",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-regexp",
            "pluginNamespace": "regexp",
            "ruleIdPrefix": "regexp",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-sonarjs",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-sonarjs",
            "pluginNamespace": "sonarjs",
            "ruleIdPrefix": "sonarjs",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-stylistic",
            "ecosystem": "javascript",
            "npm": "@stylistic/eslint-plugin",
            "pluginNamespace": "@stylistic",
            "ruleIdPrefix": "@stylistic",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-tailwindcss",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-tailwindcss",
            "pluginNamespace": "tailwindcss",
            "ruleIdPrefix": "tailwindcss",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-testing-library",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-testing-library",
            "pluginNamespace": "testing-library",
            "ruleIdPrefix": "testing-library",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-unicorn",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-unicorn",
            "pluginNamespace": "unicorn",
            "ruleIdPrefix": "unicorn",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-vue",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-vue",
            "pluginNamespace": "vue",
            "ruleIdPrefix": "vue",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-angular",
            "ecosystem": "typescript",
            "npm": "@angular-eslint/eslint-plugin",
            "pluginNamespace": "@angular-eslint",
            "ruleIdPrefix": "@angular-eslint",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-functional",
            "ecosystem": "typescript",
            "npm": "eslint-plugin-functional",
            "pluginNamespace": "functional",
            "ruleIdPrefix": "functional",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-ts",
            "ecosystem": "typescript",
            "npm": "@typescript-eslint/eslint-plugin",
            "pluginNamespace": "@typescript-eslint",
            "ruleIdPrefix": "@typescript-eslint",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-yml",
            "ecosystem": "yaml",
            "npm": "eslint-plugin-yml",
            "pluginNamespace": "yml",
            "ruleIdPrefix": "yml",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "stylelint",
            "ecosystem": "css",
            "npm": "stylelint",
            "isPlugin": false,
            "configTarget": ".stylelintrc.js",
            "emitter": "stylelint",
            "disposition": "full-gate"
        },
        {
            "tool": "govlab-stylelint",
            "ecosystem": "css",
            "npm": "@govlab/quality/stylelint-plugin",
            "pluginNamespace": "govlab",
            "ruleIdPrefix": "govlab",
            "isPlugin": true,
            "configTarget": ".stylelintrc.js",
            "emitter": "stylelint"
        },
        {
            "tool": "prettier",
            "ecosystem": "javascript",
            "npm": "prettier",
            "isPlugin": false,
            "configTarget": "prettier.config.mjs",
            "emitter": "prettier",
            "disposition": "full-gate"
        },
        {
            "tool": "golangci-lint",
            "ecosystem": "go",
            "system": "golangci-lint",
            "isPlugin": false,
            "configTarget": ".golangci.yml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "revive",
            "ecosystem": "go",
            "system": "revive",
            "isPlugin": false,
            "configTarget": "revive.toml",
            "emitter": "native",
            "disposition": "selectable",
            "reason": "A consumer-selectable Go linter. In a public polyglot framework a tool that overlaps golangci-lint's surfaces is a CHOICE, not a redundancy: a consumer elects revive via govlab.config quality.owners (e.g. complexity.go = revive), at which point revive emits revive.toml and gates the surface while golangci-lint drops it. Unelected, revive runs advisory-only on its own config."
        },
        {
            "tool": "checkstyle",
            "ecosystem": "java",
            "system": "checkstyle",
            "isPlugin": false,
            "configTarget": "checkstyle.xml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "pmd",
            "ecosystem": "java",
            "system": "pmd",
            "isPlugin": false,
            "configTarget": "pmd-ruleset.xml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "pylint",
            "ecosystem": "python",
            "system": "pylint",
            "isPlugin": false,
            "configTarget": ".pylintrc",
            "emitter": "native",
            "disposition": "selectable",
            "reason": "A consumer-selectable Python linter. Overlapping ruff's surfaces is a CHOICE, not a redundancy: a consumer elects pylint via govlab.config quality.owners (e.g. complexity.python = pylint) and it gates the elected surfaces while ruff drops them; pylint also covers surfaces ruff does not (type-annotation, visibility). Unelected, pylint runs advisory-only on its own config."
        },
        {
            "tool": "ruff",
            "ecosystem": "python",
            "system": "ruff",
            "isPlugin": false,
            "configTarget": "ruff.toml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "clippy",
            "ecosystem": "rust",
            "system": "clippy",
            "isPlugin": false,
            "configTarget": "clippy.toml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "rubocop",
            "ecosystem": "ruby",
            "system": "rubocop",
            "isPlugin": false,
            "configTarget": ".rubocop.yml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "perlcritic",
            "ecosystem": "perl",
            "system": "perlcritic",
            "isPlugin": false,
            "configTarget": ".perlcriticrc",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "phpmd",
            "ecosystem": "php",
            "system": "phpmd",
            "isPlugin": false,
            "configTarget": "phpmd.xml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "swiftlint",
            "ecosystem": "swift",
            "system": "swiftlint",
            "isPlugin": false,
            "configTarget": ".swiftlint.yml",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "yamllint",
            "ecosystem": "yaml",
            "system": "yamllint",
            "isPlugin": false,
            "configTarget": ".yamllint",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "clang-tidy",
            "ecosystem": "cpp",
            "system": "clang-tidy",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "credo",
            "ecosystem": "elixir",
            "system": "credo",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "go-critic",
            "ecosystem": "go",
            "system": "go-critic",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory",
            "reason": "A consumer-choice Go linter (advisory, report-only). Overlapping golangci-lint's surface is a CHOICE in a public polyglot, never a redundancy: go-critic runs on its own defaults and reports without gating, since golangci-lint owns Go's gating surface by default. It carries mapping rows and can be upgraded to selectable by authoring its emit descriptor."
        },
        {
            "tool": "sonar",
            "ecosystem": "java",
            "system": "sonar-scanner",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "server-based analysis platform (SonarQube), not a standalone configurable linter — no SSOT rule config"
        },
        {
            "tool": "detekt",
            "ecosystem": "kotlin",
            "system": "detekt",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "luacheck",
            "ecosystem": "lua",
            "system": "luacheck",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "actionlint",
            "ecosystem": "actions",
            "system": "actionlint",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "advisory"
        },
        {
            "tool": "tflint",
            "ecosystem": "iac",
            "system": "tflint",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "advisory"
        },
        {
            "tool": "stylua",
            "ecosystem": "lua",
            "system": "stylua",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "full-gate"
        },
        {
            "tool": "phpcs",
            "ecosystem": "php",
            "system": "phpcs",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "lintr",
            "ecosystem": "r",
            "system": "lintr",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "scalastyle",
            "ecosystem": "scala",
            "system": "scalastyle",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "rubocop-capybara",
            "ecosystem": "ruby",
            "system": "rubocop-capybara",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-factory_bot",
            "ecosystem": "ruby",
            "system": "rubocop-factory_bot",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-graphql",
            "ecosystem": "ruby",
            "system": "rubocop-graphql",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-minitest",
            "ecosystem": "ruby",
            "system": "rubocop-minitest",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-performance",
            "ecosystem": "ruby",
            "system": "rubocop-performance",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-rails",
            "ecosystem": "ruby",
            "system": "rubocop-rails",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-rspec",
            "ecosystem": "ruby",
            "system": "rubocop-rspec",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-sequel",
            "ecosystem": "ruby",
            "system": "rubocop-sequel",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rubocop-thread_safety",
            "ecosystem": "ruby",
            "system": "rubocop-thread_safety",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "eslint-compat",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-compat",
            "pluginNamespace": "compat",
            "ruleIdPrefix": "compat",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "eslint-security",
            "ecosystem": "javascript",
            "npm": "eslint-plugin-security",
            "pluginNamespace": "security",
            "ruleIdPrefix": "security",
            "isPlugin": true,
            "configTarget": "eslint.config.js",
            "emitter": "eslint"
        },
        {
            "tool": "htmlhint",
            "ecosystem": "html",
            "npm": "htmlhint",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "sqlfluff",
            "ecosystem": "sql",
            "system": "sqlfluff",
            "isPlugin": false,
            "configTarget": ".sqlfluff",
            "emitter": "native",
            "disposition": "full-gate"
        },
        {
            "tool": "bandit",
            "ecosystem": "python",
            "system": "bandit",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "brakeman",
            "ecosystem": "ruby",
            "system": "brakeman",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "checkov",
            "ecosystem": "iac",
            "system": "checkov",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "clj-kondo",
            "ecosystem": "clojure",
            "system": "clj-kondo",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "codeql",
            "ecosystem": "actions",
            "system": "codeql",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "GitHub CodeQL is a hosted/CI security-analysis service driven by query packs, not a locally-configurable linter with an in-memory config surface — out of the SSOT, like other server/service tools."
        },
        {
            "tool": "error-prone",
            "ecosystem": "java",
            "system": "error-prone",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "javac compiler plugin (build-integrated), not a standalone configurable linter — no SSOT rule config"
        },
        {
            "tool": "gosec",
            "ecosystem": "go",
            "system": "gosec",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "hadolint",
            "ecosystem": "dockerfile",
            "system": "hadolint",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "kics",
            "ecosystem": "ansible",
            "system": "kics",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "mypy",
            "ecosystem": "python",
            "system": "mypy",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "static type checker with per-project inference config, not a threshold ruleset — out of the SSOT like tsc"
        },
        {
            "tool": "psalm",
            "ecosystem": "php",
            "system": "psalm",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "PHP static type checker with per-project inference config, not a threshold ruleset — out of the SSOT like tsc"
        },
        {
            "tool": "rubocop-rake",
            "ecosystem": "ruby",
            "system": "rubocop-rake",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "A RuboCop extension gem (rule-pack) loaded into rubocop via `require:` — its cops run inside rubocop, which owns Ruby's lint surface (surface.data.json); not a standalone linter with its own SSOT config or gate."
        },
        {
            "tool": "rustc",
            "ecosystem": "rust",
            "system": "rustc",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "the Rust compiler, not a configurable linter — no SSOT-serializable rule config (clippy is the rust linter)"
        },
        {
            "tool": "semgrep",
            "ecosystem": "csharp",
            "system": "semgrep",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "shellcheck",
            "ecosystem": "shell",
            "system": "shellcheck",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "slither",
            "ecosystem": "solidity",
            "system": "slither",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "spotbugs",
            "ecosystem": "java",
            "system": "spotbugs",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "excluded",
            "reason": "bytecode static analysis, build-integrated, not an SSOT-configurable threshold ruleset"
        },
        {
            "tool": "staticcheck",
            "ecosystem": "go",
            "system": "staticcheck",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory",
            "reason": "A consumer-choice Go linter (advisory, report-only). Overlapping golangci-lint's surface is a CHOICE, never a redundancy: staticcheck runs on its own defaults and reports without gating, since golangci-lint owns Go's gating surface by default. It carries mapping rows and can be upgraded to selectable by authoring its emit descriptor."
        },
        {
            "tool": "trivy",
            "ecosystem": "iac",
            "system": "trivy",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "disposition": "advisory"
        },
        {
            "tool": "govlab-native",
            "ecosystem": "typescript",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "installable": false,
            "disposition": "excluded",
            "reason": "govlab's own native TypeScript quality checks, built from the monorepo — internal framework tooling, not a standalone installable linter with an SSOT config surface."
        },
        {
            "tool": "knip",
            "ecosystem": "javascript",
            "npm": "knip",
            "isPlugin": false,
            "configTarget": "knip.config.js",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "full-gate"
        },
        {
            "tool": "jscpd",
            "ecosystem": "javascript",
            "npm": "jscpd",
            "isPlugin": false,
            "configTarget": ".jscpd.json",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "full-gate"
        },
        {
            "tool": "oxlint",
            "ecosystem": "typescript",
            "npm": "oxlint",
            "isPlugin": false,
            "configTarget": ".oxlintrc.json",
            "emitter": "none",
            "disposition": "full-gate"
        },
        {
            "tool": "typescript",
            "ecosystem": "typescript",
            "npm": "typescript",
            "isPlugin": false,
            "configTarget": "tsconfig.json",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "excluded",
            "reason": "The TypeScript compiler/type-checker (tsc), not a linter — it reads its per-project tsconfig.json from disk only (no in-memory config API), so tsconfig is compiler config out of the SSOT per config_single_truth, and it carries no quality rules (catalogRules:false)."
        },
        {
            "tool": "depcheck",
            "ecosystem": "javascript",
            "npm": "depcheck",
            "isPlugin": false,
            "configTarget": ".depcheckrc",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "advisory",
            "reason": "A consumer-choice unused-dependency finder (advisory, report-only). Overlapping knip's surface is a CHOICE, never a redundancy: depcheck runs on its own resolution and reports without gating, since knip owns the SSOT's unused-code + unused-dependency gating surface. Carries no SSOT-mapped rules (catalogRules:false)."
        },
        {
            "tool": "ts-prune",
            "ecosystem": "typescript",
            "npm": "ts-prune",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "advisory",
            "reason": "A consumer-choice dead-export finder (advisory, report-only). Overlapping knip's surface is a CHOICE, never a redundancy: ts-prune runs on its own tsconfig resolution and reports without gating, since knip owns the SSOT's unused-export gating surface. Carries no SSOT-mapped rules (catalogRules:false)."
        },
        {
            "tool": "lockfile-lint",
            "ecosystem": "javascript",
            "npm": "lockfile-lint",
            "isPlugin": false,
            "configTarget": ".lockfile-lintrc.json",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "excluded",
            "reason": "A lockfile-integrity validator (checks registry hosts / https), run standalone in the verify-codebase prepare stage — not a code linter with quality rules (catalogRules:false) or an SSOT-tunable config surface."
        },
        {
            "tool": "madge",
            "ecosystem": "javascript",
            "npm": "madge",
            "isPlugin": false,
            "configTarget": "",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "advisory",
            "reason": "A consumer-choice circular-dependency detector (advisory, report-only). Offering it alongside knip is a CHOICE, never a redundancy: madge reports import cycles without gating, since knip owns the SSOT's JS/TS structural gating surface. Carries no SSOT-mapped rules (catalogRules:false)."
        },
        {
            "tool": "dependency-cruiser",
            "ecosystem": "javascript",
            "npm": "dependency-cruiser",
            "isPlugin": false,
            "configTarget": ".dependency-cruiser.js",
            "emitter": "none",
            "catalogRules": false,
            "disposition": "advisory",
            "reason": "A consumer-choice dependency-architecture validator (advisory, report-only). Its rules are executable JS config (config-as-code), so it runs against the consumer's own rule set and reports without gating; knip owns the SSOT's JS/TS structural gating surface. Carries no SSOT-mapped rules (catalogRules:false)."
        }
    ],
    "coverage": {
        "noEngineSetting": [
            "annotation-style",
            "async-await",
            "boolean-expression",
            "braces-style",
            "comparison-style",
            "declaration-grouping",
            "destructuring",
            "error-handling",
            "identifier-length",
            "integer-overflow",
            "open-closed",
            "operator-style",
            "return-count",
            "side-effects",
            "sort-order",
            "statements-per-line",
            "string-literal",
            "switch-default",
            "ternary-conditional",
            "visibility-modifier",
            "wildcard-import"
        ],
        "noNativeDescriptor": [
            "clang-tidy",
            "credo",
            "go-critic",
            "sonar",
            "detekt",
            "luacheck",
            "phpcs",
            "lintr",
            "scalastyle",
            "rubocop-capybara",
            "rubocop-factory_bot",
            "rubocop-graphql",
            "rubocop-minitest",
            "rubocop-performance",
            "rubocop-rails",
            "rubocop-rspec",
            "rubocop-sequel",
            "rubocop-thread_safety"
        ]
    }
}