The truth files used `determinableFromResponseDocument`; the schema column
and gateEvaluableFromResponse() use `determinableFromResponse`. A silent
name drift means the flag reads as its default (true), and R-B6C — "two bid
copies submitted", which no response document can ever establish — starts
failing bidders on a packaging detail.
Renamed in rfp.truth.json and validate-responses.py, and added the mirror
check to validate-truth.py so the drift cannot recur unnoticed:
gates 13, evaluable from the response 12, excluded 1
excluded: R-B6C Two bid copies submitted.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
criterion.parent_id — a score commits at any criterion with NO WEIGHTED
CHILDREN. Derived from the rubric, never configured, and neither corpus
document is special-cased: Tarrant's five flat criteria are all leaves;
Friendship's 'Method of Approach' 30 is not scoreable while its 15/10/5
children are. A criterion whose sub-items carry no points stays scoreable
at its own level, because those are requirements mapped through
criterion_requirement rather than children.
requirement.determinable_from_response — false where satisfaction cannot be
established from the response document at all. Gate evaluation excludes
these rather than failing them; treating Friendship's 'two bid copies' as
not_answered disqualifies two of three bidders over a packaging detail.
The scoring rule is mirrored in corpus/validate-truth.py so the corpus and
the code cannot silently disagree. Against Friendship it yields 10 scoreable
criteria of 12, summing to exactly 100.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
31 requirements (13 mandatory gates, 5 certification forms, 11 narrative,
1 pricing, 1 compliance schedule), 12 criteria across two levels, and three
labelled known-misses.
The known-misses are drawn from the document rather than invented:
KM-1 Schedule C holds no prices; content is in an external Excel file,
and pricing is 40 of 100 points
KM-2 a mandatory submission stated only inside a parenthetical within a
scored criterion's description in Section K
KM-3 'Response to values statement' carries no obligation verb and is
mandatory only by virtue of the checklist eleven pages earlier
validate-truth.py checks reference integrity and weight sums; these files
are hand-authored, so nothing else checks them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>