A local LLM (Phi-4 14B via Ollama) works on the Titanic problem autonomously and indefinitely. Each iteration the model proposes one experiment (a complete Python script); the harness runs it in a sandboxed subprocess, parses the 5-fold cross-validation accuracy, records it, and feeds the result back so the model keeps improving. No Kaggle account, no API keys, no money.
./run.sh # foreground (Ctrl-C to stop; state is saved, resumes next run)
./run.sh bg # detached; logs to harness.log -> tail -f harness.logIt auto-starts Ollama, ensures the model is present, and (optionally) installs
xgboost/lightgbm to give the model stronger tools. Everything is restart-safe:
progress lives in state/journal.jsonl and state/best.json.
By default updates land every hour in STATUS.md plus a macOS notification.
The harness picks a notifier in this order: Telegram → Slack → desktop.
Telegram (recommended):
- Message @BotFather ->
/newbot-> copy the bot token. - Send your new bot any message, then open
https://api.telegram.org/bot<TOKEN>/getUpdatesand copyresult[0].message.chat.id. - Save both (token on line 1, chat id on line 2):
printf '%s\n%s\n' '123456:ABC-bottoken' '987654321' > telegram.txt # or: export TELEGRAM_BOT_TOKEN=... TELEGRAM_CHAT_ID=...
Slack (alternative): create an Incoming Webhook (https://api.slack.com/messaging/webhooks) then:
echo 'https://hooks.slack.com/services/XXX/YYY/ZZZ' > slack_webhook.txt| Setting | Default | Meaning |
|---|---|---|
UPDATE_INTERVAL_SECS |
3600 | how often to send an update — raise this for less frequent updates |
MODEL |
phi4:14b |
the brain (BRAIN_MODEL env overrides). Try gemma3:12b, mistral for lighter |
EXPERIMENT_TIMEOUT |
420 | max seconds per experiment script |
TEMPERATURE |
0.7 | higher = more exploration |
E.g. updates every 6 hours: UPDATE_INTERVAL_SECS=21600 ./run.sh bg
harness.py— the agent loopdata/titanic.csv— labeled data (891 rows)workspace/exp_NNNN.py— every script the model wrotestate/best.json— best score + the winning script pathSTATUS.md— latest status report
Currently it optimizes offline CV (the Kaggle test set is unlabeled anyway).
To submit for real later: add Kaggle API creds (~/.kaggle/kaggle.json),
pip install kaggle, and have the best script also write submission.csv
against the official test set, then kaggle competitions submit.