{"record":{"id":"ddd812bd0a1e25d5","repo":"netbirdio/netbird","slug":"startup-check-no-full-status-available","errorCode":null,"errorMessage":"startup check: no full status available","messagePattern":"startup check: no full status available","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"client/cmd/status.go","lineNumber":293,"sourceCode":"\t}\n}\n\nfunc checkReadiness(resp *proto.StatusResponse) error {\n\tdaemonStatus := internal.StatusType(resp.GetStatus())\n\tswitch daemonStatus {\n\tcase internal.StatusIdle, internal.StatusConnecting, internal.StatusConnected:\n\t\treturn nil\n\tcase internal.StatusNeedsLogin, internal.StatusLoginFailed, internal.StatusSessionExpired:\n\t\treturn fmt.Errorf(\"readiness check: daemon status is %s\", daemonStatus)\n\tdefault:\n\t\treturn fmt.Errorf(\"readiness check: unexpected daemon status %q\", daemonStatus)\n\t}\n}\n\nfunc checkStartup(resp *proto.StatusResponse) error {\n\tfullStatus := resp.GetFullStatus()\n\tif fullStatus == nil {\n\t\treturn fmt.Errorf(\"startup check: no full status available\")\n\t}\n\n\tif !fullStatus.GetManagementState().GetConnected() {\n\t\treturn fmt.Errorf(\"startup check: management not connected\")\n\t}\n\n\tif !fullStatus.GetSignalState().GetConnected() {\n\t\treturn fmt.Errorf(\"startup check: signal not connected\")\n\t}\n\n\tvar relayCount, relaysConnected int\n\tfor _, r := range fullStatus.GetRelays() {\n\t\turi := r.GetURI()\n\t\tif !strings.HasPrefix(uri, \"rel://\") && !strings.HasPrefix(uri, \"rels://\") {\n\t\t\tcontinue\n\t\t}\n\t\trelayCount++\n\t\tif r.GetAvailable() {","sourceCodeStart":275,"sourceCodeEnd":311,"githubUrl":"https://github.com/netbirdio/netbird/blob/93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c/client/cmd/status.go#L275-L311","documentation":"Thrown by checkStartup (client/cmd/status.go:293), used by 'netbird status --check startup'. The daemon answered the Status RPC but resp.GetFullStatus() is nil, meaning it did not attach the detailed FullStatus snapshot. This happens when the daemon has not yet assembled full status (engine still starting) or when the daemon predates the FullStatus field in the daemon IPC protocol.","triggerScenarios":"Running 'netbird status --check startup' immediately after 'netbird service start' before the first status gather completes; running a new CLI against an old daemon binary whose StatusResponse never populates the FullStatus protobuf field.","commonSituations":"Container health probes configured with no initial delay or too-short timeouts; version skew after upgrading only the CLI; daemon stuck in early startup (slow engine init).","solutions":["Retry with backoff until a timeout - full status typically appears seconds after the daemon starts","Verify CLI and daemon versions match ('netbird version' vs the installed service binary) and restart the service if skewed","Check daemon logs for startup errors that prevent the first status gather"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"var resp *proto.StatusResponse\nerr := WithBackOff(func() error {\n    var e error\n    resp, e = getStatus(ctx, true, false)\n    if e == nil && resp.GetFullStatus() == nil {\n        return fmt.Errorf(\"full status not gathered yet\") // retried by backoff\n    }\n    return e\n})","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Configure container probes with an initial delay so the daemon finishes its first status gather","Align CLI and daemon versions so FullStatus is always populated","Treat 'no full status' as transient: poll with deadline rather than failing on first attempt"],"tags":["cli","daemon","startup","readiness","version-skew","netbird"],"backgroundTag":null,"analyzedSha":"93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c","analyzedAt":"2026-08-16T03:09:19.136Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}