- ExtractFirstScanner: reads-only scan of non-local/param read expressions
(member/field/property access, element access, invocation, cast), deduped
by symbol+text with occurrence counts; invocations flagged (hoisting
changes eval count); own-class field/property reads marked optional.
Assignment LHS skipped whole (decision 5) — surfaced as a report note.
- SignatureBuilder: promotes bucket overlaps into one coherent signature
(declared-inside vars drop from params; declared-inside return candidates
become the return; outside candidates already covered by their ref
write-back stay ref params). Trailing composite returns stay void with a
note suggesting an extract-variable first.
- ExtractionReporter + ReportFormatter: single composition shared by CLI and
tests; report = header, params (ref), returns, locals, extract-first
(count + flags), notes, suggested-signature line last.
- DataFlowClassifier: Returns now carry types (ReturnSuggestion) — the
signature line needs them.
- Displays: compact symbol/type formatting for the report.
- Fixture: RepeatReads (dedupe ×2 + skipped field write), Casts (cast
candidate) appended at the end so all pinned line numbers stay put.