diff --git a/metropolis/cli/metroctl/cmd_certs.go b/metropolis/cli/metroctl/cmd_certs.go
index 075a0d0..d914c83 100644
--- a/metropolis/cli/metroctl/cmd_certs.go
+++ b/metropolis/cli/metroctl/cmd_certs.go
@@ -29,7 +29,7 @@
 	Example: "metroctl cert export",
 	Run: func(cmd *cobra.Command, args []string) {
 		ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
-		if errors.Is(err, core.NoCredentialsError) {
+		if errors.Is(err, core.ErrNoCredentials) {
 			log.Fatalf("You have to take ownership of the cluster first: %v", err)
 		}
 
diff --git a/metropolis/cli/metroctl/cmd_k8scredplugin.go b/metropolis/cli/metroctl/cmd_k8scredplugin.go
index adc3fe8..0d1f318 100644
--- a/metropolis/cli/metroctl/cmd_k8scredplugin.go
+++ b/metropolis/cli/metroctl/cmd_k8scredplugin.go
@@ -28,7 +28,7 @@
 
 func doK8sCredPlugin(cmd *cobra.Command, args []string) {
 	cert, key, err := core.GetOwnerCredentials(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatal("No credentials found on your machine")
 	}
 	if err != nil {
diff --git a/metropolis/cli/metroctl/cmd_takeownership.go b/metropolis/cli/metroctl/cmd_takeownership.go
index adad3cf..5161dc9 100644
--- a/metropolis/cli/metroctl/cmd_takeownership.go
+++ b/metropolis/cli/metroctl/cmd_takeownership.go
@@ -47,7 +47,7 @@
 	// Retrieve the cluster owner's private key, and use it to construct
 	// ephemeral credentials. Then, dial the cluster.
 	opk, err := core.GetOwnerKey(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatalf("Owner key does not exist. takeownership needs to be executed on the same system that has previously installed the cluster using metroctl install.")
 	}
 	if err != nil {
diff --git a/metropolis/cli/metroctl/core/ca_tofu.go b/metropolis/cli/metroctl/core/ca_tofu.go
index 9df9957..b578aa6 100644
--- a/metropolis/cli/metroctl/core/ca_tofu.go
+++ b/metropolis/cli/metroctl/core/ca_tofu.go
@@ -114,7 +114,7 @@
 	if err == nil {
 		return ca, nil
 	}
-	if !errors.Is(err, NoCACertificateError) {
+	if !errors.Is(err, ErrNoCACertificate) {
 		return nil, err
 	}
 
@@ -128,7 +128,7 @@
 	// against it, and don't ask the user.
 	var ocert *x509.Certificate
 	if err != nil {
-		if errors.Is(err, NoCredentialsError) {
+		if errors.Is(err, ErrNoCredentials) {
 			okey, err := GetOwnerKey(c.ConfigPath)
 			if err != nil {
 				return nil, err
diff --git a/metropolis/cli/metroctl/core/config.go b/metropolis/cli/metroctl/core/config.go
index f3ca8b3..d119883 100644
--- a/metropolis/cli/metroctl/core/config.go
+++ b/metropolis/cli/metroctl/core/config.go
@@ -35,11 +35,13 @@
 	CACertificateFileName = "ca.pem"
 )
 
-// NoCredentialsError indicates that the requested datum (eg. owner key or owner
-// certificate) is not present in the requested directory.
-var NoCredentialsError = errors.New("owner certificate or key does not exist")
+var (
+	// ErrNoCredentials indicates that the requested datum (eg. owner key or owner
+	// certificate) is not present in the requested directory.
+	ErrNoCredentials = errors.New("owner certificate or key does not exist")
 
-var NoCACertificateError = errors.New("no cluster CA certificate while secure connection was requested")
+	ErrNoCACertificate = errors.New("no cluster CA certificate while secure connection was requested")
+)
 
 // A PEM block type for a Metropolis initial owner private key
 const ownerKeyType = "METROPOLIS INITIAL OWNER PRIVATE KEY"
@@ -51,7 +53,7 @@
 	switch {
 	case err == nil:
 		return existing, nil
-	case errors.Is(err, NoCredentialsError):
+	case errors.Is(err, ErrNoCredentials):
 	default:
 		return nil, err
 	}
@@ -88,11 +90,11 @@
 
 // GetOwnerKey loads and returns a raw ED25519 private key from the saved owner
 // key in a given metroctl configuration directory path. If the owner key doesn't
-// exist, NoCredentialsError will be returned.
+// exist, ErrNoCredentials will be returned.
 func GetOwnerKey(path string) (ed25519.PrivateKey, error) {
 	ownerPrivateKeyPEM, err := os.ReadFile(filepath.Join(path, OwnerKeyFileName))
 	if os.IsNotExist(err) {
-		return nil, NoCredentialsError
+		return nil, ErrNoCredentials
 	} else if err != nil {
 		return nil, fmt.Errorf("failed to load owner private key: %w", err)
 	}
@@ -125,7 +127,7 @@
 // GetOwnerCredentials loads and returns a raw ED25519 private key alongside a
 // DER-encoded X509 certificate from the saved owner key and certificate in a
 // given metroctl configuration directory path. If either the key or certificate
-// doesn't exist, NoCredentialsError will be returned.
+// doesn't exist, ErrNoCredentials will be returned.
 func GetOwnerCredentials(path string) (cert *x509.Certificate, key ed25519.PrivateKey, err error) {
 	key, err = GetOwnerKey(path)
 	if err != nil {
@@ -134,7 +136,7 @@
 
 	ownerCertPEM, err := os.ReadFile(filepath.Join(path, OwnerCertificateFileName))
 	if os.IsNotExist(err) {
-		return nil, nil, NoCredentialsError
+		return nil, nil, ErrNoCredentials
 	} else if err != nil {
 		return nil, nil, fmt.Errorf("failed to load owner certificate: %w", err)
 	}
@@ -171,7 +173,7 @@
 func GetClusterCA(path string) (cert *x509.Certificate, err error) {
 	caCertPEM, err := os.ReadFile(filepath.Join(path, CACertificateFileName))
 	if os.IsNotExist(err) {
-		return nil, NoCACertificateError
+		return nil, ErrNoCACertificate
 	} else if err != nil {
 		return nil, fmt.Errorf("failed to load CA certificate: %w", err)
 	}
diff --git a/metropolis/cli/metroctl/rpc.go b/metropolis/cli/metroctl/rpc.go
index 06008e3..cab6d4f 100644
--- a/metropolis/cli/metroctl/rpc.go
+++ b/metropolis/cli/metroctl/rpc.go
@@ -18,7 +18,7 @@
 	// Collect credentials, validate command parameters, and try dialing the
 	// cluster.
 	ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatalf("You have to take ownership of the cluster first: %v", err)
 	}
 	if len(flags.clusterEndpoints) == 0 {
@@ -52,7 +52,7 @@
 	// Collect credentials, validate command parameters, and try dialing the
 	// cluster.
 	ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
-	if errors.Is(err, core.NoCredentialsError) {
+	if errors.Is(err, core.ErrNoCredentials) {
 		log.Fatalf("You have to take ownership of the cluster first: %v", err)
 	}
 	cc, err := core.DialNode(ctx, opkey, ocert, cacert, flags.proxyAddr, id, address)
diff --git a/metropolis/node/core/consensus/client/unimplemented.go b/metropolis/node/core/consensus/client/unimplemented.go
index 047e8ee..9b146eb 100644
--- a/metropolis/node/core/consensus/client/unimplemented.go
+++ b/metropolis/node/core/consensus/client/unimplemented.go
@@ -9,10 +9,10 @@
 )
 
 var (
-	// UnimplementedInNamespaced will be raised by panic() any time a method
+	// ErrUnimplementedInNamespaced will be raised by panic() any time a method
 	// from the Cluster, Auth and Maintenance APIs gets called on a
 	// clientv3.Client returned by ThinClient or Namespaced.ThinClient.
-	UnimplementedInNamespaced = errors.New("interface not implemented in Namespaced etcd client")
+	ErrUnimplementedInNamespaced = errors.New("interface not implemented in Namespaced etcd client")
 )
 
 // unimplementedCluster implements clientv3.Cluster, but panics on any call.
@@ -20,27 +20,27 @@
 }
 
 func (c *unimplementedCluster) MemberList(_ context.Context) (*clientv3.MemberListResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberAdd(_ context.Context, _ []string) (*clientv3.MemberAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberAddAsLearner(_ context.Context, _ []string) (*clientv3.MemberAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberRemove(_ context.Context, _ uint64) (*clientv3.MemberRemoveResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberUpdate(_ context.Context, _ uint64, _ []string) (*clientv3.MemberUpdateResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedCluster) MemberPromote(_ context.Context, _ uint64) (*clientv3.MemberPromoteResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 // unimplementedAuth implements clientv3.Auth but panics on any call.
@@ -48,75 +48,75 @@
 }
 
 func (c *unimplementedAuth) Authenticate(ctx context.Context, name string, password string) (*clientv3.AuthenticateResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) AuthEnable(ctx context.Context) (*clientv3.AuthEnableResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) AuthDisable(ctx context.Context) (*clientv3.AuthDisableResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) AuthStatus(ctx context.Context) (*clientv3.AuthStatusResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserAdd(ctx context.Context, name string, password string) (*clientv3.AuthUserAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserAddWithOptions(ctx context.Context, name string, password string, opt *clientv3.UserAddOptions) (*clientv3.AuthUserAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserDelete(ctx context.Context, name string) (*clientv3.AuthUserDeleteResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserChangePassword(ctx context.Context, name string, password string) (*clientv3.AuthUserChangePasswordResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserGrantRole(ctx context.Context, user string, role string) (*clientv3.AuthUserGrantRoleResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserGet(ctx context.Context, name string) (*clientv3.AuthUserGetResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserList(ctx context.Context) (*clientv3.AuthUserListResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) UserRevokeRole(ctx context.Context, name string, role string) (*clientv3.AuthUserRevokeRoleResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleAdd(ctx context.Context, name string) (*clientv3.AuthRoleAddResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleGrantPermission(ctx context.Context, name string, key, rangeEnd string, permType clientv3.PermissionType) (*clientv3.AuthRoleGrantPermissionResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleGet(ctx context.Context, role string) (*clientv3.AuthRoleGetResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleList(ctx context.Context) (*clientv3.AuthRoleListResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleRevokePermission(ctx context.Context, role string, key, rangeEnd string) (*clientv3.AuthRoleRevokePermissionResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedAuth) RoleDelete(ctx context.Context, role string) (*clientv3.AuthRoleDeleteResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 // unimplementedMaintenance implements clientv3.Maintenance but panics on any call.
@@ -124,29 +124,29 @@
 }
 
 func (c *unimplementedMaintenance) AlarmList(ctx context.Context) (*clientv3.AlarmResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) AlarmDisarm(ctx context.Context, m *clientv3.AlarmMember) (*clientv3.AlarmResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) Defragment(ctx context.Context, endpoint string) (*clientv3.DefragmentResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) Status(ctx context.Context, endpoint string) (*clientv3.StatusResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) HashKV(ctx context.Context, endpoint string, rev int64) (*clientv3.HashKVResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
 
 func (c *unimplementedMaintenance) MoveLeader(ctx context.Context, transfereeID uint64) (*clientv3.MoveLeaderResponse, error) {
-	panic(UnimplementedInNamespaced)
+	panic(ErrUnimplementedInNamespaced)
 }
diff --git a/metropolis/node/core/curator/impl_leader.go b/metropolis/node/core/curator/impl_leader.go
index d7c6222..ad557fc 100644
--- a/metropolis/node/core/curator/impl_leader.go
+++ b/metropolis/node/core/curator/impl_leader.go
@@ -73,13 +73,13 @@
 }
 
 var (
-	// lostLeadership is returned by txnAsLeader if the transaction got canceled
+	// errLostLeadership is returned by txnAsLeader if the transaction got canceled
 	// because leadership was lost.
-	lostLeadership = errors.New("lost leadership")
+	errLostLeadership = errors.New("lost leadership")
 )
 
 // txnAsLeader performs an etcd transaction guarded by continued leadership.
-// lostLeadership will be returned as an error in case the leadership is lost.
+// errLostLeadership will be returned as an error in case the leadership is lost.
 func (l *leadership) txnAsLeader(ctx context.Context, ops ...clientv3.Op) (*clientv3.TxnResponse, error) {
 	var opsStr []string
 	for _, op := range ops {
@@ -118,7 +118,7 @@
 			}
 		}
 		rpc.Trace(ctx).Printf("txnAsLeader(...): rejected (lost leadership (key %s should've been at rev %d, is at rev %s)", l.lockKey, l.lockRev, lockRev)
-		return nil, lostLeadership
+		return nil, errLostLeadership
 	}
 	rpc.Trace(ctx).Printf("txnAsLeader(...): ok")
 	return resp, nil
@@ -128,7 +128,7 @@
 // directly exposed to RPC clients. If false is returned, the error was not
 // converted and is returned verbatim.
 func rpcError(err error) (error, bool) {
-	if errors.Is(err, lostLeadership) {
+	if errors.Is(err, errLostLeadership) {
 		return status.Error(codes.Unavailable, "lost leadership"), true
 	}
 	if errors.Is(err, context.DeadlineExceeded) {
diff --git a/metropolis/node/core/curator/impl_leader_cluster_networking.go b/metropolis/node/core/curator/impl_leader_cluster_networking.go
index 4bd729d..6bfe82d 100644
--- a/metropolis/node/core/curator/impl_leader_cluster_networking.go
+++ b/metropolis/node/core/curator/impl_leader_cluster_networking.go
@@ -33,7 +33,7 @@
 	defer w.Close()
 	for {
 		nodeKV, err := w.Get(ctx, event.BacklogOnly[*nodeAtID]())
-		if errors.Is(err, event.BacklogDone) {
+		if errors.Is(err, event.ErrBacklogDone) {
 			break
 		}
 		if err != nil {
diff --git a/metropolis/node/core/curator/impl_leader_curator.go b/metropolis/node/core/curator/impl_leader_curator.go
index d45fc79..9833410 100644
--- a/metropolis/node/core/curator/impl_leader_curator.go
+++ b/metropolis/node/core/curator/impl_leader_curator.go
@@ -109,7 +109,7 @@
 	nodes := make(map[string]*Node)
 	for {
 		nodeKV, err := w.Get(ctx, event.BacklogOnly[*nodeAtID]())
-		if errors.Is(err, event.BacklogDone) {
+		if errors.Is(err, event.ErrBacklogDone) {
 			break
 		}
 		if err != nil {
diff --git a/metropolis/node/core/network/dhcp4c/dhcpc.go b/metropolis/node/core/network/dhcp4c/dhcpc.go
index bfb2676..4aeeb3d 100644
--- a/metropolis/node/core/network/dhcp4c/dhcpc.go
+++ b/metropolis/node/core/network/dhcp4c/dhcpc.go
@@ -482,13 +482,13 @@
 		err = s.handleMessage(offer, sentTime)
 		if err == nil {
 			return nil
-		} else if !errors.Is(err, InvalidMsgErr) {
+		} else if !errors.Is(err, ErrInvalidMsg) {
 			return err
 		}
 	}
 }
 
-var InvalidMsgErr = errors.New("invalid message")
+var ErrInvalidMsg = errors.New("invalid message")
 
 func (c *Client) runState(ctx context.Context) error {
 	switch c.state {
@@ -516,7 +516,7 @@
 						return c.transitionToBound(offer, sentTime)
 					}
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 		})
 	case stateRequesting:
@@ -541,7 +541,7 @@
 					c.requestingToDiscovering()
 					return nil
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 			stateDeadlineExceeded: func() error {
 				c.requestingToDiscovering()
@@ -578,7 +578,7 @@
 				case dhcpv4.MessageTypeNak:
 					return c.leaseToDiscovering()
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 			stateDeadlineExceeded: func() error {
 				c.state = stateRebinding
@@ -609,7 +609,7 @@
 				case dhcpv4.MessageTypeNak:
 					return c.leaseToDiscovering()
 				}
-				return InvalidMsgErr
+				return ErrInvalidMsg
 			},
 			stateDeadlineExceeded: func() error {
 				return c.leaseToDiscovering()
diff --git a/metropolis/node/core/rpc/resolver/watcher.go b/metropolis/node/core/rpc/resolver/watcher.go
index d2715b6..c9fe47e 100644
--- a/metropolis/node/core/rpc/resolver/watcher.go
+++ b/metropolis/node/core/rpc/resolver/watcher.go
@@ -17,9 +17,9 @@
 }
 
 var (
-	// ResolverClosed will be returned by the resolver to gRPC machinery whenever a
+	// ErrResolverClosed will be returned by the resolver to gRPC machinery whenever a
 	// resolver cannot be used anymore because it was Closed.
-	ResolverClosed = errors.New("cluster resolver closed")
+	ErrResolverClosed = errors.New("cluster resolver closed")
 )
 
 // Build is called by gRPC on each Dial call. It spawns a new clientWatcher,
@@ -45,7 +45,7 @@
 
 	select {
 	case <-r.ctx.Done():
-		return nil, ResolverClosed
+		return nil, ErrResolverClosed
 	case r.reqC <- &request{
 		ds: &requestDialOptionsSet{
 			options: options,
@@ -61,7 +61,7 @@
 	}
 	select {
 	case <-r.ctx.Done():
-		return nil, ResolverClosed
+		return nil, ErrResolverClosed
 	case r.reqC <- req:
 	}
 	// This receive is uninterruptible by contract - as it's also uninterruptible on
@@ -94,7 +94,7 @@
 		if update == nil {
 			// A nil result means the channel is closed, which means this watcher has either
 			// closed or the resolver has been canceled. Abort loop.
-			w.clientConn.ReportError(ResolverClosed)
+			w.clientConn.ReportError(ErrResolverClosed)
 			break
 		}
 		w.clientConn.UpdateState(resolver.State{
diff --git a/metropolis/pkg/event/etcd/etcd.go b/metropolis/pkg/event/etcd/etcd.go
index 14dfd99..71e8056 100644
--- a/metropolis/pkg/event/etcd/etcd.go
+++ b/metropolis/pkg/event/etcd/etcd.go
@@ -402,7 +402,7 @@
 	}
 
 	if backlogOnly && len(w.backlogged) == 0 {
-		return empty, event.BacklogDone
+		return empty, event.ErrBacklogDone
 	}
 
 	// Update backlog from etcd if needed.
diff --git a/metropolis/pkg/event/etcd/etcd_test.go b/metropolis/pkg/event/etcd/etcd_test.go
index 45b5f98..f1eb5ed 100644
--- a/metropolis/pkg/event/etcd/etcd_test.go
+++ b/metropolis/pkg/event/etcd/etcd_test.go
@@ -776,15 +776,15 @@
 	// As expected, next call to Get with BacklogOnly fails - there truly is no new
 	// updates to emit.
 	_, err = watcher.Get(ctx, event.BacklogOnly[StringAt]())
-	if want, got := event.BacklogDone, err; !errors.Is(got, want) {
+	if want, got := event.ErrBacklogDone, err; !errors.Is(got, want) {
 		t.Fatalf("Second Get: wanted %v, got %v", want, got)
 	}
 
 	// Implementation detail: even though there is a new value ('second'),
-	// BacklogOnly will still return BacklogDone.
+	// BacklogOnly will still return ErrBacklogDone.
 	tc.put(t, k, "second")
 	_, err = watcher.Get(ctx, event.BacklogOnly[StringAt]())
-	if want, got := event.BacklogDone, err; !errors.Is(got, want) {
+	if want, got := event.ErrBacklogDone, err; !errors.Is(got, want) {
 		t.Fatalf("Third Get: wanted %v, got %v", want, got)
 	}
 
@@ -836,11 +836,11 @@
 	tc.put(t, ks+"a", "val-100")
 	tc.put(t, ks+"b", "val-101")
 
-	// Retrieve the rest of the backlog until BacklogDone is returned.
+	// Retrieve the rest of the backlog until ErrBacklogDone is returned.
 	nUpdates := 1
 	for {
 		g, err := w.Get(ctx, event.BacklogOnly[StringAt]())
-		if errors.Is(err, event.BacklogDone) {
+		if errors.Is(err, event.ErrBacklogDone) {
 			break
 		}
 		if err != nil {
diff --git a/metropolis/pkg/event/event.go b/metropolis/pkg/event/event.go
index e38c427..a8b3526 100644
--- a/metropolis/pkg/event/event.go
+++ b/metropolis/pkg/event/event.go
@@ -179,7 +179,7 @@
 }
 
 // BacklogOnly will prevent Get from blocking on waiting for more updates from
-// etcd, by instead returning BacklogDone whenever no more data is currently
+// etcd, by instead returning ErrBacklogDone whenever no more data is currently
 // locally available. This is different however, from establishing that there
 // are no more pending updates from the etcd cluster - the only way to ensure
 // the local client is up to date is by performing Get calls without this option
@@ -187,7 +187,7 @@
 //
 // This mode of retrieval should only be used for the retrieval of the existing
 // data in the etcd cluster on the initial creation of the Watcher (by
-// repeatedly calling Get until BacklogDone is returned), and shouldn't be set
+// repeatedly calling Get until ErrBacklogDone is returned), and shouldn't be set
 // for any subsequent call. Any use of this option after that initial fetch is
 // undefined behaviour that exposes the internals of the Get implementation, and
 // must not be relied on. However, in the future, this behaviour might be
@@ -203,10 +203,10 @@
 }
 
 var (
-	// BacklogDone is returned by Get when BacklogOnly is set and there is no more
+	// ErrBacklogDone is returned by Get when BacklogOnly is set and there is no more
 	// event data stored in the Watcher client, ie. when the initial cluster state
 	// of the requested key has been retrieved.
-	BacklogDone = errors.New("no more backlogged data")
+	ErrBacklogDone = errors.New("no more backlogged data")
 )
 
 // Pipe a Value's initial state and subsequent updates to an already existing
