CLI/Core scope
Use one qualified identity contract across discovery, methods, source, relations, extensions, references, and future generation.
Split from Aether #7 . Aether remains responsible for retaining and validating the resolved identity across a reasoning workflow.
Current problem
Name-only lookup and first-row/default-kind behavior are unsafe where Microsoft, ISV, and customer packages contain overlapping object names or kinds.
Acceptance criteria
Define a stable ObjectKey = { objectType, package, model, name }.
Discovery returns all qualified candidates and preserves original casing.
Final resolution follows D365FO case semantics without discarding package/model identity.
Ambiguity returns a structured candidate list; never silently select the first row or default kind.
Method, source, relation, extension, reference, and generation queries accept and return the same ObjectKey.
Inheritance and extension target resolution preserve identity at each hop.
Tests cover same names across types/models/packages, casing variants, missing objects, and stale indexes.
CLI/Core scope
Use one qualified identity contract across discovery, methods, source, relations, extensions, references, and future generation.
Split from Aether #7. Aether remains responsible for retaining and validating the resolved identity across a reasoning workflow.
Current problem
Name-only lookup and first-row/default-kind behavior are unsafe where Microsoft, ISV, and customer packages contain overlapping object names or kinds.
Acceptance criteria
ObjectKey = { objectType, package, model, name }.