Make a valid error maker! We've been twice challenged to make 'error quines' (see Make an error quine! and Make a slow error quine maker!), so why don't we try the opposite?
Instructions

Write a &quot;program&quot; that, when run, produces an error.
Copy the error message into a new program, and run it.
Repeat Step 2 until the program runs without producing an error.

Rules

All of your programs must be run in the same language.
None of your programs can be shorter than 1 byte long.
The error(s) should be printed to STDERR.

Winning criteria
Your score is the number of programs run minus the length in bytes of your initial program. Highest score wins.

An example in monochrome TI-83+/84+ BASIC:
Initial program: {&quot;
This creates a list with a string inside it, throwing an ERR:DATA TYPE.
Program 2: ERR:DATA TYPE
The space causes the interpreter to throw an ERR:SYNTAX.
Program 3: ERR:SYNTAX
The letters are treated as variable multiplication, and the colon as
a newline. This runs successfully.
This chain's score is 3 (number of programs) minus 2 (length in bytes of {&quot;, the initial program), totaling 1.
Pip 0.15.05.29, over 10100,000
(Subtracting the 51 bytes of source code is negligible for such a large number.)
This is a version of my answer to Make a slow error quine maker.  Requires the -w flag for warning output.
i:5**6**7d:&quot;i:1d: Ssi?dRo--iRsRPdx&quot;Ssi?dRo--iRsRPdx

The exact number of steps depends only on the value assigned to i, so it could be arbitrarily large (until the Python interpreter runs out of memory). Also, it would take longer than the age of the universe to complete the above sequence.
Explanation:
Example here uses an i-value of 5 for purposes of explanation.
i:5d:&quot;i:1d: Ssi?dRo--iRsRPdx&quot;Ssi?dRo--iRsRPdx

After setting i, store a string in d and then attempt to execute the Swap statement. Swap expects two variables (more accurately, lvalues). s is fine, but the second expression is i?dRo--iRsRPdx. If i is true (nonzero, for our purposes), the ternary evaluates to dRo--iRsRPd, which uses d from earlier to form a near-quine--only with i decremented. This expression is not an lvalue, so Pip complains:
Attempting to swap non-lvalue i:4d:&quot;i:1d: Ssi?dRo--iRsRPdx&quot;Ssi?dRo--iRsRPdx

... which then starts the whole thing over again. (Attempting to swap non-lvalue is a bunch of no-ops: At calculates the ASCII value of t = 10, n-l subtracts newline minus each value of an empty list, and all the lowercase letters are just variables.)
The process continues in like fashion all the way down to:
Attempting to swap non-lvalue i:0d:&quot;i:1d: Ssi?dRo--iRsRPdx&quot;Ssi?dRo--iRsRPdx

When this is run, i is now false. The ternary expression evaluates to the else branch x--which is an lvalue. Thus, swap simply swaps the values of s and x. The program then exits with no output.
(The only thing that's changed from the previous answer is using x, which is a predefined variable, instead of a, which is undefined if there were no command-line arguments and thus triggers a different error when i gets down to zero.)