Ops automation
Hourly feedback triage
scripts/feedback-triage.mjs runs hourly from the host crontab (installed
2026-07-07, guarded by flock):
0 * * * * flock -n /tmp/paidup-feedback-triage.lock /usr/bin/node /srv/shared/Projects/paidup/scripts/feedback-triage.mjs >> /srv/paidup/logs/feedback-triage.log 2>&1
What it does per run:
- Reads up to
TRIAGE_MAX_ROWS(default 3)status='new'rows from the prod
feedback table through docker exec paidup-postgres psql (the DB has no
published port; DATABASE_URL is read from /srv/paidup/.env).
- Classifies bug-likeness (
scripts/lib/feedback-triage-helpers.mjs,
unit-tested in scripts/feedback-triage.test.mjs): kind=bug always,
otherwise defect-language heuristics.
- Bug-like rows (max
TRIAGE_MAX_CODEX_ROWS=1 codex run per hour) get an
isolated git worktree under /srv/paidup/triage-worktrees on branch
fix/feedback-<id> and a codex exec --full-auto investigation with a
20-minute budget. Commits present → branch kept for human review; no
commits / codex failure → worktree and branch are dropped.
- Every processed row becomes
status='triaged'with the verdict merged
into meta.triage (bug_like, outcome, branch, detail,
triaged_at).
- Telegram notification per row via
TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID
(from env or /srv/paidup/.env); logged and skipped when unset.
Review fix branches with git branch --list 'fix/feedback-*'; merge or drop.