Three more copies, found by scanning for measured numbers written in more than
one file rather than by reading.
THE READ_TEXT CAP WAS WRITTEN THREE TIMES: DEFAULT_MAX_CHARS in actions.py, the
default in browser_read_text's signature, and the digit in its description.
Nothing read the signature back, so it could drift from the constant in silence
and the tool would honour a number its own module did not declare. It reads the
constant now.
The digit in the prose STAYS, and a draft that deleted it was wrong. The
reasoning was that the schema already publishes "default": 6000 so the sentence
is a second copy - true, and not the whole story:
test_the_two_readers_do_not_pretend_to_share_a_cap holds that this description
declares its cap while browser_read_html declares it has none, because a reader
shown one and not the other assumes symmetry, and the two differ by 34x on a
large page. A number with a reason to be written twice gets a gate rather than
a deletion, so the prose digit is now tied to the constant and cannot drift.
THE SELECTOR STUDY AND THE OPTION COUNT WERE IN TWO PLACES EACH. 958 elements,
88% addressable and 48% unambiguous, two hundred option nodes: all of it also
written in actions.py beside the code it explains. A measurement in two places
is one that gets re-run once and updated once, and the copy left wrong is the
one a model reads - out of the 1024 characters the description is cut at. The
evidence stays in the module; the description keeps every rule those paragraphs
carried, and a gate holds both halves so dropping the numbers cannot quietly
drop a rule with them.
THE THREE-VALUED RULE WAS SPELLED OUT IN BOTH RESOLVERS, in two different
shapes, with the second one's docstring saying "same three-way rule as the
profile" - a claim a reader had to go and verify, and one that stops being true
the moment either is edited. It is _asked now, said once.
AND A SURVIVING MUTATION FOUND A HOLE THAT WAS ALREADY THERE. Restricting the
STEALTHFOX_NO_PROXY veto to the environment's own answer looked like a
behaviour change and is not: the old code got the same result from the ORDER of
two returns, the explicit branch returning before the veto was read. Dropping
the guard changed nothing any test could see. That a caller's proxy beats the
variable is now held by a test, which is the use of a known-bad input beyond
judging the change: it finds what the suite never looked at.
The published figures move with the descriptions, so fourteen pages carry
8,040 characters and 3,141 tokens now.
Suite 638 green. Eight known-bad inputs: seven killed, one expected to survive
and reported as such - rewriting the profile resolver back to its old spelling
is an equivalent rewrite, and a gate that went red on it would be holding the
shape rather than the behaviour.