tailscale/tailscale · error
aum with parent %x cannot be applied to a state with parent
Error message
aum with parent %x cannot be applied to a state with parent %x
What it means
Raised by checkParent when an AUM's parent hash does not equal state.LastAUMHash: the update claims to chain onto a different predecessor than the state it is being verified against. This indicates a fork, an out-of-order update, or an AUM applied to stale state.
Source
Thrown at tka/tka.go:465
if aum.MessageKind == AUMRemoveKey && len(state.Keys) == 1 {
if kid, err := state.Keys[0].ID(); err == nil && bytes.Equal(aum.KeyID, kid) {
return errors.New("cannot remove the last key in the state")
}
}
return nil
}
func checkParent(aum AUM, state State) error {
parent, hasParent := aum.Parent()
if !hasParent {
return errors.New("aum has no parent")
}
if state.LastAUMHash == nil {
return errors.New("cannot check update parent hash against a state with no previous AUM")
}
if *state.LastAUMHash != parent {
return fmt.Errorf("aum with parent %x cannot be applied to a state with parent %x", state.LastAUMHash, parent)
}
return nil
}
// Head returns the AUM digest of the latest update applied to the state
// machine.
func (a *Authority) Head() AUMHash {
return *a.state.LastAUMHash
}
// Open initializes an existing TKA from the given tailchonk.
//
// Only use this if the current node has initialized an Authority before.
// If a TKA exists on other nodes but there's nothing locally, use Bootstrap().
// If no TKA exists anywhere and you are creating it for the first
// time, use New().
func Open(storage Chonk) (*Authority, error) {
a, err := storage.LastActiveAncestor()View on GitHub (pinned to 6e0912f979)
Solutions
- Recompute the state at the AUM's actual parent (computeStateAt on aum.Parent()) instead of assuming the current head
- For legitimate forks, let fork-resolution logic (hash/signature-weight ordering) pick the winning chain
- Drop updates that reference parents not present in storage
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at tka/tka.go:465 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tailscale/tailscale@6e0912f979 (2026-08-18).
Data as JSON: /api/errors/39716a89cb06c145.
Report an issue: GitHub.