A declared field and its written type. Resolution uses this fact for
receiver chains such as self.harness.check() without pretending that
the field access itself is a symbol definition.
Everything extraction produces for one file. Content-addressed: the hash
is the incrementality key — same bytes, same facts. The persisted set of
FileFacts is the source of truth every derived table rebuilds from.
A local binding (parameter, let/const, loop variable, catch variable)
that shadows outer names. Not a symbol — recorded so resolution never
binds a shadowed reference to the outer definition it no longer means.
An impl block naming the trait it implements (impl Runner for Widget).
Pairing fact for dynamic-dispatch edges: methods defined inside span
implement the same-named methods of the trait trait_name resolves to.
A resolution limitation the resolver recognised while failing to bind a
reference. Recorded by the resolver, which is the only place that knows
what it tried, so consumers never have to infer a gap from name shape.
The variants are observations, not verdicts: a consumer decides what
each one means for its own question.