{"id":61518,"date":"2026-06-04T01:43:22","date_gmt":"2026-06-04T01:43:22","guid":{"rendered":"https:\/\/www.europesays.com\/ai\/61518\/"},"modified":"2026-06-04T01:43:22","modified_gmt":"2026-06-04T01:43:22","slug":"what-ai-agents-should-never-do-on-their-own","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/ai\/61518\/","title":{"rendered":"What AI Agents Should Never Do on Their Own"},"content":{"rendered":"<p class=\"wp-block-paragraph\"> focuses on what they can do.<\/p>\n<p class=\"wp-block-paragraph\">Autonomy gets framed as the goal: give them tools, give them access, let them run. <\/p>\n<p class=\"wp-block-paragraph\">The more freedom, the better the output.<\/p>\n<p class=\"wp-block-paragraph\">That framing is mostly accurate. I use agents daily. They\u2019ve genuinely increased my output. I\u2019m a believer!<\/p>\n<p class=\"wp-block-paragraph\">And I\u2019ve also lost two hours of work through an agent that was doing exactly what I asked.<\/p>\n<p class=\"wp-block-paragraph\">I was working on a feature branch cleanup.<\/p>\n<p class=\"wp-block-paragraph\">The task description said \u201cremove unused files and clean up the repo.\u201d The agent interpreted \u201cunused\u201d broadly, deleted a config directory I hadn\u2019t touched in months but still referenced from the deploy script, and kept going. <\/p>\n<p class=\"wp-block-paragraph\">I caught it during the diff review. The config wasn\u2019t in version control. Two hours reconstructing it from memory and git history.<\/p>\n<p class=\"wp-block-paragraph\">The task was clear and the agent followed instructions, the only problem was that nothing told it where to stop.<\/p>\n<p class=\"wp-block-paragraph\">Knowing which tasks to gate is part of running agents well. Give them full freedom on the wrong category and you\u2019ll spend the afternoon undoing what took them thirty seconds.<\/p>\n<p class=\"wp-block-paragraph\">Hey there! My name is <a href=\"https:\/\/linktr.ee\/saranobrega\" rel=\"nofollow noopener\" target=\"_blank\">Sara N\u00f3brega<\/a> and I teach you how to become an AI power user on\u00a0<a href=\"https:\/\/saranfn.substack.com\/\" rel=\"nofollow noopener\" target=\"_blank\">Learn AI<\/a>. Free to subscribe!<\/p>\n<p>What the agent should never touch alone<\/p>\n<p class=\"wp-block-paragraph\">Some tasks are reversible. For example, a refactored function can be reverted or a new unit test can be removed. The cost of a mistake is low.<\/p>\n<p class=\"wp-block-paragraph\">Recovery cost varies by task. A refactored function takes seconds to revert; you just revert the commit, but a dropped production table might take your entire week, if recovery is even possible. <\/p>\n<p class=\"wp-block-paragraph\">The question before you run a task: can this be undone?<\/p>\n<p class=\"wp-block-paragraph\">If yes, let the agent move. If no, add a checkpoint before it runs.<\/p>\n<p class=\"wp-block-paragraph\">Here\u2019s the permission matrix I work from:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.europesays.com\/ai\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-May-26-2026-05_28_33-PM-1-1024x768.png\" alt=\"Table showing recommended agent autonomy levels and human review requirements by task type. Small refactors and unit tests can have high agent autonomy, while API changes, dependencies, migrations, security, infrastructure, and production deployment require increasing levels of human review. Image by ChatGPT.\" class=\"wp-image-663198\"\/>Table showing recommended agent autonomy levels and human review requirements by task type. Small refactors and unit tests can have high agent autonomy, while API changes, dependencies, migrations, security, infrastructure, and production deployment require increasing levels of human review. Image by Author and ChatGPT.<\/p>\n<p>The categories that should always require a human<\/p>\n<p class=\"wp-block-paragraph\">Some categories require a human checkpoint regardless of how well-specified the task is. <\/p>\n<p class=\"wp-block-paragraph\">The risk of a mistake is too high, and the recovery cost too steep, to let an agent decide on its own.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.europesays.com\/ai\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-May-27-2026-03_20_21-PM-2-1024x768.png\" alt=\"What AI Agents should not tackle alone, part 1. Image generated with DALL-E.\" class=\"wp-image-663410\"\/>Image by Author and ChatGPT.<\/p>\n<p>Destructive file operations<\/p>\n<p class=\"wp-block-paragraph\">`rm -rf`, `git clean -fd`, `git reset &#8211;hard`.<\/p>\n<p class=\"wp-block-paragraph\">These delete or discard work that may not be recoverable. <\/p>\n<p class=\"wp-block-paragraph\">An agent will run them if the task description implies cleanup. <\/p>\n<p class=\"wp-block-paragraph\">I\u2019ve had one run `git clean -fd` in the middle of a refactor because the task said \u201cclean up temporary files.\u201d <\/p>\n<p class=\"wp-block-paragraph\">My uncommitted work was gone. There was no malfunction, as the agent did exactly what the words said. The safeguard is an explicit block list with a confirmation step, not trusting the agent to infer where \u201cclean up\u201d ends.<\/p>\n<p class=\"wp-block-paragraph\">2. Database writes and migrations<\/p>\n<p class=\"wp-block-paragraph\">Any DELETE without a WHERE clause, any DROP or TRUNCATE, any schema migration touching production data.<\/p>\n<p class=\"wp-block-paragraph\">A typo in a WHERE clause can wipe a table. A migration that runs out of order can corrupt data that\u2019s impossible to reconstruct. Always review before running.<\/p>\n<p class=\"wp-block-paragraph\">3. Cloud infrastructure<\/p>\n<p class=\"wp-block-paragraph\">`terraform apply`, `kubectl delete`, `aws iam *`, `gcloud iam *`.<\/p>\n<p class=\"wp-block-paragraph\">Infrastructure changes affect live systems and often other teams. Permissions changes are especially dangerous because the damage can be invisible until something fails.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.europesays.com\/ai\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-May-27-2026-03_20_21-PM-3-1024x768.png\" alt=\"What AI Agents should not tackle alone, part 2. Image generated with DALL-E.\" class=\"wp-image-663411\"\/>Image by Author and ChatGPT.<\/p>\n<p class=\"wp-block-paragraph\">4. Production deployments<\/p>\n<p class=\"wp-block-paragraph\">Any deployment to a production environment should go through a human review step, even if the code was agent-generated. <\/p>\n<p class=\"wp-block-paragraph\">CI\/CD pipelines can run agent output automatically, and that\u2019s fine. The decision to deploy to production is yours. <\/p>\n<p class=\"wp-block-paragraph\">You know what\u2019s in flight, what incidents are open, what maintenance is scheduled. The agent doesn\u2019t have any of that context, and it can\u2019t ask for it mid-pipeline.<\/p>\n<p class=\"wp-block-paragraph\">5. Auth and security logic<\/p>\n<p class=\"wp-block-paragraph\">Authentication flows, authorization rules, token handling, session management.<\/p>\n<p class=\"wp-block-paragraph\">Bugs here don\u2019t show up in unit tests, they show up in incident reports, sometimes months later. <\/p>\n<p class=\"wp-block-paragraph\">An agent writing auth logic will produce something that looks correct and passes the happy path. <\/p>\n<p class=\"wp-block-paragraph\">The dangerous cases are the edge conditions: a token that doesn\u2019t expire under a specific sequence of API calls, a route that bypasses middleware when a parameter is missing. <\/p>\n<p class=\"wp-block-paragraph\">Those are exactly what unit tests miss and what security review catches. Every auth change needs a human who\u2019s specifically looking for those gaps, not one who\u2019s satisfied the happy path is covered.<\/p>\n<p class=\"wp-block-paragraph\">6. Secrets, `.env`files, API keys<\/p>\n<p class=\"wp-block-paragraph\">An agent reading or writing credentials creates exposure risk. Keep this category off-limits by default and handle it manually.<\/p>\n<p class=\"wp-block-paragraph\">git push &#8211;force sits in its own category because it rewrites history on the remote. Once pushed, other contributors\u2019 local branches diverge. Recovery is painful and sometimes impossible.<\/p>\n<p class=\"wp-block-paragraph\">Humans should be careful with all of these commands too. Agents just make them easier to trigger by accident, buried inside a longer sequence of otherwise safe steps.<\/p>\n<p>AGENTS.md: write the contract<\/p>\n<p class=\"wp-block-paragraph\">Give agents specific structure from the start. An AGENTS.md file at the root of your repo tells the agent what the project is, how to run it, and what it\u2019s not allowed to touch without asking.<\/p>\n<p class=\"wp-block-paragraph\">A vague AGENTS.md gets you an agent filling gaps with guesses. I learned this on a codebase that had no AGENTS.md at all. <\/p>\n<p class=\"wp-block-paragraph\">The task was \u201corganize the project structure.\u201d The agent moved files across directories based on naming conventions that made sense to it. Everything that referenced those paths broke. <\/p>\n<p class=\"wp-block-paragraph\">The task took the agent twenty minutes; the cleanup took me two hours. Three lines of scope constraints would have prevented it entirely.<\/p>\n<p class=\"wp-block-paragraph\">Here\u2019s the template I use:<\/p>\n<p># AGENTS.md<\/p>\n<p>## Project<\/p>\n<p>[Brief description of the project and tech stack]<\/p>\n<p>## Setup<\/p>\n<p>\\`\\`\\`bash<\/p>\n<p># Install<\/p>\n<p>npm install \u00a0# or pip install -r requirements.txt<\/p>\n<p># Run<\/p>\n<p>npm run dev<\/p>\n<p># Test<\/p>\n<p>npm test<\/p>\n<p># Lint<\/p>\n<p>npm run lint<\/p>\n<p>\\`\\`\\`<\/p>\n<p>## Coding rules<\/p>\n<p>&#8211; Make minimal changes. Don&#8217;t refactor unrelated code.<\/p>\n<p>&#8211; If behavior changes, add or update tests.<\/p>\n<p>&#8211; Don&#8217;t touch files outside the scope of the task.<\/p>\n<p>&#8211; Keep diffs readable. One concern per commit.<\/p>\n<p>## Safety rules<\/p>\n<p>Ask before running any command in blocked_commands.md.<\/p>\n<p>If you&#8217;re unsure whether a command is safe, stop and ask.<\/p>\n<p>## Definition of done<\/p>\n<p>&#8211; Tests pass<\/p>\n<p>&#8211; Diff is explainable in one sentence<\/p>\n<p>&#8211; Final report provided (see below)<\/p>\n<p>## Final report format<\/p>\n<p>After every task, provide:<\/p>\n<p>1. Summary of changes<\/p>\n<p>2. Files changed<\/p>\n<p>3. Tests run and result<\/p>\n<p>4. Risks or assumptions<\/p>\n<p>5. Anything not completed<\/p>\n<p>&#8220;`<\/p>\n<p class=\"wp-block-paragraph\">The companion file, blocked_commands.md, lists exactly what needs human approval before running:<\/p>\n<p># blocked_commands.md<\/p>\n<p>## Destructive file operations<\/p>\n<p>&#8211; rm -rf<\/p>\n<p>&#8211; git clean -fd<\/p>\n<p>&#8211; git reset &#8211;hard<\/p>\n<p>## Git operations<\/p>\n<p>&#8211; git push &#8211;force<\/p>\n<p>&#8211; git push &#8211;force-with-lease<\/p>\n<p>## Database operations<\/p>\n<p>&#8211; DROP TABLE<\/p>\n<p>&#8211; TRUNCATE TABLE<\/p>\n<p>&#8211; DELETE without WHERE clause<\/p>\n<p>&#8211; Any migration that alters a production schema<\/p>\n<p>## Cloud \/ infrastructure<\/p>\n<p>&#8211; terraform apply<\/p>\n<p>&#8211; kubectl delete<\/p>\n<p>&#8211; aws iam *<\/p>\n<p>&#8211; gcloud iam *<\/p>\n<p>## Secrets<\/p>\n<p>&#8211; Any command reading or writing .env files<\/p>\n<p>&#8211; Any command touching API keys or credentials<\/p>\n<p class=\"wp-block-paragraph\">When the AGENTS.md is vague, the agent guesses. When it\u2019s specific, the agent executes, and so the file is your contract. Write it before you start the task, not after something breaks.<\/p>\n<p class=\"wp-block-paragraph\">Check my two latest articles where you can learn <a href=\"https:\/\/contributor.insightmediagroup.io\/give-your-ai-unlimited-updated-context\/\" rel=\"nofollow noopener\" target=\"_blank\">how to give your AI unlimited <\/a><a href=\"https:\/\/contributor.insightmediagroup.io\/give-your-ai-unlimited-updated-context\/\" rel=\"nofollow noopener\" target=\"_blank\">context<\/a> and explore six common <a href=\"https:\/\/contributor.insightmediagroup.io\/six-choices-every-ai-engineer-has-to-make-and-nobody-teaches\/\" rel=\"nofollow noopener\" target=\"_blank\">hard decisions<\/a> AI Engineers need to make in production. <\/p>\n<p>The two-agent loop<\/p>\n<p class=\"wp-block-paragraph\">For anything medium-complexity or above, don\u2019t use one agent, use two.<\/p>\n<p class=\"wp-block-paragraph\">Agent 1 implements. Agent 2 reviews. Then Agent 1 applies only the critical feedback.<\/p>\n<p class=\"wp-block-paragraph\">Implementer prompt:<\/p>\n<p>You are a senior software engineer implementing a specific task.<\/p>\n<p>Task: [describe the task]<\/p>\n<p>Context: [link to AGENTS.md or paste relevant sections]<\/p>\n<p>Rules:<\/p>\n<p>&#8211; Make minimal changes.<\/p>\n<p>&#8211; Stay in scope.<\/p>\n<p>&#8211; Don&#8217;t refactor unrelated code.<\/p>\n<p>&#8211; Add tests if behavior changes.<\/p>\n<p>&#8211; When done, provide a final report: summary, files changed,<\/p>\n<p>\u00a0 tests run, risks, anything incomplete.<\/p>\n<p class=\"wp-block-paragraph\">Reviewer prompt:<\/p>\n<p>You are a code reviewer with no attachment to the implementation.<\/p>\n<p>Review this diff: [paste diff]<\/p>\n<p>Check for:<\/p>\n<p>&#8211; Bugs and edge cases<\/p>\n<p>&#8211; Missing tests<\/p>\n<p>&#8211; Security issues<\/p>\n<p>&#8211; Unintended behavior changes<\/p>\n<p>&#8211; Anything outside the stated scope<\/p>\n<p>Output:<\/p>\n<p>&#8211; Critical issues (must fix)<\/p>\n<p>&#8211; Minor issues (optional)<\/p>\n<p>&#8211; Anything you&#8217;d flag for a human<\/p>\n<p>Do not rewrite the code. Flag, don&#8217;t fix.<\/p>\n<p class=\"wp-block-paragraph\">The reviewer agent has no ego investment in the code. It looks for bugs, edge cases, test coverage, and security issues without trying to redo the work.<\/p>\n<p class=\"wp-block-paragraph\">Code review is how you catch what you missed. The two-agent loop is the same process, automated.<\/p>\n<p>The final report<\/p>\n<p class=\"wp-block-paragraph\">Require a final report for every agent task:<\/p>\n<p class=\"wp-block-paragraph\">1. Summary of changes<\/p>\n<p class=\"wp-block-paragraph\">2. Files changed<\/p>\n<p class=\"wp-block-paragraph\">3. Tests run and result<\/p>\n<p class=\"wp-block-paragraph\">4. Risks or assumptions<\/p>\n<p class=\"wp-block-paragraph\">5. Anything not completed<\/p>\n<p class=\"wp-block-paragraph\">This makes the agent accountable. If it can\u2019t summarize what it did in clear terms, that\u2019s a signal the task wasn\u2019t clean.<\/p>\n<p class=\"wp-block-paragraph\">It also builds up documentation without you writing it manually. The reports stack. When something breaks a week later, you can trace back exactly what changed and why.<\/p>\n<p>The unglamorous work<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.europesays.com\/ai\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-May-27-2026-03_20_25-PM-8-1024x768.png\" alt=\"The unglamorous work behind agentic AI. Image generated with DALL-E.\" class=\"wp-image-663413\"\/>Image by Author and ChatGPT.<\/p>\n<p class=\"wp-block-paragraph\">The hype around AI agents is here to stay, and mostly earned. They do increase your output.<\/p>\n<p class=\"wp-block-paragraph\">The practitioners getting the most from them are the ones who did the setup work: wrote the AGENTS.md, thought through the permission levels, built the blocked commands list, set up the two-agent loop.<\/p>\n<p class=\"wp-block-paragraph\">Agents work well when they have clear instructions. That part is on you.<\/p>\n<p class=\"wp-block-paragraph\">Thanks for reading!<\/p>\n<p class=\"wp-block-paragraph\">You can find me on <a href=\"https:\/\/www.linkedin.com\/in\/saranfn\" rel=\"nofollow noopener\" target=\"_blank\">LinkedIn<\/a> and <a href=\"https:\/\/saranfn.substack.com\/\" rel=\"nofollow noopener\" target=\"_blank\">Substack<\/a>, where I share more details regarding AI and LLM.<\/p>\n","protected":false},"excerpt":{"rendered":"focuses on what they can do. Autonomy gets framed as the goal: give them tools, give them access,&hellip;\n","protected":false},"author":2,"featured_media":61519,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[511,405,25,7537,6590,415,9007],"class_list":["post-61518","post","type-post","status-publish","format-standard","has-post-thumbnail","category-agentic-ai","tag-ai-agent","tag-ai-agents","tag-artificial-intelligence","tag-artificial-intelligence-agents","tag-editors-pick","tag-llm","tag-llm-applications"],"_links":{"self":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts\/61518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/comments?post=61518"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts\/61518\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/media\/61519"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/media?parent=61518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/categories?post=61518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/tags?post=61518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}