<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Perception &amp; Engineering</title>
<link>https://noefontana.github.io/</link>
<atom:link href="https://noefontana.github.io/index.xml" rel="self" type="application/rss+xml"/>
<description>Technical notes on Perception, ML, and Engineering Leadership.</description>
<generator>quarto-1.8.27</generator>
<lastBuildDate>Sat, 07 Mar 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Vibe-Coding Perception Pipelines Without Losing Control</title>
  <dc:creator>Noé Fontana</dc:creator>
  <link>https://noefontana.github.io/posts/2026-03-07-vibe-coding-pipelines/</link>
  <description><![CDATA[ 




<p>This post details the evaluation infrastructure and architectural guardrails required to safely vibe-code (ship functional code without reading it) a high-performance classical perception pipeline and how to keep development velocity from stalling under review and regression load. locus-tag and render-tag, personal projects built to explore these ideas, serve as the concrete case study.</p>
<section id="the-system-under-test-locus-tag" class="level1" data-number="1">
<h1 data-number="1"><span class="header-section-number">1</span> The System Under Test: locus-tag</h1>
<p><a href="https://github.com/NoeFontana/locus-tag">locus-tag</a> is a high-performance fiducial marker detector written in Rust, with Python bindings for robotics integration. It must simultaneously satisfy three competing constraints: latency, recall, and corner RMSE. The pipeline is broken down in the Pipeline Diagram.</p>
<table class="caption-top table">
<caption>Performance comparison of <code>locus-tag</code> against AprilTag 3 benchmarks.</caption>
<colgroup>
<col style="width: 40%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">Detector</th>
<th style="text-align: center;">Recall</th>
<th style="text-align: center;">corner RMSE</th>
<th style="text-align: center;">Latency (1080p)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><strong>Locus (Soft)</strong></td>
<td style="text-align: center;">93.16%</td>
<td style="text-align: center;">0.26 px</td>
<td style="text-align: center;">77.2 ms</td>
</tr>
<tr class="even">
<td style="text-align: left;">Locus (Hard)</td>
<td style="text-align: center;">74.35%</td>
<td style="text-align: center;">0.24 px</td>
<td style="text-align: center;">58.3 ms</td>
</tr>
<tr class="odd">
<td style="text-align: left;">AprilTag 3</td>
<td style="text-align: center;">62.34%</td>
<td style="text-align: center;">0.22 px</td>
<td style="text-align: center;">105.9 ms</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>Latency:</strong> Time to process a full frame.</li>
<li><strong>Recall:</strong> Share of tags detected in the scene.</li>
<li><strong>Corner RMSE:</strong> Sub-pixel accuracy of detected corner positions.</li>
</ul>
</section>
<section id="why-textual-rules-dont-scale-velocity" class="level1" data-number="2">
<h1 data-number="2"><span class="header-section-number">2</span> Why Textual Rules Don’t Scale Velocity</h1>
<p>Textual instructions (<code>AGENTS.md</code>, custom skills, and spec-driven development) effectively multiply raw code generation, but this acceleration rapidly breaks down in complex systems.</p>
<p><strong>Context engineering is fundamentally open-loop.</strong> Relying on an agent’s context window to enforce architectural constraints creates a hard ceiling:</p>
<ul>
<li><strong>Complexity Growth:</strong> As the system grows, it outpaces the agent’s working memory.</li>
<li><strong>Context Retention:</strong> Limits on retention lead to fragmented implementations.</li>
<li><strong>Technical Debt:</strong> Regressions compound silently in regions where neither human nor agent retains full context.</li>
</ul>
<p>To prevent development from stalling, we must transition from writing passive textual rules to building <strong>active, programmatic evaluation</strong>.</p>
</section>
<section id="ci-the-last-line-of-defense" class="level1" data-number="3">
<h1 data-number="3"><span class="header-section-number">3</span> CI: The Last Line of Defense</h1>
<p>To fully leverage parallel AI agents, we must grant them sweeping permissions: the ability to traverse filesystems, rewrite build systems, execute scripts, and autonomously push changes. This creates a development “Wild West.”</p>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Warning</span>Soft guardrails are not enough
</div>
</div>
<div class="callout-body-container callout-body">
<p><code>AGENTS.md</code> and custom skills are merely soft guardrails—suggestions, too easily discarded when an agent optimizes for immediate task completion or hits its context limit.</p>
</div>
</div>
<p><strong>Continuous Integration must serve as the immutable line of defense.</strong></p>
<p>The primary failure mode of long-horizon reasoning models is <strong>execution drift</strong>: over extended coding sessions, agents inevitably shortcut standard practices, bypassing linters, type checkers, and test suites to force a compiling solution.</p>
<p>By enforcing strict, automated quality gates, CI guarantees that the main branch remains stable, preserving high-performance standards despite massive LLM-driven refactors.</p>
</section>
<section id="the-integration-north-star-validating-the-physical-contract" class="level1" data-number="4">
<h1 data-number="4"><span class="header-section-number">4</span> The Integration North Star: Validating the Physical Contract</h1>
<p>In an agentic workflow, unit tests become a fragile liability. LLMs refactor aggressively and frequently break internal test signatures even when the mathematical output is correct.</p>
<p>To maintain velocity, we shift focus to a <strong>“North Star”</strong>: a high-level integration suite that validates outcomes independently of implementation details. For <code>locus-tag</code>, the contract is: <strong>raw pixels go in, accurate detections come out.</strong></p>
<p>The E2E suite evaluates three pillars:</p>
<ol type="1">
<li><strong>Functional Robustness:</strong> We treat the pipeline as a black box, feeding it external datasets (such as those generated by <code>render-tag</code>, our synthetic oracle).</li>
<li><strong>Key Metric Evaluation:</strong> Performance is a first-class feature. E2E tests track latency, recall, and corner RMSE against established snapshots.</li>
<li><strong>Pragmatic CI:</strong> Ideally, every PR would trigger full regression testing. In practice, cost constrains this to a tiered strategy: lightweight snapshot tests run on every push; resource-intensive benchmarks run selectively before major releases.</li>
</ol>
</section>
<section id="the-architect-outcome-and-outlook-reviewing-systems-not-syntax" class="level1" data-number="5">
<h1 data-number="5"><span class="header-section-number">5</span> The Architect Outcome and Outlook: Reviewing Systems, Not Syntax</h1>
<p>Defining an E2E North Star sharpens the focus of the effective engineer’s role. Designing systems with observable contracts and verifying they hold under change has always been a core responsibility of Senior engineers. Agentic development simply makes this discipline pay off faster.</p>
<p>For <code>locus-tag</code>, this means enforcing a clean facade where raw pixels go in and precise corners come out, making the physical contract testable as a black box.</p>
<section id="takeaways" class="level3" data-number="5.0.1">
<h3 data-number="5.0.1" class="anchored" data-anchor-id="takeaways"><span class="header-section-number">5.0.1</span> Takeaways</h3>
<p>The bottleneck is no longer coding speed; agents handle that. It is the <strong>reliability of the infrastructure</strong> that validates each iteration without compounding review overhead. By investing in both system design and evaluation infrastructure, we can fearlessly scale complexity without losing control of it.</p>
</section>
</section>


<div id="quarto-appendix" class="default"><section id="architecture-deep-dive-the-physical-contract" class="level1 unnumbered appendix"><h2 class="anchored quarto-appendix-heading">Architecture Deep Dive: The Physical Contract</h2><div class="quarto-appendix-contents">

<p>The following diagram illustrates the execution flow within <code>locus-tag</code>. This structured pipeline is what allows us to treat the system as a “black box” for evaluation while maintaining extreme performance.</p>
<div class="cell" data-layout-align="default">
<div class="cell-output-display">
<div>
<p></p><figure class="figure"><p></p>
<div>
<pre class="mermaid mermaid-js">sequenceDiagram
    participant App as Application
    participant Det as Detector
    participant Thresh as ThresholdEngine
    participant Seg as Segmentation
    participant Quad as QuadExtraction
    participant Decode as Decoder
    participant Pose as PoseEstimation

    App-&gt;&gt;Det: detect(image)
    activate Det

    Note over Det: 0. Pre-allocation &amp; Upscaling
    Det-&gt;&gt;Det: Arena Reset

    Note over Det: 1. Preprocessing
    Det-&gt;&gt;Thresh: compute_integral_image()
    Det-&gt;&gt;Thresh: adaptive_threshold()
    Thresh--&gt;&gt;Det: Binarized Image

    Note over Det: 2. Segmentation
    Det-&gt;&gt;Seg: label_components()
    Note right of Seg: Union-Find (Flat Array)
    Seg--&gt;&gt;Det: Component Labels

    Note over Det: 3. Quad Extraction
    loop For each component
        Det-&gt;&gt;Quad: extract_quad()
        Quad-&gt;&gt;Quad: Contour Tracing
        Quad-&gt;&gt;Quad: Polygon Approx (Douglas-Peucker)
        Quad-&gt;&gt;Quad: Sub-pixel Refinement (Gradient)
    end
    Quad--&gt;&gt;Det: Quad Candidates

    Note over Det: 4. Decoding
    loop For each candidate
        Det-&gt;&gt;Decode: Homography Sampling
        Note right of Decode: Strategy: Hard (Bit) vs Soft (LLR)
        Decode-&gt;&gt;Decode: Bit/LLR Extraction (Bilinear)
        Decode-&gt;&gt;Decode: Error Correction (Hamming/Soft-ML)
    end

    Note over Det: 5. Pose Estimation (Optional)
    opt [If Intrinsics Provided]
        Det-&gt;&gt;Pose: estimate_tag_pose()
        alt [Mode = Fast]
            Pose-&gt;&gt;Pose: IPPE + LM (Geometric Error)
        else [Mode = Accurate]
            Pose-&gt;&gt;Pose: Structure Tensor (Corner Uncertainty)
            Pose-&gt;&gt;Pose: Weighted LM (Mahalanobis Distance)
        end
    end

    Det--&gt;&gt;App: Final Detections
    deactivate Det
</pre>
</div>
<p></p></figure><p></p>
</div>
</div>
</div>


</div></section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre class="sourceCode code-with-copy quarto-appendix-bibtex"><code class="sourceCode bibtex">@online{fontana2026,
  author = {Fontana, Noé},
  title = {Vibe-Coding {Perception} {Pipelines} {Without} {Losing}
    {Control}},
  date = {2026-03-07},
  url = {https://noefontana.github.io/posts/2026-03-07-vibe-coding-pipelines/},
  langid = {en}
}
</code></pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-fontana2026" class="csl-entry quarto-appendix-citeas">
Fontana, Noé. 2026. <span>“Vibe-Coding Perception Pipelines Without
Losing Control.”</span> March 7, 2026. <a href="https://noefontana.github.io/posts/2026-03-07-vibe-coding-pipelines/">https://noefontana.github.io/posts/2026-03-07-vibe-coding-pipelines/</a>.
</div></div></section></div> ]]></description>
  <category>perception</category>
  <category>robotics</category>
  <category>agentic-development</category>
  <category>vibe-coding</category>
  <category>engineering-leadership</category>
  <guid>https://noefontana.github.io/posts/2026-03-07-vibe-coding-pipelines/</guid>
  <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
