I'd like to revisit the "Not a Bug" classification with specific citations from RFC 2131.
The address selection algorithm requires honoring the binding first
Section 4.3.1 defines the address selection order for DHCPDISCOVER as:
"The client's current address as recorded in the client's current binding, ELSE [...] A new address allocated from the server's pool"
A static reservation is the binding. Per the spec, it is the first priority - it must be honored before falling through to the dynamic pool.
The conflict resolution logic that bypasses this binding in favor of a pool address inverts that priority.
The client is violating the spec, which actually strengthens the case against honoring the new client-id
Section 4.2 states:
"If the client supplies a 'client identifier', the client MUST use the same 'client identifier' in all subsequent messages, and the server MUST use that identifier to identify the client."
My nasty Govee device is changing its client-id between requests, which is an explicit RFC 2131 violation.
A client that breaks this rule has forfeited the right to be identified by client-id.
The server is not obligated to accommodate this violation - and should not do so by allowing the client to bypass a static reservation.
The default binding key is hardware address, not client-id
Section 2.1 states:
"The protocol defines that the key will be (IP-subnet-number, hardware-address) unless the client explicitly supplies an identifier using the 'client identifier' option."
Client-id overrides chaddr only when consistently supplied.
When a client rotates its client-id across requests, it has not consistently supplied one, and the server should fall back to chaddr - which matches the reservation.
The specific failure
Kea's conflict check fires when the reserved address has an existing lease with a different client-id.
But it does not check whether the hw-address on that conflicting lease is the same as the hw-address on the reservation.
In this case it is: same physical device, same chaddr, same reservation key - only the client-id token changed between requests in violation of section 4.2. There is no real conflict.
The ALLOC_ENGINE_V4_DISCOVER_ADDRESS_CONFLICT path in Kea was designed for the case where the reserved address is genuinely held by a different device.
So if the hw-address on the existing lease matches the hw-address on the reservation, do not treat it as a conflict.
The spec provides clear grounds for this: the binding key defaults to hw-address, and a client that rotates its client-id has violated the consistency requirement that would entitle it to be tracked by client-id instead.
Whether this needs to be fixed in Kea upstream or downstream in pfSense configuration I do not know, but `match-client-id: false` (current default in pfSense is `true`) discussed in https://forum.netgate.com/topic/184569/kea-dhcp-server-behavior-ip-address-reassignment-issue-with-duplicate-mac-addresses seems to help in similar situations.