Thesis: Blank is not evidence. A yes mark requires text that already supports the criterion. Until then the mark stays unset, and “all five yes” stays false.
What we shipped first
We shipped a read-only five-yes fit line for an identified cohort. Each mark is yes, no, or unset. The failure mode we guarded against: treating an empty field as a soft yes so the line looked greener than the notes supported.
The scorer only returns yes when the existing text matches. Empty stays a dash. A row is “all five yes” only when every mark is already yes — never by filling gaps with guesses.
The working shape
For each criterion, read the fields you already have. If the text clearly supports yes (or no), mark it. If the field is blank or silent, leave unset. Summaries may count how many rows are all-unset or all-five — they must not invent marks to get there.
// Yes only when the text already supports it. Blank stays unset.
function mark(text, yesPattern) {
if (!String(text || "").trim()) return "—"; // unset, not yes
return yesPattern.test(text) ? "Y" : "—";
}
// allFiveYes is true only when every criterion is already "Y".
Checklist
- Score a fixture where every field is blank — expect five dashes, not five yeses.
- Confirm “all five yes” is false until every mark is already yes.
- Do not coerce empty strings, missing fields, or placeholders into yes.
- Keep examples synthetic; no real person names on the public page.
Try the lab
Observe blank fields scored as yes, name the guess, choose unset (dash), then prove all-five stays false. Commands: observe · why · fix · prove.
Full page: Open this lab · All labs
Related: the CRM is not the funnel. How we deliver: methodology · readiness.
Engineering commentary only — not audit, legal, or certification advice.