{
  "repository": "discourse/discourse",
  "ref": "4b1829592d068cac964e805adab6a7a943a55f2c",
  "methods": [
    {
      "slug": "formal",
      "title": "Formal verification and model checking"
    },
    {
      "slug": "static_analysis",
      "title": "Static analysis"
    },
    {
      "slug": "testing",
      "title": "Testing"
    },
    {
      "slug": "formatting",
      "title": "Formatting and hygiene"
    },
    {
      "slug": "supply_chain",
      "title": "Supply chain"
    },
    {
      "slug": "unclassified",
      "title": "Unclassified"
    }
  ],
  "verifications": [
    {
      "tool": "eslint",
      "method": "static_analysis",
      "commands": [
        "eslint ./frontend $(script/list_bundled_plugins) ./themes --cache --concurrency auto --no-error-on-unmatched-pattern --max-warnings 0",
        "eslint --fix ./frontend $(script/list_bundled_plugins) ./themes --no-error-on-unmatched-pattern"
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "package.json",
          "locator": "scripts.lint:js"
        },
        {
          "path": "package.json",
          "locator": "scripts.lint:js:fix"
        },
        {
          "path": "package.json",
          "locator": "devDependencies: eslint"
        },
        {
          "path": "eslint.config.mjs",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/eslint/eslint",
      "docs": "https://eslint.org/docs/latest/use/command-line-interface#exit-codes",
      "exit_codes": {
        "0": "no errors",
        "1": "linting errors found",
        "2": "configuration problem or internal error"
      },
      "autofix": true,
      "declared_only": false
    },
    {
      "tool": "tsc",
      "method": "static_analysis",
      "commands": [
        "tsc -b --runExternalCode",
        "tsc -b --runExternalCode --watch --preserveWatchOutput"
      ],
      "triggers": [
        "ci",
        "local"
      ],
      "evidence": [
        {
          "path": ".github/workflows/publish-types.yml",
          "locator": "jobs.publish.steps[6] (Generate type definitions)"
        },
        {
          "path": "package.json",
          "locator": "scripts.lint:types"
        },
        {
          "path": "package.json",
          "locator": "scripts.types:watch"
        },
        {
          "path": "package.json",
          "locator": "devDependencies: typescript"
        }
      ],
      "upstream": "https://github.com/microsoft/TypeScript",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "prettier",
      "method": "formatting",
      "commands": [],
      "triggers": [],
      "evidence": [
        {
          "path": "package.json",
          "locator": "devDependencies: prettier"
        }
      ],
      "upstream": "https://github.com/prettier/prettier",
      "docs": "https://prettier.io/docs/cli#exit-codes",
      "exit_codes": {
        "0": "everything formatted",
        "1": "something was not formatted (--check)",
        "2": "prettier error"
      },
      "autofix": true,
      "declared_only": true
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bundle exec ./sync_docs"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/developer-docs-publish.yml",
          "locator": "jobs.publish.steps[2]"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bundle exec ./sync_docs --dry-run"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/developer-docs-publish.yml",
          "locator": "jobs.dry_run.steps[2]"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bundle exec rubocop --force-exclusion {staged_files}"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": "lefthook.yml",
          "locator": "pre-commit.commands.rubocop"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bundle exec ruby script/i18n_lint.rb {staged_files}"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": "lefthook.yml",
          "locator": "pre-commit.commands.i18n-lint"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bundle exec stree check Gemfile {staged_files}"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": "lefthook.yml",
          "locator": "pre-commit.commands.syntax_tree"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bundle exec yaml-lint {staged_files}"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": "lefthook.yml",
          "locator": "pre-commit.commands.yaml-syntax"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bundle lock --add-checksums"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/dependabot-bundler-checksums.yml",
          "locator": "jobs.normalize.steps[2] (Normalize Gemfile.lock)"
        },
        {
          "path": ".github/workflows/linting.yml",
          "locator": "jobs.build.steps[6] (Bundler checksums)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "concurrently pnpm:lint:*(!fix) --names lint:"
      ],
      "triggers": [
        "ci",
        "local"
      ],
      "evidence": [
        {
          "path": ".github/workflows/developer-docs-lint.yml",
          "locator": "jobs.prettier.steps[4] (Lint)"
        },
        {
          "path": "package.json",
          "locator": "scripts.lint"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "concurrently pnpm:lint:*:fix --names fix:"
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "package.json",
          "locator": "scripts.lint:fix"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "html-pages ./lint-progress --no-cache"
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "package.json",
          "locator": "scripts.lint-progress"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "lint-to-the-future ignore"
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "package.json",
          "locator": "scripts.lttf:ignore"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "lint-to-the-future output -o ./lint-progress/"
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "package.json",
          "locator": "scripts.lttf:output"
        },
        {
          "path": "package.json",
          "locator": "scripts.lint-progress"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "postgres script/start_test_db.rb"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/migration-tests.yml",
          "locator": "jobs.tests.steps[4] (Start Postgres)"
        },
        {
          "path": ".github/workflows/tests.yml",
          "locator": "jobs.build.steps[6] (Start Postgres)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "show -s --date=format:%Y-%m-%d --format=%cd ${from_ref}^{commit})"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/release-notes.yml",
          "locator": "jobs.build.steps[6] (Calculate from/to dates from refs)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "show -s --date=format:%Y-%m-%d --format=%cd ${to_ref}^{commit})"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/release-notes.yml",
          "locator": "jobs.build.steps[6] (Calculate from/to dates from refs)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    }
  ]
}
