{"id":34251,"date":"2026-06-25T17:39:58","date_gmt":"2026-06-25T15:39:58","guid":{"rendered":"https:\/\/www.angulararchitects.io\/blog\/ae-harness-setup-for-angular\/"},"modified":"2026-06-25T18:11:31","modified_gmt":"2026-06-25T16:11:31","slug":"ae-harness-setup-for-angular","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/","title":{"rendered":"Agentic Engineering: How to Set Up Your Harness for Angular Development"},"content":{"rendered":"<div class=\"wp-post-series-box series-agentic-engineering wp-post-series-box--expandable\">\n\t\t\t<input id=\"collapsible-series-agentic-engineering6a3dd7fe6afb1\" class=\"wp-post-series-box__toggle_checkbox\" type=\"checkbox\">\n\t\n\t<label\n\t\tclass=\"wp-post-series-box__label\"\n\t\t\t\t\tfor=\"collapsible-series-agentic-engineering6a3dd7fe6afb1\"\n\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\t\t<p class=\"wp-post-series-box__name wp-post-series-name\">\n\t\t\tThis is post 7 of 7 in the series <em>&ldquo;Agentic Engineering&rdquo;<\/em>\t\t<\/p>\n\t\t\t<\/label>\n\n\t\t\t<div class=\"wp-post-series-box__posts\">\n\t\t\t<ol>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/best-llms-for-angular\/\">Agentic Engineering: Which LLM Is Best for Angular Development?<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-apps-harnesses-for-angular\/\">Agentic: Which App\/Harness Is Best for Angular Development?<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-costs-for-angular\/\">Agentic Engineering: What Does AI Coding Really Cost?<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-data-privacy-for-angular\/\">Agentic Engineering: What Do AI Coding Tools Do With Your Code?<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-personal-verdict\/\">Agentic Verdict: What&#8217;s the Best Solution for You?<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-next-gen-model\/\">Anthropic Just Released the First Next-Gen Model to the Public<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><span class=\"wp-post-series-box__current\">Agentic Engineering: How to Set Up Your Harness for Angular Development<\/span><\/li>\n\t\t\t\t\t\t\t<\/ol>\n\t\t<\/div>\n\t<\/div>\n<p>Over the last few weeks I've written about which <a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/best-llms-for-angular\/\">LLM is best for <em>Angular<\/em> development<\/a> and, right after, about which <a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-apps-harnesses-for-angular\/\">app or harness<\/a> to use around it. In that second post I treated the words <em>app<\/em> and <em>harness<\/em> as more or less the same thing and never really drew a line between them. This post is the follow-up that does exactly that.<\/p>\n<p>It zooms in on the <strong>harness<\/strong>: what it actually is, and how to set one up for your <em>Angular<\/em> projects so the agent not only runs smoothly, but produces generated and refactored code that I would actually accept in long-lived, continuously evolving <em>Angular<\/em> codebases.<\/p>\n<h2>So What Is the Harness?<\/h2>\n<p>Small naming note for <em>Angular<\/em> readers: I do <strong>not<\/strong> mean the <a href=\"https:\/\/angular.dev\/guide\/testing\/using-component-harnesses\">Angular CDK <code>ComponentHarness<\/code><\/a> for testing components. In this post, a harness is the software around the model.<\/p>\n<p>The harness is the thing that contains the model. And here's what a lot of people miss: on its own, even a strong LLM is basically just fancy autocomplete, like the one we've been using for years from GitHub Copilot. The only thing it can really do is respond to our messages by writing text. So how is it possible that it can edit our code at all?<\/p>\n<p>This is where the harness comes in. It gives the model the power of <strong>tool calling<\/strong>, and suddenly that autocomplete can do real work: list the current directory, search the whole project for <code>inject(<\/code>, open a file, apply an edit, run <code>ng build<\/code>. Instead of only writing text back to us, the model emits a structured tool call, the harness actually runs it, and then feeds the result back into the conversation. (Simon Willison has a really nice, no-nonsense walk-through of <a href=\"https:\/\/simonwillison.net\/guides\/agentic-engineering-patterns\/how-coding-agents-work\/\">how coding agents work<\/a> if you want to go one level deeper.) So in short: the harness is the wrapper around the model that lets it read our projects and then actually change them.<\/p>\n<p>And that feedback loop is the whole trick. A coding agent is really just our LLM running in a <strong>loop<\/strong>: it proposes an action, the harness runs the tool and hands the output back, the model reads that output and decides what to do next \u2013 open another file, fix the error it just caused, run the tests again. This loop is what most people mean today when they talk about <a href=\"https:\/\/en.wikipedia.org\/wiki\/AI_agent\">AI agents<\/a>: the harness manages the context, the tools, the prompts, and the control flow, while the model does the actual reasoning.<\/p>\n<p>My personal take? The harness, not the model, is where most of the day-to-day quality comes from. Two developers can run the exact same Opus or GPT model and still get wildly different results, simply because one harness has the right tools, the right project context, and sensible guardrails \u2013 and the other doesn't. And that's exactly why this post exists: the harness is the part <em>you<\/em> control, so setting it up properly for <em>Angular<\/em> is not some nice-to-have. In my opinion, it's the highest-leverage thing you can do.<\/p>\n<h2>Model, Harness, App \u2013 What's the Difference?<\/h2>\n<p>We now know what a harness does \u2013 but it's easy to confuse it with the model underneath it and the app around it. So let me make that concrete with the exact setup I've been using for <em>Angular<\/em> development today:<\/p>\n<ul>\n<li><strong>The model (our LLM):<\/strong> <a href=\"https:\/\/www.anthropic.com\/news\/claude-opus-4-8\">Opus<\/a> \u2013 the brain (BTW, I hope we get <a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-next-gen-model\/\">Fable 5<\/a> back soon \ud83d\ude0f).<\/li>\n<li><strong>The harness:<\/strong> <a href=\"https:\/\/www.anthropic.com\/product\/claude-code\">Claude Code<\/a> \u2013 gives Opus its tools and runs the loop we just talked about.<\/li>\n<li><strong>The app:<\/strong> the <strong><a href=\"https:\/\/claude.ai\/download\">Claude Desktop<\/a><\/strong> app \u2013 the window I happen to be looking at all of this through.<\/li>\n<\/ul>\n<p>Here's the part that trips a lot of people up: we can swap the <strong>app<\/strong> without touching the harness or the model at all. The exact same Claude Code + Opus combination can live in a bunch of different places:<\/p>\n<ul>\n<li>in the <strong><a href=\"https:\/\/claude.ai\/download\">Claude Desktop<\/a><\/strong> app,<\/li>\n<li>in the <strong><a href=\"https:\/\/www.anthropic.com\/product\/claude-code\">Claude Code CLI<\/a><\/strong>, right in our terminal \u2013 that's really its native home,<\/li>\n<li>as the official <strong><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=Anthropic.claude-code\">Claude extension in VS Code<\/a><\/strong>,<\/li>\n<li>as the official <strong>Claude plugin in <a href=\"https:\/\/www.jetbrains.com\/webstorm\/\">WebStorm<\/a><\/strong> (and the other JetBrains IDEs),<\/li>\n<li>and even inside <strong><a href=\"https:\/\/cursor.com\/\">Cursor<\/a><\/strong> \u2013 whose extension is basically the same one we use in VS Code, since Cursor is a VS Code fork.<\/li>\n<\/ul>\n<p>Same brain, same harness, five different windows. The app is mostly just the UI we sit in front of.<\/p>\n<p>Now it gets interesting. Inside <strong>Cursor<\/strong>, we don't have to use the Claude extension at all \u2013 we can switch to <strong>Cursor's own harness<\/strong> instead, still running Opus underneath. So suddenly we have one app and one model, but <strong>two different harnesses<\/strong> to choose from. That's the cleanest way I know to actually <em>feel<\/em> the difference: nothing changed except the harness.<\/p>\n<p>And harnesses are not created equal. In my experience \u2013 and in some benchmark results \u2013 Cursor's own harness can squeeze noticeably more out of the same Opus model than the Claude extension does: better scores, smoother experience. The gap can be surprisingly large: in an independent benchmark cited in <a href=\"https:\/\/thoughts.jock.pl\/p\/ai-coding-harness-agents-2026\">Pawe\u0142 J\u00f3zefiak's harness comparison<\/a>, the same planning task with the same model went from <strong>77%<\/strong> running in Claude Code to <strong>93%<\/strong> in Cursor \u2013 nothing changed but the harness. That does not mean Cursor wins every harness benchmark; the Artificial Analysis chart below shows a different picture for a different Opus comparison. The point is narrower and more important: the wrapper changes the result.<\/p>\n<p>And the reason isn't magic, it's tuning: a team like Cursor's pours real effort into shaping its tools, system prompt, and tool descriptions for each new model, and that hand-tuning is what wrings the extra points out. So why would anyone still pick the Claude extension inside Cursor? One big reason: <strong>cost<\/strong>. With the Claude extension you can run Opus on your existing Claude subscription, while Cursor's harness bills you per API token. For heavy daily <em>Angular<\/em> work, that's the difference between a flat monthly fee and a frankly scary API bill.<\/p>\n<p>So that's the whole picture: the <strong>model<\/strong> is the brain, the <strong>harness<\/strong> is what gives it hands and runs the loop, and the <strong>app<\/strong> is just the window we watch it through. We can mix and match them surprisingly freely \u2013 and as the rest of this post will show, the harness is the layer that's really worth getting right.<\/p>\n<h3>When the Claude Code Harness Leaked<\/h3>\n<p>If you ever doubted that the harness is its own engineering layer, March 2026 gave us an accidental case study. A Claude Code npm package <a href=\"https:\/\/venturebeat.com\/technology\/claude-codes-source-code-appears-to-have-leaked-heres-what-we-know\">included source maps that exposed a large part of the TypeScript source<\/a>, so developers could inspect the harness from the inside.<\/p>\n<p>And what was visible? No secret model, no hidden API \u2013 mostly the harness. The <a href=\"https:\/\/nodesource.com\/blog\/anthropic-claude-code-source-leak-bun-bug\">leaked code exposed<\/a> Claude Code's system prompt, the definitions and logic for its tools (bash, read, write, edit, glob, grep), the shape of its agentic loop, and how it pulls in <code>CLAUDE.md<\/code>. In other words: exactly the stuff we've been calling &quot;the harness&quot; all along. Anthropic's public statement framed it as a release packaging issue rather than a customer-data breach.<\/p>\n<p>For me, the fascinating part is what it confirmed: a huge amount of what makes Claude Code feel so capable lives in the system prompt and the tool descriptions, not only in the model weights. That's the harness doing its job \u2013 and a pretty good reminder that this layer is something real, inspectable, and very much worth getting right.<\/p>\n<h2>So Which Harness Is Best for Angular?<\/h2>\n<p>So if the harness is the layer worth getting right, the obvious next question is: which one should we actually use for <em>Angular<\/em>? Short answer: I can't prove it. There's no benchmark that measures the &quot;best harness for <em>Angular<\/em>&quot; specifically, and honestly I don't think there could be one \u2013 so everything in this section is my personal, subjective verdict, same as the rest of this series.<\/p>\n<p>If you live in the <strong>terminal<\/strong>, here are the harnesses worth knowing about, roughly in the order I'd reach for them today:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/github.com\/sst\/opencode\">opencode<\/a><\/strong> \u2013 if you only want one recommendation, start here. It's the open-source community favorite \u2013 a polished, terminal-native harness with a huge user base, and it's just as bring-your-own-key and model-agnostic as the rest, so you can point it at Opus, GPT, Gemini or even a local model.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/earendil-works\/pi\">Pi<\/a><\/strong> \u2013 the alternative for the tinkerers among us. A refreshingly minimal harness built around a tiny core that you extend yourself with TypeScript extensions and skills. Lovely if you enjoy reshaping your tools; probably overkill if you just want to get coding.<\/li>\n<li><strong><a href=\"https:\/\/www.anthropic.com\/product\/claude-code\">Claude Code<\/a><\/strong> \u2013 a few months ago, this was the one to beat: one of the best harnesses <em>and<\/em> one of the best overall experiences you could get in the terminal, full stop. Honestly, though, I wouldn't reach for it there anymore. It's the same harness that now powers the Claude Desktop app, and the experience inside that app \u2013 and the other super apps \u2013 has become so much better that the bare CLI just doesn't feel worth it today.<\/li>\n<\/ul>\n<p>Personally, though, I keep coming back to the <strong>super apps<\/strong>: <strong>Codex<\/strong>, the <strong>Claude Desktop<\/strong> app, and <strong>Cursor<\/strong>. As I wrote in the <a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ai-apps-harnesses-for-angular\/\">apps and harnesses post<\/a>, these three give me the biggest, most polished feature set \u2013 and they happen to ship really good harnesses, too. As an app, I personally like <strong>Codex<\/strong> the most.<\/p>\n<p>But if we're talking strictly about the <strong>harness<\/strong>, the interesting part is that we can now compare some setups with the model held fixed. The <a href=\"https:\/\/artificialanalysis.ai\/agents\/coding-agents\">Artificial Analysis Coding Agent Index<\/a> is one of the few benchmarks where that is actually possible. For example, here is the same Opus model at medium effort running through opencode, Cursor CLI, and Claude Code:<\/p>\n<p><a href=\"https:\/\/artificialanalysis.ai\/agents\/coding-agents#harness-comparison\"><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-comparison-chart.png\" alt=\"Harness comparison by Artificial Analysis\" \/><\/a><\/p>\n<p>Harness comparison by Artificial Analysis for the same Opus model at medium effort across opencode, Cursor CLI, and Claude Code \u2013 click the chart for the <a href=\"https:\/\/artificialanalysis.ai\/agents\/coding-agents#harness-comparison\">live comparison<\/a>. That's exactly what makes it a <em>harness<\/em> benchmark and not just another model leaderboard.<\/p>\n<p>So where does that leave us? All three of my go-to super apps (<strong><a href=\"https:\/\/openai.com\/codex\/\">Codex<\/a><\/strong>, the <strong><a href=\"https:\/\/claude.ai\/download\">Claude Desktop<\/a><\/strong> app and <strong><a href=\"https:\/\/cursor.com\/\">Cursor<\/a><\/strong>) are genuinely good choices. For me it mostly comes down to whether I want <strong>GPT<\/strong> or <strong>Opus<\/strong> doing the work \u2013 and whether I feel like switching between them depending on the task. If you like to switch, you can either juggle several apps and harnesses (what I usually do), or just use <strong>Cursor for everything<\/strong>, since it happily runs all the major models under its own harness. As always, though: this is not a benchmark, just my personal verdict.<\/p>\n<p>One setup I'd gently steer you <em>away<\/em> from, even though it's still the most common one I see: plain <strong>VS Code with GitHub Copilot<\/strong>. The GPT model inside is perfectly capable \u2013 this isn't a model problem. It's that Copilot grew out of autocomplete, and its agent experience still feels a step behind the purpose-built harnesses to me. Tellingly, even <a href=\"https:\/\/code.visualstudio.com\/blogs\/2026\/05\/15\/agent-harnesses-github-copilot-vscode\">VS Code's own team<\/a> now frames Copilot around &quot;the harness&quot; \u2013 <em>&quot;The model is the engine. The harness is the car.&quot;<\/em> \u2013 and says it's where they spend most of their engineering time. They're right. So if your whole AI setup is still VS Code plus Copilot, that's exactly the setup worth outgrowing.<\/p>\n<h2>The Fourth Factor: Your Codebase<\/h2>\n<p>So far this post has been about three things you assemble: the <strong>model<\/strong>, the <strong>harness<\/strong>, and the <strong>app<\/strong>. But there's a fourth factor that quietly shapes everything the agent produces, and it's the one you can't pick from a menu: <strong>your existing codebase<\/strong>.<\/p>\n<p>Here's why it matters so much. An agent doesn't write <em>Angular<\/em> in a vacuum \u2013 it reads the code around the change first, and then it imitates. Give it a clean, modern, consistent codebase and it has the best possible reference: it sees your real components, your signal stores, your services, and writes new code that looks like what's already there. In a codebase like that, honestly, the harness setup matters <em>less<\/em> \u2013 the style guide, the <code>AGENTS.md<\/code>, the lint rules are still worth having, but the code itself is already doing half the teaching.<\/p>\n<p>Now flip it. Point the same agent at a legacy codebase \u2013 <code>any<\/code> everywhere, <code>NgModule<\/code>s, <code>*ngIf<\/code>, RxJS where signals belong, no strict typing, a barely-there ESLint config \u2013 and it imitates <em>that<\/em> instead. It will happily match the mess, because the mess is what it sees. This is where the setup stops being a nice-to-have and becomes the thing holding the line: a strong style guide, strict TypeScript, a serious ESLint rule set, and an opinionated <code>AGENTS.md<\/code> are what override the bad examples in the surrounding code and pull the output back up to the standard you actually want.<\/p>\n<p>So there's an inverse relationship worth internalizing: <strong>the worse your codebase, the more your harness setup matters.<\/strong> On a pristine greenfield project you can get away with a light touch. On the brownfield codebases most of us actually work in, the guardrails and the style guide aren't decoration \u2013 they're the only thing between you and an agent that cheerfully writes 2019-era <em>Angular<\/em> because that's what it found lying around.<\/p>\n<p>With a harness picked \u2013 and a clear-eyed sense of the codebase you're aiming it at \u2013 the real work only starts: actually setting it up so it writes <em>Angular<\/em> the way we want. That's what the rest of this post is about.<\/p>\n<h2>So How Do I Actually Set This Up?<\/h2>\n<p>Enough theory \u2013 let me show you the exact setup I use. Everything below lives in a companion repo, <strong><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\">ng-agentic<\/a><\/strong>: a small <em>Angular<\/em> workspace I generated fresh with the <strong>Angular CLI 22<\/strong> and then turned, commit by commit, into something every agent can work in. Clone it, read through the history, or just follow along here and build the same thing into your own project \u2013 either way, the goal is one workspace where the harness produces the <em>Angular<\/em> code we actually want.<\/p>\n<p>At a high level, the setup has five parts:<\/p>\n<ul>\n<li>start from a clean CLI baseline, or identify the brownfield baseline you already have<\/li>\n<li>make formatting and linting non-negotiable<\/li>\n<li>hand the agent your <em>Angular<\/em> style guide<\/li>\n<li>turn <code>AGENTS.md<\/code> into an operating contract<\/li>\n<li>wire every app, IDE, and agent back to the same rules<\/li>\n<\/ul>\n<p>That greenfield-or-brownfield choice shows up immediately, at the very first command. I went <strong>greenfield<\/strong> for this repo \u2013 a fresh <code>ng new<\/code> \u2013 because it makes every step easy to show on its own. But let's be honest: most of us aren't starting from scratch. We're dropping the agent into an existing <em>Angular<\/em> app \u2013 <strong>brownfield<\/strong>, legacy or not \u2013 the more common case by far. The good news is that almost everything below is identical either way. The only greenfield-only step is the <code>ng new<\/code> itself \u2013 on an existing project you simply skip it and layer the same tooling and conventions on top of what you already have.<\/p>\n<h3>Start from a Clean <code>ng new<\/code><\/h3>\n<p>The greenfield path is the boring one \u2013 a fresh project straight from the <strong><a href=\"https:\/\/github.com\/angular\/angular-cli\">Angular CLI<\/a><\/strong>:<\/p>\n<pre><code class=\"language-shell\">ng new ng-agentic<\/code><\/pre>\n<p>That gives us the usual scaffold \u2013 config, dependencies, a starter component, an initialized Git repo. The CLI can also generate agent config for us along the way \u2013 either when <code>ng new<\/code> asks which AI tools we use, or later via <code>ng generate ai-config<\/code> \u2013 and that's where the first <code>AGENTS.md<\/code> comes from, the file every agent reads first. We'll make that file do real work further down; for now it just needs to exist.<\/p>\n<p>The only cleanup on that first commit was trimming a few duplicated instructions out of the generated <code>AGENTS.md<\/code> and running the formatter over everything:<\/p>\n<pre><code class=\"language-shell\">pnpm format   # runs prettier --write .<\/code><\/pre>\n<p>Doing that by hand on every commit gets old fast \u2013 which is exactly the next thing to automate.<\/p>\n<h3>Make Formatting and Linting Non-Negotiable<\/h3>\n<p>Here's the thing about handing an agent the keys: it'll write code in whatever style the prompt nudges it toward, and it'll just as happily commit a half-formatted mess if nothing stops it. So before I teach the harness <em>how<\/em> I want my <em>Angular<\/em> written, I give it a hard floor it can't sink below \u2013 formatting and linting that run automatically on every commit, whether the code came from me or from the model.<\/p>\n<p>The enforcer is a <strong><a href=\"https:\/\/typicode.github.io\/husky\/\">Husky<\/a><\/strong> pre-commit hook:<\/p>\n<pre><code class=\"language-shell\">pnpm add -D husky\npnpm exec husky init<\/code><\/pre>\n<p><code>husky init<\/code> creates <code>.husky\/pre-commit<\/code>; I point it at the project's format script, so every commit gets <code>prettier<\/code>-formatted before it lands. No more &quot;fix formatting&quot; commits, and no more arguing with the agent about quotes and trailing commas.<\/p>\n<p>Formatting is the easy half. For real code quality I add <strong><a href=\"https:\/\/github.com\/angular-eslint\/angular-eslint\">Angular ESLint<\/a><\/strong>, which understands <em>Angular<\/em> and not just plain TypeScript:<\/p>\n<pre><code class=\"language-shell\">ng add @angular-eslint\/schematics<\/code><\/pre>\n<p>Linting the whole project on every commit is slow, so I scope it to the staged files with <strong>lint-staged<\/strong> and run that from the hook instead:<\/p>\n<pre><code class=\"language-json\">{\n  &quot;lint-staged&quot;: {\n    &quot;*.{html,js,ts}&quot;: [&quot;eslint --fix&quot;, &quot;prettier --write&quot;],\n    &quot;*.{css,json,md,scss}&quot;: [&quot;prettier --write&quot;]\n  }\n}<\/code><\/pre>\n<p>The default <em>Angular<\/em> ESLint preset is fairly relaxed, so I tighten <a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/eslint.config.js\"><code>eslint.config.js<\/code><\/a> with the stricter rules I actually care about, then do a one-time cleanup pass with <code>ng lint --fix<\/code>.<\/p>\n<p>And here's a small moment that captures the whole point of this post. After the auto-fix, two issues are left that ESLint won't touch on its own \u2013 a component missing <code>OnPush<\/code>, and a function missing its return type. Both are mechanical, so I don't fix them by hand: I hand them to the agent and let the harness close its own loop. The guardrail flags the problem, the model fixes it, and the hook verifies the fix on the way back in.<\/p>\n<p>One word for the <strong>brownfield<\/strong> crowd: that first <code>ng lint<\/code> won't print two warnings, it'll print a few hundred. Don't <code>--fix<\/code> the whole pile in one heroic commit \u2013 treat that wall as your honest baseline, the real starting state of the code, and chip away at it deliberately. It's exactly the kind of backlog the agent is good at later, but that's a story for another post.<\/p>\n<h3>Hand the Agent Your Style Guide<\/h3>\n<p>If you take only one thing from this entire post, take this one. <strong>The style guide is the single highest-leverage file in the whole setup<\/strong> \u2013 it matters more than the linting, more than the MCP servers, more than the clever <code>AGENTS.md<\/code> we'll get to next.<\/p>\n<p>Here's why. A strong model already knows <em>Angular<\/em> \u2013 generically. Ask it for a component and you'll get a perfectly reasonable, perfectly <em>generic<\/em> one: maybe Jest where you use <strong>Vitest<\/strong>, maybe half-remembered <code>NgModule<\/code>s from 2021, maybe RxJS where you'd reach for a signal. What the model <em>doesn't<\/em> know is how <strong>your<\/strong> team writes <em>Angular<\/em> \u2013 your stack, your conventions, your taste. The style guide is where you hand it exactly that. And the moment you do, the harness stops writing generic <em>Angular<\/em> and starts writing <em>yours<\/em>.<\/p>\n<p>In the repo this lives in a <a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/tree\/main\/style-guide\"><code>style-guide\/<\/code><\/a> folder. One general <a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.md\"><code>style-guide.md<\/code><\/a> sets the baseline \u2013 it pins the target stack (<strong>Angular v22+<\/strong>, <strong>TypeScript 6<\/strong>, <strong>zoneless<\/strong>, <strong>Vitest + Playwright<\/strong>) and lays out plain <strong>Do \/ Should \/ Don't<\/strong> rules. It's a living document, too \u2013 versioned (2.0.1 as I write this), not a one-off.<\/p>\n<p>Around that baseline sit focused, file-type-specific guides. Start with the <a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.md\">Angular Coding Style Guide<\/a> itself, then jump straight to whichever specific one is relevant:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.ts.md\">TypeScript (Angular) files<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.html.md\">HTML view templates<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.scss.md\">SCSS styling files<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.a11y.md\">Accessibility (a11y)<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.spec.md\">Testing (Vitest &amp; Playwright)<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.git.md\">Git commits<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.md.md\">Markdown files<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/style-guide\/style-guide.npm.md\">NPM packages<\/a><\/li>\n<\/ul>\n<p>Two design choices in here are worth copying:<\/p>\n<ul>\n<li><strong>It's written for humans <em>and<\/em> agents at once.<\/strong> Same document, one source of truth. A new teammate reads it on day one; the agent reads it on every task. No second set of conventions quietly drifting out of sync.<\/li>\n<li><strong>It's split by file type on purpose.<\/strong> When the agent edits a template, it should pull in the HTML guide \u2013 not the SCSS rules, not the testing checklist, not the entire wall of conventions at once. This isn't just tidiness: a model's accuracy actually drops as its context fills up, and burying the one rule that matters among hundreds that don't is the worst <em>needle-in-a-haystack<\/em> problem you can hand it. Picture fixing a bug when you're shown the two files it might live in versus all two thousand. Narrower, relevant context means sharper focus and better output, and it pays off more and more as the guide grows.<\/li>\n<\/ul>\n<p>So this is the section to spend real time on. Borrow the structure from the repo if you like, but fill it with <em>your<\/em> rules \u2013 the ones you'd give a sharp new hire in their first week. That document is what turns a capable-but-generic harness into one that writes <em>Angular<\/em> the way your codebase actually wants it written.<\/p>\n<p>And mine is genuinely never finished. I keep refining this style guide as <em>Angular<\/em> moves and as I learn what actually holds up in practice \u2013 so if you spot something missing, something you'd do differently, or a rule that has aged badly, I'd honestly love to hear it. Open an issue or a pull request on the <a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\">repo<\/a>, or just reach out and tell me. Good conventions are a team sport, and this one gets a little better every time someone pushes back on it.<\/p>\n<h3>Turn AGENTS.md Into an Operating Contract<\/h3>\n<p>If the style guide is about how the code should <em>look<\/em>, <strong><code>AGENTS.md<\/code> is about how the agent should <em>behave<\/em><\/strong> \u2013 the rules of engagement it reads before it touches anything. The version the CLI generates is fine, but generic. So I rewrote it into a repo-specific <em>operating contract<\/em>: a short document that tells the harness exactly how to act in <em>this<\/em> codebase.<\/p>\n<p>The part I care about most is the workflow rules, because this is where a model goes from &quot;powerful but a bit reckless&quot; to &quot;careful teammate.&quot; A few that earn their place:<\/p>\n<ul>\n<li><strong>Preserve my edits.<\/strong> Before changing a file, check its current state and don't revert, rewrite, or drop my changes or comments unless I asked. It's the same rule I'd give any human collaborator \u2013 and the one I try to hold myself to.<\/li>\n<li><strong>Keep fixes local.<\/strong> When fixing a bug, change the minimum needed. No opportunistic refactors, no &quot;while I'm here&quot; cleanups smuggled into the diff. Spotted a worthwhile refactor? Suggest it; don't sneak it in.<\/li>\n<li><strong>Stay in your lane.<\/strong> Don't touch unrelated files, prefer minimal diffs, and run lint and the relevant tests before declaring a task done.<\/li>\n<li><strong>Don't start the dev server.<\/strong> Never fire up <code>ng serve<\/code> on its own \u2013 I usually already have one running on <code>:4200<\/code>.<\/li>\n<\/ul>\n<p>This is also where the two layers connect. <strong><code>AGENTS.md<\/code> is the primary instruction \u2013 the one file the agent always loads<\/strong>, on every task, no exceptions. The style guides are not; they come in through <strong>progressive disclosure<\/strong>, just-in-time, only when the agent actually touches a matching file. Create or edit a template and the HTML guide loads; touch a <code>.scss<\/code> and the styling guide loads; nothing else competes for the model's attention. <code>AGENTS.md<\/code> spells out that contract in one decisive line \u2013 read <em>only<\/em> the narrowest relevant guide \u2013 plus a precedence rule: <strong>project rules override generic <em>Angular<\/em> advice and any skill's examples<\/strong>. That precedence is what stops a confident model from quietly defaulting to the <em>Angular<\/em> it learned two years ago.<\/p>\n<p>There's a deeper reason this file pulls its weight. An agent starts every session knowing nothing about your repo \u2013 and if something isn't in its context, it may as well not exist for the model \u2013 so without <code>AGENTS.md<\/code> it has to spend tool calls rediscovering how the project is laid out, every single time. <code>AGENTS.md<\/code> front-loads just enough to skip that: not the whole codebase, but the always-true orientation \u2013 your conventions, where things live, which narrow guide to read next \u2013 so the agent starts pointed in the right direction instead of guessing.<\/p>\n<p>And it bakes in the modern <strong><em>Angular<\/em> v22+<\/strong> defaults so I don't have to repeat them in every prompt: standalone and zoneless, signals over decorators (<code>input()<\/code>, <code>output()<\/code>, <code>computed()<\/code>, <code>.set()<\/code>\/<code>.update()<\/code> \u2013 never <code>.mutate()<\/code>), native <a href=\"mailto:code&gt;@if&lt;\/code\">code>@if<\/code<\/a>\/<a href=\"mailto:code&gt;@for&lt;\/code\">code>@for<\/code<\/a> instead of <code><em>ngIf<\/code>\/<code><\/em>ngFor<\/code>, <code>resource()<\/code>\/<code>rxResource()<\/code> for data fetching, <code>inject()<\/code> over constructor injection, strict TypeScript with <strong>no <code>any<\/code>, ever<\/strong>, AXE\/WCAG AA on every template, and no <code>.spec.ts<\/code> files unless a real Vitest or Playwright setup exists. (Always worth mentioning: <code>computed()<\/code> is my favorite feature in modern <em>Angular<\/em>.)<\/p>\n<p>One warning from experience, though. The moment you have three layers of rules \u2013 <code>AGENTS.md<\/code>, the style guides, and the ESLint config \u2013 they can quietly start to <strong>contradict each other<\/strong>, and a contradiction is worse than no rule at all. If <code>AGENTS.md<\/code> says &quot;Signal Forms&quot; while a style guide still shows a Reactive Forms example and ESLint enforces neither, the agent picks one almost at random and burns a round-trip second-guessing itself. So I treat the three as a single system: they have to say the same thing, and wherever a rule <em>can<\/em> become an ESLint rule, I make it one \u2013 a check the harness actually runs beats a sentence it merely reads. Manfred takes this same principle all the way up to architecture itself \u2013 <a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/reliable-angular-architectures-with-ai-assisted-coding\/\">turning layer and domain boundaries into checks the agent must satisfy<\/a>, with Sheriff and feedback hooks.<\/p>\n<p>The whole thing fits on a screen or two \u2013 you can read <a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\/blob\/main\/AGENTS.md\">the full <code>AGENTS.md<\/code><\/a> in the repo. Steal what fits, drop what doesn't; the point isn't my exact rules, it's that the agent should walk into every task already knowing how your team works instead of guessing.<\/p>\n<h3>Wire Up Every Agent<\/h3>\n<p>The last step is pure plumbing, but it's what makes the whole thing portable. Everything so far lives in <code>AGENTS.md<\/code> and the style guide, so the final move is simply to make <em>every<\/em> tool read them. Each assistant \u2013 Claude Code, Codex, Cursor, Junie, Gemini, Windsurf, GitHub Copilot, plain VS Code \u2013 gets a thin little file (<code>.cursorrules<\/code>, <code>.gemini\/GEMINI.md<\/code>, <code>.github\/copilot-instructions.md<\/code> and friends) that does nothing but point back to <code>AGENTS.md<\/code>. Yes, that includes the ones I'd nudge you away from \u2013 if a teammate still reaches for Copilot, it should at least follow the same rules as everyone else. One brain, many front-ends: switch tools and the rules come with you.<\/p>\n<p>Two small things round it out. I register the project's <strong>MCP servers<\/strong> once in <code>.mcp.json<\/code> (Angular CLI, Spartan UI, Chrome DevTools, Figma) so any agent can reach the same extra tools, and I harden an <strong><code>.aiignore<\/code><\/strong> so no agent ever reads secrets or environment files \u2013 <code>.env<\/code>, <code><em>.pem<\/code>, <code><\/em>.key<\/code>, <em>Angular<\/em>'s <code>environment*.ts<\/code>. The rest is housekeeping: a <code>.prettierrc.json<\/code> rename and an <code>ng:update<\/code> script for upgrades. It's all in the <a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\">repo<\/a> if you want the exact files.<\/p>\n<p>And that's the setup. None of these last pieces are clever on their own, but together they mean the harness behaves the same whether I open Codex today or Cursor tomorrow \u2013 and that every one of them writes <em>Angular<\/em> the way I actually want. Which is the whole point of getting the harness right: the model does the reasoning, but the harness is where <em>your<\/em> quality lives.<\/p>\n<h2>Agentic Engineering Workshop<\/h2>\n<p>Everything in this post \u2013 the guardrails, the <em>Angular<\/em> Coding Style Guide, the opinionated <code>AGENTS.md<\/code>, and the work of keeping all three in sync \u2013 is exactly the kind of setup we build together, hands-on.<\/p>\n<p>If you want to build this kind of setup for your own <em>Angular<\/em> projects \u2013 an AI-ready workspace, real guardrails, and a strict human-in-the-loop workflow where every generated line still looks handcrafted \u2013 join our <strong>Agentic Engineering Workshop<\/strong>, available in English and German.<\/p>\n<p>In this workshop, advanced <em>Angular<\/em> developers learn how to move from vibe coding to traceable Agentic Engineering workflows: AI-ready project setup, guardrails, spec-first and plan-first workflows, UX and component prototyping, code review, testing, and brownfield refactoring.<\/p>\n<ul>\n<li>\ud83e\udd16 <a href=\"https:\/\/www.angulararchitects.io\/en\/training\/agentic-engineering-von-vibe-coding-zu-professionellen-ki-gestuetzten-workflows\/\"><strong>Agentic Engineering Workshop<\/strong><\/a> \u2013 2 days, remote<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>If there's one line to take away, it's the same idea this post started with: <strong>the harness, not the model, is where your day-to-day <em>Angular<\/em> quality comes from.<\/strong> The model will keep getting better whether you do anything or not \u2013 that part is out of your hands. The harness is the part <em>you<\/em> control, and it's what decides whether a strong model writes generic <em>Angular<\/em> or writes <em>yours<\/em>.<\/p>\n<p>And setting it up isn't mysterious. A clean baseline, formatting and linting that run themselves, a style guide that actually encodes your taste, an opinionated <code>AGENTS.md<\/code>, and every tool wired back to the same rules \u2013 that's the whole game. If you invest in only one piece, make it the <strong>style guide<\/strong>: it's the cheapest, highest-impact way to turn a capable-but-generic harness into one that feels like a teammate who already knows your codebase.<\/p>\n<p>The best part is that none of this is locked to a vendor. The same <code>AGENTS.md<\/code> and style guide work whether I'm in Codex today, Cursor tomorrow, or some app that doesn't exist yet \u2013 so when the next model or the next super app shows up, I just point it at the setup I already have. That's exactly why I'd rather invest in the harness than chase the model leaderboard.<\/p>\n<p>Everything here lives in the <strong><a href=\"https:\/\/github.com\/L-X-T\/ng-agentic\">ng-agentic<\/a><\/strong> repo \u2013 clone it, steal what fits, and make it yours. And this is really just the foundation: in upcoming posts I'll build on top of it with reusable <strong>agent skills<\/strong>, the <strong>workflows<\/strong> that decide how much structure a task needs, and the part I'm most excited about \u2013 using all of this for real <strong>brownfield refactoring<\/strong> of dusty <em>Angular<\/em> code.<\/p>\n<p>Thank you for reading \ud83d\ude4f this blog post was written by Alexander Thalhammer. For feedback, remarks or questions, please reach out to me \u2764\ufe0f<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is post 7 of 7 in the series &ldquo;Agentic Engineering&rdquo; Agentic Engineering: Which LLM Is Best for Angular Development? Agentic: Which App\/Harness Is Best for Angular Development? Agentic Engineering: What Does AI Coding Really Cost? Agentic Engineering: What Do AI Coding Tools Do With Your Code? Agentic Verdict: What&#8217;s the Best Solution for You? [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":34244,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-34251","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","post_series-agentic-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Agentic Engineering: How to Set Up Your Harness for Angular Development - ANGULARarchitects<\/title>\n<meta name=\"description\" content=\"The harness, not the model, drives your Angular code quality. How to set up an AI coding harness: style guide, AGENTS.md, linting \u2013 plus a repo to copy.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Agentic Engineering: How to Set Up Your Harness for Angular Development - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"The harness, not the model, drives your Angular code quality. How to set up an AI coding harness: style guide, AGENTS.md, linting \u2013 plus a repo to copy.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-25T15:39:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-25T16:11:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Alexander Thalhammer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@LX_T\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alexander Thalhammer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/\"},\"author\":{\"name\":\"Alexander Thalhammer\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45\"},\"headline\":\"Agentic Engineering: How to Set Up Your Harness for Angular Development\",\"datePublished\":\"2026-06-25T15:39:58+00:00\",\"dateModified\":\"2026-06-25T16:11:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/\"},\"wordCount\":3996,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/\",\"name\":\"Agentic Engineering: How to Set Up Your Harness for Angular Development - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png\",\"datePublished\":\"2026-06-25T15:39:58+00:00\",\"dateModified\":\"2026-06-25T16:11:31+00:00\",\"description\":\"The harness, not the model, drives your Angular code quality. How to set up an AI coding harness: style guide, AGENTS.md, linting \u2013 plus a repo to copy.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png\",\"width\":1672,\"height\":941},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Agentic Engineering: How to Set Up Your Harness for Angular Development\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45\",\"name\":\"Alexander Thalhammer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g\",\"caption\":\"Alexander Thalhammer\"},\"sameAs\":[\"https:\/\/x.com\/LX_T\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Agentic Engineering: How to Set Up Your Harness for Angular Development - ANGULARarchitects","description":"The harness, not the model, drives your Angular code quality. How to set up an AI coding harness: style guide, AGENTS.md, linting \u2013 plus a repo to copy.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/","og_locale":"en_US","og_type":"article","og_title":"Agentic Engineering: How to Set Up Your Harness for Angular Development - ANGULARarchitects","og_description":"The harness, not the model, drives your Angular code quality. How to set up an AI coding harness: style guide, AGENTS.md, linting \u2013 plus a repo to copy.","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/","og_site_name":"ANGULARarchitects","article_published_time":"2026-06-25T15:39:58+00:00","article_modified_time":"2026-06-25T16:11:31+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png","type":"image\/png"}],"author":"Alexander Thalhammer","twitter_card":"summary_large_image","twitter_creator":"@LX_T","twitter_misc":{"Written by":"Alexander Thalhammer","Est. reading time":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/"},"author":{"name":"Alexander Thalhammer","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45"},"headline":"Agentic Engineering: How to Set Up Your Harness for Angular Development","datePublished":"2026-06-25T15:39:58+00:00","dateModified":"2026-06-25T16:11:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/"},"wordCount":3996,"commentCount":0,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/","name":"Agentic Engineering: How to Set Up Your Harness for Angular Development - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png","datePublished":"2026-06-25T15:39:58+00:00","dateModified":"2026-06-25T16:11:31+00:00","description":"The harness, not the model, drives your Angular code quality. How to set up an AI coding harness: style guide, AGENTS.md, linting \u2013 plus a repo to copy.","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/06\/AE-harness-thumbnail.png","width":1672,"height":941},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/ae-harness-setup-for-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Agentic Engineering: How to Set Up Your Harness for Angular Development"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45","name":"Alexander Thalhammer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g","caption":"Alexander Thalhammer"},"sameAs":["https:\/\/x.com\/LX_T"]}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/34251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=34251"}],"version-history":[{"count":3,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/34251\/revisions"}],"predecessor-version":[{"id":34258,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/34251\/revisions\/34258"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/34244"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=34251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=34251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=34251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}