--- duplicate constants (cross-file, by name) ---
DUPLICATE CONSTANT [ERROR]: DEFAULT_TIMEOUT  [ast sim 1.00, T=0.22, n=2, loc=1]
  py/core_a.py:2
  py/core_b.py:2

DUPLICATE CONSTANT [ERROR]: MAX_RETRIES  [ast sim 1.00, T=0.22, n=2, loc=1]
  py/core_a.py:1
  py/core_b.py:1


--- duplicate functions (cross-file, AST sim warn=0.5 error=0.85) ---
DUPLICATE FUNCTION [ERROR]: compute_score  [ast sim 1.00, T=0.34, n=2, loc=5, args=2]
  py/core_a.py:8
  py/core_b.py:8


--- duplicate functions (cross-name, exact AST-normalized) ---
DUPLICATE FUNCTION [WARNING]: add_numbers/plus_numbers  [normalized-exact, T=0.30, n=2, loc=3, args=2]
  py/core_a.py:15
  py/core_b.py:15


--- duplicate functions (cross-name Type-3, IDF-weighted cosine) ---

--- duplicate methods (cross-file, AST sim warn=0.5 error=0.85) ---
DUPLICATE METHOD [ERROR]: Repository.fetch_item  [ast sim 1.00, T=0.34, n=2, loc=5, args=2]
  py/core_a.py:21
  py/core_b.py:21

DUPLICATE METHOD [ERROR]: Repository.normalize  [ast sim 1.00, T=0.28, n=2, loc=3, args=1]
  py/core_a.py:28
  py/core_b.py:28


--- duplicate methods (cross-name, exact AST-normalized) ---
DUPLICATE METHOD [ERROR]: Cache.load_entry/Repository.fetch_item  [normalized-exact, T=0.43, n=3, loc=5, args=2]
  py/core_a.py:21
  py/core_a.py:34
  py/core_b.py:21


--- duplicate methods (cross-name Type-3, IDF-weighted cosine) ---

--- duplicate classes (cross-file, AST sim warn=0.5 error=0.85) ---
DUPLICATE CLASS [ERROR]: Repository  [ast sim 1.00, T=0.40, n=2, loc=10]
  py/core_a.py:20
  py/core_b.py:20


--- duplicate type aliases (cross-file, by name) ---
DUPLICATE TYPE_ALIAS [ERROR]: UserIds  [ast sim 1.00, T=0.22, n=2, loc=1]
  py/core_a.py:5
  py/core_b.py:5

# summary: 8 ERROR, 1 WARNING groups
