<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>AI tools · Avinash Gosavi</title>
  <subtitle>Posts tagged “AI tools” by Avinash Gosavi.</subtitle>
  <id>https://www.avinashgosavi.com/feed/topic/ai-tools.xml</id>
  <link href="https://www.avinashgosavi.com/feed/topic/ai-tools.xml" rel="self" type="application/atom+xml"/>
  <link href="https://www.avinashgosavi.com/blog/#ai-tools" rel="alternate" type="text/html"/>
  <updated>2026-10-25T22:37:16+00:00</updated>
  <author><name>Avinash Gosavi</name><uri>https://www.avinashgosavi.com/</uri></author>
  <entry>
    <title type="html">Doing the Right Thing, Fast</title>
    <link href="https://www.avinashgosavi.com/post/doing-the-right-thing-fast/" rel="alternate" type="text/html" title="Doing the Right Thing, Fast"/>
    <id>https://www.avinashgosavi.com/post/doing-the-right-thing-fast/</id>
    <published>2026-04-25T00:00:00+00:00</published>
    <updated>2026-10-25T22:37:16+00:00</updated>
    <category term="Engineering at work"/>
    <category term="AI tools"/>
    <summary type="html">Cleaning up after deprecating the first Catalyst Cloud Monitoring: splitting it into focused work streams and shipping it all in two weeks with AI help.</summary>
    <content type="html" xml:base="https://www.avinashgosavi.com/post/doing-the-right-thing-fast/">&lt;p&gt;We recently deprecated the initial version of Cisco Catalyst Cloud Monitoring. That means the code that drove it — onboarding flows, device-specific paths, integrations that only existed for those devices — needed to go.&lt;/p&gt;

&lt;p&gt;In the old world, this kind of cleanup almost never happens on schedule. It’s not that people don’t want to do it. It’s that the cost is high: you’re touching interconnected parts, there’s real risk of breaking something unrelated, and the work has to fit around ongoing feature development. So it gets triaged below the line. Unused code paths don’t disappear — they just quietly accumulate. Every engineer knows the feeling of working around code that should have been deleted six months ago.&lt;/p&gt;

&lt;p&gt;This time was different.&lt;/p&gt;

&lt;h2 id=&quot;what-we-actually-did&quot;&gt;What We Actually Did&lt;/h2&gt;

&lt;p&gt;I split the cleanup into 20-25 focused work streams. A few people helped with specific areas, but most of it was mine. Over two weeks, every stream went through the same cycle: identify what to remove, make the change, review it carefully, test, and move on.&lt;/p&gt;

&lt;blockquote class=&quot;diagram-text&quot;&gt;&lt;p&gt;&lt;strong&gt;Diagram: The cleanup split into 20 to 25 work streams, each run through the same cycle&lt;/strong&gt; (&lt;a href=&quot;https://www.avinashgosavi.com/post/doing-the-right-thing-fast/&quot;&gt;see it in the post&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;The cleanup was split into 20 to 25 focused work streams. Every stream went through the same four steps. Identify what to remove, with Codex finding the call sites. Make the change, with Codex generating the deletions and the ripple effects across the codebase. Review it carefully, diff by diff in VS Code. Test it manually. Then move on to the next stream. Every stream ran through this cycle over two weeks, and all of it is now deployed to production.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Same four steps, 20–25 times over.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The Meraki developer tools team’s &lt;strong&gt;jira-to-PR skill&lt;/strong&gt; made the pipeline from ticket to code review almost frictionless. I wasn’t fighting process — I was just doing the work.&lt;/p&gt;

&lt;p&gt;That work is now fully deployed to production. No errors. The legacy load is gone.&lt;/p&gt;

&lt;h2 id=&quot;where-codex-fit-in&quot;&gt;Where Codex Fit In&lt;/h2&gt;

&lt;p&gt;Codex handled the mechanical side of each stream — finding the right call sites, generating the deletions, updating the ripple effects across the codebase. I’ve been here since inception, so I know this code well. That matters. A new person would have needed more time to build the mental model before they could trust what was being removed. My 4.5 years gave me the confidence to move fast without second-guessing.&lt;/p&gt;

&lt;p&gt;The way I verify is consistent: I do all my visual inspection in VS Code, diff by diff. When I wasn’t sure what Codex had generated, I asked it to explain the change in plain terms. That became a reliable part of my review loop — not a crutch, just a check.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Takeaway: experience and AI compound. The codebase knowledge lets you set the right scope. Codex handles the execution. The combination is what made 2 weeks possible instead of 2 quarters.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-shift-i-keep-coming-back-to&quot;&gt;The Shift I Keep Coming Back To&lt;/h2&gt;

&lt;p&gt;What I used to put off, I now just do.&lt;/p&gt;

&lt;p&gt;Not because the work got trivial — the cleanup was real work, done the right way, with proper reviews and manual testing. But the overhead that used to make it not worth starting has collapsed. The cost of doing the right thing is now low enough that “we’ll do it properly later” is no longer the default answer.&lt;/p&gt;

&lt;p&gt;That’s the shift. You can do the right thing &lt;em&gt;and&lt;/em&gt; do it fast. Not by cutting corners, but because the slow parts — finding call sites, writing boilerplate, generating consistent changes across files — aren’t slow anymore.&lt;/p&gt;

&lt;p&gt;I’m writing less code than I used to. But I’m seeing more of my intentions land exactly as I wanted them to. That’s a trade I’ll take every time.&lt;/p&gt;

&lt;p&gt;I’m genuinely excited to see where this goes next.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Read about how I approach repeatable workflows in Codex: &lt;a href=&quot;/post/codex-skills-baking-your-workflow-into-the-tool/&quot;&gt;Codex Skills: Baking Your Workflow Into the Tool&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Related: &lt;a href=&quot;/post/reviewing-ai-generated-tests-istqb-framework/&quot;&gt;Are These AI-Generated Tests Good?&lt;/a&gt; — a repeatable way to review the tests an LLM writes.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title type="html">Are These AI-Generated Tests Good?</title>
    <link href="https://www.avinashgosavi.com/post/reviewing-ai-generated-tests-istqb-framework/" rel="alternate" type="text/html" title="Are These AI-Generated Tests Good?"/>
    <id>https://www.avinashgosavi.com/post/reviewing-ai-generated-tests-istqb-framework/</id>
    <published>2026-02-28T00:00:00+00:00</published>
    <updated>2026-10-25T20:37:43+00:00</updated>
    <category term="AI tools"/>
    <category term="Testing"/>
    <summary type="html">A simple, repeatable way to review AI-generated tests, using ISTQB test-design ideas to spot the cases fast output tends to miss.</summary>
    <content type="html" xml:base="https://www.avinashgosavi.com/post/reviewing-ai-generated-tests-istqb-framework/">&lt;p&gt;I use AI to generate a lot of tests now. It saves time, but fast output can create false confidence.&lt;/p&gt;

&lt;p&gt;Even if AI-generated code is 99% accurate, we still need tests for the same reason as always: &lt;strong&gt;catching regressions before users do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From experience, I can usually spot missing cases during review. But while writing this down, I wanted more than instinct — I wanted a framework that is easy to explain and repeat. &lt;a href=&quot;https://istqb-glossary.page/&quot;&gt;ISTQB&lt;/a&gt; definitions align well with how I already think, so I use them as the foundation.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;test-level-vs-test-type&quot;&gt;Test Level vs Test Type&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ISTQB defines &lt;em&gt;test level&lt;/em&gt; as:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“A group of test activities that are organized and managed together.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;ISTQB defines &lt;em&gt;test type&lt;/em&gt; as:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“A group of test activities aimed at testing specific characteristics.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives me a clear way to evaluate AI-generated tests: classify by level, classify by type, then check coverage and signal.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;running-example&quot;&gt;Running Example&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Feature:&lt;/strong&gt; password reset&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected behavior:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;User requests reset link&lt;/li&gt;
  &lt;li&gt;Email is sent with token&lt;/li&gt;
  &lt;li&gt;Token expires&lt;/li&gt;
  &lt;li&gt;Token is single-use&lt;/li&gt;
  &lt;li&gt;Password updates&lt;/li&gt;
  &lt;li&gt;Old password no longer works&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;low-signal-vs-high-signal&quot;&gt;Low Signal vs High Signal&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Low-signal test:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;it&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;returns success&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;params: &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;email: &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;email&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;have_http_status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:ok&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Higher-signal test:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;it&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;creates a single-use token and sends reset email&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;params: &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;email: &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;email&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;PasswordResetToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;by&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;token&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;PasswordResetToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;last&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;used_at&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;be_nil&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ActionMailer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;deliveries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The second test asserts &lt;em&gt;what&lt;/em&gt; changed — token count, token state, email delivery — instead of only that the controller returned 200. That distinction matters when reviewing AI output: AI tends to generate the first kind because it is easier to write and harder to fail.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;actionable-review-algorithm&quot;&gt;Actionable Review Algorithm&lt;/h2&gt;

&lt;p&gt;When I review a PR with AI-generated tests, I run through this sequence:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Collect&lt;/strong&gt; all new and changed tests in the PR.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Classify&lt;/strong&gt; each test by ISTQB test level.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Classify&lt;/strong&gt; each test by ISTQB test type.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Map&lt;/strong&gt; tests to Jira acceptance criteria.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cross-check&lt;/strong&gt; requirement docs for edge cases and failure paths.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Check external impact coverage:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;API contracts&lt;/li&gt;
      &lt;li&gt;Downstream consumers&lt;/li&gt;
      &lt;li&gt;DB side effects&lt;/li&gt;
      &lt;li&gt;Jobs and events&lt;/li&gt;
      &lt;li&gt;Third-party boundaries&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Weight confidence:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Highest:&lt;/em&gt; system + acceptance + functional&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Medium:&lt;/em&gt; integration + change-related regression&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Lower:&lt;/em&gt; component-only checks&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Lowest:&lt;/em&gt; smoke/startup/load-only checks&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Publish&lt;/strong&gt; a short gap summary in the PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote class=&quot;diagram-text&quot;&gt;&lt;p&gt;&lt;strong&gt;Diagram: The eight-step review of AI-generated tests in a pull request&lt;/strong&gt; (&lt;a href=&quot;https://www.avinashgosavi.com/post/reviewing-ai-generated-tests-istqb-framework/&quot;&gt;see it in the post&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Step 1: collect all new and changed tests in the PR. Steps 2 and 3: classify each test by ISTQB test level, a group of activities organized and managed together, and by ISTQB test type, a group of activities aimed at specific characteristics. Step 4: map the tests to Jira acceptance criteria. Step 5: cross-check requirement docs for edge cases and failure paths. Step 6: check external impact coverage: API contracts, downstream consumers, DB side effects, jobs and events, and third-party boundaries. Step 7: weight confidence. Highest for system, acceptance and functional tests; medium for integration and change-related regression; lower for component-only checks; lowest for smoke, startup or load-only checks. Step 8: publish a short gap summary in the PR.&lt;/p&gt;&lt;p&gt;&lt;em&gt;The same eight steps as a flow: classify, compare against what was asked for, then weigh what the tests actually prove.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;scoring-example&quot;&gt;Scoring Example&lt;/h2&gt;

&lt;p&gt;PR contains:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2 component functional tests&lt;/li&gt;
  &lt;li&gt;1 component integration test&lt;/li&gt;
  &lt;li&gt;1 system functional test&lt;/li&gt;
  &lt;li&gt;1 acceptance regression test&lt;/li&gt;
  &lt;li&gt;2 smoke checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Initial result:&lt;/strong&gt; Decent baseline, but incomplete if no system integration test validates the email provider failure path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt; Add one integration contract test and re-score.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;ai-test-quality-checklist&quot;&gt;AI Test Quality Checklist&lt;/h2&gt;

&lt;p&gt;Use this when reviewing a PR that includes AI-generated tests:&lt;/p&gt;

&lt;ul class=&quot;task-list&quot;&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Tests classified by &lt;strong&gt;level&lt;/strong&gt; (Component, Component Integration, System, System Integration, Acceptance)&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Tests classified by &lt;strong&gt;type&lt;/strong&gt; (Functional, Non-functional, Black-box, White-box, Change-related)&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Jira acceptance criteria mapped to explicit assertions&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Requirement doc edge cases and failure paths covered&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;External impact covered (API contracts, downstream consumers, jobs/events, side effects)&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Regression protection added for changed behavior&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;High-signal vs low-signal mix summarized&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Known gaps documented with a follow-up plan&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;AI helps me generate tests faster. This framework helps me trust what I ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://istqb-glossary.page/test-level/&quot;&gt;ISTQB Glossary: Test Level&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://istqb-glossary.page/test-type/&quot;&gt;ISTQB Glossary: Test Type&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://astqb.org/2-2-test-levels-and-test-types/&quot;&gt;ASTQB: Test Levels and Test Types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Related: how I work with LLMs day to day is in &lt;a href=&quot;/post/i-fell-in-love-with-coding-again/&quot;&gt;I Fell in Love with Coding Again&lt;/a&gt;, and how I review AI-generated changes diff by diff is in &lt;a href=&quot;/post/doing-the-right-thing-fast/&quot;&gt;Doing the Right Thing, Fast&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title type="html">Codex Skills: Baking Your Workflow Into the Tool</title>
    <link href="https://www.avinashgosavi.com/post/codex-skills-baking-your-workflow-into-the-tool/" rel="alternate" type="text/html" title="Codex Skills: Baking Your Workflow Into the Tool"/>
    <id>https://www.avinashgosavi.com/post/codex-skills-baking-your-workflow-into-the-tool/</id>
    <published>2026-02-17T00:00:00+00:00</published>
    <updated>2026-10-26T08:44:55+00:00</updated>
    <category term="AI tools"/>
    <summary type="html">How I stopped repeating the same instructions to my coding agent by encoding my workflow as Codex Skills — and when to use a skill vs. the agent.</summary>
    <content type="html" xml:base="https://www.avinashgosavi.com/post/codex-skills-baking-your-workflow-into-the-tool/">&lt;p&gt;&lt;em&gt;A follow-up to &lt;a href=&quot;/post/i-fell-in-love-with-coding-again/&quot;&gt;I Fell in Love with Coding Again&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In that post I shared a simple workflow: know the system and ask precise questions, break tasks into steps, and use automation for the boring parts. What I didn’t mention is how often I was &lt;em&gt;repeating&lt;/em&gt; those same instructions. Once that pattern was clear, I started encoding it—that’s when &lt;strong&gt;Skills&lt;/strong&gt; in Codex became a big part of my day.&lt;/p&gt;

&lt;p&gt;Before diving in, it helps to be clear on the difference between the &lt;strong&gt;agent&lt;/strong&gt; and a &lt;strong&gt;skill&lt;/strong&gt;, and when to use which.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;agent-vs-skill-when-to-use-what&quot;&gt;Agent vs. Skill: When to Use What&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Aspect&lt;/span&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Agent (Codex)&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Skill&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;The general-purpose AI. You give it intent and context; it plans, reads code, edits, runs commands.&lt;/td&gt;
      &lt;td&gt;A packaged playbook: instructions, templates, optional scripts. One focused workflow.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Use when&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Open-ended work: “explain this codebase,” “implement this feature,” “fix this bug,” “refactor X.”&lt;/td&gt;
      &lt;td&gt;You do the &lt;em&gt;same&lt;/em&gt; workflow over and over and want it consistent and one-tap.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Where it lives&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Codex itself (CLI, IDE, app).&lt;/td&gt;
      &lt;td&gt;A folder with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt; (and optionally scripts/references). You or your team create or install skills.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; If you find yourself pasting the same block of instructions or saying “like last time, but for X,” that’s a candidate for a skill. The agent does the work; the skill tells it &lt;em&gt;how&lt;/em&gt; to do that kind of work every time.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-i-actually-use-skills-for&quot;&gt;What I Actually Use Skills For&lt;/h2&gt;

&lt;p&gt;Most of my skills are &lt;strong&gt;local, day-to-day&lt;/strong&gt;—things that used to be manual or a wall of prompts. Two big buckets:&lt;/p&gt;

&lt;h3 id=&quot;1-jira-from-a-few-details-to-a-real-ticket&quot;&gt;1. Jira: From a few details to a real ticket&lt;/h3&gt;

&lt;p&gt;I give Codex a short description and maybe a doc link. The skill:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Uses a &lt;strong&gt;ticket description template&lt;/strong&gt; I keep in the skill (in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;references/&lt;/code&gt; or in the instructions).&lt;/li&gt;
  &lt;li&gt;Sets the &lt;strong&gt;fields&lt;/strong&gt; we care about: type, priority, board, assignee, labels, etc.&lt;/li&gt;
  &lt;li&gt;Creates the ticket and attaches it to the right board, assigned to the right team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Copy template, fill fields, attach, assign. &lt;strong&gt;After:&lt;/strong&gt; “Create a Jira ticket for &amp;lt;brief description&amp;gt;” and the skill does the rest. Huge reduction in busywork.&lt;/p&gt;

&lt;h3 id=&quot;2-git-housekeeping-as-a-single-flow&quot;&gt;2. Git: Housekeeping as a single flow&lt;/h3&gt;

&lt;p&gt;Our housekeeping is a chain of small steps. I turned them into &lt;strong&gt;small skills&lt;/strong&gt; and then &lt;strong&gt;one combined skill&lt;/strong&gt; that runs the full flow:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Step&lt;/th&gt;
      &lt;th&gt;What the skill does&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;New branch&lt;/td&gt;
      &lt;td&gt;Create branch from the right base (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;) with our naming convention.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Update from origin&lt;/td&gt;
      &lt;td&gt;Stash current changes → pull from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;origin/main&lt;/code&gt; → re-apply stash → handle conflicts if needed.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Commit&lt;/td&gt;
      &lt;td&gt;Generate commit message from &lt;strong&gt;my template&lt;/strong&gt; (what changed, why, scope).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Push&lt;/td&gt;
      &lt;td&gt;Push branch and set upstream if needed.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;I can still run the small skills individually (e.g. “just create a commit message”), but the combined skill is what I use most: one prompt, full flow. That’s the pattern—&lt;strong&gt;small skills you can mix or run as one&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;diagram-text&quot;&gt;&lt;p&gt;&lt;strong&gt;Diagram: Small git skills chained into one combined housekeeping skill&lt;/strong&gt; (&lt;a href=&quot;https://www.avinashgosavi.com/post/codex-skills-baking-your-workflow-into-the-tool/&quot;&gt;see it in the post&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;One prompt runs the combined skill, which chains four small skills in order. New branch: create a branch from the right base, such as main, with the team&apos;s naming convention. Update from origin: stash current changes, pull from origin/main, re-apply the stash and handle conflicts if needed. Commit: generate the commit message from a template covering what changed, why and the scope. Push: push the branch and set upstream if needed. Each step is also a small skill that can be run on its own.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Small skills you can mix, or run as one.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;3-next-codebase-specific-skills&quot;&gt;3. Next: Codebase-specific skills&lt;/h3&gt;

&lt;p&gt;I’m now turning &lt;strong&gt;recurring codebase prompts&lt;/strong&gt; into skills: “how we add a new API route,” “how we update the schema and migrations,” “how we add a component to the design system.” Same idea—capture the steps and templates once, then invoke with a short prompt. That’s the direction I want to expand: more repo-specific skills so my usual prompts become reliable, repeatable workflows.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;how-skills-work-without-slowing-you-down&quot;&gt;How Skills Work (Without Slowing You Down)&lt;/h2&gt;

&lt;p&gt;Skills use &lt;strong&gt;progressive disclosure&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Startup:&lt;/strong&gt; Codex loads only skill &lt;em&gt;names&lt;/em&gt; and &lt;em&gt;descriptions&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;On demand:&lt;/strong&gt; When you use a skill, it loads the full &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you can have many skills; they don’t bloat context until invoked. Keeps the CLI fast and the session clean.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;where-skills-live&quot;&gt;Where Skills Live&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Scope&lt;/th&gt;
      &lt;th&gt;Location&lt;/th&gt;
      &lt;th&gt;Good for&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Repo&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.codex/skills/&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.agents/skills/&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Team conventions: Jira template, code review, “how we add a feature.”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Your config (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.codex/skills/&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.agents/skills/&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;Personal workflows: Git flow, commit template, prompt-optimization.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;System&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Bundled with Codex&lt;/td&gt;
      &lt;td&gt;Built-ins (e.g. skill-creator).&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;I keep &lt;strong&gt;Jira and Git&lt;/strong&gt; in my user skills (same flow across projects). &lt;strong&gt;Codebase-specific&lt;/strong&gt; ones live in the repo so the team shares them.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;how-to-arrange-skillmd-a-proper-format&quot;&gt;How to Arrange SKILL.md: A Proper Format&lt;/h2&gt;

&lt;p&gt;Codex only &lt;em&gt;requires&lt;/em&gt; a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt; with &lt;strong&gt;frontmatter&lt;/strong&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt;) and a body. How you arrange the body is up to you—but a consistent structure makes skills easier to write, read, and refine. Here’s a format I use and that you can adapt.&lt;/p&gt;

&lt;h3 id=&quot;required-frontmatter&quot;&gt;Required: Frontmatter&lt;/h3&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;skill-name&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description: One clear sentence&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;what this skill does and when Codex should use it.&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;name:&lt;/strong&gt; Lowercase, hyphens OK (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jira-ticket&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git-housekeeping&lt;/code&gt;). Codex uses this for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$skill-name&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;description:&lt;/strong&gt; This is what Codex uses to &lt;em&gt;match&lt;/em&gt; your prompt. Be specific so the right skill triggers (or so you can pick it from the list).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;body-section-layout-that-works&quot;&gt;Body: Section layout that works&lt;/h3&gt;

&lt;p&gt;After the frontmatter, structure the rest of the file so the agent knows what to do and when. A good default arrangement:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Section&lt;/th&gt;
      &lt;th&gt;Purpose&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;One short paragraph: what this skill achieves.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Inputs&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;What you (or the user) provide: e.g. brief description, doc link, branch name.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Outputs&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;What must be true when done: e.g. ticket on board and assigned, branch pushed.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Workflow&lt;/strong&gt; (or &lt;strong&gt;Steps&lt;/strong&gt;)&lt;/td&gt;
      &lt;td&gt;Numbered, imperative steps the agent follows.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Template&lt;/strong&gt; (optional)&lt;/td&gt;
      &lt;td&gt;If the skill uses a fixed format (Jira body, commit message), put the template here or in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;references/&lt;/code&gt; and reference it in the steps.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Example triggers&lt;/strong&gt; (optional)&lt;/td&gt;
      &lt;td&gt;Example phrases that should invoke this skill (helps implicit matching).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Constraints&lt;/strong&gt; (optional)&lt;/td&gt;
      &lt;td&gt;What &lt;em&gt;not&lt;/em&gt; to do, or rules (e.g. “Never assume assignee; always ask if missing”).&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;You don’t need every section for every skill—use what fits. For a tiny skill, Goal + Steps might be enough. For Jira, you’d add Inputs, Outputs, Template, and maybe Constraints.&lt;/p&gt;

&lt;h3 id=&quot;full-skillmd-template&quot;&gt;Full SKILL.md template&lt;/h3&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;my-skill-name&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;What it does and when to use it. Codex uses this to select the skill.&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;gh&quot;&gt;# My Skill Name&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Goal&lt;/span&gt;
[One short paragraph: what this skill achieves.]

&lt;span class=&quot;gu&quot;&gt;## Inputs&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; [What the user or context must provide, e.g. brief description, link, branch name.]

&lt;span class=&quot;gu&quot;&gt;## Outputs&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; [What must be true when the skill is done.]

&lt;span class=&quot;gu&quot;&gt;## Workflow&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;1.&lt;/span&gt; [First imperative step.]
&lt;span class=&quot;p&quot;&gt;2.&lt;/span&gt; [Second step.]
&lt;span class=&quot;p&quot;&gt;3.&lt;/span&gt; [Continue until done.]

&lt;span class=&quot;gu&quot;&gt;## Template&lt;/span&gt;
[Paste the template here, or: &quot;Use the template in references/ticket-template.md and fill …&quot;]

&lt;span class=&quot;gu&quot;&gt;## Example triggers&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &quot;Create a Jira for …&quot;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &quot;File a ticket for …&quot;

&lt;span class=&quot;gu&quot;&gt;## Constraints&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; [Any rules or things to avoid.]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;defining-your-own-format&quot;&gt;Defining your own format&lt;/h3&gt;

&lt;p&gt;You can change the section names and order to match how you think. For example:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Repo-specific:&lt;/strong&gt; Add a &lt;strong&gt;Context&lt;/strong&gt; section (“This repo uses …”) or &lt;strong&gt;Key fields&lt;/strong&gt; (“Always set: type, priority, board, assignee”).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Multi-step skills:&lt;/strong&gt; Add &lt;strong&gt;Prerequisites&lt;/strong&gt; (“Run only when on a feature branch”) or &lt;strong&gt;Sub-skills&lt;/strong&gt; (“This skill calls the commit-message skill then the push skill”).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Strict templates:&lt;/strong&gt; Put long templates in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;references/&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;assets/&lt;/code&gt; and keep SKILL.md to Goal, Steps, and “Use template at …”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is: &lt;strong&gt;arrange SKILL.md so the agent has a clear path&lt;/strong&gt;—goal, what it gets, what it must produce, and the steps in between. Once you pick a layout you like, reuse it so every skill feels familiar and easy to iterate on.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;quick-examples-less-wall-of-text&quot;&gt;Quick Examples (Less Wall of Text)&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Jira skill (conceptual)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Input: short description + optional doc link.&lt;/li&gt;
  &lt;li&gt;Steps: fill ticket template, set type/priority/board/assignee/labels, create and attach.&lt;/li&gt;
  &lt;li&gt;Template and key fields live in the skill (references or SKILL.md).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Git – small skills&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;“Create branch from main with naming convention.”&lt;/li&gt;
  &lt;li&gt;“Update my branch from origin/main (stash, pull, re-apply, resolve conflicts).”&lt;/li&gt;
  &lt;li&gt;“Generate commit message from template.”&lt;/li&gt;
  &lt;li&gt;“Push and set upstream.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Git – combined skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Runs the four steps in order; I trigger once and get the full housekeeping flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Codebase-specific (target state)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;“Add a new API route” → skill knows our routing pattern, where to put files, how we register.&lt;/li&gt;
  &lt;li&gt;“Add a design-system component” → skill knows structure, exports, and story pattern.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;using-skills-in-codex&quot;&gt;Using Skills in Codex&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Explicit:&lt;/strong&gt; Type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$&lt;/code&gt; in the CLI (or use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/skills&lt;/code&gt; where available), pick the skill, then give your prompt.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Implicit:&lt;/strong&gt; If the skill’s description and example triggers match your prompt, Codex can invoke it automatically.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Install more:&lt;/strong&gt; Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$skill-installer&lt;/code&gt; (or equivalent) to add skills from catalogs or GitHub so you’re not starting from zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;take-the-long-view-and-your-coffee&quot;&gt;Take the Long View (And Your Coffee)&lt;/h2&gt;

&lt;p&gt;Useful skills don’t have to be perfect on day one. I’ve had the best results by:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Starting with one painful, repetitive task (for me: Jira and Git).&lt;/li&gt;
  &lt;li&gt;Turning it into a first version of a skill.&lt;/li&gt;
  &lt;li&gt;Using it in real work, noting what’s wrong or missing.&lt;/li&gt;
  &lt;li&gt;Refining the steps and templates over a few sessions—often while having a coffee.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So: &lt;strong&gt;agent&lt;/strong&gt; for open-ended work, &lt;strong&gt;skill&lt;/strong&gt; for repeatable workflows. Start with day-to-day pain (tickets, git, one codebase task), use a simple framework to create and refine skills, and let them improve over multiple iterations. That’s how skills have become one of the most useful parts of my setup—and how you can make them yours too.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Further reading: &lt;a href=&quot;https://developers.openai.com/codex/skills&quot;&gt;Codex Agent Skills&lt;/a&gt;, &lt;a href=&quot;https://developers.openai.com/codex/cli/features&quot;&gt;Codex CLI features&lt;/a&gt;, &lt;a href=&quot;https://developers.openai.com/codex/guides/slash-commands/&quot;&gt;Slash commands&lt;/a&gt;, &lt;a href=&quot;https://github.com/openai/skills&quot;&gt;OpenAI skills on GitHub&lt;/a&gt;, and community resources like the &lt;a href=&quot;https://jmerta.github.io/codex-skills/&quot;&gt;Codex Skills Catalog&lt;/a&gt; and the &lt;a href=&quot;https://habr.com/en/articles/984916/&quot;&gt;Habr deep dive on Codex Skills&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Next: the jira-to-PR skill shows up again in &lt;a href=&quot;/post/doing-the-right-thing-fast/&quot;&gt;Doing the Right Thing, Fast&lt;/a&gt;, a two-week cleanup split into 20–25 work streams.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
</feed>
