ignoreErrors is how you adopt this on old code

Four thousand errors on the first run is a number nobody can act on, and the usual outcome is that the tool is removed. Ignoring the existing ones by pattern makes the count zero today and non-zero for anything new.

parameters:
    level: 5
    paths: [src]
    ignoreErrors:
        # legacy magic, will not be fixed
        - '#Call to an undefined method [A-Za-z\\]+::scope[A-Za-z]+()#'
        # one directory, until it is rewritten
        - message: '#Access to an undefined property#'
          path: src/Legacy/*

The patterns are regular expressions matched against the message, which makes them blunt — one that is too broad silences future errors of the same shape, which is exactly what you were trying to prevent. Scoping by path is the safer form. Reviewing the list occasionally and deleting entries that no longer match is what stops it becoming permanent.