profile-optimization eval, plants V7 to V13, run through scripts/build.py
fixture/build_v1.json equals clean + all plants: yes
judge self-check, every expectation scored against the clean run must mismatch: yes
CLEAN   build_v1_clean.json  exit 0  gates passed 12/12  PASS
PLANTED build_v1.json  exit 1  wrote nothing: True  plants named 7/7 (V7, V8, V9, V10, V11, V12, V13)  failing gates: Deliverable text (claim_scan rules), check_questions, claim_scan, diff_baseline, prose counts (check_completeness --prose)  PASS

MUTATIONS: clean fixture + one plant, exact failing-gate set required
V7    exit 1  expected claim_scan  failing: claim_scan  finding matched: yes  CAUGHT  | portfolio case names one of its result's two services
V8    exit 1  expected claim_scan  failing: claim_scan  finding matched: yes  CAUGHT  | case gains a service its result lacks, plus an excluded skill tag
V9    exit 1  expected check_questions  failing: check_questions  finding matched: yes  CAUGHT  | held skill ships as a portfolio_skills tag
V10   exit 1  expected check_questions  failing: check_questions  finding matched: yes  CAUGHT  | priced and dated catalog FAQ tied to a blocks=false question
V11   exit 1  expected prose counts (check_completeness --prose)  failing: prose counts (check_completeness --prose)  finding matched: yes  CAUGHT  | prose types 'all 20 skills' while skills_list carries 19
V12   exit 1  expected claim_scan + Deliverable text (claim_scan rules)  failing: Deliverable text (claim_scan rules), claim_scan  finding matched: yes  CAUGHT  | sole ownership ('the agency is mine') in prose and coaching text only
V13   exit 1  expected diff_baseline  failing: diff_baseline  finding matched: yes  CAUGHT  | baseline wording edited, a span deleted, no disclosure
V8a   exit 1  expected claim_scan  failing: claim_scan  finding matched: yes  CAUGHT  | V8 text half only: case gains 'CMS setup'
V8b   exit 1  expected claim_scan  failing: claim_scan  finding matched: yes  CAUGHT  | V8 tag half only: 'Shopify' tag, which exclusions lists
V11b  exit 1  expected prose counts (check_completeness --prose)  failing: prose counts (check_completeness --prose)  finding matched: yes  CAUGHT  | typed count wrong with the list full ('all 19 skills' against 20): prose gate alone
V12a  exit 1  expected claim_scan  failing: claim_scan  finding matched: yes  CAUGHT  | V12 prose half only
V12b  exit 1  expected Deliverable text (claim_scan rules)  failing: Deliverable text (claim_scan rules)  finding matched: yes  CAUGHT  | V12 coaching half only (a question's why text)
V12x  exit 1  expected claim_scan + Deliverable text (claim_scan rules)  failing: Deliverable text (claim_scan rules), claim_scan  finding matched: yes  CAUGHT  | V12 planted, then the About alone patched: must still fail
V13p  exit 1  expected diff_baseline  failing: diff_baseline  finding matched: yes  CAUGHT  | V13 with the description's live copy also missing from baseline (partial capture)

CONTROLS: clean fixture + one honest edit, must exit 0 with every gate PASS
C7    exit 0  wrote output: True  failing: none  BUILDS  | seven categories, the rest declared: a form maximum is never a floor
C8    exit 0  wrote output: True  failing: none  BUILDS  | a correct typed count in prose: a warning, and the build still writes
C9    exit 0  wrote output: True  failing: none  BUILDS  | a general process line naming another service in a result case is not scope drift

OVERALL: PASS, every expectation held
