<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Keshav — Writing</title><description>Engineering portfolio and notebook of Keshav: production backend work on GST compliance, document AI and real-time infrastructure, plus personal systems and AI projects.</description><link>http://amkeshav.me/</link><language>en</language><item><title>Why Long-Running Workflow Updates Moved to a Durable SSE Stream</title><link>http://amkeshav.me/writing/durable-sse-notifications/</link><guid isPermaLink="true">http://amkeshav.me/writing/durable-sse-notifications/</guid><description>Replacing several ephemeral SSE channels with one table-backed notification stream — 25-second heartbeats, Last-Event-ID replay and runId correlation across async workflows. A walkthrough from the wire up.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>Real-Time</category><category>Backend</category><category>NestJS</category><category>Distributed Systems</category></item><item><title>How a GST Returns Dashboard Became a Sub-15ms Read</title><link>http://amkeshav.me/writing/gst-returns-read-model/</link><guid isPermaLink="true">http://amkeshav.me/writing/gst-returns-read-model/</guid><description>GST return status queries went from 3,000ms+ to sub-15ms at peak load by reading a precomputed projection that filing writers keep fresh through domain events. Requirements, options and the update path.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>Performance</category><category>Backend</category><category>PostgreSQL</category><category>GST</category></item><item><title>When HTTP 200 Still Means Your Integration Failed</title><link>http://amkeshav.me/writing/http-200-integration-failure/</link><guid isPermaLink="true">http://amkeshav.me/writing/http-200-integration-failure/</guid><description>Four ways a GST portal integration lost or corrupted data while every request succeeded — a case-sensitive parameter, an unechoed field, a delegated rule and an over-broad sum — and how each was closed.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>Integration</category><category>Backend</category><category>GST</category></item><item><title>How I Built a PR Reviewer That Cannot Modify the Main Branch</title><link>http://amkeshav.me/writing/pr-reviewer-cannot-modify-main/</link><guid isPermaLink="true">http://amkeshav.me/writing/pr-reviewer-cannot-modify-main/</guid><description>A threat model for Antigravity, an unattended PR reviewer — per-PR worktrees, an AST-level ban on mutation paths, an evidence gate, and the risk a worktree does not remove.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>Rust</category><category>Developer Infrastructure</category><category>Security</category></item><item><title>Why RAG Shouldn&apos;t Retrieve Everything</title><link>http://amkeshav.me/writing/rag-retrieval-gating/</link><guid isPermaLink="true">http://amkeshav.me/writing/rag-retrieval-gating/</guid><description>In BARA, retrieval is three separate decisions — whether, from where and how much, then which chunks — made by deterministic rules before a vector is ever compared. A research note with the code.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>AI</category><category>RAG</category><category>LLM</category><category>Systems</category></item><item><title>The Redis Namespace Bug Behind a Broken Processing Pipeline</title><link>http://amkeshav.me/writing/redis-bullmq-namespace-bug/</link><guid isPermaLink="true">http://amkeshav.me/writing/redis-bullmq-namespace-bug/</guid><description>Two services used the same BullMQ queue name under different Redis key prefixes, so every OCR extraction result was enqueued where nothing would ever read it. An incident write-up.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>Distributed Systems</category><category>Redis</category><category>Document AI</category></item></channel></rss>