multica-ai/multica · critical
daemon exited during startup.
Error message
daemon exited during startup.
What it means
Constructed by daemonStartupFailureError in cmd_daemon.go when the spawned daemon child process exited before ever reporting ready, and the log-tail inspection did not match either recognized failure signature (auth token rejected, or network-unreachable). This is the fallback branch: the final error embeds an exit-code variant when available, a noise-filtered excerpt (WRN/ERR lines plus raw crash output like Go panics), and the full log paths so the user can diagnose directly.
Source
Thrown at server/cmd/multica/cmd_daemon.go:796
}
excerpt := filterDaemonLogNoise(lines, 5)
// Crash output is already raw (panics, the final cobra error line) — no
// noise filter, just cap it like the structured excerpt.
if len(crashLines) > 5 {
crashLines = crashLines[len(crashLines)-5:]
}
excerpt = append(excerpt, crashLines...)
if len(excerpt) > 0 {
b.WriteString("\nLog output:")
for _, line := range excerpt {
fmt.Fprintf(&b, "\n %s", line)
}
}
fmt.Fprintf(&b, "\nFull log: %s", logs.logPath)
if len(crashLines) > 0 {
fmt.Fprintf(&b, "\nCrash output: %s", logs.errLogPath)
}
return errors.New(b.String())
}
// filterDaemonLogNoise drops DBG/INF log lines from an excerpt, keeping
// WRN/ERR entries and plain (non-slog) lines such as the final error the
// child printed before exiting, capped to the last max lines.
func filterDaemonLogNoise(lines []string, max int) []string {
out := make([]string, 0, len(lines))
for _, line := range lines {
if strings.Contains(line, " DBG ") || strings.Contains(line, " INF ") {
continue
}
out = append(out, line)
}
if len(out) > max {
out = out[len(out)-max:]
}
return out
}View on GitHub (pinned to 2c0912b6ec)
Solutions
- Open the Full log path printed in the error — it contains the complete startup attempt.
- Check the Crash output path (daemon.err.log) for the Go panic or cobra 'Error:' line; that names the root cause.
- Re-run `multica login` and confirm the server URL is correct even if the heuristic missed the auth failure shape.
- Move aside/reset the daemon state directory if logs show corruption, then retry `multica daemon start`.
- If the panic persists, capture the crash tail and file it with the daemon version string.
Defensive patterns
Strategy: fallback
Try / catch
err := waitForDaemonReady(ctx, child, logs)
if err != nil {
return daemonStartupFailureError(logs, err, profile, serverURL) // already includes log paths + filtered excerpt
} Prevention
- Read the printed Full log and Crash output paths first — they contain the root cause for this fallback branch.
- Run `multica login` after token rotation to avoid the auth-rejection variant.
- Keep daemon state and log directories writable by the daemon user.
- Smoke-test `multica daemon start` after every upgrade in a scratch profile.
When it happens
Trigger: `multica daemon start` spawns the child which crashes before the ready signal: panic in daemon initialization, invalid config file, port already bound, missing permissions on state dirs, or any startup failure not matching the auth/network heuristics.
Common situations: Corrupted daemon state directory; config with an invalid value after an upgrade; another process holding the daemon port; binary/arch mismatch after a partial update; permissions changed on the log/state dirs.
Related errors
- repo is not configured for this workspace
- local_directory: local_path is empty
- ErrRepoBusy
- agent execution context requires MULTICA_TOKEN to be a task-
- daemon-managed task requires a task-local Multica config roo
AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15).
Data as JSON: /api/errors/c39d3b391a3288e8.
Report an issue: GitHub.