Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2410

A trusted machine on the tailnet is found through Tailscale, with no address written by hand

Where it stands

devtask.issue
Readiness
ready no dependency and no gate holds it; nobody has started it
Status
READY
Can start
startable
Milestone
Milestone status
PLANNED
Wave
0
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
0 of 1
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2410

majordomus plan verify I2410

majordomus plan done I2410

What it is

Objective
Add a Tailscale discovery provider beside multicast, broadcast and rendezvous: it reads the local tailnet's peers and offers each one's tailnet address on the declared port as a candidate, which the link then admits or refuses under the trust list.
Why
No provider reads the tailnet (apps/majordomus-cli/src/mesh/manager.rs:436-450 wires multicast, broadcast and rendezvous only; the only mention of Tailscale is a ranking test in mesh/address.rs:186). Machines on the owner's tailnet are linked today only because .ai/repo/mesh/majordomus.yaml:41-50 lists their 100.x addresses by hand, so a machine added to the tailnet is invisible until somebody edits that file.
Now
Tailnet peers are dialed only through hand-written rendezvous endpoints.
Wanted
A `tailscale:` section of the mesh declaration (enabled by default when the tailscale CLI is present) whose provider lists online peers from `tailscale status --json` and hands their addresses to the cooperation dialer; absent or failing tailscale is reported in mesh doctor, never fatal.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • With a stubbed `tailscale status --json` naming two online peers, the provider offers exactly their tailnet addresses on the declared port
  • An offline peer, a peer without a tailnet IP and a missing tailscale CLI each produce no candidate and a doctor line
  • A candidate the trust list does not name is refused by the link, as any other candidate is
Validation
bin/majordomus plan validatecargo test --lib mesh::tailscale
Evidence required
tailscale_provider_stubbed_test
Evidence present
unknown: the record carries no `evidence` entries

Scope

Touches
apps/majordomus-cli/src/meshapps/majordomus-cli/src/mesh/manager.rsapps/majordomus-cli/src/mesh/config.rsshare/schemas/majordomus/mesh-declarationdocs/MESH.mdtest/cases
Not
unknown: the record declares no `non_scope`
Depends on
unknown: the record declares no `depends_on`
Priority
p0
Profile
implementation
Parallel safe
true
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-10
Updated
2026-10-10
Started
unknown: the record declares no `started_at`
Verified
unknown: the record declares no `verified_at`
Completed
unknown: the record declares no `completed_at`

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

LevelCodeMessageReproduce
WARNscope_conflictshares apps/majordomus-cli/src/mesh with I2411; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/mesh with I2412; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares docs/MESH.md with I2413; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/mesh with I2414; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/mesh with I2415; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2653; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/mesh with I2670; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2713; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2714; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2716; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2717; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2718; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2720; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/mesh with I2723; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2731; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2734; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2740; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares share/schemas/majordomus/mesh-declaration with I2742; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2747; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2760; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2786; they may not run concurrentlymajordomus plan validate