Settled, for now

Feedback loops in agentic AI development

Modern AI-assisted development operates through two interconnected feedback systems: technical loops where agents iterate autonomously through tests, diagnostics, and CI signals, and human learning loops where developers maintain expertise while delegating to AI. The most productive developers have mastered both; configuring tight agent feedback cycles while deliberately preserving their own cognitive development. This report provides a complete taxonomy of both loop types and practical strategies for implementing them.

Technical loop
ContextActionTestsRepairEvidence
Human loop
ObserveQuestionReviewLearnJudgment
Calibration
Agent evidence sharpens human judgment; human judgment decides which evidence matters.

The architecture of agentic development has matured rapidly. Tools like Claude Code, Cursor, OpenAI Codex, and OpenCode now integrate LSP diagnostics, test runners, and CI pipelines into unified feedback systems. Meanwhile, research reveals a genuine skill atrophy risk; a +600-participant study found significant negative correlations between frequent AI tool usage and critical thinking abilities. The solution isn’t abandoning AI but rather implementing what philosopher Andy Clark calls “extended cognitive hygiene”; deliberate practices that keep human judgment sharp.

The fundamental agent loop powers all technical feedback

Every AI coding agent operates on the same primitive pattern: gather context → take action → verify work → repeat. What distinguishes sophisticated agentic workflows is how this loop connects to different feedback sources. Anthropic’s documentation describes the ideal as giving agents a “complete autonomous feedback loop”; the ability to “try X” and assess results independently without human intervention.

The critical insight from practitioners is that agents perform best when they have clear targets to iterate against. Peter Steinberger (@steipete), who manages a 300,000-line TypeScript codebase primarily through AI agents, emphasizes that tests, visual mocks, and concrete outputs give agents the grounding they need. Without feedback signals, agents tend to hallucinate solutions or prematurely declare victory.

E2E observational loops validate agent behavior against reality

End-to-end observational feedback connects agents directly to running systems. Claude Code can push to branches, trigger deployments via the gh CLI, and then monitor deployment status before proceeding. The configuration pattern is simple; a CLAUDE.md file might specify “wait for deploy to succeed before proceeding” and the agent comments /deploy staging to kick off GitHub Actions.

The key enabler is observability access. As Anthropic’s documentation notes, “It’s often not enough to know an attempt at a solution didn’t work. You want to know the error code or the stack trace.” Agents integrate with logging systems like Axiom, database clients like psql, and browser automation through Puppeteer MCP servers. Steipete recommends CLI tools over MCP servers because they’re “faster and pollute context less”; a single line in CLAUDE.md pointing to vercel or axiom CLI suffices.

Log analysis happens through bash scripting. Claude reads large log files using grep, tail, and head, often saving command output to files then examining relevant portions. The pattern run command > output.txt && sleep 1 && grep “error” output.txt gives agents the ability to search through verbose output efficiently.

Test-driven development creates the tightest iteration cycles

Test suites provide the most reliable feedback signal for AI agents. Anthropic’s recommended workflow makes TDD explicit: ask Claude to write tests first, confirm they fail, then implement code that passes tests without modifying them. The critical instruction is telling the agent “you’re doing TDD” to prevent it from writing mock implementations that pass trivially.

The red-green-refactor pattern translates directly to agentic workflows. Cursor’s Agent Mode practitioners report that TDD is “the most effective way to leverage Agent Mode”; the failing test creates an unambiguous target. Claude Sonnet 4 will even create temporary .js files to test functions in isolation when tests fail.

Property-based testing adds another dimension. The PBFuzz framework demonstrates agentic directed fuzzing; LLM agents synthesize parameterized input generators that encode vulnerability preconditions as typed parameter spaces. HypoFuzz combines Hypothesis property-based tests with coverage-guided fuzzing, looking for semantic errors rather than just crashes. These approaches let agents explore input spaces that humans would never enumerate manually.

GitHub Copilot’s coding agent spins up ephemeral development environments powered by GitHub Actions where it can execute automated tests and linters. The agent excels at “low-to-medium complexity tasks in well-tested codebases”; the test coverage determines the agent’s effectiveness ceiling.

Self-healing CI/CD loops automate failure recovery

The most sophisticated technical feedback loops close the CI/CD gap entirely. Nx Cloud’s self-healing CI provides a fully integrated solution: the AI agent automatically detects failures, classifies them (as code_change, environment_state, or flaky_task), generates fixes, and re-runs CI. A single line in the workflow; npx nx-cloud fix-ci; enables the entire remediation loop.

Elastic’s production implementation demonstrates continuous agent-driven maintenance. Claude AI agents integrated into CI pipelines handle dependency updates autonomously. The pattern creates a genuine loop: “Commits control the pipeline flow, pipeline build steps control the invocation of the agent, and the agent commits fixes when it can find them.” The team notes that “each added hint and rule [in CLAUDE.md] translates into a saved day of work.”

Dagger’s self-healing pipelines expose a workspace module with tools like ReadFile, WriteFile, ListFiles, RunTests, and RunLint. When CI fails, the agent analyzes the failure output, uses tools to interact with the codebase, iteratively attempts fixes, validates them, and posts solutions as GitHub PR suggestions. The key is that agents can verify their own fixes before proposing them.

Semaphore’s integration with GitHub Copilot follows a staged pattern. The main pipeline runs normally, but on failure, a promotion triggers the “self-heal” pipeline. The AI agent receives test output (JUnit XML), relevant CI context, and job failure information, then diagnoses and applies fixes on a self-heal branch. If the branch passes CI, an automatic PR is created.

Agent self-reflection prevents errors before they propagate

Self-critique mechanisms catch problems before code reaches external systems. The Reflexion pattern from prompt engineering research implements this through three components: an Actor that generates outputs, an Evaluator that scores them, and a Self-Reflection module that generates verbal reinforcement cues stored in long-term memory for future improvement.

Claude Code implements self-reflection through a Plan-then-Build workflow. Research and planning happen first; the system is designed to prevent “jumping straight to coding.” OpenCode makes this explicit with separate Plan and Build agents; the Plan agent is read-only and handles analysis without making changes, while the Build agent executes based on the plan.

Multi-agent review patterns distribute cognitive load across specialized roles. Google’s ADK implements a Generator-Critic pattern where one agent creates content while another validates against specific criteria. Anthropic’s multi-agent research system uses a lead agent to coordinate specialized subagents with separate contexts, enabling parallel execution of tasks like spinning up a backend while building a frontend.

The practical implementation looks straightforward in OpenCode’s YAML configuration:

description: Reviews code for quality mode: subagent model: anthropic/claude-sonnet-4 tools: write: false edit: false

This creates a reviewer that cannot modify code; only critique it. As Anthropic’s documentation puts it: “Have one Claude write code while another reviews or tests it. Similar to working with multiple engineers, sometimes having separate context is beneficial.”

LSP integration provides instant type and lint feedback

Language Server Protocol integration gives agents real-time feedback on code correctness. OpenCode’s architecture sends textDocument/didChange notifications to LSP servers over STDIO after every edit, receives diagnostics (errors, warnings, hints), and feeds them directly into the LLM’s context through an event bus. Built-in LSP servers cover Go (gopls), Python (pyright), Ruby (ruby-lsp), and TypeScript.

The implementation detail matters: after applying changes, OpenCode calls LSP.touchFile(filePath, true) followed by LSP.diagnostics() to retrieve any issues. A 300ms debounce delay prevents excessive notifications during rapid changes while still catching errors quickly.

Cursor’s “Iterate on Lints” feature creates a complete error-correction loop. The linter runs automatically after changes, errors are detected, and the agent loops to fix them until the code is clean. Cursor also uses a separate “apply model” that takes semantic diffs and applies them while fixing syntax issues; a cheaper, faster model handles the mechanical application while the main model handles reasoning.

The key insight from practitioners is that typed languages provide richer feedback. As developer Shrivu Shankar notes, “Compiled and typed languages provide even richer lint-time feedback.” Anthropic explicitly recommends generating TypeScript instead of JavaScript to get multiple feedback layers; the type checker catches errors that linters would miss.

Git and version control enable safe experimentation

Version control loops provide both safety nets and context signals. Claude Code introduced checkpoints that automatically save code state before each change; pressing Esc + Esc or using /rewind restores to any previous state. Combined with subagents, this enables parallel development workflows where multiple agents explore different approaches without risk.

The implementation uses Git’s internals directly: git write-tree captures state as a hash, and git read-tree followed by git checkout-index restores it. Cline and Roo Code use a shadow Git repository separate from main version control, storing checkpoints as Git commits that enable restoration to any point.

Git diff verification lets agents check their own work. Tools like Git AI hook into Claude Code, Cursor, and GitHub Copilot to mark AI-generated code contributions. git-ai blame shows AI authorship per line and even tracks which prompt generated each line of code. This handles history rewrites like rebase and cherry-pick; crucial for maintaining attribution across complex git workflows.

Practitioners have developed sophisticated branching strategies. The standard pattern: never let agents work directly on main, create feature branches for each task, commit frequently, and use PR-based review before merge. Git worktrees enable parallel agent work; multiple branches checked out in separate directories let developers run agents on different features simultaneously. Jujutsu (jj) offers an alternative where every file change is auto-captured without manual commits, enabling jj undo to instantly revert to any state.

The skill atrophy problem is real but nuanced

Research confirms that heavy AI tool usage correlates with reduced critical thinking. The Gerlich 2025 study of 666 participants found a significant negative correlation between frequent AI tool usage and critical thinking abilities, with cognitive offloading identified as the mediating mechanism. Younger participants (ages 17-25) showed higher AI dependence and lower critical thinking scores, while higher educational attainment served as a protective buffer.

Microsoft and Carnegie Mellon research found that workers with AI assistance produced a less diverse set of solutions for the same problem. High confidence in AI’s abilities led people to “take a mental backseat”; researchers called it “letting their hands off the wheel.” The mechanisms include awareness barriers (over-reliance), motivation barriers (time pressure), and ability barriers (difficulty verifying AI responses).

Developer experience reports reveal a pattern of progressive decay. A 12-year developer confessed AI made him “worse at his own craft,” describing a spiral: stopped reading documentation → debugging skills waned → became “a human clipboard” → deep comprehension eroded → entered “cycle of increasing dependency.” Even Lee Robinson from Cursor’s team admitted publicly that “atrophy of skills” is one of his biggest worries about AI coding.

The relationship is non-linear. The Gerlich study found that moderate AI usage had minimal impact, but excessive reliance led to “diminishing cognitive returns.” This suggests a threshold effect; casual AI assistance may be harmless while heavy delegation creates problems.

Why LLMs differ from calculators: offloading synthesis itself

The calculator analogy is tempting but breaks down on examination. Critics argue that calculators perform the same process humans would, just faster; LLMs operate through statistical token prediction, not actual reasoning. More fundamentally, calculators offload arithmetic while LLMs offload the synthesis of thought itself.

Amy J. Ko articulates the distinction: “The loss of manual arithmetic skills seemed relatively innocuous. We still had to do math, we just stopped having to do arithmetic algorithms. LLMs, however, within the context of schools, are supplanting thought. They are short-circuiting students’ opportunities to write, synthesize, reason, and struggle.”

MIT neuroscience research identified measurable “cognitive debt”; reductions in neural activity in areas crucial for attention, working memory, and language processing when using LLMs. Unlike calculators, which “actually allowed more students to engage in mathematical reasoning,” LLMs created reduced brain connectivity.

The framing from Josh Brake captures the deeper issue: “The place where the calculator analogy begins to fray is when you focus too closely on the tool itself instead of seeing the way it shapes the way we think.” LLMs don’t just perform calculations; they shape how we conceptualize problems. Vincent Cheng adds: “Successful cases of offloading occurred because the skills are either easily contained (navigation) or we still know how to perform the tasks manually. The difference this time is that intelligence cannot easily be confined.”

Extended cognition provides the philosophical framework

Philosopher Andy Clark’s May 2025 Nature Communications article “Extending Minds with Generative AI” provides the authoritative framework. Clark’s Extended Mind Thesis (developed with David Chalmers in 1998) argues that the mind extends beyond the biological brain into tools, environment, and technology. We humans are “natural-born cyborgs”; hybrid thinking systems “defined across a rich mosaic of resources only some of which are housed in the biological brain.”

Clark’s concern is whether generative AI will be “mind-replacing technologies” rather than “mind-extending technologies”. Evidence cuts both ways. Human Go players showed increasing novelty in their moves after superhuman AI strategies emerged; “AI-moves helped human players see beyond centuries of received wisdom.” But the opposite can occur: AI might cement certain approaches, creating “agricultural monoculture” that improves efficiency while making the system more vulnerable.

The prescription is “extended cognitive hygiene”; practices that maintain human agency within human-AI cognitive systems. This includes developing a “rich epistemology better suited to the unique sets of opportunities and challenges that confront our bio-technological hybrid minds” and learning to “both trust and question AI suggestions; just as we might trust and question ideas that suddenly bubble up from our own biological unconscious.”

Active observation transforms AI usage into learning

The “French restaurant style” approach means watching agents work rather than just accepting outputs. Steipete’s practice involves running 3-8 Codex instances in a 3x3 terminal grid, actively monitoring their approaches. He uses “blast radius” thinking: “Whenever I work, I think about the ‘blast radius’… If something takes longer than I anticipated, I just hit escape and ask ‘what’s the status’ to get a status update.”

The key is stopping agents mid-work to understand their approach. Steipete notes: “Don’t be afraid of stopping models mid-way, file changes are atomic and they are really good at picking up where they stopped.” This transforms passive consumption into active learning; you see how the agent tackles problems, which patterns it applies, and where it struggles.

Simon Willison has built 80+ vibe-coded experiments specifically to develop intuition about LLM capabilities. “I’ve learned so much from building this collection, and I add to it at a rate of several new prototypes per week.” The experiments are deliberately diverse and sometimes absurd; the goal is accelerating “the rate at which you build intuition for what works and what doesn’t.”

Dax Raad (thdxr) offers a counterpoint on parallel observation: “Opening eight agents and watching them all run at once feels incredible… But when he looks at who’s actually shipping useful stuff, it’s not these people. The productivity feeling is real. The productivity isn’t.” This suggests focused observation of one agent may be more valuable than distributed attention across many.

Adversarial querying extracts deeper understanding

Using multiple models to critique each other prevents tunnel vision. Steipete’s workflow: “If it’s something tricky, I ask it to write everything into a spec, give that to GPT-5-Pro for review (via chatgpt.com) to see if it has better ideas (surprisingly often, this greatly improves my plan!) and then paste back what I think is useful into the main context.”

Specific adversarial prompting techniques include asking for “a few options before making changes” to understand tradeoffs, using separate models for creation versus critique, and prompting with “let’s discuss” or “give me options” before committing to approaches. The goal is treating AI suggestions as proposals to evaluate rather than answers to accept.

Trigger words help on hard problems. Steipete reports: “When things get hard, prompting and adding some trigger words like ‘take your time’ ‘comprehensive’ ‘read all code that could be related’ ‘create possible hypotheses’ makes codex solve even the trickiest problems.” These phrases shift the agent from quick-response mode to deeper analysis.

Code review discipline maintains understanding

Simon Willison articulates the golden rule: “I won’t commit any code to my repository if I couldn’t explain exactly what it does to somebody else. If an LLM wrote the code for you, and you then reviewed it, tested it thoroughly and made sure you could explain how it works to someone else; that’s not vibe coding, it’s software development.”

This reframes AI-generated code as proposals requiring human sign-off. The review process forces engagement: understanding what the code does, why it’s structured that way, and what edge cases might exist. Steipete extends this: “Ask the model to preserve your intent and ‘add code comments on tricky parts’ helps both you and future model runs.”

Test-driven development serves double duty; it provides agent feedback AND forces human understanding. Anthropic’s TDD workflow has developers review how agents solved problems after tests pass. The test specification itself requires understanding the problem deeply enough to define expected behavior.

Practical routines balance productivity with skill maintenance

Steipete allocates 20% of his time to refactoring, describing these as “great when I need less focus or I’m tired, since I can make great progress without the need of too much focus or clear thinking.” Refactoring activities that build understanding include running code duplication analysis (jscpd), dead code detection (knip), linting with modern patterns, breaking apart overgrown files, and adding tests for tricky code.

The question of when to intentionally avoid AI requires judgment. Karpathy invented “vibe coding” for “throwaway weekend projects” but hand-coded his Nanochat project “from scratch.” Willison’s safety criteria: use AI freely for low-stakes projects, prototypes, and personal tools, but require deep understanding when security matters, when data privacy is involved, when money is at stake, or when others will use the code.

Context management prevents cognitive drift. Anthropic recommends using /clear frequently to maintain focus, and breaking complex tasks into small steps rather than attempting large changes at once. Steipete notes that GPT-5’s improved context handling reduces the need for religious fresh-context practices, but the principle of manageable scope remains.

The meta-skill is learning how AI approaches problems

Understanding model differences lets developers choose appropriate tools. Steipete observes: “What benchmarks miss is the strategy that the model+harness pursue when they get a prompt. Codex is far FAR more careful and reads much more files in your repo before deciding what to do.” Claude is “more eager and just tries something” while GPT-5 “pushes back harder when you make a silly request.”

Using AI to understand codebases accelerates onboarding. Steipete: “Whenever I want to understand a new codebase, the absolute best way I found is using agents… I paste in a GitHub repository URL. It gives you the full tree of the project.” The agent becomes a guide to unfamiliar territory; but the developer must engage with the territory, not just accept the tour.

Documentation of patterns in AGENTS.md or CLAUDE.md files creates institutional memory. Each added hint encodes team knowledge in a form both humans and agents can use. This documentation practice forces explicit articulation of conventions and preferences; exactly the kind of synthesis that builds understanding.

Implementing the complete feedback architecture

The practical checklist for developers integrating both loop types:

For technical loops, configure LSP servers for all project languages, implement automatic checkpoints before changes, use test-driven development with agents, enable CI self-healing for common failure patterns, and deploy multi-agent review for complex changes. The goal is giving agents rich feedback signals while maintaining human oversight.

For human learning loops, establish a personal “golden rule” for when code understanding is required before committing. Allocate regular time (steipete suggests 20%) for refactoring and skill-building. Build small experimental projects to develop AI intuition; Simon Willison’s 80+ experiments demonstrate the approach. Use adversarial review with separate models critiquing plans. Maintain coding skills with periodic no-AI sessions for core competencies.

The two loop types reinforce each other. Strong technical feedback loops surface agent errors quickly, creating opportunities for human learning about failure modes. Strong human learning loops improve the quality of human oversight, catching problems that technical loops miss. The architecture is not AI versus human capability but AI capability verified and extended by human judgment.

Steipete summarizes the orientation: “Writing good software is still hard. Just because I don’t write the code anymore doesn’t mean I don’t think hard about architecture, system design, dependencies, features.” The feedback loops; technical and human; ensure that thinking remains central even as typing becomes optional.