<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jose Corral</title>
    <description>The latest articles on DEV Community by Jose Corral (@jcorral).</description>
    <link>https://dev.to/jcorral</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3782919%2F8d9bc0bb-e99c-4b48-9b2d-2a808243149a.jpg</url>
      <title>DEV Community: Jose Corral</title>
      <link>https://dev.to/jcorral</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jcorral"/>
    <language>en</language>
    <item>
      <title>How Spotify Automated Background Engineering with AI</title>
      <dc:creator>Jose Corral</dc:creator>
      <pubDate>Fri, 20 Mar 2026 13:49:22 +0000</pubDate>
      <link>https://dev.to/jcorral/how-spotify-automated-background-engineering-with-ai-5ep9</link>
      <guid>https://dev.to/jcorral/how-spotify-automated-background-engineering-with-ai-5ep9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Most engineering teams think of changes to the codebase as a whole as a project. Spotify automated these changes in the background using AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Spotify's solution is called Honk, an AI agent for coding. It's an agent that makes changes to the codebase in the background without requiring an engineer to be brought into the work. It's not a chatbot integrated into a codebase. It's more like a background daemon for your entire codebase. Since implementing Honk, Spotify is now able to merge over 650 agent-created pull requests into production every month. For the migrations they have done so far, they have been able to save 60–90% of the time it would take to write the code by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem Honk was designed to solve
&lt;/h2&gt;

&lt;p&gt;At Spotify's scale, horizontal changes such as dependency upgrades, API changes, and convention enforcement have traditionally meant one thing: deterministic scripts. Write a script, execute it across all machines, validate output, and handle the edge cases it does not support. Sounds simple enough.&lt;/p&gt;

&lt;p&gt;Well, it is, until it is not. Scripts are brittle. They fail on unknown code patterns, cannot reason about context, and take just about as long to write correctly as it does to do the migration in the first place. At a certain point, it just isn't worth it.&lt;br&gt;
Honk flips the model. Instead of encoding every transformation in a script, engineers describe the change in plain language and the agent figures out how to apply it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually works
&lt;/h2&gt;

&lt;p&gt;Honk is not open source, but rather an internal solution built on top of Claude Code and Claude Agent SDK. This is significant, as it is housed within Spotify's internal developer platform, called Backstage, which is open source. This is important, as all metadata is stored here, including what teams own what, what the status of services is, what level of security is required, and what level of reliability is needed. Honk reads all of this before ever touching any code.&lt;/p&gt;

&lt;p&gt;If a developer wants to make a change, it is as simple as opening up Slack on one's phone, telling Claude to fix a bug or create a feature, and Claude writes the necessary code. Once the task is complete, a new version of the application is sent back to Slack for the developer to review. This means that bugs can be fixed before one ever gets to the office.&lt;/p&gt;

&lt;p&gt;Initially, Spotify experimented with open-source agents such as Aider, and then developed their own agential loop using LLM API, and ultimately moved to Claude Code since their own approach demanded too rigid instruction sets and failed to handle complex and multi-step editing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verification loop
&lt;/h2&gt;

&lt;p&gt;The first and foremost question for a non-deterministic AI is: how do you know it is actually right?&lt;/p&gt;

&lt;p&gt;Context: Honk solves this with a tight feedback loop. The agent goes through the codebase, makes changes, and then runs formatters, linters, builds, and tests. Then it opens a pull request. If anything fails, it does not stop. It uses the failure and re-enters the loop. This continues until it succeeds or determines it cannot make it work and raises a flag for a human to look at it.&lt;/p&gt;

&lt;p&gt;This is the magic of Honk. The AI makes the change. The toolchain checks it. You only see it when it has already passed CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for your team
&lt;/h2&gt;

&lt;p&gt;Honk is not an open-source tool, and it is closely integrated with Spotify's internal stack. However, the pattern it embodies is interesting nonetheless. You can't automate what you don't understand Everydev , Spotify's own team Every team involved with their own Backstage setup, or at least their own decent CI pipelines, can benefit from various pieces of this pattern today. Even the verification loop, considering the AI output untrusted until it passes your existing test suite, can be bolted onto any existing workflow today.&lt;/p&gt;

&lt;p&gt;Teams running their own Backstage installation, or even just good CI pipelines, can start applying parts of this today. The verification loop, treating AI outputs as untrusted until they pass your existing test suite, can be bolted onto any workflow today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The shift worth making
&lt;/h2&gt;

&lt;p&gt;Honk is interesting, not because Spotify created an AI that can write code, there are plenty of solutions that can do that. Honk is interesting because they created an AI that thinks like an engineer: it knows scope, respects ownership, and verifies its own outputs before proceeding, and escalates when it's uncertain.&lt;/p&gt;

&lt;p&gt;This is the hard part. Making an AI write a code change is easy. Making an AI think for itself across a dynamic, messy codebase with real services, real owners, and real consequences for getting it wrong requires infrastructure that most companies haven't yet developed.&lt;/p&gt;

&lt;p&gt;The companies that will succeed at this are not the ones with the best AI models. They're the ones with good service catalogs, well-defined ownership, and CI systems so tightly controlled that they can catch the AI's mistakes. The AI is only as good as the system around it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're interested in building something like this, start there, not with the AI.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>software</category>
      <category>programming</category>
    </item>
    <item>
      <title>Add`go fix` to Your CI Pipeline</title>
      <dc:creator>Jose Corral</dc:creator>
      <pubDate>Fri, 20 Feb 2026 17:09:58 +0000</pubDate>
      <link>https://dev.to/jcorral/addgo-fix-to-your-ci-pipeline-5426</link>
      <guid>https://dev.to/jcorral/addgo-fix-to-your-ci-pipeline-5426</guid>
      <description>&lt;p&gt;Most Go programmers have never invoked go fix in their CI pipeline. It’s been a dormant command for over a decade, originally designed for pre-Go 1.0 migrations, then left to rust. But it still works, and when hooked up to your CI pipeline, it becomes a stealthy enforcer that prevents your codebase from falling into antiquated ways.&lt;/p&gt;

&lt;p&gt;The concept is simple: go fix will automatically refactor your code to conform to more modern Go idioms. Consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;interface{}&lt;/code&gt; -&amp;gt; &lt;code&gt;any&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;direct loop searches → slices.Contains&lt;/li&gt;
&lt;li&gt;Or cumbersome &lt;code&gt;sort.Slice&lt;/code&gt; calls → &lt;code&gt;slices.Sort&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Run it like you’d run go teston packages, not files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Apply&lt;/span&gt; &lt;span class="n"&gt;fixes&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;place&lt;/span&gt;
&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt; &lt;span class="o"&gt;./...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Preview&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="n"&gt;without&lt;/span&gt; &lt;span class="n"&gt;applying&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt;
&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;./...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-diff&lt;/code&gt; flag is the magic for CI integration. It prints a unified diff of what would change without modifying any files. If it’s empty, your code is already modern. If not, something is up for attention.&lt;/p&gt;

&lt;p&gt;The tool is version-aware. It will read the go directive from your go.mod, and propose fixes only relevant to that version. A project on go &lt;code&gt;1.21&lt;/code&gt; ill get min/max and &lt;code&gt;slices.Contains&lt;/code&gt; rewrites, but not for range int (that’s &lt;code&gt;1.22+&lt;/code&gt;). Update your go.mod, and new modernizations will be enabled automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CI step
&lt;/h2&gt;

&lt;p&gt;Here’s a GitHub Actions job that will fail if go fix finds modernization opportunities. Add it to your existing workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Go Fix Check&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;develop&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;gofix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-go@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;go-version-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go.mod&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check for go fix suggestions&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;OUTPUT=$(go fix -diff ./... 2&amp;gt;&amp;amp;1)&lt;/span&gt;
          &lt;span class="s"&gt;if [ -n "$OUTPUT" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "::error::go fix found modernization opportunities"&lt;/span&gt;
            &lt;span class="s"&gt;echo ""&lt;/span&gt;
            &lt;span class="s"&gt;echo "$OUTPUT"&lt;/span&gt;
            &lt;span class="s"&gt;echo ""&lt;/span&gt;
            &lt;span class="s"&gt;echo "Run 'go fix ./...' locally and commit the changes."&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
          &lt;span class="s"&gt;echo "✓ No go fix suggestions - code is up to date."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a PR brings (or leaves behind) code that could be refactored, the test will fail and print the diff exactly. The dev will run &lt;code&gt;go fix ./...&lt;/code&gt; locally, commit, and push. Done.&lt;/p&gt;

&lt;p&gt;A few things to note for multi-platform repos: go fix will only scan one &lt;code&gt;GOOS/GOARCH&lt;/code&gt; per run. If you have platform-specific files, you might want to run it with different build modes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check go fix (multi-platform)&lt;/span&gt;
        &lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;for PAIR in "linux/amd64" "darwin/arm64" "windows/amd64"; do&lt;/span&gt;
            &lt;span class="s"&gt;GOOS="${PAIR%/*}" GOARCH="${PAIR#*/}" go fix -diff ./... 2&amp;gt;&amp;amp;1&lt;/span&gt;
          &lt;span class="s"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What actually gets fixed?
&lt;/h2&gt;

&lt;p&gt;Here’s a realistic before/after to give you a feel for the kind of changes go fix makes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Before&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// After: go fix ./...&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;slices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Before&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// After: go fix ./...&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are not only cosmetic changes slices.Contains is easier to understand and avoids a whole class of off-by-one errors in manually written loops. min/max are built-ins since Go 1.21and convey meaning directly.&lt;/p&gt;

&lt;p&gt;Other typical changes include replacing &lt;code&gt;interface{}&lt;/code&gt; with &lt;code&gt;any&lt;/code&gt;, swapping &lt;code&gt;context.WithCancel(contest.Background())&lt;/code&gt; for &lt;code&gt;t.Context()&lt;/code&gt; in tests, and deleting the no-longer-needed &lt;code&gt;x:=x&lt;/code&gt; loop variable capture that Go &lt;code&gt;1.22&lt;/code&gt; made redundant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip: run it twice
&lt;/h2&gt;

&lt;p&gt;Some fixes introduce new patterns that other analyzers can then optimize. Running &lt;code&gt;go fix ./...&lt;/code&gt; a second time often reveals these follow-up optimizations. In reality, two passes is usually sufficient to reach a fixed point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go 1.26 makes this even better
&lt;/h2&gt;

&lt;p&gt;Go &lt;code&gt;1.26&lt;/code&gt; rewrote &lt;code&gt;go fix&lt;/code&gt; from scratch on top of the Go analysis framework (the same one used by &lt;code&gt;go vet&lt;/code&gt;), introducing over 24 modernizer analyzers and a new &lt;code&gt;//go:fix&lt;/code&gt; inline directive that enables library authors to mark functions for automatic call-site inlining during migrations. If you’re using an earlier version of Go, you’ll have fewer analyzers at your disposal, but the CI pattern above remains the same. For the full scoop, see &lt;a href="https://go.dev/blog/gofix" rel="noopener noreferrer"&gt;the official blog post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start today
&lt;/h2&gt;

&lt;p&gt;The cost of entry is zero. You already have go fix installed, it comes with the Go toolchain. Add the CI step, run &lt;code&gt;go fix ./...&lt;/code&gt; once on your codebase to flush out the backlog, and let the CI pipeline keep things tidy from there on out.&lt;br&gt;
Your future self, browsing a PR diff that lacks a manually written contains loop, will thank you.&lt;/p&gt;

</description>
      <category>go</category>
      <category>ci</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
