I3175 — Two hosts presenting one node key are named as a duplicate, never folded into one flapping node
Detect two live instances advertising the same node id from different addresses within one expiry window, report them as a duplicate identity in mesh peers and as a failed check in mesh doctor, and keep the registry from counting their alternation as restarts.
READY wave 0 · p2 · implementation profile · parallel safe
Ready. Every dependency is done, so majordomus plan start I3175 will be accepted.
Objective
Detect two live instances advertising the same node id from different addresses within one expiry window, report them as a duplicate identity in mesh peers and as a failed check in mesh doctor, and keep the registry from counting their alternation as restarts.
Why
A copied node.json (cloned disk image, restored backup) makes two machines one identity; the 09-11 federation design asked for a gate on duplicate node ids. Today the registry replaces the record on every new instance id (mesh/registry.rs:252-260), so two hosts sharing a key read as one node restarting endlessly. Sources: chatgpt-majordomus:c113#2, chatgpt-majordomus:c113#18.
Current state
Verified: TOFU rejects one node id under a different key (mesh/trust.rs:32); nothing detects one key under two live instances; mesh doctor checks identity, trust, journal, firewall, runtime.
Desired state
registry tracks concurrent instances per node within the expiry; doctor fails 'identity' naming both addresses.
Scope
- apps/majordomus-cli/src/mesh/registry.rs
- apps/majordomus-cli/src/mesh/doctor.rs
- docs/MESH.md
Out of scope
- Revoking either host automatically
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- Two instances of one node id alternating inside one expiry are reported duplicate, with both addresses
- A real restart is still one restart
Validation
- majordomus plan validate
- cargo test --lib mesh::registry
Evidence required
- test_duplicate_instances_are_named
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3175.yaml. Read it back with majordomus plan show I3175.