Follow-up to #507; tracker #416 and a prerequisite for preserving callable semantics across source owners (#480, #487).
With the shared strict/noEmit/noLib/skipLibCheck config, Home accepts this invalid narrowing while TS 6.0.3 and native TS 7.0.2 each report TS2322:
export {};
declare let value: unknown;
declare function guard(x: unknown): x is number;
declare function plain(x: unknown): boolean;
const selected = [guard, plain];
if (selected[0](value)) { const bad: number = value; }The strict callable subtype path used by array-element and conditional-union reduction compares erased parameter/return payloads but does not consult predicate or explicit receiver metadata. A plain boolean function must not subsume a predicate promise, and incompatible receiver types must remain distinct. Audit both declaration and branch orders, bare callables and object wrappers, and retain positive controls for genuine compatible predicates. Use source-level regressions plus relation-level tests; do not waive failures or modify timed corpora.
Baseline binary: bench/vs_tsgo/results/signature-identity.6jiDkG/home-final (SHA256 d7ecf960b76ef1f61b3e9acf4ebb97cad70fc3d087db20c5a5cdce03d82e6ffc). Both graph benchmark rows remain ineligible; this issue is not their readmission.