- CLI evaluate/check --json vs programmatic evaluateSubject: same subject,
same typed report
- QC-19 parity vs a verbatim copy of the absorbed presence loop (positive and
negative fixtures, all scaffold kinds) and QC-20 parity vs the real
framework verify.sh output contract
- negative controls: unknown check id, absent subject, missing probePath,
spawn error, timeout, nonzero/unexpected exit, malformed output, throwing
check, unqualified skip — all never passed
- check (QC-19) is now implemented by the evaluator's typed
qc-19-rails-files-present definition; keeps fail-closed exit and gains --json
- doctor stays advisory but reports typed states
- new evaluate subcommand is the canonical CLI entry point (--probe-path feeds
QC-20; shell probes remain thin adapters with TS-owned verdict parsing)