<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Booker Zhao Blog</title>
        <link>https://binggg.github.io/en/blog</link>
        <description>Booker Zhao Blog</description>
        <lastBuildDate>Sat, 18 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Open Plugins: The Plugin Standard for AI Coding Tools]]></title>
            <link>https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard</link>
            <guid>https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard</guid>
            <pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[An open standard maintained by Vercel Labs — one plugin, seven tools, write once run everywhere. From protocol specs to CloudBase MCP migration, explained in full.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>One plugin standard, shared across seven tools.</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/en/assets/images/cover-ecdf3407a8b918c87f5d671f0ad46f11.png" width="1248" height="832" class="img_ev3q">
<em>Fig: Open Plugins — install once, works across seven tools</em></p>
<p>AI coding tools are multiplying: Cursor, Claude Code, Codex, Grok Build — each with its own plugin format. Then came <strong>Open Plugins</strong>.</p>
<p>It's an open standard maintained by Vercel Labs. Install one plugin, it runs across seven tools.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-ai-coding-tools-in-a-plugin-warring-states-era">The Problem: AI Coding Tools in a "Plugin Warring States" Era<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#the-problem-ai-coding-tools-in-a-plugin-warring-states-era" class="hash-link" aria-label="Direct link to The Problem: AI Coding Tools in a &quot;Plugin Warring States&quot; Era" title="Direct link to The Problem: AI Coding Tools in a &quot;Plugin Warring States&quot; Era" translate="no">​</a></h2>
<p>Let's start with the problem.</p>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/en/assets/images/plugin-fragmentation-ec7254245d5ae234060e5ec052c0ee4c.png" width="1248" height="832" class="img_ev3q">
<em>Fig: Every tool speaks its own language — they don't integrate</em></p>
<p>Imagine you have a great set of AI coding assistants:</p>
<ul>
<li class="">A code review skill that automatically reviews changes before each commit</li>
<li class="">An MCP server connecting to your company's API documentation</li>
<li class="">A hook script that auto-formats files on save</li>
</ul>
<p>You configure it once in Claude Code. Then you switch to Cursor and have to reconfigure everything. Switch to Codex and the format is different. It's like JavaScript before npm — every library had its own module format, and reusing anything meant manual work.</p>
<!-- -->
<p>Open Plugins aims to end this fragmentation: <strong>define one standard, share across all tools</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="npx-plugins-how-to-install">npx plugins: How to Install<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#npx-plugins-how-to-install" class="hash-link" aria-label="Direct link to npx plugins: How to Install" title="Direct link to npx plugins: How to Install" translate="no">​</a></h2>
<p>One command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install a plugin from GitHub (short format)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add vercel/vercel-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Full HTTPS URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add https://github.com/vercel/vercel-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install from local directory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add ./my-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Preview components without installing</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins discover owner/repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># List locally detected tools</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins targets</span><br></div></code></pre></div></div>
<p>The <code>plugins</code> package (v1.3.4) is the Open Plugins ecosystem's "installer". Everything goes into <code>.agents/plugins/</code> after installation.</p>
<p>Its workflow can be thought of as an assembly line:</p>
<!-- -->
<p>Three installation scopes:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add repo --scope user     # User-level (~/.agents/plugins/)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add repo --scope project  # Project-level (./.agents/plugins/)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add repo --scope local    # Local dev testing only</span><br></div></code></pre></div></div>
<p>You can also target a specific tool:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add owner/repo -t grok     # Install to Grok Build only</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add owner/repo -t vscode   # Install to VS Code only</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="seven-supported-ai-coding-tools">Seven Supported AI Coding Tools<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#seven-supported-ai-coding-tools" class="hash-link" aria-label="Direct link to Seven Supported AI Coding Tools" title="Direct link to Seven Supported AI Coding Tools" translate="no">​</a></h2>
<p><code>npx plugins targets</code> detects which tools you have installed and installs to all of them automatically.</p>
<p>Here are the supported tools and their component type compatibility:</p>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/en/assets/images/plugin-7-tools-45d23f3e0daf2b2cc723fbcf4dea6f56.png" width="1248" height="832" class="img_ev3q">
<em>Fig: Seven AI coding tools, one plugin standard</em></p>
<!-- -->
<p>Full compatibility matrix:</p>
<table><thead><tr><th>Tool</th><th style="text-align:center">Skills</th><th style="text-align:center">Agents</th><th style="text-align:center">Rules</th><th style="text-align:center">Hooks</th><th style="text-align:center">MCP</th><th style="text-align:center">LSP</th></tr></thead><tbody><tr><td><strong>Claude Code</strong></td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td><strong>Cursor</strong></td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td></tr><tr><td><strong>Codex</strong></td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td><strong>Grok Build</strong></td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td></tr><tr><td><strong>Kimi Code</strong></td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td><strong>GitHub Copilot CLI</strong></td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr><tr><td><strong>VS Code</strong></td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td></tr></tbody></table>
<p>Key differences:</p>
<ul>
<li class=""><strong>Cursor</strong> doesn't support Agents but supports LSP — ideal for deep in-editor usage</li>
<li class=""><strong>Claude Code</strong> and <strong>Codex</strong> support Agents but not LSP — they follow the agent-oriented path</li>
<li class=""><strong>Grok Build</strong> is provided through xAI's CLI, compatible with Claude Code's Skills and Agents formats</li>
<li class=""><strong>GitHub Copilot CLI</strong> is the most versatile, supporting all component types</li>
<li class=""><strong>VS Code</strong> currently has Agent Plugins in Preview — requires <code>chat.plugins.enabled</code></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="protocol-breakdown">Protocol Breakdown<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#protocol-breakdown" class="hash-link" aria-label="Direct link to Protocol Breakdown" title="Direct link to Protocol Breakdown" translate="no">​</a></h2>
<p>A plugin is essentially a directory with files organized by convention.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-directory-structure">Standard Directory Structure<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#standard-directory-structure" class="hash-link" aria-label="Direct link to Standard Directory Structure" title="Direct link to Standard Directory Structure" translate="no">​</a></h3>
<!-- -->
<p>Storage paths after installation:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">~/.agents/plugins/          # User-level</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">&lt;project&gt;/.agents/plugins/  # Project-level</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pluginjson-manifest">plugin.json Manifest<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#pluginjson-manifest" class="hash-link" aria-label="Direct link to plugin.json Manifest" title="Direct link to plugin.json Manifest" translate="no">​</a></h3>
<p>The manifest is <strong>optional</strong>. If omitted, the plugin name is derived from the directory name and components are discovered in default locations only.</p>
<p>If provided, <code>name</code> is the <strong>only required field</strong>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.2.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Plugin description"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"author"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Author"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"email"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"author@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"homepage"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://example.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"repository"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://github.com/author/plugin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"license"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MIT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keywords"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"code-review"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"automation"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><code>name</code> constraints: 1-64 characters, lowercase alphanumeric/hyphens/dots, must start and end with alphanumeric, no <code>--</code> or <code>..</code>. ✅ <code>deployment-tools</code>, <code>code-reviewer</code>, <code>prompts.chat</code> ❌ <code>My-Plugin</code>, <code>-tools</code>, <code>my--plugin</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="component-discovery-algorithm">Component Discovery Algorithm<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#component-discovery-algorithm" class="hash-link" aria-label="Direct link to Component Discovery Algorithm" title="Direct link to Component Discovery Algorithm" translate="no">​</a></h3>
<p>This is the core of the protocol. The full process a tool uses to scan a plugin:</p>
<!-- -->
<p>The plugin's four-stage lifecycle — from installation to activation:</p>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/en/assets/images/plugin-workflow-38adb6eebf67a0f96f14df320234b8f6.png" width="1248" height="832" class="img_ev3q">
<em>Fig: Plugin installation, discovery, namespacing, and activation flow</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="plugin_root-path-expansion"><code>${PLUGIN_ROOT}</code> Path Expansion<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#plugin_root-path-expansion" class="hash-link" aria-label="Direct link to plugin_root-path-expansion" title="Direct link to plugin_root-path-expansion" translate="no">​</a></h3>
<p>Any configuration file within a plugin can use <code>${PLUGIN_ROOT}</code>, which the tool automatically replaces with the plugin root directory's absolute path. This makes plugins <strong>self-contained</strong> — all path references are relative to itself, working from any installation location.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"mcpServers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"db-server"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/servers/db-server"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"--config"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/config.json"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"env"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"DB_PATH"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/data"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Expansion rules: recursive expansion (nested references are replaced); escape checking ensures paths don't leave the plugin directory.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-practice-migrating-cloudbase-mcp-to-open-plugins">In Practice: Migrating CloudBase MCP to Open Plugins<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#in-practice-migrating-cloudbase-mcp-to-open-plugins" class="hash-link" aria-label="Direct link to In Practice: Migrating CloudBase MCP to Open Plugins" title="Direct link to In Practice: Migrating CloudBase MCP to Open Plugins" translate="no">​</a></h2>
<p>Enough theory — let's get real.</p>
<p>We've been maintaining an open-source project called <strong><a href="https://github.com/TencentCloudBase/CloudBase-MCP" target="_blank" rel="noopener noreferrer" class="">CloudBase MCP</a></strong> that provides cloud access for AI coding tools — AI model invocation, NoSQL/PostgreSQL databases, cloud functions, CloudRun, cloud storage, WeChat Mini Program integration, and more. Previously we manually configured <code>.claude-plugin/</code>, <code>.codex-plugin/</code>, <code>.mcp.json</code> — one config per tool, a maintenance headache. Open Plugins came at the perfect time for a migration.</p>
<p>Full migration PR: <a href="https://github.com/TencentCloudBase/CloudBase-MCP/pull/808" target="_blank" rel="noopener noreferrer" class="">TencentCloudBase/CloudBase-MCP#808</a> (+818 / -34)</p>
<blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/en/assets/images/plugin-pr808-47808da7e4707016e4a56c1aa6586dff.png" width="1248" height="832" class="img_ev3q">
<em>Fig: PR #808 before/after — from vendor-specific formats to a universal plugin standard</em></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="before-vs-after">Before vs After<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#before-vs-after" class="hash-link" aria-label="Direct link to Before vs After" title="Direct link to Before vs After" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pluginjson">plugin.json<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#pluginjson" class="hash-link" aria-label="Direct link to plugin.json" title="Direct link to plugin.json" translate="no">​</a></h3>
<p>Following the Open Plugins spec v1.0.0 closed schema, only retaining permitted metadata fields:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"$schema"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://open-plugins.com/schemas/1.0.0/plugin.schema.json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cloudbase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.2.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Tencent CloudBase — AI models, authentication, NoSQL/PostgreSQL databases, cloud functions, cloud storage, CloudRun backend services, and WeChat Mini Program integration."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"author"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Tencent CloudBase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"url"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://cloudbase.net"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"homepage"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://github.com/TencentCloudBase/cloudbase-mcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"license"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MIT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keywords"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"cloudbase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tencent-cloud"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"baas"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"ai-model"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"database"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cloud-function"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"authentication"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"storage"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cloudrun"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mcpjson">mcp.json<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#mcpjson" class="hash-link" aria-label="Direct link to mcp.json" title="Direct link to mcp.json" translate="no">​</a></h3>
<p>MCP server config moved from <code>.mcp.json</code> to the spec path <code>mcp.json</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"mcpServers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"cloudbase-mcp"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"npx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"-y"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@cloudbase/cloudbase-mcp@latest"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"env"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="automated-build">Automated Build<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#automated-build" class="hash-link" aria-label="Direct link to Automated Build" title="Direct link to Automated Build" translate="no">​</a></h3>
<p>Wrote a <code>build-open-plugin-spec.mjs</code> build script that auto-generates artifacts from <code>.claude-plugin/plugin.json</code>. Added a <code>--check</code> mode for CI — every PR auto-validates to prevent source updates without regenerating artifacts.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Generate artifacts</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">node scripts/build-open-plugin-spec.mjs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># CI mode: check only, no writes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">node scripts/build-open-plugin-spec.mjs --check</span><br></div></code></pre></div></div>
<p>GitHub Actions workflow (<code>.github/workflows/open-plugin-spec-check.yml</code>) runs checks on every PR automatically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation-results">Validation Results<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#validation-results" class="hash-link" aria-label="Direct link to Validation Results" title="Direct link to Validation Results" translate="no">​</a></h3>
<!-- -->
<p>The biggest win: installing to every tool with one command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin</span><br></div></code></pre></div></div>
<p>And because we already had 4 Skills under <code>skills/</code>, <code>npx plugins discover</code> automatically registered them as namespaced commands:</p>
<table><thead><tr><th>Component</th><th>User Invocation</th></tr></thead><tbody><tr><td><code>skills/ai-model/</code></td><td><code>/cloudbase:ai-model</code></td></tr><tr><td><code>skills/cloudbase-data/</code></td><td><code>/cloudbase:cloudbase-data</code></td></tr><tr><td><code>skills/cloud-functions/</code></td><td><code>/cloudbase:cloud-functions</code></td></tr><tr><td><code>skills/mini-program/</code></td><td><code>/cloudbase:mini-program</code></td></tr></tbody></table>
<p>No extra config needed — just place directories by convention.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-pitfall-marketplacejson-conflict">First Pitfall: marketplace.json Conflict<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#first-pitfall-marketplacejson-conflict" class="hash-link" aria-label="Direct link to First Pitfall: marketplace.json Conflict" title="Direct link to First Pitfall: marketplace.json Conflict" translate="no">​</a></h3>
<p>After PR #808 was merged, I excitedly ran <code>npx plugins add TencentCloudBase/CloudBase-MCP</code> and got:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">No plugins found. 2 remote plugin(s) not shown.</span><br></div></code></pre></div></div>
<p>The plugin was in the repo, but the CLI couldn't find it.</p>
<p>After digging: the main repo root has a <code>marketplace.json</code> — an index file for Claude Code and Codex marketplace add. The <code>npx plugins</code> CLI detected it and identified the entire repo as a <strong>marketplace</strong> (multi-plugin collection), refusing to install subdirectory plugins.</p>
<!-- -->
<p><strong>Solution: Create dedicated plugin repos</strong></p>
<p>Following Vercel (<code>vercel/vercel-plugin</code>) and Supabase (<code>supabase-community/supabase-plugin</code>) — create dedicated plugin repos whose root contains only <code>.plugin/plugin.json</code>, no <code>marketplace.json</code>, so the CLI identifies them as single plugins.</p>
<p>Created two repos:</p>
<table><thead><tr><th>Repository</th><th>Install Command</th><th>Contents</th></tr></thead><tbody><tr><td><code>TencentCloudBase/cloudbase-plugin</code></td><td><code>npx plugins add TencentCloudBase/cloudbase-plugin</code></td><td>28 skills + MCP + 5 commands + 2 agents + hooks</td></tr><tr><td><code>TencentCloudBase/cloudbase-sites-plugin</code></td><td><code>npx plugins add TencentCloudBase/cloudbase-sites-plugin</code></td><td>1 skill + MCP + hooks</td></tr></tbody></table>
<p>Content auto-synced from the main repo's <code>plugin/cloudbase/</code> and <code>plugin/cloudbase-sites/</code>, <strong>excluding <code>marketplace.json</code></strong> during sync — that's the key.</p>
<p><strong>Automated sync mechanism</strong></p>
<!-- -->
<p>New files added:</p>
<table><thead><tr><th>File</th><th>Purpose</th></tr></thead><tbody><tr><td><code>scripts/push-plugin-repos.mjs</code></td><td>Build plugin repo artifacts to <code>.plugin-repo-output/</code></td></tr><tr><td><code>.github/workflows/push-plugin-repos.yaml</code></td><td>CI auto-sync workflow</td></tr><tr><td><code>scripts/build-open-plugin-spec.mjs</code> (extended)</td><td>Handle both cloudbase + cloudbase-sites</td></tr><tr><td><code>plugin/cloudbase-sites/.plugin/plugin.json</code></td><td>cloudbase-sites Open Plugin Spec manifest</td></tr><tr><td><code>plugin/cloudbase-sites/mcp.json</code></td><td>cloudbase-sites MCP config</td></tr></tbody></table>
<p>All validations passed:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins discover TencentCloudBase/cloudbase-plugin --remote</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># → ✅ Found 1 local plugin(s), 28 skills, 5 cmds, 2 agents, hooks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin --target cursor --scope local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># → ✅ Installed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins discover TencentCloudBase/cloudbase-sites-plugin --remote</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># → ✅ Found 1 local plugin(s), 1 skill, hooks</span><br></div></code></pre></div></div>
<p>Install commands now point to the dedicated repos:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Main plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Sites plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-sites-plugin</span><br></div></code></pre></div></div>
<p>The core lesson: <strong>Open Plugins treats a repo with <code>marketplace.json</code> at its root as a plugin collection, not a single plugin.</strong> If your repo has multiple artifacts (like CloudBase-MCP with both an MCP server and plugins), you need dedicated plugin repos. Vercel and Supabase do the same.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hook-system">The Hook System<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#the-hook-system" class="hash-link" aria-label="Direct link to The Hook System" title="Direct link to The Hook System" translate="no">​</a></h2>
<p>When I read the spec, the Hook system was the most striking part — it can hook into every lifecycle point of an agent workflow. But heads up: <strong>Hooks aren't in Spec v1</strong>, support is entirely up to the host tool. Claude Code and Copilot CLI have the fullest support, VS Code and Kimi Code don't recognize them (silently ignored, no error).</p>
<blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/en/assets/images/plugin-hooks-219675d408175ba022567eb56f473c84.png" width="1248" height="832" class="img_ev3q">
<em>Fig: The Hook system — complete event chain from SessionStart to SessionEnd</em></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="event-overview">Event Overview<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#event-overview" class="hash-link" aria-label="Direct link to Event Overview" title="Direct link to Event Overview" translate="no">​</a></h3>
<!-- -->
<table><thead><tr><th>Event</th><th>When It Fires</th><th>Matcher Scope</th></tr></thead><tbody><tr><td><code>PreToolUse</code></td><td><strong>Before</strong> agent calls a tool</td><td>Tool name</td></tr><tr><td><code>PostToolUse</code></td><td><strong>After</strong> successful tool call</td><td>Tool name</td></tr><tr><td><code>PostToolUseFailure</code></td><td><strong>On</strong> tool call error</td><td>Tool name</td></tr><tr><td><code>BeforeReadFile</code></td><td><strong>Before</strong> reading a file</td><td>File path</td></tr><tr><td><code>AfterFileEdit</code></td><td><strong>After</strong> writing a file</td><td>File path</td></tr><tr><td><code>BeforeShellExecution</code></td><td><strong>Before</strong> executing a shell command</td><td>Command string</td></tr><tr><td><code>AfterShellExecution</code></td><td><strong>After</strong> shell command completes</td><td>Command string</td></tr><tr><td><code>SessionStart</code></td><td><strong>When</strong> session begins</td><td>—</td></tr><tr><td><code>SessionEnd</code></td><td><strong>When</strong> session ends</td><td>—</td></tr><tr><td><code>UserPromptSubmit</code></td><td><strong>When</strong> user submits a prompt</td><td>—</td></tr><tr><td><code>Stop</code></td><td><strong>When</strong> agent attempts to stop</td><td>—</td></tr><tr><td><code>SubagentStart</code></td><td><strong>When</strong> subagent starts</td><td>—</td></tr><tr><td><code>SubagentStop</code></td><td><strong>When</strong> subagent ends</td><td>—</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-action-types">Three Action Types<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#three-action-types" class="hash-link" aria-label="Direct link to Three Action Types" title="Direct link to Three Action Types" translate="no">​</a></h3>
<!-- -->
<p><strong>command</strong> — Execute an external script, event context passed via stdin JSON:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"command"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/scripts/lint.sh"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><strong>prompt</strong> — Send a prompt to the LLM, <code>$ARGUMENTS</code> replaced with event context:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"prompt"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"prompt"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Review the change: $ARGUMENTS"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><strong>agent</strong> — Similar to prompt but with tool access, enabling multi-step verification:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"agent"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"prompt"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Verify style guide compliance: $ARGUMENTS"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="execution-model">Execution Model<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#execution-model" class="hash-link" aria-label="Direct link to Execution Model" title="Direct link to Execution Model" translate="no">​</a></h3>
<!-- -->
<ul>
<li class="">Multiple rules can match the same event — <strong>all execute</strong></li>
<li class="">Hooks within the same rule run <strong>sequentially in array order</strong></li>
<li class="">Implementations <strong>should set timeouts</strong></li>
<li class="">Failures <strong>must not crash the host tool</strong></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-open-plugins-support-to-your-tool">Adding Open Plugins Support to Your Tool<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#adding-open-plugins-support-to-your-tool" class="hash-link" aria-label="Direct link to Adding Open Plugins Support to Your Tool" title="Direct link to Adding Open Plugins Support to Your Tool" translate="no">​</a></h2>
<p>If you're building an AI coding tool and want plugin ecosystem compatibility, five things to implement:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="five-core-capabilities">Five Core Capabilities<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#five-core-capabilities" class="hash-link" aria-label="Direct link to Five Core Capabilities" title="Direct link to Five Core Capabilities" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-by-tool">Integration by Tool<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#integration-by-tool" class="hash-link" aria-label="Direct link to Integration by Tool" title="Direct link to Integration by Tool" translate="no">​</a></h3>
<p>Each tool has a different existing plugin mechanism. <code>npx plugins</code> does a translation layer during installation — converting the universal <code>.plugin/</code> format into each tool's native format:</p>
<table><thead><tr><th>Tool</th><th>Install Target</th><th>Integration Mechanism</th></tr></thead><tbody><tr><td><strong>Claude Code</strong></td><td><code>.claude/plugins/</code></td><td>Skills and config directly compatible</td></tr><tr><td><strong>Cursor</strong></td><td><code>.cursor/plugins/</code></td><td>Registered via Rules + MCP mechanism</td></tr><tr><td><strong>Codex</strong></td><td>Marketplace entry <code>vercel@openai-curated</code></td><td>Built-in Vercel integration</td></tr><tr><td><strong>Grok Build</strong></td><td><code>grok plugin install</code></td><td>Native plugin commands + Claude Code compatibility layer</td></tr><tr><td><strong>Kimi Code</strong></td><td>Kimi plugin store</td><td>Visible after <code>/plugins</code> TUI reload</td></tr><tr><td><strong>GitHub Copilot CLI</strong></td><td><code>copilot plugin marketplace add</code></td><td><code>plugin add plugin@marketplace</code> after registering source</td></tr><tr><td><strong>VS Code</strong></td><td><code>chat.pluginLocations</code> setting</td><td>Requires enabling <code>chat.plugins.enabled</code> (Preview)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-protection-model">Security Protection Model<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#security-protection-model" class="hash-link" aria-label="Direct link to Security Protection Model" title="Direct link to Security Protection Model" translate="no">​</a></h3>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-thoughts">Closing Thoughts<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#closing-thoughts" class="hash-link" aria-label="Direct link to Closing Thoughts" title="Direct link to Closing Thoughts" translate="no">​</a></h2>
<p>Open Plugins reminds me of when npm was just gaining traction ten years ago. JavaScript package management was a mess: AMD, CommonJS, UMD, IIFE… every project had its own system. Then npm + ES Modules unified the standard, and the entire ecosystem took off. The AI coding tool plugin ecosystem is in that "pre-npm" era right now.</p>
<p>Migrating CloudBase MCP was a fascinating process. From <code>npx plugins discover</code> identifying the plugin, to installing it across every tool with one command — that feeling of "write once, use everywhere" is exactly what this standard aims to deliver.</p>
<blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/en/assets/images/plugin-install-all-1bab04ee12d17a0b252b239c25158c50.png" width="1248" height="832" class="img_ev3q">
<em>Fig: npx plugins add TencentCloudBase/cloudbase-plugin — one command to install everywhere</em></p>
</blockquote>
<!-- -->
<p>If you build extensions for AI coding tools, I recommend checking out the Open Plugins spec. The good news is you don't need anything complex — just add a <code>.plugin/plugin.json</code> to your project and it becomes discoverable by 7 tools. Our migration was about 400 lines of code, finished in under two days.</p>
<p>The CloudBase-MCP plugins are at these repos, for reference:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-sites-plugin</span><br></div></code></pre></div></div>
<p>Open Plugins isn't "mature" yet, but the direction is right. Getting the same plugin to work across different tools is a problem worth solving. The rest depends on how the community grows.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="references">References<a href="https://binggg.github.io/en/blog/2026/07/18/open-plugins-standard#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://open-plugins.com/" target="_blank" rel="noopener noreferrer" class="">Open Plugins Official Site</a></li>
<li class=""><a href="https://www.npmjs.com/package/plugins" target="_blank" rel="noopener noreferrer" class="">plugins npm package</a> — the <code>npx plugins add</code> installer</li>
<li class=""><a href="https://agentskills.io/" target="_blank" rel="noopener noreferrer" class="">Agent Skills Specification</a></li>
<li class=""><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol</a></li>
<li class=""><a href="https://github.com/TencentCloudBase/cloudbase-plugin" target="_blank" rel="noopener noreferrer" class="">CloudBase Plugin</a> — Open Plugins standard plugin repo</li>
<li class=""><a href="https://github.com/TencentCloudBase/cloudbase-sites-plugin" target="_blank" rel="noopener noreferrer" class="">CloudBase Sites Plugin</a> — Sites plugin repo</li>
<li class=""><a href="https://github.com/TencentCloudBase/CloudBase-MCP" target="_blank" rel="noopener noreferrer" class="">CloudBase MCP</a> — Tencent Cloud MCP plugin</li>
<li class=""><a href="https://github.com/TencentCloudBase/CloudBase-MCP/pull/808" target="_blank" rel="noopener noreferrer" class="">PR #808: CloudBase MCP Open Plugin Spec Integration</a></li>
</ul>]]></content:encoded>
            <category>AI</category>
            <category>开源</category>
            <category>全栈</category>
            <category>CloudBase</category>
        </item>
        <item>
            <title><![CDATA[Hands-free coding: the logic behind Claude Code's five 'let-go' mechanisms]]></title>
            <link>https://binggg.github.io/en/blog/claude-code-five-mechanisms</link>
            <guid>https://binggg.github.io/en/blog/claude-code-five-mechanisms</guid>
            <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[From /goal to Workflows — five mechanisms that solve one problem: how to make AI run continuously, decide autonomously, and collaborate in parallel under a turn-based model.]]></description>
            <content:encoded><![CDATA[<p>If you've used Claude Code for complex tasks, you've probably experienced this:</p>
<p>You ask it to replace all <code>fetch</code> calls with <code>axios</code>, grab a coffee, come back — and it's done three files and stopped waiting for approval. Repeat seven or eight times, and your coffee is cold.</p>
<p>Or you ran <code>/loop</code> overnight to watch a PR, wake up to find it got stuck on a <code>git merge</code> conflict at 2 AM. The window has been open all night.</p>
<p>Or you launched three sub-agents to research independently — and ended up with three contradictory conclusions because none of them saw what the others were doing.</p>
<p>The root cause isn't that AI isn't smart enough. Claude Code is <strong>turn-based</strong> — each turn does one thing, then waits for you to decide the next step. To make it run continuously, decide autonomously, and work in parallel, you need orchestration mechanisms to bridge the gap.</p>
<p>Claude Code gives you five: <code>/goal</code>, <code>/loop</code>, sub-agent, Agent Teams, and Workflows.</p>
<p>Pick wrong, and you're not just wasting tokens — you're making things more complicated.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pain-point-1-im-waiting-for-it-its-waiting-for-me">Pain point 1: I'm waiting for it, it's waiting for me<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#pain-point-1-im-waiting-for-it-its-waiting-for-me" class="hash-link" aria-label="Direct link to Pain point 1: I'm waiting for it, it's waiting for me" title="Direct link to Pain point 1: I'm waiting for it, it's waiting for me" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Pain point 1: stuck in turn-based approval loop" src="https://binggg.github.io/en/assets/images/scene-02-goal-dcc74208309f853f2167fa1fdd12ea99.png" width="1264" height="848" class="img_ev3q"></p>
<p>You give AI a clear goal. It's capable of completing it. But after every turn it stops and waits for your approval. This is what <code>/goal</code> solves.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="goal--conditional-autonomous-polling">/goal — conditional autonomous polling<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#goal--conditional-autonomous-polling" class="hash-link" aria-label="Direct link to /goal — conditional autonomous polling" title="Direct link to /goal — conditional autonomous polling" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/goal Complete data-editor test generalization into a cross-module standard test framework in three steps:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Step 1: Create shared test-utils.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Step 2: Create verify-*.sh for each module</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Step 3: Update acceptance criteria</span><br></div></code></pre></div></div>
<p>Under the hood it's a lightweight Stop Hook: registering a <code>type: 'prompt'</code> hook into <code>sessionHooksRegistry</code>, triggered after each turn for evaluation.</p>
<p>The evaluator receives three things:</p>
<ol>
<li class=""><strong>Goal condition</strong> — your <code>/goal</code> description</li>
<li class=""><strong>Conversation transcript</strong> — everything since the goal was set</li>
<li class=""><strong>Metadata</strong> — session ID, timestamp, permission mode, etc.</li>
</ol>
<p>Output is structured JSON:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">{"ok": false, "reason": "Step 1 complete, test-utils.sh created, but Step 2 hasn't started"}</span><br></div></code></pre></div></div>
<p><code>ok: true</code> → stop. <code>ok: false</code> → continue with reason.</p>
<p>Key design: <strong>the working model and the evaluating model are separate</strong>. The main model doesn't grade itself. The evaluator only reads transcripts, not executing, so it can judge objectively.</p>
<p>Limitations:</p>
<ul>
<li class=""><strong>Serial</strong> — one turn at a time, just saves you from pressing Enter manually</li>
<li class=""><strong>Evaluator is opaque</strong> — no logs telling you why it passed or failed</li>
<li class=""><strong>Transcript grows</strong> — longer conversations mean higher evaluation cost each turn</li>
<li class=""><strong>Evaluation latency</strong> — Haiku is faster, Sonnet is more accurate</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use">When to use<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#when-to-use" class="hash-link" aria-label="Direct link to When to use" title="Direct link to When to use" translate="no">​</a></h4>
<p><strong>Good for</strong>: tasks with a clear terminal state, potentially spanning multiple turns, where you don't want to sit and supervise.</p>
<p><strong>Not for</strong>: continuous monitoring scenarios (use <code>/loop</code>), or open-ended exploratory tasks.</p>
<p>One detail: you can swap the evaluator model. Use Sonnet for complex goals and a smaller model for simpler ones to save cost.</p>
<p>Requires v2.1.139+</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pain-point-2-projects-go-stale-when-left-alone">Pain point 2: projects go stale when left alone<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#pain-point-2-projects-go-stale-when-left-alone" class="hash-link" aria-label="Direct link to Pain point 2: projects go stale when left alone" title="Direct link to Pain point 2: projects go stale when left alone" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Pain point 2: loop stuck all night" src="https://binggg.github.io/en/assets/images/scene-03-loop-fe108e0144b41396c91c37bab0d5fbe7.png" width="1264" height="848" class="img_ev3q"></p>
<p>Many scenarios have no end state — PRs need ongoing attention, CI failures need handling, dependencies need upgrading. You can't watch the terminal 24/7. But if you don't, it might get stuck all night.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="loop--adaptive-scheduler">/loop — adaptive scheduler<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#loop--adaptive-scheduler" class="hash-link" aria-label="Direct link to /loop — adaptive scheduler" title="Direct link to /loop — adaptive scheduler" translate="no">​</a></h3>
<p><code>/goal</code> cares about "is it done." <code>/loop</code> cares about "what needs to be done now."</p>
<p>Without arguments, it runs a three-stage pipeline:</p>
<ol>
<li class="">Finish incomplete work</li>
<li class="">Check current PR comments, CI status, merge conflicts</li>
<li class="">Run lint, type checking, formatting</li>
</ol>
<p>Interval adjusts dynamically: 1 minute when active, gradually extending to 1 hour when idle.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/loop          # adaptive mode (recommended for daily use)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/loop 15m      # fixed 15-minute interval</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/loop 2h       # fixed 2-hour interval</span><br></div></code></pre></div></div>
<p>The three stages aren't hardcoded logic — they're built-in prompt templates. Claude decides which step to execute. Adaptive intervals also depend on Claude's perception of "what just happened," not external metrics (CI status, CPU, logs).</p>
<p>This limitation explains why adaptive mode is unavailable on Bedrock, Vertex AI, and Azure Foundry — it falls back to a fixed 10-minute interval. Those platform APIs don't support "model decides interval" communication patterns.</p>
<p><strong>Cost</strong>: <code>/loop</code> runs in the <strong>same session</strong>. Turn 10's context is much heavier than turn 1's — it carries artifacts from the previous 9 turns. Overhead increases, attention dilutes. The issue isn't <code>/loop</code> itself being expensive — it's session aging.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pain-point-3-main-context-gets-polluted-with-junk">Pain point 3: main context gets polluted with junk<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#pain-point-3-main-context-gets-polluted-with-junk" class="hash-link" aria-label="Direct link to Pain point 3: main context gets polluted with junk" title="Direct link to Pain point 3: main context gets polluted with junk" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Pain point 3: context overflow" src="https://binggg.github.io/en/assets/images/scene-04-subagent-e0326cac27bc643eafecc097c7774e99.png" width="1264" height="848" class="img_ev3q"></p>
<p>When a session runs long, the context fills up with intermediate artifacts — docs you read, approaches you tried, paths you corrected. You're spending more tokens while the model gets "dumber." But your auxiliary work (reading API docs, researching libraries, validating hypotheses) shouldn't pollute the main thread.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sub-agent--context-isolated-workers">Sub-Agent — context-isolated workers<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#sub-agent--context-isolated-workers" class="hash-link" aria-label="Direct link to Sub-Agent — context-isolated workers" title="Direct link to Sub-Agent — context-isolated workers" translate="no">​</a></h3>
<p>Sub-agents solve the "main context is precious" problem. Each sub-agent starts with a <strong>fresh context window</strong> — it can't see your conversation history. It only returns a summary when done, never polluting the main session. Nesting is limited to 5 levels, hardcoded and not configurable.</p>
<p><strong>Isolation mechanism</strong> (source code from <code>forkedAgent.ts</code>):</p>
<ul>
<li class=""><strong>Independent AbortController</strong>: parent session cancellation doesn't affect sub-agents, and vice versa</li>
<li class=""><strong>No-op state propagation</strong>: parent session doesn't pass any internal state. The sub-agent doesn't even know which tools the parent used. To share context, you must explicitly pass it via prompt</li>
</ul>
<p>The 5-level limit is practical: each nesting level opens a new LLM session. Depth 5 means maintaining 5 sessions' token overhead simultaneously. Sub-agents beyond the depth limit won't receive Agent tools — effectively silently rejected.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-ways-to-create">Three ways to create<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#three-ways-to-create" class="hash-link" aria-label="Direct link to Three ways to create" title="Direct link to Three ways to create" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Method 1: one-shot</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/agent Go research this function's call chain</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Method 2: config file (persistent)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># .claude/agents/researcher.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name: researcher</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">description: Agent specialized in technical research, good at reading source code and docs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">prompt: You focus on research...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model: claude-sonnet-4-20260514</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">disallowedTools: [Write, Edit]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Method 3: SDK</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">const agent = claude.subAgent({ prompt: "..." });</span><br></div></code></pre></div></div>
<p>The <code>description</code> field in config files has a special role — Claude automatically decides when to delegate tasks based on descriptions.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-1">When to use<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#when-to-use-1" class="hash-link" aria-label="Direct link to When to use" title="Direct link to When to use" translate="no">​</a></h4>
<table><thead><tr><th>Scenario</th><th>Use sub-agent?</th></tr></thead><tbody><tr><td>Research a function's call chain</td><td>Use <code>/agent</code>, one-shot, simple</td></tr><tr><td>Frequent research tasks</td><td>Write a YAML file, persistent and reusable</td></tr><tr><td>Parallel research of multiple approaches</td><td>One sub-agent each, no interference</td></tr><tr><td>Simple grep</td><td>No, main session is faster</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sub-agents-in-teams">Sub-agents in teams<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#sub-agents-in-teams" class="hash-link" aria-label="Direct link to Sub-agents in teams" title="Direct link to Sub-agents in teams" translate="no">​</a></h4>
<p>In multi-person collaboration, project-level <code>.claude/agents/</code> directories can be git-shared. Team members push their configured agents, others pull them down and use them. This makes agent configuration an engineering asset — part of the project, like <code>.claude/rules/</code>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pain-point-4-ten-tasks-crammed-together">Pain point 4: ten tasks crammed together<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#pain-point-4-ten-tasks-crammed-together" class="hash-link" aria-label="Direct link to Pain point 4: ten tasks crammed together" title="Direct link to Pain point 4: ten tasks crammed together" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Pain point 4: multiple tasks mixed up" src="https://binggg.github.io/en/assets/images/scene-05-teams-badc9de86000a139c4c7c62bdf4a39d9.png" width="1264" height="848" class="img_ev3q"></p>
<p><code>/goal</code> runs one task. Sub-agent handles one sub-task. But you have ten things to do — fix bugs, refactor modules, write docs, prepare demos. You can't do them one by one, and you can't let them step on each other.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agent-teams--observable-parallelism">Agent Teams — observable parallelism<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#agent-teams--observable-parallelism" class="hash-link" aria-label="Direct link to Agent Teams — observable parallelism" title="Direct link to Agent Teams — observable parallelism" translate="no">​</a></h3>
<p>Introduced in Claude Code v2.1.166+. Core idea: each task runs in an independent session, no interference. The main session creates tasks with an agenda (like a job description). The Teams layer handles scheduling.</p>
<p><strong>Key behavior</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Task → sub-Agent session (independent, invisible)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ↕</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Task → sub-Agent session (independent, invisible)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ↕</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Main session ← observable ← Agent reporting</span><br></div></code></pre></div></div>
<p>Compared to sub-agents, Teams adds three layers:</p>
<ol>
<li class=""><strong>Observability</strong> — main session sees each Agent's real-time progress</li>
<li class=""><strong>Parallel execution</strong> — each Agent runs in its own session, truly parallel</li>
<li class=""><strong>Passive scheduling</strong> — no need to explicitly specify when to do what; the system decides automatically</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="task-assignment-rules">Task assignment rules<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#task-assignment-rules" class="hash-link" aria-label="Direct link to Task assignment rules" title="Direct link to Task assignment rules" translate="no">​</a></h4>
<p>The main session decomposes tasks and distributes them. The decomposition isn't fixed prompt engineering — it's the model's own judgment. Give it an agenda like "refactor the user module" and it decides how to split.</p>
<p>The granularity of decomposition tells you how well it understood: coarse means it didn't really get it; fine-grained means it understood the dependency chain.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="debugging-challenges">Debugging challenges<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#debugging-challenges" class="hash-link" aria-label="Direct link to Debugging challenges" title="Direct link to Debugging challenges" translate="no">​</a></h4>
<p>Independent sessions mean independent token consumption. When things work, fine. When they break, you have no idea which Agent, at which step, for what reason. There's no global log — each session's input/output can only be examined individually.</p>
<p>The official UI shows them in the same TUI, but the data from independent sessions can only be inspected indirectly through the main session. There's no centralized debug view. This is the natural cost of parallelism.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pain-point-5-complex-tasks-cant-be-driven-by-pure-conversation">Pain point 5: complex tasks can't be driven by pure conversation<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#pain-point-5-complex-tasks-cant-be-driven-by-pure-conversation" class="hash-link" aria-label="Direct link to Pain point 5: complex tasks can't be driven by pure conversation" title="Direct link to Pain point 5: complex tasks can't be driven by pure conversation" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Pain point 5: complex tasks need determinism" src="https://binggg.github.io/en/assets/images/scene-06-workflow-1a1ed87dbbcc55278b78b0b1a54b5037.png" width="1264" height="848" class="img_ev3q"></p>
<p>Some tasks aren't "just do it" — they're multi-step with tight coupling between phases: research first, then design, then code, then test. One wrong step derails everything. Without a framework to constrain the process, relying purely on the model's free-form reasoning means "works the first time, fails the second."</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflows--deterministic-process">Workflows — deterministic process<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#workflows--deterministic-process" class="hash-link" aria-label="Direct link to Workflows — deterministic process" title="Direct link to Workflows — deterministic process" translate="no">​</a></h3>
<p>Workflows is Claude Code's newer mechanism, using declarative YAML to define multi-agent collaboration topology. The difference from Teams isn't about which is more powerful — it's about <strong>different orchestration philosophy</strong>:</p>
<table><thead><tr><th></th><th>Teams</th><th>Workflows</th></tr></thead><tbody><tr><td>Topology</td><td>Hub-and-Spoke (star)</td><td>Directed acyclic graph (DAG)</td></tr><tr><td>Scheduling</td><td>Passive — created, then system-driven</td><td>Explicit — you define step order</td></tr><tr><td>Communication</td><td>Main session observes one-way reporting</td><td>Previous step output feeds next step input</td></tr><tr><td>Determinism</td><td>Low — depends on model performance</td><td>High — parameter tunable, reproducible</td></tr><tr><td>Best for</td><td>Exploratory, high-uncertainty tasks</td><td>Deterministic, quality-stable tasks</td></tr></tbody></table>
<p>Workflow phase definition:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"feature-dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">agents</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">design</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"You handle technical design..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">implement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"You handle implementation..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">review</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"You handle code review..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">agent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> design</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DESIGN</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">agent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> implement</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">input</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DESIGN</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CODE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">agent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> review</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">input</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CODE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> REVIEW</span><br></div></code></pre></div></div>
<p>Each step's <code>output</code> is the previous step's output path; <code>input</code> is the current step's input. The chain is clear — when something breaks, you know which step.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflow-task-types">Workflow task types<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#workflow-task-types" class="hash-link" aria-label="Direct link to Workflow task types" title="Direct link to Workflow task types" translate="no">​</a></h4>
<p>Three built-in types:</p>
<ul>
<li class=""><strong>feature</strong> — serial step-by-step</li>
<li class=""><strong>swe</strong> — software engineering multi-turn loop (design → code → test → fix → review)</li>
<li class=""><strong>research</strong> — exploratory research (not multi-step, lets the agent explore freely)</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="decision-guide-which-mechanism-for-which-scenario">Decision guide: which mechanism for which scenario?<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#decision-guide-which-mechanism-for-which-scenario" class="hash-link" aria-label="Direct link to Decision guide: which mechanism for which scenario?" title="Direct link to Decision guide: which mechanism for which scenario?" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Decision tree: which of the five mechanisms to choose" src="https://binggg.github.io/en/assets/images/scene-07-decision-be51f574ee993a9fe952666b103db150.png" width="1264" height="848" class="img_ev3q"></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">                   What's your pain point?</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                           │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          ┌────────────────┼────────────────┐</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          ▼                ▼                ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Turn-by-turn approval   Can't watch      Task too complex</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   /goal                   /loop            Workflows</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          │                │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          ▼                ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Main context bloated   Ten tasks at once</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   sub-agent              Agent Teams</span><br></div></code></pre></div></div>
<p>Specifically:</p>
<ul>
<li class=""><strong>Single clear goal, potentially multi-turn process</strong> → /goal (serial autonomous, lightest weight)</li>
<li class=""><strong>No end state, needs ongoing attention</strong> → /loop (adaptive, but watch for session aging)</li>
<li class=""><strong>Auxiliary work shouldn't pollute main context</strong> → sub-agent (best isolation)</li>
<li class=""><strong>Multiple independent tasks simultaneously</strong> → Agent Teams (true parallelism)</li>
<li class=""><strong>Quality stability required, tightly coupled steps</strong> → Workflows (most deterministic)</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final thoughts<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#final-thoughts" class="hash-link" aria-label="Direct link to Final thoughts" title="Direct link to Final thoughts" translate="no">​</a></h2>
<p>The common source of these pain points isn't Claude Code's feature gaps — it's that <strong>we're asking AI to do things its design isn't optimized for</strong>: running continuously, deciding autonomously, collaborating in parallel. <code>/goal</code> disguises turn-based interaction as continuous execution. <code>/loop</code> packages waiting as adaptive scheduling. Sub-agents fight context bloat with isolation. Every mechanism compensates for the turn-based model's limitations.</p>
<p>From a patchwork perspective, they're indeed hooks and session-level wrappers. But look at it differently: Claude Code didn't reinvent the runtime. It built a spectrum of orchestration capabilities on top of the turn-based model — from simple to complex, from serial to parallel — using the lightest-weight approaches possible (hooks, new sessions, JS sandbox).</p>
<p><strong>Turn-based isn't a flaw — it's a constraint.</strong> Each turn handing control back means interruptible, auditable, and intervenable. Systems that run continuously are hard to stop when something goes wrong. Turn-based gives you a natural safety boundary.</p>
<p><strong>Orchestration is the art of trade-offs.</strong> Want predictability? Use Workflows, lose flexibility. Want isolation? Use sub-agents, accept context sync costs. No perfect mechanism — only trade-offs.</p>
<p><strong>The most expensive thing isn't tokens — it's your attention.</strong> Saving the time you spend staring at the terminal is worth far more than saving a few tokens. Freeing cognitive bandwidth is the real value of these mechanisms.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-easter-egg-a-ready-to-use-agent-config-pack">🥚 Easter egg: a ready-to-use agent config pack<a href="https://binggg.github.io/en/blog/claude-code-five-mechanisms#-easter-egg-a-ready-to-use-agent-config-pack" class="hash-link" aria-label="Direct link to 🥚 Easter egg: a ready-to-use agent config pack" title="Direct link to 🥚 Easter egg: a ready-to-use agent config pack" translate="no">​</a></h2>
<p>The most useful thing I can do is give you pre-configured agents. Here's my current <code>.claude/agents/</code> setup — three configured Agents, each focused on one thing:</p>
<p><strong>1. researcher — research only, no code changes</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .claude/agents/researcher.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> researcher</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Agent specialized in technical research</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> good at reading source code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> docs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> and validating hypotheses</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  You are a technical research assistant.</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  Your tool permissions are read-only: you can Read, Grep, Glob, but not Edit, Write, or Bash (except non-destructive commands).</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  Your task format:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    ## Research Goal</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    [Question to investigate]</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    ## Context</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    [Relevant code/documentation location]</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  Output:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    - Key findings (3-5 items)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    - Evidence sources (file path + line number)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    - Recommended approach or next steps</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">disallowedTools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Bash</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p><strong>2. reviewer — code review, no code changes</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .claude/agents/reviewer.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> reviewer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Code review focused on security</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> performance</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> maintainability</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  You are a code review assistant.</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  Read-only. Given a PR diff or code block, review against:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  1. Security (SQL injection, XSS, credential leaks)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  2. Performance (N+1 queries, unnecessary loops, memory leaks)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  3. Maintainability (code duplication, naming, complexity)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  4. Test coverage (what's missing, how to add)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  Each issue gets a severity label: P0(must fix) / P1(should fix) / P2(nice to fix)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">disallowedTools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p><strong>3. refactorer — focused on refactoring, full permissions</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .claude/agents/refactorer.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> refactorer  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Code refactoring agent for well</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">scoped refactoring tasks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  You are a refactoring assistant.</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  You receive a specific module path + refactoring goal.</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  Rules:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - Before refactoring, run tests once to confirm baseline passes</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - After each change, run related tests; roll back on failure</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - Don't modify files outside the module boundary</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - Output a change summary after refactoring</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">allowedTools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Read</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Bash</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Glob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Grep</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p><strong>Usage</strong>: Drop these files in your project's <code>.claude/agents/</code> directory, then call <code>/agent researcher</code> or <code>/agent reviewer</code> from Claude Code. Push to the repo and the whole team can use them.</p>
<hr>
<p><strong>What scenarios are you using these mechanisms for? What pitfalls have you hit? Drop a comment!</strong></p>
<hr>
<p><em>Based on real Claude Code usage + source code analysis (forkedAgent.ts / sessionHooksRegistry / DynamicWorkflow testing), regularly updated.</em></p>]]></content:encoded>
            <category>Claude Code</category>
            <category>AI Programming</category>
            <category>Agent</category>
        </item>
        <item>
            <title><![CDATA[Codex grew 7x in 6 months and non-programmers are using it — here's how to go from zero to deployed multiplayer game]]></title>
            <link>https://binggg.github.io/en/blog/codex-getting-started-cloudbase</link>
            <guid>https://binggg.github.io/en/blog/codex-getting-started-cloudbase</guid>
            <pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A complete Codex onboarding guide — build Snake in 5 minutes, understand permissions & plugins, save costs with Chinese open-source models, and deploy a multiplayer game to CloudBase.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>This article covers four things: ① What Codex is and what it can do → ② Five-minute hands-on: build a playable game → ③ Core usage and features → ④ Connect low-cost Chinese open-source models and deploy your app so others can access it.</p>
<p><strong>Short on time?</strong> Codex now supports DeepSeek, GLM, and other affordable models. <strong>Want to save money + one-click deploy? Jump to Step 4</strong> and copy one config. Want the full picture? Read on.</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://tcb-advanced-a656fc-1257967285.tcloudbaseapp.com/codex-article/images/scenes/codex-longform.png" alt="Codex at a glance: from what it is, to configuring models, installing plugins, and deploying" class="img_ev3q"></p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1--meet-codex">Step 1 · Meet Codex<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#step-1--meet-codex" class="hash-link" aria-label="Direct link to Step 1 · Meet Codex" title="Direct link to Step 1 · Meet Codex" translate="no">​</a></h2>
<p>Codex is OpenAI's AI coding desktop tool. In the first half of 2026, its weekly active users grew from 600K to <strong>5 million</strong>. The growth was so notable that in April, Sam Altman posted on X: "Resetting all user limits — I'll reset again for every million more." Most interesting stat: about <strong>20% of users don't write code at all</strong> — they're product managers, operators, investors.</p>
<p>What matters to you: on June 18, OpenAI opened up third-party models. DeepSeek, GLM, Kimi — all pluggable now. Run cheap Chinese models and dramatically cut your costs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-is-it-different-from-chatgpt">How is it different from ChatGPT?<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#how-is-it-different-from-chatgpt" class="hash-link" aria-label="Direct link to How is it different from ChatGPT?" title="Direct link to How is it different from ChatGPT?" translate="no">​</a></h3>
<p>Most people's first reaction: "Isn't this just ChatGPT that can write code?" Not even close.</p>
<p>ChatGPT is conversational — you ask, it answers, it gives advice, but you still have to do the work yourself. Codex works directly on your file system. You tell it "write a Snake game" — it creates files, installs dependencies, runs and debugs.</p>
<p>Example: ask ChatGPT to write Snake, it gives you code. You have to create the file, paste it, install libraries, run it, debug it. Ask Codex to write Snake — it creates a project folder, generates code, installs dependencies, runs the game. If it errors, it reads the error, fixes the code, and retries until it works.</p>
<p><strong>ChatGPT is an advisor. Codex is the one who gets things done.</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2--five-minutes-to-a-playable-game">Step 2 · Five minutes to a playable game<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#step-2--five-minutes-to-a-playable-game" class="hash-link" aria-label="Direct link to Step 2 · Five minutes to a playable game" title="Direct link to Step 2 · Five minutes to a playable game" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-it-download--login--meet-the-ui">Install it: Download · Login · Meet the UI<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#install-it-download--login--meet-the-ui" class="hash-link" aria-label="Direct link to Install it: Download · Login · Meet the UI" title="Direct link to Install it: Download · Login · Meet the UI" translate="no">​</a></h3>
<p>Go to <a href="https://codex.com/" target="_blank" rel="noopener noreferrer" class="">codex.com</a>, download the desktop app, log in with your OpenAI account.</p>
<p>The interface is simple — three parts:</p>
<ul>
<li class=""><strong>Left</strong>: project file list</li>
<li class=""><strong>Center</strong>: conversation window + code editor</li>
<li class=""><strong>Bottom right</strong>: terminal (see what it's doing)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-task-one-sentence-build-snake">First task: one sentence, build Snake<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#first-task-one-sentence-build-snake" class="hash-link" aria-label="Direct link to First task: one sentence, build Snake" title="Direct link to First task: one sentence, build Snake" translate="no">​</a></h3>
<p>Open Codex, type in the chat:</p>
<blockquote>
<p>Write a Snake game in Python using pygame, make it runnable</p>
</blockquote>
<p>It starts working immediately. Watch the center panel — it creates files, writes code, then auto-runs.</p>
<p>It might error on the first try (e.g., pygame not installed). It detects the problem, installs the dependency, and retries. Eventually a window pops up and Snake is running.</p>
<p>From opening Codex to playing the game — <strong>five minutes</strong> if you're quick.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3--before-you-dive-in-understand-these">Step 3 · Before you dive in, understand these<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#step-3--before-you-dive-in-understand-these" class="hash-link" aria-label="Direct link to Step 3 · Before you dive in, understand these" title="Direct link to Step 3 · Before you dive in, understand these" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-three-permission-levels-what-codex-can-touch">① Three permission levels: what Codex can touch<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#-three-permission-levels-what-codex-can-touch" class="hash-link" aria-label="Direct link to ① Three permission levels: what Codex can touch" title="Direct link to ① Three permission levels: what Codex can touch" translate="no">​</a></h3>
<p>Codex has three permission levels:</p>
<ul>
<li class=""><strong>Clipboard Only</strong>: read-only clipboard access. Safe but useless.</li>
<li class=""><strong>Read &amp; Write Files</strong>: can read and write files. The sweet spot for daily work.</li>
<li class=""><strong>Admin</strong>: can install software, change system settings.</li>
</ul>
<p>Default is Read &amp; Write — good enough for building games, writing code, and deploying.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-plugin--skill--mcp-three-easily-confused-terms">② Plugin · Skill · MCP: three easily confused terms<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#-plugin--skill--mcp-three-easily-confused-terms" class="hash-link" aria-label="Direct link to ② Plugin · Skill · MCP: three easily confused terms" title="Direct link to ② Plugin · Skill · MCP: three easily confused terms" translate="no">​</a></h3>
<p>They're not the same thing:</p>
<ul>
<li class=""><strong>Plugin</strong>: external APIs Codex can call — like connecting a database, sending messages, checking weather. Codex ships with dozens built in.</li>
<li class=""><strong>Skill</strong>: a set of instructions that teach Codex how to do something. Write a Skill once, and next time just say the word.</li>
<li class=""><strong>MCP Server</strong>: a universal interface that lets Codex talk to external tools.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-the-killer-feature-skills--teach-it-once-reuse-with-one-sentence">③ The killer feature: Skills — teach it once, reuse with one sentence<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#-the-killer-feature-skills--teach-it-once-reuse-with-one-sentence" class="hash-link" aria-label="Direct link to ③ The killer feature: Skills — teach it once, reuse with one sentence" title="Direct link to ③ The killer feature: Skills — teach it once, reuse with one sentence" translate="no">​</a></h3>
<p>Example: you want Codex to always run tests, check types, and format code after writing. Write a Skill:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">## Code Quality Rules</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">After completing any code changes:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">1. Run `npm test` to ensure all tests pass</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2. Run `npx tsc --noEmit` to ensure no type errors</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3. Run `npx prettier --write .` to format code</span><br></div></code></pre></div></div>
<p>Save it as a Skill. Next time say "run my quality rules" — it follows the full process.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="interlude--its-way-more-than-just-writing-code">Interlude · It's way more than just writing code<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#interlude--its-way-more-than-just-writing-code" class="hash-link" aria-label="Direct link to Interlude · It's way more than just writing code" title="Direct link to Interlude · It's way more than just writing code" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-scheduled-automation">⏰ Scheduled automation<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#-scheduled-automation" class="hash-link" aria-label="Direct link to ⏰ Scheduled automation" title="Direct link to ⏰ Scheduled automation" translate="no">​</a></h3>
<p>Codex supports scheduled tasks: run tests every morning at 9 AM, update dependencies every Monday. It does the grunt work while you sleep.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-one-click-website-deployment">🚀 One-click website deployment<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#-one-click-website-deployment" class="hash-link" aria-label="Direct link to 🚀 One-click website deployment" title="Direct link to 🚀 One-click website deployment" translate="no">​</a></h3>
<p>Finished a web page? Tell Codex and it deploys. With MCP plugins, it can connect directly to cloud services.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-remote-control-from-your-phone">📱 Remote control from your phone<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#-remote-control-from-your-phone" class="hash-link" aria-label="Direct link to 📱 Remote control from your phone" title="Direct link to 📱 Remote control from your phone" translate="no">​</a></h3>
<p>Codex has a mobile app — check task progress and send new commands on the go. See a bug during your commute? Tell it to fix it from your phone.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-generate-docs-and-images-too">📄 Generate docs and images too<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#-generate-docs-and-images-too" class="hash-link" aria-label="Direct link to 📄 Generate docs and images too" title="Direct link to 📄 Generate docs and images too" translate="no">​</a></h3>
<p>Architecture diagrams, changelogs, illustrations — it can do all of those.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4--use-cheap-chinese-models-and-deploy-your-game">Step 4 · Use cheap Chinese models and deploy your game<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#step-4--use-cheap-chinese-models-and-deploy-your-game" class="hash-link" aria-label="Direct link to Step 4 · Use cheap Chinese models and deploy your game" title="Direct link to Step 4 · Use cheap Chinese models and deploy your game" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-the-problem-saving-money-with-chinese-models-hits-a-wall">First, the problem: saving money with Chinese models hits a wall<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#first-the-problem-saving-money-with-chinese-models-hits-a-wall" class="hash-link" aria-label="Direct link to First, the problem: saving money with Chinese models hits a wall" title="Direct link to First, the problem: saving money with Chinese models hits a wall" translate="no">​</a></h3>
<p>Codex defaults to OpenAI's own models — fine for daily development. But if you're running lots of automated tasks or team collaboration, token consumption adds up fast.</p>
<p>On June 18, Codex opened up third-party model support. But there's a catch: you need to handle API keys, model configuration, and deployment environment yourself.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-cloudbase-configure-models--install-plugins">The solution: CloudBase (configure models + install plugins)<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#the-solution-cloudbase-configure-models--install-plugins" class="hash-link" aria-label="Direct link to The solution: CloudBase (configure models + install plugins)" title="Direct link to The solution: CloudBase (configure models + install plugins)" translate="no">​</a></h3>
<p>CloudBase is Tencent Cloud's Serverless platform, and its AI Toolkit solves this exact problem.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-models-5-minutes">Configure models (5 minutes)<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#configure-models-5-minutes" class="hash-link" aria-label="Direct link to Configure models (5 minutes)" title="Direct link to Configure models (5 minutes)" translate="no">​</a></h4>
<p>CloudBase supports both OpenAI and Anthropic protocols. DeepSeek, GLM, Kimi — all accessible with one API key. Once configured, select Chinese models directly in Codex. Token costs drop to a fraction of the original.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-plugins-one-click-deployment">Install plugins (one-click deployment)<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#install-plugins-one-click-deployment" class="hash-link" aria-label="Direct link to Install plugins (one-click deployment)" title="Direct link to Install plugins (one-click deployment)" translate="no">​</a></h4>
<p>With the CloudBase MCP plugin installed, Codex can deploy apps directly from the conversation. No need to manually log into a cloud console, configure domains, or upload files. Just say "deploy it" and it handles everything.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final thoughts<a href="https://binggg.github.io/en/blog/codex-getting-started-cloudbase#final-thoughts" class="hash-link" aria-label="Direct link to Final thoughts" title="Direct link to Final thoughts" translate="no">​</a></h2>
<p>What Codex has proven in the last six months: <strong>AI tools are no longer about "can they answer questions" — it's about "can they finish the job and deliver the goods."</strong></p>
<p>For someone like me, the real barrier isn't "are there cheap models" — it's the hassle of integration and having nowhere to deploy. The protocols need to match, and you need a place to land what you built. After going through the whole cycle, my answer is CloudBase: all three protocols compatible, Chinese models accessible with one key, and one-click deploy from the same window.</p>
<p><strong>Other token plans just give you tokens. CloudBase gives you a place to ship.</strong></p>
<hr>
<blockquote>
<p>Have you used Codex? For coding or something else? Drop a comment — I read them all.</p>
</blockquote>]]></content:encoded>
            <category>AI</category>
            <category>fullstack</category>
            <category>CloudBase</category>
        </item>
        <item>
            <title><![CDATA[Your remote AI agent needs auth? A Device Flow protocol deep-dive]]></title>
            <link>https://binggg.github.io/en/blog/github-device-flow-deep-dive</link>
            <guid>https://binggg.github.io/en/blog/github-device-flow-deep-dive</guid>
            <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[No browser, no sudo — how do you authenticate on a bare-metal machine? This article starts from a real pain point and dismantles the entire RFC 8628 protocol.]]></description>
            <content:encoded><![CDATA[<p>I was setting up GitHub CLI on a TencentOS server recently — an AI agent was running on it, and I needed to talk to it via phone IM. Classic authentication puzzle:</p>
<ul>
<li class="">No browser (remote server, no GUI)</li>
<li class="">No sudo (can only install to my <code>~/bin</code>)</li>
<li class="">Needed <code>gh</code> to authenticate and create PRs</li>
<li class=""><strong>Critical: couldn't send a Token through the IM chat</strong> (IM servers, chat history, agent context — every layer sees it)</li>
</ul>
<p>Traditional OAuth requires browser redirects. Not an option here.</p>
<p>First instinct: generate a Personal Access Token manually, pipe it in with <code>gh auth login --with-token</code>. It works, but it's painful — open GitHub settings, find the token page, select permissions, copy, paste in terminal. Months later when the token expires, repeat everything.</p>
<p>I dug through GitHub CLI's docs and found it uses a different path by default: <strong>Device Flow</strong> (device authorization grant). Running <code>gh auth login --web</code> prints a verification code. You open <code>github.com/login/device</code> on another device, enter the code, and the terminal auto-completes auth.</p>
<p>The whole process takes under two minutes. I thought — this is clever. Worth taking apart to see how it works under the hood.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-the-cli-without-sudo">Installing the CLI without sudo<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#installing-the-cli-without-sudo" class="hash-link" aria-label="Direct link to Installing the CLI without sudo" title="Direct link to Installing the CLI without sudo" translate="no">​</a></h2>
<p>First, the environment. This server is a typical setup:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># No sudo, manual gh install</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir -p ~/bin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd /tmp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://github.com/cli/cli/releases/download/v2.62.0/gh_2.62.0_linux_amd64.tar.gz -o gh.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tar -xzf gh.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cp gh_2.62.0_linux_amd64/bin/gh ~/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo 'export PATH="$HOME/bin:$PATH"' &gt;&gt; ~/.bashrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">export PATH="$HOME/bin:$PATH"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh --version</span><br></div></code></pre></div></div>
<p>Then authentication:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gh auth login --web --hostname github.com --git-protocol https</span><br></div></code></pre></div></div>
<p>Terminal output:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">! First copy your one-time code: BFEE-895F</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Open this URL to continue in your web browser: https://github.com/login/device</span><br></div></code></pre></div></div>
<p>I opened the link on my laptop, entered the code, clicked Authorize. Back in the terminal, hit Enter—</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">✓ Authentication complete.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">✓ Logged in as binggg</span><br></div></code></pre></div></div>
<p>Done. No SSH keys, no manual token entry, no <code>sudo</code>.</p>
<p>But one detail caught my eye: <strong>the terminal just printed a code and started polling — how did it know I completed authorization on my browser?</strong> The communication happened entirely between the CLI and GitHub's servers. The browser never talked to the terminal.</p>
<p>That's what makes Device Flow interesting.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="device-authorization-decoupling-login-from-the-device">Device authorization: decoupling "login" from the device<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#device-authorization-decoupling-login-from-the-device" class="hash-link" aria-label="Direct link to Device authorization: decoupling &quot;login&quot; from the device" title="Direct link to Device authorization: decoupling &quot;login&quot; from the device" translate="no">​</a></h2>
<p>Device Flow's core idea is simple.</p>
<p>Traditional OAuth authorization code flow assumes the user has a browser — the app can redirect to an auth page and back. But smart TVs, CLI tools, IoT devices — these don't have a browser, or typing a URL is painfully impractical.</p>
<p>The solution: <strong>let the user authorize on a different device, while the device polls for the result.</strong></p>
<p>I later read the RFC 8628 spec and found the whole flow breaks down into four steps:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-device-requests-a-verification-code">Step 1: Device requests a verification code<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#step-1-device-requests-a-verification-code" class="hash-link" aria-label="Direct link to Step 1: Device requests a verification code" title="Direct link to Step 1: Device requests a verification code" translate="no">​</a></h3>
<p>The CLI sends a POST to the authorization server:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">POST https://github.com/login/device/code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">client_id=xxx&amp;scope=repo,gist</span><br></div></code></pre></div></div>
<p>The server responds:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"device_code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"3584d83530557fdd1f46af8289938c8ef79f9dc5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"user_code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BFEE-895F"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"verification_uri"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://github.com/login/device"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"expires_in"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">900</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"interval"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Three key fields:</p>
<ul>
<li class=""><strong><code>user_code</code></strong> (BFEE-895F) — the code you type manually, 8 characters, human-friendly</li>
<li class=""><strong><code>device_code</code></strong> (40 chars) — used internally by the client, never shown to the user</li>
<li class=""><strong><code>interval</code></strong> (5 seconds) — suggested polling interval from the server</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-you-work-in-the-browser">Step 2: You work in the browser<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#step-2-you-work-in-the-browser" class="hash-link" aria-label="Direct link to Step 2: You work in the browser" title="Direct link to Step 2: You work in the browser" translate="no">​</a></h3>
<p>The terminal prints the verification code. You open <code>github.com/login/device</code> on your phone, enter it. At this point the browser and GitHub's server complete the full OAuth authorization — you log in, review permissions, click Authorize.</p>
<p>Note: <strong>This step has zero direct communication with the terminal.</strong> Your phone's browser doesn't know the terminal exists, and the terminal doesn't know what you did on your phone.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-device-polls-continuously">Step 3: Device polls continuously<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#step-3-device-polls-continuously" class="hash-link" aria-label="Direct link to Step 3: Device polls continuously" title="Direct link to Step 3: Device polls continuously" translate="no">​</a></h3>
<p>This is the cleverest part. The terminal doesn't know when you'll finish authorizing, so it asks the server every 5 seconds: "Did they click yet?"</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">POST /login/oauth/access_token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">device_code=xxx&amp;grant_type=urn:ietf:params:oauth:grant-type:device_code</span><br></div></code></pre></div></div>
<p>Not yet:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"error"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"authorization_pending"</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Authorized:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"access_token"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gho_16C7e42F292c6912E7710c838347Ae178B4a"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"scope"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"repo,gist"</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The polling isn't infinite. The <code>device_code</code> expires in 15 minutes. If it times out, the client must stop and error. On <code>expired_token</code>, the client should tell the user to restart.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-use-the-token">Step 4: Use the token<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#step-4-use-the-token" class="hash-link" aria-label="Direct link to Step 4: Use the token" title="Direct link to Step 4: Use the token" translate="no">​</a></h3>
<p>Once you have the token, it's standard OAuth:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">curl -H "Authorization: Bearer gho_xxx" https://api.github.com/user</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="polling-strategy-how-important-is-client-politeness">Polling strategy: how important is client "politeness"?<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#polling-strategy-how-important-is-client-politeness" class="hash-link" aria-label="Direct link to Polling strategy: how important is client &quot;politeness&quot;?" title="Direct link to Polling strategy: how important is client &quot;politeness&quot;?" translate="no">​</a></h2>
<p>When actually writing polling code, there are subtleties around <code>interval</code> and error handling that I didn't expect.</p>
<p>RFC 8628 defines 5 error codes, each with different client behavior:</p>
<table><thead><tr><th>Error</th><th>Meaning</th><th>Client action</th></tr></thead><tbody><tr><td><code>authorization_pending</code></td><td>User hasn't clicked</td><td>Wait <code>interval</code> seconds, retry</td></tr><tr><td><code>slow_down</code></td><td>You're polling too fast</td><td><strong>Add 5 extra seconds</strong>, use new interval going forward</td></tr><tr><td><code>expired_token</code></td><td>15-minute timeout</td><td>Stop. Tell user to restart.</td></tr><tr><td><code>access_denied</code></td><td>User declined</td><td>Stop. Don't continue.</td></tr><tr><td><code>invalid_grant</code></td><td>Device code invalid</td><td>Probably a bug. Report error.</td></tr></tbody></table>
<p><code>slow_down</code> is the most thoughtful design decision — many protocols just 429 and disconnect. Device Flow has a dedicated error code telling the client "I'm not saying don't ask, just ask more slowly." When you receive this, add 5 seconds to your current interval.</p>
<p>A correct polling implementation looks like:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> requests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">poll_for_token</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">device_code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> interval</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    timeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">900</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    elapsed </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> elapsed </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"https://github.com/login/oauth/access_token"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            data</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"client_id"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"device_code"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> device_code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"grant_type"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"urn:ietf:params:oauth:grant-type:device_code"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            headers</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"Accept"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/json"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"access_token"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"access_token"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"error"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"authorization_pending"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">interval</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            elapsed </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> interval</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"slow_down"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            interval </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># permanent increase</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">interval</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            elapsed </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> interval</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> err </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"expired_token"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"access_denied"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Authorization failed: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">err</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Unknown error: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">err</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Authorization timeout"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Two easy-to-miss points:</p>
<ol>
<li class=""><strong>On <code>slow_down</code>, the 5-second increase is permanent.</strong> You don't revert to the original interval. RFC 8628 requires this.</li>
<li class=""><strong>You can show progress feedback during polling.</strong> <code>gh auth login</code> just waits silently — a spinner or countdown would tell the user the program is still running.</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="device-flow-vs-traditional-oauth-not-a-replacement-a-complement">Device Flow vs traditional OAuth: not a replacement, a complement<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#device-flow-vs-traditional-oauth-not-a-replacement-a-complement" class="hash-link" aria-label="Direct link to Device Flow vs traditional OAuth: not a replacement, a complement" title="Direct link to Device Flow vs traditional OAuth: not a replacement, a complement" translate="no">​</a></h2>
<p>After reading RFC 8628, I put together this comparison:</p>
<table><thead><tr><th></th><th>Authorization Code Flow</th><th>Device Flow</th></tr></thead><tbody><tr><td>Use case</td><td>Web / Mobile apps</td><td>CLI / IoT / Headless devices</td></tr><tr><td>Browser required</td><td>Yes, on the same device</td><td>No, can be on a different device</td></tr><tr><td>Auth method</td><td>Automatic browser redirect</td><td>Manual code entry</td></tr><tr><td>Callback</td><td>Server receives code param</td><td>Client polls</td></tr><tr><td><code>client_secret</code></td><td>Required</td><td>Not needed (public client)</td></tr><tr><td>UX</td><td>Smooth, seamless</td><td>Multi-device, manual entry</td></tr></tbody></table>
<p>GitHub CLI's choice of Device Flow makes practical sense: CLI might run in Docker containers, CI environments, or jump boxes — none of which have browsers, and configuring callback URLs is painful. Device Flow doesn't need a registered callback URL, doesn't need <code>client_secret</code> (which a CLI binary couldn't keep secret anyway). It's the simplest approach for CLI tools.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-is-an-8-character-code-enough">Security: is an 8-character code enough?<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#security-is-an-8-character-code-enough" class="hash-link" aria-label="Direct link to Security: is an 8-character code enough?" title="Direct link to Security: is an 8-character code enough?" translate="no">​</a></h2>
<p>My first reaction was that 8 characters is too short. Reading RFC 8628's design rationale helped me understand the trade-off.</p>
<p>8 characters from a 20-character alphabet (uppercase with ambiguous characters removed) gives 20⁸ ≈ 2³⁴·⁵ bits of entropy. Not high on its own, but combined with several constraints it's sufficient:</p>
<ol>
<li class=""><strong>15-minute expiry</strong> — short time window</li>
<li class=""><strong>Rate limiting</strong> — max 50 code attempts per hour</li>
<li class=""><strong>One-time <code>device_code</code></strong> — one device code, one token, consumed immediately</li>
</ol>
<p>The real security risk isn't code length — it's <strong>remote phishing</strong>. An attacker could fake a page asking for the code and then authorize with their own account. GitHub mitigates this by showing device type, IP address, and permission scope on the authorization page, giving the user information to make a judgment.</p>
<p>Token storage is another easy-to-miss issue. <code>gh</code> stores tokens in <code>~/.config/gh/hosts.yml</code> with <code>chmod 600</code>. If you're writing your own Device Flow tooling, don't leak tokens to shell history or store them in plain text. macOS users can use Keychain, Linux users can use Secret Service:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">security add-generic-password -a "$USER" -s "github_token" -w "gho_xxx"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Linux</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">secret-tool store --label="GitHub Token" service github user "$USER"</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-device-flow-is-the-best-auth-method-for-ai-agents">Why Device Flow is the best auth method for AI Agents<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#why-device-flow-is-the-best-auth-method-for-ai-agents" class="hash-link" aria-label="Direct link to Why Device Flow is the best auth method for AI Agents" title="Direct link to Why Device Flow is the best auth method for AI Agents" translate="no">​</a></h2>
<p>I was actually solving another problem when I wrote this article: an AI agent runs on a remote server, I talk to it via phone IM. The agent needs GitHub API access to manage repos, create PRs, handle issues — but how do you give it credentials securely?</p>
<p>The most intuitive approach is sending the Token through the IM chat. It's also the most dangerous one.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">IM Token path:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  You → [ IM Server ] → [ Chat History ] → [ Agent Context ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                                ↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                          Every layer sees your Token</span><br></div></code></pre></div></div>
<p>Once the Token enters the chat, the IM server has it, your local chat history has it, and the agent's message context has it. And Tokens don't expire on their own — obtain it once, use it forever.</p>
<p>Device Flow solves this differently: <strong>your machine never touches the Token.</strong></p>
<ol>
<li class="">The agent prints a verification code (<code>BFEE-895F</code>) in the chat</li>
<li class="">You open <code>github.com/login/device</code> — GitHub's official auth page, not a link the agent gave you</li>
<li class="">Enter the code and authorize on GitHub's page</li>
<li class="">The Token goes directly from GitHub's server to the agent (server-to-server)</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Device Flow path:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Agent prints code → you see it</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  You open github.com/login/device → enter code → complete OAuth</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Token goes from GitHub to agent (server-to-server, no middle layers)</span><br></div></code></pre></div></div>
<p>Your IM only ever sees an 8-character verification code (15-minute validity, single-use). The Token never passes through your chat history.</p>
<p>Looking back, if your agent needs remote auth — Device Flow is about the only way to keep secrets out of your chat logs.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-easter-egg">🥚 Easter egg<a href="https://binggg.github.io/en/blog/github-device-flow-deep-dive#-easter-egg" class="hash-link" aria-label="Direct link to 🥚 Easter egg" title="Direct link to 🥚 Easter egg" translate="no">​</a></h2>
<p>If you frequently set up GitHub auth on remote servers, here's a script that does the whole thing in one command — download <code>gh</code> + authenticate + configure git user:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># remote-gh-setup.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Run on the remote server: curl -fsSL https://gist.github.com/binggg/xxx/remote-gh-setup.sh | bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Then open https://github.com/login/device on your own machine and enter the code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -e</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 1. Install gh to ~/bin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir -p ~/bin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://github.com/cli/cli/releases/latest/download/gh_*_linux_amd64.tar.gz \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  | tar -xz -C /tmp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cp /tmp/gh_*/bin/gh ~/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo 'export PATH="$HOME/bin:$PATH"' &gt;&gt; ~/.bashrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">export PATH="$HOME/bin:$PATH"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. Start Device Flow auth</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh auth login --web --git-protocol https</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. Configure git user</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh api user --jq '.login' | xargs -I{} git config --global user.name "{}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh api user --jq '.email // .login + "@users.noreply.github.com"' | xargs -I{} git config --global user.email "{}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "✅ Done! Logged in as $(gh api user --jq '.login')"</span><br></div></code></pre></div></div>
<p>This script covers the whole pipeline from my previous article. If you've run into environmental constraints I haven't encountered, drop a comment.</p>
<hr>
<p>How does your remote agent handle auth? DIY Token setup or Device Flow? Comments below 👇</p>
<p><em>Based on GitHub CLI v2.62.0, RFC 8628 (published August 2019), and one real deployment verification.</em></p>]]></content:encoded>
            <category>GitHub</category>
            <category>OAuth</category>
            <category>Device Flow</category>
            <category>CLI</category>
            <category>RFC</category>
        </item>
        <item>
            <title><![CDATA[AI Programming's Second Half: Don't Let AI Code Live Only on Localhost]]></title>
            <link>https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice</link>
            <guid>https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice</guid>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[You gave your AI agent Skills but it ignores them. After months of wrestling, the hardest problem isn't AI writing bad code — it's AI writing code that only works locally. Here's how we pushed skill activation from 20% to 84%.]]></description>
            <content:encoded><![CDATA[<p>I've been working with Agent Skills for a while now. The most frustrating discovery: it's not that AI can't write code. It's that the code it writes <strong>only works on localhost</strong>, and it <strong>keeps ignoring the rules you set</strong>.</p>
<p>This article covers two things:</p>
<ol>
<li class=""><strong>Making AI-generated code actually deployable</strong> — AI writes demo-quality code, full of security holes. The root cause: AI doesn't understand production environments.</li>
<li class=""><strong>Fixing "AI has Skills but won't use them"</strong> — activation rates can be as low as 20%. Here's how we pushed that to 84%.</li>
</ol>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vibe-codings-localhost-comfort-zone">Vibe Coding's "Localhost Comfort Zone"<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#vibe-codings-localhost-comfort-zone" class="hash-link" aria-label="Direct link to Vibe Coding's &quot;Localhost Comfort Zone&quot;" title="Direct link to Vibe Coding's &quot;Localhost Comfort Zone&quot;" translate="no">​</a></h2>
<p>Everyone's enjoying Vibe Coding. AI whips up a beautiful UI on localhost in minutes. But the magic dies the moment you try to deploy.</p>
<p>AI's code logic is reasonable, but it can't sense the real production environment. The result: code that looks right but can't survive outside your laptop.</p>
<p><strong>The longest distance in software is from localhost to production.</strong> AI fills the code gap, but not the infrastructure gap.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-agent-skills">What Are Agent Skills?<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#what-are-agent-skills" class="hash-link" aria-label="Direct link to What Are Agent Skills?" title="Direct link to What Are Agent Skills?" translate="no">​</a></h2>
<p>Skills were introduced by Anthropic in October 2025 for Claude Code. They're a packaging format for instructions, scripts, and resources — <strong>domain expertise bundled as skill packs.</strong></p>
<div class="language-directory codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-directory codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">my-skill/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── SKILL.md          # Core: instructions + metadata</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── scripts/          # Optional: executable code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── references/       # Optional: reference docs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── assets/           # Optional: templates, resources</span><br></div></code></pre></div></div>
<p>Think of AI as a brilliant intern. Skills are the <strong>standard operating procedure manual</strong>. They don't change the AI's intelligence, but they inject procedural knowledge — how things are actually done in your specific environment.</p>
<p>Agent Skills became an open standard in December 2025. Claude, Cursor, VS Code, GitHub Copilot, and OpenCode all support it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="progressive-loading">Progressive Loading<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#progressive-loading" class="hash-link" aria-label="Direct link to Progressive Loading" title="Direct link to Progressive Loading" translate="no">​</a></h3>
<p>Skills use <strong>progressive disclosure</strong> for context efficiency:</p>
<ol>
<li class=""><strong>Discovery</strong>: Agent loads only name + description of each Skill</li>
<li class=""><strong>Activation</strong>: When a task matches, the full SKILL.md is loaded</li>
<li class=""><strong>Execution</strong>: Agent follows instructions, loading scripts on demand</li>
</ol>
<p>Teams are already pushing this forward. Vercel released <code>react-best-practices</code> Skills to fix AI's React code quality. Remotion shipped video production Skills. All solving the same problem: <strong>give AI domain-specific engineering intuition.</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hard-truth-why-ai-ignores-skills">The Hard Truth: Why AI Ignores Skills<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#the-hard-truth-why-ai-ignores-skills" class="hash-link" aria-label="Direct link to The Hard Truth: Why AI Ignores Skills" title="Direct link to The Hard Truth: Why AI Ignores Skills" translate="no">​</a></h2>
<p>You configured Skills. AI ignores them. This was the most frustrating part, and it comes down to two deep architectural issues:</p>
<p><strong>Attention Dilution</strong>: In the Transformer architecture, every token competes for attention weight. The deeper your conversation goes, the more weight your business requirements get — and the Skill instructions in the background get drowned out.</p>
<p><strong>Inference Laziness</strong>: Calling a Skill is a tool-use operation. The model does a cost-benefit analysis: if it thinks its training data can produce "reasonably correct" code, it will skip the external tool to save inference resources.</p>
<p><strong>The result</strong>: Without intervention, AI's active Skill invocation rate hovers around <strong>20%</strong>. It would rather "blindly guess" than read the manual.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-solutions-that-actually-work">3 Solutions That Actually Work<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#3-solutions-that-actually-work" class="hash-link" aria-label="Direct link to 3 Solutions That Actually Work" title="Direct link to 3 Solutions That Actually Work" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-first-line-injection-crude-but-effective">1. First-Line Injection (Crude but Effective)<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#1-first-line-injection-crude-but-effective" class="hash-link" aria-label="Direct link to 1. First-Line Injection (Crude but Effective)" title="Direct link to 1. First-Line Injection (Crude but Effective)" translate="no">​</a></h3>
<p>Start every prompt with this mantra:</p>
<blockquote>
<p><strong>You MUST read the guideline skill FIRST when working with this project.</strong></p>
</blockquote>
<p><strong>Principle</strong>: Primacy effect. The model naturally pays more attention to the beginning of the input sequence. This forced injection reliably raises activation rates.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-project-level-rules-claudemd">2. Project-Level Rules (CLAUDE.md)<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#2-project-level-rules-claudemd" class="hash-link" aria-label="Direct link to 2. Project-Level Rules (CLAUDE.md)" title="Direct link to 2. Project-Level Rules (CLAUDE.md)" translate="no">​</a></h3>
<p>Create <code>CLAUDE.md</code> or <code>AGENT.md</code> with binding rules:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> Project Workflow</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">0.</span><span class="token plain"> You MUST read the guideline skill FIRST when working with this project.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Evaluate: Before writing code, list available Skills.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Commit: State which Skill you need and why.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Execute: Never skip rules to write code directly.</span><br></div></code></pre></div></div>
<p>This saves you from adding the mantra every time. But it's not bulletproof — as conversation context grows, AI may still ignore the rules.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-forced-eval-hook-the-heavy-lifter">3. Forced Eval Hook (The Heavy Lifter)<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#3-forced-eval-hook-the-heavy-lifter" class="hash-link" aria-label="Direct link to 3. Forced Eval Hook (The Heavy Lifter)" title="Direct link to 3. Forced Eval Hook (The Heavy Lifter)" translate="no">​</a></h3>
<p>If the first two are "asking nicely," this is <strong>physical enforcement</strong>.</p>
<p>Scott Spence discovered the most effective method: use your editor's hook mechanism. Configure <code>.claude/settings.json</code> to intercept every query and force the AI to write an evaluation report before any code:</p>
<ul>
<li class="">What Skills are available?</li>
<li class="">Does this task need them? Why?</li>
</ul>
<p>Here's the trick: once the AI has committed in writing to using a tool, it follows through. The hook eliminates the "I'll just wing it" shortcut.</p>
<p><strong>Result</strong>: Skill activation jumps from <strong>20% to 84%</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-lesson-1-guideline--n-independent-skills">Architecture Lesson: 1 Guideline + N Independent Skills<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#architecture-lesson-1-guideline--n-independent-skills" class="hash-link" aria-label="Direct link to Architecture Lesson: 1 Guideline + N Independent Skills" title="Direct link to Architecture Lesson: 1 Guideline + N Independent Skills" translate="no">​</a></h2>
<p>The biggest problem I encountered: <strong>AI can't distinguish environments.</strong> It confuses Web, Mini Program, and Node.js APIs.</p>
<p>The fix: instead of one monolithic "super skill," use <strong>1 guideline + N environment-specific skills</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="solving-semantic-contamination">Solving Semantic Contamination<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#solving-semantic-contamination" class="hash-link" aria-label="Direct link to Solving Semantic Contamination" title="Direct link to Solving Semantic Contamination" translate="no">​</a></h3>
<p>Web, Mini Program, and Node.js SDKs have nearly identical method names. Put everything in one Skill, and AI will use the wrong syntax for the wrong platform.</p>
<p>Solution: split by platform. A guideline Skill routes AI to the right sub-skill based on project detection. <strong>Search space shrinks by 90%, reasoning accuracy jumps.</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enabling-targeted-intervention">Enabling Targeted Intervention<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#enabling-targeted-intervention" class="hash-link" aria-label="Direct link to Enabling Targeted Intervention" title="Direct link to Enabling Targeted Intervention" translate="no">​</a></h3>
<p>A massive skill pack dilutes attention. When you need AI to focus on one specific problem (e.g., "handle authentication"), the full manual becomes noise.</p>
<p>Independent plugins mean you can say: "Check the auth skill for phone number login." This is a direct intervention path — when AI is confused, pull up the right sub-skill and snap it back on track.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-thoughts">Closing Thoughts<a href="https://binggg.github.io/en/blog/2026/01/22/agent-skills-practice#closing-thoughts" class="hash-link" aria-label="Direct link to Closing Thoughts" title="Direct link to Closing Thoughts" translate="no">​</a></h2>
<p>After months of wrestling with Skills, my biggest takeaway: <strong>AI programming productivity isn't about how brilliant the generated code is — it's about how much engineering constraint you can apply.</strong></p>
<p><strong>The core: turn tacit knowledge into procedural knowledge.</strong> Today's agents are brilliant interns with zero respect for production reality. Skills give them engineered muscle memory — years of hard-won experience encoded as precondition checks.</p>
<p><strong>The shift: agents need environment awareness.</strong> The next frontier isn't better reasoning — it's infrastructure perception. Skills guard the floor, platforms enable the ceiling.</p>
<p><strong>Determinism is the only metric that matters.</strong> Don't expect AI to become "perfect" automatically. Use engineering to make it "predictable." AI provides the logical ceiling. Engineering constraints guard the delivery floor.</p>
<p>If you're working with Skills, the most valuable thing you can do: <strong>measure whether your AI is actually using them.</strong> A 20% baseline is not shameful — but not knowing that number is.</p>]]></content:encoded>
            <category>AI</category>
            <category>agent</category>
            <category>skills</category>
            <category>prompt-engineering</category>
            <category>claude-code</category>
        </item>
        <item>
            <title><![CDATA[How to Generate "Non-Oily" AI Images: 3 Anti-AI Style Guides]]></title>
            <link>https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide</link>
            <guid>https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide</guid>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[After spending months generating AI images, the biggest problem wasn't the models — it was that every image screamed "made by AI." Here are 3 proven style recipes that fix it.]]></description>
            <content:encoded><![CDATA[<p>When I first started using AI image generation, I didn't pay much attention to style. Whatever Midjourney defaulted to, I used: rich lighting, flawless detail, vibrant colors. The result? Images that looked technically impressive but felt... wrong. They screamed "made by AI."</p>
<p>I spent months experimenting with prompts, stripping back parameters, testing different style combinations. After a lot of trial and error, I found the core principle: <strong>less is more, add texture, flatten, desaturate.</strong></p>
<p>These three style recipes are the ones that worked best in practice. Just append the prompt suffix to your base prompt and you're good to go.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-do-ai-images-look-oily">Why Do AI Images Look "Oily"?<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#why-do-ai-images-look-oily" class="hash-link" aria-label="Direct link to Why Do AI Images Look &quot;Oily&quot;?" title="Direct link to Why Do AI Images Look &quot;Oily&quot;?" translate="no">​</a></h2>
<p>You've probably noticed it too: AI-generated images that look technically "perfect" but have an uncanny "plastic" quality.</p>
<p>This "AI sheen" typically comes from:</p>
<ul>
<li class=""><strong>Overdone lighting and shadows</strong> — too dramatic, too deliberate</li>
<li class=""><strong>Perfection in every pixel</strong> — lacking the imperfections of real art</li>
<li class=""><strong>High-saturation colors</strong> — unnaturally vibrant</li>
<li class=""><strong>3D render vibes</strong> — looks like a game engine output, not human-made art</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-common-example">A Common Example<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#a-common-example" class="hash-link" aria-label="Direct link to A Common Example" title="Direct link to A Common Example" translate="no">​</a></h3>
<p>Say you need an illustration for a "reading" theme. Default AI prompts might give you something like this:</p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-oily.png" alt="" class="img_ev3q"></p>
<p><strong>What's wrong:</strong></p>
<ul>
<li class="">Lighting is overly dramatic (movie poster style)</li>
<li class="">Too much detail in every corner</li>
<li class="">Strong 3D render feel</li>
<li class="">Looks "fake" — no human touch</li>
</ul>
<p><strong>The fix is simple: subtract detail, add texture, flatten, desaturate.</strong></p>
<p>Below are <strong>3 ready-to-use style recipes</strong> using the same "reading" theme:</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="style-1-minimal-vector-flat">Style 1: Minimal Vector Flat<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#style-1-minimal-vector-flat" class="hash-link" aria-label="Direct link to Style 1: Minimal Vector Flat" title="Direct link to Style 1: Minimal Vector Flat" translate="no">​</a></h2>
<p><strong>Best for:</strong> Tech blogs, professional content, product introductions</p>
<p>The safest, most modern choice. Removes all unnecessary dimensionality — clean, simple, professional.</p>
<p><strong>Looks like:</strong> Notion illustrations, Apple website graphics, corporate UI design.</p>
<p><strong>Prompt Suffix:</strong></p>
<blockquote>
<p><code>flat vector illustration, minimal style, corporate memphis, simple shapes, 2D, white background, wide margins, clean lines, matte finish, low saturation, soft pastel colors, no shading, Behance style --ar 16:9</code></p>
</blockquote>
<p><strong>Example — same "reading" theme with flat style:</strong></p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-flat.png" alt="" class="img_ev3q"></p>
<p><strong>Compared to oily version:</strong> No 3D render feel, no dramatic lighting, clean and professional.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="style-2-hand-drawn-crayon--watercolor">Style 2: Hand-drawn Crayon / Watercolor<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#style-2-hand-drawn-crayon--watercolor" class="hash-link" aria-label="Direct link to Style 2: Hand-drawn Crayon / Watercolor" title="Direct link to Style 2: Hand-drawn Crayon / Watercolor" translate="no">​</a></h2>
<p><strong>Best for:</strong> Lifestyle content, book notes, personal stories</p>
<p>Simulates real art materials (crayons, pencils, watercolors) to introduce intentional "imperfections" — textures that eliminate the AI plastic smoothness.</p>
<p><strong>Looks like:</strong> Children's book illustrations — rough edges, warm tones, not-quite-perfect but incredibly approachable.</p>
<p><strong>Prompt Suffix:</strong></p>
<blockquote>
<p><code>hand-drawn sketch, crayon texture, watercolor style, children's book illustration, rough edges, textured paper, visible brush strokes, warm tones, cozy atmosphere, simple composition, cute and friendly --ar 16:9</code></p>
</blockquote>
<p><strong>Example:</strong></p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-handdrawn.png" alt="" class="img_ev3q"></p>
<p><strong>Compared to oily version:</strong> Real textures and brush strokes, warm tones, looks genuinely hand-drawn.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="style-3-risograph-screen-print">Style 3: Risograph (Screen Print)<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#style-3-risograph-screen-print" class="hash-link" aria-label="Direct link to Style 3: Risograph (Screen Print)" title="Direct link to Style 3: Risograph (Screen Print)" translate="no">​</a></h2>
<p><strong>Best for:</strong> Opinion pieces, creative writing, artistic content</p>
<p>The ultimate anti-AI weapon. Risograph style forces limited color palettes and grain, making images look like vintage print — sophisticated and zero AI sheen.</p>
<p><strong>Looks like:</strong> Indie magazine illustrations, art posters — grainy, 2-3 color separation, slightly misaligned layers.</p>
<p><strong>Prompt Suffix:</strong></p>
<blockquote>
<p><code>Risograph style, grain and noise, screen print texture, limited color palette (blue and orange), halftone pattern, abstract minimalism, vintage aesthetic, matte paper texture, high contrast, flat illustration --ar 16:9</code></p>
</blockquote>
<p><strong>Example:</strong></p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-risograph.png" alt="" class="img_ev3q"></p>
<p><strong>Compared to oily version:</strong> Grain and print texture, limited color palette feels more artistic, zero 3D render plastic feel.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-reference-anti-ai-magic-words">Quick Reference: Anti-AI Magic Words<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#quick-reference-anti-ai-magic-words" class="hash-link" aria-label="Direct link to Quick Reference: Anti-AI Magic Words" title="Direct link to Quick Reference: Anti-AI Magic Words" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="must-have-texture-words">Must-have texture words<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#must-have-texture-words" class="hash-link" aria-label="Direct link to Must-have texture words" title="Direct link to Must-have texture words" translate="no">​</a></h3>
<ul>
<li class=""><code>Matte</code> (removes reflections)</li>
<li class=""><code>Grainy / Noise</code> (adds realism)</li>
<li class=""><code>Textured paper</code> (physical feel)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lighting-control">Lighting control<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#lighting-control" class="hash-link" aria-label="Direct link to Lighting control" title="Direct link to Lighting control" translate="no">​</a></h3>
<ul>
<li class=""><code>Flat lighting</code> (avoid dramatic shadows)</li>
<li class=""><code>Soft shadows</code> (gentle transitions)</li>
<li class=""><code>Natural light</code> (real-world feel)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="negative-prompts-tell-ai-what-not-to-do">Negative prompts (tell AI what NOT to do)<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#negative-prompts-tell-ai-what-not-to-do" class="hash-link" aria-label="Direct link to Negative prompts (tell AI what NOT to do)" title="Direct link to Negative prompts (tell AI what NOT to do)" translate="no">​</a></h3>
<blockquote>
<p><code>photorealistic, 3d render, octane render, unreal engine, shiny, glossy, reflection, hyper detailed, neon lights, cyberpunk, plastic looking, oily skin, complex background</code></p>
</blockquote>
<p>Simply put: tell AI "don't make it look too real, too 3D, too shiny, or too complex."</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary-5-anti-oily-principles">Summary: 5 Anti-Oily Principles<a href="https://binggg.github.io/en/blog/2026/01/13/ai-image-deoiling-guide#summary-5-anti-oily-principles" class="hash-link" aria-label="Direct link to Summary: 5 Anti-Oily Principles" title="Direct link to Summary: 5 Anti-Oily Principles" translate="no">​</a></h2>
<p>Making AI images look human-made is simple — <strong>make them look like they were drawn, not rendered</strong>.</p>
<ol>
<li class="">✅ <strong>Add texture</strong> — paper grain, canvas, noise</li>
<li class="">✅ <strong>Subtract detail</strong> — leave some "imperfections"</li>
<li class="">✅ <strong>Desaturate</strong> — muted colors are more friendly</li>
<li class="">✅ <strong>Flatten</strong> — 2D beats 3D for authenticity</li>
<li class="">✅ <strong>Matte finish</strong> — remove highlights and reflections</li>
</ol>
<p><strong>Remember: imperfection is realism, and realism is the most friendly.</strong></p>]]></content:encoded>
            <category>AI</category>
            <category>image-generation</category>
            <category>prompt-engineering</category>
        </item>
        <item>
            <title><![CDATA[Vibe Coding isn't a myth: non-developers can build real apps with AI too]]></title>
            <link>https://binggg.github.io/en/blog/vibe-coding-non-technical</link>
            <guid>https://binggg.github.io/en/blog/vibe-coding-non-technical</guid>
            <pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Ever run into this: AI generates your app, then it breaks and you don't even know what question to ask? AI gives you N solutions but you have no idea which one is right?]]></description>
            <content:encoded><![CDATA[<p><strong>Ever run into this: AI generates your app, then it breaks and you don't even know what question to ask? AI gives you N solutions but you have no idea which one is right?</strong></p>
<p>This is the pain point for many non-technical people using AI to code:</p>
<ul>
<li class=""><strong>Debug hell</strong>: page shows something wrong, but no idea which layer is the issue (frontend? backend? deployment?)</li>
<li class=""><strong>Can't ask the right question</strong>: don't know how to describe the problem so AI understands and gives accurate answers</li>
<li class=""><strong>Unclear learning path</strong>: know you need some basics, but don't know where to start or what's enough</li>
</ul>
<p><strong>Today I'll share a systematic approach — from foundational concepts to debugging techniques to backend solutions — to take you from "able to generate apps" to "able to build real, usable apps."</strong></p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-real-problem-why-is-debugging-so-hard">The real problem: why is debugging so hard?<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#the-real-problem-why-is-debugging-so-hard" class="hash-link" aria-label="Direct link to The real problem: why is debugging so hard?" title="Direct link to The real problem: why is debugging so hard?" translate="no">​</a></h2>
<p>The issue you're facing is really two sides of the same coin: <strong>can't debug, don't know what to ask</strong>.</p>
<p>Because:</p>
<ol>
<li class=""><strong>Don't know which layer failed</strong>: frontend? backend? deployment?</li>
<li class=""><strong>Don't know how to describe the problem</strong>: in a way AI can understand your situation</li>
<li class=""><strong>Don't know how to learn</strong>: maybe you know some debugging methods, but not systematically</li>
</ol>
<p><strong>Core issue</strong>: lack of systematic foundational concepts makes it impossible to accurately diagnose and describe problems.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-1-learn-the-fundamentals-systematically">Solution 1: Learn the fundamentals systematically<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#solution-1-learn-the-fundamentals-systematically" class="hash-link" aria-label="Direct link to Solution 1: Learn the fundamentals systematically" title="Direct link to Solution 1: Learn the fundamentals systematically" translate="no">​</a></h2>
<p>This is the most critical step. Many people jump straight into AI coding without understanding the basics, then when something breaks, they don't even know what to ask.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-learn-fundamentals">Why learn fundamentals?<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#why-learn-fundamentals" class="hash-link" aria-label="Direct link to Why learn fundamentals?" title="Direct link to Why learn fundamentals?" translate="no">​</a></h3>
<p>You don't need to become an expert, but you need to understand:</p>
<ol>
<li class=""><strong>Frontend vs Backend</strong>: what users see vs what processes data</li>
<li class=""><strong>Request vs Response</strong>: your browser asks a server for data, the server sends it back</li>
<li class=""><strong>Local vs Production</strong>: running on your machine vs running on a server</li>
</ol>
<p>Without these concepts, you can't even describe what went wrong.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-do">What to do<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#what-to-do" class="hash-link" aria-label="Direct link to What to do" title="Direct link to What to do" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-open-the-frontend-roadmap">1. Open the Frontend Roadmap<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#1-open-the-frontend-roadmap" class="hash-link" aria-label="Direct link to 1. Open the Frontend Roadmap" title="Direct link to 1. Open the Frontend Roadmap" translate="no">​</a></h4>
<p>Visit <a href="https://roadmap.sh/frontend" target="_blank" rel="noopener noreferrer" class="">developer-roadmap</a> — not to learn everything, but to <strong>see the big picture</strong>.</p>
<ul>
<li class="">Scan through it. Don't try to understand everything.</li>
<li class="">Ask AI to explain concepts you don't get.</li>
<li class="">Focus on: HTML/CSS/JavaScript/how browsers work</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-use-ai-to-understand-concepts">2. Use AI to understand concepts<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#2-use-ai-to-understand-concepts" class="hash-link" aria-label="Direct link to 2. Use AI to understand concepts" title="Direct link to 2. Use AI to understand concepts" translate="no">​</a></h4>
<p>Don't understand what an HTTP request is? Ask AI:</p>
<blockquote>
<p>"Explain what an HTTP request is in the simplest terms, using a restaurant analogy"</p>
</blockquote>
<p>AI will connect it to your experience and give you the clearest explanation.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-learn-by-doing">3. Learn by doing<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#3-learn-by-doing" class="hash-link" aria-label="Direct link to 3. Learn by doing" title="Direct link to 3. Learn by doing" translate="no">​</a></h4>
<ul>
<li class="">Don't wait until you've learned everything</li>
<li class="">Look things up when you hit a problem</li>
<li class=""><strong>Let projects drive your learning</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-concepts-frontend-stage">Core concepts (frontend stage)<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#core-concepts-frontend-stage" class="hash-link" aria-label="Direct link to Core concepts (frontend stage)" title="Direct link to Core concepts (frontend stage)" translate="no">​</a></h3>
<ol>
<li class=""><strong>HTML Structure</strong>: page skeleton, tag semantics</li>
<li class=""><strong>CSS Styling</strong>: colors, layout, responsive design</li>
<li class=""><strong>JavaScript Behavior</strong>: interaction, data requests</li>
<li class=""><strong>Browser DevTools</strong>: your best debugging friend, shows errors and network requests</li>
<li class=""><strong>Console Errors</strong>: understanding error messages</li>
<li class=""><strong>Network Requests</strong>: how frontend talks to backend</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-works">Why this works<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#why-this-works" class="hash-link" aria-label="Direct link to Why this works" title="Direct link to Why this works" translate="no">​</a></h3>
<p>Once you understand these fundamentals, you can:</p>
<ul>
<li class="">Describe problems accurately: "My frontend sends a request and the backend returns a 500 error"</li>
<li class="">Understand AI's solutions: "AI says to add CORS config on the backend — I understand this is a cross-origin issue"</li>
<li class="">Judge which solution fits: instead of letting AI give you N options and guessing which is right</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-2-master-debugging-systematically">Solution 2: Master debugging systematically<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#solution-2-master-debugging-systematically" class="hash-link" aria-label="Direct link to Solution 2: Master debugging systematically" title="Direct link to Solution 2: Master debugging systematically" translate="no">​</a></h2>
<p>With the fundamentals down, next is debugging.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-debugging-system">The debugging system<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#the-debugging-system" class="hash-link" aria-label="Direct link to The debugging system" title="Direct link to The debugging system" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-check-the-console">1. Check the console<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#1-check-the-console" class="hash-link" aria-label="Direct link to 1. Check the console" title="Direct link to 1. Check the console" translate="no">​</a></h4>
<p>Press F12 or right-click → Inspect → Console</p>
<p>The console shows red error messages. <strong>This is your primary debugging entry point.</strong></p>
<p>Common errors:</p>
<ul>
<li class=""><code>Uncaught ReferenceError: xxx is not defined</code> — a variable wasn't declared</li>
<li class=""><code>Cannot read properties of undefined</code> — trying to access a property of undefined</li>
<li class=""><code>NetworkError</code> — network request failed</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-screenshot-feedback">2. Screenshot feedback<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#2-screenshot-feedback" class="hash-link" aria-label="Direct link to 2. Screenshot feedback" title="Direct link to 2. Screenshot feedback" translate="no">​</a></h4>
<p>When you hit a problem, send a screenshot + the console error together to AI.</p>
<p><strong>Good question</strong>:</p>
<blockquote>
<p>"My page doesn't respond after clicking the login button. Console shows 'Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')'. What's wrong?"</p>
</blockquote>
<p><strong>Bad question</strong>:</p>
<blockquote>
<p>"My page is broken. Help."</p>
</blockquote>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-systematic-debug-flow">3. Systematic debug flow<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#3-systematic-debug-flow" class="hash-link" aria-label="Direct link to 3. Systematic debug flow" title="Direct link to 3. Systematic debug flow" translate="no">​</a></h4>
<ol>
<li class=""><strong>Observe</strong>: what happened? Screenshot + describe</li>
<li class=""><strong>Check console</strong>: press F12, look for red errors in Console</li>
<li class=""><strong>Copy the error</strong>: paste the console error message</li>
<li class=""><strong>Provide context</strong>: tell AI what you were doing, what you expected, what actually happened</li>
<li class=""><strong>Fix iteratively</strong>: follow AI's suggestions, one step at a time</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-3-backend--the-easy-way">Solution 3: Backend — the easy way<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#solution-3-backend--the-easy-way" class="hash-link" aria-label="Direct link to Solution 3: Backend — the easy way" title="Direct link to Solution 3: Backend — the easy way" translate="no">​</a></h2>
<p>Frontend done? Next is the backend.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-backend-wall">The backend wall<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#the-backend-wall" class="hash-link" aria-label="Direct link to The backend wall" title="Direct link to The backend wall" translate="no">​</a></h3>
<p>Many people nail the frontend but hit a wall with backend:</p>
<ul>
<li class="">Don't know MySQL/MongoDB</li>
<li class="">Don't know how to write APIs</li>
<li class="">Don't know how to deploy a server</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-easier-path-baas-backend-as-a-service">The easier path: BaaS (Backend as a Service)<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#the-easier-path-baas-backend-as-a-service" class="hash-link" aria-label="Direct link to The easier path: BaaS (Backend as a Service)" title="Direct link to The easier path: BaaS (Backend as a Service)" translate="no">​</a></h3>
<p><strong>What is BaaS?</strong></p>
<p>BaaS wraps backend capabilities into simple APIs:</p>
<table><thead><tr><th>Feature</th><th>Traditional way</th><th>BaaS way</th></tr></thead><tbody><tr><td>Database</td><td>Install MySQL, configure connection, write SQL</td><td>Call <code>db.collection('users').add()</code></td></tr><tr><td>Auth</td><td>Write register/login/permission logic</td><td>Call <code>auth.signIn()</code></td></tr><tr><td>File storage</td><td>Set up OSS, configure permissions</td><td>Call <code>storage.upload()</code></td></tr></tbody></table>
<p>Most of the backend features you need are already built. Just use them.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="going-further-ai-powered-backend">Going further: AI-powered backend<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#going-further-ai-powered-backend" class="hash-link" aria-label="Direct link to Going further: AI-powered backend" title="Direct link to Going further: AI-powered backend" translate="no">​</a></h3>
<p>If BaaS isn't enough, there's a newer option: <strong>the MCP protocol</strong>.</p>
<p>MCP (Model Context Protocol) lets AI call cloud services directly. Just tell AI what you need, and it handles everything automatically.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bonus-designer-to-developer-fast-track">Bonus: Designer-to-developer fast track<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#bonus-designer-to-developer-fast-track" class="hash-link" aria-label="Direct link to Bonus: Designer-to-developer fast track" title="Direct link to Bonus: Designer-to-developer fast track" translate="no">​</a></h2>
<p>If you're a designer looking to build real apps with AI, your path is different from a complete beginner's.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-thinking-vs-programming-thinking">Design thinking vs programming thinking<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#design-thinking-vs-programming-thinking" class="hash-link" aria-label="Direct link to Design thinking vs programming thinking" title="Direct link to Design thinking vs programming thinking" translate="no">​</a></h3>
<p><strong>Your advantages</strong>:</p>
<ul>
<li class="">Understand user experience — you know what makes a good interface</li>
<li class="">Have design standards — you won't produce "AI-looking" interfaces</li>
<li class="">Understand interaction logic — you know user flows</li>
</ul>
<p><strong>What to add</strong>:</p>
<ul>
<li class="">How designs translate to code</li>
<li class="">How data flows through an app</li>
<li class="">How to debug and troubleshoot</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fast-track-approach">Fast-track approach<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#fast-track-approach" class="hash-link" aria-label="Direct link to Fast-track approach" title="Direct link to Fast-track approach" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-leverage-your-design-strengths">1. Leverage your design strengths<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#1-leverage-your-design-strengths" class="hash-link" aria-label="Direct link to 1. Leverage your design strengths" title="Direct link to 1. Leverage your design strengths" translate="no">​</a></h4>
<ul>
<li class="">Feed your design specs directly to AI</li>
<li class="">Take screenshots of your designs and ask AI to generate the corresponding code</li>
<li class="">Your user perspective is a massive advantage</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-focus-on-programming-logic">2. Focus on programming logic<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#2-focus-on-programming-logic" class="hash-link" aria-label="Direct link to 2. Focus on programming logic" title="Direct link to 2. Focus on programming logic" translate="no">​</a></h4>
<ul>
<li class="">Conditionals: if/else</li>
<li class="">Loops: for/forEach</li>
<li class="">Event handling: click, input, submit</li>
<li class="">Data requests: fetch/axios</li>
</ul>
<p>These are the keys to understanding AI-generated code.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-project-driven-learning">3. Project-driven learning<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#3-project-driven-learning" class="hash-link" aria-label="Direct link to 3. Project-driven learning" title="Direct link to 3. Project-driven learning" translate="no">​</a></h4>
<p><strong>Suggested project path</strong>:</p>
<ol>
<li class=""><strong>Personal portfolio site</strong>: showcase your design work</li>
<li class=""><strong>Interactive prototype</strong>: turn designs into clickable pages</li>
<li class=""><strong>Small utility app</strong>: a tool that solves a real problem</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p><strong>Vibe Coding isn't a myth — but you need the right approach:</strong></p>
<ol>
<li class=""><strong>Learn fundamentals systematically</strong> — use developer-roadmap + AI to understand frontend basics</li>
<li class=""><strong>Master debugging systematically</strong> — screenshot feedback, console errors, full context</li>
<li class=""><strong>Backend the easy way</strong> — BaaS reduces the backend barrier</li>
</ol>
<p><strong>Most importantly</strong>: don't rush. Get the frontend fundamentals solid first. Learn concepts systematically, master debugging methods, then level up.</p>
<p><strong>For designers transitioning to code</strong>: leverage your design strengths, focus on programming logic, learn through real projects, and build debugging habits.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="glossary">Glossary<a href="https://binggg.github.io/en/blog/vibe-coding-non-technical#glossary" class="hash-link" aria-label="Direct link to Glossary" title="Direct link to Glossary" translate="no">​</a></h2>
<table><thead><tr><th>Term</th><th>Description</th></tr></thead><tbody><tr><td>Vibe Coding</td><td>AI-assisted coding approach</td></tr><tr><td>Debug</td><td>Finding and fixing errors in code</td></tr><tr><td>DOM</td><td>Document Object Model — the programming interface for web page elements</td></tr><tr><td>BaaS</td><td>Backend as a Service</td></tr><tr><td>MCP</td><td>Model Context Protocol</td></tr><tr><td>Frontend</td><td>What users see and interact with</td></tr><tr><td>Backend</td><td>Server side — data storage and business logic</td></tr><tr><td>Deployment</td><td>Publishing code to a server</td></tr></tbody></table>]]></content:encoded>
            <category>AI</category>
            <category>fullstack</category>
        </item>
        <item>
            <title><![CDATA[AI coding: how do you go from toy to product?]]></title>
            <link>https://binggg.github.io/en/blog/ai-toy-to-product</link>
            <guid>https://binggg.github.io/en/blog/ai-toy-to-product</guid>
            <pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[I've been helping friends review their AI-built projects recently, and I noticed something interesting:]]></description>
            <content:encoded><![CDATA[<p>I've been helping friends review their AI-built projects recently, and I noticed something interesting:</p>
<p>The code runs. The features are there. But somehow... it's not usable.</p>
<p>Not a technical issue. Something else.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-typical-scenario">A typical scenario<a href="https://binggg.github.io/en/blog/ai-toy-to-product#a-typical-scenario" class="hash-link" aria-label="Direct link to A typical scenario" title="Direct link to A typical scenario" translate="no">​</a></h2>
<p>A friend excitedly sends me a link: "Look what I built with AI — three hours!"</p>
<p>I open it:</p>
<ul>
<li class="">There's a page: rounded cards, gradient buttons, purple color scheme — that unmistakable AI look</li>
<li class="">The login button does nothing</li>
<li class="">The data is all hardcoded placeholder values</li>
<li class="">Only runs on his machine</li>
</ul>
<p>I ask: "How do users access this?"</p>
<p>He pauses: "...I hadn't thought that far."</p>
<p>This isn't an isolated case. Most AI-built projects I've seen hit the same wall: <strong>the gap between demo and product.</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-five-pitfalls-of-vibe-coding">The five pitfalls of vibe coding<a href="https://binggg.github.io/en/blog/ai-toy-to-product#the-five-pitfalls-of-vibe-coding" class="hash-link" aria-label="Direct link to The five pitfalls of vibe coding" title="Direct link to The five pitfalls of vibe coding" translate="no">​</a></h2>
<p>Looking closely at these projects, the problems boil down to five:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-requirements-are-a-mystery">1. Requirements are a mystery<a href="https://binggg.github.io/en/blog/ai-toy-to-product#1-requirements-are-a-mystery" class="hash-link" aria-label="Direct link to 1. Requirements are a mystery" title="Direct link to 1. Requirements are a mystery" translate="no">​</a></h3>
<p>"Build me a task management app" — that's what most people tell AI.</p>
<p>The problem: AI doesn't know:</p>
<ul>
<li class="">Should tasks have priorities?</li>
<li class="">Multi-user or single-user?</li>
<li class="">Local storage or cloud?</li>
<li class="">Should it have notifications?</li>
</ul>
<p>AI can only guess. If it guesses right, lucky. If wrong, you rework.</p>
<p><strong>Root cause</strong>: no Spec mindset. Fuzzy requirements, and even the smartest AI can't fix that.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ui-looks-fake">2. UI looks fake<a href="https://binggg.github.io/en/blog/ai-toy-to-product#2-ui-looks-fake" class="hash-link" aria-label="Direct link to 2. UI looks fake" title="Direct link to 2. UI looks fake" translate="no">​</a></h3>
<p>Why does AI-generated UI always have that unmistakable "AI look"?</p>
<ul>
<li class="">Too many rounded corners, too large</li>
<li class="">Gradients everywhere</li>
<li class="">Purple + blue color scheme on repeat</li>
<li class="">Cookie-cutter layouts</li>
</ul>
<p>It's not that AI can't design — you didn't tell it what good design looks like.</p>
<p><strong>Root cause</strong>: no design specs. AI is just imitating the "average" it's seen.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-the-backend-is-empty">3. The backend is empty<a href="https://binggg.github.io/en/blog/ai-toy-to-product#3-the-backend-is-empty" class="hash-link" aria-label="Direct link to 3. The backend is empty" title="Direct link to 3. The backend is empty" translate="no">​</a></h3>
<p>However pretty the frontend page, clicking the login button does nothing.</p>
<p>Because:</p>
<ul>
<li class="">No user system</li>
<li class="">No database</li>
<li class="">No API endpoints</li>
<li class="">No server</li>
</ul>
<p>Many people think AI coding means making frontend pages. But for a usable product, backend is the bigger part.</p>
<p><strong>Root cause</strong>: don't understand architecture choices. Don't know what tech stack to use, so just skip it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-deployment-is-a-black-art">4. Deployment is a black art<a href="https://binggg.github.io/en/blog/ai-toy-to-product#4-deployment-is-a-black-art" class="hash-link" aria-label="Direct link to 4. Deployment is a black art" title="Direct link to 4. Deployment is a black art" translate="no">​</a></h3>
<p>Code is written. Now what?</p>
<ul>
<li class="">How to buy a domain?</li>
<li class="">How to set up HTTPS?</li>
<li class="">Which server to choose?</li>
<li class="">How to deploy the database?</li>
</ul>
<p>For someone without ops experience, every single one of these is a roadblock.</p>
<p><strong>Root cause</strong>: don't understand deployment. Running code locally and shipping a product are two different things.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-one-line-change-breaks-everything">5. One line change breaks everything<a href="https://binggg.github.io/en/blog/ai-toy-to-product#5-one-line-change-breaks-everything" class="hash-link" aria-label="Direct link to 5. One line change breaks everything" title="Direct link to 5. One line change breaks everything" translate="no">​</a></h3>
<p>You finally got it running. Want to add a small feature.</p>
<p>Change one line. Everything breaks.</p>
<p>AI-generated code is often "disposable" — it runs, but can't be modified. Because:</p>
<ul>
<li class="">No modularity</li>
<li class="">No type checking</li>
<li class="">No tests</li>
<li class="">Hardcoded values everywhere</li>
</ul>
<p><strong>Root cause</strong>: no engineering mindset. Code is written for machines to execute, not for humans to maintain.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-break-through">How to break through?<a href="https://binggg.github.io/en/blog/ai-toy-to-product#how-to-break-through" class="hash-link" aria-label="Direct link to How to break through?" title="Direct link to How to break through?" translate="no">​</a></h2>
<p>With the problems analyzed, the path forward is clear. Here are five concrete methods:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1-spec-first-code-second">Method 1: Spec first, code second<a href="https://binggg.github.io/en/blog/ai-toy-to-product#method-1-spec-first-code-second" class="hash-link" aria-label="Direct link to Method 1: Spec first, code second" title="Direct link to Method 1: Spec first, code second" translate="no">​</a></h3>
<p>I wrote about the Kiro Spec workflow before. The core idea:</p>
<blockquote>
<p><strong>Vibe coding's biggest problem: it turns development into "gambling" instead of "controlled engineering."</strong></p>
</blockquote>
<p>The solution: before asking AI to write code, have it clarify requirements. Specifically, generate three files:</p>
<ol>
<li class=""><strong>requirements.md</strong> — spec document (user stories + acceptance criteria using EARS syntax)</li>
<li class=""><strong>design.md</strong> — technical design (architecture, flow, caveats)</li>
<li class=""><strong>tasks.md</strong> — task list (for tracking)</li>
</ol>
<p>This mirrors big tech's development process and agile breakdown — but Kiro integrates it deeply with AI IDEs, making it dramatically more practical.</p>
<p><strong>What is EARS requirements syntax?</strong></p>
<p>EARS (Easy Approach to Requirements Syntax) was originally used for jet engine control systems before being widely adopted in software engineering. It uses simple sentence patterns to constrain requirements and eliminate ambiguity:</p>
<table><thead><tr><th>Type</th><th>Pattern</th><th>Example</th></tr></thead><tbody><tr><td>Ubiquitous</td><td>The system shall...</td><td>The system shall support user login</td></tr><tr><td>Event-driven</td><td>When [trigger], the system shall...</td><td>When the user clicks login, the system shall validate credentials</td></tr><tr><td>State-driven</td><td>While [state], the system shall...</td><td>While the user is logged in, the system shall show the avatar</td></tr><tr><td>Optional</td><td>Where [feature], the system shall...</td><td>Where 2FA is enabled, the system shall send a verification code</td></tr><tr><td>Complex</td><td>If [condition], then the system shall...</td><td>If password errors exceed 3, the system shall lock the account</td></tr></tbody></table>
<p>Clear requirements = precise AI output.</p>
<p><strong>How to use this with other AI IDEs?</strong></p>
<p>Even without Kiro, you can replicate this workflow:</p>
<ul>
<li class="">Claude Code: create <code>CLAUDE.md</code> with Spec workflow rules</li>
<li class="">Cursor: use <code>.cursor/rules/project.mdc</code></li>
<li class="">Augment: use <code>.augment-guidelines</code></li>
</ul>
<p>With this flow, AI stops being a "black box" that generates code, and becomes a partner — <strong>confirming at each step, progressing together.</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2-use-skills-to-constrain-ais-design-output">Method 2: Use Skills to constrain AI's design output<a href="https://binggg.github.io/en/blog/ai-toy-to-product#method-2-use-skills-to-constrain-ais-design-output" class="hash-link" aria-label="Direct link to Method 2: Use Skills to constrain AI's design output" title="Direct link to Method 2: Use Skills to constrain AI's design output" translate="no">​</a></h3>
<p>Don't let AI go wild. Give it a design system.</p>
<p>Introducing: <strong>Skills</strong>.</p>
<p>A Skill is a reusable prompt template that encapsulates domain-specific knowledge. For example, Anthropic's open-source <code>frontend-design</code> Skill specifically addresses the "AI look" problem:</p>
<p>With this Skill, AI-generated UI stops looking like "AI UI."</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3-choose-baas-dont-build-from-scratch">Method 3: Choose BaaS, don't build from scratch<a href="https://binggg.github.io/en/blog/ai-toy-to-product#method-3-choose-baas-dont-build-from-scratch" class="hash-link" aria-label="Direct link to Method 3: Choose BaaS, don't build from scratch" title="Direct link to Method 3: Choose BaaS, don't build from scratch" translate="no">​</a></h3>
<p>Backend is the biggest blocker for most people. But you don't need to build it yourself.</p>
<p><strong>What is BaaS?</strong></p>
<p>BaaS (Backend as a Service) wraps backend capabilities into APIs. Developers just call the SDK:</p>
<table><thead><tr><th>Feature</th><th>Traditional way</th><th>BaaS way</th></tr></thead><tbody><tr><td>Database</td><td>Install MySQL, configure, write SQL</td><td>Call <code>db.collection('users').add()</code></td></tr><tr><td>Auth</td><td>Write register/login/permission logic</td><td>Call <code>auth.signIn()</code></td></tr><tr><td>File storage</td><td>Set up OSS, configure permissions</td><td>Call <code>storage.upload()</code></td></tr><tr><td>APIs</td><td>Write Express/Nest.js routes</td><td>Cloud functions auto-generate HTTP endpoints</td></tr></tbody></table>
<p>This is 10x simpler than building from scratch with Express/Nest.js.</p>
<p><strong>Popular BaaS platforms</strong>:</p>
<ul>
<li class="">International: Supabase, Firebase</li>
<li class="">China: CloudBase (Tencent Cloud)</li>
</ul>
<p>The core BaaS philosophy: <strong>batteries included</strong>. When you create a project, database, auth, and storage are ready to go. No infrastructure to manage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-4-use-platform-hosting-skip-the-server">Method 4: Use platform hosting, skip the server<a href="https://binggg.github.io/en/blog/ai-toy-to-product#method-4-use-platform-hosting-skip-the-server" class="hash-link" aria-label="Direct link to Method 4: Use platform hosting, skip the server" title="Direct link to Method 4: Use platform hosting, skip the server" translate="no">​</a></h3>
<p>Deployment doesn't need manual effort either.</p>
<p>Many platforms handle it for you:</p>
<table><thead><tr><th>Platform type</th><th>Examples</th><th>Features</th></tr></thead><tbody><tr><td>Static hosting</td><td>Vercel, Netlify, Cloudflare Pages</td><td>One-click frontend deploy, auto HTTPS</td></tr><tr><td>Serverless</td><td>AWS Lambda, Cloudflare Workers</td><td>Functions as a service, pay per call</td></tr><tr><td>Full-stack BaaS</td><td>CloudBase, Supabase, Firebase</td><td>Frontend + backend + database in one</td></tr><tr><td>Container</td><td>Railway, Render, Fly.io</td><td>Any language, more flexible</td></tr></tbody></table>
<p>If you're using a BaaS platform (like CloudBase), deployment is even simpler — static hosting for frontend, cloud functions for backend, and database, all in one platform. No need for multiple accounts.</p>
<p>Push your code. The platform handles the rest.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-5-engineering-mindset">Method 5: Engineering mindset<a href="https://binggg.github.io/en/blog/ai-toy-to-product#method-5-engineering-mindset" class="hash-link" aria-label="Direct link to Method 5: Engineering mindset" title="Direct link to Method 5: Engineering mindset" translate="no">​</a></h3>
<p>When asking AI to generate code, require:</p>
<table><thead><tr><th>Requirement</th><th>Practice</th></tr></thead><tbody><tr><td>Modular</td><td>One file, one responsibility</td></tr><tr><td>Typed</td><td>TypeScript — types are documentation</td></tr><tr><td>Testable</td><td>Unit tests for critical logic</td></tr><tr><td>Configurable</td><td>Environment variables, config files — no hardcoding</td></tr></tbody></table>
<p>This produces code you can actually maintain and iterate on.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-practice">My practice<a href="https://binggg.github.io/en/blog/ai-toy-to-product#my-practice" class="hash-link" aria-label="Direct link to My practice" title="Direct link to My practice" translate="no">​</a></h2>
<p>After all this theory, how do I actually do it?</p>
<p>After some experimentation, I've settled on a system that combines all five methods:</p>
<p><strong>1. Spec workflow</strong> — Every new project starts with AI generating <code>requirements.md</code> → <code>design.md</code> → <code>tasks.md</code>. Clear requirements make everything downstream smoother.</p>
<p><strong>2. Skill system</strong> — A curated set of design specs packaged as Skills. Call them whenever generating UI — no more AI look.</p>
<p><strong>3. BaaS architecture</strong> — Backend on a cloud platform, no servers touched. Database, cloud functions, auth, file storage — all ready out of the box.</p>
<p><strong>4. MCP protocol</strong> — MCP lets AI call cloud services directly. Creating databases, deploying functions, configuring domains — no manual operations needed.</p>
<p>This system is packaged as <strong>CloudBase AI Toolkit</strong>, open source on GitHub.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final thoughts<a href="https://binggg.github.io/en/blog/ai-toy-to-product#final-thoughts" class="hash-link" aria-label="Direct link to Final thoughts" title="Direct link to Final thoughts" translate="no">​</a></h2>
<p>Vibe coding works — but only for demos.</p>
<p>Going from demo to product doesn't require a stronger AI. It requires <strong>engineering thinking</strong>:</p>
<ul>
<li class="">Clear requirements (Spec workflow)</li>
<li class="">Design standards (Skill system)</li>
<li class="">Sound architecture (BaaS)</li>
<li class="">Intelligent development (MCP)</li>
<li class="">Maintainable code (engineering)</li>
</ul>
<p>AI is a tool. But tools need the right technique.</p>
<p>Just like owning a power drill doesn't make you a carpenter. The key is knowing how and where to use it.</p>
<blockquote>
<p><strong>Remember: AI doesn't replace humans. It makes humans more capable.</strong></p>
</blockquote>
<hr>
<p><em>Have your own AI coding experiences? I'd love to hear about them.</em></p>]]></content:encoded>
            <category>AI</category>
            <category>fullstack</category>
        </item>
        <item>
            <title><![CDATA[Why does your AI code always need rework? SBE methodology has the answer]]></title>
            <link>https://binggg.github.io/en/blog/sbe-methodology</link>
            <guid>https://binggg.github.io/en/blog/sbe-methodology</guid>
            <pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[My Kiro Spec Workflow guide blew up recently, and many people DM'd me: "Why is the Spec approach so effective? What's the theory behind it?"]]></description>
            <content:encoded><![CDATA[<p>My <a class="" href="https://binggg.github.io/en/blog/kiro-spec-workflow">Kiro Spec Workflow guide</a> blew up recently, and many people DM'd me: <strong>"Why is the Spec approach so effective? What's the theory behind it?"</strong></p>
<p>Honestly, I'd been thinking about this too. Then I read Gojko Adzic's <em>Specification by Example: How Successful Teams Deliver the Right Software</em>, and it all clicked.</p>
<p>It turns out Kiro's Spec workflow is a perfect implementation of <strong>SBE (Specification by Example)</strong> methodology. <strong>Let me unpack this framework and fix your AI coding rework problem once and for all.</strong></p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-does-your-ai-code-always-need-rework">Why does your AI code always need rework?<a href="https://binggg.github.io/en/blog/sbe-methodology#why-does-your-ai-code-always-need-rework" class="hash-link" aria-label="Direct link to Why does your AI code always need rework?" title="Direct link to Why does your AI code always need rework?" translate="no">​</a></h2>
<p>Sound familiar?</p>
<ul>
<li class="">You ask AI to build a login feature, it generates a registration page</li>
<li class="">You request data export, AI gives you data import</li>
<li class="">You want a simple API, AI builds a complex microservice architecture</li>
</ul>
<p><strong>What's the root cause?</strong></p>
<p>It's not that AI isn't smart enough — it's that our requirements are too vague. It's like talking to a foreign friend: if you say "I want food," they might interpret it as "I want rice," "I want to go to a restaurant," or "I want to order delivery."</p>
<p>With AI coding, this ambiguity is amplified. AI can only guess what you want based on your description. When it guesses right, great. When it guesses wrong, you rework.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-traditional-requirements-dilemma">The traditional requirements dilemma<a href="https://binggg.github.io/en/blog/sbe-methodology#the-traditional-requirements-dilemma" class="hash-link" aria-label="Direct link to The traditional requirements dilemma" title="Direct link to The traditional requirements dilemma" translate="no">​</a></h3>
<p>Classic software engineering identified these problems long ago:</p>
<ol>
<li class=""><strong>Ambiguous requirements</strong>: same spec, different interpretations</li>
<li class=""><strong>Late rework</strong>: discover misunderstandings after development</li>
<li class=""><strong>Stale documentation</strong>: specs can't keep up with changes</li>
<li class=""><strong>Communication overhead</strong>: endless requirement clarification</li>
</ol>
<p>These problems are magnified in AI coding. When requirements are fuzzy, AI is fumbling in the dark, relying on "luck" to generate the right code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="traditional-software-engineering-had-the-answer-all-along">Traditional software engineering had the answer all along<a href="https://binggg.github.io/en/blog/sbe-methodology#traditional-software-engineering-had-the-answer-all-along" class="hash-link" aria-label="Direct link to Traditional software engineering had the answer all along" title="Direct link to Traditional software engineering had the answer all along" translate="no">​</a></h2>
<p>Gojko Adzic's <em>Specification by Example</em> — SBE methodology — was built specifically to solve these problems.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sbe-core-principles">SBE core principles<a href="https://binggg.github.io/en/blog/sbe-methodology#sbe-core-principles" class="hash-link" aria-label="Direct link to SBE core principles" title="Direct link to SBE core principles" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-example-driven-requirements">1. Example-driven requirements<a href="https://binggg.github.io/en/blog/sbe-methodology#1-example-driven-requirements" class="hash-link" aria-label="Direct link to 1. Example-driven requirements" title="Direct link to 1. Example-driven requirements" translate="no">​</a></h4>
<p>Replace abstract descriptions with <strong>concrete, real examples</strong>:</p>
<p>❌ <strong>Abstract</strong>: The login feature must be secure and reliable
✅ <strong>Example-driven</strong>:</p>
<ul>
<li class="">Given the user enters the correct username and password</li>
<li class="">When they click the login button</li>
<li class="">Then the system shows the welcome page</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-collaborative-requirement-clarification">2. Collaborative requirement clarification<a href="https://binggg.github.io/en/blog/sbe-methodology#2-collaborative-requirement-clarification" class="hash-link" aria-label="Direct link to 2. Collaborative requirement clarification" title="Direct link to 2. Collaborative requirement clarification" translate="no">​</a></h4>
<p>Emphasize <strong>cross-role collaboration</strong> by discussing examples together, avoiding "requirement silos." In AI coding, this is the human-AI collaboration process.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-from-requirements-to-executable-tests">3. From requirements to executable tests<a href="https://binggg.github.io/en/blog/sbe-methodology#3-from-requirements-to-executable-tests" class="hash-link" aria-label="Direct link to 3. From requirements to executable tests" title="Direct link to 3. From requirements to executable tests" translate="no">​</a></h4>
<p>Turn examples into <strong>automated test cases</strong> — "requirements as tests." This is the theoretical foundation of Spec mode's test generation from requirements.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-living-documentation">4. Living documentation<a href="https://binggg.github.io/en/blog/sbe-methodology#4-living-documentation" class="hash-link" aria-label="Direct link to 4. Living documentation" title="Direct link to 4. Living documentation" translate="no">​</a></h4>
<p>Example-driven requirements produce a <strong>dynamically updated documentation system</strong> that stays in sync as requirements change. This is exactly the continuously updated <code>requirements.md</code> and <code>design.md</code> in Spec mode.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sbe-meets-spec-a-perfect-mapping">SBE meets Spec: a perfect mapping<a href="https://binggg.github.io/en/blog/sbe-methodology#sbe-meets-spec-a-perfect-mapping" class="hash-link" aria-label="Direct link to SBE meets Spec: a perfect mapping" title="Direct link to SBE meets Spec: a perfect mapping" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="requirement-clarification--requirementsmd-iteration">Requirement clarification → requirements.md iteration<a href="https://binggg.github.io/en/blog/sbe-methodology#requirement-clarification--requirementsmd-iteration" class="hash-link" aria-label="Direct link to Requirement clarification → requirements.md iteration" title="Direct link to Requirement clarification → requirements.md iteration" translate="no">​</a></h3>
<p><strong>SBE principle</strong>: Use concrete examples to clarify requirements, ensuring shared understanding.</p>
<p><strong>Spec practice</strong>:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> Requirement 1 - User Login</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">User Story:</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> As a user, I want to log in securely so I can access my personal data.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">####</span><span class="token title important"> Acceptance Criteria</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> When the user enters correct credentials, the system shall display the welcome page</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> When the user enters an incorrect password, the system shall show an error message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> When the user enters wrong credentials 3 times, the system shall lock the account for 30 minutes</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="technical-design--designmd-collaboration">Technical design → design.md collaboration<a href="https://binggg.github.io/en/blog/sbe-methodology#technical-design--designmd-collaboration" class="hash-link" aria-label="Direct link to Technical design → design.md collaboration" title="Direct link to Technical design → design.md collaboration" translate="no">​</a></h3>
<p><strong>SBE principle</strong>: Avoid technical pitfalls by focusing on business functionality.</p>
<p><strong>Spec practice</strong>:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Technical Design</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> Architecture</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Frontend: React + TypeScript</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Backend: Node.js + Express</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Database: MongoDB</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Auth: JWT Token</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-driven--requirements-based-test-generation">Test-driven → requirements-based test generation<a href="https://binggg.github.io/en/blog/sbe-methodology#test-driven--requirements-based-test-generation" class="hash-link" aria-label="Direct link to Test-driven → requirements-based test generation" title="Direct link to Test-driven → requirements-based test generation" translate="no">​</a></h3>
<p><strong>SBE principle</strong>: Requirements are tests. Ensure implementation meets expectations.</p>
<p><strong>Spec practice</strong>:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Auto-generated test cases from requirements.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">describe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'User Login'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">test</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'successful login with correct password'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> response </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">login</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'user@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'correctPassword'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toBe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toBe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Welcome page'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hands-on-sbe-in-ai-coding">Hands-on: SBE in AI coding<a href="https://binggg.github.io/en/blog/sbe-methodology#hands-on-sbe-in-ai-coding" class="hash-link" aria-label="Direct link to Hands-on: SBE in AI coding" title="Direct link to Hands-on: SBE in AI coding" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-i-learned-from-practice">What I learned from practice<a href="https://binggg.github.io/en/blog/sbe-methodology#what-i-learned-from-practice" class="hash-link" aria-label="Direct link to What I learned from practice" title="Direct link to What I learned from practice" translate="no">​</a></h3>
<p>After applying this across multiple projects, I found SBE methodology genuinely effective in AI coding:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-requirement-iteration-is-the-most-important-thing">1. Requirement iteration is the most important thing<a href="https://binggg.github.io/en/blog/sbe-methodology#1-requirement-iteration-is-the-most-important-thing" class="hash-link" aria-label="Direct link to 1. Requirement iteration is the most important thing" title="Direct link to 1. Requirement iteration is the most important thing" translate="no">​</a></h4>
<p><strong>Key finding</strong>: Continuously iterating and clarifying <code>requirements.md</code> and <code>design.md</code> is the heart of the process.</p>
<p><strong>Real case</strong>:</p>
<ul>
<li class="">In the <code>CloudBase-AI-ToolKit</code> project, every new feature uses the Spec approach</li>
<li class="">After iterative refinement of requirements.md, requirement clarity improved by 80%</li>
<li class="">Rework rate dropped from 60% to 15%</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-generate-test-cases-from-requirements">2. Generate test cases from requirements<a href="https://binggg.github.io/en/blog/sbe-methodology#2-generate-test-cases-from-requirements" class="hash-link" aria-label="Direct link to 2. Generate test cases from requirements" title="Direct link to 2. Generate test cases from requirements" translate="no">​</a></h4>
<p><strong>Key finding</strong>: Test cases generated from requirements.md make AI coding verifiable.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-apply-to-existing-projects-too">3. Apply to existing projects too<a href="https://binggg.github.io/en/blog/sbe-methodology#3-apply-to-existing-projects-too" class="hash-link" aria-label="Direct link to 3. Apply to existing projects too" title="Direct link to 3. Apply to existing projects too" translate="no">​</a></h4>
<p><strong>Key finding</strong>: Spec mode isn't just for greenfield projects — it works just as well on existing codebases.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="granularity-best-practices">Granularity best practices<a href="https://binggg.github.io/en/blog/sbe-methodology#granularity-best-practices" class="hash-link" aria-label="Direct link to Granularity best practices" title="Direct link to Granularity best practices" translate="no">​</a></h3>
<p>On the question of how to split: here's my experience:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="split-by-feature-module">Split by feature module<a href="https://binggg.github.io/en/blog/sbe-methodology#split-by-feature-module" class="hash-link" aria-label="Direct link to Split by feature module" title="Direct link to Split by feature module" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">specs/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── user-management/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── requirements.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── design.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── tasks.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── file-upload/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── requirements.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── design.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── tasks.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── data-export/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── requirements.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── design.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── tasks.md</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="split-by-iteration">Split by iteration<a href="https://binggg.github.io/en/blog/sbe-methodology#split-by-iteration" class="hash-link" aria-label="Direct link to Split by iteration" title="Direct link to Split by iteration" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">specs/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── v1.0-basic-features/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── v1.1-advanced-features/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── v1.2-optimization/</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="split-by-complexity">Split by complexity<a href="https://binggg.github.io/en/blog/sbe-methodology#split-by-complexity" class="hash-link" aria-label="Direct link to Split by complexity" title="Direct link to Split by complexity" translate="no">​</a></h4>
<ul>
<li class=""><strong>Simple features</strong>: single spec file</li>
<li class=""><strong>Medium features</strong>: dedicated spec folder</li>
<li class=""><strong>Complex features</strong>: multiple related spec folders</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-good-is-sbe-methodology-really">How good is SBE methodology, really?<a href="https://binggg.github.io/en/blog/sbe-methodology#how-good-is-sbe-methodology-really" class="hash-link" aria-label="Direct link to How good is SBE methodology, really?" title="Direct link to How good is SBE methodology, really?" translate="no">​</a></h2>
<p>At this point you might ask: <strong>"Is this methodology really that effective? Isn't it too complex?"</strong></p>
<p>Honestly, I had the same concern at first. But practice proved SBE methodology delivers:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-is-sbe-so-effective">Why is SBE so effective?<a href="https://binggg.github.io/en/blog/sbe-methodology#why-is-sbe-so-effective" class="hash-link" aria-label="Direct link to Why is SBE so effective?" title="Direct link to Why is SBE so effective?" translate="no">​</a></h3>
<ol>
<li class=""><strong>Clear requirements</strong>: concrete examples beat abstract descriptions every time</li>
<li class=""><strong>Less rework</strong>: clear specs produce higher quality code</li>
<li class=""><strong>Better collaboration</strong>: shared understanding reduces communication overhead</li>
<li class=""><strong>Living docs</strong>: stays fresh as requirements evolve</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-it">When to use it<a href="https://binggg.github.io/en/blog/sbe-methodology#when-to-use-it" class="hash-link" aria-label="Direct link to When to use it" title="Direct link to When to use it" translate="no">​</a></h3>
<p><strong>Good fit</strong>:</p>
<ul>
<li class="">✅ Complex, multi-module projects</li>
<li class="">✅ Team collaboration needing unified standards</li>
<li class="">✅ High quality requirements with traceability</li>
</ul>
<p><strong>Less suitable</strong>:</p>
<ul>
<li class="">❌ Quick prototypes to validate ideas</li>
<li class="">❌ Personal projects with simple features</li>
<li class="">❌ Extremely time-constrained projects</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary-from-hope-it-works-to-engineered-certainty">Summary: From "hope it works" to "engineered certainty"<a href="https://binggg.github.io/en/blog/sbe-methodology#summary-from-hope-it-works-to-engineered-certainty" class="hash-link" aria-label="Direct link to Summary: From &quot;hope it works&quot; to &quot;engineered certainty&quot;" title="Direct link to Summary: From &quot;hope it works&quot; to &quot;engineered certainty&quot;" translate="no">​</a></h2>
<p>SBE methodology provides a battle-tested theoretical foundation and practical framework for AI coding. Through example-driven requirements, collaborative clarification, test-driven development, and living documentation, we can make AI coding more controllable, efficient, and reliable.</p>
<p>Remember: <strong>AI doesn't replace humans — it frees humans to focus on decisions and direction, leaving the tedious details to AI.</strong></p>
<p>That way, your AI coding stops being a "hope it works" gamble and becomes true <strong>engineered certainty</strong>.</p>
<hr>
<p><strong>Let's talk</strong>:</p>
<ol>
<li class="">What development approach are you using?</li>
<li class="">Do you think Spec mode would work for your projects?</li>
<li class="">Share your AI coding experiences below!</li>
</ol>]]></content:encoded>
            <category>AI</category>
            <category>fullstack</category>
        </item>
        <item>
            <title><![CDATA[AI coding without luck: the complete guide to replicating Kiro's Spec workflow]]></title>
            <link>https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow</link>
            <guid>https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow</guid>
            <pubDate>Mon, 21 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A complete guide to porting Kiro's Spec workflow to any AI IDE — write requirements with EARS syntax, design technical solutions, split tasks, and move from vibe coding to engineered AI development.]]></description>
            <content:encoded><![CDATA[<p>Kiro's tweets blew up recently, and many friends DM'd me for details, so here's a systematic article covering the specifics and practical methods.</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="slot-machine-vibe-coding--is-it-really-reliable">Slot-machine vibe coding — is it really reliable?<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#slot-machine-vibe-coding--is-it-really-reliable" class="hash-link" aria-label="Direct link to Slot-machine vibe coding — is it really reliable?" title="Direct link to Slot-machine vibe coding — is it really reliable?" translate="no">​</a></h2>
<p>Ever had this experience? You type a vague requirement into an AI IDE, hit "generate," and wait expectantly for AI to produce a perfect program? The result feels like pulling the lever on a slot machine — sometimes you hit a small jackpot, but most of the time you get nothing.</p>
<blockquote>
<p>Vibe coding is like a slot machine:</p>
<p>Slot machine: buy tokens, pull the lever, occasionally win big. More often it's "try again." The house always wins in the end.</p>
<p>Vibe coding: buy Tokens, write vague prompts, hit "generate." Sometimes you get perfect code, sometimes a mess. AI encourages you to "try again." You console yourself with "this time I'll fix the bug." But the model vendor always wins in the end. Occasionally you feel like you came out ahead — only to realize later you spent more time than it was worth.</p>
</blockquote>
<p>Vibe coding's biggest problem: it turns development into "gambling" instead of "controlled engineering."</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="typical-vibe-coding-flow">Typical vibe coding flow<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#typical-vibe-coding-flow" class="hash-link" aria-label="Direct link to Typical vibe coding flow" title="Direct link to Typical vibe coding flow" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>Yellow = human operation, Blue = AI output, Red = undesirable result.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="is-there-a-better-way--how-traditional-development-works">Is there a better way? — How traditional development works<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#is-there-a-better-way--how-traditional-development-works" class="hash-link" aria-label="Direct link to Is there a better way? — How traditional development works" title="Direct link to Is there a better way? — How traditional development works" translate="no">​</a></h2>
<p>Traditional software engineering emphasizes requirement clarification, technical design, task breakdown, and traceability. This approach may seem "slow," but it keeps projects moving steadily, enables review, and supports collaboration.</p>
<p>Kiro AI IDE has packaged this process into a <strong>Spec workflow</strong> — making AI coding as reliable as an engineer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="traditional-development-flow">Traditional development flow<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#traditional-development-flow" class="hash-link" aria-label="Direct link to Traditional development flow" title="Direct link to Traditional development flow" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>This flow emphasizes requirement review and iterative feedback — the closed-loop continuous improvement of traditional software engineering.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-makes-kiros-spec-workflow-so-good">What makes Kiro's Spec workflow so good?<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#what-makes-kiros-spec-workflow-so-good" class="hash-link" aria-label="Direct link to What makes Kiro's Spec workflow so good?" title="Direct link to What makes Kiro's Spec workflow so good?" translate="no">​</a></h2>
<p>Kiro is AWS's AI IDE. Beyond free access to Claude 4, its biggest highlight is the Spec workflow:</p>
<ul>
<li class="">Every project has 3 core files:<!-- -->
<ol>
<li class=""><strong>requirements.md</strong> — spec document (user stories + acceptance criteria with EARS syntax)</li>
<li class=""><strong>design.md</strong> — technical design (architecture, flow, caveats)</li>
<li class=""><strong>tasks.md</strong> — task list (trackable todo list)</li>
</ol>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-ears-syntax">What is EARS syntax?<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#what-is-ears-syntax" class="hash-link" aria-label="Direct link to What is EARS syntax?" title="Direct link to What is EARS syntax?" translate="no">​</a></h3>
<p>EARS (Easy Approach to Requirements Syntax) was originally developed for jet engine control systems before being widely adopted in software engineering. It uses simple sentence patterns to constrain requirements and eliminate ambiguity.</p>
<blockquote>
<p>Example: When the user clicks "mute," the system shall suppress all audio output.</p>
</blockquote>
<p>References: <a href="https://alistairmavin.com/ears/" target="_blank" rel="noopener noreferrer" class="">EARS Syntax Guide</a> | <a href="https://v0-ears-syntax-guide-bd8ywxbxo-booker-zhaos-projects.vercel.app/" target="_blank" rel="noopener noreferrer" class="">v0.dev Cheat Sheet</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="you-can-run-spec-workflow-with-claude-code-too-with-a-worked-example">You can run Spec workflow with Claude Code too! (with a worked example)<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#you-can-run-spec-workflow-with-claude-code-too-with-a-worked-example" class="hash-link" aria-label="Direct link to You can run Spec workflow with Claude Code too! (with a worked example)" title="Direct link to You can run Spec workflow with Claude Code too! (with a worked example)" translate="no">​</a></h2>
<p>Even without Kiro, you can replicate this workflow with any AI IDE. Using Claude Code as an example, the process is remarkably smooth:</p>
<ol>
<li class=""><strong>Create a CLAUDE.md in your project</strong>
Write the following prompt template into <code>CLAUDE.md</code> as your AI collaboration "job description":</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># CLAUDE.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">You are a professional AI programming assistant. Follow the Spec workflow strictly:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">1. Clarify requirements and output requirements.md using EARS syntax.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2. Design technical solution and output design.md (architecture, tech choices, APIs, testing strategy).</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3. Break down tasks and output tasks.md as an actionable todo list.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4. Help write and test code according to the task list, saving artifacts to output/.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">5. Critical: confirm each step with me before proceeding to the next.</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">
<p><strong>Launch Claude Code, enter your raw requirements</strong>
Just type your idea or user story into the chat.
Claude reads CLAUDE.md and starts clarifying requirements with you.</p>
</li>
<li class="">
<p><strong>After confirmation, Claude outputs requirements.md</strong>
Claude uses EARS syntax to structure requirements and generates a standards-compliant requirements.md.
You can add or modify at any point — Claude stays aligned with you.</p>
</li>
<li class="">
<p><strong>Technical design</strong>
After requirements are confirmed, Claude automatically moves to the design.md phase.
Includes architecture, tech choices, APIs, testing strategy, etc.</p>
</li>
<li class="">
<p><strong>Task breakdown</strong>
Claude generates tasks.md from design.md, breaking the solution into executable items.</p>
</li>
<li class="">
<p><strong>Step-by-step implementation and review</strong>
Claude helps implement code and tests according to tasks.md, saving all artifacts to an output/ directory.
You only participate in key review checkpoints: requirements, design, acceptance.</p>
</li>
</ol>
<blockquote>
<p><strong>Recommended CLAUDE.md prompt</strong>:
"You are a professional AI programming assistant. Follow the Spec workflow strictly, confirming each step with me before proceeding."</p>
</blockquote>
<p>This way, even without Kiro, you can replicate the Spec workflow with Claude Code — making AI coding efficient, controllable, and reviewable.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vibe-coding-vs-spec-workflow-comparison">Vibe coding vs Spec workflow comparison<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#vibe-coding-vs-spec-workflow-comparison" class="hash-link" aria-label="Direct link to Vibe coding vs Spec workflow comparison" title="Direct link to Vibe coding vs Spec workflow comparison" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>Yellow = human review, Blue = AI output, Red = bad outcome, Green = good outcome, Gray = group.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="claude-code-spec-workflow--conversation-example">Claude Code Spec workflow — conversation example<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#claude-code-spec-workflow--conversation-example" class="hash-link" aria-label="Direct link to Claude Code Spec workflow — conversation example" title="Direct link to Claude Code Spec workflow — conversation example" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">User</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: I want to build a tool that "automatically organizes meeting minutes." Can you help plan it?</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> (reads CLAUDE.md and responds automatically):</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Of course! We'll follow the standard Spec workflow. First, I'll help clarify requirements and output requirements.md. What input methods do you need? For example: voice, text, file upload?</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">User</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: Mainly uploading audio recordings — preferably supporting multiple audio formats.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Got it. Any requirements for output format? Plain text, Markdown, Word documents?</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">User</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: Markdown and Word export would be ideal.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Confirmed. Here's the requirements.md draft using EARS syntax:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> requirements.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> User Story</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">As a frequent meeting attendee, I want to upload meeting recordings and get structured meeting minutes automatically, with export to Markdown or Word, to save organization time.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Acceptance Criteria</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> When the user uploads an audio file, the system shall support common audio formats (mp3, wav, m4a).</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> When audio upload completes, the system shall automatically transcribe the audio and extract key points.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> When the user clicks export, the system shall support Markdown and Word document export.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Please confirm the requirements. After confirmation, I'll move to the technical design phase.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">User</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: Confirmed.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Proceeding to design.md:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> design.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Architecture Overview</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Frontend: file upload, progress display, export button</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Backend: audio-to-text (ASR service), key point extraction (LLM), format conversion</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Storage: temporary file storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Tech Stack</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Frontend: React</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Backend: Node.js + OpenAI/Claude API</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ASR: Whisper API</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Document export: jsdocx, markdown-it</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Flow</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> User uploads audio</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Backend transcribes to text</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> LLM extracts key points</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> Frontend displays and supports export</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Security</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Files stored temporarily, auto-deleted after processing</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Please confirm the design. After confirmation, I'll break down the task list.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">User</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: Confirmed.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Here's tasks.md:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> tasks.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Build frontend upload page</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Implement audio file upload API</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Integrate ASR service for audio transcription</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Call LLM for key point extraction</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Implement Markdown/Word export</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Integration testing</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Documentation and acceptance</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Please confirm the task list. After confirmation, I'll help implement each task step by step.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloudbase-ai-toolkit-one-stop-spec-workflow-replication">CloudBase AI Toolkit: one-stop Spec workflow replication<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#cloudbase-ai-toolkit-one-stop-spec-workflow-replication" class="hash-link" aria-label="Direct link to CloudBase AI Toolkit: one-stop Spec workflow replication" title="Direct link to CloudBase AI Toolkit: one-stop Spec workflow replication" translate="no">​</a></h2>
<p>If you want a more turnkey experience, try CloudBase AI Toolkit:</p>
<ul>
<li class="">Supports multiple AI IDEs</li>
<li class="">Built-in Spec workflow templates</li>
<li class="">One-click generation, deployment, and hosting — no ops needed</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="human-ai-collaboration-is-the-real-answer">Human-AI collaboration is the real answer<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#human-ai-collaboration-is-the-real-answer" class="hash-link" aria-label="Direct link to Human-AI collaboration is the real answer" title="Direct link to Human-AI collaboration is the real answer" translate="no">​</a></h2>
<p>In the Spec workflow, AI handles:</p>
<ul>
<li class="">Vague requirements → clarified specs</li>
<li class="">Technical design docs</li>
<li class="">Task breakdown</li>
<li class="">Code implementation</li>
<li class="">Acceptance testing</li>
</ul>
<p>Humans only need to:</p>
<ul>
<li class="">Input requirements</li>
<li class="">Review requirements / design / schedule / tests</li>
</ul>
<p>This gives you the best of both worlds: AI's efficiency and human engineering quality.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-software-engineering-flow">Standard software engineering flow<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#standard-software-engineering-flow" class="hash-link" aria-label="Direct link to Standard software engineering flow" title="Direct link to Standard software engineering flow" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>Yellow = human review, Blue = engineering activity (AI + human), Green = high-quality result.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary-faster-more-reliable-more-trustworthy-ai-coding">Summary: faster, more reliable, more trustworthy AI coding<a href="https://binggg.github.io/en/blog/2025/07/21/kiro-spec-workflow#summary-faster-more-reliable-more-trustworthy-ai-coding" class="hash-link" aria-label="Direct link to Summary: faster, more reliable, more trustworthy AI coding" title="Direct link to Summary: faster, more reliable, more trustworthy AI coding" translate="no">​</a></h2>
<p>The Spec workflow transforms AI coding from "gambling" into "a repeatable process." The experience and judgment of human engineers, combined with AI's efficient execution — that's how you truly accelerate development, improve quality, and keep things reviewable.</p>
<blockquote>
<p>Remember: AI doesn't replace humans. It makes humans more capable.</p>
</blockquote>]]></content:encoded>
            <category>AI</category>
            <category>fullstack</category>
            <category>open-source</category>
        </item>
    </channel>
</rss>