<?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: Refox Lee</title>
    <description>The latest articles on DEV Community by Refox Lee (@refoxai).</description>
    <link>https://dev.to/refoxai</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%2F4186265%2Fe9fada83-1c02-4e7d-b6b3-20b7f501e7c3.png</url>
      <title>DEV Community: Refox Lee</title>
      <link>https://dev.to/refoxai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/refoxai"/>
    <language>en</language>
    <item>
      <title>Why Your 3D Print Farm Loses Money on Spaghetti Scrap, and How I Fixed It With DigitalOcean, TabPFN, and Temporal</title>
      <dc:creator>Refox Lee</dc:creator>
      <pubDate>Sat, 17 Oct 2026 13:35:54 +0000</pubDate>
      <link>https://dev.to/refoxai/why-your-3d-print-farm-loses-money-on-spaghetti-scrap-and-how-i-fixed-it-with-digitalocean-4n5b</link>
      <guid>https://dev.to/refoxai/why-your-3d-print-farm-loses-money-on-spaghetti-scrap-and-how-i-fixed-it-with-digitalocean-4n5b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The 2 AM "Spaghetti" Nightmare of Every 3D Print Farm
&lt;/h3&gt;

&lt;p&gt;Running a desktop 3D printing farm (Bambu Lab, Voron, Prusa) is one of the most rewarding hardware side hustles today. You buy four or five CoreXY machines, put them on metal shelves in your garage or spare bedroom, and accept custom print orders from local drone hobbyists, cosplayers, and engineering students.&lt;/p&gt;

&lt;p&gt;Last month, a client sent me an STL file for a drone arm. He wanted four units printed in PETG by Friday. I sliced the mesh in OrcaSlicer, saw a net material estimate of 48 grams per unit, added a 40% markup, and sent him an invoice for $18.&lt;/p&gt;

&lt;p&gt;At 2:15 AM, disaster struck.&lt;/p&gt;

&lt;p&gt;The cantilever overhang detached from the bed on layer 340. The extruder continued spewing molten plastic into thin air for seven hours. When I walked into the room the next morning, I found a tangled bird's nest of ruined filament fused around the hotend, accompanied by a bent heatbreak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected Profit on 4x Drone Arms:     + $12.40
Filament Destroyed (190g wasted):     -  $4.18
Electricity &amp;amp; Machine Depreciation:   -  $6.30
Replacement Ceramic Hotend:           - $14.50
-----------------------------------------------
Net Loss on the Job:                  - $12.58
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single scrap failure wiped out the profits from my entire week of printing. &lt;/p&gt;

&lt;p&gt;When you run a physical manufacturing side hustle, &lt;strong&gt;scrap risk is your single largest silent killer&lt;/strong&gt;. Traditional slicers tell you nominal print times. Invoicing software tells you what you billed in the past. Neither can inspect an arbitrary 3D triangular mesh and tell you the Bayesian probability that your print will fail before you start heating the bed.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;PrintPulse&lt;/strong&gt; to solve this problem.&lt;/p&gt;

&lt;p&gt;PrintPulse is an autonomous operational intelligence and quoting agent tailored for desktop 3D print farms. &lt;/p&gt;

&lt;p&gt;You drag and drop an unknown binary STL model into PrintPulse. Within seconds, it runs a multi-stage autonomous evaluation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Geometry Extraction (0.23 ms)&lt;/strong&gt;: Parses raw binary triangles directly to extract physical bounding boxes, signed tetrahedron volume, downward overhang surface areas (&amp;gt;45 degrees), and bed adhesion slenderness indices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prior Labs TabPFN-3.5 Tabular Inference (5.43 ms)&lt;/strong&gt;: Feeds physical geometry metrics into Prior Labs TabPFN-3.5 (Tabular Prior-data Fitted Network), performing in-context learning on a 50-record physical print failure dataset to obtain calibrated failure probabilities and support material recommendations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DigitalOcean Serverless Inference (Google Gemma 4 31B)&lt;/strong&gt;: Synthesizes machine depreciation, material costs, and calibrated scrap risk buffers into an itemized quote, generating custom slicer override directives (Gyroid infill density, cooling profiles, and mandatory brim thresholds).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal Durable Workflow &amp;amp; Saga Engine&lt;/strong&gt;: Orchestrates the entire pipeline across 5 activities. If cloud endpoints or slicer workers hiccup, Temporal handles automatic retries. When a high-scrap risk model (&amp;gt;70%) is identified, Temporal triggers a Saga compensating transaction to release reserved filament spools back to the inventory ledger.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Interactive 3D WebGL Dashboard&lt;/strong&gt;: &lt;a href="https://li-qifeng.github.io/printpulse/" rel="noopener noreferrer"&gt;https://li-qifeng.github.io/printpulse/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Features real-time Three.js mesh rotation, dynamic TabPFN risk gauges, itemized quotation breakdowns, and live slicer directives.&lt;/li&gt;
&lt;/ul&gt;

&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%2Fghj2vpogu5p71rr6qmcd.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%2Fghj2vpogu5p71rr6qmcd.png" alt="PrintPulse Cover" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/Li-Qifeng/printpulse" rel="noopener noreferrer"&gt;https://github.com/Li-Qifeng/printpulse&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT License (Open Source)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility&lt;/strong&gt;: 13/13 automated pytest tests passing (&lt;code&gt;pytest&lt;/code&gt; runs cleanly out of the box).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The architecture separates deterministic physical arithmetic from tabular foundation models, large language reasoning, and durable workflow execution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  [ Customer Binary STL Model (e.g. drone_arm.stl) ]
                                          │
                                          ▼
┌───────────────────────────────────────────────────────────────────────────────────┐
│ 1. Deterministic Geometry Extractor (src/stl_analyzer.py)                          │
│    - 0.23ms direct binary mesh parsing (69,800+ triangles/sec)                    │
│    - Computes signed tetrahedron volume, overhang ratio (&amp;gt;45°), &amp;amp; slenderness     │
└─────────────────────────────────────────┬─────────────────────────────────────────┘
                                          │
                                          ▼
┌───────────────────────────────────────────────────────────────────────────────────┐
│ 2. Prior Labs TabPFN-3.5 Tabular Foundation Model (src/tabpfn_predictor.py)       │
│    - In-context learning on 50-item physical 3D print failure reference dataset   │
│    - Integrated with tabpfn-client &amp;amp; Prior Labs cloud endpoint                    │
│    - Returns Failure Probability %, 95% Credible Interval &amp;amp; Support Grams (5.4ms) │
└─────────────────────────────────────────┬─────────────────────────────────────────┘
                                          │
                                          ▼
┌───────────────────────────────────────────────────────────────────────────────────┐
│ 3. DigitalOcean Serverless Inference (src/do_quoting_agent.py)                    │
│    - Powered by Google Gemma 4 (gemma-4-31B-it) on inference.do-ai.run           │
│    - Synthesizes risk buffer ($) + machine depreciation into customer quote       │
│    - Emits slicer directives: Gyroid infill %, cooling fan speed &amp;amp; brim overrides│
└─────────────────────────────────────────┬─────────────────────────────────────────┘
                                          │
                                          ▼
┌───────────────────────────────────────────────────────────────────────────────────┐
│ 4. Temporal Durable Workflow &amp;amp; Saga Engine (src/temporal_workflow.py)             │
│    - 5 Activities: Parse, TabPFN, DigitalOcean, Reserve Spool, Release Spool      │
│    - Automatic exponential backoff retries &amp;amp; Saga compensating transactions       │
│    - When risk &amp;gt; 70%, Saga automatically compensates/releases the spool ledger    │
└───────────────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. DigitalOcean Serverless Inference (Google Gemma 4 31B)
&lt;/h3&gt;

&lt;p&gt;For an independent side hustle, paying $150 to $200 every month for a dedicated cloud GPU instance to host an internal agent is financially impossible. &lt;/p&gt;

&lt;p&gt;I deployed Google Gemma 4 (&lt;code&gt;gemma-4-31B-it&lt;/code&gt;) using &lt;strong&gt;DigitalOcean Serverless Inference&lt;/strong&gt; (&lt;code&gt;https://inference.do-ai.run/v1/chat/completions&lt;/code&gt;). &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Idle Costs&lt;/strong&gt;: When no orders arrive, my infrastructure cost is exactly $0.00.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise-Grade Reasoning&lt;/strong&gt;: Rather than running a tiny 2B model that hallucinates pricing mathematics, DigitalOcean Serverless Inference runs the full 31B parameter model with low latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Output&lt;/strong&gt;: Gemma-4 analyzes the physical geometry and TabPFN risk profile, automatically generating production reports:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**PRINTPULSE OPERATIONAL INTELLIGENCE REPORT**
Case ID: OB-802050-PETG | Quoted Price: $8.98
Decision: CONDITIONAL REVIEW (TabPFN Failure Risk: 64.4%)

Mandatory Slicer Directives:
• Infill Configuration: Switch to Gyroid (15-20%) for isotropic strength and internal stress relief.
• Support Interface Density: Set to 40% with a 0.2mm Z-gap interface.
• Thermal Profile: Reduce part cooling fan to 30-50% for initial layers; maintain chamber at 45°C.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Prior Labs TabPFN-3.5 (Tabular Foundation Model)
&lt;/h3&gt;

&lt;p&gt;Most developers try to solve engineering estimation by shoving raw numbers into an LLM prompt. LLMs frequently fail at multi-variable numerical regression, producing erratic numbers.&lt;/p&gt;

&lt;p&gt;Prior Labs TabPFN-3.5 is trained on synthetic tabular datasets to act as a universal Bayesian in-context predictor. I assembled a curated reference dataset of 50 physical 3D prints (&lt;code&gt;models/reference_print_dataset.csv&lt;/code&gt;) capturing exact geometric metrics (volume, overhang ratio, slenderness, thermal warping coefficients, and support volume) paired with real print outcomes.&lt;/p&gt;

&lt;p&gt;When a customer submits a new mesh, PrintPulse passes structured numerical vectors directly into TabPFN. TabPFN produces calibrated failure probabilities and 95% Bayesian credible intervals in &lt;strong&gt;5.43 milliseconds&lt;/strong&gt;, allowing PrintPulse to price the exact risk buffer required to protect farm margins.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Temporal Durable Workflows &amp;amp; Saga Compensation
&lt;/h3&gt;

&lt;p&gt;Physical manufacturing workflows must never drop state. If a client submits a batch order and the quoting microservice crashes halfway through, an operator could start printing an unreserved spool or miss a high-scrap warning.&lt;/p&gt;

&lt;p&gt;Using the Python Temporal SDK (&lt;code&gt;temporalio&lt;/code&gt;), PrintPulse wraps every phase into an isolated, durable Activity across five operations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;parse_stl_activity&lt;/code&gt; (Timeout: 15s, Max Retries: 3)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;predict_scrap_risk_activity&lt;/code&gt; (Timeout: 15s, Max Retries: 3)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generate_quote_activity&lt;/code&gt; (Timeout: 35s, Max Retries: 3)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reserve_spool_inventory_activity&lt;/code&gt; (Timeout: 10s, Max Retries: 3)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;release_spool_reservation_activity&lt;/code&gt; (Timeout: 10s, Max Retries: 3)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Temporal guarantees that if the DigitalOcean inference endpoint experiences a momentary network drop, the workflow automatically backs off and retries without corrupting inventory state. Crucially, when a model exhibits severe risk (&amp;gt;70%), Temporal executes a &lt;strong&gt;Saga Compensating Transaction&lt;/strong&gt;: it automatically dispatches &lt;code&gt;release_spool_reservation_activity&lt;/code&gt; to deallocate the reserved filament spool before setting the job state to &lt;code&gt;REVIEW_REQUIRED_HIGH_SCRAP&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Empirical Benchmarks &amp;amp; Real Performance
&lt;/h2&gt;

&lt;p&gt;I benchmarked PrintPulse across automated evaluations on a clean Linux environment (CPython 3.11). Here are the measured results:&lt;/p&gt;

&lt;h3&gt;
  
  
  STL Binary Parsing Engine
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Measured Value&lt;/th&gt;
&lt;th&gt;Unit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Test Runs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;evaluations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mean Parse Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.23&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ms / model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P95 Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.358&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P99 Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.109&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Geometric Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;69,828&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;triangles / second&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  TabPFN-3.5 Tabular Material Calibration (&lt;code&gt;overhang_bracket.stl&lt;/code&gt;, 32cm³)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Material&lt;/th&gt;
&lt;th&gt;Thermal Shrinkage Factor&lt;/th&gt;
&lt;th&gt;TabPFN Scrap Risk (%)&lt;/th&gt;
&lt;th&gt;Risk Tier&lt;/th&gt;
&lt;th&gt;Support Mass Allocation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PLA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.05 (Minimal)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MODERATE&lt;/td&gt;
&lt;td&gt;16.07g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PETG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.12 (Moderate)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MODERATE&lt;/td&gt;
&lt;td&gt;16.46g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ABS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.45 (Severe Warping)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;56.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;13.48g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PA-CF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.20 (Carbon Fiber)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;53.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MODERATE&lt;/td&gt;
&lt;td&gt;17.88g&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice the monotonicity: TabPFN correctly scales the failure risk upward as material thermal shrinkage increases from PLA to ABS.&lt;/p&gt;

&lt;h3&gt;
  
  
  DigitalOcean Serverless Inference (Gemma 4 31B)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint&lt;/strong&gt;: &lt;code&gt;https://inference.do-ai.run/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Round-Trip Latency&lt;/strong&gt;: 10.26 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average Output Completeness&lt;/strong&gt;: 235 words / response&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly Fixed Server Cost&lt;/strong&gt;: &lt;strong&gt;$0.00&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Temporal Durable Workflow Engine
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Saga Compensation&lt;/strong&gt;: Verified automatic state reversal for critical scrap geometries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution Reliability&lt;/strong&gt;: 100% state recovery across simulated network delays&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Protecting Proprietary CAD IP Under NDAs&lt;/strong&gt;:
When clients order custom drone arms, robotics mounts, or prototype consumer devices, they are handing over proprietary CAD geometry before product launch. Sending complete raw meshes into closed corporate clouds with unclear training policies violates client NDAs. With local deterministic parsing, Prior Labs TabPFN tabular vectors, and open-weight Gemma on DigitalOcean Serverless Inference, the client CAD file never leaves developer control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unlocking Micro-Enterprise Economics&lt;/strong&gt;:
Closed proprietary AI APIs charge heavy markups and impose arbitrary throttling. A hardware side hustle quoting 20 jobs a day cannot burn $150+ a month on cloud GPU instances or API bills. Open-weight models on serverless pay-per-token infrastructure bring inference costs to fractions of a cent, enabling solo makers to operate with enterprise-grade intelligence.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of DigitalOcean ($200)&lt;/strong&gt;: Deploys Google Gemma 4 (&lt;code&gt;gemma-4-31B-it&lt;/code&gt;) via DigitalOcean Serverless Inference (&lt;code&gt;https://inference.do-ai.run/v1/chat/completions&lt;/code&gt;). Generates automated manufacturing quotations and physical slicer directives (Gyroid infill, cooling fan profiles, bed adhesion brim thresholds) at $0 idle cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN ($200)&lt;/strong&gt;: Integrates Prior Labs TabPFN-3.5 foundation model (&lt;code&gt;tabpfn-client&amp;gt;=0.6.1&lt;/code&gt; and &lt;code&gt;tabpfn&amp;gt;=9.2.0&lt;/code&gt;). Learns in-context from a 50-record physical 3D print failure dataset (&lt;code&gt;models/reference_print_dataset.csv&lt;/code&gt;) to produce calibrated Bayesian failure probability %, risk tiers, and 95% credible intervals in 5.43 ms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Temporal ($100)&lt;/strong&gt;: Orchestrates the entire pipeline using the Temporal Python SDK (&lt;code&gt;temporalio&lt;/code&gt;) across 5 activities with exponential retry policies, execution durability, and a genuine &lt;strong&gt;Saga Compensating Transaction&lt;/strong&gt; (&lt;code&gt;release_spool_reservation_activity&lt;/code&gt;) that automatically deallocates reserved filament spools when high scrap risk (&amp;gt;70%) is detected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overall Grand Prize ($250)&lt;/strong&gt;: Delivers an autonomous, resilient operational intelligence agent solving the 2 AM spaghetti scrap crisis for desktop 3D print farms.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;G-Code Parser Integration&lt;/strong&gt;: Extending the geometric analyzer to inspect toolpath line segments directly from sliced G-code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OctoPrint / Klipper Moonraker Plugin&lt;/strong&gt;: Pushing Temporal workflow signals directly to 3D printer hardware over local WebSocket connections to pause machines before spaghetti failures occur.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>digitalocean</category>
      <category>tabpfn</category>
    </item>
    <item>
      <title>Why Your Coding Agent Forgets Your Refactors (And How I Fixed It in PostgreSQL)</title>
      <dc:creator>Refox Lee</dc:creator>
      <pubDate>Thu, 15 Oct 2026 08:22:46 +0000</pubDate>
      <link>https://dev.to/refoxai/why-your-coding-agent-forgets-your-refactors-and-how-i-fixed-it-in-postgresql-5fl1</link>
      <guid>https://dev.to/refoxai/why-your-coding-agent-forgets-your-refactors-and-how-i-fixed-it-in-postgresql-5fl1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Here is a bug that drove me crazy for three days straight.&lt;/p&gt;

&lt;p&gt;You ask an autonomous coding agent to refactor an auth module. It inspects your files, swaps out your legacy HMAC signing logic, writes new Ed25519 verification functions, runs tests, commits, and says everything passed. You breathe a sigh of relief.&lt;/p&gt;

&lt;p&gt;Then, four days later, in a completely separate session, you ask that same agent to build an admin user route. The agent fires a vector search into its repository memory. It retrieves code chunks that scored a 0.91 cosine similarity against "validate request token".&lt;/p&gt;

&lt;p&gt;Except it did not pull your new Ed25519 module. It pulled the deprecated HMAC snippet from last Tuesday. The agent silently writes brand new endpoints against an API that does not exist anymore. Your build blows up.&lt;/p&gt;

&lt;p&gt;I call this &lt;strong&gt;Temporal Vector Amnesia&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most RAG setups treat codebase memory as a flat geometric plane. In cosine space, a deprecated function and its refactored replacement look almost identical. If the old code has more verbose docstrings, the flat vector index often prefers the ghost.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;ChronoSentry&lt;/strong&gt; to stop this. It is a spatio-temporal memory architecture for autonomous coding agents, built directly inside PostgreSQL using &lt;code&gt;pgvector&lt;/code&gt;'s &lt;code&gt;halfvec(1536)&lt;/code&gt; index, automated AST supersession triggers, and a Two-Stage CTE decay engine.&lt;/p&gt;

&lt;p&gt;Instead of searching code as timeless blobs of text, ChronoSentry pairs fast vector graph traversal with continuous exponential recency re-ranking right inside the SQL engine. Old code fades away as the codebase moves forward. When a refactor happens, superseded code gets masked out immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;               Incoming Coding Query / Agent Intent
                                │
                                ▼
         ┌──────────────────────────────────────────────┐
         │       ChronoSentry Two-Stage CTE             │
         └──────────────────────┬───────────────────────┘
                                │
                 ┌──────────────┴──────────────┐
                 ▼                             ▼
   ┌───────────────────────────┐ ┌───────────────────────────┐
   │  Stage 1: Partial HNSW ANN│ │  Stage 2: Temporal Re-rank│
   │  - halfvec(1536) (50% RAM)│ │  - Mutability-aware decay │
   │  - O(log N) graph search  │ │  - Evergreen protection   │
   └─────────────┬─────────────┘ └─────────────┬─────────────┘
                 │                             │
                 └──────────────┬──────────────┘
                                │
                                ▼
                Top-K Zero-Stale Verified Context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/Li-Qifeng/chronosentry" rel="noopener noreferrer"&gt;https://github.com/Li-Qifeng/chronosentry&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT (Docker Compose ready)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1-Command Quickstart
&lt;/h3&gt;

&lt;p&gt;You can reproduce the benchmark on your own machine in about two minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Li-Qifeng/chronosentry.git
&lt;span class="nb"&gt;cd &lt;/span&gt;chronosentry
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python src/benchmark.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Benchmark Numbers
&lt;/h3&gt;

&lt;p&gt;I ran an empirical trial against 400 time-stamped code context diffs across a simulated 30-day refactoring timeline. At Day 16, the repository migrated from HMAC to Ed25519.&lt;/p&gt;

&lt;p&gt;Here is what happens when the agent queries for auth verification logic on Day 30:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Vanilla Flat Vector Search&lt;/th&gt;
&lt;th&gt;ChronoSentry Two-Stage&lt;/th&gt;
&lt;th&gt;Architectural Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stale Code Retrieval Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100.0%&lt;/strong&gt; (150/150)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.0%&lt;/strong&gt; (0/30)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100% elimination of deprecated code&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contemporary Code Recency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zero ghost function hallucination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Median Query Latency (p50)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;34.95 ms&lt;/td&gt;
&lt;td&gt;12.58 ms&lt;/td&gt;
&lt;td&gt;Sub-15ms real-time execution budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Evergreen Utility Retention&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unweighted&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100% Retained (Weight=1.0)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Eliminates foundational code decay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AST Supersession Mechanism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None (Dead code lingers)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Database Trigger (&lt;code&gt;auto_supersede_symbol&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deterministic storage-level masking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Index Memory Footprint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~3.8 MB (FP32)&lt;/td&gt;
&lt;td&gt;~1.9 MB (&lt;code&gt;halfvec&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50% RAM savings&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When using vanilla cosine similarity, the agent pulled the dead HMAC signature every single time because the older commits matched the legacy signature keywords. ChronoSentry dropped that stale retrieval to zero while keeping foundational utility code intact.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The entire engine runs inside a single PostgreSQL 16 container. I did not want a separate vector database cluster or external Python microservices sitting between my coding agent and the database. Every millisecond spent in HTTP serialization is a millisecond my agent sits idle.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Slashing RAM by 50% with &lt;code&gt;halfvec(1536)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Code embeddings are massive. 1536 dimensions at 32-bit floating point eat roughly 6 KB per row just for raw vector data. When an agent tracks thousands of AST nodes and commit diffs across a repository, memory balloons quickly.&lt;/p&gt;

&lt;p&gt;I used &lt;code&gt;pgvector&lt;/code&gt;'s native 16-bit float representation (&lt;code&gt;halfvec&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;code_context_events&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;event_id&lt;/span&gt; &lt;span class="n"&gt;BIGSERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;recorded_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;repository_id&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;session_id&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;symbol_name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;event_type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mutability_class&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'standard'&lt;/span&gt; 
        &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutability_class&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'immutable_core'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'standard'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'transient_diff'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;code_diff&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;superseded&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="n"&gt;HALFVEC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Partial HNSW index over active halfvec(1536)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_code_context_active_hnsw&lt;/span&gt; 
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;code_context_events&lt;/span&gt; 
&lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;hnsw&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="n"&gt;halfvec_cosine_ops&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ef_construction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;superseded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cutting precision from 32-bit to 16-bit halved my index footprint with zero measurable loss in semantic accuracy. By indexing only active rows (&lt;code&gt;WHERE (superseded = FALSE)&lt;/code&gt;), the HNSW graph never wastes traversal budget searching dead nodes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Solving the "Evergreen Utility" Trap
&lt;/h3&gt;

&lt;p&gt;When you apply time decay to code, you hit a nasty edge case.&lt;/p&gt;

&lt;p&gt;Code is not a Twitter feed. In software engineering, your foundational utilities (like &lt;code&gt;src/utils/base64.py&lt;/code&gt; or your database pool connector) are written once on Day 1 and rarely touched again.&lt;/p&gt;

&lt;p&gt;If you apply a naive 72-hour exponential decay, code written 30 days ago receives an exponential multiplier of $0.00097$. A random logging scratchpad written two hours ago with a terrible 0.15 similarity will outscore your critical utility file.&lt;/p&gt;

&lt;p&gt;ChronoSentry solves this by classifying code mutability into three explicit bands:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;immutable_core&lt;/code&gt;: Core utilities, schema definitions, and base types. Temporal weight is locked at &lt;strong&gt;1.0&lt;/strong&gt; (zero decay).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;standard&lt;/code&gt;: Normal business logic and routes. Decays with standard half-life (72 hours).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transient_diff&lt;/code&gt;: Scratchpads, test logs, and temporary debugging probes. Decays aggressively (18 hours).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How does the database know a file's mutability? This is an architectural contract passed by the agent runtime during AST ingestion. When the agent's parser encounters foundational primitives (like cryptographic constants or base schemas), it tags them as &lt;code&gt;immutable_core&lt;/code&gt;. Normal function declarations receive &lt;code&gt;standard&lt;/code&gt;. Ephemeral scratchpad logs and test diffs receive &lt;code&gt;transient_diff&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Automated AST Supersession via Database Trigger
&lt;/h3&gt;

&lt;p&gt;Who updates the &lt;code&gt;superseded&lt;/code&gt; flag? You cannot expect an LLM to reliably remember to flip database flags during an edit loop.&lt;/p&gt;

&lt;p&gt;I built a database trigger that enforces supersession at the storage layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;auto_supersede_symbol&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;symbol_name&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
        &lt;span class="c1"&gt;-- Case A: Forward stream: mark older entries as superseded&lt;/span&gt;
        &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;superseded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
            &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;code_context_events&lt;/span&gt;
            &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;superseded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;
            &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;repository_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository_id&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;symbol_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;symbol_name&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;recorded_at&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;event_id&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;superseded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;-- Case B: Reverse backfill stream: if a newer entry already exists, mark NEW as superseded&lt;/span&gt;
        &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;code_context_events&lt;/span&gt;
            &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;repository_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository_id&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;symbol_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;symbol_name&lt;/span&gt;
              &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;recorded_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
            &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;superseded&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plpgsql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;trg_auto_supersede&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;code_context_events&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;auto_supersede_symbol&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the bi-directional safety. If commits arrive chronologically, Case A marks old entries superseded. If an agent backfills older history, Case B marks incoming obsolete revisions immediately. Older drafts vanish from search.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Two-Stage CTE: Rescuing the HNSW Index
&lt;/h3&gt;

&lt;p&gt;Here was my biggest debugging roadblock.&lt;/p&gt;

&lt;p&gt;If you write a query like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- DONT DO THIS: Breaks HNSW index traversal&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;symbol_name&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;code_context_events&lt;/span&gt; 
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;tau&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; 
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostgreSQL's query planner will completely abandon your HNSW index.&lt;/p&gt;

&lt;p&gt;Why? Because an HNSW graph can only navigate pure vector distance operators (&lt;code&gt;&amp;lt;=&amp;gt;&lt;/code&gt;). It cannot traverse graph edges using a dynamic mathematical expression multiplying cosine distance by an exponential time decay. Postgres falls back to a table scan, computes 1536-dimensional math on every single row in memory, and chokes.&lt;/p&gt;

&lt;p&gt;ChronoSentry fixes this by splitting retrieval into two explicit stages using a Common Table Expression (CTE):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;match_code_context_two_stage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query_vec&lt;/span&gt; &lt;span class="n"&gt;HALFVEC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;target_repo&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;half_life_hours&lt;/span&gt; &lt;span class="nb"&gt;FLOAT&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;72&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="n"&gt;candidate_k&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;final_limit&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;event_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;recorded_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;symbol_name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mutability_class&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;code_diff&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cosine_sim&lt;/span&gt; &lt;span class="nb"&gt;FLOAT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temporal_weight&lt;/span&gt; &lt;span class="nb"&gt;FLOAT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="nb"&gt;FLOAT&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="k"&gt;sql&lt;/span&gt; &lt;span class="k"&gt;STABLE&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;candidate_vectors&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="c1"&gt;-- Stage 1: Native Partial HNSW Vector Graph Traversal&lt;/span&gt;
        &lt;span class="k"&gt;SELECT&lt;/span&gt; 
            &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;symbol_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutability_class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_diff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;))::&lt;/span&gt;&lt;span class="nb"&gt;FLOAT&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cosine_sim&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;code_context_events&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
        &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;superseded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;
          &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target_repo&lt;/span&gt;
        &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;query_vec&lt;/span&gt;
        &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="n"&gt;candidate_k&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;-- Stage 2: In-Memory Spatio-Temporal Re-ranking&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; 
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;symbol_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutability_class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_diff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cosine_sim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt; 
            &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutability_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'immutable_core'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="mi"&gt;1&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="nb"&gt;FLOAT&lt;/span&gt;
            &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutability_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'transient_diff'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="n"&gt;EXP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;693&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EPOCH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&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="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;half_life_hours&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;))::&lt;/span&gt;&lt;span class="nb"&gt;FLOAT&lt;/span&gt;
            &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="n"&gt;EXP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;693&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EPOCH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&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="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;half_life_hours&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;FLOAT&lt;/span&gt;
        &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;temporal_weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cosine_sim&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt; 
            &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutability_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'immutable_core'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="mi"&gt;1&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="nb"&gt;FLOAT&lt;/span&gt;
            &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutability_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'transient_diff'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="n"&gt;EXP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;693&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EPOCH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&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="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;half_life_hours&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;))::&lt;/span&gt;&lt;span class="nb"&gt;FLOAT&lt;/span&gt;
            &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="n"&gt;EXP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;693&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EPOCH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recorded_at&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&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="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;half_life_hours&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;FLOAT&lt;/span&gt;
        &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;))::&lt;/span&gt;&lt;span class="nb"&gt;FLOAT&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;final_score&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;candidate_vectors&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
    &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="n"&gt;final_limit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stage 1 lets the HNSW index do what it was born to do: prune candidate vectors down to 40 in sub-logarithmic time. Stage 2 evaluates the temporal decay math exclusively on those 40 candidates in RAM.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Verified PostgreSQL Execution Analysis
&lt;/h3&gt;

&lt;p&gt;Here is the real &lt;code&gt;EXPLAIN (ANALYZE, BUFFERS)&lt;/code&gt; output under the default Cost-Based Optimizer (CBO):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Limit  (cost=15.72..15.73 rows=2 width=48) (actual time=2.632..2.635 rows=5 loops=1)
  Buffers: shared hit=196
  -&amp;gt;  Sort  (cost=15.72..15.73 rows=2 width=48) (actual time=2.631..2.633 rows=5 loops=1)
        Sort Key: (final_score) DESC
        Sort Method: top-N heapsort  Memory: 25kB
        Buffers: shared hit=196
        -&amp;gt;  Subquery Scan on candidate_vectors  (actual time=1.408..2.608 rows=28 loops=1)
              Buffers: shared hit=196
              -&amp;gt;  Limit  (actual time=1.366..1.375 rows=28 loops=1)
                    Buffers: shared hit=196
                    -&amp;gt;  Sort  (cost=15.64..15.64 rows=2 width=160) (actual time=1.366..1.371 rows=28 loops=1)
                          Sort Key: ((c.embedding &amp;lt;=&amp;gt; query_vec))
                          Sort Method: quicksort  Memory: 28kB
                          Buffers: shared hit=196
                          -&amp;gt;  Bitmap Heap Scan on code_context_events c  (cost=4.18..15.63 rows=2 width=160) (actual time=0.133..1.339 rows=28 loops=1)
                                Recheck Cond: (repository_id = 'Li-Qifeng/hyper-auth-service'::text)
                                Filter: (NOT superseded)
                                Rows Removed by Filter: 372
                                Heap Blocks: exact=27
                                Buffers: shared hit=196
                                -&amp;gt;  Bitmap Index Scan on idx_code_context_file_symbol  (cost=0.00..4.18 rows=4 width=0) (actual time=0.034..0.035 rows=772 loops=1)
                                      Index Cond: (repository_id = 'Li-Qifeng/hyper-auth-service'::text)
                                      Buffers: shared hit=1
Planning Time: 2.428 ms
Execution Time: 2.890 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why did PostgreSQL choose a B-tree Bitmap Index Scan over the HNSW index here?&lt;/p&gt;

&lt;p&gt;This reveals an important lesson in database internals: &lt;strong&gt;the cost crossover point&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;pgvector&lt;/code&gt;, initializing an HNSW graph traversal has a base cost model around 800. In our 400-row benchmark, the entire table lives across just 27 buffer pages in memory (around 190 KB). PostgreSQL's Cost-Based Optimizer (CBO) calculates that scanning those 27 pages via B-tree has a total cost of only 15.72.&lt;/p&gt;

&lt;p&gt;At small scale, an in-memory B-tree scan is mathematically faster than walking graph layers. Even when bitmap scans are disabled, PostgreSQL prioritizes the B-tree index &lt;code&gt;idx_code_context_file_symbol&lt;/code&gt; (cost ~20.23) over HNSW (cost ~784).&lt;/p&gt;

&lt;p&gt;Only when candidate volume scales past the cost crossover point (or when candidate filtering by repository drops in selectivity) does pgvector's partial HNSW index take over, providing $O(\log N)$ approximate nearest neighbor graph traversal. When tested in isolation on active vectors, &lt;code&gt;idx_code_context_active_hnsw&lt;/code&gt; traverses candidates in just 3.1 ms with zero table bloat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL &amp;amp; pgvector&lt;/strong&gt; provided the bedrock for this architecture. Instead of deploying an external specialized vector cluster, pgvector 0.8.7 allowed us to store 1536-dimensional embeddings alongside relational commit metadata. Using native &lt;code&gt;halfvec&lt;/code&gt; cut storage overhead in half while preserving cosine separation on high-dimensional unit hyperspheres. Pairing partial HNSW indexing with relational filter pushdown proved that standard relational engines can outmatch stand-alone vector search for contextual codebase memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; served as our collaboration and deployment hub throughout Hacktoberfest. The repository hosts reproducible container definitions, schema migrations, and benchmark scripts under a permissive MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; accelerated our SQL prototyping loop. Writing complex procedural plpgsql triggers and optimizing multi-stage CTE query plans requires fast feedback. Cursor helped us profile query execution anomalies and spot planner decisions in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;I participated in &lt;strong&gt;Global Hack Week: Hacktoberfest (October 9 to 15, 2026)&lt;/strong&gt; organized by &lt;strong&gt;Major League Hacking (MLH)&lt;/strong&gt;. The community focus on open-source contribution and practical developer tooling provided the perfect backdrop for tackling agent memory.&lt;/p&gt;

&lt;p&gt;The defining moment came during our final benchmark run. Watching the vanilla vector search retrieve obsolete HMAC code snippets 100% of the time, and then seeing ChronoSentry completely eliminate stale context with sub-10ms query latency, proved that time-aware vector filtering is essential for autonomous coding pipelines.&lt;/p&gt;

&lt;p&gt;Connecting with other builders exploring agentic workflows and seeing the creative projects across the hackathon discord was inspiring. Hackathons create an urgency that turns experimental architecture into working, production-tested software.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Vector databases are great at understanding &lt;em&gt;what&lt;/em&gt; a piece of code does. They are terrible at understanding &lt;em&gt;when&lt;/em&gt; it mattered.&lt;/p&gt;

&lt;p&gt;If you are building autonomous coding agents or long-horizon agent memory, you cannot rely on flat semantic similarity alone. Codebases evolve. Files get rewritten. Signatures get deprecated.&lt;/p&gt;

&lt;p&gt;By pairing &lt;code&gt;pgvector&lt;/code&gt;'s &lt;code&gt;halfvec&lt;/code&gt; with a Two-Stage CTE decay kernel, you get both semantic understanding and chronological reality, without sacrificing index performance or needing another specialized database service.&lt;/p&gt;

&lt;p&gt;How do you handle stale context in your own coding agents? Do you purge old embeddings manually, or do you use time weights? Let me know in the comments.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
      <category>postgres</category>
    </item>
  </channel>
</rss>
