About Portfolio Cases Services Blog Contact 🎙 Talk to AI
EN DE RU
🎙 Talk to AI
November 11, 2026 · 5 min read

Does your AI agent stall without a human? Background autoloops finish tasks and only escalate unclear decisions

I’m Denis Shokhirev, an Agentic AI Systems Architect based in Freiburg im Breisgau, Germany, and at DennisCraft AI Studio I ship production AI systems on Claude, Supabase, n8n, Doppler, and self-hosted Postgres. The failure mode I keep seeing in live systems is boring but expensive: the agent gets most of the way through a task, hits one ambiguous step, and then sits idle until a human notices it. That is usually not a model-quality problem. It is an orchestration problem. If your architecture

Denis Shokhirev
Denis Shokhirev
Agentic AI Systems Architect
Telegram LinkedIn

I’m Denis Shokhirev, an Agentic AI Systems Architect based in Freiburg im Breisgau, Germany, and at DennisCraft AI Studio I ship production AI systems on Claude, Supabase, n8n, Doppler, and self-hosted Postgres. The failure mode I keep seeing in live systems is boring but expensive: the agent gets most of the way through a task, hits one ambiguous step, and then sits idle until a human notices it.

That is usually not a model-quality problem. It is an orchestration problem. If your architecture is one model call followed by a blanket human approval step, you do not have an autonomous system. You have a chat workflow with extra latency. In production, I replace that pattern with background autoloops: the agent keeps moving through low-risk steps, persists state after each transition, retries external failures, validates outputs, and only escalates when the next action is unclear, irreversible, or sensitive.

Why agents stall in production

Most teams start with a synchronous request-response shape because it is easy to demo. A user submits a task, the model plans, calls a tool, returns an answer, and a person approves the result. That works until the task spans multiple systems, waits on an API, or needs follow-up data. Then the agent has no durable state, no scheduler, no retry policy, and no explicit rule for what it may decide on its own.

Common symptoms

SymptomRoot causeFix
Tasks die after one API timeoutNo retry or backoffRun each step in a loop with bounded retries
Humans approve trivial stepsNo risk classificationSeparate safe, review, and blocked actions
Agent forgets progress after restartState lives in memory onlyPersist task state in Postgres or Supabase
No one knows why a task stoppedNo event logWrite status transitions and reason codes

The practical question is not “should a human stay in the loop?” The question is “at which exact decision points does a human add risk reduction that justifies delay?” Most steps in an operational workflow do not need review. Fetching data, normalizing fields, drafting a message, retrying a failed call, or preparing a SQL statement can all be autonomous if you put the right policy gates around them.

The autoloop pattern I use

An autoloop is not a branded tool. It is an operating pattern. A task exists as a database row. A worker picks the task, executes one step, stores the result, updates status, and schedules the next step. If confidence is low or the action is risky, the task moves to a human queue. This makes the system inspectable, resumable, and testable.

Minimal task state machine

I usually start with queued, running, waiting_external, waiting_human, done, and failed. Then I add attempt_count, next_run_at, risk_level, and reason_code. That is enough to stop hiding business logic inside prompts.

import os, psycopg
from anthropic import Anthropic

db = psycopg.connect(os.environ["DATABASE_URL"])
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

with db.cursor() as cur:
    cur.execute("""
        select id, prompt, attempt_count
        from agent_tasks
        where status in ('queued','running')
          and next_run_at <= now()
        order by created_at
        limit 5
        for update skip locked
    """)
    rows = cur.fetchall()

for task_id, prompt, attempts in rows:
    msg = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=500,
        messages=[{"role": "user", "content": prompt}]
    )
    text = msg.content[0].text
    status = "waiting_human" if "NEEDS_APPROVAL" in text else "done"
    with db.cursor() as cur:
        cur.execute(
            "update agent_tasks set status=%s, result=%s, attempt_count=%s where id=%s",
            (status, text, attempts + 1, task_id)
        )
    db.commit()

The important part is not the SDK call. The important part is that each pass does one bounded unit of work. If the model needs another tool result, the next loop iteration can request it. If the output hits a policy boundary, the task moves to waiting_human. That is what keeps tasks progressing without treating humans as a polling mechanism.

Where autonomy should stop

I classify actions by risk and reversibility. A stable agent can act autonomously on low-risk, reversible steps and escalate anything that creates legal, financial, or data-governance exposure.

Action typeAutonomousHuman review
Read internal APIsYesOnly on access failure
Classify inbound requestsYes, with loggingOn low confidence
Draft customer emailYesFor legal or contractual wording
Update Postgres rowsYes, via SQL allowlistFor bulk updates
Payments, contracts, data deletionNoAlways

This is where many teams over-trust prompts and under-build controls. OWASP’s LLM Top 10 project explicitly calls out excessive agency, prompt injection, and insecure output handling as operational risks in 2025: https://genai.owasp.org/. If your agent can call tools and write into business systems, you need explicit enforcement outside the prompt.

#!/usr/bin/env bash
set -euo pipefail

bandit -r app/ -f json -o bandit.json
gitleaks detect --source . --report-format json --report-path gitleaks.json
semgrep --config p/owasp-top-ten --json --output semgrep.json

if jq -e '.results | length > 0' semgrep.json >/dev/null; then
  echo "Semgrep found issues"
  exit 1
fi

echo "Checks passed"

I use checks like these both in CI and, when the workflow writes code or SQL, as pre-execution gates inside the agent pipeline. Anthropic’s documentation on tool use and computer use also makes the same architectural point: model output should be bounded by explicit system controls, not assumed safe by default. Source: Anthropic documentation, 2025, https://docs.anthropic.com/.

Observability matters more than prompt polish

When a team tells me “the agent sometimes hangs,” I ask three questions: which step did it stop on, why did it stop, and how many retries happened before escalation? If nobody can answer without opening container logs, the issue is not prompt quality. It is missing task telemetry.

Minimum event data to store

  • task_id, step_name, status_before, status_after
  • reason_code for every transition
  • attempt_count and next_run_at
  • which tools were called and under what permissions
  • who approved a human escalation and how long it took

This also helps with regulated environments. If a customer asks why an automated action occurred, you need more than “the model decided.” You need a reconstructable chain: input, intermediate results, policy gate, escalation rule, final actor. That is one reason background autoloops age better in production than giant prompts with hidden branching logic.

A practical stack with n8n, Supabase, and Postgres

For small and midsize teams, the architecture does not need to be exotic. I often use Supabase or self-hosted Postgres as the source of truth, n8n for orchestration and wake-ups, Python workers for model execution, and Doppler for secrets. Public observability, if needed, runs through a separate read-only path with sensitive payloads removed.

name: agent-loop
on:
  schedule:
    - cron: "*/2 * * * *"
jobs:
  loop:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - run: pip install anthropic psycopg[binary]
      - run: python workers/run_loop.py
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          DATABASE_URL: ${{ secrets.DATABASE_URL }}

This design is not glamorous, but it survives restarts, audits, and real queues. That is usually the difference between an agent that looks smart in a demo and one that quietly completes work at 2 a.m. without paging your team.

FAQ

When do I need an autoloop instead of a chat interface?

As soon as the task spans multiple steps, depends on external systems, or needs retries and state. If your process has status transitions and side effects, a loop is usually the safer shape.

Can I build this only in n8n?

For simple flows, yes. For longer-lived tasks with branching, auditability, and policy control, I strongly prefer keeping durable state in Postgres and using n8n as orchestration rather than the sole source of truth.

Does every agent need human approval?

No. What you need is human review on uncertainty or on high-risk actions. Requiring approval for every trivial step just turns automation into delayed manual work.

What is the most common anti-pattern?

Hiding all task state inside the prompt or inside one worker process. The first restart or timeout turns that design into an incident.

How should I measure whether autoloops help?

Track median time to completion, percentage of tasks completed without human intervention, time-to-escalation, and retry success rate. If you do not measure those, you are debating architecture by intuition.

Which exact stage causes the most stalls in your production agent stack today: tool calls, external API retries, policy gates, or human approvals? I’d genuinely like to compare that with what I’m seeing across DACH B2B systems. I run a free 30-min stack audit for DACH founders building AI in regulated markets. DM me on LinkedIn or write to @ger_dennis_ai.

For your business

I build agents like this for businesses in Germany and the EU.

Tell me in two sentences what eats your team’s time – reply within 24 hours.

Custom AI agents (German page) →
Continue reading
Your AI agent keeps hallucinating and breaking the repo? How to give Claude Code memory, data access, and safe guardrails
Why one agent is no longer enough: orchestrating Claude Code, Codex, and Kiro without tmux chaos
Claude Code can leak into Slack, WordPress, and .env in production: 10 guardrails to enable before first run
Stop giving AI agents production keys: new control planes and approval gates for irreversible actions
All articles →
Where this is applied
Services — what we build
Talk to the voice agent
Case studies
Ready to build?

Turn your process into an AI system

Production quality. DACH B2B focus.

Start a project → ← All articles