Skip to content

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

Part of runtime-trust — A runtime is safe to reach from another machine, and joining the mesh trusts nobody by accident.

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.

Searches the titles and descriptions of every page this site publishes.