<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI &#8211; NoloWiz</title>
	<atom:link href="https://nolowiz.com/category/ai/feed/" rel="self" type="application/rss+xml" />
	<link>https://nolowiz.com</link>
	<description>Technology news, tips and tutorials</description>
	<lastBuildDate>Wed, 11 Nov 2026 01:02:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.13</generator>

<image>
	<url>https://nolowiz.com/wp-content/uploads/2021/01/cropped-android-chrome-512x512-2-32x32.png</url>
	<title>AI &#8211; NoloWiz</title>
	<link>https://nolowiz.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>BMAD Method Explained: A Simple Guide</title>
		<link>https://nolowiz.com/bmad-method-explained-a-simple-guide/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Wed, 11 Nov 2026 00:56:40 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7880</guid>

					<description><![CDATA[<p>AI coding assistants write code fast. But they often guess what you want, and they forget earlier decisions when a new chat starts. The result is code that works today and breaks the plan tomorrow. The BMAD Method tries to fix this problem. It gives your AI coding tool a set of skills that act ... <a title="BMAD Method Explained: A Simple Guide" class="read-more" href="https://nolowiz.com/bmad-method-explained-a-simple-guide/" aria-label="More on BMAD Method Explained: A Simple Guide">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/bmad-method-explained-a-simple-guide/">BMAD Method Explained: A Simple Guide</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>AI coding assistants write code fast. But they often guess what you want, and they forget earlier decisions when a new chat starts. The result is code that works today and breaks the plan tomorrow.</p>



<p>The BMAD Method tries to fix this problem. It gives your AI coding tool a set of skills that act like an agile team: an analyst, a product manager, an architect, a developer and a reviewer. Each skill writes a document, and the next skill reads it. Your decisions stay on record, so the AI does not have to guess. BMAD is free and open source, and it has more than 54,000 stars on GitHub.</p>



<p>In this guide, we explain what BMAD is, how it works, what changed in recent versions, and how to install it. We also tell you who should use it and who can skip it.</p>



<h2>What Is the BMAD Method?</h2>



<p>BMAD stands for<strong> B</strong>reakthrough <strong>M</strong>ethod for<strong> A</strong>gile AI-<strong>D</strong>riven Development. It is a framework that adds structure to AI-assisted software work, from the first idea to reviewed code.</p>



<ul><li><strong>Free and open source:</strong> BMAD uses the MIT license. Its makers say there are no paid workflows and no closed community.</li><li><strong>Owner:</strong> BMad Code, LLC owns the &#8220;BMad&#8221; and &#8220;BMAD-METHOD&#8221; trademarks.</li><li><strong>Popularity:</strong> The <a target="_blank" rel="noreferrer noopener" href="https://github.com/bmad-code-org/BMAD-METHOD">official GitHub repository</a> has about 54,600 stars and 6,100 forks (checked on November 10, 2026).</li><li><strong>Where it runs:</strong> BMAD works inside AI coding tools that support skills, such as Claude Code, Cursor and Codex. Version 6.5 raised the number of supported platforms to 42.</li></ul>



<p>In simple words: BMAD is not a new AI model. It is a set of instructions, templates and scripts. These tell your existing AI tool how to plan, build and check work step by step.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- display ad -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8024054468" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h2>Why BMAD Exists</h2>



<p>The BMAD team says coding assistants are good at writing code, but they often turn unstated assumptions into code. BMAD makes those assumptions visible before the AI writes code.</p>



<p>The method has three main ideas:</p>



<ol><li><strong>Right-sized process.</strong> A small, clear change goes directly to build. A large or risky project gets more planning first.</li><li><strong>Durable context.</strong> Product and technical decisions go into files, such as a PRD, a spec or an architecture document. The AI reads these files in each new session, so you do not explain the same thing again.</li><li><strong>Human control.</strong> The AI asks questions and shows a plan. You approve it before it writes code.</li></ol>



<p>This is also called <em>spec-driven development</em>: you write the spec first, then the AI builds against it. <a href="https://nolowiz.com/spec-driven-development-problems-and-best-practices/" target="_blank" rel="noreferrer noopener">Read about spec driven development problems and best practices</a>.</p>



<h2>How BMAD Works</h2>



<p>BMAD sizes the process to the work. You can start at any stage, based on how clear your idea is.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="436" src="https://nolowiz.com/wp-content/uploads/2026/11/how-bmad-works-1024x436.jpg" alt="BMAD Method delivery loop diagram showing Clarify, Plan, Build and verify, and Learn and adjust stages" class="wp-image-7882" srcset="https://nolowiz.com/wp-content/uploads/2026/11/how-bmad-works-1024x436.jpg 1024w, https://nolowiz.com/wp-content/uploads/2026/11/how-bmad-works-300x128.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/11/how-bmad-works-768x327.jpg 768w, https://nolowiz.com/wp-content/uploads/2026/11/how-bmad-works-150x64.jpg 150w, https://nolowiz.com/wp-content/uploads/2026/11/how-bmad-works.jpg 1344w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>A small, clear change goes directly to Build. A big but clear idea starts at Plan. A vague notion starts at Clarify. After a build, you learn from the result and loop back to the plan.</p>



<p>The official docs give a simple rule for how much planning to do:</p>



<ol><li><strong>Trivial or one-session work:</strong> run <code>bmad-build</code> directly. It asks questions, shows a plan for your approval, writes the code and checks its work.</li><li><strong>Epic-sized work</strong> (one outcome, several sessions): write a spec with <code>bmad-spec</code>, break it into stories, then build each story.</li><li><strong>Project-sized work</strong> (several epics, or about 20 or more sessions): use the full flow with a PRD, UX design, architecture, epics and sprint planning.</li></ol>



<p>The docs also say size is only one signal. Use more planning when the work has high risk, unclear requirements or effects on other systems.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- display ad -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8024054468" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Key BMAD Skills at a Glance</h2>



<p>BMAD groups its planning skills into three phases. You pick only the skills your work needs. Every planning path ends with <code>bmad-spec</code>, and every path builds with <code>bmad-build</code>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="862" src="https://nolowiz.com/wp-content/uploads/2026/11/bmad-skills-at-a-glance-1-1024x862.jpg" alt="BMAD Method skills table showing Analysis, Planning, Solutioning and Build phases, each skill, and the document it produces" class="wp-image-7886" srcset="https://nolowiz.com/wp-content/uploads/2026/11/bmad-skills-at-a-glance-1-1024x862.jpg 1024w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-skills-at-a-glance-1-300x253.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-skills-at-a-glance-1-768x647.jpg 768w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-skills-at-a-glance-1-1536x1293.jpg 1536w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-skills-at-a-glance-1-150x126.jpg 150w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-skills-at-a-glance-1.jpg 2000w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2>How to Install BMAD</h2>



<p>You need Node.js 20.12 or later, Python 3.10 or later, and <a target="_blank" rel="noreferrer noopener" href="https://docs.astral.sh/uv/">uv</a>. Open a terminal in your project folder and run:</p>



<pre class="wp-block-code"><code>npx bmad-method install</code></pre>



<p>Then open the project in your AI coding tool. Call <code>bmad-build</code> with the change you want. Run <code>bmad-help</code> when you are not sure what to do next.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="765" src="https://nolowiz.com/wp-content/uploads/2026/11/bmad-ecosystem-1024x765.jpg" alt="BMAD Method ecosystem infographic showing the core BMad Method connected to five official modules: BMad Builder, BMad Loop, BMad Test Architect, Creative Intelligence Suite and BMad Game Dev Studio" class="wp-image-7888" srcset="https://nolowiz.com/wp-content/uploads/2026/11/bmad-ecosystem-1024x765.jpg 1024w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-ecosystem-300x224.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-ecosystem-768x574.jpg 768w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-ecosystem-1536x1147.jpg 1536w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-ecosystem-150x112.jpg 150w, https://nolowiz.com/wp-content/uploads/2026/11/bmad-ecosystem.jpg 2000w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Pros, Cons and Who Should Use It</h2>



<p><strong>Pros</strong></p>



<ul><li>Decisions stay in files, so the AI keeps context across sessions.</li><li>The process scales: a bug fix stays light, a large product gets full planning.</li><li>It works on new projects and on existing codebases.</li><li>It is free, open source and has an active community on GitHub and Discord.</li></ul>



<p><strong>Cons</strong></p>



<ul><li>It produces more documents than lightweight agile. Some critics say heavy specs up front can slow the response to changing requirements (<a target="_blank" rel="noreferrer noopener" href="https://charterglobal.com/bmad-method-ai-driven-software-development/">Charter Global</a>).</li><li>It changes fast. Skills were renamed and merged in v6.11, and v7 will bring more breaking changes.</li><li>It needs setup: Node.js, Python, uv and a skills-ready AI coding tool.</li></ul>



<p><strong>Use BMAD if</strong> you build products with AI agents and lose time when the AI forgets past decisions. It also helps teams that need written plans for review.</p>



<p><strong>Skip BMAD if</strong> you only make small, one-off scripts. A plain AI coding tool is faster for that.</p>



<h2>Conclusion</h2>



<p>BMAD turns an AI coding tool into a small, disciplined team. It asks questions first, writes the decisions down, and then builds and reviews the code. </p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fbmad-method-explained-a-simple-guide%2F&amp;linkname=BMAD%20Method%20Explained%3A%20A%20Simple%20Guide" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fbmad-method-explained-a-simple-guide%2F&amp;linkname=BMAD%20Method%20Explained%3A%20A%20Simple%20Guide" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fbmad-method-explained-a-simple-guide%2F&amp;linkname=BMAD%20Method%20Explained%3A%20A%20Simple%20Guide" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fbmad-method-explained-a-simple-guide%2F&amp;linkname=BMAD%20Method%20Explained%3A%20A%20Simple%20Guide" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fbmad-method-explained-a-simple-guide%2F&#038;title=BMAD%20Method%20Explained%3A%20A%20Simple%20Guide" data-a2a-url="https://nolowiz.com/bmad-method-explained-a-simple-guide/" data-a2a-title="BMAD Method Explained: A Simple Guide"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/bmad-method-explained-a-simple-guide/">BMAD Method Explained: A Simple Guide</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Write a Better CLAUDE.md File: Best Practices</title>
		<link>https://nolowiz.com/how-to-write-a-better-claude-md-file-best-practices/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Mon, 09 Nov 2026 00:46:34 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7856</guid>

					<description><![CDATA[<p>If you use Claude Code, you&#8217;ve probably noticed it forgets everything between sessions. You tell it your test command on Monday, and by Tuesday it&#8217;s guessing again. A CLAUDE.md file fixes that. It&#8217;s a plain text file in your project that Claude reads every time it starts, like a note on the fridge that says ... <a title="How to Write a Better CLAUDE.md File: Best Practices" class="read-more" href="https://nolowiz.com/how-to-write-a-better-claude-md-file-best-practices/" aria-label="More on How to Write a Better CLAUDE.md File: Best Practices">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/how-to-write-a-better-claude-md-file-best-practices/">How to Write a Better CLAUDE.md File: Best Practices</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>If you use Claude Code, you&#8217;ve probably noticed it forgets everything between sessions. You tell it your test command on Monday, and by Tuesday it&#8217;s guessing again.</p>



<p>A CLAUDE.md file fixes that. It&#8217;s a plain text file in your project that Claude reads every time it starts, like a note on the fridge that says &#8220;here&#8217;s how we do things here.&#8221; The catch is that how you write it matters. A short, clear file gets followed. A long, vague one gets ignored.</p>



<p>In this guide, you&#8217;ll learn where the file goes, 10 best practices with simple examples, and a template you can copy. </p>



<h2>What is a CLAUDE.md file (and where does it go)</h2>



<p>A CLAUDE.md file is a markdown file of standing instructions for Claude Code. Claude loads it into context when a session starts, so you don&#8217;t have to repeat yourself. You can have more than one, and each location has a different reach.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="711" src="https://nolowiz.com/wp-content/uploads/2026/11/claude-md-locations-1024x711.jpg" alt="" class="wp-image-7859" srcset="https://nolowiz.com/wp-content/uploads/2026/11/claude-md-locations-1024x711.jpg 1024w, https://nolowiz.com/wp-content/uploads/2026/11/claude-md-locations-300x208.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/11/claude-md-locations-768x534.jpg 768w, https://nolowiz.com/wp-content/uploads/2026/11/claude-md-locations-150x104.jpg 150w, https://nolowiz.com/wp-content/uploads/2026/11/claude-md-locations.jpg 1520w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>A few things about loading that trip people up:</p>



<ul><li><strong>Files stack, they don&#8217;t replace each other.</strong> Claude reads the files from the folders above where you started it, top to bottom. The file closest to your working folder is read last.</li><li><strong>Subfolder files load later.</strong> A <code>CLAUDE.md</code> inside <code>src/payments/</code> only loads when Claude actually opens a file in that folder. That&#8217;s a feature: it keeps unrelated rules out of the way.</li><li><strong>Already using AGENTS.md?</strong> Recent versions of Claude Code read <code>AGENTS.md</code> when there&#8217;s no <code>CLAUDE.md</code> in the project. If you have both, put <code>@AGENTS.md</code> at the top of your CLAUDE.md so every tool shares one source of truth.</li></ul>



<p>The quickest way to start is to run <code>/init</code> inside Claude Code. It scans your codebase and drafts a CLAUDE.md for you. Treat that draft as a first pass, not the finished file. The practices below are how you turn it into something useful.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>10 CLAUDE.md best practices</h2>



<h3>1. Keep it under 200 lines</h3>



<p>Anthropic&#8217;s own <a href="https://code.claude.com/docs/en/best-practices" target="_blank" rel="noreferrer noopener">guidance</a> is to aim for under 200 lines per file. Every line costs context, and a long file makes Claude follow each rule less reliably. Think of it like a briefing for a new hire on day one. Nobody remembers a 40-page handbook. Everyone remembers a one-page cheat sheet.</p>



<p>A handy trick: notes meant only for humans can go inside HTML comments like <code>&lt;!-- why we added this rule --></code>. Claude Code strips them before loading the file, so they cost nothing.</p>



<h3>2. Write rules you could check</h3>



<p>If you can&#8217;t tell whether Claude followed a rule, Claude can&#8217;t either.</p>



<p>Before:</p>



<pre class="wp-block-code"><code>- Format code properly
- Test your changes
- Keep files organized</code></pre>



<p>After:</p>



<pre class="wp-block-code"><code>- Use 2-space indentation
- Run `pnpm test:unit` before saying a task is done
- API handlers live in `src/api/handlers/`</code></pre>



<p>The first version sounds wise and changes nothing. The second one is boring, and it works.</p>



<h3>3. Only write what Claude can&#8217;t figure out</h3>



<p>Claude can read your <code>package.json</code> and your folder tree. It doesn&#8217;t need you to repeat them. What it can&#8217;t see is the stuff that lives in your team&#8217;s heads.</p>



<p>Skip this:</p>



<pre class="wp-block-code"><code>- This is a React app
- We use TypeScript
- src/ contains the source code</code></pre>



<p>Write this instead:</p>



<pre class="wp-block-code"><code>- Never edit files in `src/generated/`. Run `pnpm codegen` to rebuild them.
- The staging database is shared. Don't run migrations against it.</code></pre>



<p>A simple test for every line: would Claude get this wrong without it? If not, cut it.</p>



<h3>4. Give the reason, not just the rule</h3>



<p>A rule with a reason helps Claude handle the cases you didn&#8217;t predict.</p>



<pre class="wp-block-code"><code># Weak
- Don't use Date.now() in tests

# Strong
- Don't use Date.now() in tests. Tests run on a frozen clock,
  so use `testClock.now()` or the test will pass locally and fail in CI.</code></pre>



<p>Now if Claude meets <code>new Date()</code> in a test, it knows that&#8217;s the same problem, even though you never mentioned it.</p>



<h3>5. Add a rule the second time you repeat yourself</h3>



<p>Don&#8217;t try to write the perfect file on day one. Start small and grow it from real friction. My rule: the second time I type the same correction into chat, it goes into CLAUDE.md. Anthropic&#8217;s docs suggest the same trigger, along with things a code review keeps catching.</p>



<p>When you want something saved there, say it plainly: &#8220;add this to CLAUDE.md.&#8221; If you just say &#8220;remember this,&#8221; Claude Code usually saves it to its own auto memory instead, which isn&#8217;t shared with your team.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h3>6. Use headings and short bullets</h3>



<p>Claude follows organized sections better than dense paragraphs. Group related rules under clear headings like Commands, Code style, Testing, and Gotchas. One rule per bullet. If a bullet needs three sentences, it probably belongs in its own file (see tip 8).</p>



<h3>7. Say what to do, not only what not to do</h3>



<p>&#8220;Don&#8217;t&#8221; on its own leaves Claude guessing what you want instead.</p>



<pre class="wp-block-code"><code># Leaves a gap
- Don't use axios

# Closes the gap
- Use the `apiClient` wrapper in `src/lib/api.ts` for HTTP calls, not axios.
  It adds auth headers and retries.</code></pre>



<h3>8. Split big projects into smaller, scoped files</h3>



<p>If your file keeps growing, don&#8217;t cram. Move rules that only matter for one area into <code>.claude/rules/</code>. You can tell a rule to load only for certain files using a <code>paths</code> header:</p>



<pre class="wp-block-code"><code>---
paths:
  - "src/api/**/*.ts"
---

# API rules
- Validate every request body with zod
- Return errors in the `{ error: { code, message } }` format</code></pre>



<p>This rule stays out of the way while Claude works on your CSS. It only shows up when Claude touches an API file. You can get a similar effect by dropping a CLAUDE.md into a subfolder.</p>



<p>One catch: <code>@path</code> imports help you organize, but they don&#8217;t save space. Imported files load together with the CLAUDE.md that imports them.</p>



<h3>9. Keep personal preferences out of the team file</h3>



<p>Your project CLAUDE.md is shared through git, so treat it like code. Your local database URL or &#8220;I like verbose explanations&#8221; don&#8217;t belong there.</p>



<ul><li>Personal, all projects: <code>~/.claude/CLAUDE.md</code></li><li>Personal, this project only: <code>CLAUDE.local.md</code> (and add it to <code>.gitignore</code>)</li></ul>



<h3>10. Know what CLAUDE.md can&#8217;t do</h3>



<p>CLAUDE.md is guidance, not a lock. Claude reads it and tries hard to follow it, but there&#8217;s no guarantee. If something must happen every single time, like running the linter after each edit or never touching <code>.env</code>, use a hook or a permission setting instead. Those run no matter what Claude decides.</p>



<p>And review the file every few weeks. Delete rules about code that no longer exists, and fix rules that contradict each other. When two rules conflict, Claude may pick either one. Running <code>/context</code> in a session shows which memory files actually loaded, which is the first thing to check when Claude seems to ignore you.</p>



<h2>A CLAUDE.md template you can copy</h2>



<p>Here&#8217;s a complete example for a typical web app. It&#8217;s about 35 lines, and every line is something Claude couldn&#8217;t work out alone. Swap in your own commands and gotchas.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="md" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Acme Dashboard

Next.js app for customer billing. Backend lives in a separate repo.

## Commands
- Install: `pnpm install`
- Dev server: `pnpm dev` (runs on port 4000, not 3000)
- Unit tests: `pnpm test:unit` (run before saying a task is done)
- Lint and types: `pnpm check`

## Code style
- Use named exports, not default exports
- Server code goes in `src/server/`, never import it from client components
- Use the `apiClient` in `src/lib/api.ts` for HTTP calls. It handles auth and retries.

## Testing
- Use `testClock.now()` instead of `Date.now()`. Tests run on a frozen clock.
- Mock the payment provider with `mockStripe()`. Never hit the real API in tests.

## Gotchas
- Don't edit `src/generated/`. Run `pnpm codegen` to rebuild it.
- Money is stored in cents as integers. Never use floats for amounts.
- The staging database is shared with QA. Ask before running migrations.

## Workflow
- Branch names: `feat/short-name` or `fix/short-name`
- Keep pull requests under 400 changed lines when you can

## More detail
- API conventions: @docs/api-conventions.md</pre>



<p>Notice what&#8217;s missing: no &#8220;write clean code,&#8221; no folder tree, no list of every dependency. Claude already knows those things or can look them up in seconds.</p>



<h2>How to check that your CLAUDE.md is loaded</h2>



<p>Before you blame Claude for ignoring your rules, make sure it can actually see them. It takes 10 seconds.</p>



<ol><li>Start Claude Code from your project folder.</li><li>Type <code>/context</code> and press Enter.</li><li>Look for the <strong>Memory files</strong> line. It shows how many instruction files loaded and how many tokens they use.</li></ol>



<figure class="wp-block-image size-full"><img loading="lazy" width="853" height="688" src="https://nolowiz.com/wp-content/uploads/2026/11/claude-code-claudemd.jpeg" alt=" Claude Code /context command output showing one CLAUDE.md memory file loaded" class="wp-image-7871" srcset="https://nolowiz.com/wp-content/uploads/2026/11/claude-code-claudemd.jpeg 853w, https://nolowiz.com/wp-content/uploads/2026/11/claude-code-claudemd-300x242.jpeg 300w, https://nolowiz.com/wp-content/uploads/2026/11/claude-code-claudemd-768x619.jpeg 768w, https://nolowiz.com/wp-content/uploads/2026/11/claude-code-claudemd-150x121.jpeg 150w" sizes="(max-width: 853px) 100vw, 853px" /></figure>



<p>From the screenshot we can see that memory files 1 file (1.7k tokens) loaded it is our CLAUDE.md file.</p>



<h2>Common CLAUDE.md mistakes to avoid</h2>



<p>Most broken CLAUDE.md files fail in one of these six ways. If Claude seems to ignore your file, check this list first.</p>



<ul><li><strong>Treating it like a README.</strong> A README explains the project to humans who skim. CLAUDE.md is read in full by Claude every session, so every line has to earn its place.</li><li><strong>Copying a giant template from the internet.</strong> A 500-line &#8220;ultimate CLAUDE.md&#8221; built for someone else&#8217;s project will bury the three rules that matter for yours.</li><li><strong>Vague advice.</strong> &#8220;Follow best practices&#8221; and &#8220;write maintainable code&#8221; are things Claude already tries to do. They take up space and change nothing.</li><li><strong>Rules that fight each other.</strong> &#8220;Always add tests&#8221; in one file and &#8220;skip tests for quick fixes&#8221; in another. Claude has to pick, and it may not pick the one you meant.</li><li><strong>Never updating it.</strong> A rule pointing at a file you deleted six months ago confuses Claude more than having no rule at all.</li><li><strong>Using it as a security guard.</strong> &#8220;Never delete production data&#8221; in CLAUDE.md is a polite request. A permission rule or hook is an actual wall.</li></ul>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>CLAUDE.md FAQ</h2>



<h3>How long should a CLAUDE.md file be?</h3>



<p>Under 200 lines per file. Anthropic recommends this because longer files use more context and Claude follows them less reliably. Most good project files I&#8217;ve seen land between 30 and 120 lines.</p>



<h3>What should I put in CLAUDE.md?</h3>



<p>Build and test commands, coding conventions that differ from the defaults, where key code lives, and project-specific gotchas. Leave out anything Claude can read from the code itself, like your folder structure or dependency list.</p>



<h3>Why does Claude ignore my CLAUDE.md?</h3>



<p>Usually the file is too long, the rules are too vague, or two rules contradict each other. Run <code>/context</code> to confirm the file loaded, then make each rule specific enough to check. For rules that must never be broken, use a hook instead.</p>



<h3>What&#8217;s the difference between CLAUDE.md and CLAUDE.local.md?</h3>



<p><code>CLAUDE.md</code> is shared with your team through git. <code>CLAUDE.local.md</code> is for your personal notes on one project, and you add it to <code>.gitignore</code> so it stays on your machine.</p>



<h3>Can I use AGENTS.md instead of CLAUDE.md?</h3>



<p>Yes. Recent versions of Claude Code read <code>AGENTS.md</code> when a project has no CLAUDE.md. If you keep both, add <code>@AGENTS.md</code> at the top of your CLAUDE.md so the shared rules load once.</p>



<h3>Should I commit CLAUDE.md to git?</h3>



<p>Yes, commit the project file so the whole team gets the same instructions. Review changes to it in pull requests the same way you review code</p>



<h2>Conclusion</h2>



<p>You don&#8217;t need a perfect CLAUDE.md today. Run <code>/init</code>, delete anything Claude could figure out on its own, and keep the commands and gotchas. Then add one line every time you catch yourself repeating a correction.</p>



<p>In a month, you&#8217;ll have a short file that makes Claude feel like it actually knows your project. That&#8217;s worth more than any clever prompt. <a href="https://nolowiz.com/spec-driven-development-problems-and-best-practices/" target="_blank" rel="noreferrer noopener">Spec driven development best practices</a> .</p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fhow-to-write-a-better-claude-md-file-best-practices%2F&amp;linkname=How%20to%20Write%20a%20Better%20CLAUDE.md%20File%3A%20Best%20Practices" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fhow-to-write-a-better-claude-md-file-best-practices%2F&amp;linkname=How%20to%20Write%20a%20Better%20CLAUDE.md%20File%3A%20Best%20Practices" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fhow-to-write-a-better-claude-md-file-best-practices%2F&amp;linkname=How%20to%20Write%20a%20Better%20CLAUDE.md%20File%3A%20Best%20Practices" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fhow-to-write-a-better-claude-md-file-best-practices%2F&amp;linkname=How%20to%20Write%20a%20Better%20CLAUDE.md%20File%3A%20Best%20Practices" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fhow-to-write-a-better-claude-md-file-best-practices%2F&#038;title=How%20to%20Write%20a%20Better%20CLAUDE.md%20File%3A%20Best%20Practices" data-a2a-url="https://nolowiz.com/how-to-write-a-better-claude-md-file-best-practices/" data-a2a-title="How to Write a Better CLAUDE.md File: Best Practices"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/how-to-write-a-better-claude-md-file-best-practices/">How to Write a Better CLAUDE.md File: Best Practices</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Spec-Driven Development: Problems and Best Practices</title>
		<link>https://nolowiz.com/spec-driven-development-problems-and-best-practices/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Sun, 08 Nov 2026 12:25:26 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7837</guid>

					<description><![CDATA[<p>Picture this. You ask an AI coding agent to &#8220;add a password reset feature.&#8221; Ten minutes later you have 600 lines of code. It sends reset links that never expire. It emails the user&#8217;s old password in plain text. It even adds a new database table you never asked for. The agent did not fail. ... <a title="Spec-Driven Development: Problems and Best Practices" class="read-more" href="https://nolowiz.com/spec-driven-development-problems-and-best-practices/" aria-label="More on Spec-Driven Development: Problems and Best Practices">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/spec-driven-development-problems-and-best-practices/">Spec-Driven Development: Problems and Best Practices</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Picture this. You ask an AI coding agent to &#8220;add a password reset feature.&#8221; Ten minutes later you have 600 lines of code. It sends reset links that never expire. It emails the user&#8217;s old password in plain text. It even adds a new database table you never asked for.</p>



<p>The agent did not fail. Your instructions did. The agent filled every gap with a guess.That is the problem spec-driven development tries to solve. You write down what to build before anyone (human or AI) writes code. The agent then builds from the spec instead of from a one-line prompt.</p>



<p>It works. But it also brings its own set of problems. Specs grow too long. They go out of date. Nobody reads them. In this post, we look at the 11 problems teams hit most often, and a simple fix for each.</p>



<p>Quick answer: Spec-driven development works best when specs are short, testable and updated together with the code. Most failures happen when teams treat the spec as a big upfront document instead of a living contract.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>What is spec-driven development?</h2>



<p>Spec-driven development (SDD) means you agree on what the software must do before you build it. The spec is the contract. The code is how you keep it.</p>



<p>With &#8220;vibe coding,&#8221; you type a prompt, look at the result and keep nudging. That is fine for a weekend project. On a real product, the guesses add up.</p>



<p>Tools like <a target="_blank" rel="noreferrer noopener" href="https://github.github.com/spec-kit/">GitHub Spec Kit</a> turn SDD into a repeatable flow. Its core process has four phases, and each one produces a Markdown file that feeds the next:</p>



<ol><li><strong>Spec:</strong> what to build and why.</li><li><strong>Plan:</strong> how to build it (stack, design, constraints).</li><li><strong>Tasks:</strong> small, ordered pieces of work.</li><li><strong>Implement:</strong> the agent writes code, one task at a time.</li></ol>



<p>Other tools, such as Kiro, follow a similar idea.</p>



<h3>A simple example spec</h3>



<p>Here is a short spec for the password reset feature from our story:</p>



<pre class="wp-block-code"><code># Password reset

## Behaviour
- A user enters their email on the "Forgot password" page.
- If the email exists, we send a reset link. If not, we show the same message.
- The link works once and expires after 30 minutes.
- We never send or show the old password.

## Acceptance criteria
- An expired link shows "This link has expired."
- A used link cannot be used again.
- The response time is the same for known and unknown emails.

## Open questions
- Do we log the user out of other devices after a reset?</code></pre>



<p>It fits on one screen. Every line is something you can test. And the agent now knows the two rules it broke earlier: links expire, and passwords never travel by email.</p>



<h2>Common spec-driven development problems and fixes</h2>



<p>The same pitfalls show up again and again. The good news: each one has a simple fix.</p>



<h3>1. Waterfall creep</h3>



<p>The team writes the whole spec before anyone builds anything. Feedback arrives late, when changes are expensive.</p>



<p><strong>Example:</strong> You spend two weeks on a 20-page spec for a new checkout. On day one of coding, you learn the payment provider does not support your refund flow.</p>



<p><strong>Fix:</strong> Keep specs short. Build a thin slice early. Let the spec change as you learn.</p>



<h3>2. Spec drift</h3>



<p>The code changes, but the spec does not. The agent then follows old instructions.</p>



<p><strong>Example:</strong> The spec says &#8220;links expire after 30 minutes.&#8221; A developer changes it to 15 in the code. Next month, the agent &#8220;fixes&#8221; it back to 30.</p>



<p><strong>Fix:</strong> Update the spec in the same pull request as the code. Reviewers flag any mismatch.</p>



<h3>3. Verbose, AI-padded specs</h3>



<p>An AI tool writes ten pages of polite Markdown. Nobody reads it. Reviewers approve it anyway.</p>



<p><strong>Example:</strong> &#8220;The system shall provide a seamless and intuitive experience for users.&#8221; This sentence takes space and says nothing you can test.</p>



<p><strong>Fix:</strong> Set length limits per section. Write decisions, not prose.</p>



<h3>4. Review overload</h3>



<p>People review the PRD, the spec, the test plan, the task list and the code. Review becomes the bottleneck.</p>



<p><strong>Example:</strong> A small feature waits three days because five documents need sign-off.</p>



<p><strong>Fix:</strong> Review only at agreed gates. At each gate, review only what changed.</p>



<h3>5. False precision</h3>



<p>A detailed spec looks confident. But it hides assumptions that nobody tested.</p>



<p><strong>Example:</strong> The spec says &#8220;search returns results in 200 ms.&#8221; Nobody checked how slow the search service is with real data.</p>



<p><strong>Fix:</strong> Add two required sections: Open questions and Assumptions. Prototype the riskiest part first.</p>



<h3>6. The agent ignores the spec</h3>



<p>The agent skims a long spec and drifts in the middle of the task.</p>



<p><strong>Example:</strong> You paste a 15-page spec and ask for the login page. The agent also &#8220;improves&#8221; the signup page.</p>



<p><strong>Fix:</strong> Give the agent one small task at a time, with only the spec section it needs.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h3>7. Context bloat</h3>



<p>Too many documents fill the agent&#8217;s context window. The quality of its output drops.</p>



<p><strong>Example:</strong> The agent gets the PRD, three old specs and the full style guide just to rename a button.</p>



<p><strong>Fix:</strong> Each step reads only the files it needs.</p>



<h3>8. One process for everything</h3>



<p>A one-line fix goes through the full process. People start to skip the process completely.</p>



<p><strong>Example:</strong> Fixing a typo on the About page needs a spec, a plan and a test plan. So developers stop using the flow.</p>



<p><strong>Fix:</strong> Offer light, standard and full paths. Track how often people skip the process.</p>



<h3>9. Duplication</h3>



<p>The same detail lives in the PRD, the spec, the tasks and the code comments. Soon they disagree.</p>



<p><strong>Example:</strong> The PRD says passwords need 8 characters. The spec says 10. The code says 12. Which one is true?</p>



<p><strong>Fix:</strong> Give each fact one home. Link to it instead of copying it.</p>



<h3>10. Over-specifying the &#8220;how&#8221;</h3>



<p>The spec tells the engineer or agent exactly how to write the code. They often know a better way.</p>



<p><strong>Example:</strong> &#8220;Use a for-loop to check each email in the list.&#8221; The spec should say &#8220;Reject duplicate emails&#8221; and stop there.</p>



<p><strong>Fix:</strong> Specify behaviour, interfaces and constraints. Leave the implementation open.</p>



<h3>11. No learning loop</h3>



<p>The same mistakes repeat from one feature to the next.</p>



<p><strong>Example:</strong> Three features in a row miss error messages for empty forms.</p>



<p><strong>Fix:</strong> Hold short retros. Each retro must change at least one template, skill or checklist.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Spec-driven development best practices</h2>



<p>The fixes above solve single problems. The habits below stop most of them from happening in the first place.</p>



<h3>Writing the spec</h3>



<ol><li><strong>Specify behaviour, not code.</strong> Say what the system does, its interfaces and its limits. Let the engineer or agent choose how.</li><li><strong>Make every requirement testable.</strong> Each acceptance criterion maps to at least one test.</li><li><strong>Record decisions, not discussion.</strong> Keep a short decisions log: the choice and the reason. That beats pages of meeting notes.</li><li><strong>Name what you don&#8217;t know.</strong> End every spec with Open questions and Assumptions. Later steps treat assumptions as unconfirmed.</li><li><strong>Set length limits.</strong> For example, one page for a standard feature and three for a large one. Longer than that? Split the feature.</li></ol>



<p>Here is what &#8220;testable&#8221; looks like in practice:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="428" src="https://nolowiz.com/wp-content/uploads/2026/11/vague-vs-testable-requirements-1024x428.png" alt="Vague vs testable " class="wp-image-7844" srcset="https://nolowiz.com/wp-content/uploads/2026/11/vague-vs-testable-requirements-1024x428.png 1024w, https://nolowiz.com/wp-content/uploads/2026/11/vague-vs-testable-requirements-300x126.png 300w, https://nolowiz.com/wp-content/uploads/2026/11/vague-vs-testable-requirements-768x321.png 768w, https://nolowiz.com/wp-content/uploads/2026/11/vague-vs-testable-requirements-1536x643.png 1536w, https://nolowiz.com/wp-content/uploads/2026/11/vague-vs-testable-requirements-2048x857.png 2048w, https://nolowiz.com/wp-content/uploads/2026/11/vague-vs-testable-requirements-150x63.png 150w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3>Working with AI agents</h3>



<ol><li><strong>Hand over one task at a time,</strong> with only the spec section that task needs.</li><li><strong>Write tests before code.</strong> Agree on the test plan first. Then ask the agent to make those tests pass.</li><li><strong>Let the agent flag gaps, not fill them.</strong> When the agent finds a hole in the spec, it writes it down and stops for a decision.</li><li><strong>Keep shared context in one place.</strong> Coding conventions live in one file (for example, CLAUDE.md or AGENTS.md), not in every spec.</li></ol>



<p>A simple instruction for point 3: <em>&#8220;If the spec does not cover a case, do not guess. Add it to Open questions and stop.&#8221;</em></p>



<h3>Keeping specs alive</h3>



<ol><li><strong>Change the spec and the code together.</strong> A pull request that changes behaviour also updates the spec.</li><li><strong>Build a thin slice early.</strong> Prove the riskiest part first. Then update the spec with what you learned.</li><li><strong>Give each fact one home.</strong> Link between documents instead of copying.</li><li><strong>Review the diff, not the document.</strong> At each gate, reviewers look only at what changed since the last approval.</li><li><strong>Feed retros back.</strong> Every retro changes at least one template, skill or checklist.</li></ol>



<h3>Right-size the spec to the change</h3>



<p>Not every change needs a spec. Too little spec causes rework. Too much spec makes people skip the process.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="447" src="https://nolowiz.com/wp-content/uploads/2026/11/spec-driven-development-right-size-spec-1024x447.png" alt="Spec driven development right size" class="wp-image-7849" srcset="https://nolowiz.com/wp-content/uploads/2026/11/spec-driven-development-right-size-spec-1024x447.png 1024w, https://nolowiz.com/wp-content/uploads/2026/11/spec-driven-development-right-size-spec-300x131.png 300w, https://nolowiz.com/wp-content/uploads/2026/11/spec-driven-development-right-size-spec-768x335.png 768w, https://nolowiz.com/wp-content/uploads/2026/11/spec-driven-development-right-size-spec-1536x671.png 1536w, https://nolowiz.com/wp-content/uploads/2026/11/spec-driven-development-right-size-spec-2048x894.png 2048w, https://nolowiz.com/wp-content/uploads/2026/11/spec-driven-development-right-size-spec-150x66.png 150w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2>FAQ</h2>



<h3>Is spec-driven development the same as waterfall?</h3>



<p>No. Waterfall writes everything up front and rarely goes back. Spec-driven development keeps the spec short and updates it as you build. The spec is a living contract, not a one-time document.</p>



<h3>Do I need a spec for every change?</h3>



<p>No. A bug fix or a text change needs only a clear ticket. Save full specs for large or risky work, such as payments, login or public APIs.</p>



<h3>How long should a spec be?</h3>



<p>About one page for a standard feature. Up to three pages for a large one. If it gets longer, split the feature into smaller parts.</p>



<h3>Why do AI coding agents ignore long specs?</h3>



<p>An agent has a limited context window. When you give it too much text, the important rules get lost. Give it one task and only the spec section that task needs.</p>



<h3>What tools support spec-driven development?</h3>



<p>GitHub Spec Kit and Kiro are two popular options. But you can start with a plain Markdown file in your repo. The habits matter more than the tool.</p>



<h2>Final thoughts</h2>



<p>Spec-driven development is not about writing more documents. It is about writing the right few lines, so that people and AI agents build the same thing.</p>



<p>Start small. Pick your next standard feature. Write a one-page spec with testable acceptance criteria and an Open questions section. Hand it to your agent one task at a time, and see what changes.</p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fspec-driven-development-problems-and-best-practices%2F&amp;linkname=Spec-Driven%20Development%3A%20Problems%20and%20Best%20Practices" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fspec-driven-development-problems-and-best-practices%2F&amp;linkname=Spec-Driven%20Development%3A%20Problems%20and%20Best%20Practices" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fspec-driven-development-problems-and-best-practices%2F&amp;linkname=Spec-Driven%20Development%3A%20Problems%20and%20Best%20Practices" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fspec-driven-development-problems-and-best-practices%2F&amp;linkname=Spec-Driven%20Development%3A%20Problems%20and%20Best%20Practices" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fspec-driven-development-problems-and-best-practices%2F&#038;title=Spec-Driven%20Development%3A%20Problems%20and%20Best%20Practices" data-a2a-url="https://nolowiz.com/spec-driven-development-problems-and-best-practices/" data-a2a-title="Spec-Driven Development: Problems and Best Practices"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/spec-driven-development-problems-and-best-practices/">Spec-Driven Development: Problems and Best Practices</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What Is a CRAP Score? Why It Matters for AI Generated Code</title>
		<link>https://nolowiz.com/what-is-a-crap-score-why-it-matters-for-ai-generated-code/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Sun, 01 Nov 2026 12:22:11 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7804</guid>

					<description><![CDATA[<p>The CRAP score is one number that tells you how risky a function is to change. It looks at two things: how complex the code is, and how much of it your tests check. Think about a normal day with an AI coding assistant. You ask for a discount function. You get 60 lines in ... <a title="What Is a CRAP Score? Why It Matters for AI Generated Code" class="read-more" href="https://nolowiz.com/what-is-a-crap-score-why-it-matters-for-ai-generated-code/" aria-label="More on What Is a CRAP Score? Why It Matters for AI Generated Code">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/what-is-a-crap-score-why-it-matters-for-ai-generated-code/">What Is a CRAP Score? Why It Matters for AI Generated Code</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The CRAP score is one number that tells you how risky a function is to change. It looks at two things: how complex the code is, and how much of it your tests check. </p>



<p>Think about a normal day with an AI coding assistant. You ask for a discount function. You get 60 lines in ten seconds. The code compiles. The tests pass. You approve the pull request. Three weeks later, a teammate changes one line in that function. Checkout breaks for one type of customer. Nobody knows why, because no test covered that path.</p>



<p>The code was not &#8220;wrong&#8221;. It was risky. The CRAP score gives that risk a number, so you can see it before it causes a problem.</p>



<h2>What is the CRAP score?</h2>



<p>CRAP means Change Risk Anti-Patterns. It is a code metric that gives each function (or method) a risk score. A high score tells you: &#8220;This code is difficult to understand, and the tests do not protect it.&#8221; Alberto Savoia and Bob Evans made the metric in 2007. The first tool was Crap4j, for Java. Yes, the name is a joke on purpose. Developers often say &#8220;this code is crap&#8221; with no data. Savoia wanted to give that feeling a real number. </p>



<p>The score uses two inputs.</p>



<ol><li><strong>Cyclomatic complexity (CC).</strong> This is the number of different paths through a function. Each <code>if</code>, <code>else if</code>, loop, <code>case</code> or <code>&amp;&amp;</code> adds a path. A function with no decisions has a CC of 1. A good quick rule: count the decisions, then add 1.</li><li><strong>Code coverage.</strong> This is the percentage of the function that your automated tests run. If the tests run every line and branch, coverage is 100%. If no test calls the function, coverage is 0%.</li></ol>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<p>Complex code is not bad by itself. Untested code is not always dangerous by itself. The danger starts when you have both at the same time. The CRAP score finds that combination.</p>



<p>The formula is short. It looks harder than it is.</p>



<p style="text-align:center; font-size:1.3em; font-family:Georgia, 'Times New Roman', serif; margin:1.5em 0;">
  CRAP(<i>m</i>) = comp(<i>m</i>)<sup>2</sup> × (1 − cov(<i>m</i>) ⁄ 100)<sup>3</sup> + comp(<i>m</i>)
</p>



<p>Here, <strong>m</strong> is one method or function, <strong>comp(m)</strong> is its cyclomatic complexity, and <strong>cov(m)</strong> is its test coverage as a percentage. Two facts make the formula easy to remember:</p>



<ul><li>At 100% coverage, the CRAP score is equal to CC<strong>.</strong> The first part becomes zero. Only the complexity stays.</li><li>At 0% coverage, the CRAP score is CC² + CC<strong>.</strong> The score grows very fast as complexity goes up.</li></ul>



<h2>What is a good CRAP score?</h2>



<p>The original Crap4j tool uses <strong>30</strong> as the limit. A function above 30 is &#8220;crappy&#8221;. Many tools, such as NDepend and cargo-crap, use the same default. A practical rule of thumb:</p>



<p>A practical rule of thumb:</p>



<ul><li><strong>1 to 5 (low risk):</strong> Nothing to do. Keep it this way.</li><li><strong>6 to 30 (acceptable, but watch it):</strong> Add tests when you next touch it.</li><li><strong>Above 30 (high change risk):</strong> Add tests or simplify before the next change.</li></ul>



<h3></h3>



<p></p>



<h4>Example 1: A tiny function</h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
def is_adult(age):
    return age &gt;= 18
</pre></div>


<p>This function has no <code>if</code> and no loop. CC = 1. One test checks it, so coverage = 100%. CRAP = 1² × 0³ + 1 = <strong>1</strong>. This is the lowest possible score. Nothing to worry about.</p>



<h4>Example 2: A shipping fee function with no tests</h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
def shipping_fee(weight, country, express, member):
    if member:              # decision 1
        return 0
    fee = 50
    if weight &gt; 5:          # decision 2
        fee += 30
    if country != &quot;IN&quot;:     # decision 3
        fee += 200
    if express:             # decision 4
        fee *= 2
    if fee &gt; 500:           # decision 5
        fee = 500
    return fee
</pre></div>


<p>There are 5 decisions, so CC = 5 + 1 = <strong>6</strong>. This is a very normal function. You see code like this every day. Now look at what tests do to the score:</p>



<ul><li><strong>0% coverage:</strong> 6² × 1³ + 6 = 36 + 6 = <strong>42</strong>. Above 30. High risk.</li><li><strong>50% coverage:</strong> 36 × 0.5³ + 6 = 36 × 0.125 + 6 = <strong>10.5</strong>. Acceptable.</li><li><strong>100% coverage:</strong> 36 × 0 + 6 = <strong>6</strong>. Low risk.</li></ul>



<p>The code did not change at all. Only the tests changed. The score dropped from 42 to 6. That is the main idea of the CRAP score: tests make complexity safe to change.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h4 id="example-3-a-big-function-that-grew-over-time">Example 3: A big function that grew over time</h4>



<p>Imagine an order validation function with 11 decisions. CC = 12.</p>



<ul><li><strong>0% coverage:</strong> 144 + 12 = <strong>156</strong>. Very high risk.</li><li><strong>80% coverage:</strong> 144 × 0.2³ + 12 = 144 × 0.008 + 12 = <strong>13.15</strong>. Acceptable.</li></ul>



<p>Good tests bring this function back to a safe level. But you need many tests to cover 12 paths.</p>



<h4 id="example-4-a-monster-function">Example 4: A monster function</h4>



<p>Now imagine a function with CC = 35. You write tests for every path. Coverage = 100%.</p>



<p>CRAP = 35. <strong>It is still above 30.</strong></p>



<p>This is not a mistake in the formula. It is a message: &#8220;Tests alone cannot save this function. Break it into smaller functions.&#8221; Any function with a CC above 30 always fails, even with full coverage.</p>



<h2 id="why-the-crap-score-matters-in-ai-assisted-coding">Why the CRAP score matters in AI-assisted coding</h2>



<p>AI tools write code faster than humans can review it. The CRAP score gives you an objective check that does not get tired, does not trust the code because it &#8220;looks right&#8221;, and does not care who wrote it.</p>



<p>The metric is almost 20 years old, but in 2026 it got a second life. Developers started to use it as a guard rail for code from AI agents. The Rust tool <a target="_blank" rel="noreferrer noopener" href="https://minikin.me/blog/cargo-crap">cargo-crap</a>, for example, was built for this purpose.</p>



<h3 id="1-ai-code-often-adds-extra-paths">1. AI code often adds extra paths</h3>



<p>An AI assistant likes to be safe. It adds a null check here, a fallback there, a try/except &#8220;just in case&#8221;, and one more <code>if</code> for an edge case you did not ask about. Each one adds a path. Each path adds cyclomatic complexity.</p>



<p>One change at a time, the function becomes harder to understand. The code still compiles. The old tests still pass. But the function is now harder to change safely.</p>



<h3 id="2-ai-tests-can-raise-coverage-without-checking-much">2. AI tests can raise coverage without checking much</h3>



<p>Ask an AI to &#8220;add tests&#8221;, and you sometimes get tests that call the function but check very little. Coverage goes up. Real protection does not.</p>



<p>This puts AI code in the most dangerous zone: high complexity and weak tests. That is exactly the zone the CRAP score measures. <a target="_blank" rel="noreferrer noopener" href="https://www.managed-code.com/blog-post/ai-slop-in-code">Managed Code</a> makes the same point: the metric maps almost directly onto how AI code fails.</p>



<h3 id="3-human-review-trusts-code-that-looks-plausible">3. Human review trusts code that looks plausible</h3>



<p>AI code is usually clean, well named and well formatted. A busy reviewer reads it and thinks, &#8220;Looks fine.&#8221; Linters pass. The build passes.</p>



<p>None of these checks ask, &#8220;Is this complex path tested?&#8221; The CRAP score does. As the <a target="_blank" rel="noreferrer noopener" href="https://betterstack.com/community/guides/ai/crap-metric">Better Stack guide</a> explains, a CRAP limit in CI catches untested complexity whether a human or a tool wrote it.</p>



<h3 id="4-a-score-is-a-perfect-prompt-for-the-ai">4. A score is a perfect prompt for the AI</h3>



<p>This is the part many teams miss. A CRAP report is small and exact: the file, the function, the line number, the score. You can give it straight back to the AI agent as a task.</p>



<p>For example:</p>



<blockquote class="wp-block-quote"><p>The function <code>shipping_fee</code> in <code>pricing.py</code> has a CRAP score of 42 (complexity 6, coverage 0%). Write unit tests that cover every branch. Each test must assert the returned fee. Do not change the function.</p></blockquote>



<p>The AI now has a clear, measurable goal. You run the check again and see if the score went down. No long discussion needed.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<p><strong>Tip for old codebases:</strong> do not block every function above 30 on day one. You will stop all feature work. Instead, save today&#8217;s scores as a baseline. Then block only new functions above 30, and any function whose score goes up. This is called a &#8220;ratchet&#8221;. The code can only get better over time.</p>



<h2>How to lower a high CRAP score</h2>



<p>Good ways to simplify a function:</p>



<ul><li><strong>Extract small functions.</strong> Move each separate job into its own function with a clear name.</li><li><strong>Use guard clauses.</strong> Return early for the special cases. This removes deep nesting.</li><li><strong>Replace long if/else chains with a lookup table.</strong> A dictionary of rates is easier to read and test than ten <code>elif</code> lines.</li><li><strong>Delete &#8220;just in case&#8221; code.</strong> AI often adds fallbacks for cases that can never happen. Remove them.</li></ul>



<h2 id="final-thoughts">Final thoughts</h2>



<p>AI has changed how fast we write code. It has not changed what makes code safe to change: simple logic and tests that really check it.</p>



<p>The CRAP score puts those two ideas into one honest number. It is old, simple and a little rude. That is exactly why it works so well today. Add it to your CI, give its reports back to your AI assistant, and let the number do the arguing for you.</p>



<p>Start small. Pick one service, run the check this week, and look at your top five scores. You will probably be surprised by what you find.</p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fwhat-is-a-crap-score-why-it-matters-for-ai-generated-code%2F&amp;linkname=What%20Is%20a%20CRAP%20Score%3F%20Why%20It%20Matters%20for%20AI%20Generated%20Code" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fwhat-is-a-crap-score-why-it-matters-for-ai-generated-code%2F&amp;linkname=What%20Is%20a%20CRAP%20Score%3F%20Why%20It%20Matters%20for%20AI%20Generated%20Code" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fwhat-is-a-crap-score-why-it-matters-for-ai-generated-code%2F&amp;linkname=What%20Is%20a%20CRAP%20Score%3F%20Why%20It%20Matters%20for%20AI%20Generated%20Code" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fwhat-is-a-crap-score-why-it-matters-for-ai-generated-code%2F&amp;linkname=What%20Is%20a%20CRAP%20Score%3F%20Why%20It%20Matters%20for%20AI%20Generated%20Code" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fwhat-is-a-crap-score-why-it-matters-for-ai-generated-code%2F&#038;title=What%20Is%20a%20CRAP%20Score%3F%20Why%20It%20Matters%20for%20AI%20Generated%20Code" data-a2a-url="https://nolowiz.com/what-is-a-crap-score-why-it-matters-for-ai-generated-code/" data-a2a-title="What Is a CRAP Score? Why It Matters for AI Generated Code"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/what-is-a-crap-score-why-it-matters-for-ai-generated-code/">What Is a CRAP Score? Why It Matters for AI Generated Code</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Jev vs LLMs: A Practical Introduction to TypeSafe AI’s System One Model</title>
		<link>https://nolowiz.com/jev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Sat, 19 Sep 2026 11:32:40 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7562</guid>

					<description><![CDATA[<p>In this article we will disscuss abou type safe AI&#8217; first system one model called Jev. What is System One Model? As per TypeSafe AI&#8217;s definition &#8211; a System One model is an AI model designed to make fast, structured decisions by evaluating a given state and returning predefined, typed answers with associated probabilities that ... <a title="Jev vs LLMs: A Practical Introduction to TypeSafe AI’s System One Model" class="read-more" href="https://nolowiz.com/jev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model/" aria-label="More on Jev vs LLMs: A Practical Introduction to TypeSafe AI’s System One Model">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/jev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model/">Jev vs LLMs: A Practical Introduction to TypeSafe AI’s System One Model</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In this article we will disscuss abou type safe AI&#8217; first system one model called Jev.</p>



<h2>What is System One Model?</h2>



<p>As per TypeSafe AI&#8217;s definition &#8211; a System One model is an AI model designed to make fast, structured decisions by evaluating a given state and returning predefined, typed answers with associated probabilities that software can use directly.</p>



<p>Like an LLM, a System One model can understand natural-language input, but instead of generating free-form text, it produces structured, typed decisions along with their probabilities.</p>



<h2>So what is Jev?</h2>



<p>Jev is <a href="https://typesafe.ai/" target="_blank" rel="noreferrer noopener">TypeSafe</a> AI’s flagship model and the first System One model.As of now Jev only support text input,ouput and Jev was announced September 14, 2026 and is currently in early access.</p>



<p>Large language models(LLM) are excellent at generating text, code,and conversations. But many software systems don&#8217;t need a paragraph of text they need a decision. For example :</p>



<pre class="wp-block-code"><code>Is this transaction suspicious?
Which department should handle this ticket?
Should an agent click, wait, or ask for help?</code></pre>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<p>TypeSafe AI&#8217;s Jev is designed specifically for this kind of problem.</p>



<ul><li><strong>Faster decisions</strong> &#8211; Jev produces structured decisions directly instead of generating long responses token by token.</li><li><strong>Lower cost</strong> &#8211; TypeSafe reports significantly lower costs for decision-oriented workloads compared with LLM-based workflows.</li><li><strong>Type-safe outputs</strong> &#8211; Responses stay within the predefined decision space, making them easier and safer for software to consume.</li><li><strong>Reduced risk of invalid or fabricated outputs</strong> &#8211; Jev returns decisions from a predefined output space instead of generating unrestricted text.</li><li><strong>Probabilities included</strong> &#8211; Jev returns probabilities with its decisions, allowing applications to set confidence thresholds or trigger human review.</li></ul>



<h2>How Jev Differs from an LLM</h2>



<p>Both Jev and large language models can understand natural-language input, but they are designed for different purposes. An LLM is primarily designed to generate content such as text, code, summaries, explanations, and conversations. It produces its response by generating tokens sequentially.</p>



<p>Jev, on the other hand, is designed to make structured decisions. Instead of generating free-form text, it evaluates the given state and returns typed answers together with probabilities.</p>



<p>For example, Imagine an online shopping platform receives this customer message:</p>



<pre class="wp-block-code"><code>"My order was supposed to arrive yesterday, but tracking still says it is at the sorting center. I need it before tomorrow."</code></pre>



<p>An LLM could generate an explanation such as: </p>



<pre class="wp-block-code"><code>Your order appears to be delayed in transit. I recommend checking with the delivery partner or contacting customer support for an updated delivery estimate.</code></pre>



<p>This is useful when the application needs to communicate with the customer.</p>



<p>Jev could instead evaluate the same message and make decisions that the application can use directly:</p>



<pre class="wp-block-code"><code>Issue type:

DELIVERY_DELAY        0.94
LOST_PACKAGE          0.04
WRONG_ITEM            0.01
PAYMENT_ISSUE         0.01

Priority:

HIGH                  0.82
MEDIUM                0.17
LOW                   0.01

Escalate to support:

TRUE                  0.89
FALSE                 0.11</code></pre>



<p>The application could then automatically route the request to the appropriate workflow without first asking a language model to generate and parse a textual response.</p>



<p>Another example is an AI agent deciding what to do next:</p>



<pre class="wp-block-code"><code>Current state: 
 A login page is open. 
 The username has been entered. 
 The password field is empty.</code></pre>



<p>Instead of generating an explanation, Jev could return:</p>



<pre class="wp-block-code"><code>Next action:

TYPE_PASSWORD 0.96 
CLICK_LOGIN   0.02 
WAIT          0.01 
SCROLL        0.01</code></pre>



<p>The key difference is that Jev is not trying to describe what should happen. It is producing a decision that software can act on directly.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="683" src="https://nolowiz.com/wp-content/uploads/2026/09/LLM-vs-Jev-1024x683.png" alt="Jev model vs LLM " class="wp-image-7590" srcset="https://nolowiz.com/wp-content/uploads/2026/09/LLM-vs-Jev-1024x683.png 1024w, https://nolowiz.com/wp-content/uploads/2026/09/LLM-vs-Jev-300x200.png 300w, https://nolowiz.com/wp-content/uploads/2026/09/LLM-vs-Jev-768x512.png 768w, https://nolowiz.com/wp-content/uploads/2026/09/LLM-vs-Jev-150x100.png 150w, https://nolowiz.com/wp-content/uploads/2026/09/LLM-vs-Jev.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2>When to Use Jev?</h2>



<p>Jev is a good fit when your application needs to make a fast, structured decision from a known set of possible outcomes rather than generate free-form text.</p>



<p>Typical scenarios include:</p>



<ul><li><strong>Request routing</strong> &#8211; decide which team, service, or AI tool should handle a request.</li><li><strong>Classification</strong> &#8211; categorize support tickets, logs, documents, alerts, or user inputs.</li><li><strong>Risk assessment</strong> &#8211; classify an event as low, medium, or high risk.</li><li><strong>AI agent actions</strong> &#8211; choose between actions such as CLICK, TYPE, SCROLL, WAIT, or STOP.</li><li><strong>Fraud or security triage</strong> &#8211; decide whether an event should be allowed, reviewed, or blocked.</li><li><strong>Software issue triage</strong> &#8211; determine whether a bug belongs to the frontend, backend, DevOps, or another component.</li><li><strong>Workflow decisions</strong> &#8211; decide whether to approve, reject, retry, escalate, or request human review.</li><li><strong>LLM output evaluation</strong> &#8211; determine whether an LLM response should be accepted, verified, or regenerated.</li></ul>



<p>A simple rule of thumb is: Use an LLM when you need generation. Use Jev when you need a structured decision.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Question Types</h2>



<p>A question defines one judgment for a System One model to make about a state, and its answer is the typed value that comes back. Jev supports 3 types of questions :</p>



<h3>1. Noul </h3>



<p>Noul is Jev’s binary question type, used to return a yes/no decision with probabilities.</p>



<p>For exampe : </p>



<p><strong>State</strong> :<em> I have asked three times now. Can I please just talk to a real person?</em></p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
"is_human_escalation": {
"type": "noul",
"instructions": "Is the customer asking for a human agent?"
}
}
﻿</pre>



<pre class="wp-block-code"><code>
</code></pre>



<p>Response :</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "model": "jev-1.13.0",
  "answers": {
    "is_human_escalation": {
      "type": "noul",
      "noul": 0.99,
      "stats": {}
    }
  },
  "usage": {
    "input_tokens": 292,
    "output_tokens": 25
  },
  "request_id": "playground_12a2dc9dd9f61fd45e3b9cd331cbf86202f",
  "evaluation_time_ms": 123.22871299693361
}</pre>



<h2>2. Choice </h2>



<p>Choice is Jev’s multiple-option question type, used to select the most likely answer from a predefined set of choices.</p>



<p>For example :</p>



<p><strong>State </strong>:<em> My running shoes arrived in the wrong size. Can I swap them for a size 10?</em></p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "department": {
    "type": "choice",
    "instructions": "Which team should handle this?",
    "criteria": {
      "returns": "Exchanges, refunds, wrong or damaged items",
      "shipping": "Delivery status, delays, lost packages",
      "billing": "Charges, invoices, payment problems"
    }
  }
}</pre>



<p>Response :</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "model": "jev-1.13.0",
  "answers": {
    "department": {
      "type": "choice",
      "choice": "returns",
      "confidence": 1,
      "probabilities": {
        "billing": 0,
        "shipping": 0,
        "returns": 1
      },
      "stats": {}
    }
  },
  "usage": {
    "input_tokens": 359,
    "output_tokens": 38
  },
  "request_id": "playground_12a4a0be1a1d3134b568e426ab1e67d5614",
  "evaluation_time_ms": 111.01627499738242
}</pre>



<h3>3. Score</h3>



<p>Score is Jev’s rating question type, used to assign a value on a defined scale based on the given state.</p>



<p>For example :</p>



<p>State : <em>The export button crashes the settings page in Safari. It works in Chrome, but a few of our customers only use Safari.</em></p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "bug_severity": {
    "type": "score",
    "instructions": "How severe is the reported issue?",
    "criteria": [
      "Cosmetic; no impact to functionality",
      "Broken or degraded feature, but workaround exists",
      "Blocking issue; no workaround exists"
    ]
  }
}</pre>



<p>Response :</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "model": "jev-1.13.0",
  "answers": {
    "bug_severity": {
      "type": "score",
      "score": 1.46,
      "legend": {
        "0": "Cosmetic; no impact to functionality",
        "1": "Broken or degraded feature, but workaround exists",
        "2": "Blocking issue; no workaround exists"
      },
      "confidence": 0.3,
      "probabilities": {
        "0": 0,
        "1": 0.53,
        "2": 0.47
      },
      "stats": {}
    }
  },
  "usage": {
    "input_tokens": 341,
    "output_tokens": 20
  },
  "request_id": "playground_12ac5fa026082114b919b3e203a30f84bab",
  "evaluation_time_ms": 96.0590830000001
}</pre>



<h2>Testing Jev Model</h2>



<p>Jev model is currently available in early access. TypeSafe says it is onboarding developers from the waitlist, and the model can be accessed through its hosted API. Luckily  I got access to Jev model thanks to Typesafe AI.</p>



<p>JeJev can currently be accessed through:</p>



<ul><li>REST API</li><li>Python client SDK</li><li>Javascript SDK</li></ul>



<p>For this demo I&#8217;m going to use Python SDK, we use Jev model to analyse a twitter(X) post, state will twitter post</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from typesafe_sdk import TypeSafeClient, Noul, Choice, Score


state = """
FastSDCPU is amazing! I generated images on my old Intel laptop
without a dedicated GPU. Performance is much better than I expected.
"""


questions = {
    # YES / NO style decision
    "positive_about_product": Noul(
        instructions="Is the author expressing a positive opinion about the product?"
    ),
    # Select one category
    "sentiment": Choice(
        instructions="What is the overall sentiment of this post?",
        criteria={"positive": None, "neutral": None, "negative": None},
    ),
    # Rate on an ordered scale
    "enthusiasm": Score(
        instructions="How enthusiastic is the author about the product?",
        criteria=["very_low", "low", "medium", "high", "very_high"],
    ),
}


with TypeSafeClient() as client:
    result = client.system_one(state, questions)
    print("Positive:", result.nouls["positive_about_product"].noul)
    print("Sentiment:", result.choices["sentiment"].choice)
    print("Enthusiasm:", result.scores["enthusiasm"].score)
</pre>



<p>Output </p>



<pre class="wp-block-code"><code>Positive: 0.99
Sentiment: positive
Enthusiasm: 3.8</code></pre>



<p>We can see that Jev model output has decisions based on the state and questions.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Conclusion</h2>



<p>Jev introduces a different way to use AI in software. Instead of generating text like an LLM, it makes fast, structured decisions with probabilities. That makes it a strong fit for classification, routing, scoring, and automation workflows where speed, reliability, and constrained outputs matter.</p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fjev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model%2F&amp;linkname=Jev%20vs%20LLMs%3A%20A%20Practical%20Introduction%20to%20TypeSafe%20AI%E2%80%99s%20System%20One%20Model" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fjev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model%2F&amp;linkname=Jev%20vs%20LLMs%3A%20A%20Practical%20Introduction%20to%20TypeSafe%20AI%E2%80%99s%20System%20One%20Model" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fjev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model%2F&amp;linkname=Jev%20vs%20LLMs%3A%20A%20Practical%20Introduction%20to%20TypeSafe%20AI%E2%80%99s%20System%20One%20Model" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fjev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model%2F&amp;linkname=Jev%20vs%20LLMs%3A%20A%20Practical%20Introduction%20to%20TypeSafe%20AI%E2%80%99s%20System%20One%20Model" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fjev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model%2F&#038;title=Jev%20vs%20LLMs%3A%20A%20Practical%20Introduction%20to%20TypeSafe%20AI%E2%80%99s%20System%20One%20Model" data-a2a-url="https://nolowiz.com/jev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model/" data-a2a-title="Jev vs LLMs: A Practical Introduction to TypeSafe AI’s System One Model"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/jev-vs-llms-a-practical-introduction-to-typesafe-ais-system-one-model/">Jev vs LLMs: A Practical Introduction to TypeSafe AI’s System One Model</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Understanding Stateless MCP: A Modern Architecture for AI Integrations</title>
		<link>https://nolowiz.com/understanding-stateless-mcp-a-modern-architecture-for-ai-integrations/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Tue, 04 Aug 2026 16:50:09 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7298</guid>

					<description><![CDATA[<p>The Model Context Protocol (MCP) has quickly become the standard way for AI assistants and applications to communicate with external tools, APIs, databases, and services. It provides a common interface that allows AI models to access capabilities without requiring custom integrations for every application. The latest evolution of MCP introduces stateless communication, a significant architectural ... <a title="Understanding Stateless MCP: A Modern Architecture for AI Integrations" class="read-more" href="https://nolowiz.com/understanding-stateless-mcp-a-modern-architecture-for-ai-integrations/" aria-label="More on Understanding Stateless MCP: A Modern Architecture for AI Integrations">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/understanding-stateless-mcp-a-modern-architecture-for-ai-integrations/">Understanding Stateless MCP: A Modern Architecture for AI Integrations</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The Model Context Protocol (MCP) has quickly become the standard way for AI assistants and applications to communicate with external tools, APIs, databases, and services. It provides a common interface that allows AI models to access capabilities without requiring custom integrations for every application. The latest evolution of MCP introduces <a href="https://modelcontextprotocol.io/specification/2026-07-28/changelog" target="_blank" rel="noreferrer noopener">stateless communication</a>, a significant architectural shift that makes MCP deployments more scalable, reliable, and cloud-native.</p>



<p>In this article, we&#8217;ll explore what stateless MCP is, why it matters, how it differs from the earlier approach, and what benefits it brings to AI application developers.</p>



<h2>What is the Model Context Protocol (MCP)?</h2>



<p><a href="https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro" target="_blank" rel="noreferrer noopener">Model Context Protocol</a> (MCP) is an open protocol that standardizes communication between AI models and external systems. Instead of building separate integrations for every AI model, developers create an MCP server exposing tools such as:</p>



<ul><li>Database queries</li><li>File operations</li><li>Git repositories</li><li>Web APIs</li><li>Enterprise systems</li><li>Internal business applications</li></ul>



<p>Any MCP compatible AI client can then invoke these tools using the same protocol. This greatly simplifies AI integration across different models and platforms.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>How Earlier MCP Worked</h2>



<p>Earlier MCP implementations primarily relied on:</p>



<ul><li>Standard Input/Output (stdio)</li><li>HTTP streaming</li></ul>



<p>In many deployments, the MCP server maintained session state. For example:</p>



<ol><li>Client opens a connection.</li><li>Server creates a session.</li><li>Session stores conversation context.</li><li>Future requests must reach the same server instance.</li></ol>



<p>This worked well for local applications but introduced several challenges for distributed cloud deployments.</p>



<h2>The Problems with Stateful MCP</h2>



<p>Maintaining session state creates operational complexity.</p>



<h3>1. Sticky Sessions</h3>



<p>A user&#8217;s requests must always reach the same server instance. If the next request reaches Server B instead of Server A, the session is missing. This forces infrastructure teams to configure sticky sessions, reducing the effectiveness of load balancing.</p>



<h3>2. Limited Horizontal Scaling</h3>



<p>Suppose your AI application suddenly receives 50,000 simultaneous users.  With stateful sessions:</p>



<ul><li>Existing sessions cannot easily move.</li><li>Adding new servers doesn&#8217;t automatically distribute active users.</li><li>Some servers become overloaded while others remain underutilized.</li></ul>



<p>Scaling becomes significantly harder.</p>



<h3>3. Server Failures</h3>



<p>Imagine Server A crashes. Every active session stored on that server disappears. Users may need to reconnect or lose in-progress work unless additional session replication mechanisms are implemented.</p>



<h3>4. Serverless Isn&#8217;t Ideal</h3>



<p>Serverless platforms such as  AWS Lambda,Google Cloud Run,Azure Functions are designed around independent requests. Stateful connections conflict with this execution model because functions are temporary and shouldn&#8217;t retain user-specific state.</p>



<h2>Stateless MCP Changes Everything</h2>



<p>The new stateless architecture shifts session responsibility from the server to the client. Instead of the server remembering previous interactions, each request contains everything required to process it. The server simply:</p>



<ol><li>Receives a request.</li><li>Processes it.</li><li>Returns a response.</li><li>Forgets everything.</li></ol>



<p>Every request is independent.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="940" height="715" src="https://nolowiz.com/wp-content/uploads/2026/08/1785672830548.jpg" alt="Stateless MCP sequence diagram" class="wp-image-7303" srcset="https://nolowiz.com/wp-content/uploads/2026/08/1785672830548.jpg 940w, https://nolowiz.com/wp-content/uploads/2026/08/1785672830548-300x228.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/08/1785672830548-768x584.jpg 768w, https://nolowiz.com/wp-content/uploads/2026/08/1785672830548-150x114.jpg 150w" sizes="(max-width: 940px) 100vw, 940px" /><figcaption>Stateless MCP sequence diagram</figcaption></figure>



<h2>Why This Matters</h2>



<h3>1. Easy Horizontal Scaling</h3>



<p>Adding new servers becomes straightforward. Since no server owns user sessions, any instance can process any request. Cloud platforms can automatically scale based on traffic.</p>



<h3>2. Better Load Balancing</h3>



<p>Without sticky sessions:</p>



<ul><li>Requests distribute evenly.</li><li>Infrastructure utilization improves.</li><li>Hotspots are minimized.</li><li>Performance becomes more predictable.</li></ul>



<h3>3. Improved Reliability</h3>



<p>If one server fails, the client simply sends the next request to another server. No session recovery is needed.</p>



<h3>4. Perfect for Serverless</h3>



<p>Stateless MCP aligns naturally with serverless computing. Platforms such as AWS Lambda, Google Cloud Run, and Azure Functions are designed for independent request processing.</p>



<h3>5. Simpler Infrastructure</h3>



<p>Removing server-side session management also eliminates the need for:</p>



<ul><li>Session databases</li><li>Session replication</li><li>Sticky load balancers</li><li>Distributed session synchronization</li></ul>



<p>This reduces operational complexity and lowers maintenance overhead.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>What Moves to the Client?</h2>



<p>In a stateless architecture, the client is responsible for maintaining the information needed across requests. Depending on the application, this may include:</p>



<ul><li>Conversation history</li><li>Tool invocation context</li><li>Authentication tokens</li><li>User state</li><li>Any metadata required for the next request</li></ul>



<p>Each request includes the necessary context, allowing the server to process it independently.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="1016" height="921" src="https://nolowiz.com/wp-content/uploads/2026/08/stateless_mcp_nolowiz2.jpg" alt="" class="wp-image-7311" srcset="https://nolowiz.com/wp-content/uploads/2026/08/stateless_mcp_nolowiz2.jpg 1016w, https://nolowiz.com/wp-content/uploads/2026/08/stateless_mcp_nolowiz2-300x272.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/08/stateless_mcp_nolowiz2-768x696.jpg 768w, https://nolowiz.com/wp-content/uploads/2026/08/stateless_mcp_nolowiz2-150x136.jpg 150w" sizes="(max-width: 1016px) 100vw, 1016px" /></figure>



<h2>Conclusion</h2>



<p>The move toward stateless Model Context Protocol represents an important step in making AI infrastructure more scalable and cloud-ready. By shifting session responsibility from the server to the client, MCP enables simpler load balancing, effortless horizontal scaling, improved fault tolerance, and seamless deployment on modern serverless platforms.</p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Funderstanding-stateless-mcp-a-modern-architecture-for-ai-integrations%2F&amp;linkname=Understanding%20Stateless%20MCP%3A%20A%20Modern%20Architecture%20for%20AI%20Integrations" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Funderstanding-stateless-mcp-a-modern-architecture-for-ai-integrations%2F&amp;linkname=Understanding%20Stateless%20MCP%3A%20A%20Modern%20Architecture%20for%20AI%20Integrations" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Funderstanding-stateless-mcp-a-modern-architecture-for-ai-integrations%2F&amp;linkname=Understanding%20Stateless%20MCP%3A%20A%20Modern%20Architecture%20for%20AI%20Integrations" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Funderstanding-stateless-mcp-a-modern-architecture-for-ai-integrations%2F&amp;linkname=Understanding%20Stateless%20MCP%3A%20A%20Modern%20Architecture%20for%20AI%20Integrations" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Funderstanding-stateless-mcp-a-modern-architecture-for-ai-integrations%2F&#038;title=Understanding%20Stateless%20MCP%3A%20A%20Modern%20Architecture%20for%20AI%20Integrations" data-a2a-url="https://nolowiz.com/understanding-stateless-mcp-a-modern-architecture-for-ai-integrations/" data-a2a-title="Understanding Stateless MCP: A Modern Architecture for AI Integrations"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/understanding-stateless-mcp-a-modern-architecture-for-ai-integrations/">Understanding Stateless MCP: A Modern Architecture for AI Integrations</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LLM Architecture Explained: What’s Actually Inside a Large Language Model</title>
		<link>https://nolowiz.com/llm-architecture-explained-whats-actually-inside-a-large-language-model/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Fri, 24 Jul 2026 00:49:28 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7222</guid>

					<description><![CDATA[<p>You type a sentence, hit enter, and a machine writes back something coherent. It feels like there must be a sprawling, mysterious apparatus behind the curtain. There isn’t. The surprising truth about LLM architecture is that nearly every model you’ve heard of the GPT family, Llama, Claude, Gemini, Mistral is built from the same repeating ... <a title="LLM Architecture Explained: What’s Actually Inside a Large Language Model" class="read-more" href="https://nolowiz.com/llm-architecture-explained-whats-actually-inside-a-large-language-model/" aria-label="More on LLM Architecture Explained: What’s Actually Inside a Large Language Model">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/llm-architecture-explained-whats-actually-inside-a-large-language-model/">LLM Architecture Explained: What’s Actually Inside a Large Language Model</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>You type a sentence, hit enter, and a machine writes back something coherent. It feels like there must be a sprawling, mysterious apparatus behind the curtain. There isn’t. The surprising truth about LLM architecture is that nearly every model you’ve heard of  the GPT family, Llama, Claude, Gemini, Mistral  is built from the same repeating building block, stacked dozens of times. Learn that one block and you understand the whole class of models.</p>



<p>Before we start, one clarification that trips people up: “LLM architecture” means two different things depending on who’s asking. There’s the model architecture the neural network itself (the transformer). And there’s the system architecture  everything you bolt around a model to ship a product (retrieval, orchestration, guardrails, APIs). This post is about the first one: what’s inside the model. Once you understand that, the system stuff makes a lot more sense too.</p>



<h2>The Short Answer</h2>



<p>Modern LLMs are decoder-only transformers. Text is broken into tokens, each token becomes a vector (embedding), and those vectors flow through a stack of identical transformer blocks. Each block does two things: an attention step that lets every token look at the tokens before it, and a feed-forward step that transforms the result. After the final block, the model outputs a probability distribution over the next token. Generation is just doing this over and over, one token at a time. That’s it, the intelligence is an emergent property of a very large, very well-trained version of this simple loop.</p>



<h2>Step 1: Text Becomes Numbers</h2>



<p>A neural network can’t operate on characters, so the first job is turning text into numbers.<br>Tokenization splits your input into tokens usually subword chunks, not whole words. The word tokenization might become token + ization, while common words like the are a single token. Most models use a scheme like Byte-Pair Encoding (BPE) that balances vocabulary size against sequence length. A vocabulary of roughly 30,000 to 200,000 tokens is typical.</p>



<p>You can try GPT tokenzier <a href="https://platform.openai.com/tokenizer" target="_blank" rel="noreferrer noopener" class="broken_link">here</a>.</p>



<p>Each token maps to an ID, and each ID maps to a learned embedding  a vector of, say, a few thousand numbers that encodes the token’s meaning. Embeddings are learned during training, so semantically related tokens end up near each other in vector space.</p>



<p>There’s one catch: attention (coming up next) has no inherent sense of order  it treats a sequence like a bag of tokens. So we inject position information. Older models added fixed or learned positional encodings; most current models use Rotary Position Embeddings (RoPE), which encode position by rotating the query and key vectors. The practical upshot is the same: the model knows that “dog bites man” and “man bites dog” are different.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Step 2: Attention &#8211; The Core Idea</h2>



<p>Self attention is the mechanism that made transformers work, and it’s the one piece worth understanding deeply.</p>



<p>For every token, the model computes three vectors by multiplying its embedding by learned weight matrices:</p>



<ul><li>Query (Q): what this token is looking for.</li><li>Key (K): what this token offers to others.</li><li>Value (V): the actual information this token passes along.</li></ul>



<p>To decide how much token A should pay attention to token B, you take the dot product of A’s query with B’s key. High dot product means “relevant.” Those scores are scaled, passed through a softmax to turn them into weights that sum to 1, and used to build a weighted sum of the value vectors. In compact form:</p>



<pre class="wp-block-code"><code>Attention(Q, K, V) = softmax( (Q · Kᵀ) / √dₖ ) · V</code></pre>



<p>That single equation is the heart of every LLM. It lets the word it in “the cup fell off the table and it broke” actually connect back to cup.</p>



<p>Two refinements make it powerful in practice:</p>



<ul><li><strong>Multi-head attention</strong>. Instead of one attention calculation, the model runs several in parallel (each a “head”), each free to focus on a different kind of relationship grammar, coreference, topic. Their outputs are concatenated and mixed.</li><li><strong>Causal masking</strong>. In a decoder-only model, a token may only attend to tokens before it, never ahead. This is enforced by masking future positions with negative infinity before the softmax. It’s what makes the model able to generate text left to right without cheating.</li></ul>



<p>A single attention head is one way of asking: <em>&#8220;for each word, which other words should I look at?&#8221;</em></p>



<h3>Why multiple heads</h3>



<p>One head can only learn one kind of relationship. In &#8220;The cat that chased the mouse <strong>was</strong> hungry,&#8221; you need to know:</p>



<ul><li><em>was</em> &#8211; agrees with <em>cat</em> (syntax)</li><li><em>chased</em> &#8211; links <em>cat</em> and <em>mouse</em> (who did what)</li><li><em>hungry</em> &#8211; describes <em>cat</em> (semantics)</li></ul>



<p>One head averaging all of this gets mush. So you run h heads in parallel, each with its own small Q/K/V projections, each free to specialize. Then you concatenate their outputs and pass them through one final linear layer to mix them back into a single vector. </p>



<p>The trick: each head works in a <em>smaller</em> dimension, so 8 heads cost roughly the same as 1 big head. You get diversity for free. </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="843" src="https://nolowiz.com/wp-content/uploads/2026/07/multi_head_attention_structure-1024x843.png" alt="" class="wp-image-7230" srcset="https://nolowiz.com/wp-content/uploads/2026/07/multi_head_attention_structure-1024x843.png 1024w, https://nolowiz.com/wp-content/uploads/2026/07/multi_head_attention_structure-300x247.png 300w, https://nolowiz.com/wp-content/uploads/2026/07/multi_head_attention_structure-768x632.png 768w, https://nolowiz.com/wp-content/uploads/2026/07/multi_head_attention_structure-1536x1265.png 1536w, https://nolowiz.com/wp-content/uploads/2026/07/multi_head_attention_structure-2048x1687.png 2048w, https://nolowiz.com/wp-content/uploads/2026/07/multi_head_attention_structure-150x124.png 150w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Multi head attention</figcaption></figure>



<p><strong>Quick analogy:</strong> a panel of h readers all read the same sentence. One tracks grammar, one tracks who-did-what-to-whom, one tracks pronoun references. Each writes a short note. An editor merges the notes into one summary. More readers with different specialties beats one reader trying to track everything at once.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Causal masking</h2>



<p>Causal (autoregressive) masking stops a token from attending to anything that comes after it  otherwise the model would cheat during training by peeking at the answer it&#8217;s supposed to predict.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="783" src="https://nolowiz.com/wp-content/uploads/2026/07/causal_mask_score_matrix-1024x783.png" alt="" class="wp-image-7233" srcset="https://nolowiz.com/wp-content/uploads/2026/07/causal_mask_score_matrix-1024x783.png 1024w, https://nolowiz.com/wp-content/uploads/2026/07/causal_mask_score_matrix-300x229.png 300w, https://nolowiz.com/wp-content/uploads/2026/07/causal_mask_score_matrix-768x587.png 768w, https://nolowiz.com/wp-content/uploads/2026/07/causal_mask_score_matrix-1536x1175.png 1536w, https://nolowiz.com/wp-content/uploads/2026/07/causal_mask_score_matrix-2048x1566.png 2048w, https://nolowiz.com/wp-content/uploads/2026/07/causal_mask_score_matrix-150x115.png 150w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Casual masking</figcaption></figure>



<p>Each row is one token asking &#8220;who should I look at?&#8221; Row 1 (&#8220;the&#8221;) is the first word, so it can only see itself its weight is forced to 1.0. Row 5 (&#8220;mat&#8221;) is last, so it sees everything. The allowed region is a lower triangle, and each row&#8217;s surviving weights still sum to 1 after softmax.</p>



<h2>Step 3: The Transformer Block</h2>



<p>Attention is only half of each layer. A full transformer block wraps attention and a feed-forward network together with two features that make deep stacks trainable:</p>



<ul><li><strong>A feed-forward network (MLP)</strong> &#8211; a small two-layer network applied to each token independently, usually expanding to ~4× the model width and back. This is where a lot of the model’s “knowledge” is stored.</li><li><strong>Residual connections</strong> &#8211; each sub-layer adds its output back to its input, giving gradients a clean path through dozens of layers.</li><li><strong>Normalization </strong>(LayerNorm or the increasingly common RMSNorm), typically applied before each sub-layer (“pre-norm”) for training stability.</li></ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
import torch.nn as nn

class TransformerBlock(nn.Module):
    def __init__(self, d_model, n_heads):
        super().__init__()
        self.attn  = nn.MultiheadAttention(d_model, n_heads, batch_first=True)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.mlp   = nn.Sequential(
            nn.Linear(d_model, 4 * d_model),
            nn.GELU(),
            nn.Linear(4 * d_model, d_model),
        )

    def forward(self, x, causal_mask):
        # Pre-norm attention + residual
        h = self.norm1(x)
        attn_out, _ = self.attn(h, h, h, attn_mask=causal_mask)
        x = x + attn_out
        # Pre-norm feed-forward + residual
        h = self.norm2(x)
        x = x + self.mlp(h)
        return x

</pre></div>


<p>A real model just stacks this block N times  32, 80, sometimes more than 100 layers  with the output of one feeding the input of the next. Model size (the “7B” or “70B” you see in names) is roughly the total parameters across all these blocks plus the embeddings.</p>



<p>After the final block, a last linear layer projects each position back to the size of the vocabulary. A softmax turns those numbers into probabilities, and the model has its prediction for the next token.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="8835878737"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Step 4: Generation Is a Loop</h2>



<p>To generate text, the model predicts a probability distribution for the next token, picks one (greedily, or by sampling with a temperature setting to control randomness), appends it to the input, and runs the whole thing again. This is why LLMs are called autoregressive: each new token is conditioned on everything generated so far.</p>



<p>A key optimization here is the KV cache. Because past tokens don’t change, the model caches their key and value vectors instead of recomputing them every step. This is why the first token of a response can feel slow (processing your whole prompt) while subsequent tokens stream quickly.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="603" height="593" src="https://nolowiz.com/wp-content/uploads/2026/07/llmarchitecture-diragram.jpg" alt="" class="wp-image-7238" srcset="https://nolowiz.com/wp-content/uploads/2026/07/llmarchitecture-diragram.jpg 603w, https://nolowiz.com/wp-content/uploads/2026/07/llmarchitecture-diragram-300x295.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/07/llmarchitecture-diragram-150x148.jpg 150w" sizes="(max-width: 603px) 100vw, 603px" /></figure>



<h2>Not All Transformers Are the Same</h2>



<p>Decoder-only is dominant today, but it&#8217;s one of three classic arrangements. Knowing the difference explains why BERT and GPT feel like different tools.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="575" src="https://nolowiz.com/wp-content/uploads/2026/07/transformer-architectures-table_1-1024x575.png" alt="" class="wp-image-7242" srcset="https://nolowiz.com/wp-content/uploads/2026/07/transformer-architectures-table_1-1024x575.png 1024w, https://nolowiz.com/wp-content/uploads/2026/07/transformer-architectures-table_1-300x169.png 300w, https://nolowiz.com/wp-content/uploads/2026/07/transformer-architectures-table_1-768x432.png 768w, https://nolowiz.com/wp-content/uploads/2026/07/transformer-architectures-table_1-1536x863.png 1536w, https://nolowiz.com/wp-content/uploads/2026/07/transformer-architectures-table_1-2048x1151.png 2048w, https://nolowiz.com/wp-content/uploads/2026/07/transformer-architectures-table_1-150x84.png 150w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2>Which Architecture Should You Care About?</h2>



<p>For most people building on LLMs today, the answer is decoder-only  that&#8217;s what &#8220;LLM&#8221; almost always means now. But if you&#8217;re choosing a model <em>type</em> for a specific job, walk through these questions:</p>



<ul><li><strong>Do you need to generate free-form text (chat, code, drafts)?</strong> Decoder-only. This covers the vast majority of modern use cases.</li><li><strong>Do you need to turn text into a fixed vector for search or classification?</strong> An encoder-only model (or a dedicated embedding model) is cheaper and often better than asking a generative LLM.</li><li><strong>Is your task a clean input to output transform like translation?</strong> Encoder-decoder can shine, though large decoder-only models now handle these tasks well via prompting.</li></ul>



<p><strong>Rule of thumb:</strong></p>



<ul><li>Generating?  Decoder-only.</li><li>Understanding or retrieving?  Encoder-only / embedding model.</li><li>Faithful sequence-to-sequence transformation?  Encoder-decoder.</li><li>Not sure?  Default to a decoder-only model; it&#8217;s the most general.</li></ul>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fllm-architecture-explained-whats-actually-inside-a-large-language-model%2F&amp;linkname=LLM%20Architecture%20Explained%3A%20What%E2%80%99s%20Actually%20Inside%20a%20Large%20Language%20Model" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fllm-architecture-explained-whats-actually-inside-a-large-language-model%2F&amp;linkname=LLM%20Architecture%20Explained%3A%20What%E2%80%99s%20Actually%20Inside%20a%20Large%20Language%20Model" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fllm-architecture-explained-whats-actually-inside-a-large-language-model%2F&amp;linkname=LLM%20Architecture%20Explained%3A%20What%E2%80%99s%20Actually%20Inside%20a%20Large%20Language%20Model" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fllm-architecture-explained-whats-actually-inside-a-large-language-model%2F&amp;linkname=LLM%20Architecture%20Explained%3A%20What%E2%80%99s%20Actually%20Inside%20a%20Large%20Language%20Model" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fllm-architecture-explained-whats-actually-inside-a-large-language-model%2F&#038;title=LLM%20Architecture%20Explained%3A%20What%E2%80%99s%20Actually%20Inside%20a%20Large%20Language%20Model" data-a2a-url="https://nolowiz.com/llm-architecture-explained-whats-actually-inside-a-large-language-model/" data-a2a-title="LLM Architecture Explained: What’s Actually Inside a Large Language Model"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/llm-architecture-explained-whats-actually-inside-a-large-language-model/">LLM Architecture Explained: What’s Actually Inside a Large Language Model</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>I Built a Map of Which Indian Jobs Are Most at Risk from AI</title>
		<link>https://nolowiz.com/i-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Mon, 16 Mar 2026 15:37:28 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7073</guid>

					<description><![CDATA[<p>Everyone is talking about AI taking jobs. But most of that conversation is about America. What about India &#8211; where 1.4 billion people work across farming, construction, IT, banking, healthcare, and government? Where does AI actually threaten livelihoods, and where is the workforce relatively safe? I wanted to see this visually. So I built it. ... <a title="I Built a Map of Which Indian Jobs Are Most at Risk from AI" class="read-more" href="https://nolowiz.com/i-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai/" aria-label="More on I Built a Map of Which Indian Jobs Are Most at Risk from AI">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/i-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai/">I Built a Map of Which Indian Jobs Are Most at Risk from AI</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Everyone is talking about AI taking jobs. But most of that conversation is about America.</p>



<p>What about India &#8211; where 1.4 billion people work across farming, construction, IT, banking, healthcare, and government? Where does AI actually threaten livelihoods, and where is the workforce relatively safe?</p>



<p>I wanted to see this visually. So I built it. Inspired by <a href="https://github.com/karpathy/jobs" target="_blank" rel="noreferrer noopener">Andrej Karpathy&#8217;s jobs project</a> which analyzed 342 US occupations from BLS data &#8211; I built the Indian version using NCS Portal data. <a href="https://nolowiz.com/ai-job-exposure-india/" target="_blank" rel="noreferrer noopener">You can visit here</a> .</p>



<h2>What the map shows</h2>



<p>The visualization is an interactive treemap of the Indian job market, covering 10 major sectors and ~500 occupations from the <a href="http://ncs.gov.in" target="_blank" rel="noreferrer noopener" class="broken_link">National Career Service portal </a>, India&#8217;s official government career database based on NCO-2015 classification.</p>



<p>Each rectangle is one occupation. Two visual signals:</p>



<ul><li><strong>Size</strong> &#8211; how many people work in that occupation. A farmer&#8217;s rectangle is enormous. A software architect&#8217;s is tiny.</li><li><strong>Color</strong> &#8211; how exposed that occupation is to AI disruption, scored 0–10. Green means relatively safe. Red means high risk.</li></ul>



<p>The picture that emerges is striking, and very different from the American version of this story.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>What India&#8217;s map actually looks like</h2>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="481" src="https://nolowiz.com/wp-content/uploads/2026/03/image-1024x481.png" alt="" class="wp-image-7078" srcset="https://nolowiz.com/wp-content/uploads/2026/03/image-1024x481.png 1024w, https://nolowiz.com/wp-content/uploads/2026/03/image-300x141.png 300w, https://nolowiz.com/wp-content/uploads/2026/03/image-768x361.png 768w, https://nolowiz.com/wp-content/uploads/2026/03/image-150x70.png 150w, https://nolowiz.com/wp-content/uploads/2026/03/image.png 1277w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p><strong>Agriculture dominates.</strong> Nearly 40% of India&#8217;s workforce is in farming &#8211; cultivators, dairy workers, livestock farmers. These jobs score 2–3 out of 10 on AI exposure. They require physical presence, seasonal judgment, and local knowledge that AI cannot replicate at scale, especially in India&#8217;s fragmented smallholder farming context. The agriculture block is a massive sea of green.</p>



<p><strong>Construction is the second green giant.</strong> With 60+ million workers, construction scores 3/10. Masons, welders, electricians, plumbers &#8211; physical skills in unpredictable environments that robots still can&#8217;t handle reliably. India&#8217;s infrastructure boom under Smart Cities and PM Gati Shakti is creating more of these relatively safe jobs.</p>



<p><strong>IT-ITeS is a small red island.</strong> India&#8217;s famous software and BPO sector employs far fewer people than agriculture &#8211; but scores 7–9 out of 10 on AI exposure. Software developers, data analysts, business process managers, content writers &#8211; these are exactly the jobs that LLMs are already eating into. The IT block is tiny but blazing red.</p>



<p><strong>BFSI tells a split story.</strong> Bank tellers and loan document processors are highly exposed (7–8/10). Relationship managers and wealth advisors are more protected (5/10) because trust still drives financial decisions in India. The branch banking model that employs hundreds of thousands is under significant pressure.</p>



<p><strong>Telecom is surprisingly high risk.</strong> Customer care agents, billing processors, network documentation staff &#8211; a huge portion of India&#8217;s telecom workforce is in roles scoring 7–8/10. Jio disrupted pricing; AI is disrupting the workforce. Tower technicians and field engineers score much lower (3–4/10) because their work is physical.</p>



<p><strong>Logistics is a tale of two workforces.</strong> Delivery workers and warehouse staff score low (2–3/10) &#8211; physical work, last-mile human judgment. But dispatch coordinators, route planners, and logistics analysts score 6–7/10. Zomato and Swiggy&#8217;s gig economy has created millions of AI-safe delivery jobs while quietly automating the planning layer above them.</p>



<p><strong>Organised Retail is in transition.</strong> Cashiers and billing staff score high (7/10) &#8211; self-checkout and UPI are already replacing them. But floor staff, visual merchandisers, and store managers score moderate (4–5/10). The kirana store owner scores low &#8211; hyperlocal relationships and informal credit systems are hard for AI to replicate.</p>



<p><strong>Public Administration scores higher than people expect.</strong> Data entry clerks, document processing officers, and administrative assistants in government score 6–7/10. The institutional inertia of Indian bureaucracy will delay automation, but it won&#8217;t prevent it. Millions of aspirational government job seekers are training for roles that AI will significantly reshape within a decade.</p>



<p><strong>Healthcare is the interesting middle ground.</strong> Doctors and specialists score moderately (5–6/10) because diagnosis and patient relationships still require human judgment. But medical transcriptionists, billing clerks, and hospital administrative staff score 8–9/10. AI will hollow out healthcare administration long before it touches clinical care.</p>



<p><strong>Education sits in the amber zone.</strong> With 10 million+ teachers in India, education scores 4–5/10. The human relationship at the core of teaching is protective &#8211; but administrative staff, content creators, and exam evaluators score much higher.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<!-- article-horizontal -->
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2735334721002354" data-ad-slot="8835878737" data-ad-format="auto" data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>The full picture across 10 sectors</h2>



<figure class="wp-block-image size-full"><img loading="lazy" width="679" height="454" src="https://nolowiz.com/wp-content/uploads/2026/03/scores_.png" alt="" class="wp-image-7085" srcset="https://nolowiz.com/wp-content/uploads/2026/03/scores_.png 679w, https://nolowiz.com/wp-content/uploads/2026/03/scores_-300x201.png 300w, https://nolowiz.com/wp-content/uploads/2026/03/scores_-150x100.png 150w" sizes="(max-width: 679px) 100vw, 679px" /></figure>



<h2>The uncomfortable takeaway</h2>



<p>India has spent 30 years building an economy on the back of knowledge work  IT services, BPO, back-office processing  that is precisely what AI automates best. Meanwhile, the jobs employing most Indians  farming, construction, delivery  are safe not because they&#8217;re valuable but because they&#8217;re physical and informal.</p>



<p>Construction workers building smart cities. Delivery workers powering e-commerce. Farmers feeding a billion people. All relatively safe from AI.</p>



<p>Software engineers. Bank clerks. Government data entry operators. Call centre agents. All highly exposed.</p>



<p>The map doesn&#8217;t have answers. But it makes the question visible.</p>



<p></p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fi-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai%2F&amp;linkname=I%20Built%20a%20Map%20of%20Which%20Indian%20Jobs%20Are%20Most%20at%20Risk%20from%20AI" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fi-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai%2F&amp;linkname=I%20Built%20a%20Map%20of%20Which%20Indian%20Jobs%20Are%20Most%20at%20Risk%20from%20AI" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fi-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai%2F&amp;linkname=I%20Built%20a%20Map%20of%20Which%20Indian%20Jobs%20Are%20Most%20at%20Risk%20from%20AI" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fi-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai%2F&amp;linkname=I%20Built%20a%20Map%20of%20Which%20Indian%20Jobs%20Are%20Most%20at%20Risk%20from%20AI" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fi-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai%2F&#038;title=I%20Built%20a%20Map%20of%20Which%20Indian%20Jobs%20Are%20Most%20at%20Risk%20from%20AI" data-a2a-url="https://nolowiz.com/i-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai/" data-a2a-title="I Built a Map of Which Indian Jobs Are Most at Risk from AI"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/i-built-a-map-of-which-indian-jobs-are-most-at-risk-from-ai/">I Built a Map of Which Indian Jobs Are Most at Risk from AI</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Run AI Models with Docker Model Runner: A Step-by-Step Guide</title>
		<link>https://nolowiz.com/run-ai-models-with-docker-model-runner-a-step-by-step-guide/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Sat, 28 Feb 2026 10:34:24 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=7032</guid>

					<description><![CDATA[<p>In this article we will discuss how to pull and run Gen AI models using Docker Model Runner(DMR). Docker Model Runner (DMR) Docker Model Runner (DMR) is a tool built into Docker Desktop and Docker Engine that makes it easy to pull, run, and serve AI/LLM models locally directly from Docker Hub, any OCI-compliant registry, ... <a title="Run AI Models with Docker Model Runner: A Step-by-Step Guide" class="read-more" href="https://nolowiz.com/run-ai-models-with-docker-model-runner-a-step-by-step-guide/" aria-label="More on Run AI Models with Docker Model Runner: A Step-by-Step Guide">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/run-ai-models-with-docker-model-runner-a-step-by-step-guide/">Run AI Models with Docker Model Runner: A Step-by-Step Guide</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In this article we will discuss how to pull and run Gen AI models using Docker Model Runner(DMR).</p>



<h2>Docker Model Runner (DMR)</h2>



<p>Docker Model Runner (DMR) is a tool built into Docker Desktop and Docker Engine that makes it easy to pull, run, and serve AI/LLM models locally  directly from Docker Hub, any OCI-compliant registry, or<a href="https://huggingface.co/" target="_blank" rel="noreferrer noopener"> Hugging Face.</a> Models can be pulled from model resgistry and stored locally.</p>



<p>DMR has the following key features :</p>



<ul><li>Serves models via OpenAI and <a href="https://ollama.com/" target="_blank" rel="noreferrer noopener">Ollama</a>-compatible APIs, so existing apps can plug right in Docker</li><li>Models load into memory only at runtime and unload when not in use to save resources Docker</li><li>Following inference engines are supported<ul><li><a href="https://github.com/ggml-org/llama.cpp" target="_blank" rel="noreferrer noopener">llama.cpp</a> (default, all platforms)</li><li><a href="https://docs.vllm.ai/en/latest/" target="_blank" rel="noreferrer noopener">vLLM </a>(high throughput, NVIDIA)</li></ul></li><li>Image generation via diffusers</li><li>Integrates with AI coding tools like Cline, Continue, Cursor, and Aider Docker</li><li>Works with Docker Compose and Testcontainers</li></ul>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="1582583983"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Step 1: Enable Docker Model Runner</h2>



<p>First we need to install docker desktop/ docker by following the <a href="https://www.docker.com/get-started/" target="_blank" rel="noreferrer noopener">getting started docker guide</a>.  To enable docker model runner do the following.</p>



<p><strong>Docker Desktop:</strong> Go to Settings -> AI tab, then enable Docker Model Runner. Optionally enable GPU-backed inference if you have a supported NVIDIA GPU. </p>



<figure class="wp-block-image size-full"><img loading="lazy" width="958" height="613" src="https://nolowiz.com/wp-content/uploads/2026/02/image-2.png" alt="" class="wp-image-7034" srcset="https://nolowiz.com/wp-content/uploads/2026/02/image-2.png 958w, https://nolowiz.com/wp-content/uploads/2026/02/image-2-300x192.png 300w, https://nolowiz.com/wp-content/uploads/2026/02/image-2-768x491.png 768w, https://nolowiz.com/wp-content/uploads/2026/02/image-2-150x96.png 150w" sizes="(max-width: 958px) 100vw, 958px" /></figure>



<p><a href="https://www.docker.com/blog/run-llms-locally/" target="_blank" rel="noreferrer noopener"></a></p>



<p><strong>Docker Engine (Linux):</strong> Install the plugin, then test it:</p>



<pre class="wp-block-code"><code>sudo apt-get update
sudo apt-get install docker-model-plugin</code></pre>



<p>Now we can verify docker model command by running the below command</p>



<pre class="wp-block-code"><code>docker model version</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="357" height="82" src="https://nolowiz.com/wp-content/uploads/2026/02/image-3.png" alt="" class="wp-image-7035" srcset="https://nolowiz.com/wp-content/uploads/2026/02/image-3.png 357w, https://nolowiz.com/wp-content/uploads/2026/02/image-3-300x69.png 300w, https://nolowiz.com/wp-content/uploads/2026/02/image-3-150x34.png 150w" sizes="(max-width: 357px) 100vw, 357px" /></figure>



<h2>Step 2: Pull a Model</h2>



<p>Next we need to pull a model from <a href="https://hub.docker.com/" target="_blank" rel="noreferrer noopener">Docker Hub</a>.</p>



<pre class="wp-block-code"><code>docker model pull ai/smollm2:360M-Q4_K_M</code></pre>



<p>Or pull directly from HuggingFace:</p>



<pre class="wp-block-code"><code>docker model pull hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF</code></pre>



<p>Models are cached locally after the first pull.</p>



<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="1582583983"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<p>Docker models can be installed using docker desktop as shown below </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="704" src="https://nolowiz.com/wp-content/uploads/2026/02/image-5-1024x704.png" alt="" class="wp-image-7040" srcset="https://nolowiz.com/wp-content/uploads/2026/02/image-5-1024x704.png 1024w, https://nolowiz.com/wp-content/uploads/2026/02/image-5-300x206.png 300w, https://nolowiz.com/wp-content/uploads/2026/02/image-5-768x528.png 768w, https://nolowiz.com/wp-content/uploads/2026/02/image-5-150x103.png 150w, https://nolowiz.com/wp-content/uploads/2026/02/image-5.png 1067w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2>Step 3: Run the Model</h2>



<p>Run the below command to run the model with interactive CLI :</p>



<pre class="wp-block-code"><code>docker model run ai/smollm2:360M-Q4_K_M</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="514" height="137" src="https://nolowiz.com/wp-content/uploads/2026/02/image-4.png" alt="" class="wp-image-7038" srcset="https://nolowiz.com/wp-content/uploads/2026/02/image-4.png 514w, https://nolowiz.com/wp-content/uploads/2026/02/image-4-300x80.png 300w, https://nolowiz.com/wp-content/uploads/2026/02/image-4-150x40.png 150w" sizes="(max-width: 514px) 100vw, 514px" /></figure>



<h2>How to use Model API</h2>



<p>By default, Docker Model Runner may only be accessible via a Unix socket or internal Docker networking. To call it from your host machine (e.g., via <code>curl</code> or Postman), you must explicitly enable TCP host access. As we have enabled this in the docker desktop we can use the API.</p>



<p>For docker CLI use the below command enable it</p>



<pre class="wp-block-code"><code>docker desktop enable model-runner --tcp=12434</code></pre>



<p>Docker Model Runner uses an OpenAI-compatible API, but the path includes the engine and model name. Base URL structure:</p>



<ul><li><strong>From Host:</strong> <code>http://localhost:12434/v1</code></li><li><strong>From inside a Container:</strong> <code>http://model-runner.docker.internal:12434/v1</code></li></ul>



<p>Testing the API with Postman.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="809" height="641" src="https://nolowiz.com/wp-content/uploads/2026/02/image-6.png" alt="" class="wp-image-7045" srcset="https://nolowiz.com/wp-content/uploads/2026/02/image-6.png 809w, https://nolowiz.com/wp-content/uploads/2026/02/image-6-300x238.png 300w, https://nolowiz.com/wp-content/uploads/2026/02/image-6-768x609.png 768w, https://nolowiz.com/wp-content/uploads/2026/02/image-6-150x119.png 150w" sizes="(max-width: 809px) 100vw, 809px" /></figure>



<p>We can connect with OpenAI comptible libraries, here is an example of Python code :</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
from openai import OpenAI

client = OpenAI(
    base_url=&quot;http://localhost:12434/engines/v1&quot;,
    api_key=&quot;not-needed&quot;,
)

response = client.chat.completions.create(
    model=&quot;ai/smollm2:360M-Q4_K_M&quot;, messages=&#91;{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Hello!&quot;}]
)
print(response.choices&#91;0].message.content)
</pre></div>


<p></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2735334721002354"
     data-ad-slot="1582583983"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h2>Context Size</h2>



<p>The context size is the total token budget for each request, split between what you send in and what the model generates back. As per DMR documentation default context size for the engines :</p>



<ul><li>llama.cpp &#8211; 4096</li><li>vLLM &#8211; Uses the model&#8217;s maximum trained context size</li></ul>



<p>We can configure the model context size using the below command :</p>



<pre class="wp-block-code"><code>docker model configure --context-size 8192 ai/qwen2.5-coder</code></pre>



<h2>When to Use Docker Model Runner</h2>



<p>Use docker model runner in the following scenarios.</p>



<ul><li><strong>Local development &amp; testing</strong> &#8211; Local development without costly API calls, or privacy concerns from cloud APIs.</li><li><strong>Privacy-sensitive workloads</strong> &#8211; To keep confidential data fully under your control.</li><li><strong>Docker-native workflows</strong> &#8211; Use familiar <code>docker model pull/run</code> commands with no new toolchain to learn.</li><li><strong>Multi-container AI apps with Compose</strong> &#8211; Define models directly in <code>compose.yml</code> alongside your app services with zero extra glue code.</li><li><strong>Offline / edge environments</strong> &#8211; Run models locally where cloud API access isn&#8217;t reliable or allowed.</li><li><strong>CI/CD pipelines</strong> &#8211; Pull, tag, version, and deploy models like any other artifact, no GPU cluster required</li></ul>



<h2>Quick Troubleshooting </h2>



<p>1. To check whether Docker Model Runner (DMR) run the below command :</p>



<pre class="wp-block-code"><code>docker model status</code></pre>



<p>2. To list pulled models use the below command :</p>



<pre class="wp-block-code"><code>docker model ls</code></pre>



<p>3. To display detailed information about a specific model</p>



<pre class="wp-block-code"><code>docker model inspect &lt;model_name></code></pre>



<p>E.g<em> <code>docker model inspect ai/smollm2:360M-Q4_K_M</code></em></p>



<p>4. Test basic connectivity (List Models): </p>



<pre class="wp-block-code"><code>curl http://localhost:12434/v1/models</code></pre>



<h2>Conclusion</h2>



<p>Docker model runner makes it easier to run AI models locally without much problem and staying with the docker ecosystem.  <a href="https://nolowiz.com/ollama-api-run-large-language-models-locally-with-simple-apis/" target="_blank" rel="noreferrer noopener">Run Large Language Models Locally with Simple APIs</a>.</p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Frun-ai-models-with-docker-model-runner-a-step-by-step-guide%2F&amp;linkname=Run%20AI%20Models%20with%20Docker%20Model%20Runner%3A%20A%20Step-by-Step%20Guide" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Frun-ai-models-with-docker-model-runner-a-step-by-step-guide%2F&amp;linkname=Run%20AI%20Models%20with%20Docker%20Model%20Runner%3A%20A%20Step-by-Step%20Guide" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Frun-ai-models-with-docker-model-runner-a-step-by-step-guide%2F&amp;linkname=Run%20AI%20Models%20with%20Docker%20Model%20Runner%3A%20A%20Step-by-Step%20Guide" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Frun-ai-models-with-docker-model-runner-a-step-by-step-guide%2F&amp;linkname=Run%20AI%20Models%20with%20Docker%20Model%20Runner%3A%20A%20Step-by-Step%20Guide" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Frun-ai-models-with-docker-model-runner-a-step-by-step-guide%2F&#038;title=Run%20AI%20Models%20with%20Docker%20Model%20Runner%3A%20A%20Step-by-Step%20Guide" data-a2a-url="https://nolowiz.com/run-ai-models-with-docker-model-runner-a-step-by-step-guide/" data-a2a-title="Run AI Models with Docker Model Runner: A Step-by-Step Guide"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/run-ai-models-with-docker-model-runner-a-step-by-step-guide/">Run AI Models with Docker Model Runner: A Step-by-Step Guide</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Agent Skills: Complete Beginner’s Guide to AI Agent Skills and Best Practices</title>
		<link>https://nolowiz.com/agent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices/</link>
		
		<dc:creator><![CDATA[Rupesh Sreeraman]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 13:50:17 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://nolowiz.com/?p=6971</guid>

					<description><![CDATA[<p>In this article we will understand the concept of AI agent skills. AI agents are evolving rapidly. From simple prompt based bots to autonomous systems that can search, reason, and execute tools, the architecture behind modern agents is becoming more structured. Agent Skills The open Agent Skills standard was introduced by Anthropic. Agent skill is ... <a title="Agent Skills: Complete Beginner’s Guide to AI Agent Skills and Best Practices" class="read-more" href="https://nolowiz.com/agent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices/" aria-label="More on Agent Skills: Complete Beginner’s Guide to AI Agent Skills and Best Practices">Read more</a></p>
<p>The post <a rel="nofollow" href="https://nolowiz.com/agent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices/">Agent Skills: Complete Beginner’s Guide to AI Agent Skills and Best Practices</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In this article we will understand the concept of AI agent skills. AI agents are evolving rapidly. From simple prompt based bots to autonomous systems that can search, reason, and execute tools, the architecture behind modern agents is becoming more structured.</p>



<h2>Agent Skills</h2>



<p>The open Agent Skills standard was introduced by <a href="https://www.anthropic.com/" target="_blank" rel="noreferrer noopener">Anthropic</a>. Agent skill is a modular add-on that gives AI agents new abilities, from coding best practices to video editing. Skills are a new open standard for packaging reusable expertise into modular units that any compatible AI agent can discover, load, and apply on demand. Think of them as plugins for your agent’s brain: instead of repeating the same long prompt every time you want your AI to follow your team’s React conventions or generate a proper Dockerfile, you install a skill once and the agent applies it automatically whenever relevant.</p>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-2735334721002354" data-ad-slot="1582583983"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>Skill Folder Structure</h2>



<p>At its core, a skill is simply a directory that contains a <strong>SKILL.md</strong> file. This file holds essential metadata such as the skill’s name and description along with detailed instructions that guide an agent in completing a specific task.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="553" height="273" src="https://nolowiz.com/wp-content/uploads/2026/02/image.png" alt="Agent skill" class="wp-image-6982" srcset="https://nolowiz.com/wp-content/uploads/2026/02/image.png 553w, https://nolowiz.com/wp-content/uploads/2026/02/image-300x148.png 300w, https://nolowiz.com/wp-content/uploads/2026/02/image-150x74.png 150w" sizes="(max-width: 553px) 100vw, 553px" /></figure>



<pre class="wp-block-code"><code>my-skill/
├── SKILL.md          # Required: instructions + metadata
├── scripts/          # Optional: executable code
├── references/       # Optional: documentation
└── assets/           # Optional: templates, resources</code></pre>



<p></p>



<h2>Agent Skills Format</h2>



<p>A skill is a directory containing atleast one file called <strong>SKILL.md</strong>. Optional directories such as <code><strong>scripts/</strong></code>, <code><strong>references/</strong></code>, and <code><strong>assets/</strong></code> can be added to provide extra functionality and resources for your skill.</p>



<h3>SKILL.md file</h3>



<p>The <code>SKILL.md</code> file must begin with YAML frontmatter (Frontmatter refers to the introductory section of a document or publication that contains information about the content), followed by the main content written in Markdown.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
name: skill-name
description: A description of what this skill does and when to use it.
---
</pre></div>


<p>The <em>name </em>and <em>description </em>fields are necessary other optional fields includes <em>allowed-tools</em>, <em>metadata</em>,<em>license</em>.</p>



<ul><li><strong>name </strong>&#8211;  Lowercase letters, numbers, and hyphens only(Max 64 characters) E.g <em>name: code-review</em></li><li><strong>description </strong>&#8211; Clear description of what the skill does and when to use it( max 1024 characters)</li><li><strong>license(optional) </strong>&#8211; The&nbsp;license applied to the skill, e.g &#8211;<em> license: Proprietary. LICENSE.txt has complete terms </em> </li><li><strong>allowed-tools(optional)</strong> &#8211; The space limited allowed tools to use<em> e.g : allowed-tools: Read, Grep</em></li><li><strong>metadata(optional)</strong> &#8211; Additional data as key value pair</li><li><strong>compatibility (Optional)</strong> &#8211; Whether this skill is intended for a particular environment e.g  : <em>compatibility: Designed for Claude Code (or similar products)</em></li></ul>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-2735334721002354" data-ad-slot="1582583983"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<p>Finally we have skill body it contains skill instructions. It should have following recommended sections </p>



<ul><li>Step-by-step instructions</li><li>Examples of inputs and outputs</li><li>Common edge cases</li></ul>



<p>Here is a simple example of SKILL.md file.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
name : Weather Retriever
description: Fetches real-time weather data and forecasts for any city globally. Use this when the user asks about current conditions or travel planning.
---

## Instructions
1. Extract the `city_name` and `units` (metric/imperial) from the user prompt.
2. If the city is missing, ask for clarification before proceeding.
3. Call the `get_weather_data` function using the extracted parameters.
4. Format the output into a friendly, 2-line summary for the user.

## Tools &amp; Resources
- **Code:** `weather_api_client.py`
- **Data:** `city_codes.json` (for validation)

## Constraints
- Do not provide forecasts beyond 7 days.
- Always include the &quot;Last Updated&quot; timestamp in the response.
</pre></div>


<h3>Optional directories</h3>



<ul><li><strong>scripts/</strong> &#8211; contains executable code that agents can run to perform actions or computations. (Python,Javascript or bash)</li><li><strong>references/</strong> &#8211; holds extra documentation and reference files that the agent can read on demand. for example REFERENCE.md for detailed reference</li><li><strong>assets/</strong> &#8211; stores static resources like templates, images, or data files used by the skill</li></ul>



<h2>How Agent  Skills Work</h2>



<p>Agent skills has following life cycle :</p>



<ul><li><strong>Discovery </strong>&#8211; The agent scans available skills and reads their names and descriptions to understand what capabilities are available.</li><li><strong>Activation </strong>&#8211; When a task matches a skill’s purpose, the agent loads and reads the full <strong>SKILL.md</strong> instructions.</li><li><strong>Execution</strong> &#8211; The agent follows the skill’s instructions, using any scripts, assets, or references required to complete the task.</li></ul>



<figure class="wp-block-image size-full"><img loading="lazy" width="1024" height="743" src="https://nolowiz.com/wp-content/uploads/2026/02/agent-skill-lifecycle.jpg" alt="Agent skill life cycle" class="wp-image-6995" srcset="https://nolowiz.com/wp-content/uploads/2026/02/agent-skill-lifecycle.jpg 1024w, https://nolowiz.com/wp-content/uploads/2026/02/agent-skill-lifecycle-300x218.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/02/agent-skill-lifecycle-768x557.jpg 768w, https://nolowiz.com/wp-content/uploads/2026/02/agent-skill-lifecycle-150x109.jpg 150w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>You can refer the Skills by Anthropic on <a href="https://github.com/anthropics/skills/tree/main/skills" target="_blank" rel="noreferrer noopener">this GitHub repo</a>.</p>



<h2>MCP vs Agent Skills</h2>



<p>The key differences between MCP(Model context proctocol) and agent skills are listed below.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="739" height="389" src="https://nolowiz.com/wp-content/uploads/2026/02/image-1.png" alt="" class="wp-image-6999" srcset="https://nolowiz.com/wp-content/uploads/2026/02/image-1.png 739w, https://nolowiz.com/wp-content/uploads/2026/02/image-1-300x158.png 300w, https://nolowiz.com/wp-content/uploads/2026/02/image-1-150x79.png 150w" sizes="(max-width: 739px) 100vw, 739px" /></figure>



<h2>Best Practices with Agent skills</h2>



<p>Follow these best practices to work with agent skills :</p>



<ul><li>Create a dedicated folder per skill (e.g.,&nbsp;<code>pdf-parsing/</code>) inside a&nbsp;<code>skills/</code>&nbsp;directory</li><li>Define &#8220;When to use&#8221; and &#8220;How to use&#8221; sections in&nbsp;<code>SKILL.md</code>&nbsp;with clear steps, parameters, and examples.</li><li>Keep SKILL.md within 500 lines. If it goes beyond that, evaluate whether some sections should be moved into separate reference files.</li><li>If you are using third party skills , enusre that it does not contains any malicious instructions/code.</li></ul>



<p></p>



<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2735334721002354" crossorigin="anonymous"></script>
<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-2735334721002354" data-ad-slot="1582583983"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p></p>



<h2>When to use Agent Skills</h2>



<p>Use agent skills in the following scenarios :</p>



<ul><li>When tasks are reusable (E.g Web research skill, blog outline generator skill)</li><li>When You want separation between &#8220;Brain&#8221; and &#8220;Tools&#8221;, think like this LLM as brain(reasoning) and skills as hands(execution),If your system only needs thinking then no skill needed, if your system needs doing then skills are required</li><li>Avoid skills for one-off tasks (use prompts) or real-time external access (use MCP/tools).</li></ul>



<h2>Security Risks </h2>



<p>The following secuirty risks are associated with third party agent skills :</p>



<ul><li><strong>Malicious Code Injection</strong> : Third-party skills often bundle executable instructions or scripts (e.g., hidden curl commands in markdown) that AI agents execute blindly, enabling data exfiltration, backdoors, or system compromise without human review</li><li><strong>Privilege Escalation</strong> :  Skills frequently request excessive permissions—like sudo access, credential stores, or root execution far beyond stated needs, amplifying damage if exploited.</li></ul>



<p>OpenClaw and VirusTotal are now <a href="https://openclaw.ai/blog/virustotal-partnership" target="_blank" rel="noreferrer noopener">collaborating to scan </a>ClawHub, the marketplace for agent skills. You can also use <a href="https://github.com/cisco-ai-defense/skill-scanner" target="_blank" rel="noreferrer noopener">Skill Scanner</a> by Cisco for free. </p>



<pre class="wp-block-code"><code>skill-scanner scan &lt;skill folder path&gt;</code></pre>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" src="https://nolowiz.com/wp-content/uploads/2026/02/skillscan.jpg" alt="Skill scanner by cisco" class="wp-image-7016" width="751" height="294" srcset="https://nolowiz.com/wp-content/uploads/2026/02/skillscan.jpg 751w, https://nolowiz.com/wp-content/uploads/2026/02/skillscan-300x117.jpg 300w, https://nolowiz.com/wp-content/uploads/2026/02/skillscan-150x59.jpg 150w" sizes="(max-width: 751px) 100vw, 751px" /></figure>



<h2>Conclusion</h2>



<p>Agent Skills are transforming how AI agents move from simple chatbots to capable task executors. By packaging instructions, tools, and structured workflows into reusable skill modules, you can build agents that are scalable, maintainable, and easier to extend.</p>
<p><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fnolowiz.com%2Fagent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices%2F&amp;linkname=Agent%20Skills%3A%20Complete%20Beginner%E2%80%99s%20Guide%20to%20AI%20Agent%20Skills%20and%20Best%20Practices" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fnolowiz.com%2Fagent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices%2F&amp;linkname=Agent%20Skills%3A%20Complete%20Beginner%E2%80%99s%20Guide%20to%20AI%20Agent%20Skills%20and%20Best%20Practices" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fnolowiz.com%2Fagent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices%2F&amp;linkname=Agent%20Skills%3A%20Complete%20Beginner%E2%80%99s%20Guide%20to%20AI%20Agent%20Skills%20and%20Best%20Practices" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Fnolowiz.com%2Fagent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices%2F&amp;linkname=Agent%20Skills%3A%20Complete%20Beginner%E2%80%99s%20Guide%20to%20AI%20Agent%20Skills%20and%20Best%20Practices" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fnolowiz.com%2Fagent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices%2F&#038;title=Agent%20Skills%3A%20Complete%20Beginner%E2%80%99s%20Guide%20to%20AI%20Agent%20Skills%20and%20Best%20Practices" data-a2a-url="https://nolowiz.com/agent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices/" data-a2a-title="Agent Skills: Complete Beginner’s Guide to AI Agent Skills and Best Practices"></a></p><p>The post <a rel="nofollow" href="https://nolowiz.com/agent-skills-complete-beginners-guide-to-ai-agent-skills-and-best-practices/">Agent Skills: Complete Beginner’s Guide to AI Agent Skills and Best Practices</a> appeared first on <a rel="nofollow" href="https://nolowiz.com">NoloWiz</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
