<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Best-Practices | The .NET Blog</title><link>https://thedotnetblog.com/tags/best-practices/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>en</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 25 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/tags/best-practices/index.xml" rel="self" type="application/rss+xml"/><item><title>Making Agents Practical for Real-World Development</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-making-agents-practical/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-making-agents-practical/</guid><description>VS Code's agent improvements address scale, memory, steering, hooks, browser verification, and reusable skills for multi-turn development work.</description><content:encoded>&lt;h1 id="making-agents-practical-for-real-world-development"&gt;Making Agents Practical for Real-World Development&lt;/h1&gt;
&lt;p&gt;Original source: &lt;a href="https://code.visualstudio.com/blogs/2026/03/05/making-agents-practical-for-real-world-development"&gt;Making agents practical for real-world development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The gap between an impressive agent demo and a useful Thursday afternoon is mostly operational. Real repositories have large outputs, accumulated conventions, interruptions, failed commands, and decisions that need to survive more than one chat turn.&lt;/p&gt;
&lt;p&gt;VS Code&amp;rsquo;s recent agent work is aimed at that gap. The useful story is not one spectacular capability. It is the collection of small controls that make an agent easier to supervise across a real development loop.&lt;/p&gt;
&lt;h2 id="scale-the-output-without-flooding-the-session"&gt;Scale the Output Without Flooding the Session&lt;/h2&gt;
&lt;p&gt;Large terminal output and generated files can overwhelm a context window. VS Code now streams large outputs to temporary files and makes terminal output collapsible, so the conversation can remain focused on the decision rather than displaying every line.&lt;/p&gt;
&lt;p&gt;That is relevant to .NET projects with verbose restores, test runs, generated migrations, and build logs. The agent can work with the result without turning the conversation into a wall of output.&lt;/p&gt;
&lt;p&gt;Streaming does not solve architectural discovery. An agent still needs the relevant project structure, domain rules, and design constraints. If a migration touches a large model, point the agent to the schema and tests that define the intended behavior. Output management helps the context window; it does not create missing context.&lt;/p&gt;
&lt;p&gt;A good practice is to keep large artifacts inspectable and named. Ask the agent to summarize the result, identify the file containing the full output, and state which lines or failures drove its next action.&lt;/p&gt;
&lt;h2 id="memory-needs-human-direction"&gt;Memory Needs Human Direction&lt;/h2&gt;
&lt;p&gt;Agent memory can carry useful lessons across sessions, but the developer still needs to decide what matters. Manual context compaction lets you preserve specific decisions instead of trusting an automatic summary to retain every important detail.&lt;/p&gt;
&lt;p&gt;For a long-running .NET feature, write instructions such as preserving the authentication flow decision or the database transaction boundary when compacting. Then verify the next response against the actual code. Memory should reduce repetition, not become an invisible source of truth.&lt;/p&gt;
&lt;p&gt;The same principle applies to the repository. If a convention is important, encode it in tests, documentation, or project instructions. A chat memory can help today; source control is what the whole team can inspect tomorrow.&lt;/p&gt;
&lt;h2 id="redirect-without-throwing-away-the-work"&gt;Redirect Without Throwing Away the Work&lt;/h2&gt;
&lt;p&gt;An agent that takes the wrong direction creates an awkward choice: wait for it to finish, cancel it, or start over. Steering and message queueing make that choice less costly. You can redirect the next step while allowing the current operation to finish when it is safe, or queue a follow-up when the plan is still sound.&lt;/p&gt;
&lt;p&gt;Forking a chat session is useful when an architectural question has multiple plausible answers. Explore one dependency injection or data-access approach in a fork, keep the original available, and compare the resulting plans before changing the repository.&lt;/p&gt;
&lt;p&gt;These controls do not make generated decisions correct. They make supervision cheaper, which is a more durable improvement.&lt;/p&gt;
&lt;h2 id="hooks-encode-team-standards"&gt;Hooks Encode Team Standards&lt;/h2&gt;
&lt;p&gt;Hooks run at lifecycle points such as session start, before edits, or after tool calls. They turn a repeated reminder into a repository-level guardrail. A hook can request formatting, block a sensitive file change, or trigger a validation action.&lt;/p&gt;
&lt;p&gt;For a .NET team, use hooks carefully. A formatting check may be a good default. Blocking edits to a deployment file may also be sensible. A hook that runs a long integration suite before every small edit will frustrate developers and encourage them to disable the whole system.&lt;/p&gt;
&lt;p&gt;Keep the policy close to the risk. Make the hook&amp;rsquo;s failure message actionable, and ensure the command works in the same environment as the agent. Hooks are automation, so they deserve the same review as build scripts.&lt;/p&gt;
&lt;h2 id="browser-tools-verify-the-running-result"&gt;Browser Tools Verify the Running Result&lt;/h2&gt;
&lt;p&gt;Browser agent tools can navigate, interact with, and capture screenshots of a running web application. For ASP.NET Core and Blazor developers, that provides a path from generated UI code to an observable result inside the editor.&lt;/p&gt;
&lt;p&gt;Use it for bounded checks: does the route load, does the component display the expected test data, does a form show the validation state? Keep authentication, real customer data, and destructive actions outside the experiment. A browser screenshot is evidence of one state, not a replacement for automated tests or accessibility review.&lt;/p&gt;
&lt;h2 id="skills-make-good-workflows-repeatable"&gt;Skills Make Good Workflows Repeatable&lt;/h2&gt;
&lt;p&gt;Reusable skills package procedures that teams otherwise restate in every session. A .NET team might define one for preparing an Entity Framework migration, another for adding OpenAPI documentation, and another for reviewing asynchronous code.&lt;/p&gt;
&lt;p&gt;The best skill has a narrow trigger, known inputs, and a validation command. Start with a procedure that is repetitive but not ambiguous. A skill should make team knowledge easier to apply, not hide a complicated decision behind a slash command.&lt;/p&gt;
&lt;h2 id="the-practical-recommendation"&gt;The Practical Recommendation&lt;/h2&gt;
&lt;p&gt;Adopt these capabilities in layers. First make large outputs and session steering comfortable. Then add one hook and one project-specific skill. Finally, try browser verification for a local web workflow.&lt;/p&gt;
&lt;p&gt;Measure the result by review effort and recovery time, not by how autonomous the agent appears. Practical agents are the ones a team can understand, redirect, and validate when the happy path ends.&lt;/p&gt;</content:encoded></item></channel></rss>