Observed while integrating source-owned typed lookup for #480/#487 (tracker #416). Structurally identical callable signatures currently canonicalize to one TypeId while signature_predicates and declaration metadata are stored outside that key. This is observable even within one real module; cross-file copying cannot safely compose the same representation.
Repro (strict/noEmit/noLib with the benchmark minimal lib):
export {};
interface Guards {
number(value: unknown): value is number;
plain(value: unknown): boolean;
}
declare const guards: Guards;
declare let value: unknown;
const p = guards.plain;
if (p(value)) { const bad: number = value; }TS 6.0.3 and native TS 7.0.2 report TS2322; Home accepts it. Direct guards.plain(value), an object wrapper alias, and assigning guards.plain to a numeric predicate type are also incorrectly accepted. A real numeric-guard alias is accepted correctly by all three. Before evidence: bench/vs_tsgo/results/signature-identity.6jiDkG/before.log (15 checks; four Home failures), using the preceding prepared-program release.
Fix callable identity/metadata ownership at the type representation boundary, not by adding expression-shape exceptions. Preserve structural assignability, generic instantiation, rest/optional semantics, declaration provenance, and transfer between source owners. Add positive/negative audits, both declaration orders, and regression tests. Keep global/import graph gates unchanged until actual typed lookup passes them; document any timing/admission effects.