multica-ai/multica · error
start daemon: %w
Error message
start daemon: %w
What it means
Error "start daemon: %w" thrown in multica-ai/multica.
Source
Thrown at server/cmd/multica/cmd_daemon.go:645
// ERROR_ACCESS_DENIED — fall back to spawning without breakaway, which
// matches the pre-fix behaviour. On Unix the bool is a no-op.
child.SysProcAttr = daemonSysProcAttr(true)
if err := child.Start(); err != nil {
if isAccessDeniedSpawnErr(err) {
// Retry without breakaway. Reset the cmd state — exec.Cmd is
// not safe to Start() twice, so build a fresh one.
child = exec.Command(exePath, args...)
child.Stdout = logFile
child.Stderr = logFile
child.SysProcAttr = daemonSysProcAttr(false)
if err := child.Start(); err != nil {
logFile.Close()
return fmt.Errorf("start daemon (no breakaway): %w", err)
}
} else {
logFile.Close()
return fmt.Errorf("start daemon: %w", err)
}
}
logFile.Close()
pid := child.Process.Pid
// Watch for early death instead of Release()ing right away: a child that
// fails preflight (unreachable server, token rejected with 401, ...) exits
// within seconds, and without this signal the readiness poll below would
// blindly run out its full window before printing a vague warning. The
// goroutine leaks Wait() for the (short) remainder of this process when
// the daemon starts fine — the child is never killed by it and keeps
// running independently, same as with Release().
waitCh := make(chan error, 1)
go func() { waitCh <- child.Wait() }()
// Write PID file.
pidPath := daemonPIDPathForProfile(profile)
if err := os.WriteFile(pidPath, []byte(strconv.Itoa(pid)), 0o644); err != nil {View on GitHub (pinned to 2c0912b6ec)
Solutions
- Inspect the wrapped error; check the daemon log for startup details.
When it happens
Trigger: Thrown at server/cmd/multica/cmd_daemon.go:645 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15).
Data as JSON: /api/errors/e17b9e84828edb97.
Report an issue: GitHub.