<?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: Konstantin Evtenko</title>
    <description>The latest articles on DEV Community by Konstantin Evtenko (@evtenko).</description>
    <link>https://dev.to/evtenko</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4067782%2Fd4375f8b-0867-4291-a0cb-3427a72d8fd0.png</url>
      <title>DEV Community: Konstantin Evtenko</title>
      <link>https://dev.to/evtenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/evtenko"/>
    <language>en</language>
    <item>
      <title>Why You Can't "Set and Forget" Your Go Version</title>
      <dc:creator>Konstantin Evtenko</dc:creator>
      <pubDate>Tue, 01 Sep 2026 17:02:21 +0000</pubDate>
      <link>https://dev.to/evtenko/why-you-cant-set-and-forget-your-go-version-4jb0</link>
      <guid>https://dev.to/evtenko/why-you-cant-set-and-forget-your-go-version-4jb0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5u57lf4ak18f2fqc7gq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5u57lf4ak18f2fqc7gq.png" alt="Infographic titled " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's look at this through one of the recent Go releases: a security release that fixed 10 vulnerabilities in the standard library, specifically in the packages present in every backend: &lt;code&gt;net/url&lt;/code&gt;, &lt;code&gt;net/http&lt;/code&gt;, &lt;code&gt;html/template&lt;/code&gt;, &lt;code&gt;crypto/tls&lt;/code&gt;, &lt;code&gt;encoding/xml&lt;/code&gt;, &lt;code&gt;encoding/asn1&lt;/code&gt;, plus &lt;code&gt;go command&lt;/code&gt;, &lt;code&gt;net&lt;/code&gt;, and &lt;code&gt;x/mod/sumdb&lt;/code&gt;. The date and version number matter less here than the recurring pattern itself: releases like this come out regularly, and the problem they solve applies to any version of Go, and really to the runtime of almost any language. If you're interested in the specific version numbers and exact release date being discussed, ask in the comments, I'll be glad to answer.&lt;/p&gt;

&lt;p&gt;The problem is that for many teams, releases like this pass unnoticed: the Go version in production gets fixed once at project start and never revisited since. Let's break down why that's risky, what exactly this release fixed, and how to build a process so patches like this don't slip by unnoticed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Security Patch Is the Moment of Risk, Not the Moment of Safety
&lt;/h2&gt;

&lt;p&gt;The logic can seem counterintuitive: doesn't a patch make the system safer? Yes, but only for those who install it.&lt;/p&gt;

&lt;p&gt;A vulnerability in the code has existed since the moment that code was written, it's just that no one knows about it publicly until a certain point. Someone (a security researcher, the Go team itself) finds the problem, then private work on the fix begins: vulnerability details are deliberately withheld until the patch ships, in line with the project's security policy.&lt;/p&gt;

&lt;p&gt;Then the key moment happens: as soon as the patch is published, the vulnerability description, the CVE (Common Vulnerabilities and Exposures), is published alongside it. From that second, information about the vulnerability becomes public, and attackers start deliberately scanning the internet for servers still running the old, unpatched version.&lt;/p&gt;

&lt;p&gt;Your production image running an old Go version doesn't "accumulate" vulnerabilities over time, it already contained them from the start. It's just that before, no one knew, and now everyone does, including those looking for how to exploit it. The window between a patch's publication and the appearance of mass exploitation attempts can be a matter of days.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Exactly Was Fixed
&lt;/h2&gt;

&lt;p&gt;Let's walk through specific packages from this release to show what was actually at risk, to make clear this isn't about abstract "vulnerabilities" but about code that actually runs in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  net/url and net/http: parsing everything that comes from outside
&lt;/h3&gt;

&lt;p&gt;These packages handle URL parsing and HTTP request processing in general. Practically any service that interacts with the outside world depends on them in some way: API gateways, reverse proxies, data aggregators, any code that parses a URL received from a client or a third-party source.&lt;/p&gt;

&lt;p&gt;If your architecture has a component that accepts and parses external URLs (for example, a gateway making requests to external data sources based on user input), it sits directly on these packages, and a vulnerability in them potentially affects every such node.&lt;/p&gt;

&lt;h3&gt;
  
  
  html/template: an XSS attack surface in rendering
&lt;/h3&gt;

&lt;p&gt;One of the fixed issues, CVE-2026-56858, involves incorrect JavaScript context tracking when handling regexp expressions inside &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; blocks. In short: the escaping logic in &lt;code&gt;html/template&lt;/code&gt; didn't always correctly escape the &lt;code&gt;/&lt;/code&gt; character in the context of regexp literals, which under certain conditions allowed injecting arbitrary JavaScript through user input.&lt;/p&gt;

&lt;p&gt;For any service that renders HTML templates using user data, this is a direct XSS vulnerability, and &lt;code&gt;html/template&lt;/code&gt; in Go exists specifically to prevent things like this by default. The patch closes a specific hole in that protection.&lt;/p&gt;

&lt;h3&gt;
  
  
  encoding/xml and encoding/asn1: the forgotten parsers
&lt;/h3&gt;

&lt;p&gt;These packages rarely get attention, since XML and ASN.1 haven't been fashionable formats for a while. But they're still alive in SOAP-service integrations (typical for legacy enterprise systems) and in certificate handling (ASN.1 is the format in which X.509 certificates, used in TLS, are encoded). If you have an integration written a few years ago and untouched since, the odds that it uses one of these packages somewhere aren't small.&lt;/p&gt;

&lt;h3&gt;
  
  
  x/mod/sumdb: a hit to the dependency supply chain
&lt;/h3&gt;

&lt;p&gt;Two vulnerabilities in &lt;code&gt;x/mod/sumdb&lt;/code&gt; (CVE-2026-56865 and CVE-2026-56864) deserve special attention. The GOSUMDB mechanism in Go exists to guarantee the integrity of downloaded modules: when installing a dependency, Go checks its checksum against a public database to confirm the downloaded code hasn't been tampered with.&lt;/p&gt;

&lt;p&gt;The discovered vulnerabilities show that a malicious GOPROXY (the proxy server through which Go can fetch modules) was able to forge entries in this database so that substituted, potentially malicious module code passed the GOSUMDB check and settled into the local module cache as if it were legitimate. This is a hit to the very foundation of trust in the dependency ecosystem: if the integrity check can be fooled, any dependency in your project could potentially be swapped out without your knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Cadence That's Easy to Underestimate
&lt;/h2&gt;

&lt;p&gt;Literally a few days after this release, another patch shipped, again touching &lt;code&gt;net/http&lt;/code&gt;. This isn't an isolated case: Go ships security point releases irregularly, but often, sometimes days apart, sometimes a few weeks apart.&lt;/p&gt;

&lt;p&gt;If you don't actively follow announcements on &lt;code&gt;go.dev/security&lt;/code&gt;, it's easy to miss not just one but several consecutive patches, and only discover the problem when your infrastructure's security scanner (or, worse, an actual exploit) points to it after the fact. By that point, the CVE has long been public, and attackers have had plenty of time to figure out how to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Check What You're Running
&lt;/h2&gt;

&lt;p&gt;A quick check of the Go version installed locally or in your CI environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see which Go version is pinned in the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;go.mod | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"^go "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the version is older than the latest published security version for your branch, it's time to plan an upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Build a Process So This Doesn't Keep Happening
&lt;/h2&gt;

&lt;p&gt;A one-time upgrade to the latest version solves today's problem but not the systemic one: next month another patch will ship, and without a process you'll be back in the same situation. A few practical steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pin the toolchain via &lt;code&gt;go.mod&lt;/code&gt;.&lt;/strong&gt; Starting with Go 1.21, you can explicitly specify a &lt;code&gt;toolchain&lt;/code&gt; directive in &lt;code&gt;go.mod&lt;/code&gt;, which guarantees that CI and production use the same Go version, rather than whatever happens to be installed on a given machine:&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="k"&gt;go&lt;/span&gt; &lt;span class="m"&gt;1.26&lt;/span&gt;

&lt;span class="n"&gt;toolchain&lt;/span&gt; &lt;span class="n"&gt;go1&lt;/span&gt;&lt;span class="m"&gt;.26.6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This doesn't protect against vulnerabilities on its own, but it eliminates the situation where a developer has one version locally, CI has another, and production has a third, with no one sure which version is actually running where.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update your base Docker image on a schedule, not from memory.&lt;/strong&gt; If your production images are built, for example, on top of &lt;code&gt;golang:1.26&lt;/code&gt; or a similar base image, it's worth setting up a regular (say, weekly) rebuild that checks for a new version, rather than relying on someone on the team remembering to check go.dev.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subscribe to Go's security announcements.&lt;/strong&gt; The &lt;code&gt;go.dev/security&lt;/code&gt; page and its associated RSS/mailing list are the most direct source of information about new patches, without the delay that comes from relying on a patch announcement catching your eye on social media by chance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add a Go version check to CI as a separate step.&lt;/strong&gt; A simple check that compares the version in use against the latest published security version and fails the build (or at least warns) if the version in use is older than a defined threshold removes the human factor from this process.&lt;/p&gt;

&lt;p&gt;A minimal example for GitHub Actions, pulling the Go version straight from &lt;code&gt;go.mod&lt;/code&gt; instead of hardcoding it in the workflow file:&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;Set up Go&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;go.mod'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps CI in sync with whatever version is pinned in &lt;code&gt;go.mod&lt;/code&gt;, so bumping the version in one place updates it everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify the Go version in the deployed binary, not just in configuration.&lt;/strong&gt; An updated Dockerfile or a rebuilt base image guarantees nothing on its own: if a given service hasn't been rebuilt and redeployed, production keeps running a binary built with the old toolchain, even though the configuration was updated long ago. It's especially easy to miss a service that hasn't been touched in a while, one with no trigger for a rebuild (a new commit, a PR). Closing that gap means checking the version after the fact, for example via &lt;code&gt;runtime.Version()&lt;/code&gt; in a health endpoint, to confirm what's actually running rather than what's supposed to be running according to configuration.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(as one commenter pointed out on the LinkedIn post for this article, an updated Dockerfile alone doesn't close the loop: rebuilding and redeploying every affected service should be part of the patch process, followed by verifying the version in the deployed binary itself.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;You can't "set and forget" the Go version in your production images, any more than you can with any other project dependency. The difference is that third-party libraries are usually visible to everyone in &lt;code&gt;composer.json&lt;/code&gt; or &lt;code&gt;package.json&lt;/code&gt;, while the version of the language or runtime itself often remains an invisible part of the infrastructure, configured once at project start and never revisited.&lt;/p&gt;

&lt;p&gt;Update Go as deliberately as you update dependencies: with security announcement monitoring, a pinned toolchain, regular base image rebuilds, and verification of what's actually running in production rather than just what's written in configuration. The difference between a team that learns about a vulnerability from the official announcement and a team that learns about it from a security scanner report after the fact is usually the difference between a few minutes spent on a version bump and several days spent on incident response.&lt;/p&gt;

&lt;p&gt;How do you keep Go up to date in production: do you pin the toolchain via &lt;code&gt;go.mod&lt;/code&gt;, roll base images on a schedule? And who on your team is responsible for monitoring &lt;code&gt;go.dev/security&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;If posts like this are useful, follow for more on Go, Laravel/PHP, and production backend engineering.&lt;/p&gt;

</description>
      <category>go</category>
      <category>devops</category>
      <category>webdew</category>
      <category>backend</category>
    </item>
    <item>
      <title>PHP 8.6 Deprecations: Why Your Logs (and Bill) Will Spike</title>
      <dc:creator>Konstantin Evtenko</dc:creator>
      <pubDate>Tue, 11 Aug 2026 09:29:34 +0000</pubDate>
      <link>https://dev.to/evtenko/php-86-deprecations-why-your-logs-and-bill-will-spike-nfe</link>
      <guid>https://dev.to/evtenko/php-86-deprecations-why-your-logs-and-bill-will-spike-nfe</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5p6seo4lloco0ppvbfc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5p6seo4lloco0ppvbfc.png" alt="PHP 8.6 brings 35 new deprecations. More warnings → more logs → higher infrastructure costs." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PHP 8.6's mass deprecation vote just closed: 35 separate RFCs, most of them passing. Nothing breaks in 8.6 itself: deprecated functions keep working, they just start warning. That's exactly what teams tend to underestimate, and it's worth walking through why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effect #1: Log volume becomes a cost problem
&lt;/h2&gt;

&lt;p&gt;On a live Laravel project with notice logging enabled, every deprecated call in a hot path turns into log volume: disk, ingestion into Loki/ELK, money. The symptom shows up as "logging costs went up," not "time to fix the code," which means it often gets triaged by the wrong team, at the wrong layer, weeks after the actual cause shipped.&lt;/p&gt;

&lt;p&gt;A rough mental model: if a deprecated function sits in a hot path called thousands of times per minute, you're not looking at a handful of warnings, you're looking at a sustained, compounding log stream that ingestion pipelines have to process and store indefinitely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effect #2: Deprecations you don't control
&lt;/h2&gt;

&lt;p&gt;You'll fix your own code fast. The harder problem is vendor packages without an 8.6-ready release: they'll keep making noise in your logs until the upstream maintainer ships a fix, and that timeline isn't yours to control. On a dependency-heavy Laravel stack, this can mean weeks of irreducible noise even after your own codebase is clean.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(as one commenter pointed out on the LinkedIn version of this post, &lt;u&gt;Rector&lt;/u&gt; automates a big chunk of the fixing work, but only for code you own. It won't touch vendor internals, so it complements the CI gate below rather than replacing it.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't have to upgrade right now.&lt;/strong&gt; &lt;br&gt;
PHP 8.5 is supported for years to come, and deprecations by themselves aren't urgent: they won't break anything until they eventually become removals, often years later. If you're not planning an 8.6 bump soon, none of this is time-sensitive.&lt;/p&gt;

&lt;p&gt;The scenario below is for whenever that upgrade does happen, this month, or in a few years. The failure mode doesn't change based on timing: whenever you bump the version, the vendor-deprecation noise shows up the same way, so the CI-gate approach is worth having in place before that day arrives, not scrambling to add it after.&lt;/p&gt;
&lt;h2&gt;
  
  
  The order that actually works
&lt;/h2&gt;

&lt;p&gt;The trap is discovering deprecation noise in production logs after the fact, then reverse-engineering which release caused it. The order that avoids that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bump the PHP version in CI first, not in production.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;error_reporting&lt;/code&gt; to treat &lt;code&gt;E_DEPRECATED&lt;/code&gt; as an error in CI, so warnings fail the build instead of silently passing.&lt;/li&gt;
&lt;li&gt;Fix what breaks, your own code first; for vendor deprecations, check if a newer package version resolves it, or track the upstream issue.&lt;/li&gt;
&lt;li&gt;Only then ship the version bump to production.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A minimal CI-side snippet for the second step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In a CI-only bootstrap or phpunit bootstrap file&lt;/span&gt;
&lt;span class="nb"&gt;error_reporting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;E_ALL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$errno&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errstr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$errno&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;E_DEPRECATED&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$errno&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;E_USER_DEPRECATED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\ErrorException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$errstr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errno&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errline&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="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// fall back to default handler for everything else&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turns deprecation warnings into hard failures during your test suite run, cheap to add, and it moves the discovery point from "someone notices the Loki bill" to "the build fails on the PR."&lt;/p&gt;

&lt;h2&gt;
  
  
  The dependency case
&lt;/h2&gt;

&lt;p&gt;For vendor deprecations specifically, worth checking before assuming you're stuck waiting on upstream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there a newer major/minor version of the package that's already 8.6-ready?&lt;/li&gt;
&lt;li&gt;Is the deprecated call actually reachable in your usage, or dead code you can just remove?&lt;/li&gt;
&lt;li&gt;Can you suppress just that specific warning at the call site (via &lt;code&gt;@&lt;/code&gt;, sparingly) while tracking the upstream issue, rather than disabling the CI gate entirely?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Nothing forces you to fix deprecations the moment they're announced. But treating them as a CI concern, not a production logging concern, is the difference between a five-minute PR fix and untangling a spike in your observability bill three weeks later.&lt;/p&gt;

&lt;p&gt;How does your team handle this: hard CI gate, lower log verbosity, or something else?&lt;/p&gt;

&lt;p&gt;If posts like this are useful, follow for more on Go, PHP, and production backend engineering.&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
