<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Skill on Uncle Xiang&#39;s Notebook</title>
        <link>https://ttf248.life/en/tags/skill/</link>
        <description>Recent content in Skill on Uncle Xiang&#39;s Notebook</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Thu, 09 Apr 2026 15:45:31 +0800</lastBuildDate><atom:link href="https://ttf248.life/en/tags/skill/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>AI Writing a Blog: The Next Steps Towards Engineering (Part 1)</title>
        <link>https://ttf248.life/en/p/why-blog-writer-had-to-exist/</link>
        <pubDate>Fri, 03 Apr 2026 20:58:02 +0800</pubDate>
        
        <guid>https://ttf248.life/en/p/why-blog-writer-had-to-exist/</guid>
        <description>&lt;p&gt;I wrote quite a few AI articles last year. The most basic workflow back then was: first, organize an outline or a list of questions myself; let the large model spit out the main body text; then copy the content into a local &lt;code&gt;md&lt;/code&gt; document, add frontmatter, tags, categories, and titles, and finally publish it.
This process isn&amp;rsquo;t unusable, but it&amp;rsquo;s tedious. The part that really wastes time isn&amp;rsquo;t the main body text, but the repetitive labor surrounding it. Especially after using &lt;code&gt;Codex&lt;/code&gt; a lot recently, this awkwardness has become even stronger. It can read repositories, modify files, supplement materials, and even write articles directly into the directory. If I still have to copy and paste things manually, it feels like I&amp;rsquo;m tying down the tool&amp;rsquo;s legs.&lt;/p&gt;
&lt;p&gt;This series of articles is actually trying to convey one thing: AI writing blogs cannot rely solely on a single prompt in the long run. This current article first discusses why &lt;code&gt;blog-writer&lt;/code&gt; came into existence; the next article will continue with &lt;a class=&#34;link&#34; href=&#34;https://ttf248.life/en/p/how-blog-style-suite-split-style-and-token-cost/&#34; &gt;AI Writing Blogs: Later, It Still Needs to Be Engineered (Part II): How blog-style-suite Separates Style Learning and Token Costs&lt;/a&gt;; and the last article concludes with &lt;a class=&#34;link&#34; href=&#34;https://ttf248.life/en/p/how-i-split-local-online-and-minimax-models/&#34; &gt;AI Writing Blogs: Later, It Still Needs to Be Engineered (Part III): How Local Models, Online Models, and Minimax Will Finally Divide Labor&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;whats-truly-annoying-isnt-writing-the-draft-but-that-sequence-of-mechanical-actions&#34;&gt;What&amp;rsquo;s truly annoying isn&amp;rsquo;t writing the draft, but that sequence of mechanical actions.
&lt;/h2&gt;&lt;p&gt;The early workflow was essentially like an outsourced assembly line.
I would first list out the problems clearly, or build a rough outline. The model is responsible for laying out the main body text. Then, a human comes back to complete the remaining publishing steps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy to local &lt;code&gt;md&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Fill in &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, and &lt;code&gt;slug&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add tags and categories&lt;/li&gt;
&lt;li&gt;Insert &lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Organize reference materials&lt;/li&gt;
&lt;li&gt;Finally, decide which directory it should go into
Looking at each step individually, this sequence isn&amp;rsquo;t difficult. But when strung together, it becomes tedious. What&amp;rsquo;s annoying isn&amp;rsquo;t the technical difficulty; it&amp;rsquo;s that these steps are all mechanical, yet they cannot be skipped.
This is why I increasingly feel that changes like &lt;a class=&#34;link&#34; href=&#34;https://ttf248.life/en/p/command-line-ai-coding-interaction/&#34; &gt;AI coding interaction based on command line&lt;/a&gt; are not just about &amp;ldquo;changing the entry point.&amp;rdquo; When AI can directly read and write files within a repository, if blog writing still stops at the level of &amp;ldquo;copying the body text to a local document,&amp;rdquo; the entire workflow is actually outdated.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;blog-writer-the-first-layer-of-value-its-not-the-style-its-locking-down-the-contract&#34;&gt;blog-writer The First Layer of Value: It&amp;rsquo;s Not the Style, It&amp;rsquo;s Locking Down the Contract
&lt;/h2&gt;&lt;p&gt;The very first node for &lt;code&gt;blog-writer&lt;/code&gt; was at 17:00 on April 1, 2026, with the commit hash &lt;code&gt;991536a&lt;/code&gt;. Looking at the git commit history, this version included &lt;code&gt;SKILL.md&lt;/code&gt;, &lt;code&gt;write_post.py&lt;/code&gt;, and an initial set of style guidelines all together.&lt;/p&gt;
&lt;p&gt;However, when I looked back later, the most valuable part of this draft wasn&amp;rsquo;t that &amp;ldquo;the AI learned my writing style,&amp;rdquo; but rather that it established a rigid contract for content creation.&lt;/p&gt;
&lt;p&gt;What does &amp;ldquo;locking down the contract&amp;rdquo; mean?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The input must include at least an outline and factual anchors.&lt;/li&gt;
&lt;li&gt;The output must be complete Markdown, not a work in progress.&lt;/li&gt;
&lt;li&gt;Frontmatter cannot rely on manual additions anymore.&lt;/li&gt;
&lt;li&gt;The article cannot just stay in the chat window; it must land directly into &lt;code&gt;content/post&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This point is crucial because prompts themselves are inherently unstable. If you say, &amp;ldquo;Write it like before,&amp;rdquo; today, it might understand that only the tone should be similar; if you repeat it tomorrow, it might only learn superficial sentence structures. But once it&amp;rsquo;s written as a &lt;code&gt;Skill&lt;/code&gt;, the rule shifts from &amp;ldquo;improvisation&amp;rdquo; to a &amp;ldquo;fixed workflow.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The subsequent nodes were actually all about reinforcing this contract.&lt;/p&gt;
&lt;p&gt;The commit at 22:54 on April 2, 2026, with hash &lt;code&gt;8eb735a&lt;/code&gt;, standardized elements like author fields, writing notes, and original prompts. By this stage, the blog draft was no longer considered &amp;ldquo;finished once the body text is done&amp;rdquo;; instead, metadata, traceability, and public notes were all standardized together.&lt;/p&gt;
&lt;p&gt;Therefore, the first layer of value for &lt;code&gt;blog-writer&lt;/code&gt; has never been about making the model &lt;em&gt;seem&lt;/em&gt; better at writing; it&amp;rsquo;s about finally giving the act of drafting repeatable boundaries.&lt;/p&gt;
&lt;h2 id=&#34;series-mode-which-is-actually-one-step-forward-in-writing-workflow&#34;&gt;Series Mode, Which is Actually One Step Forward in Writing Workflow
&lt;/h2&gt;&lt;p&gt;After stabilizing writing a single article, the next problem quickly emerged.
Some topics are simply not suitable to be crammed into one piece. If you force it, the result often becomes a long article that is information-heavy, has a scattered main thread, and fails to fully explain every point.
This is why the commit &lt;code&gt;1a5604e&lt;/code&gt; on April 2, 2026, at 23:55 was so crucial. That time, they directly added the series mode along with &lt;code&gt;write_post_series.py&lt;/code&gt;. The articles are linked using &lt;code&gt;relref&lt;/code&gt;, and the replacement is done uniformly during batch writing.
This might look like a minor upgrade to a file-writing script, but it&amp;rsquo;s not.
It illustrates one thing: content engineering is no longer just about &amp;ldquo;how to generate this single article,&amp;rdquo; but rather starts considering &amp;ldquo;how to stably save this set of content, how to guarantee the order, and how to link between them on the site.&amp;rdquo;
The next day&amp;rsquo;s commit, &lt;code&gt;04dccb9&lt;/code&gt; on April 3, 2026, at 09:29, pushed this process one step further. The timestamps for series articles now increment by minutes instead of sharing a single timestamp. This change is small but very &amp;ldquo;engineering-y&amp;rdquo; because it solves real problems like Hugo list pages, previous/next article navigation, and series ordering.
Simply put, the series mode isn&amp;rsquo;t about looking advanced; it&amp;rsquo;s about eliminating the need for manual fixes when publishing multiple articles together.&lt;/p&gt;
&lt;h2 id=&#34;but-relying-on-just-one-skill-will-eventually-hit-a-token-wall&#34;&gt;But relying on just one skill will eventually hit a token wall.
&lt;/h2&gt;&lt;p&gt;The problem lies here.
Once you start seriously tinkering with style learning, the context of &lt;code&gt;blog-writer&lt;/code&gt; will quickly become bloated. You not only want it to write, but you also want it to write like you used to. The most natural way to do this is to dump all your historical articles into it.
This works for a single run, of course.
But as soon as you&amp;rsquo;re not writing an occasional piece, but trying to make it a long-term workflow, the problems immediately arise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High token consumption&lt;/li&gt;
&lt;li&gt;Repeatedly feeding the same batch of old articles every time&lt;/li&gt;
&lt;li&gt;Model attention is diluted by old material&lt;/li&gt;
&lt;li&gt;Drafting and style maintenance are intertwined; neither is easy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was from here that I slowly realized that &lt;code&gt;blog-writer&lt;/code&gt; is better suited for the consumption side, rather than trying to feed it everything.
The act of drafting should be as light, direct, and limited to reading only the effective versions as possible. As for how to generate, filter, or compress style data, that&amp;rsquo;s a matter for a separate production pipeline. This realization finally pushed me to the next step, which was &lt;a class=&#34;link&#34; href=&#34;https://ttf248.life/en/p/how-blog-style-suite-split-style-and-token-cost/&#34; &gt;AI Blog Writing: It Still Needs to Be Engineered (Part II): How blog-style-suite Separates Style Learning from Token Costs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;first-stabilize-the-process-only-then-can-we-talk-about-style-and-models&#34;&gt;First, stabilize the process; only then can we talk about style and models.
&lt;/h2&gt;&lt;p&gt;Looking back now, &lt;code&gt;blog-writer&lt;/code&gt; didn&amp;rsquo;t emerge because I suddenly wanted to build a blog writing assistant.
It was more because the original workflow started failing to keep up with new ways of working.
Once a tool like &lt;code&gt;Codex&lt;/code&gt; can connect to the internet for supplementary material, read and write within repositories, and directly call scripts, the act of writing a blog shouldn&amp;rsquo;t stop at &amp;ldquo;copying the body text to a local document.&amp;rdquo; If you don&amp;rsquo;t automate this part, it will actually become the clumsiest link in the entire chain.
So, I&amp;rsquo;ll leave the conclusion for the first post here.
What &lt;code&gt;blog-writer&lt;/code&gt; solved initially wasn&amp;rsquo;t writing style, but the repetitive labor of the publishing action. Without this layer of contract, any subsequent discussion about tokens, data structures, or local models is actually baseless.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Repository Commit: &lt;a class=&#34;link&#34; href=&#34;https://github.com/ttf248/notebook/commit/991536a237d04aba7c44dec501b3d98c644040c8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;991536a237d04aba7c44dec501b3d98c644040c8&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository Commit: &lt;a class=&#34;link&#34; href=&#34;https://github.com/ttf248/notebook/commit/8eb735aa8448c97deb2af1ea46b86772008fa9e3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;8eb735aa8448c97deb2af1ea46b86772008fa9e3&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository Commit: &lt;a class=&#34;link&#34; href=&#34;https://github.com/ttf248/notebook/commit/1a5604e7e6ce0a13f260fcbb8c2c1d964cdd0892&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;1a5604e7e6ce0a13f260fcbb8c2c1d964cdd0892&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository Commit: &lt;a class=&#34;link&#34; href=&#34;https://github.com/ttf248/notebook/commit/04dccb98c55a6ea3b81408012b33a6219cf8ab77&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;04dccb98c55a6ea3b81408012b33a6219cf8ab77&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Repository File: &lt;code&gt;.agents/skills/blog-writer/SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Repository File: &lt;code&gt;.agents/skills/blog-writer/scripts/write_post.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Repository File: &lt;code&gt;.agents/skills/blog-writer/scripts/write_post_series.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;writing-notes&#34;&gt;Writing Notes
&lt;/h2&gt;&lt;h3 id=&#34;original-prompt&#34;&gt;Original Prompt
&lt;/h3&gt;&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;$blog-writer This content is quite extensive, so I&#39;ve split it into a series of articles: Last year, many drafts were written using large models. Back then, the process was to create an outline or a list of questions myself, and then have the AI generate the draft, copy the content into a local md document, fill in header information, tag information, and publish the article; recently, I used Codex a lot and found that its web search capability is very strong. So, could I write a skill to automate these tasks? This led to the first draft of the skill blog-writer. I also thought about having the AI learn my previous writing style, which caused blog-writer to consume a lot of tokens when running. Subsequently, I optimized blog-writer in several versions, splitting out the data module and the data generation module. The original data generation module was still an independent skill. As I continued writing, I realized that it would be better as a Python project, which led to blog-style-suite. Then, I found that training on style data also consumes a lot of tokens, so I wanted to use a local large model and connected to one locally. I then thought about comparing the differences between the local large model and the online version, so I integrated minimax. The evolution history of blog-style-suite and blog-writer can be analyzed from the git commit history. Additionally, based on the code for local blog-writer and blog-style-suite, I can discuss the design ideas, how token saving was achieved, and how the data structure was designed—the core design concepts. If tokens are abundant, it can consume entire historical articles; preprocessing can save a lot of tokens.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;writing-strategy-summary&#34;&gt;Writing Strategy Summary
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;The first article should focus on the workflow trigger point, without rushing to detail the division of labor between tokens and models, to avoid having all three articles compete for the main narrative.&lt;/li&gt;
&lt;li&gt;It retains the key insight: &amp;ldquo;The body content is not difficult; what&amp;rsquo;s troublesome are the mechanical actions before and after publishing.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;By using nodes like &lt;code&gt;991536a&lt;/code&gt;, &lt;code&gt;8eb735a&lt;/code&gt;, &lt;code&gt;1a5604e&lt;/code&gt;, and &lt;code&gt;04dccb9&lt;/code&gt;, we ground the concept of &amp;ldquo;process contracturization&amp;rdquo; in actual Git evolution.&lt;/li&gt;
&lt;li&gt;The series pattern is reserved for this article to illustrate that blog writing has moved from generating single pieces to managing entire sets of deliverables.&lt;/li&gt;
&lt;li&gt;The ending deliberately points toward the token wall, setting up the groundwork for data engineering and preprocessing in the second article.&lt;/li&gt;
&lt;/ul&gt;</description>
        </item>
        <item>
        <title>Skill is not a new prompt, it is the job manual for the agent.</title>
        <link>https://ttf248.life/en/p/skill-is-an-agent-handbook/</link>
        <pubDate>Thu, 02 Apr 2026 22:43:16 +0800</pubDate>
        
        <guid>https://ttf248.life/en/p/skill-is-an-agent-handbook/</guid>
        <description>&lt;p&gt;These past few days, while reading about AI programming, people were first discussing &lt;code&gt;MCP&lt;/code&gt;, and then immediately started talking about &lt;code&gt;Skill&lt;/code&gt;. Many people who see this term for the first time will instinctively treat it as another new protocol or another advanced prompt.&lt;/p&gt;
&lt;p&gt;My judgment is very straightforward: &lt;code&gt;Skill&lt;/code&gt; isn&amp;rsquo;t here to replace &lt;code&gt;MCP&lt;/code&gt;; rather, it&amp;rsquo;s more like providing an occupational manual for the agent. &lt;code&gt;MCP&lt;/code&gt; solves the problem of &amp;ldquo;enabling the agent to connect to the external world,&amp;rdquo; while &lt;code&gt;Skill&lt;/code&gt; solves the problem of &amp;ldquo;how to reliably get the job done after connecting.&amp;rdquo; These two are not a replacement relationship; they are more like one following the other.&lt;/p&gt;
&lt;p&gt;Simply put, &lt;code&gt;MCP&lt;/code&gt; gives the agent hands and feet, and &lt;code&gt;Skill&lt;/code&gt; tells the agent not to mess around.&lt;/p&gt;
&lt;h2 id=&#34;what-exactly-is-a-skill&#34;&gt;What exactly is a Skill?
&lt;/h2&gt;&lt;p&gt;If I were to explain it in the simplest terms, I would say this:
It&amp;rsquo;s like taking the expert knowledge from a seasoned employee&amp;rsquo;s head and organizing it into a reusable, triggerable, and actionable manual. That thing is a &lt;code&gt;Skill&lt;/code&gt;.
The official OpenAI documentation defines it very directly: A &lt;code&gt;Skill&lt;/code&gt; is a package of capabilities designed for specific tasks. It can contain instructions, reference materials, and optional scripts. The goal isn&amp;rsquo;t to make the model &amp;ldquo;smarter,&amp;rdquo; but rather to ensure that when performing a certain type of task, it outputs results consistently according to a fixed workflow.
What is it most like?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s not like a regular prompt because it&amp;rsquo;s not something you just say once and are done with.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s not like an &lt;code&gt;MCP&lt;/code&gt; because it doesn&amp;rsquo;t handle connecting tools and data sources.&lt;/li&gt;
&lt;li&gt;And it&amp;rsquo;s not like the general rules in &lt;code&gt;AGENTS.md&lt;/code&gt; because it&amp;rsquo;s not a universal rule for the entire repository.
It is more like a specialized Standard Operating Procedure (SOP), or a trade manual.
For example:&lt;/li&gt;
&lt;li&gt;When handling GitHub PR comments, first identify which comments need attention, then ask the user which ones to handle, then modify the code, and finally provide feedback.&lt;/li&gt;
&lt;li&gt;When debugging a CI failure, first pull the GitHub Actions logs, then extract the failing segments, then propose a fix plan, and only execute after approval.&lt;/li&gt;
&lt;li&gt;When writing a blog post, first generate titles according to a fixed style, then supplement with facts, then add frontmatter, and finally publish it.
The common thread among these tasks is not that &amp;ldquo;the model doesn&amp;rsquo;t know how to answer,&amp;rdquo; but rather that &amp;ldquo;the model&amp;rsquo;s approach varies every time, making it easy for it to drift off course.&amp;rdquo; This is where the value of a &lt;code&gt;Skill&lt;/code&gt; comes into play.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-difference-between-skill-and-mcp&#34;&gt;The Difference Between Skill and MCP
&lt;/h2&gt;&lt;p&gt;This issue really needs to be viewed within a real workflow, otherwise, it&amp;rsquo;s easy to talk too theoretically.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MCP&lt;/code&gt; is like the interface layer.
The official definition of &lt;code&gt;MCP&lt;/code&gt; is an open standard for connecting AI applications to external systems. Files, local databases, search engines, design mockups, third-party services—all of these can be connected via &lt;code&gt;MCP&lt;/code&gt;. Therefore, it solves the problem of &amp;ldquo;connecting things.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Skill&lt;/code&gt; is like the process layer.
The OpenAI &lt;code&gt;Agent Skills&lt;/code&gt; documentation makes it very clear that a &lt;code&gt;Skill&lt;/code&gt; is the writing format for reusable workflows. A &lt;code&gt;Skill&lt;/code&gt; must have at least an &lt;code&gt;SKILL.md&lt;/code&gt;, and can also include &lt;code&gt;scripts/&lt;/code&gt;, &lt;code&gt;references/&lt;/code&gt;, and &lt;code&gt;assets/&lt;/code&gt;. Codex first reads its &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt;; only when it determines that it needs to use it does it load the full description into the context. This is what the official documentation calls &lt;code&gt;progressive disclosure&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So, the division of labor between the two is very clear:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MCP&lt;/code&gt;: Connects the capabilities (the &amp;ldquo;what&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Skill&lt;/code&gt;: Defines the order of operations (the &amp;ldquo;how&amp;rdquo;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To give a very intuitive example, something like converting Figma to code. If the agent cannot read the design mockup at all, then what you need first is an &lt;code&gt;MCP&lt;/code&gt;. But if it can already read the design mockup, but just writes things randomly—writing components today, cutting pages tomorrow, and forgetting visual checks the day after—then what you need to improve is the &lt;code&gt;Skill&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-to-develop-skills&#34;&gt;How to Develop Skills
&lt;/h2&gt;&lt;p&gt;This is actually not as heavy as you might think.
OpenAI officially recommends starting with the built-in &lt;code&gt;$skill-creator&lt;/code&gt;, which will help you build the basic structure, such as trigger conditions, scope, and whether a script is needed. By default, it prioritizes instruction-only, meaning don&amp;rsquo;t rush to write scripts; first, make sure your instructions are clear.
If writing manually, the minimum structure is very simple:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;my-skill/
├── SKILL.md
├── scripts/
├── references/
└── assets/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of these, only &lt;code&gt;SKILL.md&lt;/code&gt; is truly essential. Furthermore, this file must have at least two pieces of metadata:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;---
name: skill-name
description: Explain exactly when this skill should and should not trigger.
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I think the most crucial steps when developing a &lt;code&gt;Skill&lt;/code&gt; are the following.&lt;/p&gt;
&lt;h3 id=&#34;1-look-for-recurring-biases&#34;&gt;1. Look for &amp;ldquo;Recurring Biases&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Not every task is worth turning into a &lt;code&gt;Skill&lt;/code&gt;.
If you only ask the agent to do something occasionally, a regular prompt is enough. The situations that are truly suitable for creating a &lt;code&gt;Skill&lt;/code&gt; are usually like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have repeated the same thing many times.&lt;/li&gt;
&lt;li&gt;The agent has the capability, but the execution order always changes.&lt;/li&gt;
&lt;li&gt;The location where it makes mistakes is similar every time.
Simply put, it&amp;rsquo;s not an &amp;ldquo;ability gap,&amp;rdquo; but rather an &amp;ldquo;inconsistent process.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-write-the-description-as-a-trigger-condition-not-as-marketing-copy&#34;&gt;2. Write the &lt;code&gt;description&lt;/code&gt; as a trigger condition, not as marketing copy
&lt;/h3&gt;&lt;p&gt;This step is crucial.
The official documentation specifically emphasizes that whether Codex will implicitly call a &lt;code&gt;Skill&lt;/code&gt; heavily depends on the &lt;code&gt;description&lt;/code&gt;. So, don&amp;rsquo;t write things like &amp;ldquo;This is a very useful skill&amp;rdquo;; instead, write &amp;ldquo;When it should be used and when it should &lt;em&gt;not&lt;/em&gt; be used.&amp;rdquo;
For example, the description for the official &lt;code&gt;gh-fix-ci&lt;/code&gt; skill is very clear: Use this when the user asks you to debug or fix failed GitHub PR checks; the focus is on checking logs, summarizing the failure reasons, providing a remediation plan, and only implementing it after receiving explicit approval. Just by reading it, you know its boundaries.&lt;/p&gt;
&lt;h3 id=&#34;3-if-it-can-be-solved-with-instructions-dont-write-a-script-first&#34;&gt;3. If it can be solved with instructions, don&amp;rsquo;t write a script first
&lt;/h3&gt;&lt;p&gt;OpenAI&amp;rsquo;s documentation is also very practical: unless you explicitly need deterministic behavior or external tools, prioritize using instructions rather than scripting everything right away.
Why? Because the more scripts you have, the higher the maintenance cost becomes.
Many &lt;code&gt;Skills&lt;/code&gt; initially only require clearly explaining the steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What to do first&lt;/li&gt;
&lt;li&gt;What to do next&lt;/li&gt;
&lt;li&gt;What the output format should be&lt;/li&gt;
&lt;li&gt;In which situations to stop and ask the user
This can solve most of the problems.
Only when a step is particularly stable, mechanical, or highly suitable for automation should you move it down into &lt;code&gt;scripts/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-extract-data-templates-and-resources&#34;&gt;4. Extract Data, Templates, and Resources
&lt;/h3&gt;&lt;p&gt;As you write the &lt;code&gt;Skill&lt;/code&gt;, it&amp;rsquo;s easy for it to become one long block of descriptive text. This is when you need to break things out.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SKILL.md&lt;/code&gt; is responsible for explaining rules and sequence.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;references/&lt;/code&gt; holds background documents and reference materials.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/&lt;/code&gt; stores templates, icons, and examples.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/&lt;/code&gt; contains actions that can be executed reliably.
Doing this has two benefits. First, the main file won&amp;rsquo;t become increasingly bloated. Second, the model only loads details when necessary, which aligns with the concept of &lt;em&gt;progressive disclosure&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-local-use-first-cross-project-distribution-later&#34;&gt;5. Local Use First, Cross-Project Distribution Later
&lt;/h3&gt;&lt;p&gt;The official documentation explains this very clearly.
If you are only using it for your current repository, placing it in &lt;code&gt;.agents/skills/&lt;/code&gt; is sufficient. Codex scans the skills directory from locations such as the repository, user, and system.
However, if you find that this functionality can be used across more than one repository, or if you want to package and distribute multiple skills together, then don&amp;rsquo;t stop at just the &lt;code&gt;skill&lt;/code&gt; folder level; you should consider using &lt;code&gt;plugin&lt;/code&gt;. The official OpenAI documentation is also very clear: &lt;code&gt;Skill&lt;/code&gt; is the workflow itself, while &lt;code&gt;plugin&lt;/code&gt; is the unit that is better suited for installation and distribution.&lt;/p&gt;
&lt;h2 id=&#34;what-scenarios-are-suitable-for-skills&#34;&gt;What Scenarios are Suitable for Skills
&lt;/h2&gt;&lt;p&gt;Having more &lt;code&gt;Skills&lt;/code&gt; is not always better; they are best suited for the following types of tasks.&lt;/p&gt;
&lt;h3 id=&#34;high-frequency-repetitive-tasks&#34;&gt;High-Frequency Repetitive Tasks
&lt;/h3&gt;&lt;p&gt;Tasks you do every week, and the sequence is pretty much the same each time.
For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handling PR review comments&lt;/li&gt;
&lt;li&gt;Writing a blog post and adding frontmatter&lt;/li&gt;
&lt;li&gt;Debugging CI failures&lt;/li&gt;
&lt;li&gt;Performing pre-release checks
What&amp;rsquo;s most daunting about these kinds of tasks isn&amp;rsquo;t that the model can&amp;rsquo;t do it, but having to explain it all over again every single time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tasks-with-fixed-procedures&#34;&gt;Tasks with Fixed Procedures
&lt;/h3&gt;&lt;p&gt;Some tasks naturally have a sequence.
For example, when troubleshooting an issue, you should first check the logs, then narrow down the scope, then propose a plan, and finally make changes. In this case, &lt;code&gt;Skill&lt;/code&gt; is particularly suitable because it can enforce the order, reducing reliance on the model&amp;rsquo;s ad-hoc performance.&lt;/p&gt;
&lt;h3 id=&#34;tasks-requiring-domain-context-binding&#34;&gt;Tasks Requiring Domain Context Binding
&lt;/h3&gt;&lt;p&gt;Some tasks do not have fixed steps and come with strong constraints.
For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Must only check official documentation&lt;/li&gt;
&lt;li&gt;Must output in a specific review format&lt;/li&gt;
&lt;li&gt;Must retain existing terminology within the team&lt;/li&gt;
&lt;li&gt;Must comply with the writing or development standards of a certain repository
If you rely on prompts alone every time, it&amp;rsquo;s easy to miss these details.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tasks-requiring-tools-and-processes-together&#34;&gt;Tasks Requiring Tools and Processes Together
&lt;/h3&gt;&lt;p&gt;This scenario is particularly typical.
It&amp;rsquo;s not just about &amp;ldquo;connecting to GitHub&amp;rdquo; and being done; after connecting, you still need to examine the logs in a certain way, deduce the problems, decide whether or not to modify anything, and finally how to provide feedback. In other words, external connections and internal processes must work together.
This is often when &lt;code&gt;MCP + Skill&lt;/code&gt; appear jointly.&lt;/p&gt;
&lt;h2 id=&#34;when-not-to-use-a-skill&#34;&gt;When Not to Use a Skill
&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s also important to be clear about this, otherwise it&amp;rsquo;s easy to want to make everything into a &lt;code&gt;Skill&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;one-off-casual-tasks&#34;&gt;One-off Casual Tasks
&lt;/h3&gt;&lt;p&gt;When a user asks a quick question, a standard prompt is often sufficient.&lt;/p&gt;
&lt;h3 id=&#34;you-just-want-to-connect-an-external-system&#34;&gt;You just want to &amp;ldquo;connect an external system&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;In that case, prioritize &lt;code&gt;MCP&lt;/code&gt;, not &lt;code&gt;Skill&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;you-want-to-constrain-the-long-term-behavior-of-the-entire-repository&#34;&gt;You want to constrain the long-term behavior of the entire repository
&lt;/h3&gt;&lt;p&gt;This is more like the job of &lt;code&gt;AGENTS.md&lt;/code&gt;, not a &lt;code&gt;Skill&lt;/code&gt;.
So, to summarize simply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Missing connections, use &lt;code&gt;MCP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Missing processes/workflows, use &lt;code&gt;Skill&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Missing global rules, use &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;several-representative-examples&#34;&gt;Several Representative Examples
&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s better to look at a few real-world examples than to hear too many concepts.&lt;/p&gt;
&lt;h3 id=&#34;1-roll-dice-the-minimal-viable-entry-case&#34;&gt;1. &lt;code&gt;roll-dice&lt;/code&gt;: The Minimal Viable Entry Case
&lt;/h3&gt;&lt;p&gt;This example comes from the official OpenAI &lt;code&gt;Agent Skills&lt;/code&gt; documentation.
It is very small; there is almost only an &lt;code&gt;SKILL.md&lt;/code&gt; in the directory, which allows the agent to call PowerShell&amp;rsquo;s random number command when the user requests rolling dice.
Why is this example good?
Because it directly exposes the most core skeleton of a &lt;code&gt;Skill&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It has clear triggering conditions&lt;/li&gt;
&lt;li&gt;It has a clear execution method&lt;/li&gt;
&lt;li&gt;It has clear boundaries
It illustrates one thing: a &lt;code&gt;Skill&lt;/code&gt; doesn&amp;rsquo;t have to be large. As long as something happens repeatedly, and you don&amp;rsquo;t want the model to improvise wildly, you can create it as a &lt;code&gt;Skill&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-gh-address-comments-a-workflow-example-for-handling-github-comments&#34;&gt;2. &lt;code&gt;gh-address-comments&lt;/code&gt;: A Workflow Example for Handling GitHub Comments
&lt;/h3&gt;&lt;p&gt;This example comes from the official OpenAI &lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/skills&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;openai/skills&lt;/code&gt;&lt;/a&gt; repository.
Its goal is not to &amp;ldquo;connect to GitHub,&amp;rdquo; but rather to encapsulate the process of &amp;ldquo;handling comments on the current branch&amp;rsquo;s PR.&amp;rdquo; The steps in the official version are very typical:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, confirm if &lt;code&gt;gh&lt;/code&gt; is already authenticated.&lt;/li&gt;
&lt;li&gt;Then, fetch the comments and review threads for the current PR.&lt;/li&gt;
&lt;li&gt;Number and summarize these comments.&lt;/li&gt;
&lt;li&gt;Allow the user to explicitly select which ones need processing.&lt;/li&gt;
&lt;li&gt;Only then start the actual work.
This example particularly illustrates the value of a &lt;code&gt;Skill&lt;/code&gt;.
For many engineering tasks, the difficulty isn&amp;rsquo;t whether &amp;ldquo;the model knows what GitHub is,&amp;rdquo; but rather &amp;ldquo;whether it will process things in the correct order.&amp;rdquo; &lt;code&gt;gh-address-comments&lt;/code&gt; solves exactly this kind of sequencing problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-gh-fix-ci-troubleshooting-engineering-cases-with-failed-ci&#34;&gt;3. &lt;code&gt;gh-fix-ci&lt;/code&gt;: Troubleshooting Engineering Cases with Failed CI
&lt;/h3&gt;&lt;p&gt;This is also the official skill in the &lt;code&gt;openai/skills&lt;/code&gt; repository.
It addresses another very typical engineering task: a PR check has failed, should it be fixed, and how to fix it.
The workflow defined in this &lt;code&gt;Skill&lt;/code&gt; is also very representative:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, confirm the &lt;code&gt;gh&lt;/code&gt; login status.&lt;/li&gt;
&lt;li&gt;Find the current PR.&lt;/li&gt;
&lt;li&gt;Pull the failed checks and logs from GitHub Actions.&lt;/li&gt;
&lt;li&gt;Extract the failure snippets.&lt;/li&gt;
&lt;li&gt;Propose a fix plan first.&lt;/li&gt;
&lt;li&gt;Only act after getting approval.
This scenario cannot be reliably handled by a simple prompt like &amp;ldquo;Help me see why CI failed.&amp;rdquo; Because it involves permissions, logs, external tools, approval boundaries, and execution order—all of which need to be defined.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-private-repository-skills-solidifying-teams-own-methodologies&#34;&gt;4. Private Repository Skills: Solidifying Team&amp;rsquo;s Own Methodologies
&lt;/h3&gt;&lt;p&gt;Beyond the official examples, I think the greater value of &lt;code&gt;Skill&lt;/code&gt; lies within private repositories.
For instance, the &lt;code&gt;blog-writer&lt;/code&gt; in this blog repository is essentially a very typical repo-scoped skill. It doesn&amp;rsquo;t aim to &amp;ldquo;teach the model how to write Chinese,&amp;rdquo; but rather codifies the writing style, structure, fact-checking process, output path, and final storage format that have already been established within this specific repository into a workflow.
These kinds of &lt;code&gt;Skills&lt;/code&gt; often hold the most practical value. This is because they are not designed for everyone; instead, they specifically solve the problem: &amp;ldquo;In this repository, what kind of task keeps recurring, and where do we tend to go off track?&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;when-to-actually-use-a-skill&#34;&gt;When to Actually Use a Skill
&lt;/h2&gt;&lt;p&gt;So, let&amp;rsquo;s get back to the most practical question: when should you seriously implement a &lt;code&gt;Skill&lt;/code&gt;?
My answer is:
When you realize the problem is no longer &amp;ldquo;the model lacks capability,&amp;rdquo; but rather &amp;ldquo;its execution is inconsistent every time.&amp;rdquo;
At this point, continuously stacking prompts yields diminishing returns. If you add one sentence today and another tomorrow, eventually the prompt becomes like a rambling diary entry, and the model will still make mistakes.
Instead, organizing it into a &lt;code&gt;Skill&lt;/code&gt;—separating the trigger conditions, steps, boundaries, scripts, and necessary data—results in more stable and reusable outcomes.
The &lt;code&gt;MCP&lt;/code&gt; brings in the external world; the &lt;code&gt;Skill&lt;/code&gt; solidifies the internal methodology.
The former solves &amp;ldquo;if it can be done,&amp;rdquo; while the latter solves &amp;ldquo;how to do it reliably.&amp;rdquo;
This is my current understanding of a &lt;code&gt;Skill&lt;/code&gt;.
It&amp;rsquo;s not just a new prompt, nor is it a new protocol.
It&amp;rsquo;s more like an operational manual for the agent.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/codex/skills&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Agent Skills - Codex | OpenAI Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/blog/skills-agents-sdk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using skills to accelerate OSS maintenance | OpenAI Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://modelcontextprotocol.io/docs/getting-started/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What is the Model Context Protocol (MCP)? | Model Context Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/skills&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;openai/skills | GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/skills/blob/main/skills/.curated/gh-address-comments/SKILL.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gh-address-comments/SKILL.md | openai/skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/skills/blob/main/skills/.curated/gh-fix-ci/SKILL.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gh-fix-ci/SKILL.md | openai/skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;writing-notes&#34;&gt;Writing Notes
&lt;/h2&gt;&lt;h3 id=&#34;original-prompt&#34;&gt;Original Prompt
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Prompt: AI Large Model Programming, first appeared MCP, then Skill. Using plain language, explain what Skill is, how to develop a Skill, what scenarios are suitable for Skill, and provide specific, representative examples from each source.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;writing-approach-summary&#34;&gt;Writing Approach Summary
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Instead of repeating a &amp;ldquo;concept overview of &lt;code&gt;MCP&lt;/code&gt; and &lt;code&gt;Skill&lt;/code&gt;,&amp;rdquo; the focus is placed on the role and boundaries of &lt;code&gt;Skill&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Abstract definitions are grounded in real workflows using common analogies like &amp;ldquo;trade manuals&amp;rdquo; or &amp;ldquo;specialized SOPs.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;The development section follows the actual structure of official documentation, retaining key points such as &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;progressive disclosure&lt;/code&gt;, and &lt;code&gt;instruction-only&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Case studies prioritize official sources, utilizing &lt;code&gt;roll-dice&lt;/code&gt; from the official documentation, along with &lt;code&gt;gh-address-comments&lt;/code&gt; and &lt;code&gt;gh-fix-ci&lt;/code&gt; from the &lt;code&gt;openai/skills&lt;/code&gt; repository.&lt;/li&gt;
&lt;li&gt;The conclusion re-clarifies the boundaries between &lt;code&gt;MCP&lt;/code&gt;, &lt;code&gt;Skill&lt;/code&gt;, and &lt;code&gt;AGENTS.md&lt;/code&gt; to prevent readers from remaining confused after reading.&lt;/li&gt;
&lt;/ul&gt;</description>
        </item>
        
    </channel>
</rss>
