Hi! First off, thanks for cold-cli. The agent-first design is exactly what I was looking for, and the SMTP/IMAP path works nicely with a plain mailbox.
I hit something while cleaning up after a test run.
What happens
campaign delete prints success, but only removes the campaign_leads association. Everything else stays:
- the
campaigns row itself
- its
scheduled_sends and email_messages
- the
leads, email addresses included
Because the association is gone, campaign list then shows the campaign with leads: 0, which makes it look half-deleted rather than not deleted.
Reproduce
cold-cli campaign create --name probe --sequence sequence.yml \
--leads leads.csv --accounts me@example.com
cold-cli campaign activate probe
cold-cli tick # one send goes out
cold-cli campaign delete probe # prints: Deleted campaign "probe" (id=N)
cold-cli campaign list # still there, status completed, leads: 0
sqlite3 ~/.cold-cli/data.db 'select id,name,status from campaigns; select count(*) from leads;'
A campaign deleted before any send does disappear from campaign list, but its leads stay in the leads table either way.
Possible cause
The foreign keys pointing at campaigns are all ON DELETE NO ACTION:
campaign_accounts.campaign_id campaign_leads.campaign_id
email_messages.campaign_id events.campaign_id
manual_reply_attempts.campaign_id scheduled_sends.campaign_id
So once sends exist the delete can't proceed, and the error doesn't seem to reach the exit status or the output.
Why it matters to me
Leads are contact data. Deleting a campaign looks like a reasonable way to honour a "please delete my data" request, and right now it silently isn't. I'd also expect a non-zero exit code when nothing was deleted, since scripts and agents key off that.
Happy to send a PR if you'd like: ON DELETE CASCADE on those FKs plus a --purge-leads flag would cover it, but it's your call on whether leads should survive by design.
Version: built from 68a6defb29cc, Go 1.27.1, Linux, SQLite backend.
Hi! First off, thanks for cold-cli. The agent-first design is exactly what I was looking for, and the SMTP/IMAP path works nicely with a plain mailbox.
I hit something while cleaning up after a test run.
What happens
campaign deleteprints success, but only removes thecampaign_leadsassociation. Everything else stays:campaignsrow itselfscheduled_sendsandemail_messagesleads, email addresses includedBecause the association is gone,
campaign listthen shows the campaign withleads: 0, which makes it look half-deleted rather than not deleted.Reproduce
A campaign deleted before any send does disappear from
campaign list, but its leads stay in theleadstable either way.Possible cause
The foreign keys pointing at
campaignsare allON DELETE NO ACTION:So once sends exist the delete can't proceed, and the error doesn't seem to reach the exit status or the output.
Why it matters to me
Leads are contact data. Deleting a campaign looks like a reasonable way to honour a "please delete my data" request, and right now it silently isn't. I'd also expect a non-zero exit code when nothing was deleted, since scripts and agents key off that.
Happy to send a PR if you'd like:
ON DELETE CASCADEon those FKs plus a--purge-leadsflag would cover it, but it's your call on whether leads should survive by design.Version: built from
68a6defb29cc, Go 1.27.1, Linux, SQLite backend.