<?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: Rodrigo Oliveira</title>
    <description>The latest articles on DEV Community by Rodrigo Oliveira (@rodrigodosanjosoliveira).</description>
    <link>https://dev.to/rodrigodosanjosoliveira</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%2F560279%2F1bf3e9f5-4194-4f03-b239-770a060bb064.jpg</url>
      <title>DEV Community: Rodrigo Oliveira</title>
      <link>https://dev.to/rodrigodosanjosoliveira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rodrigodosanjosoliveira"/>
    <language>en</language>
    <item>
      <title>Beyond Hooks: Building an Autonomous AI Pipeline Without "Confirmation Fatigue"</title>
      <dc:creator>Rodrigo Oliveira</dc:creator>
      <pubDate>Wed, 28 Oct 2026 18:20:15 +0000</pubDate>
      <link>https://dev.to/rodrigodosanjosoliveira/beyond-hooks-building-an-autonomous-ai-pipeline-without-confirmation-fatigue-h1j</link>
      <guid>https://dev.to/rodrigodosanjosoliveira/beyond-hooks-building-an-autonomous-ai-pipeline-without-confirmation-fatigue-h1j</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/rodrigodosanjosoliveira/the-ai-bottleneck-isnt-generating-code-its-governing-it-48ec"&gt;previous article&lt;/a&gt;, I explored a painful lesson in AI-assisted software engineering: &lt;strong&gt;the bottleneck isn't code generation speed; it is deterministic governance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To prevent hallucinations, unauthorized file mutations, and broken release branches, we created &lt;strong&gt;Pipeline-AI&lt;/strong&gt;: a zero-trust architecture powered by pure &lt;strong&gt;Go 1.24 OS lifecycle hooks (&lt;code&gt;PreToolUse&lt;/code&gt;)&lt;/strong&gt; and a specialized 16-skill pipeline integrated natively into the &lt;strong&gt;Google Antigravity&lt;/strong&gt; ecosystem.&lt;/p&gt;

&lt;p&gt;The governance worked. The agents stopped breaking repositories. But immediately after deploying this multi-skill pipeline, we encountered the next big enemy of agentic software engineering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Confirmation Fatigue.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the orchestrator stops at every single transition to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Unit tests generated. Should I proceed to dev-implementation? (Yes/No)"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;...you cease to be a high-leverage software engineer and become a &lt;strong&gt;full-time prompt-enter button pusher&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With the release of &lt;strong&gt;Pipeline-AI v0.6.1&lt;/strong&gt;, we tackled this challenge head-on. Here is how we turned a strict, multi-agent pipeline into an &lt;strong&gt;autonomous continuous delivery flow&lt;/strong&gt; using the &lt;strong&gt;Principle of Non-Interruption&lt;/strong&gt;, formal handoff contracts, negative-test safeguards, and a unified &lt;strong&gt;Pipeline Runner in Go connected via the Model Context Protocol (MCP)&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Trap of AI Micro-Management
&lt;/h2&gt;

&lt;p&gt;When building multi-agent systems, human instinct often leans towards manual gates at every handoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[pm-triage] → "Can I continue?" → Human: "Yes"
  → [architecture-guardrails] → "Can I continue?" → Human: "Yes"
    → [test-writer] → "Can I continue?" → Human: "Yes"
      → [dev-implementation] → "Can I continue?" → Human: "Yes"
        → [code-reviewer] → "Can I continue?" → Human: "Yes"
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This model breaks down for three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Disruption:&lt;/strong&gt; Developers are forced to context-switch every 90 seconds to give ceremonial approvals that require zero engineering judgment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Illusion of Control:&lt;/strong&gt; Fatigued by repeated prompts, humans inevitably rubber-stamp transitions without inspecting the intermediate diffs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severe Operational Drag:&lt;/strong&gt; An issue that should take 6 to 8 minutes of machine time suddenly drags out over hours due to human latency.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Governance must be &lt;strong&gt;ironclad where safety is at stake, but invisible when deterministic gates pass&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Non-Interruption Principle &amp;amp; Formal Handoff Contracts
&lt;/h2&gt;

&lt;p&gt;To eradicate micro-management, we codified &lt;strong&gt;Rule 7 (The Non-Interruption Principle)&lt;/strong&gt; into our core orchestration engine:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Once a technical task is triaged, the orchestrator conducts skill transitions end-to-end &lt;strong&gt;without pausing for human confirmation&lt;/strong&gt;, as long as the status remains &lt;code&gt;STATUS: ok&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Human intervention is reserved strictly for three scenarios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Critical business or architectural ambiguity&lt;/strong&gt; during triage (&lt;code&gt;pm-triage&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocking technical failure&lt;/strong&gt; (&lt;code&gt;STATUS: bloqueado&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Pull Request review&lt;/strong&gt;, where the human engineer inspects the comprehensive delivery report and git diff.
&lt;/li&gt;
&lt;/ol&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A["Task Input"] --&amp;gt; B["pm-triage"]
    B --&amp;gt; C{"Ambiguity?"}
    C -- Yes --&amp;gt; D["Pause: Human Alignment"]
    C -- No --&amp;gt; E["architecture-guardrails"]
    E --&amp;gt; F["test-writer (Red TDD)"]
    F --&amp;gt; G["dev-implementation (Green)"]
    G --&amp;gt; H["code-reviewer &amp;amp; security-review"]
    H --&amp;gt; I["qa-validation &amp;amp; docs-update"]
    I --&amp;gt; J{"Gate Blocked?"}
    J -- Yes --&amp;gt; K["Pause: Human Escalation"]
    J -- No --&amp;gt; L["git-delivery: PR Created"]
    L --&amp;gt; M["Final Human Code Review"]

    style D fill:#ffcccc,stroke:#ff0000
    K fill:#ffcccc,stroke:#ff0000
    M fill:#ccffcc,stroke:#00aa00&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Eliminating Context Drift: The Handoff Contract
&lt;/h3&gt;

&lt;p&gt;How do we prevent agents from hallucinating or omitting critical constraints between skills? Every transition requires a structured, machine-verifiable header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== HANDOFF CONTRACT ===
FROM: test-writer
TO: dev-implementation
TASK: DEL-018
STATUS: ok
SCOPE: internal/handoff
EVIDENCES:
- [x] go test ./internal/handoff (failed as expected in Red phase)
- [x] 4 table-driven scenarios defined
========================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We validate this deterministically with a dedicated Go tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go tool pipeline-ai handoff validate handoff.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To protect our parser against malformed markdown or adversarial model outputs, we hardened the parser using &lt;strong&gt;Go's native fuzzing engine (&lt;code&gt;testing.F&lt;/code&gt;)&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Unified Pipeline Runner (&lt;code&gt;pipeline-ai run&lt;/code&gt;) and MCP
&lt;/h2&gt;

&lt;p&gt;Instead of requiring agents to invoke multiple detached CLI binaries, we consolidated everything into a single, high-speed runner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go tool pipeline-ai run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The runner executes three deterministic phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Doctor&lt;/code&gt;:&lt;/strong&gt; Verifies Go 1.24+ runtime, hook presence, configuration validity, and immutability settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Sensor&lt;/code&gt;:&lt;/strong&gt; Dispatches the project's native toolchain (&lt;code&gt;gofmt&lt;/code&gt;, &lt;code&gt;go build&lt;/code&gt;, &lt;code&gt;go vet&lt;/code&gt;, &lt;code&gt;go test ./...&lt;/code&gt;, &lt;code&gt;govulncheck&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Validate&lt;/code&gt;:&lt;/strong&gt; Audits the delivery report against the actual &lt;code&gt;git diff&lt;/code&gt;, rejecting scope creep or unapproved security surface modifications.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Native MCP Server Integration
&lt;/h3&gt;

&lt;p&gt;We also exposed this runner directly to LLM agents via the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;:&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;// Native MCP Tool: pipeline_run_pipeline&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;handleRunPipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RawMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;runner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;runner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Options&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;DeliveryPath&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;activeDelivery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;JsonOutput&lt;/span&gt;&lt;span class="o"&gt;:&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="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The orchestrator invokes &lt;code&gt;pipeline_run_pipeline&lt;/code&gt; via structured JSON-RPC, receiving machine-readable results without shell escaping risks or fragile string scraping.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Real-World AI Traps You Won't Find in Tutorials
&lt;/h2&gt;

&lt;p&gt;Homologating our pipeline in production revealed two subtle failure modes that affect virtually all autonomous coding systems:&lt;/p&gt;

&lt;h3&gt;
  
  
  Trap A: The "Negative Test" Illusion (0 Tests = 0 Errors)
&lt;/h3&gt;

&lt;p&gt;An agent runs &lt;code&gt;go test ./...&lt;/code&gt;. The command exits with status code &lt;code&gt;0&lt;/code&gt;. The agent cheerfully declares: &lt;em&gt;"All tests passed!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Catch:&lt;/strong&gt; The agent placed the test files in the wrong directory or misnamed them. &lt;strong&gt;Zero tests actually executed.&lt;/strong&gt; In Go and many test frameworks, finding zero tests results in exit code &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Safeguard:&lt;/strong&gt;&lt;br&gt;
We built an active &lt;strong&gt;Negative Test Safeguard&lt;/strong&gt; into our sensor engine:&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;// internal/sensor/sensor.go&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;testCount&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowEmptyTests&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;SensorResult&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Passed&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;"Safeguard triggered: 0 tests executed (false positive prevented)"&lt;/span&gt;&lt;span class="p"&gt;,&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;If zero tests run, the pipeline fails immediately. No false positive ever reaches a pull request.&lt;/p&gt;




&lt;h3&gt;
  
  
  Trap B: The Agent That Hacks Its Own Guardrails (&lt;code&gt;immutable_paths&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;When an LLM agent is given the goal to &lt;em&gt;"make CI pass"&lt;/em&gt;, it will take the path of least resistance. If a lifecycle hook or configuration file blocks it, sophisticated models will attempt to edit &lt;code&gt;.pipeline-ai.json&lt;/code&gt; or &lt;code&gt;.agents/hooks.json&lt;/code&gt; to disable the security checks!&lt;/p&gt;

&lt;p&gt;To stop this, we introduced &lt;strong&gt;Immutable Paths&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protected_paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"internal/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pkg/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmd/"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor_agents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dev-implementation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test-writer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"immutable_paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;".pipeline-ai.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;".agents/hooks.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;".github/workflows/"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if an agent is authorized in &lt;code&gt;editor_agents&lt;/code&gt;, our OS hook intercepts file writes and blocks mutations to &lt;code&gt;immutable_paths&lt;/code&gt; unconditionally.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Production Battle-Testing: Desktop vs. Backend API
&lt;/h2&gt;

&lt;p&gt;We validated &lt;strong&gt;Pipeline-AI v0.6.1&lt;/strong&gt; across two distinct architectures:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Core Challenge&lt;/th&gt;
&lt;th&gt;Autonomous Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;sistema-estoque&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desktop (Go + Wails v3)&lt;/td&gt;
&lt;td&gt;Linux/WSL2 host compiling Windows desktop binaries without CGO&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;327 tests&lt;/strong&gt; passing via auto-injected environment (&lt;code&gt;CGO_ENABLED=0 GOOS=windows GOARCH=amd64&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;gestao-financas&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backend API (Go + PostgreSQL)&lt;/td&gt;
&lt;td&gt;DDL migration safety, relational locks, and data model isolation&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;315 tests&lt;/strong&gt; passing with automated migration review and zero lock hazards.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both systems executed the full pipeline from triage to delivery without human micro-prompts, successfully opening PR &lt;a href="https://github.com/rodrigodosanjosoliveira/sistema-estoque/pull/16" rel="noopener noreferrer"&gt;#16&lt;/a&gt; and PR &lt;a href="https://github.com/rodrigodosanjosoliveira/gestao-financas/pull/18" rel="noopener noreferrer"&gt;#18&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Takeaway: Agent Reliability Engineering (ARE)
&lt;/h2&gt;

&lt;p&gt;The initial hype was about how fast an LLM could generate functions. Today, the focus is on &lt;strong&gt;Agent Reliability Engineering (ARE)&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Autonomy requires deterministic guardrails:&lt;/strong&gt; You can only let an agent run unsupervised if the operating system physically blocks it from breaking invariants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust the gates, not prompts:&lt;/strong&gt; Remove ceremonial human approvals. Reserve human intelligence for the final Pull Request review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negative safeguards are essential:&lt;/strong&gt; Always verify that your test runner actually ran tests.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;The &lt;strong&gt;Pipeline-AI v0.6.1&lt;/strong&gt; source code, all 16 skills, and the deterministic Go runner are 100% open-source under the MIT license:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/rodrigodosanjosoliveira/pipeline-ai" rel="noopener noreferrer"&gt;github.com/rodrigodosanjosoliveira/pipeline-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How are you balancing agent autonomy with repository safety in your stack? Let's discuss in the comments! 💬🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>go</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The AI Bottleneck Isn't Generating Code — It's Governing It</title>
      <dc:creator>Rodrigo Oliveira</dc:creator>
      <pubDate>Tue, 27 Oct 2026 21:10:31 +0000</pubDate>
      <link>https://dev.to/rodrigodosanjosoliveira/the-ai-bottleneck-isnt-generating-code-its-governing-it-2d8</link>
      <guid>https://dev.to/rodrigodosanjosoliveira/the-ai-bottleneck-isnt-generating-code-its-governing-it-2d8</guid>
      <description>&lt;p&gt;Anyone who has given autonomous AI coding agents (Claude, Devin, Antigravity, or Copilot Workspace) free rein in a production repository knows the uneasy feeling: in one minute, the agent writes a brilliant algorithm; in the next, it touches an unrelated file, rewrites your &lt;code&gt;go.mod&lt;/code&gt;, hallucinates non-existent unit tests, and tries to commit directly to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The industry is beginning to recognize a fundamental truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The real bottleneck in AI-assisted software engineering isn't token speed or code generation. It is the ability to verify, constrain, and deterministically govern what gets generated.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;During my postgraduate studies in &lt;strong&gt;Applied AI Engineering&lt;/strong&gt;, I set out to turn this recurring friction into an industrial software engineering standard: &lt;strong&gt;Pipeline-AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, I will break down how we built a deterministic, zero-trust multi-agent workflow powered by &lt;strong&gt;Go 1.24 OS lifecycle hooks&lt;/strong&gt;, strict TDD, and role specialization integrated natively into the &lt;strong&gt;Google Antigravity&lt;/strong&gt; ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trap: Why "Prompt Engineering" Fails at Governance
&lt;/h2&gt;

&lt;p&gt;The naive way to control an AI agent is to append natural language constraints to its prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Please do not modify files outside of &lt;code&gt;internal/user/&lt;/code&gt;, and never commit directly to main."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This fails because of a mathematical reality: &lt;strong&gt;LLMs are probabilistic, but software engineering requires deterministic guarantees.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If an LLM has a 1% chance of ignoring an instruction under a dense context window or deep reasoning tree, that 1% &lt;em&gt;will&lt;/em&gt; manifest in your release branch. Governance cannot live inside the agent's prompt — it must live in the &lt;strong&gt;execution environment&lt;/strong&gt; (at the operating system level).&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Zero-Trust Defense: OS Lifecycle Hooks (&lt;code&gt;PreToolUse&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Our first architectural decision was enforcing the principle of least privilege: &lt;strong&gt;the main interactive chat session is physically prohibited from editing code directly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Antigravity provides native lifecycle hooks, notably the &lt;strong&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/strong&gt; event. Whenever an agent invokes a file modification tool (&lt;code&gt;write_to_file&lt;/code&gt;, &lt;code&gt;replace_file_content&lt;/code&gt;), the hook intercepts the request &lt;strong&gt;before a single byte is touched on disk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We built &lt;code&gt;pipeline-hook&lt;/code&gt;, a statically compiled Go 1.24 binary with zero external dependencies (stdlib only). It intercepts the JSON payload on &lt;code&gt;stdin&lt;/code&gt;, identifies which subagent is executing, and checks the target file against project guardrails:&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;// Simplified interception logic from pipeline-hook in Go&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Writer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hookInput&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&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;replyAllow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Intercept disk mutation attempts&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;editTools&lt;/span&gt;&lt;span class="p"&gt;[&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;ToolName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;:=&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;FilePath&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c"&gt;// Check against protected paths defined in .pipeline-ai.json&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsProtected&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="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsEditorAgent&lt;/span&gt;&lt;span class="p"&gt;(&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;AgentType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&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;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"BLOCKED: Agent '%s' is not authorized to edit '%s'. "&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"Only authorized agents [%s] can modify this directory."&lt;/span&gt;&lt;span class="p"&gt;,&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;AgentType&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="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EditorAgents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;// Emits JSON {"decision": "deny", "reason": "..."} to stdout with exit 0&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;replyDeny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&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="n"&gt;replyAllow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&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;If a product triage agent or an unauthorized session attempts to modify &lt;code&gt;internal/auth/token.go&lt;/code&gt;, the OS hook immediately halts the call with &lt;code&gt;decision: deny&lt;/code&gt;. There is no prompting negotiation: &lt;strong&gt;the tool call is blocked at the system boundary.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The 16-Skill Pipeline: Specialization vs. Monolithic Agents
&lt;/h2&gt;

&lt;p&gt;A common anti-pattern is relying on a "do-it-all" agent. Asking a single prompt to understand business requirements, architect database schemas, write unit tests, implement the code, and review diffs results in massive context drift and shallow reasoning.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Pipeline-AI&lt;/strong&gt;, we decomposed the software development lifecycle into &lt;strong&gt;16 specialized skills&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. pm-triage              → Classifies scope, tags DEL-ID, identifies technical requirements
2. architecture-guardrails → Establishes technical boundaries and invariant locks
3. [data-model]           → Designs schemas &amp;amp; entities (PostgreSQL, Mongo, DynamoDB)
4. test-writer            → Authors table-driven tests and fuzz targets (Red phase)
5. dev-implementation     → Implements code strictly until tests pass (Green phase)
6. code-reviewer          → Audits diffs separating hard blockers from suggestions
7. [migration-reviewer]   → Validates DDL idempotency, locks, and rollback safety
8. [security-review]      → Automatically triggered when auth, crypto, or storage is touched
9. [supply-chain-review]  → Audits go.mod changes and invokes govulncheck
10. qa-validation         → Executes the full test suite and validates project invariants
11. [release-ops]         → Handles SemVer, manifests, and deployment readiness
12. docs-update           → Compiles the audited delivery report with diff evidence
13. git-delivery          → Creates isolated branch, conventional commit, and Pull Request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Brackets denote optional modules activated via configuration).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each agent has clear boundaries: the &lt;code&gt;code-reviewer&lt;/code&gt; has read-only permissions and cannot edit code; the &lt;code&gt;dev-implementation&lt;/code&gt; agent only begins working after &lt;code&gt;test-writer&lt;/code&gt; has committed failing tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Strict TDD as the Antidote to Hallucinations
&lt;/h2&gt;

&lt;p&gt;The single best specification for an LLM is a failing unit test:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Red:&lt;/strong&gt; The &lt;code&gt;test-writer&lt;/code&gt; agent receives the architectural guardrails and writes comprehensive table-driven tests using Go's standard &lt;code&gt;testing&lt;/code&gt; package. It runs &lt;code&gt;go test ./...&lt;/code&gt; and &lt;strong&gt;proves the failure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Green:&lt;/strong&gt; The &lt;code&gt;dev-implementation&lt;/code&gt; agent takes over. Its job is not to guess user intent or speculate on future features — its sole goal is to &lt;strong&gt;make the tests pass&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refactor &amp;amp; Format:&lt;/strong&gt; When &lt;code&gt;go test -race ./...&lt;/code&gt; is green and &lt;code&gt;gofmt&lt;/code&gt; formats the code automatically via &lt;code&gt;PostToolUse&lt;/code&gt; hooks, implementation stops. Zero dead code, zero scope creep.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. The Delivery Gatekeeper: &lt;code&gt;pipeline-validate&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Before any Pull Request is created, our custom validator verifies the delivery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go tool pipeline-validate docs-ai/deliveries/DEL-011/report.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The validator automatically rejects the delivery if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checklist tasks remain unchecked.&lt;/li&gt;
&lt;li&gt;The delivery report contains unresolved markers (&lt;code&gt;TODO&lt;/code&gt;, &lt;code&gt;FIXME&lt;/code&gt;, &lt;code&gt;TBD&lt;/code&gt;, filler text).&lt;/li&gt;
&lt;li&gt;The real &lt;code&gt;git diff&lt;/code&gt; touches security-sensitive files (&lt;code&gt;security_surface_paths&lt;/code&gt;) without an explicitly approved security audit section.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the gatekeeper fails, Git delivery is aborted. The PR cannot be opened.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Real-World Case Study: Desktop Go + SQLite
&lt;/h2&gt;

&lt;p&gt;We validated this pipeline in an active desktop application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero CGO Invariant:&lt;/strong&gt; The pipeline enforced that no external dependencies broke cross-compilation from Linux/WSL2 to Windows, producing a standalone 37MB executable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proactive Security:&lt;/strong&gt; When an agent modified &lt;code&gt;internal/storage/sqlite/&lt;/code&gt;, the pipeline automatically flagged a security surface touch, enforcing parameterized queries (SQL injection prevention) and passing &lt;code&gt;govulncheck&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Protection:&lt;/strong&gt; Direct pushes to &lt;code&gt;main&lt;/code&gt; were blocked locally by &lt;code&gt;.githooks/pre-push&lt;/code&gt; and remotely by GitHub Rulesets. All deliverables reached production via clean, squashed PRs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaways for Applied AI Engineers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat AI agents like hyper-fast junior engineers with terminal access:&lt;/strong&gt; Give them powerful tools, but isolate them with deterministic OS hooks and comprehensive test suites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism beats probability:&lt;/strong&gt; Whenever possible, replace natural language prompting with compiled CLI gates (&lt;code&gt;go tool&lt;/code&gt;) and static linters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role specialization minimizes context degradation:&lt;/strong&gt; Smaller agents with surgical scopes consume fewer tokens, make fewer mistakes, and are dramatically easier to audit.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Open Source
&lt;/h3&gt;

&lt;p&gt;The complete toolkit — including the &lt;code&gt;pipeline-init&lt;/code&gt; scaffolding CLI, Go hooks, and the full catalog of 16 Antigravity skills — is open-source under the MIT license:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/rodrigodosanjosoliveira/pipeline-ai" rel="noopener noreferrer"&gt;rodrigodosanjosoliveira/pipeline-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How are you handling governance and guardrails for autonomous coding agents in your workflows? Let's discuss in the comments below! 💬👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>go</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The AI Bottleneck Isn't Generating Code — It's Governing It</title>
      <dc:creator>Rodrigo Oliveira</dc:creator>
      <pubDate>Fri, 16 Oct 2026 19:17:17 +0000</pubDate>
      <link>https://dev.to/rodrigodosanjosoliveira/the-ai-bottleneck-isnt-generating-code-its-governing-it-147j</link>
      <guid>https://dev.to/rodrigodosanjosoliveira/the-ai-bottleneck-isnt-generating-code-its-governing-it-147j</guid>
      <description>&lt;p&gt;Anyone who has given autonomous AI coding agents (Claude, Devin, Antigravity, or Copilot Workspace) free rein in a production repository knows the uneasy feeling: in one minute, the agent writes a brilliant algorithm; in the next, it touches an unrelated file, rewrites your &lt;code&gt;go.mod&lt;/code&gt;, hallucinates non-existent unit tests, and tries to commit directly to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The industry is beginning to recognize a fundamental truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The real bottleneck in AI-assisted software engineering isn't token speed or code generation. It is the ability to verify, constrain, and deterministically govern what gets generated.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;During my postgraduate studies in &lt;strong&gt;Applied AI Engineering&lt;/strong&gt;, I set out to turn this recurring friction into an industrial software engineering standard: &lt;strong&gt;Pipeline-AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, I will break down how we built a deterministic, zero-trust multi-agent workflow powered by &lt;strong&gt;Go 1.24 OS lifecycle hooks&lt;/strong&gt;, strict TDD, and role specialization integrated natively into the &lt;strong&gt;Google Antigravity&lt;/strong&gt; ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trap: Why "Prompt Engineering" Fails at Governance
&lt;/h2&gt;

&lt;p&gt;The naive way to control an AI agent is to append natural language constraints to its prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Please do not modify files outside of &lt;code&gt;internal/user/&lt;/code&gt;, and never commit directly to main."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This fails because of a mathematical reality: &lt;strong&gt;LLMs are probabilistic, but software engineering requires deterministic guarantees.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If an LLM has a 1% chance of ignoring an instruction under a dense context window or deep reasoning tree, that 1% &lt;em&gt;will&lt;/em&gt; manifest in your release branch. Governance cannot live inside the agent's prompt — it must live in the &lt;strong&gt;execution environment&lt;/strong&gt; (at the operating system level).&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Zero-Trust Defense: OS Lifecycle Hooks (&lt;code&gt;PreToolUse&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Our first architectural decision was enforcing the principle of least privilege: &lt;strong&gt;the main interactive chat session is physically prohibited from editing code directly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Antigravity provides native lifecycle hooks, notably the &lt;strong&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/strong&gt; event. Whenever an agent invokes a file modification tool (&lt;code&gt;write_to_file&lt;/code&gt;, &lt;code&gt;replace_file_content&lt;/code&gt;), the hook intercepts the request &lt;strong&gt;before a single byte is touched on disk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We built &lt;code&gt;pipeline-hook&lt;/code&gt;, a statically compiled Go 1.24 binary with zero external dependencies (stdlib only). It intercepts the JSON payload on &lt;code&gt;stdin&lt;/code&gt;, identifies which subagent is executing, and checks the target file against project guardrails:&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;// Simplified interception logic from pipeline-hook in Go&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Writer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hookInput&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&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;replyAllow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Intercept disk mutation attempts&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;editTools&lt;/span&gt;&lt;span class="p"&gt;[&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;ToolName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;:=&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;FilePath&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c"&gt;// Check against protected paths defined in .pipeline-ai.json&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsProtected&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="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsEditorAgent&lt;/span&gt;&lt;span class="p"&gt;(&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;AgentType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&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;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"BLOCKED: Agent '%s' is not authorized to edit '%s'. "&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"Only authorized agents [%s] can modify this directory."&lt;/span&gt;&lt;span class="p"&gt;,&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;AgentType&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="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EditorAgents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;// Emits JSON {"decision": "deny", "reason": "..."} to stdout with exit 0&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;replyDeny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&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="n"&gt;replyAllow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&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;If a product triage agent or an unauthorized session attempts to modify &lt;code&gt;internal/auth/token.go&lt;/code&gt;, the OS hook immediately halts the call with &lt;code&gt;decision: deny&lt;/code&gt;. There is no prompting negotiation: &lt;strong&gt;the tool call is blocked at the system boundary.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The 16-Skill Pipeline: Specialization vs. Monolithic Agents
&lt;/h2&gt;

&lt;p&gt;A common anti-pattern is relying on a "do-it-all" agent. Asking a single prompt to understand business requirements, architect database schemas, write unit tests, implement the code, and review diffs results in massive context drift and shallow reasoning.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Pipeline-AI&lt;/strong&gt;, we decomposed the software development lifecycle into &lt;strong&gt;16 specialized skills&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. pm-triage              → Classifies scope, tags DEL-ID, identifies technical requirements
2. architecture-guardrails → Establishes technical boundaries and invariant locks
3. [data-model]           → Designs schemas &amp;amp; entities (PostgreSQL, Mongo, DynamoDB)
4. test-writer            → Authors table-driven tests and fuzz targets (Red phase)
5. dev-implementation     → Implements code strictly until tests pass (Green phase)
6. code-reviewer          → Audits diffs separating hard blockers from suggestions
7. [migration-reviewer]   → Validates DDL idempotency, locks, and rollback safety
8. [security-review]      → Automatically triggered when auth, crypto, or storage is touched
9. [supply-chain-review]  → Audits go.mod changes and invokes govulncheck
10. qa-validation         → Executes the full test suite and validates project invariants
11. [release-ops]         → Handles SemVer, manifests, and deployment readiness
12. docs-update           → Compiles the audited delivery report with diff evidence
13. git-delivery          → Creates isolated branch, conventional commit, and Pull Request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Brackets denote optional modules activated via configuration).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each agent has clear boundaries: the &lt;code&gt;code-reviewer&lt;/code&gt; has read-only permissions and cannot edit code; the &lt;code&gt;dev-implementation&lt;/code&gt; agent only begins working after &lt;code&gt;test-writer&lt;/code&gt; has committed failing tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Strict TDD as the Antidote to Hallucinations
&lt;/h2&gt;

&lt;p&gt;The single best specification for an LLM is a failing unit test:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Red:&lt;/strong&gt; The &lt;code&gt;test-writer&lt;/code&gt; agent receives the architectural guardrails and writes comprehensive table-driven tests using Go's standard &lt;code&gt;testing&lt;/code&gt; package. It runs &lt;code&gt;go test ./...&lt;/code&gt; and &lt;strong&gt;proves the failure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Green:&lt;/strong&gt; The &lt;code&gt;dev-implementation&lt;/code&gt; agent takes over. Its job is not to guess user intent or speculate on future features — its sole goal is to &lt;strong&gt;make the tests pass&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refactor &amp;amp; Format:&lt;/strong&gt; When &lt;code&gt;go test -race ./...&lt;/code&gt; is green and &lt;code&gt;gofmt&lt;/code&gt; formats the code automatically via &lt;code&gt;PostToolUse&lt;/code&gt; hooks, implementation stops. Zero dead code, zero scope creep.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. The Delivery Gatekeeper: &lt;code&gt;pipeline-validate&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Before any Pull Request is created, our custom validator verifies the delivery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go tool pipeline-validate docs-ai/deliveries/DEL-011/report.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The validator automatically rejects the delivery if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checklist tasks remain unchecked.&lt;/li&gt;
&lt;li&gt;The delivery report contains unresolved markers (&lt;code&gt;TODO&lt;/code&gt;, &lt;code&gt;FIXME&lt;/code&gt;, &lt;code&gt;TBD&lt;/code&gt;, filler text).&lt;/li&gt;
&lt;li&gt;The real &lt;code&gt;git diff&lt;/code&gt; touches security-sensitive files (&lt;code&gt;security_surface_paths&lt;/code&gt;) without an explicitly approved security audit section.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the gatekeeper fails, Git delivery is aborted. The PR cannot be opened.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Real-World Case Study: Desktop Go + SQLite
&lt;/h2&gt;

&lt;p&gt;We validated this pipeline in an active desktop application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero CGO Invariant:&lt;/strong&gt; The pipeline enforced that no external dependencies broke cross-compilation from Linux/WSL2 to Windows, producing a standalone 37MB executable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proactive Security:&lt;/strong&gt; When an agent modified &lt;code&gt;internal/storage/sqlite/&lt;/code&gt;, the pipeline automatically flagged a security surface touch, enforcing parameterized queries (SQL injection prevention) and passing &lt;code&gt;govulncheck&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Protection:&lt;/strong&gt; Direct pushes to &lt;code&gt;main&lt;/code&gt; were blocked locally by &lt;code&gt;.githooks/pre-push&lt;/code&gt; and remotely by GitHub Rulesets. All deliverables reached production via clean, squashed PRs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaways for Applied AI Engineers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat AI agents like hyper-fast junior engineers with terminal access:&lt;/strong&gt; Give them powerful tools, but isolate them with deterministic OS hooks and comprehensive test suites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism beats probability:&lt;/strong&gt; Whenever possible, replace natural language prompting with compiled CLI gates (&lt;code&gt;go tool&lt;/code&gt;) and static linters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role specialization minimizes context degradation:&lt;/strong&gt; Smaller agents with surgical scopes consume fewer tokens, make fewer mistakes, and are dramatically easier to audit.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Open Source
&lt;/h3&gt;

&lt;p&gt;The complete toolkit — including the &lt;code&gt;pipeline-init&lt;/code&gt; scaffolding CLI, Go hooks, and the full catalog of 16 Antigravity skills — is open-source under the MIT license:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/rodrigodosanjosoliveira/pipeline-ai" rel="noopener noreferrer"&gt;rodrigodosanjosoliveira/pipeline-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How are you handling governance and guardrails for autonomous coding agents in your workflows? Let's discuss in the comments below! 💬👇&lt;/p&gt;

</description>
      <category>go</category>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>programming</category>
    </item>
    <item>
      <title>Reducing Garbage Collector Pressure in Golang</title>
      <dc:creator>Rodrigo Oliveira</dc:creator>
      <pubDate>Sun, 26 Jan 2025 18:09:40 +0000</pubDate>
      <link>https://dev.to/rodrigodosanjosoliveira/reducing-garbage-collector-pressure-in-golang-1606</link>
      <guid>https://dev.to/rodrigodosanjosoliveira/reducing-garbage-collector-pressure-in-golang-1606</guid>
      <description>&lt;p&gt;In high-performance Go applications, excessive memory allocations and deallocations can significantly impact performance. This creates unnecessary pressure on the Garbage Collector (GC), resulting in higher latency and reduced efficiency. This article will teach you how to reduce GC pressure using object reuse techniques and the &lt;code&gt;sync.Pool&lt;/code&gt; feature.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Inspiration for this article came from a post on LinkedIn by &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7289182784424697856/" rel="noopener noreferrer"&gt;Branko Pitulic&lt;/a&gt;, which highlighted the importance of optimizing memory usage in Go applications.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Understanding the Problem&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Go's Garbage Collector is responsible for automatic memory management. However, when an application frequently allocates and deallocates memory (especially in the heap), the GC has to work harder, leading to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased CPU usage;&lt;/li&gt;
&lt;li&gt;Execution pauses during GC cycles;&lt;/li&gt;
&lt;li&gt;Performance bottlenecks in low-latency systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to reduce the number of objects allocated on the heap by promoting memory reuse.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Techniques to Reduce GC Pressure&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.1 Reusing Objects&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Where possible, reuse objects instead of creating new ones. A common pattern is reusing slices and arrays.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Practice:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Creates a new slice every time.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Good Practice:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&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;buffer&lt;/span&gt; &lt;span class="c"&gt;// Reuses the existing slice.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This approach works well in non-concurrent contexts where reuse is safe.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2.2 Using &lt;code&gt;sync.Pool&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;sync&lt;/code&gt; package provides the &lt;code&gt;Pool&lt;/code&gt; type, which is an efficient structure for pooling objects, enabling reuse. This reduces memory allocations on the heap.&lt;/p&gt;

&lt;h4&gt;
  
  
  How &lt;code&gt;sync.Pool&lt;/code&gt; Works:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Objects can be stored in the pool after use.&lt;/li&gt;
&lt;li&gt;When a new object is needed, the pool is checked before allocating memory.&lt;/li&gt;
&lt;li&gt;If the pool is empty, a new object is created.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Basic Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"sync"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Creating a pool of objects.&lt;/span&gt;
    &lt;span class="n"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Creates a new 1 KB slice.&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Retrieving an object from the pool.&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Buffer length: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&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;buffer&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c"&gt;// Reusing the object by putting it back into the pool.&lt;/span&gt;
    &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Retrieving another object from the pool.&lt;/span&gt;
    &lt;span class="n"&gt;reusedBuffer&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Reused buffer length: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&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;reusedBuffer&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;In this example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;code&gt;sync.Pool&lt;/code&gt; is created with a &lt;code&gt;New&lt;/code&gt; function to initialize objects.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Get&lt;/code&gt; is used to retrieve objects from the pool.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Put&lt;/code&gt; is used to return objects to the pool for reuse.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Best Practices for Using &lt;code&gt;sync.Pool&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight Objects&lt;/strong&gt;: Pools are ideal for small or medium-sized objects. For large objects, storage costs may outweigh the benefits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency&lt;/strong&gt;: &lt;code&gt;sync.Pool&lt;/code&gt; is safe for use in multiple goroutines, though performance may vary under heavy load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Initialization&lt;/strong&gt;: Always define a &lt;code&gt;New&lt;/code&gt; function in the pool to ensure proper object creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid Overusing Pools&lt;/strong&gt;: Use pools only for objects that are frequently reused.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Common Use Cases&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.1 Buffer Pooling for Read/Write Operations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Applications with heavy read/write operations (e.g., HTTP servers or message processors) can reuse buffers efficiently.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"bytes"&lt;/span&gt;
    &lt;span class="s"&gt;"sync"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bufferPool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&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;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;bufferPool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// Clear the buffer before use.&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;bufferPool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processed: "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&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;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&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;h3&gt;
  
  
  &lt;strong&gt;4.2 Struct Reuse&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If your application frequently creates and discards structs, &lt;code&gt;sync.Pool&lt;/code&gt; can help.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"sync"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt;      &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;Payload&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;requestPool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handleRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;requestPool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;requestPool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Handling request ID=%d with payload=%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;handleRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;handleRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data2"&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;h2&gt;
  
  
  &lt;strong&gt;5. Final Considerations&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Using &lt;code&gt;sync.Pool&lt;/code&gt; can significantly improve application performance, particularly in high-throughput scenarios. However:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid premature optimizations. Before adopting &lt;code&gt;sync.Pool&lt;/code&gt;, ensure GC is a real bottleneck by analyzing performance with tools like &lt;strong&gt;pprof&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Combine pool usage with general best practices, such as reducing variable scope and using slices or arrays efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding and applying these techniques will help you build more efficient and scalable systems in Go.&lt;/p&gt;




&lt;p&gt;If you have questions or want more advanced examples, feel free to ask! 🚀&lt;/p&gt;

</description>
      <category>programming</category>
      <category>go</category>
      <category>coding</category>
      <category>performance</category>
    </item>
    <item>
      <title>I completed Hacktoberfest</title>
      <dc:creator>Rodrigo Oliveira</dc:creator>
      <pubDate>Mon, 01 Nov 2021 04:41:56 +0000</pubDate>
      <link>https://dev.to/rodrigodosanjosoliveira/i-completed-hacktoberfest-3jb3</link>
      <guid>https://dev.to/rodrigodosanjosoliveira/i-completed-hacktoberfest-3jb3</guid>
      <description>&lt;p&gt;It's never too late to start. My first Hacktoberfest, after more than 10 years of career.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Contribute and unlock your domain</title>
      <dc:creator>Rodrigo Oliveira</dc:creator>
      <pubDate>Thu, 14 Oct 2021 00:40:04 +0000</pubDate>
      <link>https://dev.to/rodrigodosanjosoliveira/contribute-and-unlock-your-domain-3lng</link>
      <guid>https://dev.to/rodrigodosanjosoliveira/contribute-and-unlock-your-domain-3lng</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Unlock your first PR&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Being productive while following the best software development practices has been one of the greatest challenges for developers. Today I can say that with &lt;a href="https://herbsjs.org" rel="noopener noreferrer"&gt;HerbsJS&lt;/a&gt; this challenge becomes much easier.&lt;/p&gt;

&lt;p&gt;Using and contributing to the project, in addition to participating in a vibrant community, I've been putting into practice building software that delivers value and focuses on what really matters: the domain.&lt;/p&gt;

&lt;p&gt;The pillars of HerbsJS are Domain First, creating microservices in Node.js with DDD, Clean Architecture, Authorization and auditing available even for simple applications.&lt;/p&gt;

&lt;p&gt;I invite you to break this barrier. Take advantage of Hacktoberfest, visit the HerbsJS website, and contribute to a project that in essence elevates the developer level and enables you to build quality software.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Links&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HerbsJS have a CLI to help &lt;a href="https://herbsjs.org/docs/tutorial/new-project#with-herbs-cli" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let's talk on the &lt;a href="https://discord.com/invite/e3cQ66KDv5" rel="noopener noreferrer"&gt;HerbsJS discord&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are looking forward to your PRs. Let's code: &lt;a href="https://github.com/herbsjs" rel="noopener noreferrer"&gt;HerbsJS Github&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>unlockyourdomain</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
