Rules for how we decide whether a given source location counts as a “true reference” in canary.json (and future *.json ground-truth files). These exist so two people can curate independently and arrive at the same answer.
A range is a true reference if a correct rename of the target symbol would need to edit the text at that range. Compiler errors, behavior changes, or loss of the intended reference relationship after applying the planned edits are all signs that the range must be included.
self.x, super.x, enum-case labels, init() calls).findOverrides because IndexStoreDB assigns them separate USRs.super.baseName() from a subclass: textually references the base method’s identifier, must rename alongside..overrideOf on per-requirement USRs, and RenamePlanner does not follow this chain today. The LSP-reconciliation leg closes part of this gap; ground truth for protocol methods should omit witness sites and record them in caveats.@objc renames require matching ObjC selectors. Out of scope."UserService" in a log message. Rename would not automatically touch these.fetchUser(id:)): the source identifier is the base name (fetchUser). The argument label id: is NOT a rename target — it has its own declaration in the parameter list.UserService(auth:)): rename of the class, not the init. The UserService portion is the target; init / auth labels are separate.CodingKeys, property-wrapper accessors): not renameable; plan_rename refuses these with synthesized_symbol_not_renameable. Ground truth should not list them.The single-human curator who wrote the ground truth has already seen what the tool returns, which risks circular validation. For each fixture, a random 20% of ground-truth entries should be re-verified by a second person who reads only the source, not the tool output. Alternatively, cross-check three ground-truth entries against git rename history from the fixture’s upstream repo (when the fixture is an external project like TCA).
canary.json was written source-first — entries were hand-read off the fixture before plan_rename was invoked against them — so every line/column is re-verifiable by any reader against the cited source. That’s the status of record; treat it as “cross-checkable” rather than “pending cross-check.”