#!/bin/bash
# AA-043 single writer: kontinuierlicher Loop statt 10-Min-Timer.
# Verarbeitet eligible aa043-Queue-Zeilen direkt hintereinander (Concurrency=1,
# Single-Writer-Instanz bleibt erhalten). Kein Busy-Loop: 15 s Poll bei leerer Queue.
DB=/opt/struktur/youtube-research/knowledge.db
WRITER=/opt/struktur/obsidian-graphiti-reconciler-staging/aa043_single_writer.py
MAX_CONSECUTIVE_ERRORS=5
errors=0
while true; do
QID=$(sqlite3 "$DB" "select id from graphiti_import_queue where reconciliation_record_id like 'aa043:%' and graphiti_status in ('queued','retry_wait','lease_expired') order by id limit 1")
if [ -z "$QID" ]; then
sleep 15
errors=0
continue
fi
echo "$(date -u +%H:%M:%S) == processing queue $QID =="
cd /opt/obsidian-vault
if /usr/bin/python3 "$WRITER" --queue-id "$QID"; then
errors=0
else
errors=$((errors+1))
echo "queue $QID failed (consecutive errors: $errors)"
if [ $errors -ge $MAX_CONSECUTIVE_ERRORS ]; then
echo "too many consecutive errors, cooling down 300s"
sleep 300
errors=0
fi
fi
done