plandex-ai/plandex · error
panic in AddPlanConvoMessage: %v %s
Error message
panic in AddPlanConvoMessage: %v %s
What it means
Recovery guard inside AddPlanConvoMessage's goroutine: a panic occurred while persisting the convo message; the panic value and stack are logged and converted into this returned error instead of crashing the server.
Source
Thrown at app/server/db/plan_helpers.go:149
return namesMap, nil
}
func AddPlanContextTokens(planId, branch string, addTokens int) error {
_, err := Conn.Exec("UPDATE branches SET context_tokens = context_tokens + $1 WHERE plan_id = $2 AND name = $3", addTokens, planId, branch)
if err != nil {
return fmt.Errorf("error updating plan tokens: %v", err)
}
return nil
}
func AddPlanConvoMessage(msg *ConvoMessage, branch string) error {
errCh := make(chan error, 2)
go func() {
defer func() {
if r := recover(); r != nil {
log.Printf("panic in AddPlanConvoMessage: %v\n%s", r, debug.Stack())
errCh <- fmt.Errorf("panic in AddPlanConvoMessage: %v\n%s", r, debug.Stack())
runtime.Goexit() // don't allow outer function to continue and double-send to channel
}
}()
_, err := Conn.Exec("UPDATE branches SET convo_tokens = convo_tokens + $1 WHERE plan_id = $2 AND name = $3", msg.Tokens, msg.PlanId, branch)
if err != nil {
errCh <- fmt.Errorf("error updating plan tokens: %v", err)
return
}
errCh <- nil
}()
go func() {
defer func() {
if r := recover(); r != nil {
log.Printf("panic in AddPlanConvoMessage: %v\n%s", r, debug.Stack())View on GitHub (pinned to e2d772072e)
Solutions
- Read the logged stack trace to find the panicking code path
- Check for nil fields on the ConvoMessage being inserted
- Fix the underlying nil-deref/bug; the recover is only a safety net
Defensive patterns
Strategy: fallback
When it happens
Trigger: Thrown at app/server/db/plan_helpers.go:149 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/3c7518332a6e94b7.
Report an issue: GitHub.