Skip to content

Execution Feedback Loop

Upgrade from "guess right in one shot" to "self-correct on failure".

The problem

The LLM's first operation plan can be wrong: inventing modules outside the manifest, failing to locate target elements, producing invalid field values. Aborting on the first failure is a poor experience.

The mechanism

After an execution failure, runAgent in @ai-operable/core feeds structured feedback back to the LLM to re-plan and retry automatically:

ts
import { runAgent } from '@ai-operable/core';

const result = await runAgent(userText, {
  manifest,
  provider,
  today: '2026-07-17',
  maxAttempts: 3, // default 3; pass 1 to disable the retry loop
  adapter,
  onAttempt: (n) => console.log(`attempt ${n}`),
});

Key design decisions

  • Semantic failure reasons: ExecuteResult.kind labels the failure type directly (locate-failed / unknown-module / user-cancelled) — more reliable than regex-parsing after the fact.
  • User cancellation is not retried: user-cancelled is a clear intent (the user rejected the confirmation of a dangerous operation) and is not retried.
  • Lean feedback: buildRetryFeedback only feeds back "original instruction + last plan + failed step + already-succeeded steps", not the full manifest again (it's already in the system prompt).
  • Loop guard: maxAttempts defaults to 3; parse failures also count and are fed back.

Why it lives in the core

The loop is pure orchestration with zero framework dependency, so putting it in the core makes it reusable in headless / MCP scenarios and unit-testable. The useAIAgent in react / vue is just a thin wrapper that surfaces the attempt state to the UI to show "attempt N".

MIT Licensed