<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[redbus India Blog - Medium]]></title>
        <description><![CDATA[redBus India Blog - Medium]]></description>
        <link>https://medium.com/redbus-in?source=rss----e72b45bcfe1a---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>redbus India Blog - Medium</title>
            <link>https://medium.com/redbus-in?source=rss----e72b45bcfe1a---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 04:36:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/redbus-in" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Bug Triagence]]></title>
            <link>https://medium.com/redbus-in/bug-triagence-0e4a7c197f6a?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/0e4a7c197f6a</guid>
            <dc:creator><![CDATA[Mohan M]]></dc:creator>
            <pubDate>Wed, 07 Oct 2026 10:34:46 GMT</pubDate>
            <atom:updated>2026-10-07T10:34:44.771Z</atom:updated>
            <content:encoded><![CDATA[<h3>The core idea</h3><p>Internal reporting of product features and issues helps identify opportunities to improve the end-user experience.Analysing these issues often requires checking different systems: bookings, payments, wallets, and notification logs. Doing this manually is tedious.</p><p>Hence we decided to leverage AI to fast track the process .</p><p>During the similar time frame there were MCPs being built for internal systems for other use cases. We decided to leverage the same as phase 1 and thus the idea of Bug Triagence (<strong>Tria</strong>ge + Intelli<strong>gence</strong>) was born.</p><h3>An example</h3><p>Consider a standard customer report:</p><p><em>“I cancelled my ticket Txxxxx9 yesterday. The cancellation went through, but I never got a refund notification. Can you check?”</em></p><p>To triage this, an engineer or support agent has to manually verify:</p><ul><li>Was the booking actually cancelled in the booking database?</li><li>Did the payment service generate a refund record?</li><li>Is the money sitting in pending, completed, or failed state?</li><li>Did the notification service attempt to send an email/SMS, or did the trigger fail?</li></ul><p>This would take considerable time if the data lives in different tools and databases.</p><h3>What We Wanted “Bug Triagence” to Do</h3><p>Read an issue → check the right systems → write clear findings on the ticket, with proof.</p><p>We wanted it to:</p><ul><li>Save time — Check several systems at the same time</li><li>Stay honest — Use real data; if proof is missing, say so</li><li>Stay clear — Each agent writes what it found and from where</li><li>Grow over time — Add a new agent for a new system without rewriting everything</li><li>Keep working if AI is down — Also support a simpler “rules in code” mode</li></ul><h3>System architecture</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*c6b0BQptWpL0xbYd.png" /></figure><p>Using our simple case:</p><p>“I cancelled my ticket. Cancellation worked. I did not get a refund notification.”</p><p><strong>Below is the workflow</strong></p><ul><li>Issue is reported</li><li>Read the text and pull out IDs and dates</li><li>Decide which agents are needed (booking, payments, wallet, notifications)</li><li>Run those agents at the same time</li><li>Each agent loads a short written playbook, may call tools a limited number of times, and posts what it found + where it came from. If one agent fails, the others still finish.</li><li>Each agent writes its own comment with sources</li><li>Coordinator writes one short summary on top</li><li>Save a record for later review</li></ul><h3>Design rules</h3><p><strong>Rule 1: Agents operate independently.</strong></p><p>We don’t chain agents sequentially where Agent A blocks Agent B. A central coordinator extracts initial parameters and fires off domain-specific Agents simultaneously. If the notification service is down, the payment and booking checks still finish and post their findings.</p><p><strong>Rule 2: Facts before narrative.</strong></p><p>We gather evidence first , then ask the AI to explain it.</p><p><strong>Order of work</strong>:</p><ul><li>Pull IDs from the text (order id, booking id, email, etc.) using simple parsing where we can</li><li>Fetch starter data from systems</li><li>Let the AI ask for more data only when needed, with a max number of tries</li><li>Write the explanation using rules we already wrote down</li></ul><p>If we cannot find a useful ID, we stop and say so. We do not invent one.</p><p><strong>Rule 3: Version-controlled playbooks.</strong></p><p>Investigation steps shouldn’t live inside massive system prompts or human heads. We maintain short markdown guides per domain detailing what tools to call, what data to verify, and what claims are strictly forbidden without proof.</p><p>When the process changes, we update the guides. The agents load it when they run.</p><h3>An Investigation Walkthrough</h3><p>Using our example case (<em>“Cancelled booking BK-10234, missing refund notification”</em>):</p><ol><li><strong>Extraction:</strong> Coordinator parses BK-10234 and identifies the intent.</li><li><strong>Parallel Dispatch:</strong> Four specialized agents run at the same time using shared initial context.</li></ol><ul><li><strong>Booking Helper:</strong> Queries booking API <strong>&gt;</strong> Confirms status is <strong>CANCELLED</strong> at 18:12 UTC.</li><li><strong>Payments Helper:</strong> Queries ledger <strong>&gt;</strong> Confirms refund <strong>RF-8821</strong> was issued successfully.</li><li><strong>Notification Helper:</strong> Queries log store <strong>&gt; </strong>Finds <strong>refund_issued</strong> event was never produced by the message bus.</li></ul><p><strong>3. Sourced Output:</strong> Each helper leaves a short comment on the internal ticket with direct links/IDs. The coordinator posts a top-level summary</p><p><strong>4. Investigation Summary:</strong></p><ul><li><strong>Booking:</strong> Confirmed cancelled (BK-10234 at 18:12 UTC).</li><li><strong>Payment:</strong> Refund processed successfully (Ref: RF-8821).</li><li><strong>Notification:</strong> Issue identified. Event <strong>refund_issued</strong> failed to emit from message queue.</li><li><strong>Action Needed:</strong> Engineering review on notification queue consumer.</li></ul><h3>Risks we faced and Mitigated</h3><p>Integrating autonomous AI agents into internal workflows carries real production risks, from data exposure and hallucinated claims to runaway API costs. To keep the triage system secure, reliable, and cost-effective, we established strict operational guardrails right at the architecture level.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PDq9-dkoylA622FF.png" /></figure><p><strong>What improved</strong></p><p>Automating our triage workflow delivered below gains</p><ul><li>Faster first look at multi-system tickets</li><li>More consistent checks across issues</li><li>Clearer handoff notes for engineers</li><li>Easier onboarding of a new check area via a new playbook</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0e4a7c197f6a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/bug-triagence-0e4a7c197f6a">Bug Triagence</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Designing a Modular Test Automation Framework for Agentic AI Systems]]></title>
            <link>https://medium.com/redbus-in/designing-a-modular-test-automation-framework-for-agentic-ai-systems-773817b153d8?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/773817b153d8</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ai-testing-framework]]></category>
            <category><![CDATA[llm-evaluation]]></category>
            <dc:creator><![CDATA[Chhitiz Tripathi]]></dc:creator>
            <pubDate>Fri, 04 Sep 2026 06:31:53 GMT</pubDate>
            <atom:updated>2026-09-04T06:31:53.739Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><em>How to architect a unified, multi-protocol regression platform that scales with your agents, LLMs, and real-time interfaces.</em></blockquote><h3>Why Traditional Test Frameworks Fall Short</h3><p>Modern applications are no longer just REST endpoints and web pages. A single user query today might traverse:</p><ul><li>A <strong>WebSocket</strong> stream carrying incremental tokens</li><li>A <strong>gRPC</strong> call between microservices</li><li>A <strong>Server-Sent Events (SSE)</strong> channel pushing agent updates</li><li>An <strong>Agent-to-Agent (A2A)</strong> protocol coordinating specialized reasoning agents</li><li>One or more <strong>LLM</strong> invocations, each with its own latency, cost, and correctness profile</li><li>A <strong>UI</strong> that stitches all of the above into a coherent experience</li></ul><p><strong>Testing agentic AI is not a single problem; it is a stack of them. A modular framework is the only shape that keeps pace as the stack grows.</strong></p><p>Testing this stack with a single tool — Postman for APIs, JMeter for load, Selenium for UI — quickly becomes unmanageable. Reports live in silos. Regressions in one layer surface only in production. Semantic correctness (did the agent <em>actually</em> answer the user’s question?) is left entirely to manual QA.</p><p>This article walks through the architecture of a <strong>modular, multi-protocol regression automation framework</strong> designed for agentic AI systems, and the principles that keep it maintainable as new protocols and models appear.</p><h3>The Bug Status Codes Never Catch</h3><p>A release that looked green in CI shipped a subtle agent regression. The user asked a travel-search agent for <em>buses with sleeper berths on a given route</em>. The WebSocket returned 200, tokens streamed, and the UI rendered a polished reply recommending buses — none of which had sleeper inventory for that night.</p><p>What went wrong?</p><ul><li>The <strong>coordinator</strong> skipped the inventory specialist and answered from prior turn context</li><li>Structural API checks still passed — a message <em>was</em> returned</li><li>Exact-string asserts were useless: the reply was fluent, helpful-sounding, and wrong</li><li>Manual QA had covered the happy path the day before; this edge phrasing was new</li></ul><p>A modular agentic framework catches this class of bug by layering validators the status code cannot see:</p><ol><li><strong>Agent-flow</strong> — expected specialist agents (and tools) must appear in the execution trace</li><li><strong>State</strong> — required keys (route, date, filter dimensions) must be populated</li><li><strong>Semantic</strong> — a judge scores faithfulness and relevance against the user intent and ground truth</li><li><strong>Integration</strong> — the same case can be replayed from UI or voice to confirm the UX surface agrees</li></ol><p>The rest of this article is the architecture that makes those four checks routine instead of heroic.</p><h3>Core Design Principles</h3><p>Before writing a single line of code, pin down the principles that will govern every module.</p><ol><li><strong>Modularity over monolith.</strong> Each testing concern — WebSocket load, backend flow, UI journey, LLM benchmarking — lives in its own module with its own lifecycle. New protocols slot in as siblings, not as forks.</li><li><strong>Shared core, isolated execution.</strong> A single core module owns configuration, models, logging, and reporting. Everything else depends on it and nothing else.</li><li><strong>Data-driven test cases.</strong> Tests are defined in YAML/JSON, not baked into Java classes. QA engineers add coverage without touching framework code.</li><li><strong>Semantic assertions are first-class.</strong> For agentic systems, “the endpoint returned 200” is not a passing test. The framework must reason about whether the <em>answer</em> was correct.</li><li><strong>One dashboard to rule them all.</strong> Every module publishes to a common results store so a single UI shows the health of the entire stack.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1rQgcb5CtMMZa3ZtsQmrOw.jpeg" /></figure><h3>The Module Layout</h3><p>Each module is an independent Maven (or Gradle) project. The parent POM enforces shared versions of Java, JUnit, Allure, Lombok, and Jackson so drift never becomes a debugging tax.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qlW-oIeS7QTvGflG0bNLnA.png" /></figure><h3>Module Deep Dive</h3><h3>1. Core: The Backbone</h3><p>The core module is intentionally boring — and that is the point. It exposes:</p><ul><li>TestConfig — a singleton config loader that reads a single YAML and exposes typed getters</li><li>JsonUtils / YamlUtils — serialization helpers with sensible defaults</li><li>Base result models (TestResult, TestRun, Metric) shared by every module</li><li>A pluggable reporter interface so results can be pushed to a database, a file, or a message queue</li></ul><p>Rule of thumb: if you find yourself copying a utility between two modules, it belongs in core.</p><h3>2. WebSocket: Streams Under Load</h3><p>WebSocket testing has two flavors — functional (does the stream emit the right events in the right order?) and load (how many concurrent streams can the server sustain?). A well-designed module handles both with the same primitives:</p><ul><li>A WebSocketTestClient that opens a connection, sends a payload, and collects an event stream</li><li>A LoadExecutor that spins up N clients on a thread pool and aggregates metrics</li><li>A metrics collector that captures latency percentiles, throughput, error rates, and connection lifecycle events</li></ul><p>The load executor scales from 10 to 1000+ connections with a single config change.</p><h3>3. Backend: Validating Agent Flows</h3><p>For an agentic system, “backend testing” means more than hitting endpoints. You need to assert that:</p><ul><li>The <strong>right agents</strong> were invoked</li><li>They were invoked in the <strong>right order</strong> (or in an acceptable partial order for flexible flows)</li><li>The <strong>shared state</strong> was populated with the expected keys</li><li>The <strong>final response</strong> satisfies domain rules</li></ul><p>A clean approach uses a YAML schema per test case:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UJB_dVnbm5uxtKvCgbZZMw.png" /></figure><p>The framework parses each case, executes it against the target system (via WebSocket or HTTP), and runs four validators in sequence: agent-set, execution-order, state, and response.</p><h3>One Query, End to End</h3><p>Architecture diagrams convince architects. A single case walking the pipeline convinces everyone else. Here is the sleeper-bus query as a full run:</p><p><strong>1. YAML defines intent</strong> — the case above: query, expected agents, state keys, semantic thresholds.</p><p><strong>2. Executor opens the real channel</strong> — typically WebSocket. The client sends the user query and collects the event stream until the final payload arrives (or a timeout fires).</p><p><strong>3. Structural validators run first</strong> (cheap, deterministic):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iluqcwV05deY-nh4s6oOXw.png" /></figure><p>At this point the run already fails — without spending a judge-LLM call. That ordering matters for cost.</p><p><strong>4. Semantic validation runs when structure passes</strong> (or always, if you want audit evidence on known failures). A typical TestResult payload looks like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ddAaf2GkXRfSj-XeVh6w8A.png" /></figure><p><strong>5. Dashboard + Allure</strong> ingest the same record. A week later you can ask: <em>every failure for sleeper/inventory flows across WebSocket and UI in the last 7 days</em> — because every result is tagged with module, protocol, and scores.</p><p>That one case is the contract between QA (who owns YAML), backend (who owns agent traces), and ML (who tunes judge thresholds).</p><h3>4. Frontend: E2E With Discipline</h3><p>UI tests earn their reputation for flakiness when Page Object Model discipline is skipped. Enforce it:</p><ul><li>One page class per screen, exposing intent-level methods (e.g. submitForm(input)), never raw selectors</li><li>A WebDriverFactory that produces headless-or-headed drivers based on config</li><li>Screenshot-on-failure baked into the base test class</li><li>Explicit waits everywhere; implicit waits nowhere</li></ul><h3>5. LLM: Benchmarking Beyond Latency</h3><p>The LLM module is where most frameworks quietly give up. Don’t. Structure it around three orthogonal dimensions:</p><ul><li><strong>Performance</strong> — latency, tokens per second, cost per response</li><li><strong>Quality</strong> — correctness, relevance, completeness (scored via a judge model or rubric)</li><li><strong>Consistency</strong> — variance across N runs of the same prompt</li></ul><p>A BenchmarkOrchestrator runs the same prompt suite across multiple models, and a Comparator produces a leaderboard. When a new model releases, you swap one line of config to see whether it beats the incumbent.</p><h3>6. Protocol Modules: gRPC, SSE, A2A</h3><p>Each protocol gets its own module because each has a different failure mode. gRPC needs schema/proto management. SSE needs long-lived connection handling and reconnect semantics. A2A needs delegation-tree validation. Sharing a core ProtocolTestClient interface lets integration tests treat them uniformly.</p><h3>7. Semantic: The Assertion Layer for AI</h3><p>Traditional assertions (assertEquals(200, response.status)) fail silently on the questions that matter. Agentic outputs are <strong>non-deterministic</strong>: two correct runs may phrase the same answer differently, so exact-string matching produces either perpetual flakes or permanently weak tests.</p><p>The semantic module treats scoring as a first-class assertion API every other module can call the same way it calls assertEquals.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oCAdHS0XVFyBehZfAnZcjw.png" /></figure><h4>Three assertion tiers (use the cheapest that works)</h4><ol><li><strong>Structural</strong> — required fields, enums, IDs, shapes. Deterministic. Prefer this for catalog IDs, filter dimensions, and status codes.</li><li><strong>Embedding similarity</strong> — cosine distance to a reference answer. Fast and cheap; good for paraphrase tolerance when the gold answer is stable.</li><li><strong>Judge-LLM / rubric</strong> — pass response + expectation (+ optional ground truth) to a judge model; get scores, a verdict, and a written justification. Use when meaning matters more than wording.</li></ol><p>Configure <strong>pass thresholds per scenario</strong> (e.g. faithfulness ≥ 0.75), not globally. A FAQ bot and a transactional booking agent do not share the same bar.</p><h4>When not to use a judge</h4><ul><li>Structured fields you can assert exactly (IDs, codes, counts against inventory)</li><li>High-volume suites where judge cost would dominate CI (gate with structure first; sample for judge)</li><li>Cases where the judge itself is under-calibrated — two judge disagreements on the same case is a signal to fix the rubric, not to lower the threshold blindly</li></ul><h4>Keeping semantic tests from going flaky</h4><ul><li>Prefer <strong>must-contain topics / must-not phrases</strong> alongside continuous scores</li><li>Run the judge <strong>after</strong> structural checks so you fail fast on missing agents</li><li>Track <strong>judge cost and disagreement rate</strong> on the dashboard; spike = prompt or model drift</li><li>Allow a pluggable judge backend (cloud vs local) so PR gates can use a cheaper local model and nightly runs use a stronger one</li></ul><h3>8. Beyond Text: Voice, Multi-Turn, and Silent Regressions</h3><p>Text WebSocket cases are necessary but not sufficient. Three surfaces traditional frameworks almost always miss:</p><p><strong>Voice / multimodal.</strong> A browser-driven voice harness injects TTS audio, waits for the agent reply, captures STT text, and runs the same semantic judge per turn. Failures that only appear when latency, barge-in, or audio pipeline drift — invisible to pure API tests — show up here. Headless CI support matters; voice suites are expensive, so treat them like LLM benchmarks: nightly or on-demand, not on every commit.</p><p><strong>Multi-turn user simulation.</strong> Real users do not send one perfect query. An LLM-powered user simulator drives follow-ups (“cheaper ones”, “only sleeper”, “what about refunds?”) against the live agent. Assertions attach <strong>per turn</strong>: state should accumulate, agents should not restart the whole plan from scratch, and the final answer must remain faithful to the full conversation — not just the last utterance.</p><p><strong>Analytics and event contracts.</strong> GA / product-analytics payloads can break with no UI symptom. Network capture (e.g. BiDi) validating event names, params, and sequencing turns “silent” instrumentation regressions into ordinary CI failures. The same idea applies to any side-channel your product depends on but users never see.</p><p>These belong as <strong>sibling modules</strong>, not bolted scripts: they reuse core config, the semantic assertion API, and the shared results store so a voice failure and a backend failure appear on the same dashboard timeline.</p><h3>9. Integration: The Whole Truth</h3><p>Individual modules verify their layer. The integration module verifies the <em>whole journey</em>: a user query triggers a WebSocket, which invokes agents, which call LLMs, which drive the UI. Scenarios here catch the bugs no single module can see.</p><h3>10. Dashboard: Visibility Or It Didn’t Happen</h3><p>A test that runs but isn’t seen is a test that doesn’t exist. A Spring Boot dashboard, backed by PostgreSQL, exposes:</p><ul><li>Overview: pass/fail counts across all modules</li><li>Per-module deep dives with historical trends</li><li>Performance dashboards (p50/p95/p99 latencies over time)</li><li>LLM leaderboards</li><li>REST APIs so other tools can subscribe</li></ul><h3>Data Flow</h3><p>Every test run produces a TestRun record with a unique ID. Every assertion within it produces a TestResult tagged with module, protocol, and semantic scores. This tagging makes cross-cutting queries — “show me every failure for a given flow across all protocols in the last 7 days” — trivial.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t-ACuPFftJxf-JZQIFvRMA.png" /></figure><h3>CI/CD Integration</h3><p>A Jenkins (or GitHub Actions, or GitLab CI) pipeline stitches everything together:</p><ol><li><strong>Checkout</strong> and cache dependencies</li><li><strong>Build</strong> all modules in parallel</li><li><strong>Unit tests</strong> — fast feedback under 2 minutes</li><li><strong>Protocol suites</strong> — WebSocket, gRPC, SSE run in parallel</li><li><strong>Backend flow tests</strong> — the semantic-heavy suite</li><li><strong>UI E2E</strong> — headless, sharded across executors</li><li><strong>Voice / multi-turn</strong> — nightly or on-demand (browser + TTS/STT cost)</li><li><strong>LLM benchmarks</strong> — nightly or on-demand (cost management)</li><li><strong>Publish</strong> — Allure reports, dashboard push, Slack/email notifications</li></ol><p>The key insight: not every stage runs on every commit. Fast checks gate PRs; expensive checks run on merge to main or on schedule.</p><h3>Lessons Learned</h3><p>A few things worth internalizing before you build:</p><ul><li><strong>Start with core and one module.</strong> Do not build the full tree upfront. Ship WebSocket + one backend flow case, prove the pattern, then replicate.</li><li><strong>YAML is a contract, not a config.</strong> Treat test-case schemas with the same rigor as production APIs. Version them.</li><li><strong>Fail cheap before you judge.</strong> Agent-set and state checks catch many “fluent but wrong” bugs without a judge-LLM invoice.</li><li><strong>Semantic validation is the multiplier.</strong> A hundred structural tests catch fewer real bugs than ten well-written semantic tests — but only when thresholds and rubrics are scenario-specific.</li><li><strong>Text is not the whole product.</strong> Voice, multi-turn, and analytics contracts fail in ways UI smoke tests never see.</li><li><strong>Own your dashboard.</strong> Bolted-on reporting tools become bolted-off within a year.</li><li><strong>Measure the framework itself.</strong> Track flakiness per test, per module, and judge disagreement rate. Retire tests that fail intermittently — they cost more than they catch.</li></ul><h3>Where to Take It Next</h3><p>Once the foundation holds, natural extensions appear:</p><ul><li><strong>Chaos testing</strong> — inject latency, drop connections, and re-run the same suite</li><li><strong>Contract testing</strong> — capture and replay protocol schemas to catch breaking changes early</li><li><strong>Synthetic monitoring</strong> — reuse the same test cases as production canaries</li><li><strong>Agentic test generation</strong> — let an LLM propose test cases from user-conversation logs</li></ul><p><em>If you’re building or evolving a test platform for agentic systems, the patterns above have held up across WebSocket, gRPC, SSE, and A2A protocols — across voice and multi-turn flows — and across half a dozen frontier LLMs. The sleeper-bus class of bug is why the stack exists. Steal freely.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=773817b153d8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/designing-a-modular-test-automation-framework-for-agentic-ai-systems-773817b153d8">Designing a Modular Test Automation Framework for Agentic AI Systems</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reducing Sign-in Friction Across Markets with Passkeys]]></title>
            <link>https://medium.com/redbus-in/reducing-sign-in-friction-across-markets-with-passkeys-da77af524dfc?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/da77af524dfc</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[login]]></category>
            <category><![CDATA[google-passkey]]></category>
            <category><![CDATA[biometric-authentication]]></category>
            <dc:creator><![CDATA[Amit Kumar]]></dc:creator>
            <pubDate>Tue, 12 May 2026 15:31:03 GMT</pubDate>
            <atom:updated>2026-05-12T15:31:05.208Z</atom:updated>
            <content:encoded><![CDATA[<p>Every OTP introduces friction.<br> Every second of login delay impacts conversion.</p><h3>How RedBus improved conversion, reduced OTP costs, and strengthened security</h3><h3>Overview</h3><p>RedBus operates across multiple countries, serving millions of users booking intercity travel. With a diverse, multilingual user base and varying levels of network reliability, authentication has historically been a key friction point — especially when relying on SMS-based OTPs.</p><p>To improve user experience and reduce operational costs, RedBus introduced <strong>passkeys</strong> as a modern, passwordless authentication method.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1cTNVkwV2Bb6T6wuwqR6fQ.gif" /></figure><figure><img alt="redBus IND Pass Keys , Amit Kumar" src="https://cdn-images-1.medium.com/max/384/1*4Fmim3mKoGiUn1O-OujE6w.gif" /></figure><h3>The challenge</h3><p>RedBus faced several authentication challenges across its markets:</p><h3>1. High friction during critical booking moments</h3><p>Users were frequently asked to sign in at high-intent stages:</p><ul><li>Homepage login prompts</li><li>Seat selection (to unlock offers)</li><li>Payment page (to apply discounts or complete booking)</li></ul><p>Each interruption increased drop-off risk.</p><h3>2. OTP reliability and cost issues</h3><ul><li>SMS delivery failures in certain regions</li><li>Latency causing delayed OTPs</li><li>High cost per OTP, especially in international markets</li></ul><h3>3. Lost users due to session drops</h3><ul><li>Users navigating back from payment pages often needed to re-authenticate</li><li>Re-login friction reduced chances of conversion recovery</li></ul><h3>4. Security concerns</h3><p>OTP-based systems are vulnerable to:</p><ul><li>SIM swap attacks</li><li>Phishing</li><li>Interception</li></ul><h3>The solution: Passkeys</h3><p>RedBus implemented <strong>passkeys</strong> as a seamless and secure alternative to OTP-based login.</p><p>Passkeys allow users to authenticate using:</p><ul><li>Device biometrics (fingerprint, face unlock)</li><li>PIN or system authentication</li></ul><p>This eliminates the need for passwords and OTPs entirely.</p><h3>Where passkeys made the biggest impact</h3><h3>1. Seamless login from homepage</h3><p>Users can sign in instantly with a biometric prompt — no typing, no waiting.</p><p><strong>Impact:</strong> Faster onboarding and higher login completion rates.</p><h3>2. Offer unlock during seat selection</h3><p>When users attempt to access seat-level offers:</p><ul><li>Passkey prompt enables instant authentication</li><li>No disruption to booking flow</li></ul><p><strong>Impact:</strong> Increased offer engagement and conversion.</p><h3>3. Payment page authentication</h3><p>Instead of OTP verification:</p><ul><li>Users authenticate with a single biometric action</li></ul><p><strong>Impact:</strong> Reduced drop-offs at the most critical funnel stage.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/384/1*zFzUnVhOprrzjCjjlXn_jA.gif" /></figure><h3>4. Back-button recovery flows</h3><p>When users navigate back from payment:</p><ul><li>RedBus triggers a contextual popup with additional discounts</li><li>Passkeys allow instant re-authentication</li></ul><p><strong>Impact:</strong> Higher retention and recovery of abandoned bookings.</p><h3>Results</h3><p><strong>Explosive passkey adoption</strong><br>Passkey registrations scaled rapidly over a short period</p><p>This represents <strong>&gt;20x growth in daily adoption</strong>, driven by strategic placement in high-intent flows.</p><p>We are seeing ~25% passkey creation rate among daily active users, indicating strong user willingness to adopt passwordless authentication. However, repeat usage is still early-stage, which aligns with industry trends.”</p><h3>Reduced authentication friction</h3><ul><li>One-tap sign-in replaces multi-step OTP flows</li><li>Consistent experience across devices and regions</li></ul><h3>Lower operational costs</h3><ul><li>Significant reduction in SMS/OTP spend</li><li>Particularly impactful in high-cost international markets</li></ul><h3>Improved reliability</h3><ul><li>Eliminates dependency on telecom networks</li><li>Near-zero failure rate compared to OTP delivery</li></ul><h3>Enhanced security</h3><ul><li>Resistant to phishing and SIM swap attacks</li><li>Credentials are device-bound and encrypted</li></ul><h3>Why passkeys work for RedBus</h3><p>RedBus operates in a <strong>high-intent, time-sensitive booking environment</strong>. Users often:</p><ul><li>Book under time pressure</li><li>Switch devices or networks</li><li>Expect fast, uninterrupted flows</li></ul><p>Passkeys align perfectly with these needs:</p><ul><li><strong>Speed:</strong> Instant authentication</li><li><strong>Reliability:</strong> Works even with poor network conditions</li><li><strong>Security:</strong> Stronger than OTPs without added complexity</li></ul><h3>Key learnings</h3><h3>1. Introduce passkeys at high-friction points</h3><p>Focus on:</p><ul><li>Payment steps</li><li>Offer unlock flows</li><li>Session recovery moments</li></ul><h3>2. Use contextual prompts</h3><p>Trigger passkey login only when it adds value:</p><ul><li>Discounts</li><li>Faster checkout</li><li>Personalized experience</li></ul><h3>3. Educate users gradually</h3><ul><li>Highlight “faster &amp; safer login” benefits</li><li>Use familiar biometric cues</li></ul><h3>What’s next</h3><p>RedBus plans to:</p><ul><li>Expand passkey adoption across all markets</li><li>Replace OTP as the default authentication method</li><li>Optimize cross-device passkey usage</li></ul><h4>Authentication flow:-</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/987/1*QYv0vHcqRPjF5ndhEDKe0g.jpeg" /></figure><p>Registration flow:-</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/979/1*O3d59HIcHdhyYifAlIJNEw.jpeg" /></figure><h3>Conclusion</h3><p>By adopting passkeys, RedBus transformed authentication from a <strong>conversion bottleneck</strong> into a <strong>competitive advantage</strong>.</p><p>The shift not only improved user experience but also delivered tangible business benefits:</p><ul><li>Higher conversion rates</li><li>Lower infrastructure costs</li><li>Stronger security posture</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da77af524dfc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/reducing-sign-in-friction-across-markets-with-passkeys-da77af524dfc">Reducing Sign-in Friction Across Markets with Passkeys</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Revolutionizing Customer Support: The Story of redBus CoPilot]]></title>
            <link>https://medium.com/redbus-in/revolutionizing-customer-support-the-story-of-redbus-copilot-8f60320ffab1?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/8f60320ffab1</guid>
            <category><![CDATA[customer-support]]></category>
            <category><![CDATA[customer-support-agent]]></category>
            <category><![CDATA[redbus]]></category>
            <category><![CDATA[customer-experience]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Sibi]]></dc:creator>
            <pubDate>Mon, 04 May 2026 12:15:19 GMT</pubDate>
            <atom:updated>2026-05-04T12:15:20.987Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IA_4yZ0KGz7cONK7ADqhwg.png" /></figure><p>In today’s fast-paced world, customer support agents are the frontline heroes of any business. They navigate complex systems, handle a wide range of customer issues, and strive to provide excellent service every single time. But what if we could give them a superpower? An AI-powered assistant to guide them, automate tedious tasks, and help them resolve customer issues faster and more effectively.</p><p>This is the story of CoPilot, an initiative to revolutionize our customer support by empowering our agents with the power of AI. In this blog post, we’ll take you through our journey of developing and launching CoPilot, the challenges we faced, and the incredible results we’ve seen so far.</p><h3>The Challenge: A Day in the Life of a Customer Service Agent</h3><p>Before CoPilot, our customer service agents faced several challenges that impacted their efficiency and job satisfaction:</p><ol><li>Agent onboarding time — New agents required few months of intensive training to get up to speed with our complex processes</li><li>Process Adherence — High Average Handle Time (AHT) for inexperienced agents &amp; more prone to making errors</li><li>Agent Inefficiency — Agents lost valuable time navigating multiple screens and performing manual tasks.</li></ol><p>This clearly showed an opportunity for improvement through automation and a more streamlined workflow.</p><h3>Introducing CoPilot: A Game-Changer for Agent Productivity</h3><p>To tackle these challenges, we developed CoPilot, an AI-powered assistant integrated directly into the agent’s workspace. CoPilot provides real-time guidance, automates repetitive tasks, and consolidates workflows into a single screen.</p><p>Here’s how CoPilot helps our agents:</p><ol><li>Real-time guidance suggests the next correct action, dramatically reducing training &amp; onboarding time</li><li>Process-compliant suggestions minimize mistakes and improve consistency</li><li>Workflow automation consolidates tasks into a single screen, automating manual work and increasing efficiency</li></ol><p>We opted for a hybrid model for CoPilot, combining AI for tasks like issue identification and generating summaries, with rule-based flows for process guidance to ensure sub-second response times, which is critical for agent adoption.</p><h3>From Idea to Impact: The CoPilot Journey</h3><p>We started our CoPilot journey with a Minimum Viable Product (MVP) focused on the process for a specific issue, based on the volume and complexity. We launched the MVP with a small team of agents and worked closely with them to gather feedback and iterate on the product.</p><p>This user-centric approach was crucial to our success. Here are some of the key learnings from our initial launch:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/934/1*fsjG_MzF3Woyp8biLwFnjA.png" /></figure><h3>The Results Are In: CoPilot’s Impact on Performance</h3><p>The results since the launch of CoPilot have been very promising. We’ve seen significant improvements in adoption, agent efficiency, and customer satisfaction.</p><p>CoPilot has seen strong adoption among our agents. As of March 2026, the adoption rates have stabilized around <strong>90% </strong>resulting in <strong>29% reduction in AHT for our chat process</strong>.<strong> </strong>Most importantly, CoPilot has had a positive impact on our Customer Satisfaction (CSAT) scores by 15%.</p><h3>The Road Ahead: The Future of CoPilot</h3><p>The journey with CoPilot is just beginning. Our goal is to expand CoPilot’s coverage to the majority of the issues keeping the adoption rate in check. To get there, we are focused on:</p><ul><li><strong>Expanding to more issue types:</strong> We are planning to roll out CoPilot for other common issues.</li><li><strong>Continuous Improvement:</strong> We are constantly working on optimizing CoPilot’s flows, improving our AI models to reduce false positives, and incorporating agent feedback to make CoPilot even more intuitive and helpful.</li><li><strong>Deeper Automation:</strong> We are looking to further automate tasks such as case summarization, customer communication to free up even more time for our agents.</li></ul><h3>Conclusion</h3><p>The results speak for themselves. CoPilot is more than just a productivity tool; it’s a paradigm shift in how we approach customer support. By empowering our agents with AI-driven insights and automation, we’ve not only seen remarkable gains in efficiency but also a significant uplift in customer satisfaction. This journey has reinforced our belief that investing in our agents’ success directly translates to a better experience for our customers.</p><p>The road ahead is exciting. As we expand CoPilot’s capabilities and tackle new challenges, we’re not just optimizing a process; we’re building a more intelligent, responsive, and human-centric customer support ecosystem. The story of CoPilot has just begun, and we’re thrilled to continue this journey of innovation, with our agents and customers at the heart of everything we do.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8f60320ffab1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/revolutionizing-customer-support-the-story-of-redbus-copilot-8f60320ffab1">Revolutionizing Customer Support: The Story of redBus CoPilot</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[From Chat to Talk: redBus’ Story of Enhancing Customer Support for Real-Time Issues]]></title>
            <link>https://medium.com/redbus-in/from-chat-to-talk-redbus-story-of-enhancing-customer-support-for-real-time-issues-033eb6e466f3?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/033eb6e466f3</guid>
            <category><![CDATA[customer-support]]></category>
            <category><![CDATA[redbus]]></category>
            <category><![CDATA[customer-experience]]></category>
            <category><![CDATA[customer-satisfaction]]></category>
            <category><![CDATA[redbusproduct]]></category>
            <dc:creator><![CDATA[Sibi]]></dc:creator>
            <pubDate>Wed, 08 Apr 2026 12:57:44 GMT</pubDate>
            <atom:updated>2026-04-08T12:57:46.098Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Q0M4R1yHsAnIM7pK-bQGeA.png" /></figure><p>When a traveler is stranded at a bus stop at midnight, unsure if their bus is coming, the last thing they need is to wait in a chat queue or be involved in a lengthy chat with a customer support representative. They need answers — fast. This tension between the scalability of chat and the urgency of real-world travel problems is one we’ve been grappling with at redBus for some time. Our answer: <strong>Chat-to-Voice Deflection</strong> — a smarter, context-aware support system that puts the right channel in front of the right customer at exactly the right moment.</p><h3>The Problem with One-Size-Fits-All Support</h3><p>Our support ecosystem is built to be efficient. The Self-Help flow handles the bulk of common queries, and for more complex situations, customers are connected to a live chat human agent. Chat has clear operational advantages — a single human agent can manage multiple conversations simultaneously, letting us serve higher volumes without proportionally scaling headcount.</p><p>But efficiency has its limits.</p><p>Two metrics told us something was broken: <strong>chat drops</strong> and <strong>missed chats</strong>.</p><ul><li><strong>Chat drops</strong> happen when a customer abandons the conversation after a human support agent has already connected — tying up that customer support representative in a dead-end interaction. The customer can typically abandon the conversation when the human agent is taking time to resolve an important issue that requires co-ordination with multiple parties.</li><li><strong>Missed chats</strong> occur when customers give up waiting in queue before reaching a human support agent at all.</li></ul><p>These two problems feed each other in a vicious cycle. Chat drops occupy human chat agents unproductively → queues grow longer → more customers abandon before connecting → more pressure on the remaining chat agents. For customers dealing with a live journey crisis — a no-show bus, a safety concern, a wrong boarding point — every minute of that delay compounds their anxiety.</p><p>The numbers confirmed what we intuitively knew: <strong>chat CSAT consistently lagged behind voice CSAT for time-critical issues.</strong> When the human agents need to loop in bus operators or drivers to gather real-time information, relaying that back through text introduces friction and delay that a phone call would eliminate in seconds.</p><p>For certain situations, chat isn’t just suboptimal. It’s the wrong tool entirely.</p><h3>The Solution: Give Customers a Choice — But Only When It Matters</h3><p>We didn’t want to abandon chat. It remains the right channel for the majority of support interactions. What we needed was a way to <strong>intelligently surface voice support for customers who needed it most</strong>, without overwhelming our voice capacity or degrading the experience for everyone else.</p><p>The result is <strong>Chat-to-Voice Deflection</strong>: a hybrid support model that presents a “Call” option alongside “Chat” — but only under two specific conditions.</p><h3>1. The Nature of the Issue</h3><p>The problem must qualify as a real-time, journey-critical situation:</p><ul><li>Bus not showing up, breakdowns, or changes in boarding/drop-off points</li><li>Safety concerns — harassment, accidents, or disrespectful staff behavior</li><li>Operator-initiated bus cancellations</li><li>Live tracking failures</li><li>Boarding issues, such as needing the driver’s number or boarding point confirmation</li></ul><h3>2. The Timing</h3><p>The customer must be within a defined window around their journey — currently <strong>2 hours before departure or 2 hours after arrival</strong>.</p><p>Only when <em>both</em> conditions are met does the “Call” option appear. Everything else routes to standard chat. This precision ensures our voice support capacity is reserved for genuine emergencies, not routine queries.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*e1TGqCtkR3jikGgRmoBD2A.png" /></figure><h3>Cutting the IVR Friction</h3><p>One of the less obvious but significant wins of this feature is what it <em>bypasses</em>: our IVR system.</p><p>Traditional IVR flows — press 1 for this, press 2 for that — are a known pain point. Navigating a menu tree when you’re stressed and pressed for time is the opposite of helpful. While we’re actively rolling out an AI-powered voice bot to replace our legacy IVR, Chat-to-Voice Deflection offers an immediate shortcut: <strong>customers are connected directly to a live customer support representative, skipping the IVR tree entirely.</strong></p><p>For someone in crisis, that’s not a small thing. It’s the difference between feeling supported and feeling abandoned.</p><h3>The Results: Metrics That Matter</h3><p>We launched Chat-to-Voice Deflection towards the end of last year, and the data has exceeded our expectations.</p><h3>Customers Voted with Their Fingers</h3><p>When given the choice, customers in urgent situations overwhelmingly chose to call with more than 50% customers preferring voice over chat. The preference is on similar lines for women travellers. The signal is clear: when customers in distress are given the option to speak to someone, they take it.</p><p>Additionally we saw a significant drop in missed chats while the chat CSAT also showed an improvement.</p><h3>The Bigger Picture</h3><p>At its core, Chat-to-Voice Deflection is about <strong>meeting customers where they are</strong> — not just geographically, but emotionally. A traveler dealing with a journey crisis isn’t just looking for information. They’re looking for reassurance. And sometimes, only a human voice can provide that.</p><p>By marrying the efficiency of chat with the empathy of voice, we’re not just improving metrics. We’re making the promise of a smooth journey feel a little more real — even when things don’t go according to plan.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=033eb6e466f3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/from-chat-to-talk-redbus-story-of-enhancing-customer-support-for-real-time-issues-033eb6e466f3">From Chat to Talk: redBus’ Story of Enhancing Customer Support for Real-Time Issues</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Redbus Journey: DragonflyDB Evaluation & Adoption (2025–2026)]]></title>
            <link>https://medium.com/redbus-in/redbus-journey-dragonflydb-evaluation-adoption-2025-2026-a06ac0ea4d24?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/a06ac0ea4d24</guid>
            <category><![CDATA[dragonfly]]></category>
            <category><![CDATA[valkey]]></category>
            <category><![CDATA[elasticache]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[redis]]></category>
            <dc:creator><![CDATA[Harsha N]]></dc:creator>
            <pubDate>Wed, 08 Apr 2026 09:15:18 GMT</pubDate>
            <atom:updated>2026-04-08T09:15:19.585Z</atom:updated>
            <content:encoded><![CDATA[<h3>1. Summary</h3><p>The transition from AWS Elasticache(Redis) to DragonflyDB at Redbus was initiated to solve hardware underutilization and improve performance-per-dollar. As of early 2026, the migration is nearing completion with significant gains in memory efficiency, throughput and dollar savings.</p><h3>2. Dragonfly Architecture</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4l0IGCIbi1y8tCLFOdwJXg.png" /></figure><p>Dragonfly is a Redis- and Memcached-compatible, high-performance in-memory data store designed as a drop-in replacement for Redis, built from the ground up with a modern architecture.</p><ul><li><strong>Thread-per-core, shared-nothing architecture:</strong> Leverages all CPU cores efficiently through vertical scaling. The dataset is sharded, with each shard managed by a dedicated thread, minimizing locks and synchronization.</li><li><strong>Efficient inter-thread communication:</strong> Achieved through message passing, avoiding shared memory contention.</li><li><strong>Custom fiber-based framework:</strong> Built on C++ stackful fibers (similar to Go’s goroutines) to abstract I/O operations and manage concurrency within each thread.</li><li><strong>Snapshotting with io_uring:</strong> Uses Linux’s efficient async I/O interface instead of Redis traditional fork + copy-on-write (COW), significantly improving I/O performance.</li><li><strong>Data structure enhancements:</strong></li><li><strong><em>DashTables:</em></strong><em> Replaces traditional Redis hashtables for better memory efficiency and performance.</em></li><li><strong><em>B+ Trees:</em></strong><em> Used for sorted sets to optimize indexing and range queries.</em></li><li><strong><em>SSD-based tiering:</em></strong><em> Introduced specifically for string values to allow datasets to exceed available RAM.</em></li><li><strong>Command support:</strong> While Dragonfly supports most Redis commands, not all are implemented yet.</li><li><strong>Licensing:</strong> Released under Business Source License 1.1 (BSL 1.1) — free for internal use, but restricted from being offered as a managed service.</li></ul><h3>3. Setup &amp; Performance Benchmarking: Dragonfly vs. Valkey vs. Redis</h3><p>Although Redis and Valkey are largely identical, we enabled I/O threading in Valkey (with 6 threads) to evaluate how Redis/Valkey compares to Dragonfly, which was run with 8 threads (utilizing all available CPU cores).</p><h4>Infrastructure</h4><ul><li><strong>Cache Server:</strong> 8-core, 64 GB RAM</li><li><strong>Client machine:</strong> 4-core, 8 GB RAM</li><li><strong>Tool:</strong> memtier_benchmark (Redis Labs)</li></ul><h4>Techstack Versions</h4><ul><li><strong>Redis:</strong> Community Edition May 2025</li><li><strong>Valkey:</strong> Latest version May 2025</li><li><strong>Dragonfly:</strong> Community Edition 1.29.x April 2025</li></ul><h3>3.1 Benchmark : String SET &amp; GET</h3><p><strong>Conclusion:</strong> Dragonfly outperforms Redis and Valkey (except in p99.9 latency).</p><p><strong>Dragonfly vs Redis</strong></p><ul><li><strong>Winner:</strong> Dragonfly</li><li><strong>SET:</strong> ~239% higher operations/sec, ~70% lower average latency, ~29% less RAM than Redis</li><li><strong>GET:</strong> ~200% higher operations/sec, ~67% lower average latency, ~29% less RAM than Redis</li><li><strong>Snapshot:</strong> ~62% smaller snapshot size than Redis</li><li><strong>CPU:</strong> higher CPU (538%–843%) than Redis.</li></ul><p><strong>Valkey vs Redis</strong></p><ul><li><strong>Winner:</strong> Valkey (except for snapshot size)</li><li><strong>SET:</strong> ~107% higher operations/sec, ~51% lower average latency, slightly higher RAM than Redis</li><li><strong>GET:</strong> ~109% higher operations/sec, ~52% lower average latency, ~1% less RAM than Redis</li><li><strong>Snapshot:</strong> ~60% larger snapshot size than Redis</li><li><strong>CPU:</strong> higher CPU (506%–681%) than Redis.</li></ul><p><strong>Dragonfly vs Valkey</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except for p99.9 latency)</li><li><strong>SET:</strong> ~64% higher operations/sec, ~38% lower average latency, ~29% less RAM than Valkey</li><li><strong>GET:</strong> ~44% higher operations/sec, ~30% lower average latency, ~29% less RAM than Valkey</li><li><strong>Snapshot:</strong> ~76% smaller snapshot size than Valkey</li><li><strong>CPU:</strong> higher CPU (5%–21%) than Valkey.</li><li><strong>Valkey outperforms Dragonfly</strong> for SET by 7% in p99.9 latency, for GET by 16% in p99.9 latency (reasons unknown).</li></ul><h3>3.2 Benchmark : Sorted Sets (ZADD, ZRANGEBYSCORE)</h3><p><strong>Conclusion:</strong> Dragonfly outperforms Redis (except in ZADD p99.9 latency) and Valkey (except in ZADD p99 &amp; p99.9 latency).</p><p><strong>Dragonfly vs Redis</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except for ZADD p99.9 latency)</li><li><strong>ZADD:</strong> ~220% higher operations/sec, ~67% lower average latency, ~43% less RAM than Redis</li><li><strong>ZRANGEBYSCORE:</strong> ~183% higher operations/sec, ~64% lower average latency, ~40% less RAM than Redis</li><li><strong>Snapshot:</strong> Slightly higher snapshot size than Redis</li><li><strong>CPU:</strong> higher CPU (189%–438%) than Redis.</li><li><strong>Redis outperforms Dragonfly</strong> for ZADD by 341% in p99.9 latency (reasons unknown).</li></ul><p><strong>Valkey vs Redis</strong></p><ul><li><strong>Winner:</strong> Valkey (except in snapshot size)</li><li><strong>ZADD:</strong> ~99% higher operations/sec, ~49% lower average latency, ~14% more RAM than Redis</li><li><strong>ZRANGEBYSCORE:</strong> ~118% higher operations/sec, ~54% lower average latency, ~10% more RAM than Redis</li><li><strong>Snapshot:</strong> Slightly higher snapshot size than Redis</li><li><strong>CPU:</strong> higher CPU (241%–472%) than Redis.</li></ul><p><strong>Dragonfly vs Valkey</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except in p99 &amp; p99.9 latency)</li><li><strong>ZADD:</strong> ~61% higher operations/sec, ~35% lower average latency, ~50% less RAM than Valkey</li><li><strong>ZRANGEBYSCORE:</strong> ~30% higher operations/sec, ~22% lower average latency, ~45% less RAM than Valkey</li><li><strong>Snapshot:</strong> Slightly higher snapshot size than Valkey</li><li><strong>CPU:</strong> lower CPU (6%–15%) than Valkey.</li><li><strong>Valkey outperforms Dragonfly</strong> for ZADD by 97% in p99 latency and ~645% in p99.9 latency (reasons unknown).</li></ul><h3>3.3 Benchmark : Hash (HSET, HMGET)</h3><p><strong>Conclusion:</strong> Dragonfly outperforms Redis and Valkey (except for HMGET in p99 &amp; p99.9 latency).</p><p><strong>Dragonfly vs Redis</strong></p><ul><li><strong>Winner:</strong> Dragonfly</li><li><strong>HSET:</strong> ~258% higher operations/sec, ~72% lower average latency, ~5% less RAM than Redis</li><li><strong>HMGET:</strong> ~102% higher operations/sec, ~50% lower average latency, ~5% less RAM than Redis</li><li><strong>Snapshot:</strong> ~84% lower snapshot size and ~94% lower snapshot time than Redis</li><li><strong>CPU:</strong> higher CPU (250%–605%) than Redis.</li></ul><p><strong>Valkey vs Redis</strong></p><ul><li><strong>Winner:</strong> Valkey (except in snapshot time)</li><li><strong>HSET:</strong> ~83% higher operations/sec, ~45% lower average latency, ~3% more RAM than Redis</li><li><strong>HMGET:</strong> ~92% higher operations/sec, ~47% lower average latency, ~3% more RAM than Redis</li><li><strong>Snapshot:</strong> same snapshot size but ~1% higher snapshot time than Redis.</li><li><strong>CPU:</strong> higher CPU (241%–516%) than Redis.</li></ul><p><strong>Dragonfly vs Valkey</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except in p99 &amp; p99.9 latency)</li><li><strong>HSET:</strong> ~95.3% higher operations/sec, ~49% lower average latency, ~8% less RAM than Valkey</li><li><strong>HMGET:</strong> ~5% higher operations/sec, ~4% lower average latency, ~8% less RAM than Valkey</li><li><strong>Snapshot:</strong> ~83% lower snapshot size and ~94% lesser snapshot time than Valkey</li><li><strong>CPU:</strong> higher CPU (3%-14%) than Valkey.</li><li><strong>Valkey outperforms Dragonfly</strong> for HMGET by 16% on p99 latency and 32% for p99.9 latency (reasons unknown).</li></ul><h3>3.4 Benchmark : LIST (LPUSH, LRANGE)</h3><p><strong>Conclusion:</strong> Dragonfly outperforms Redis (except for snapshot size &amp; time) and Valkey (except in p99 &amp; p99.9 latency, snapshot size &amp; time).</p><p><strong>Note:</strong> The benchmark involved pushing 8 crore events into a list — an unrealistic scenario, solely done for testing purposes.</p><p><strong>Dragonfly vs Redis</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except for snapshot size and time)</li><li><strong>LPUSH:</strong> ~194% higher operations/sec, ~65% lower average latency, ~1% less RAM than Redis</li><li><strong>LRANGE:</strong> ~38% higher operations/sec, ~26% lower average latency, ~11% less RAM than Redis</li><li><strong>Snapshot:</strong> ~1865% larger snapshot size and ~2914% higher snapshot time than Redis</li><li><strong>CPU:</strong> higher CPU (237%–321%) than Redis.</li></ul><p><strong>Valkey vs Redis</strong></p><ul><li><strong>Winner:</strong> Valkey (except in snapshot time)</li><li><strong>LPUSH:</strong> ~125% higher operations/sec, ~55% lower average latency, slightly higher RAM as Redis</li><li><strong>LRANGE:</strong> ~79% higher operations/sec, ~44% lower average latency, ~15% less RAM than Redis</li><li><strong>Snapshot:</strong> slightly higher snapshot size and time compared to Redis.</li><li><strong>CPU:</strong> higher CPU (309%–480%) than Redis.</li></ul><p><strong>Dragonfly vs Valkey</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except in snapshot and LRANGE latency)</li><li><strong>LPUSH:</strong> ~31% higher operations/sec, ~21% lower average latency, ~1% less RAM than Valkey</li><li><strong>LRANGE:</strong> ~23% lesser operations/sec, ~32% higher average latency, ~5% more RAM than Valkey</li><li><strong>Snapshot:</strong> ~1862% larger snapshot size and ~2937% higher snapshot time than Valkey</li><li><strong>CPU:</strong> higher CPU (17%-27%) than Valkey.</li><li><strong>Valkey outperforms Dragonfly</strong> for LPUSH its 18% in p99 latency, for LRANGE its 618% on p99 latency and 415% for p99.9 latency (reasons unknown).</li></ul><h3>3.5 Benchmark : Set (SADD, SISMEMBER)</h3><p><strong>Conclusion:</strong> Dragonfly outperforms Redis (except for snapshot size &amp; time) and Valkey (except for SADD in p99 latency, snapshot size &amp; time).</p><p><strong>Note:</strong> The benchmark involved pushing 4 million events into a set — an unrealistic scenario, solely done for testing purposes.</p><p><strong>Dragonfly vs Redis</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except in snapshot time)</li><li><strong>SADD:</strong> ~180% higher operations/sec, ~63% lower average latency, ~13% less RAM than Redis</li><li><strong>SISMEMBER:</strong> ~182% higher operations/sec, ~63% lower average latency, ~3% less RAM than Redis</li><li><strong>Snapshot:</strong> Slightly higher snapshot size and 42% to 46% higher snapshot time than Redis</li><li><strong>CPU:</strong> higher CPU (194%–479%) than Redis.</li></ul><p><strong>Valkey vs Redis</strong></p><ul><li><strong>Winner:</strong> Valkey (except in snapshot time)</li><li><strong>SADD:</strong> ~122% higher operations/sec, ~55% lower average latency, slightly lower RAM than Redis</li><li><strong>SISMEMBER:</strong> ~149% higher operations/sec, ~59% lower average latency, ~5% higher RAM than Redis</li><li><strong>Snapshot:</strong> similar snapshot size but 3% higher snapshot time than Redis.</li><li><strong>CPU:</strong> higher CPU (226%–484%) than Redis.</li></ul><p><strong>Dragonfly vs Valkey</strong></p><ul><li><strong>Winner:</strong> Dragonfly (except in SADD p99 latency)</li><li><strong>SADD:</strong> ~26% higher operations/sec, ~18% lower average latency, ~12% less RAM than Valkey</li><li><strong>SISMEMBER:</strong> ~13% higher operations/sec, ~10% lower average latency, ~7% less RAM than Valkey</li><li><strong>Snapshot:</strong> Slightly higher snapshot size and 47% to 51% higher snapshot time than Valkey</li><li><strong>CPU:</strong> lower CPU (1%-10%) than Valkey.</li><li><strong>Valkey outperforms Dragonfly</strong> for SADD by 17% in p99 latency (reasons unknown).</li></ul><h3>3.6 Final summary</h3><blockquote><strong>Disclaimer:</strong> We are publishing our findings as found in the setup and the tech stack versions listed above.</blockquote><p><strong>Performance</strong></p><ul><li>Across benchmarks, Dragonfly overall outperforms Redis and Valkey.</li><li>Dragonfly has consistant p99 latencies than Valkey or Redis.</li><li>Snapshot sizes are sometimes larger, likely due to extreme benchmark scenarios involving heavy List and Set usage but nonetheless needs to be checked with the dragonfly team.</li></ul><p><strong>Scalability</strong></p><ul><li>Dragonfly scales impressively with more CPU cores, challenging Redis single-threaded, horizontally-scaled philosophy.</li><li>Dragonfly supports horizontal scaling as well, enabling performance improvements through both vertical and horizontal scaling.</li></ul><p><strong>Setup &amp; Support</strong></p><ul><li>Setting up Dragonfly is straightforward — it’s a lightweight binary with a configuration process similar to Redis. You can use redis-cli to interact with it.</li><li>While Dragonfly doesn’t yet support the full set of Redis commands, its feature set is actively growing and already covers the majority of use cases within Redbus.</li></ul><p><strong>Stability &amp; Reliability</strong></p><ul><li>Dragonfly is production-ready and already adopted by many companies, however it remains a relatively new and evolving player in the in-memory database space — unlike Redis, which is a mature, battle-tested solution with years of stability and community trust.</li></ul><h3>Conclusion</h3><blockquote>Overall Dragonfly is a strong modern alternative to Redis that remains bottlenecked by its single-threaded nature., offering excellent hardware utilization and performance-per-cost. That said, we recommend evaluating it thoroughly against your specific workload before adoption.</blockquote><h3>4. Migration &amp; Adoption Status (March 2026)</h3><p>Redbus decided to migrate to Dragonfly cloud. Redbus has seen aggressive adoption across its global cloud infrastructure with <strong>~90% of total caches migrated</strong>.</p><h3>5. Cost Savings &amp; Optimization Opportunities</h3><p>By migrating to Dragonfly cache we have targeted to save atleast <strong>~40%</strong> compared to our earlier spends on AWS Elasticache(with a savings plan). Savings are much higher compared to on-demand costs.</p><h3>6. Contributors</h3><ul><li>Harsha Nanjundaiaha</li><li>Nitish P</li><li>Swatik J Shetty</li><li>Tanveer M</li></ul><h3>7. References</h3><ol><li><a href="https://www.dragonflydb.io/blog/redis-and-dragonfly-architecture-comparison">https://www.dragonflydb.io/blog/redis-and-dragonfly-architecture-comparison</a></li><li><a href="https://github.com/dragonflydb/dragonfly">https://github.com/dragonflydb/dragonfly</a></li><li><a href="https://redis.io/">https://redis.io/</a></li><li><a href="https://github.com/valkey-io/valkey">https://github.com/valkey-io/valkey</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a06ac0ea4d24" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/redbus-journey-dragonflydb-evaluation-adoption-2025-2026-a06ac0ea4d24">Redbus Journey: DragonflyDB Evaluation &amp; Adoption (2025–2026)</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Essence of Thoughtful Leadership: Improving Core Processes Over Constant Patching]]></title>
            <link>https://medium.com/redbus-in/the-essence-of-thoughtful-leadership-improving-core-processes-over-constant-patching-6c52683bec0a?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/6c52683bec0a</guid>
            <category><![CDATA[process-improvement]]></category>
            <category><![CDATA[thought-leadership]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[navanee s]]></dc:creator>
            <pubDate>Tue, 07 Apr 2026 09:46:39 GMT</pubDate>
            <atom:updated>2026-04-07T09:46:40.467Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*x3MpQjRPLJkd0eTp" /></figure><p>This article examines “thoughtful leadership,” a concept championed by Anoop Menon, CTO of redBus, particularly concerning the strategic dilemma of prioritizing “core work versus patching on top of it.”</p><p>Thoughtful leadership, in this context, focuses on evolving organizational processes to sustainably improve the productivity of deliverables. Instead of constantly seeking new approaches, the emphasis should be on integrating modern AI tools, to enhance existing delivery models and developer productivity.</p><p><strong>The Trap of Short-Term Fixes</strong></p><p>Leaders frequently introduce new solutions to recurring problems. However, these fixes often provide only temporary relief, allowing the fundamental issues to resurface. This leads to a continuous cycle of new patches rather than a deep investigation into the root cause and the implementation of a sustainable resolution. While short-term patches can temporarily free up time for routine tasks, organizations inevitably revert to old problems or require yet another fix.</p><p><strong>Organizational Noise and Adoption Challenges</strong></p><p>Introducing numerous new approaches can create significant organizational “noise,” demanding substantial time for adoption and adjustment across all levels, from senior engineers to those at the bottom of the structure. Process changes sometimes necessitate a profound cultural shift, and their long-term outcomes are often hard to predict or articulate. Despite the initial appeal of new changes and notions, they can potentially have negative organizational consequences.</p><p><strong>Focusing on Sustainable Improvement</strong></p><p>While change is essential for a growing organization, merely patching existing problems is ineffective and often just generates the need for more patches. As Anoop Menon emphasizes, the focus should shift from constantly rebuilding solutions around a problem to understanding and improving current processes. This is achieved through cultural shifts or targeted employee training to enhance overall organizational effectiveness.</p><p>Resistance to restrictions on change in a dynamic world is a common reaction. Yet, the fundamental issues often remain constant, frequently stemming from internal skill or will deficiencies, rather than flaws in the processes themselves.</p><p><strong>The Thoughtful Approach</strong></p><p>Therefore, a thoughtful response to a changing world is not necessarily the adoption of entirely new processes, but the intelligent integration of new technology within existing ones. The priority must be on enhancing the delivery of objectives, avoiding the unproductive cycle of endless new solutions and process overhauls.</p><p>Ultimately, as the CTO advises, the focus should be on customers, not internal processes. The goal is for the existing process to evolve the people, rather than people continually inventing new processes to solve the same old problems.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6c52683bec0a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/the-essence-of-thoughtful-leadership-improving-core-processes-over-constant-patching-6c52683bec0a">The Essence of Thoughtful Leadership: Improving Core Processes Over Constant Patching</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Architecting for Determinism: Building Production-Grade AI Agents for Fleet Operations]]></title>
            <link>https://medium.com/redbus-in/architecting-for-determinism-building-production-grade-ai-agents-for-fleet-operations-ebbde86cc863?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/ebbde86cc863</guid>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[google-adk]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[agents]]></category>
            <dc:creator><![CDATA[Joydeb Barman]]></dc:creator>
            <pubDate>Tue, 07 Apr 2026 09:26:32 GMT</pubDate>
            <atom:updated>2026-04-07T09:58:22.912Z</atom:updated>
            <content:encoded><![CDATA[<p>Written in collaboration with <em>Arjun J</em> and <em>Sharad Kumar.</em></p><p>The Business Challenge: The <strong>“Human-in-the-Loop”</strong> Bottleneck</p><p>In the high-stakes world of travel logistics, pricing is a living organism. At <strong>redBus</strong>, beside our revMax engine which takes care of dynamic pricing for the buses, it manages multiple vendors on ground update requests on realtime via communication channels. Historically, these updates were sent as a chaotic stream of natural language messages via Telegram. A team of Pricing Analysts then had to manually parse these messages, log into internal tools, and execute the changes.</p><p>In the current AI landscape, there is a massive gap between a “cool chatbot demo” and a “production-ready execution engine.” When your system is responsible for real-time pricing and revenue management — as we do at <strong>redBus</strong> with our revMax ecosystem—&quot;mostly accurate&quot; isn&#39;t an option.</p><p>To handle high-frequency fare updates across hundreds of vendors on Telegram/WhatsApp, we didn’t just need a chat interface; we needed a <strong>Deterministic AI Agent</strong>. Using Google’s <strong>Agent Development Kit (ADK)</strong> and the Gemini model family, we built a system that translates messy human intent into high-precision database transactions.</p><p>Here is the architectural blueprint for building a reliable, scalable AI agent from the ground up.</p><h3>1. The Core Philosophy: Contextual Intelligence &amp; Deterministic Integrity</h3><p>Separating the Probabilistic from the Deterministic</p><p>The biggest mistake in AI engineering is asking a Large Language Model (LLM) to perform business logic. LLMs are probabilistic — they predict the next most likely word. Database writes, however, must be deterministic.</p><p>Our architecture follows a strict <strong>Separation of Concerns</strong>:</p><ul><li><strong>The LLM (The Translator):</strong> Its only job is to map natural language (e.g., <em>“update Set category 1 to 749 for Hyd-Shirdi tomorrow”</em>) into a structured, machine-readable JSON schema.</li><li><strong>The Code Layer (The Executor):</strong> A Java-based service that takes that JSON, validates it against business rules, and executes the transaction.</li></ul><h3>2. Single-Pass Orchestration via ADK</h3><p>Many AI systems suffer from “Chaining” — calling the LLM 5 or 6 times to resolve different parts of a request. This leads to high latency and “error compounding.”</p><p>Using the <strong>ADK framework</strong>, we optimized for a <strong>Single-Pass Architecture</strong>. We provide the model with a rich “System Instruction” and <strong>Few-Shot Examples</strong> at runtime. This allows the model to identify the intent, route, and fare values in a single few-seconds window, rather than a multiple-seconds chain.</p><h3>The Request Lifecycle:</h3><ol><li><strong>Ingestion:</strong> The Telegram payload hits our ADK server.</li><li><strong>Intent Mapping:</strong> The LLM produces a structured JSON output:</li></ol><p><em>{<br> “intent”: “CAPPING”,<br> “route”: “HYD-SHRDI”,<br> “date”: “2026–04–06”,<br> “updates”: [{“category”: 1, “value”: 749}]<br>}</em></p><h3>3. Solving for the “Vagueness Problem”</h3><p>Human communication is rarely perfect. An operator might say <em>“Update the price,”</em> even if they have three different buses leaving for that route.</p><p>To solve this, we implemented <strong>Stateful Multi-Turn Sessions</strong>:</p><ul><li><strong>Context Persistence:</strong> We use <strong>MongoDB</strong> to maintain a 10-minute “conversation state.”</li><li><strong>Intelligent Pushback:</strong> If the LLM identifies multiple matching services, it is instructed to trigger a MULTIPLE_SERVICES_FOUND event. The bot asks the user for clarification (e.g., <em>&quot;9:30 PM or 10:45 PM?&quot;</em>).</li><li><strong>State Merging:</strong> When the user replies, the system merges the new information with the previous context to complete the request.</li></ul><p>The following diagram provides a bird’s-eye view of how a messy human request is structured, validated, and executed in real-time (“<strong><em>Transforming Natural Language into Deterministic Fleet Commands</em></strong>”)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K6oAo64NLNSGQTmrTXsXtg.png" /></figure><h3>4. Engineering for Scale and Resilience</h3><p>Building for production means planning for failure. Our architecture includes three “hardened” engineering patterns:</p><ul><li><strong>High-Concurrency Parallel Execution:</strong> Pricing updates often involve a “fan-out” effect — for instance, a single request might trigger updates across 15 different sub-routes. To prevent bottlenecks, we utilize Java’s IntStream.parallel() to process these updates concurrently. This ensures our end-to-end response time remains at a consistent <strong>4 seconds</strong>, regardless of the request’s complexity or volume.</li><li><strong>Hot-Swappable Model Failover:</strong> In a live environment, model downtime or rate-limiting is an unavoidable reality. We implemented a <strong>Model Gateway</strong> within Redis that monitors performance in real-time. If the primary model (e.g., Gemini Pro) hits a latency spike or a 429 error, the system automatically flips traffic to a secondary model (Gemini Flash) and alerts the engineering team via webhooks, ensuring zero service interruption.</li><li><strong>Fuzzy Service Resolution Layer:</strong> To eliminate the risk of the LLM “hallucinating” Database IDs, we offload service identification to a dedicated code layer. This layer performs fuzzy matching against a Redis cache of active services, applying a <strong>±30 minute tolerance</strong> for departure times. This allows the system to remain robust even when operators use shorthand or round off departure times (e.g., identifying a “9:25 PM” bus when the user types “9:30 PM”).</li></ul><h3>5. The Impact: Redefining Operational Velocity</h3><p>By moving from manual intervention to a deterministic AI agent, we didn’t just “save time” — we created a new standard for fleet management:</p><ul><li><strong>Autonomous Operations:</strong> 54% of all pricing requests are now handled with zero human intervention.</li><li><strong>Elastic Scale:</strong> We scaled from zero to 100+ high-tier vendors with no increase in headcount.</li><li><strong>Cost Efficiency:</strong> By collapsing the logic into a single-pass architecture, we reduced API token costs by <strong>98%</strong>.</li></ul><h3>Final Thoughts</h3><p>The future of AI in the enterprise isn’t about building “chatty” assistants. It’s about building <strong>Silent Operators</strong> — systems that use the linguistic power of LLMs to bridge the gap between human messiness and digital precision.</p><p>By leveraging the ADK framework and a deterministic execution layer, we’ve proven that AI can be as reliable as any other part of the core engineering stack.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ebbde86cc863" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/architecting-for-determinism-building-production-grade-ai-agents-for-fleet-operations-ebbde86cc863">Architecting for Determinism: Building Production-Grade AI Agents for Fleet Operations</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How redBus’s Train Inventory System Handles 120,000 Reads/Sec with Sub-Millisecond Latency]]></title>
            <link>https://medium.com/redbus-in/how-redbuss-train-inventory-system-handles-120-000-reads-sec-with-sub-millisecond-latency-d391948d1d5f?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/d391948d1d5f</guid>
            <dc:creator><![CDATA[redBus_Blog]]></dc:creator>
            <pubDate>Tue, 07 Apr 2026 07:00:44 GMT</pubDate>
            <atom:updated>2026-04-07T11:30:20.566Z</atom:updated>
            <content:encoded><![CDATA[<p>Written in collaboration with Sharad Kumar</p><h3>A deep dive into the Aerospike-powered architecture for our real-time train inventory aggregator.</h3><p>At redBus, while we are widely known for bus ticketing, we also operate a rapidly growing train ticketing vertical. The engine behind this is our real-time train inventory aggregator system, a platform that needs to be incredibly fast, resilient, and scalable. As our data volume grew, we found that our reliance on traditional memory-based caching systems was becoming a bottleneck, leading to soaring infrastructure costs.</p><p>To solve this, we adopted Aerospike as the real-time database for our train inventory platform. The results have been transformative. Today, this system handles a staggering 120,000 reads per second, with a p99 latency of less than 1 millisecond.</p><p>This article is the story of how we did it. We’ll cover our architecture, our cluster configuration, and the key optimizations — like batch queries and bin projection — that helped us not only achieve massive performance gains but also reduce our client-side infrastructure by 30%.</p><h3>The Challenge: Speed and Cost-Efficiency for a Real-Time Aggregator</h3><p>Our previous setup, while performant, relied on a system that was primarily memory-driven. As our aggregated train inventory data scaled, so did the need for more RAM, which directly translated to higher and unsustainable infrastructure costs. We needed a solution that could provide the speed of an in-memory database but with the cost-efficiency of a disk-based system.</p><p>Aerospike’s Hybrid Memory Architecture (HMA) was the perfect answer. It stores indexes in RAM for lightning-fast lookups while keeping the actual data on SSDs. This model offered the best of both worlds: the sub-millisecond latency our real-time aggregator required, at a fraction of the hardware cost.</p><h3>Our Aerospike Architecture for Train Inventory</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o6iiIqfjiBBR4xRzREIWYw.jpeg" /></figure><p>To support our read-heavy workload, we designed a robust and scalable cluster. The architecture is built for high availability and throughput, ensuring that our train inventory system is always online and responsive.</p><p>Our production cluster consists of 2 nodes, configured with a replication factor of 2 to ensure data durability and high availability. This setup allows us to handle node failures without any service disruption and provides the read capacity needed to serve our traffic.</p><h3>Unlocking Efficiency: From Point Lookups to Batch Queries</h3><p>Initially, our services fetched inventory data using individual point queries for each item. While this approach was simple, it was inefficient at scale. Each query carried its own network overhead, and with thousands of requests per second, this overhead added up, putting a significant strain on both the client machines and the network.</p><p>The game-changer was switching to Aerospike’s batch queries.</p><p>Instead of sending thousands of individual get() requests, we now group multiple keys into a single getBatch() request. The server processes these keys in parallel and returns all the records in one response.</p><p>The impact was immediate and profound:</p><ol><li>30% Reduction in Client Infrastructure: By drastically reducing the number of outbound connections and network chatter, we saw a significant drop in CPU and memory usage on our client-side applications. This allowed us to scale down our client fleet by 30%, a massive cost saving.</li><li>Reduced Latency: Consolidating multiple network round-trips into one significantly lowered the overall latency for fetching a collection of inventory items.</li></ol><p>Here’s a conceptual look at how we use the Java client for batch operations.</p><pre>import com.aerospike.client.AerospikeClient;<br>import com.aerospike.client.Key;<br>import com.aerospike.client.Record;<br>import com.aerospike.client.policy.BatchPolicy;<br><br>// ...<br><br>// 1. Create an array of keys for all the records you want to fetch.<br>Key[] keys = new Key[] {<br>    new Key(&quot;ns&quot;, &quot;st&quot;, &quot;key1&quot;),<br>    new Key(&quot;ns&quot;, &quot;st&quot;, &quot;key2&quot;),<br>    new Key(&quot;ns&quot;, &quot;st&quot;, &quot;key3&quot;)<br>    // ... add up to N keys<br>};<br><br>// 2. Execute a single batch read operation.<br>Record[] records = client.get(new BatchPolicy(), keys);<br><br>// 3. Process the results. The &#39;records&#39; array contains all fetched records.<br>// The order of records corresponds to the order of keys requested.<br>for (Record record : records) {<br>    if (record != null) {<br>        // Process the record...<br>    }<br>}</pre><h3>Smart Data Fetching with Bins (Projections)</h3><p>Another powerful feature we leverage heavily is bins. In Aerospike, a record is composed of named fields called bins (similar to columns in a SQL table). When you query a record, you don’t have to retrieve the entire object. You can specify exactly which bins you need.</p><p>By fetching only the necessary bins, we significantly reduce the payload size over the network, which further cuts down latency and client-side processing effort.</p><p>Here’s how we establish a connection using the Java client.</p><pre>/ Placeholder for your Java client connection code snippet.<br>// Explain the key configuration parameters. For example:<br>import com.aerospike.client.AerospikeClient;<br>import com.aerospike.client.Host;<br>import com.aerospike.client.policy.ClientPolicy;<br>// ...<br>// 1. Define the hosts of your Aerospike cluster.<br>Host[] hosts = new Host[] {<br> new Host(&quot;aerospike-node1&quot;, 3000),<br> new Host(&quot;aerospike-node2&quot;, 3000)<br>};<br><br>// 2. Configure the client policy (e.g., timeouts, connection pools).<br>ClientPolicy policy = new ClientPolicy();<br>policy.user = &quot;user&quot;;<br>policy.password = &quot;pass&quot;;<br>policy.timeout = 50; // ms<br><br>// 3. Create and connect the client.<br>AerospikeClient client = new AerospikeClient(policy, hosts);<br><br>// The client is now ready to be used.</pre><h3>Keeping a Watchful Eye: Monitoring is Key</h3><p>You can’t manage what you don’t measure. To ensure our Aerospike cluster runs smoothly, we have a comprehensive monitoring and alerting system built using Grafana and Prometheus.</p><p>We track a wide range of metrics in real-time, including:</p><ul><li>Operations/Sec: To monitor the read/write throughput.</li><li>Latency: Tracking p95, p99, and p999 latencies for key operations.</li><li>Success/Failure Rate: Alerting us immediately to any spike in errors.</li><li>Disk &amp; Memory Usage: To keep an eye on resource utilization and plan for capacity.</li></ul><p>This dashboard gives us a live view of the cluster’s health and allows us to proactively address potential issues before they impact our users.</p><h3>Final Thoughts</h3><p>Adopting Aerospike for our train inventory aggregator was a strategic decision that paid huge dividends. We not only achieved our performance goals of handling over 120,000 reads/sec at sub-millisecond latency but also made our system more cost-effective and scalable for the future.</p><p>The key takeaways from our journey are clear: choosing the right tool for the job is critical, and continuous optimization — like moving from point queries to batching and using bin projections — can unlock massive efficiency gains.</p><p>We’re continuing to explore more of Aerospike’s capabilities and are excited about the future possibilities for our train platform.</p><p>Thanks for reading! Feel free to leave a comment below if you have any questions or want to share your own experiences with high-performance databases.</p><p><em>Originally published at </em><a href="https://medium.com/@arun.suthar/how-redbuss-train-inventory-system-handles-120-000-reads-sec-with-sub-millisecond-latency-6001006c55be?postPublishedType=repub"><em>https://medium.com</em></a><em> on April 6, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d391948d1d5f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/how-redbuss-train-inventory-system-handles-120-000-reads-sec-with-sub-millisecond-latency-d391948d1d5f">How redBus’s Train Inventory System Handles 120,000 Reads/Sec with Sub-Millisecond Latency</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Solving for Shared Payments: The Story Behind redBus’ Share Payment Link]]></title>
            <link>https://medium.com/redbus-in/solving-for-shared-payments-the-story-behind-redbus-share-payment-link-aedfde680997?source=rss----e72b45bcfe1a---4</link>
            <guid isPermaLink="false">https://medium.com/p/aedfde680997</guid>
            <dc:creator><![CDATA[redBus_Blog]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 05:03:21 GMT</pubDate>
            <atom:updated>2026-03-15T05:03:21.874Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vVtMe6y9nr0Rwp69A0iUBg.png" /></figure><p>If you look closely at how people book bus tickets, one thing becomes clear: the person booking the ticket isn’t always the one paying for it.</p><p>This happens more often than we think. A student booking a ticket home might ask a parent to pay. An employee might book travel while the company’s accounts team handles the payment. Friends planning a trip might split responsibilities: one finds the bus, another completes the payment.</p><p>For a long time, these situations were handled through the UPI Collect flow. The booker simply entered the payer’s UPI ID, a request was sent, and the payer approved it in their UPI app.</p><blockquote><em>Before:</em></blockquote><blockquote><em>Booker → Enter UPI ID → Payer Approves → Booking Confirmed</em></blockquote><p><strong>March this year, that changed :</strong></p><blockquote><em>Following updated guidelines from the National Payments Corporation of India (NPCI), platforms like redBus had to remove the Enter UPI ID / Collect option to curb frauds</em></blockquote><p>While necessary from a regulatory standpoint, it meant that a simple and familiar way for someone else to pay for a booking suddenly disappeared.</p><p>And that created a real problem.</p><h3>Understanding What Customers Needed</h3><p>When we looked at our data, we realised that <strong>thousands of customers every month rely on someone else to pay for their ticket</strong>.</p><p><strong>Some common examples:</strong></p><ul><li>Students booking tickets while their parents make the payment</li><li>Family members helping relatives complete bookings</li></ul><p>In some cases, the booker might not even have a bank account yet. In others, they simply prefer someone else to handle the payment.</p><p>Without the UPI Collect option, these customers had no simple way to ask someone else to complete the payment.</p><p>And if that happens at the payment page, the most likely outcome is simple, the booking never gets completed. Customer suffers and redBus too…</p><p>We knew we had to find a way to solve this quickly.</p><h3>A Simple Idea: Share the Payment Page</h3><p>Press enter or click to view image in full size</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZkrJyn8PDDyCO5Gi.png" /></figure><p>The idea that eventually became <strong>Share Payment Link</strong> was actually very straightforward.</p><p>If someone else needs to pay for the ticket, why not simply send them the payment page. That’s exactly what we built.</p><p>Now, when a customer reaches the payment page, they can generate a Share Payment Link and send it to the person who needs to complete the payment.</p><p>The payer opens the link, sees the same payment page, completes the payment, and the booking gets confirmed instantly. Just a simple way for two people to complete a booking together.</p><h3>Built in Just Four Days</h3><p>What makes this feature special internally is how quickly it came together.</p><p>Once the team understood the impact of removing UPI Collect, the goal was clear. We needed a solution fast so customers wouldn’t lose the ability to book tickets when someone else was paying.</p><p>Product, design, and engineering teams came together, aligned on the approach, and started building immediately.</p><p>From the first discussion to the feature going live on the platform, **Share Payment Link was designed, built, and launched in just four days.**</p><p>It was a great example of how quickly teams can move when everyone is focused on solving the same customer problem.</p><h3>Customers Started Using It Immediately</h3><p>We initially expected around 4,000 customers per day to use this feature, based on earlier usage patterns of UPI Collect.</p><p>But even with limited visibility inside the app, adoption picked up quickly. Thousands of customers have already started using Share Payment Link to complete bookings.</p><p>It confirmed something we already suspected — flexible payment options matter a lot in travel bookings.</p><h3>What Customers Told Us (This matters to us the most):</h3><p>To understand whether the feature was actually solving the right problem, we spoke to customers who had recently used Share Payment Link.</p><p>The responses were reassuring.</p><blockquote><em>Nearly 90% of the customers we spoke to were using the feature for exactly the scenarios we had anticipated, such as a father paying for his daughter’s ticket or an accounts team completing payment for an employee’s travel.</em></blockquote><p>Interestingly, some customers mentioned that they were not even aware of the earlier Collect flow. In those cases, they used workarounds like sharing screenshots of the payment page or coordinating over calls to get the booking completed, which was often inconvenient.</p><p>Many of them appreciated that redBus introduced a simpler way to handle these situations, making the process much smoother than before.</p><p>More importantly, every customer described the experience as simple and smooth.</p><p>They were able to share the link, complete the payment, and confirm the booking without any confusion.</p><h3>Keeping Travel Simple</h3><p>At redBus, our goal is simple — make it as easy as possible for people to plan and complete their journeys.</p><p>Sometimes that means adapting quickly when the payments ecosystem changes. And sometimes it means building small but meaningful features that reflect how people actually book travel.</p><p>Share Payment Link is one such example.</p><p>Because in the real world, the person planning the journey and the person paying for it are not always the same and that shouldn’t stop anyone from booking their trip.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aedfde680997" width="1" height="1" alt=""><hr><p><a href="https://medium.com/redbus-in/solving-for-shared-payments-the-story-behind-redbus-share-payment-link-aedfde680997">Solving for Shared Payments: The Story Behind redBus’ Share Payment Link</a> was originally published in <a href="https://medium.com/redbus-in">redbus India Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>