# https://golangci-lint.run/usage/configuration/
version: "2"

run:
  timeout: 10m

linters:
  default: none
  enable:
    - govet
    - ineffassign
    - staticcheck
    # Note: errcheck and unused disabled until codebase is cleaned up
    # - errcheck
    # - unused
  exclusions:
    # Use lax mode for generated files - excludes files with "autogenerated", "code generated", etc.
    generated: lax
    # Preset exclusions for common false positives
    presets:
      - comments
      - std-error-handling
    # Path patterns to exclude from linting
    paths:
      - ".*\\.pb\\.go$"
      - ".*_mock\\.go$"
      - ".*mock.*\\.go$"
      - "third_party/"
      - "testdata/"
      - "examples/"
      - "Godeps/"
      - "builtin/"
      - "vendor/"
    # Per-linter exclusion rules
    rules:
      # Ignore staticcheck deprecation warnings (too many in codebase)
      - linters:
          - staticcheck
        text: "SA1019:"
      # Ignore staticcheck quickfix suggestions (not errors)
      - linters:
          - staticcheck
        text: "QF"
      # Ignore staticcheck empty branch (common in benchmarks)
      - linters:
          - staticcheck
        text: "SA9003:"
      # Ignore unused append results (common pattern)
      - linters:
          - staticcheck
        text: "SA4010:"
      # Ignore nil context warnings (legacy code)
      - linters:
          - staticcheck
        text: "SA1012:"
      # Ignore efficiency suggestions (not errors)
      - linters:
          - staticcheck
        text: "SA6001:"
      # Ignore loop replacement suggestions (not errors)
      - linters:
          - staticcheck
        text: "S1011:"
      # Ignore unconditionally terminated loop (design patterns)
      - linters:
          - staticcheck
        text: "SA4004:"
      # Ignore duplicate imports (aliasing is intentional)
      - linters:
          - staticcheck
        text: "ST1019"
      # Ignore error string capitalization (many errors intentionally capitalized)
      - linters:
          - staticcheck
        text: "ST1005:"
      # Ignore dot imports (intentional in some packages)
      - linters:
          - staticcheck
        text: "ST1001:"
      # Ignore type inference suggestions (explicit types can improve readability)
      - linters:
          - staticcheck
        text: "ST1023:"
      # Ignore nil check for len suggestions (explicit nil checks can be clearer)
      - linters:
          - staticcheck
        text: "S1009:"
      # Ignore pointer-like allocation suggestions (performance optimization, not critical)
      - linters:
          - staticcheck
        text: "SA6002:"
      # Ignore possible nil dereference in vendored/complex code
      - linters:
          - staticcheck
        text: "SA5011"
      # Ignore unused value warnings (common in tests)
      - linters:
          - staticcheck
        text: "SA4006:"
      # Ignore same type assertion (sometimes used for interface validation)
      - linters:
          - staticcheck
        text: "S1040:"
      # Ignore unnecessary Sprintf (readability preference)
      - linters:
          - staticcheck
        text: "S1039:"
      # Ignore String() vs Sprintf preference
      - linters:
          - staticcheck
        text: "S1025:"
      # Ignore variable declaration merge suggestions
      - linters:
          - staticcheck
        text: "S1021:"
      # Ignore govet shadow warnings (too many false positives)
      - linters:
          - govet
        text: "shadow:"
      # Ignore govet copylocks warnings (architectural tech debt)
      - linters:
          - govet
        text: "copylocks:"
      # Ignore govet unreachable code (sometimes intentional for safety)
      - linters:
          - govet
        text: "unreachable:"
      # Ignore ineffassign in test files
      - linters:
          - ineffassign
        path: "_test\\.go$"

issues:
  max-issues-per-linter: 0
  max-same-issues: 0

linters-settings:
  staticcheck:
    checks:
      - "all"
      - "-ST1000" # Package comments
      - "-ST1003" # Naming convention
