---
model: claude-opus-4-6
service: claude
timestamp: 2026-04-14T16:33:00Z
git_ref: befedc49
diff_cmd: git diff befedc49~1..befedc49
---

### `tractor/discovery/_api.py`

> `git diff befedc49~1..befedc49 -- tractor/discovery/_api.py`

Add `_is_local_addr()` and `prefer_addr()` transport
preference helpers.

#### `_is_local_addr(addr: Address) -> bool`

Determines whether an `Address` is reachable on the
local host:

- `UDSAddress`: always returns `True`
  (filesystem-bound, inherently local)
- `TCPAddress`: checks if `._host` is a loopback IP
  via `ipaddress.ip_address().is_loopback`, then
  falls back to comparing against the machine's own
  interface IPs via
  `socket.getaddrinfo(socket.gethostname(), None)`

#### `prefer_addr(addrs: list[UnwrappedAddress]) -> UnwrappedAddress`

Selects the "best" transport address from a
multihomed actor's address list. Wraps each
candidate via `wrap_address()` to get typed
`Address` objects, then classifies into three tiers:

1. **UDS** (same-host guaranteed, lowest overhead)
2. **TCP loopback / same-host IP** (local network)
3. **TCP remote** (only option for distributed)

Within each tier, the last-registered (latest) entry
is preferred. Falls back to `addrs[-1]` if no
heuristic matches.

### `tractor/discovery/_registry.py`

> `git diff befedc49~1..befedc49 -- tractor/discovery/_registry.py`

`Registrar.find_actor()` return type broadened from
single addr to `list[UnwrappedAddress]|None` — full
addr list lets callers apply transport preference.

#### Integration

`query_actor()` and `wait_for_actor()` now call
`prefer_addr(addrs)` instead of `addrs[-1]`.

### Verification

All discovery tests pass (13/13 non-daemon).
`test_local.py` and `test_multi_program.py` also
pass (daemon fixture teardown failures are
pre-existing and unrelated).
