<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gaurav Talesara</title>
    <description>The latest articles on DEV Community by Gaurav Talesara (@gaurav_talesara).</description>
    <link>https://dev.to/gaurav_talesara</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3724256%2F3ab1fc88-aa7b-426c-9783-c019bd8e5915.png</url>
      <title>DEV Community: Gaurav Talesara</title>
      <link>https://dev.to/gaurav_talesara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gaurav_talesara"/>
    <language>en</language>
    <item>
      <title>7 Ways to Improve AI Code Reviews</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Sun, 08 Nov 2026 04:33:59 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/7-ways-to-improve-ai-code-reviews-46c7</link>
      <guid>https://dev.to/gaurav_talesara/7-ways-to-improve-ai-code-reviews-46c7</guid>
      <description>&lt;p&gt;AI coding assistants have changed how we develop software.&lt;/p&gt;

&lt;p&gt;Tools like Claude Code, Cursor, GitHub Copilot and others can now generate features, refactor code, modify multiple files and implement entire workflows in a fraction of the time it traditionally takes.&lt;/p&gt;

&lt;p&gt;This is a significant productivity improvement.&lt;/p&gt;

&lt;p&gt;But there is an emerging challenge that engineering teams need to address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can generate code faster than humans can review, understand and validate it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a typical development scenario.&lt;/p&gt;

&lt;p&gt;A developer asks an AI assistant to implement a feature. Within minutes, it modifies multiple files, introduces new components, updates APIs and generates supporting tests.&lt;/p&gt;

&lt;p&gt;The pull request is ready.&lt;/p&gt;

&lt;p&gt;But someone still needs to understand what changed, whether the implementation follows the architecture, whether edge cases are covered and whether the changes could affect existing functionality.&lt;/p&gt;

&lt;p&gt;Now imagine multiple developers doing this simultaneously.&lt;/p&gt;

&lt;p&gt;Reviewers have limited time, existing commitments and delivery deadlines. Reviewing every generated change deeply becomes increasingly difficult.&lt;/p&gt;

&lt;p&gt;This can lead to superficial reviews, missed issues and approvals without sufficient validation.&lt;/p&gt;

&lt;p&gt;So, how can engineering teams improve their code review processes while continuing to benefit from AI-assisted development?&lt;/p&gt;

&lt;p&gt;Here are seven practical approaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Keep Pull Requests Small and Focused
&lt;/h2&gt;

&lt;p&gt;AI coding assistants can modify multiple files and generate large amounts of code in one go.&lt;/p&gt;

&lt;p&gt;However, larger pull requests generally require more effort to understand and review.&lt;/p&gt;

&lt;p&gt;Instead of allowing AI to implement an entire feature as one massive change, break the work into smaller, logical units.&lt;/p&gt;

&lt;p&gt;For example, when implementing a user management module, separate the work into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database schema and migrations.&lt;/li&gt;
&lt;li&gt;Backend APIs and business logic.&lt;/li&gt;
&lt;li&gt;Authentication and authorization.&lt;/li&gt;
&lt;li&gt;Frontend implementation.&lt;/li&gt;
&lt;li&gt;Integration and regression tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define clear boundaries for AI coding tasks.&lt;/li&gt;
&lt;li&gt;Separate refactoring from feature implementation.&lt;/li&gt;
&lt;li&gt;Avoid unrelated changes in the same PR.&lt;/li&gt;
&lt;li&gt;Set reasonable PR size expectations.&lt;/li&gt;
&lt;li&gt;Encourage incremental commits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is not to impose an arbitrary line-count limit. It is to make each change understandable and independently reviewable.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Review the Intent Before the Implementation
&lt;/h2&gt;

&lt;p&gt;One mistake reviewers can make is jumping directly into the code without first understanding what the change is supposed to accomplish.&lt;/p&gt;

&lt;p&gt;AI might produce an implementation that looks technically correct but doesn't fully address the original requirement.&lt;/p&gt;

&lt;p&gt;Before reviewing the code, understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem is being solved?&lt;/li&gt;
&lt;li&gt;What approach was selected?&lt;/li&gt;
&lt;li&gt;Which modules and files were modified?&lt;/li&gt;
&lt;li&gt;What assumptions did the AI make?&lt;/li&gt;
&lt;li&gt;What architectural decisions were introduced?&lt;/li&gt;
&lt;li&gt;What existing functionality could be affected?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask developers to include an AI-generated implementation summary in every pull request.&lt;/p&gt;

&lt;p&gt;A useful PR description should contain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Business requirement.&lt;/li&gt;
&lt;li&gt;Implementation approach.&lt;/li&gt;
&lt;li&gt;Important files and components changed.&lt;/li&gt;
&lt;li&gt;Design decisions and assumptions.&lt;/li&gt;
&lt;li&gt;Potential impact areas.&lt;/li&gt;
&lt;li&gt;Tests performed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives reviewers context before they start examining individual changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use AI to Review AI-Generated Code
&lt;/h2&gt;

&lt;p&gt;If we are using AI to generate code, why not use AI to assist with reviewing it?&lt;/p&gt;

&lt;p&gt;AI-assisted review tools can help identify issues that might otherwise require significant manual effort.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Potential bugs and incorrect logic.&lt;/li&gt;
&lt;li&gt;Missing error handling.&lt;/li&gt;
&lt;li&gt;Security vulnerabilities.&lt;/li&gt;
&lt;li&gt;Missing test scenarios.&lt;/li&gt;
&lt;li&gt;Inconsistent coding patterns.&lt;/li&gt;
&lt;li&gt;Possible regression areas.&lt;/li&gt;
&lt;li&gt;Unnecessary complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some tools worth exploring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CodeRabbit:&lt;/strong&gt; AI-powered pull request reviews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot Code Review:&lt;/strong&gt; AI-assisted code review within GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qodo:&lt;/strong&gt; AI-powered code review and quality workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Introduce an independent AI review step before human approval.&lt;/p&gt;

&lt;p&gt;Ideally, the reviewing agent should have access to the original requirements, relevant repository context and the actual code changes.&lt;/p&gt;

&lt;p&gt;One important consideration: AI-generated review comments also need validation. AI review can miss defects or produce false positives.&lt;/p&gt;

&lt;p&gt;It should assist human reviewers, not replace their accountability.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Prioritize Reviews Based on Risk
&lt;/h2&gt;

&lt;p&gt;Not every code change deserves the same level of scrutiny.&lt;/p&gt;

&lt;p&gt;A change to a UI component has a different risk profile from a change to authentication, payment processing or database permissions.&lt;/p&gt;

&lt;p&gt;Treating every PR equally can waste valuable engineering review capacity.&lt;/p&gt;

&lt;p&gt;Consider introducing risk-based reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High-risk changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication and authorization.&lt;/li&gt;
&lt;li&gt;Payment processing.&lt;/li&gt;
&lt;li&gt;Database migrations.&lt;/li&gt;
&lt;li&gt;Data access and permissions.&lt;/li&gt;
&lt;li&gt;Security-sensitive APIs.&lt;/li&gt;
&lt;li&gt;Infrastructure and deployment configurations.&lt;/li&gt;
&lt;li&gt;Critical business logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Medium-risk changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Third-party API integrations.&lt;/li&gt;
&lt;li&gt;Shared components.&lt;/li&gt;
&lt;li&gt;Business workflows.&lt;/li&gt;
&lt;li&gt;Data transformation logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lower-risk changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI styling.&lt;/li&gt;
&lt;li&gt;Static content.&lt;/li&gt;
&lt;li&gt;Isolated presentation changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introduce risk labels for pull requests.&lt;/li&gt;
&lt;li&gt;Define mandatory reviewers for critical modules.&lt;/li&gt;
&lt;li&gt;Require additional validation for sensitive changes.&lt;/li&gt;
&lt;li&gt;Use CODEOWNERS to enforce ownership-based reviews.&lt;/li&gt;
&lt;li&gt;Apply stricter approval policies to high-risk changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to direct human attention towards changes where engineering judgment matters most.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Generate Tests Alongside Code, Not After It
&lt;/h2&gt;

&lt;p&gt;One common mistake is treating testing as a separate activity that happens after implementation.&lt;/p&gt;

&lt;p&gt;With AI-assisted development, testing should be part of the implementation workflow itself.&lt;/p&gt;

&lt;p&gt;For meaningful changes, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unit tests.&lt;/li&gt;
&lt;li&gt;Integration tests.&lt;/li&gt;
&lt;li&gt;API contract tests.&lt;/li&gt;
&lt;li&gt;End-to-end tests.&lt;/li&gt;
&lt;li&gt;Regression tests.&lt;/li&gt;
&lt;li&gt;Negative and edge-case scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if AI implements a payment workflow, don't test only successful payments.&lt;/p&gt;

&lt;p&gt;Also validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Failed transactions.&lt;/li&gt;
&lt;li&gt;Duplicate requests.&lt;/li&gt;
&lt;li&gt;Payment timeouts.&lt;/li&gt;
&lt;li&gt;Invalid amounts.&lt;/li&gt;
&lt;li&gt;Webhook retries.&lt;/li&gt;
&lt;li&gt;Unexpected third-party responses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask AI to explain the test scenarios it has covered and identify scenarios it has not covered.&lt;/p&gt;

&lt;p&gt;Review the tests against business requirements rather than simply accepting tests because they were generated alongside the implementation.&lt;/p&gt;

&lt;p&gt;Remember: Passing tests do not automatically mean the implementation is correct. The tests themselves must be meaningful.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Automate Quality Checks Before Human Approval
&lt;/h2&gt;

&lt;p&gt;Human reviewers shouldn't spend their limited time identifying every predictable issue.&lt;/p&gt;

&lt;p&gt;Move those checks into the CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;A practical pipeline should include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Automated check&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Linting and formatting&lt;/td&gt;
&lt;td&gt;Maintain code consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static analysis&lt;/td&gt;
&lt;td&gt;Identify code-quality issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit and integration tests&lt;/td&gt;
&lt;td&gt;Validate functionality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency scanning&lt;/td&gt;
&lt;td&gt;Detect vulnerable packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret detection&lt;/td&gt;
&lt;td&gt;Prevent credential exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build validation&lt;/td&gt;
&lt;td&gt;Catch build failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture checks&lt;/td&gt;
&lt;td&gt;Enforce engineering standards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage checks&lt;/td&gt;
&lt;td&gt;Identify potential testing gaps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tools worth exploring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SonarQube for code quality and static analysis.&lt;/li&gt;
&lt;li&gt;Snyk for application and dependency security.&lt;/li&gt;
&lt;li&gt;GitHub Actions for automated CI/CD checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make critical checks mandatory before merging.&lt;/p&gt;

&lt;p&gt;Use automated results to identify which changes need additional human attention.&lt;/p&gt;

&lt;p&gt;This reduces repetitive review effort and creates a consistent quality baseline across the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Monitor Production and Close the Feedback Loop
&lt;/h2&gt;

&lt;p&gt;Code review doesn't end when a pull request is merged.&lt;/p&gt;

&lt;p&gt;Even after thorough reviews and automated testing, some issues will reach production.&lt;/p&gt;

&lt;p&gt;This is why production monitoring and feedback are important parts of the engineering quality process.&lt;/p&gt;

&lt;p&gt;Monitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application errors.&lt;/li&gt;
&lt;li&gt;API failures.&lt;/li&gt;
&lt;li&gt;Performance and latency.&lt;/li&gt;
&lt;li&gt;Database issues.&lt;/li&gt;
&lt;li&gt;Security events.&lt;/li&gt;
&lt;li&gt;Deployment health.&lt;/li&gt;
&lt;li&gt;Critical user workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools such as Sentry and Datadog can help teams identify and investigate production issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to implement:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever a production incident occurs, evaluate whether it was related to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An incorrect implementation.&lt;/li&gt;
&lt;li&gt;An overlooked edge case.&lt;/li&gt;
&lt;li&gt;Insufficient test coverage.&lt;/li&gt;
&lt;li&gt;An architectural decision.&lt;/li&gt;
&lt;li&gt;An incomplete review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feed those findings back into coding guidelines, review checklists and automated tests.&lt;/p&gt;

&lt;p&gt;This creates a continuous improvement cycle instead of treating every production incident as an isolated problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It All Together: An Improved AI Code Review Workflow
&lt;/h2&gt;

&lt;p&gt;These seven practices can be combined into a more structured engineering workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. AI-assisted implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generate code in small, focused changes with clear requirements.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Developer self-review&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Review generated changes and provide implementation context.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Automated validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run builds, tests, static analysis and security checks.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Independent AI review&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Identify potential bugs, missing tests and risk areas.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Risk-based human review&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Focus on architecture, business logic, security and critical decisions.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Controlled deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use staging, deployment checks and appropriate release safeguards.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Production monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Detect issues and feed findings back into development and testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Should Engineering Teams Measure?
&lt;/h2&gt;

&lt;p&gt;As AI increases code generation speed, traditional productivity metrics may become less meaningful.&lt;/p&gt;

&lt;p&gt;Instead of measuring productivity only through lines of code, PR counts or implementation speed, consider tracking:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;What it tells us&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PR review time&lt;/td&gt;
&lt;td&gt;How long changes wait for review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review backlog&lt;/td&gt;
&lt;td&gt;Whether review capacity is becoming a bottleneck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change failure rate&lt;/td&gt;
&lt;td&gt;How often deployments cause failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escaped defects&lt;/td&gt;
&lt;td&gt;How many defects reach production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rework after merging&lt;/td&gt;
&lt;td&gt;How much additional engineering effort is required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test effectiveness&lt;/td&gt;
&lt;td&gt;Whether tests catch meaningful defects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean time to recovery&lt;/td&gt;
&lt;td&gt;How quickly teams resolve production incidents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal is to understand whether AI is improving engineering outcomes, not simply increasing the volume of code being delivered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AI is not going away, and asking developers to stop using AI coding assistants isn't the answer.&lt;/p&gt;

&lt;p&gt;We need to evolve our engineering practices alongside these tools.&lt;/p&gt;

&lt;p&gt;AI can accelerate implementation, but code quality, security, architecture, testing and production reliability still require deliberate engineering processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The objective shouldn't be to make humans review code faster. It should be to make the entire review and validation process more intelligent and effective.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't measure AI productivity only by how much code it generates.&lt;/p&gt;

&lt;p&gt;Measure it by how much reliable, secure and maintainable software reaches production.&lt;/p&gt;




&lt;h3&gt;
  
  
  Let's Discuss
&lt;/h3&gt;

&lt;p&gt;For developers, tech leads and engineering managers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are you seeing pull requests becoming significantly larger with AI coding assistants?&lt;/li&gt;
&lt;li&gt;Are you using AI-powered code review tools in your development workflow?&lt;/li&gt;
&lt;li&gt;Which of these seven practices have made the biggest difference to your team's code quality?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'd be interested in hearing what's working in real engineering teams.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>6 Automations You Can Put in Place to Strengthen Security Across Your Software Projects</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Sat, 31 Oct 2026 18:16:41 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/6-automations-you-can-put-in-place-to-strengthen-security-across-your-software-projects-d9p</link>
      <guid>https://dev.to/gaurav_talesara/6-automations-you-can-put-in-place-to-strengthen-security-across-your-software-projects-d9p</guid>
      <description>&lt;p&gt;Modern software projects depend on a growing number of frameworks, libraries, APIs, cloud services, and third-party integrations.&lt;/p&gt;

&lt;p&gt;An engineering team might maintain several applications using different technology stacks. One project may use React and Node.js, another Python and FastAPI, while an AI application may depend on LangChain, LiteLLM, vector databases, and external model APIs.&lt;/p&gt;

&lt;p&gt;Keeping all these technologies secure requires continuous attention.&lt;/p&gt;

&lt;p&gt;Security advisories need to be monitored. Dependencies need to be checked. Vulnerabilities need to be mapped to affected projects. Development pipelines need security checks. Framework changes and deprecated APIs need to be reviewed.&lt;/p&gt;

&lt;p&gt;Doing all of this manually across multiple projects can become difficult to manage.&lt;/p&gt;

&lt;p&gt;The challenge is not simply finding security information. It is identifying which information affects your projects and making sure the right engineers know what action to take.&lt;/p&gt;

&lt;p&gt;This is where automation can help.&lt;/p&gt;

&lt;p&gt;By combining workflow automation platforms such as n8n, GitHub APIs, vulnerability databases, security scanners, and AI-powered analysis, engineering teams can build a system that continuously monitors their technology stack and brings relevant issues to their attention.&lt;/p&gt;

&lt;p&gt;Here are six automations worth considering.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Technology and Vulnerability Intelligence
&lt;/h2&gt;

&lt;p&gt;The first automation is to monitor the technologies used across your projects and identify relevant security advisories.&lt;/p&gt;

&lt;p&gt;Most engineering teams use many different technologies. Keeping track of every security announcement from every framework, library, cloud provider, and development platform is not practical.&lt;/p&gt;

&lt;p&gt;Instead of asking developers to monitor these sources manually, create a workflow that collects relevant updates automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should it monitor?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depending on your technology stack, the monitoring list could include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Technologies to monitor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Node.js, npm, React, Next.js, Express&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python, FastAPI, Django, Flask&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI frameworks&lt;/td&gt;
&lt;td&gt;LangChain, LangGraph, LiteLLM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI platforms&lt;/td&gt;
&lt;td&gt;OpenAI, Anthropic, Google AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;td&gt;n8n, Make, VAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Databases&lt;/td&gt;
&lt;td&gt;PostgreSQL, MySQL, MongoDB, Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector databases&lt;/td&gt;
&lt;td&gt;Pinecone, Weaviate, Milvus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;AWS, Azure, Google Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;Docker, Kubernetes, Terraform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Auth0, Supabase Auth, Firebase Auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;GitHub Actions, GitLab CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Where can the information come from?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Security Advisories&lt;/li&gt;
&lt;li&gt;OSV.dev&lt;/li&gt;
&lt;li&gt;CISA Known Exploited Vulnerabilities (KEV)&lt;/li&gt;
&lt;li&gt;National Vulnerability Database (NVD)&lt;/li&gt;
&lt;li&gt;CERT-In advisories&lt;/li&gt;
&lt;li&gt;OWASP security announcements&lt;/li&gt;
&lt;li&gt;Official cloud and framework security advisories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How should the automation work?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run scheduled checks against selected security sources.&lt;/li&gt;
&lt;li&gt;Collect newly published advisories and updates.&lt;/li&gt;
&lt;li&gt;Extract affected technologies, packages, versions, and severity.&lt;/li&gt;
&lt;li&gt;Use AI to classify and summarize the information.&lt;/li&gt;
&lt;li&gt;Match the affected technology against the organization's project inventory.&lt;/li&gt;
&lt;li&gt;Notify the relevant project owner when an action is required.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, suppose a security advisory is published for LiteLLM.&lt;/p&gt;

&lt;p&gt;The automation should identify the affected versions, check whether any project uses LiteLLM, and notify the responsible engineer if an affected version is present.&lt;/p&gt;

&lt;p&gt;A useful notification should contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Advisory or vulnerability reference.&lt;/li&gt;
&lt;li&gt;Affected technology and versions.&lt;/li&gt;
&lt;li&gt;Projects potentially affected.&lt;/li&gt;
&lt;li&gt;Severity and exploitation status, where available.&lt;/li&gt;
&lt;li&gt;Recommended next steps.&lt;/li&gt;
&lt;li&gt;Assigned engineering owner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is to turn a general security announcement into a project-specific action.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Project and Dependency Intelligence
&lt;/h2&gt;

&lt;p&gt;The first automation tells us what is happening in the technology ecosystem. The second tells us whether those changes matter to our projects.&lt;/p&gt;

&lt;p&gt;This requires a reliable inventory of the technologies and dependencies used across every repository.&lt;/p&gt;

&lt;p&gt;Without that inventory, matching a newly announced vulnerability to an affected application becomes difficult.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should the automation collect?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For each GitHub repository, maintain information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project and repository name.&lt;/li&gt;
&lt;li&gt;Primary programming language.&lt;/li&gt;
&lt;li&gt;Frameworks and libraries.&lt;/li&gt;
&lt;li&gt;Package manager.&lt;/li&gt;
&lt;li&gt;Direct dependencies.&lt;/li&gt;
&lt;li&gt;Transitive dependencies.&lt;/li&gt;
&lt;li&gt;Installed package versions.&lt;/li&gt;
&lt;li&gt;Docker base images.&lt;/li&gt;
&lt;li&gt;GitHub Actions and other build dependencies.&lt;/li&gt;
&lt;li&gt;Infrastructure dependencies.&lt;/li&gt;
&lt;li&gt;Project owner.&lt;/li&gt;
&lt;li&gt;Production or staging environment.&lt;/li&gt;
&lt;li&gt;Last dependency update.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools that can help:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub API&lt;/td&gt;
&lt;td&gt;Discover repositories and project information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependabot&lt;/td&gt;
&lt;td&gt;Identify vulnerable dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Syft&lt;/td&gt;
&lt;td&gt;Generate Software Bills of Materials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trivy&lt;/td&gt;
&lt;td&gt;Scan dependencies and container images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSV-Scanner&lt;/td&gt;
&lt;td&gt;Check open-source dependencies for known vulnerabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renovate&lt;/td&gt;
&lt;td&gt;Manage dependency updates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Software Bill of Materials (SBOM) is a machine-readable inventory of the software components included in an application. It helps teams understand what their software contains and investigate whether a newly discovered vulnerability affects it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How should the automation work?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to the GitHub organization.&lt;/li&gt;
&lt;li&gt;Discover repositories and their package manifests.&lt;/li&gt;
&lt;li&gt;Extract dependency names and versions.&lt;/li&gt;
&lt;li&gt;Identify direct and transitive dependencies.&lt;/li&gt;
&lt;li&gt;Generate or collect SBOMs for production builds.&lt;/li&gt;
&lt;li&gt;Store the results in a central project inventory.&lt;/li&gt;
&lt;li&gt;Update the inventory whenever dependencies change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consider an organization maintaining these applications:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Dependency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real Estate CRM&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Support&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;LangChain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice AI&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Express&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG Platform&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;LiteLLM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a vulnerability is discovered in a particular version of LiteLLM, the team can search the inventory and identify which projects need investigation.&lt;/p&gt;

&lt;p&gt;One important detail: do not track only dependencies developers install directly. Transitive dependencies can introduce vulnerabilities too.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. GitHub Pull Request Security Automation
&lt;/h2&gt;

&lt;p&gt;Finding vulnerabilities after an application has been deployed is often more expensive than identifying them during development.&lt;/p&gt;

&lt;p&gt;Security checks should therefore be part of the existing development workflow.&lt;/p&gt;

&lt;p&gt;A practical starting point is to run automated security checks whenever a developer pushes code or opens a pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should be checked?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Security check&lt;/th&gt;
&lt;th&gt;Suggested tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Static application security testing (SAST)&lt;/td&gt;
&lt;td&gt;Semgrep, CodeQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency vulnerability scanning (SCA)&lt;/td&gt;
&lt;td&gt;Dependabot, OSV-Scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret detection&lt;/td&gt;
&lt;td&gt;Gitleaks, GitHub Secret Scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container scanning&lt;/td&gt;
&lt;td&gt;Trivy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure-as-Code scanning&lt;/td&gt;
&lt;td&gt;Checkov&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI application security testing&lt;/td&gt;
&lt;td&gt;Promptfoo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developer creates a pull request.&lt;/p&gt;

&lt;p&gt;The CI pipeline runs the configured security checks.&lt;/p&gt;

&lt;p&gt;Results are collected and evaluated against the team's security policies.&lt;/p&gt;

&lt;p&gt;If a mandatory check fails, the pull request is blocked from merging until the issue is resolved or an authorized exception is approved.&lt;/p&gt;

&lt;p&gt;The developer receives a notification with the finding and remediation guidance.&lt;/p&gt;

&lt;p&gt;For example, imagine a developer accidentally commits an API key.&lt;/p&gt;

&lt;p&gt;The automation should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detect the exposed credential.&lt;/li&gt;
&lt;li&gt;Fail the relevant security check.&lt;/li&gt;
&lt;li&gt;Notify the developer and repository owner.&lt;/li&gt;
&lt;li&gt;Create a remediation issue where appropriate.&lt;/li&gt;
&lt;li&gt;Guide the team through revoking or rotating the exposed credential.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Simply deleting the key in a subsequent commit is not enough. Once a credential has been exposed, it should be treated as compromised.&lt;/p&gt;

&lt;p&gt;The goal is to make security checks part of the normal development process rather than a separate activity that happens only before release.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. AI Security and Framework Announcement Monitoring
&lt;/h2&gt;

&lt;p&gt;AI applications introduce dependencies and risks that evolve quickly.&lt;/p&gt;

&lt;p&gt;A project may depend on an AI model provider, an agent framework, a vector database, an orchestration platform, or an external tool integration. Changes in any of these components can affect application security and reliability.&lt;/p&gt;

&lt;p&gt;For this reason, AI-related announcements deserve dedicated monitoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should be monitored?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI security and platform announcements.&lt;/li&gt;
&lt;li&gt;Anthropic security updates.&lt;/li&gt;
&lt;li&gt;Google AI announcements.&lt;/li&gt;
&lt;li&gt;LangChain and LangGraph releases.&lt;/li&gt;
&lt;li&gt;n8n security advisories.&lt;/li&gt;
&lt;li&gt;LiteLLM updates.&lt;/li&gt;
&lt;li&gt;Hugging Face security announcements.&lt;/li&gt;
&lt;li&gt;Vector database advisories.&lt;/li&gt;
&lt;li&gt;OWASP GenAI security updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not limit monitoring to vulnerabilities. Also track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Breaking changes.&lt;/li&gt;
&lt;li&gt;Deprecated APIs.&lt;/li&gt;
&lt;li&gt;Model retirements.&lt;/li&gt;
&lt;li&gt;Authentication changes.&lt;/li&gt;
&lt;li&gt;New security features.&lt;/li&gt;
&lt;li&gt;Changes to tool execution or agent capabilities.&lt;/li&gt;
&lt;li&gt;Important changes in framework behaviour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How should the automation work?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Monitor official release notes, advisories, and announcement feeds.&lt;/li&gt;
&lt;li&gt;Identify the affected product or framework.&lt;/li&gt;
&lt;li&gt;Classify the update as a vulnerability, breaking change, deprecation, or general announcement.&lt;/li&gt;
&lt;li&gt;Check which projects use the affected technology.&lt;/li&gt;
&lt;li&gt;Use AI to summarize the technical implications.&lt;/li&gt;
&lt;li&gt;Notify the relevant engineering team if action is needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, an AI framework announces a breaking change to its tool-execution interface.&lt;/p&gt;

&lt;p&gt;The automation identifies projects using that framework and informs their owners. The team can then review the change and plan any required updates.&lt;/p&gt;

&lt;p&gt;An important boundary: AI can help classify announcements and recommend actions, but it should not independently update production dependencies or change live AI workflows. Those changes should follow the team's normal review and approval process.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Automated Project Health Monitoring
&lt;/h2&gt;

&lt;p&gt;Security is not limited to newly announced vulnerabilities.&lt;/p&gt;

&lt;p&gt;A project can become risky because its dependencies are outdated, its framework is approaching end of life, its cloud configuration has changed, or its deployment pipeline is no longer working correctly.&lt;/p&gt;

&lt;p&gt;A scheduled project health workflow can help identify these issues before they become larger problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should it monitor?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What to check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies&lt;/td&gt;
&lt;td&gt;Vulnerable or outdated packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frameworks&lt;/td&gt;
&lt;td&gt;End-of-life versions and deprecated components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;Security alerts and repository configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Failed builds and deployment checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Configuration and access-control issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL/TLS&lt;/td&gt;
&lt;td&gt;Certificate expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APIs&lt;/td&gt;
&lt;td&gt;Integration failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI services&lt;/td&gt;
&lt;td&gt;Model and API deprecations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Databases&lt;/td&gt;
&lt;td&gt;Version status and backup checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers&lt;/td&gt;
&lt;td&gt;Known image vulnerabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository hygiene&lt;/td&gt;
&lt;td&gt;Unused dependencies and outdated workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How should the automation work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run scheduled checks for each registered project.&lt;/p&gt;

&lt;p&gt;Collect the findings and categorize them by severity and operational impact.&lt;/p&gt;

&lt;p&gt;Generate a project health report that identifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues requiring immediate attention.&lt;/li&gt;
&lt;li&gt;Dependencies that need updates.&lt;/li&gt;
&lt;li&gt;Security controls that are missing or failing.&lt;/li&gt;
&lt;li&gt;Infrastructure or integration problems.&lt;/li&gt;
&lt;li&gt;Recommended remediation actions.&lt;/li&gt;
&lt;li&gt;Responsible project owners.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The report can be delivered weekly through Slack or email, with critical findings sent immediately rather than waiting for the weekly summary.&lt;/p&gt;

&lt;p&gt;This gives engineering leads a consistent view of project health without requiring them to manually inspect every repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Security News and Industry Intelligence Digest
&lt;/h2&gt;

&lt;p&gt;Not every security announcement affects a project directly. However, broader security developments can still help engineering teams understand emerging threats and adjust their practices.&lt;/p&gt;

&lt;p&gt;A dedicated intelligence digest can collect important security news and make it easier for teams to stay informed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Potential information sources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Hacker News.&lt;/li&gt;
&lt;li&gt;BleepingComputer.&lt;/li&gt;
&lt;li&gt;CISA.&lt;/li&gt;
&lt;li&gt;CERT-In.&lt;/li&gt;
&lt;li&gt;GitHub Security Advisories.&lt;/li&gt;
&lt;li&gt;OWASP.&lt;/li&gt;
&lt;li&gt;Microsoft Security Blog.&lt;/li&gt;
&lt;li&gt;AWS Security Bulletins.&lt;/li&gt;
&lt;li&gt;Google Cloud Security updates.&lt;/li&gt;
&lt;li&gt;Official open-source release notes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How should the automation work?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collect new articles, advisories, and announcements.&lt;/li&gt;
&lt;li&gt;Remove duplicate reports.&lt;/li&gt;
&lt;li&gt;Categorize them by threat type and technology.&lt;/li&gt;
&lt;li&gt;Identify the affected products and industries.&lt;/li&gt;
&lt;li&gt;Use AI to create a concise technical summary.&lt;/li&gt;
&lt;li&gt;Highlight whether the issue relates to technologies used by the organization.&lt;/li&gt;
&lt;li&gt;Publish a daily or weekly digest.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A useful digest should not simply list headlines.&lt;/p&gt;

&lt;p&gt;It should explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happened?&lt;/li&gt;
&lt;li&gt;Which technology or business area is affected?&lt;/li&gt;
&lt;li&gt;Why does it matter to engineering teams?&lt;/li&gt;
&lt;li&gt;Do any internal projects need investigation?&lt;/li&gt;
&lt;li&gt;Is there an action the team should take?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This distinction matters. A long list of security headlines creates more reading work. A short, relevant digest helps engineers focus on what deserves attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bringing These Automations Together
&lt;/h2&gt;

&lt;p&gt;These six automations become more useful when they share information instead of operating independently.&lt;/p&gt;

&lt;p&gt;For example, vulnerability monitoring becomes much more effective when it can access the dependency inventory. Similarly, project health monitoring can reuse findings from the pull request security checks.&lt;/p&gt;

&lt;p&gt;A practical architecture could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Security Sources       GitHub Repositories
      |                        |
      v                        v
Technology &amp;amp;            Dependency Inventory
Vulnerability                  |
Monitoring                      |
      |                        |
      +-----------+------------+
                  |
                  v
       Central Project Inventory
                  |
                  v
       AI Classification &amp;amp; Analysis
                  |
                  v
        Risk and Impact Assessment
                  |
                  v
       Notifications &amp;amp; Action Tracking
          |          |          |
          v          v          v
        Slack      Email    GitHub Issues
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;n8n can coordinate scheduled workflows, API integrations, notifications, and data movement. GitHub provides repository and development-event information. Security scanners and vulnerability databases provide technical findings. AI can help classify, summarize, and explain those findings.&lt;/p&gt;

&lt;p&gt;A central project inventory connects all of these components.&lt;/p&gt;

&lt;p&gt;The most important part is that the system should understand which technologies each project uses. Without that context, it becomes another generic security news aggregator.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Should You Implement First?
&lt;/h2&gt;

&lt;p&gt;Trying to build all six automations at once would create unnecessary complexity.&lt;/p&gt;

&lt;p&gt;I would approach implementation in phases.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Automation&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;GitHub repository and dependency inventory&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Technology and vulnerability monitoring&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;GitHub pull request security checks&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Security news and technology digest&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;AI and framework announcement monitoring&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Automated project health monitoring&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first three provide the foundation.&lt;/p&gt;

&lt;p&gt;You need to know what your projects use before you can reliably identify which vulnerabilities affect them. You also need security checks inside the development workflow to catch issues before they reach production.&lt;/p&gt;

&lt;p&gt;Once these are in place, the remaining automations can expand monitoring and improve engineering visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few Things to Keep in Mind
&lt;/h2&gt;

&lt;p&gt;Automation can improve security visibility, but it does not replace engineering judgment.&lt;/p&gt;

&lt;p&gt;A few principles should guide the implementation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validate vulnerability findings.&lt;/strong&gt; Match package names and affected version ranges carefully. A vulnerability announcement does not automatically mean every project using that technology is affected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prioritize by actual risk.&lt;/strong&gt; Consider severity, exploitability, exposure, environment, and business impact. A high-severity issue in an isolated development tool may require a different response from a remotely exploitable vulnerability in a production authentication service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep humans involved in sensitive changes.&lt;/strong&gt; AI can recommend dependency updates or remediation steps, but production changes should follow an approved engineering process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid alert fatigue.&lt;/strong&gt; Deduplicate findings, group related alerts, and notify people based on project ownership and urgency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track remediation, not just detection.&lt;/strong&gt; An alert is useful only if someone owns it, investigates it, and verifies that the issue has been resolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;As engineering teams maintain more projects and adopt more technologies, manually tracking every vulnerability, dependency update, framework announcement, and security issue becomes increasingly difficult.&lt;/p&gt;

&lt;p&gt;These six automations offer a practical way to improve that process.&lt;/p&gt;

&lt;p&gt;The real value does not come from collecting more security information. It comes from connecting that information to the projects that matter, identifying the potential impact, and helping the responsible engineers take action.&lt;/p&gt;

&lt;p&gt;Start with project visibility, dependency intelligence, and automated security checks in your development pipeline. Build the remaining workflows around those foundations.&lt;/p&gt;

&lt;p&gt;The objective is straightforward: make security monitoring a continuous part of software engineering, rather than something teams remember to do only when an issue makes the news.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>softwaredevelopment</category>
      <category>automation</category>
    </item>
    <item>
      <title>6 Security Practices Developers Should Prioritize in the Age of AI</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Sat, 31 Oct 2026 17:43:22 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/6-security-practices-developers-should-prioritize-in-the-age-of-ai-1dla</link>
      <guid>https://dev.to/gaurav_talesara/6-security-practices-developers-should-prioritize-in-the-age-of-ai-1dla</guid>
      <description>&lt;p&gt;Software development is changing rapidly.&lt;/p&gt;

&lt;p&gt;AI coding assistants are helping developers write code faster. AI agents are beginning to interact with APIs, databases, cloud services, and internal tools. Modern applications are also becoming more connected through third-party integrations, open-source dependencies, and distributed infrastructure.&lt;/p&gt;

&lt;p&gt;These changes create new opportunities, but they also expand the attack surface.&lt;/p&gt;

&lt;p&gt;A vulnerability is no longer limited to a piece of application code. It can originate from a compromised dependency, an exposed developer token, an insecure API integration, an overprivileged AI agent, or a misconfigured cloud service.&lt;/p&gt;

&lt;p&gt;The challenge is that many traditional security practices were designed for a different development environment.&lt;/p&gt;

&lt;p&gt;Security can no longer be treated as a final checklist before deployment. It needs to be part of how we design, build, test, deploy, and operate software.&lt;/p&gt;

&lt;p&gt;Here are six security practices developers should prioritize in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Treat AI-Assisted Development as a Security Concern
&lt;/h2&gt;

&lt;p&gt;AI coding assistants can accelerate development, but generated code is not automatically secure code.&lt;/p&gt;

&lt;p&gt;An AI assistant may suggest an implementation that works functionally while introducing security weaknesses. It might generate an unsafe database query, overlook input validation, expose sensitive information in logs, or recommend an outdated package.&lt;/p&gt;

&lt;p&gt;The risk increases when developers accept generated code without understanding or reviewing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What developers should do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review AI-generated code with the same scrutiny as human-written code.&lt;/li&gt;
&lt;li&gt;Validate input and encode output appropriately.&lt;/li&gt;
&lt;li&gt;Check authorization rules, not just authentication.&lt;/li&gt;
&lt;li&gt;Avoid sharing secrets, credentials, customer data, or proprietary information with AI tools unless the tool and its data-handling policies have been approved.&lt;/li&gt;
&lt;li&gt;Run static analysis, dependency checks, and security tests on AI-assisted changes.&lt;/li&gt;
&lt;li&gt;Understand the code before merging it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI should improve developer productivity, not replace engineering judgment.&lt;/p&gt;

&lt;p&gt;The same principle applies to AI agents. If an agent can access internal tools, databases, APIs, or cloud resources, treat it as a security-sensitive identity. Give it narrowly scoped permissions, validate its inputs and outputs, and keep a record of the actions it performs.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Secure the Software Supply Chain
&lt;/h2&gt;

&lt;p&gt;Modern applications depend on a large ecosystem of open-source libraries, frameworks, packages, build tools, and external services.&lt;/p&gt;

&lt;p&gt;That ecosystem makes development faster, but it also creates supply-chain risk.&lt;/p&gt;

&lt;p&gt;A vulnerability or compromise in a dependency can affect every application that uses it. Attackers may also target package registries, build pipelines, maintainers, or developer tooling to introduce malicious code into otherwise trusted software.&lt;/p&gt;

&lt;p&gt;A package being popular or widely used does not automatically make it safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What developers should do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintain an inventory of direct and transitive dependencies.&lt;/li&gt;
&lt;li&gt;Scan dependencies for known vulnerabilities.&lt;/li&gt;
&lt;li&gt;Remove packages that are no longer needed.&lt;/li&gt;
&lt;li&gt;Pin dependency versions where appropriate and use lockfiles consistently.&lt;/li&gt;
&lt;li&gt;Verify package sources and integrity.&lt;/li&gt;
&lt;li&gt;Review dependency updates before introducing them into production.&lt;/li&gt;
&lt;li&gt;Generate and maintain a Software Bill of Materials (SBOM) where appropriate.&lt;/li&gt;
&lt;li&gt;Protect build pipelines and restrict who can publish or modify packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools such as dependency scanners and software composition analysis (SCA) solutions can help identify known risks.&lt;/p&gt;

&lt;p&gt;The objective is not to avoid open source. It is to understand what your application depends on and maintain control over that dependency chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Treat Third-Party Integrations as Part of Your Attack Surface
&lt;/h2&gt;

&lt;p&gt;Most modern applications do not operate in isolation.&lt;/p&gt;

&lt;p&gt;They integrate with payment providers, authentication services, analytics platforms, messaging systems, cloud services, customer-management tools, and many other external vendors.&lt;/p&gt;

&lt;p&gt;Every integration introduces a trust relationship.&lt;/p&gt;

&lt;p&gt;Even if your application is secure, a compromised vendor, insecure integration, or excessive access permission can create a path into your environment.&lt;/p&gt;

&lt;p&gt;This is particularly important for organizations that rely on multiple SaaS platforms and external service providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What developers and engineering teams should do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluate the security requirements of third-party services before integrating them.&lt;/li&gt;
&lt;li&gt;Request only the permissions an integration actually needs.&lt;/li&gt;
&lt;li&gt;Store and rotate integration credentials securely.&lt;/li&gt;
&lt;li&gt;Validate incoming webhook signatures.&lt;/li&gt;
&lt;li&gt;Apply authentication and authorization to service-to-service communication.&lt;/li&gt;
&lt;li&gt;Set timeouts, rate limits, and sensible failure-handling behavior.&lt;/li&gt;
&lt;li&gt;Review vendor access periodically and remove integrations that are no longer required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not assume that a third-party service is safe simply because it is widely adopted.&lt;/p&gt;

&lt;p&gt;Every integration should have a clear owner, a defined purpose, and an appropriate level of access.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Protect Credentials, Tokens, and Privileged Identities
&lt;/h2&gt;

&lt;p&gt;Credentials are among the most valuable assets in a modern software environment.&lt;/p&gt;

&lt;p&gt;An exposed cloud access key, database password, CI/CD token, developer credential, or service-account secret can give an attacker access far beyond a single application.&lt;/p&gt;

&lt;p&gt;The problem is not limited to production credentials. Developer machines, build systems, deployment pipelines, and internal automation tools can also hold powerful access.&lt;/p&gt;

&lt;p&gt;As applications become more distributed and AI agents gain access to tools, identity management becomes even more important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What developers should do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never hardcode credentials in source code.&lt;/li&gt;
&lt;li&gt;Use approved secret-management systems.&lt;/li&gt;
&lt;li&gt;Avoid storing secrets in configuration files that are committed to version control.&lt;/li&gt;
&lt;li&gt;Rotate credentials regularly and immediately after suspected exposure.&lt;/li&gt;
&lt;li&gt;Use short-lived credentials where supported.&lt;/li&gt;
&lt;li&gt;Apply least-privilege access to users, services, pipelines, and agents.&lt;/li&gt;
&lt;li&gt;Enable multi-factor authentication for privileged accounts.&lt;/li&gt;
&lt;li&gt;Audit access to sensitive resources.&lt;/li&gt;
&lt;li&gt;Remove unused accounts, tokens, and service credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful question to ask during a security review is:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If this credential were compromised today, what could an attacker access?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the answer includes more systems or data than necessary, the permission model needs attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Build Application Security Into the Development Lifecycle
&lt;/h2&gt;

&lt;p&gt;Application vulnerabilities remain a major source of security incidents.&lt;/p&gt;

&lt;p&gt;Common weaknesses include broken access control, injection vulnerabilities, insecure authentication, security misconfiguration, and improper handling of sensitive data.&lt;/p&gt;

&lt;p&gt;These problems are often preventable when security is considered during design and development rather than after an application has been released.&lt;/p&gt;

&lt;p&gt;For example, an application may authenticate a user correctly but fail to verify whether that user is authorized to access a particular record.&lt;/p&gt;

&lt;p&gt;That is an authorization failure, and it can expose customer data even when login functionality appears to work as expected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What developers should do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perform threat modeling for important application features.&lt;/li&gt;
&lt;li&gt;Validate and sanitize untrusted input.&lt;/li&gt;
&lt;li&gt;Use parameterized queries instead of constructing SQL from user input.&lt;/li&gt;
&lt;li&gt;Enforce authorization checks on the server side.&lt;/li&gt;
&lt;li&gt;Apply secure session management.&lt;/li&gt;
&lt;li&gt;Protect sensitive data in transit and at rest.&lt;/li&gt;
&lt;li&gt;Configure security headers and safe defaults.&lt;/li&gt;
&lt;li&gt;Review error handling to avoid exposing internal details.&lt;/li&gt;
&lt;li&gt;Include security testing in code reviews and CI/CD pipelines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The OWASP Top 10 is a useful starting point for understanding common web application security risks.&lt;/p&gt;

&lt;p&gt;Security testing should also cover APIs, mobile applications, background jobs, and internal services—not just the user-facing web interface.&lt;/p&gt;

&lt;p&gt;The earlier a vulnerability is identified, the easier it is generally to address.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Move From One-Time Security Checks to Continuous Monitoring and Response
&lt;/h2&gt;

&lt;p&gt;Passing a security scan before deployment does not mean an application will remain secure.&lt;/p&gt;

&lt;p&gt;New vulnerabilities are discovered. Dependencies change. Infrastructure configuration drifts. Credentials may be exposed. Attack patterns evolve.&lt;/p&gt;

&lt;p&gt;Security is an ongoing operational responsibility.&lt;/p&gt;

&lt;p&gt;Organizations need to know not only whether vulnerabilities exist, but also whether suspicious activity is happening in their environments and how quickly they can respond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What engineering teams should do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuously monitor application and infrastructure logs.&lt;/li&gt;
&lt;li&gt;Collect security-relevant events from applications, APIs, identity systems, and cloud services.&lt;/li&gt;
&lt;li&gt;Configure alerts for unusual authentication and access patterns.&lt;/li&gt;
&lt;li&gt;Monitor privileged operations and sensitive data access.&lt;/li&gt;
&lt;li&gt;Reassess vulnerabilities as new information becomes available.&lt;/li&gt;
&lt;li&gt;Establish an incident-response process with clear ownership.&lt;/li&gt;
&lt;li&gt;Maintain tested backups and recovery procedures.&lt;/li&gt;
&lt;li&gt;Run incident-response exercises so teams understand their responsibilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monitoring is useful only when teams know how to act on what they discover.&lt;/p&gt;

&lt;p&gt;A security alert without an owner, escalation path, or response procedure is unlikely to provide much protection.&lt;/p&gt;

&lt;p&gt;The goal is to reduce the time between detecting a potential compromise and taking meaningful action.&lt;/p&gt;




&lt;h2&gt;
  
  
  Making Security Part of Everyday Engineering
&lt;/h2&gt;

&lt;p&gt;These six practices are connected.&lt;/p&gt;

&lt;p&gt;AI-assisted development affects code quality and review. Dependencies and third-party integrations expand the trust boundary. Credentials determine what users, services, and agents can access. Application security protects data and business logic. Continuous monitoring helps identify problems that make it through preventive controls.&lt;/p&gt;

&lt;p&gt;No single tool can address all of these risks.&lt;/p&gt;

&lt;p&gt;A practical approach is to integrate security into the existing engineering workflow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engineering stage&lt;/th&gt;
&lt;th&gt;Security practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture and design&lt;/td&gt;
&lt;td&gt;Threat modeling and secure design reviews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Secure coding and AI-generated code review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency management&lt;/td&gt;
&lt;td&gt;Vulnerability scanning and dependency verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code review&lt;/td&gt;
&lt;td&gt;Static analysis and security-focused reviews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Automated security checks and protected pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Secure configuration and least-privilege access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;Continuous monitoring and incident response&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with the risks that matter most to your application and business. Assign ownership, automate repeatable checks, and make security findings part of normal engineering discussions.&lt;/p&gt;

&lt;p&gt;The objective is not to slow down development with unnecessary controls. It is to make secure development the natural way of working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AI is accelerating software development, but it is also changing how software can be attacked.&lt;/p&gt;

&lt;p&gt;More integrations, more dependencies, more automation, and more powerful identities mean that security needs to evolve alongside engineering practices.&lt;/p&gt;

&lt;p&gt;Developers do not need to become security specialists overnight. But they do need to understand the risks introduced by the systems they build and the tools they use.&lt;/p&gt;

&lt;p&gt;Build with security in mind. Review what you trust. Limit what systems can access. Monitor what happens in production. And make sure your team knows how to respond when something goes wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best security strategy is not a checklist completed before release. It is an engineering discipline practiced throughout the software lifecycle.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;OWASP Top 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/" rel="noopener noreferrer"&gt;OWASP Top 10 for LLM Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://csrc.nist.gov/Projects/ssdf" rel="noopener noreferrer"&gt;NIST Secure Software Development Framework (SSDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cisa.gov/securebydesign" rel="noopener noreferrer"&gt;CISA Secure by Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#cybersecurity&lt;/code&gt; &lt;code&gt;#applicationsecurity&lt;/code&gt; &lt;code&gt;#devsecops&lt;/code&gt; &lt;code&gt;#ai&lt;/code&gt; &lt;code&gt;#softwaredevelopment&lt;/code&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>ai</category>
      <category>security</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Your AI Demo Works. Will Your LLM Architecture Survive 15 Seconds?</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Sat, 10 Oct 2026 06:04:30 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/your-ai-demo-works-will-your-llm-architecture-survive-15-seconds-23no</link>
      <guid>https://dev.to/gaurav_talesara/your-ai-demo-works-will-your-llm-architecture-survive-15-seconds-23no</guid>
      <description>&lt;p&gt;Imagine you are building an AI customer support assistant for an e-commerce company.&lt;/p&gt;

&lt;p&gt;A customer opens the chat and asks:&lt;/p&gt;

&lt;p&gt;"Where is my order? It was supposed to arrive yesterday."&lt;/p&gt;

&lt;p&gt;Your application retrieves the order status, checks the shipping information, sends the relevant details to an LLM, and returns a helpful answer.&lt;/p&gt;

&lt;p&gt;During development, everything works.&lt;/p&gt;

&lt;p&gt;Then a major sale begins. Thousands of customers start using the assistant. The LLM provider becomes slower, some requests receive HTTP 429 responses, and a few requests time out.&lt;/p&gt;

&lt;p&gt;Now customers are waiting for answers about their orders. Support tickets begin to pile up.&lt;/p&gt;

&lt;p&gt;The model is still capable of generating an answer. Your application is struggling to deliver it reliably.&lt;/p&gt;

&lt;p&gt;This is where production LLM architecture matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understand the business workflow first
&lt;/h2&gt;

&lt;p&gt;Let's define a simple target: the application should return a response within 15 seconds.&lt;/p&gt;

&lt;p&gt;That is an illustrative service objective for this example, not a universal recommendation. The appropriate deadline depends on the user experience and business requirements.&lt;/p&gt;

&lt;p&gt;A typical request might follow this path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer
   |
   v
Support Chat API
   |
   v
Authentication + Order Lookup
   |
   v
LLM Gateway
   |
   +------&amp;gt; Primary LLM Provider
   |
   +------&amp;gt; Approved Fallback
   |
   v
Validate Answer
   |
   v
Return to Customer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that the LLM is not responsible for looking up the order by itself.&lt;/p&gt;

&lt;p&gt;Your backend should retrieve authoritative order and shipping information from the relevant systems. The model can explain those facts in natural language, but it should not invent an order status or guess a delivery date.&lt;/p&gt;

&lt;p&gt;This separation is the first important design decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What can go wrong within 15 seconds?
&lt;/h2&gt;

&lt;p&gt;Suppose the request takes this much time:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Authenticate customer&lt;/td&gt;
&lt;td&gt;200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retrieve order and shipment&lt;/td&gt;
&lt;td&gt;800 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build prompt and context&lt;/td&gt;
&lt;td&gt;200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wait for LLM response&lt;/td&gt;
&lt;td&gt;8 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validate and return answer&lt;/td&gt;
&lt;td&gt;300 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.5 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This request succeeds within the 15-second budget.&lt;/p&gt;

&lt;p&gt;Now imagine the LLM takes 12 seconds and returns a rate-limit error. Your application retries, and the second request takes another 8 seconds.&lt;/p&gt;

&lt;p&gt;The customer has now waited more than 20 seconds.&lt;/p&gt;

&lt;p&gt;The lesson is simple: setting a timeout on each API call is not the same as setting a deadline for the entire business operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Enforce one end-to-end deadline
&lt;/h2&gt;

&lt;p&gt;Start with a deadline for the complete request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;REQUEST_BUDGET_MS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createDeadline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;REQUEST_BUDGET_MS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;remainingTimeMs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deadline&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the order lookup finishes, calculate the remaining time before calling the model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deadline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createDeadline&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getOrderForCustomer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;orderId&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;remainingTimeMs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Request deadline exceeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateSupportAnswer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timeoutMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;generateSupportAnswer&lt;/code&gt; function must pass &lt;code&gt;timeoutMs&lt;/code&gt; to the actual SDK or HTTP client. The snippet illustrates the design, not a complete implementation.&lt;/p&gt;

&lt;p&gt;In a real application, you should also account for authentication, database timeouts, cancellation, and any other work performed before or after the model call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; a timeout means your application stopped waiting. It does not always mean the provider stopped processing the request.&lt;/p&gt;

&lt;p&gt;That distinction becomes especially important when a request can trigger a real-world action.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Handle rate limits without creating a retry storm
&lt;/h2&gt;

&lt;p&gt;During the sale, your provider starts returning HTTP 429 responses.&lt;/p&gt;

&lt;p&gt;A tempting implementation is to retry every failed request immediately.&lt;/p&gt;

&lt;p&gt;That can make the situation worse. If 1,000 requests fail and each retries three times, the provider could receive up to 3,000 additional attempts from that batch.&lt;/p&gt;

&lt;p&gt;Instead, use a bounded retry policy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;retryDelayMs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;maxMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;maxMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;baseMs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function calculates a randomized backoff delay. It is only one part of a retry policy.&lt;/p&gt;

&lt;p&gt;A production implementation should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classify the error before retrying.&lt;/li&gt;
&lt;li&gt;Respect the provider's &lt;code&gt;Retry-After&lt;/code&gt; guidance when available.&lt;/li&gt;
&lt;li&gt;Limit the number of attempts.&lt;/li&gt;
&lt;li&gt;Check the remaining deadline before sleeping or retrying.&lt;/li&gt;
&lt;li&gt;Avoid retrying invalid requests or authentication failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if only 700 milliseconds remain and the next retry would require a longer delay plus a model response, the application should stop trying.&lt;/p&gt;

&lt;p&gt;It is better to return a controlled response than to keep a customer waiting for a deadline the application has already missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Design a useful fallback
&lt;/h2&gt;

&lt;p&gt;What should happen when the primary LLM provider is unavailable?&lt;/p&gt;

&lt;p&gt;For this support assistant, there are two reasonable paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Path A: Use an approved fallback model.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This can work when the alternative model has been evaluated for the task and meets your latency, quality, privacy, and cost requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Path B: Return a deterministic response.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If no suitable model is available, the backend can return a simple message based on the verified order data:&lt;/p&gt;

&lt;p&gt;"Your order is currently marked as in transit. We cannot generate a detailed explanation right now. You can check the latest tracking status here."&lt;/p&gt;

&lt;p&gt;This response may be less conversational, but it is based on real data and still helps the customer.&lt;/p&gt;

&lt;p&gt;The application should never fabricate a delivery date just to make the conversation feel complete.&lt;/p&gt;

&lt;p&gt;Fallbacks should be designed around the business outcome, not around the assumption that another model will always work.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Keep order access outside the model's authority
&lt;/h2&gt;

&lt;p&gt;This is a critical security boundary.&lt;/p&gt;

&lt;p&gt;Suppose a customer asks:&lt;/p&gt;

&lt;p&gt;"Show me the status of order #84521."&lt;/p&gt;

&lt;p&gt;The backend must verify that the authenticated customer is authorized to access that order before including any order information in the model context.&lt;/p&gt;

&lt;p&gt;A safe request flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authenticated Customer
         |
         v
Authorize Order Access
         |
         v
Fetch Verified Order Data
         |
         v
Send Minimum Required Context
         |
         v
Generate Answer
         |
         v
Validate and Return
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not let the model decide whether the customer has permission to view an order. That decision belongs to your application's authorization layer.&lt;/p&gt;

&lt;p&gt;Likewise, if the assistant can cancel orders or issue refunds, those actions should use explicit backend authorization, business rules, and appropriate confirmation steps. The LLM can help interpret the customer's intent, but it should not bypass the controls that protect the transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Control the cost of each support interaction
&lt;/h2&gt;

&lt;p&gt;During a large sale, request volume can increase sharply.&lt;/p&gt;

&lt;p&gt;Suppose the assistant sends the customer's entire conversation history and a large amount of order documentation with every request. Token usage can grow even when the actual question is simple.&lt;/p&gt;

&lt;p&gt;For "Where is my order?", the model probably needs only the relevant order status, tracking information, and a small amount of conversational context.&lt;/p&gt;

&lt;p&gt;Set limits for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input size and conversation history.&lt;/li&gt;
&lt;li&gt;Retrieved context.&lt;/li&gt;
&lt;li&gt;Maximum generated tokens.&lt;/li&gt;
&lt;li&gt;Requests per user or tenant.&lt;/li&gt;
&lt;li&gt;Overall spending and usage alerts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Track the cost per successfully resolved support interaction, not just the average cost of an LLM request.&lt;/p&gt;

&lt;p&gt;A request that is cheap but repeatedly fails may still increase total support costs if customers abandon the assistant and contact a human agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Monitor the customer outcome
&lt;/h2&gt;

&lt;p&gt;A dashboard showing successful HTTP responses is not enough.&lt;/p&gt;

&lt;p&gt;Imagine that the model returns HTTP 200 for 99% of requests, but many answers are too slow or fail to address the customer's question.&lt;/p&gt;

&lt;p&gt;The infrastructure may appear healthy while the support experience is deteriorating.&lt;/p&gt;

&lt;p&gt;Track the full request lifecycle.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;End-to-end latency&lt;/td&gt;
&lt;td&gt;Measures the customer's wait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model latency&lt;/td&gt;
&lt;td&gt;Shows how much time the provider consumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP 429 rate&lt;/td&gt;
&lt;td&gt;Identifies rate-limit pressure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry count&lt;/td&gt;
&lt;td&gt;Helps reveal repeated recovery attempts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fallback rate&lt;/td&gt;
&lt;td&gt;Shows how often the primary path fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token usage and cost&lt;/td&gt;
&lt;td&gt;Tracks spending per interaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer validation failures&lt;/td&gt;
&lt;td&gt;Finds malformed or unusable responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolution rate&lt;/td&gt;
&lt;td&gt;Measures whether the assistant actually helps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For answer quality, evaluate whether the response matches the verified order data. For business impact, measure whether the customer receives a useful answer or still needs a support agent.&lt;/p&gt;

&lt;p&gt;Avoid logging sensitive order details or personal information unnecessarily. Use request IDs for tracing, and apply appropriate access controls and retention rules to logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Test failure before the sale begins
&lt;/h2&gt;

&lt;p&gt;Do not test only the happy path.&lt;/p&gt;

&lt;p&gt;Run controlled tests where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The LLM takes 12 seconds to respond.&lt;/li&gt;
&lt;li&gt;The provider returns HTTP 429.&lt;/li&gt;
&lt;li&gt;The provider returns HTTP 503.&lt;/li&gt;
&lt;li&gt;The request exceeds its deadline.&lt;/li&gt;
&lt;li&gt;The model returns malformed JSON or unsupported claims.&lt;/li&gt;
&lt;li&gt;The primary provider becomes unavailable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check that the application stops retrying when the budget is exhausted, falls back only when allowed, and never exposes another customer's order information.&lt;/p&gt;

&lt;p&gt;If the assistant can initiate transactions, test the case where the provider times out after the backend may already have completed an action. A retry must not accidentally cancel an order twice or create duplicate refunds.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Production-readiness checklist
&lt;/h2&gt;

&lt;p&gt;Before releasing this assistant to real customers, I would want these controls in place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] A deadline for the complete request.&lt;/li&gt;
&lt;li&gt;[ ] Bounded retries with appropriate backoff.&lt;/li&gt;
&lt;li&gt;[ ] Explicit handling for rate limits and provider outages.&lt;/li&gt;
&lt;li&gt;[ ] A tested fallback or deterministic response.&lt;/li&gt;
&lt;li&gt;[ ] Authorization checks before retrieving customer data.&lt;/li&gt;
&lt;li&gt;[ ] Limits on context size, generated tokens, and spending.&lt;/li&gt;
&lt;li&gt;[ ] Monitoring for latency, failures, retries, cost, and answer quality.&lt;/li&gt;
&lt;li&gt;[ ] Tests for timeouts and duplicate side effects.&lt;/li&gt;
&lt;li&gt;[ ] A clear response when the AI service is unavailable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not need to build a complex microservice architecture immediately. A well-structured module inside your existing backend can enforce many of these controls. Extract it into a separate gateway when operational needs justify the added complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The real test of an AI support assistant is not whether it can answer a question when everything is working.&lt;/p&gt;

&lt;p&gt;It is whether the business can still serve the customer when the model is slow, the provider is rate-limiting requests, or the request budget is nearly exhausted.&lt;/p&gt;

&lt;p&gt;The LLM generates the language. Your architecture determines whether the feature is reliable enough to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your primary LLM provider became unavailable during your busiest hour, would your application still be able to help the customer?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>systemdesign</category>
      <category>llm</category>
      <category>architecture</category>
    </item>
    <item>
      <title>3 Redis Design Failures You Should Avoid Before They Become Production Incidents</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Wed, 30 Sep 2026 17:01:48 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/3-redis-design-failures-you-should-avoid-before-they-become-production-incidents-2pe2</link>
      <guid>https://dev.to/gaurav_talesara/3-redis-design-failures-you-should-avoid-before-they-become-production-incidents-2pe2</guid>
      <description>&lt;p&gt;Caching is usually introduced for one simple reason:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take pressure off the database and make reads faster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The architecture often looks straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  |
  v
Application
  |
  +----&amp;gt; Redis
  |
  +----&amp;gt; Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A request checks Redis first.&lt;/p&gt;

&lt;p&gt;If the value exists, return it.&lt;/p&gt;

&lt;p&gt;If it doesn't, query the database, put the result into Redis, and return it.&lt;/p&gt;

&lt;p&gt;Simple.&lt;/p&gt;

&lt;p&gt;Until the system meets real production traffic.&lt;/p&gt;

&lt;p&gt;That's where caching stops being just a performance optimization and becomes a &lt;strong&gt;system-design problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's walk through how a seemingly simple cache evolves through three stages—and the failure modes that appear at each stage.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Stale Data
&lt;/h2&gt;

&lt;p&gt;The first version of a cache is usually &lt;strong&gt;cache-aside&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The application owns the caching logic.&lt;/p&gt;

&lt;p&gt;The flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   |
   v
Check Redis
   |
   +---- HIT ----&amp;gt; Return cached value
   |
   +---- MISS ---&amp;gt; Query database
                     |
                     v
                 Store in Redis
                     |
                     v
                  Return
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For read-heavy workloads, this can dramatically reduce database traffic.&lt;/p&gt;

&lt;p&gt;Suppose we have a user profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gaurav"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gaurav@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application stores it under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything works.&lt;/p&gt;

&lt;p&gt;Until the user changes their name.&lt;/p&gt;

&lt;p&gt;The database is updated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gaurav
    ↓
Gaurav Talesara
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Redis still contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gaurav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have two versions of reality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database → Gaurav Talesara
Redis    → Gaurav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database is correct.&lt;/p&gt;

&lt;p&gt;The application can still return the wrong answer.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;stale data&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;p&gt;Caching introduces another copy of your data.&lt;/p&gt;

&lt;p&gt;The moment you do that, you have to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When does the cached copy stop being valid?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the beginning of cache consistency design.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. TTL Helps—but Doesn't Solve Everything
&lt;/h1&gt;

&lt;p&gt;A common next step is adding a &lt;strong&gt;TTL (Time To Live)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user:42
TTL = 5 minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After five minutes, Redis considers the entry expired.&lt;/p&gt;

&lt;p&gt;The next request becomes a cache miss:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Redis MISS
    |
    v
Database
    |
    v
Fresh value
    |
    v
Redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you eventual freshness without requiring every application write to explicitly update the cache.&lt;/p&gt;

&lt;p&gt;But TTL introduces a trade-off.&lt;/p&gt;

&lt;h3&gt;
  
  
  Longer TTL
&lt;/h3&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer database reads&lt;/li&gt;
&lt;li&gt;better cache hit rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But potentially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;older data&lt;/li&gt;
&lt;li&gt;longer periods of inconsistency&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Shorter TTL
&lt;/h3&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fresher data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But potentially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more cache misses&lt;/li&gt;
&lt;li&gt;more database traffic&lt;/li&gt;
&lt;li&gt;lower cache efficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So TTL isn't really a "freshness setting."&lt;/p&gt;

&lt;p&gt;It's a &lt;strong&gt;consistency vs. performance trade-off&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And some data simply can't wait five minutes.&lt;/p&gt;

&lt;p&gt;If a user changes their email address, waiting for TTL expiration may be unacceptable.&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;explicit invalidation&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Invalidation on Write
&lt;/h1&gt;

&lt;p&gt;Instead of waiting for the cache to expire, the application can invalidate the relevant key when the database changes.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE users
SET name = 'Gaurav Talesara'
WHERE id = 42;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELETE user:42 FROM Redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next read becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Redis MISS
    |
    v
Database
    |
    v
Fresh data
    |
    v
Redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a much fresher cache.&lt;/p&gt;

&lt;p&gt;But now the application has to maintain the relationship between:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;database writes ↔ cache invalidation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that creates its own failure scenarios.&lt;/p&gt;

&lt;p&gt;What if the database update succeeds but cache invalidation fails?&lt;/p&gt;

&lt;p&gt;You can end up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database → NEW value
Redis    → OLD value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What if the invalidation happens first but the database transaction fails?&lt;/p&gt;

&lt;p&gt;Now the cache is empty even though the database still contains the old value.&lt;/p&gt;

&lt;p&gt;There is no universal answer here.&lt;/p&gt;

&lt;p&gt;The right approach depends on the consistency requirements of the application.&lt;/p&gt;

&lt;p&gt;But there is another problem that has nothing to do with stale data.&lt;/p&gt;

&lt;p&gt;And this one can take down the database.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Cache Stampede
&lt;/h1&gt;

&lt;p&gt;Imagine you have a popular product page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;product:123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Normally it receives thousands of requests.&lt;/p&gt;

&lt;p&gt;Because the data is cached, most of those requests never reach the database.&lt;/p&gt;

&lt;p&gt;That's exactly what we wanted.&lt;/p&gt;

&lt;p&gt;Now the cache entry expires.&lt;/p&gt;

&lt;p&gt;At almost the same moment, thousands of requests arrive.&lt;/p&gt;

&lt;p&gt;They all see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE MISS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And they all do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request 1 → DB
Request 2 → DB
Request 3 → DB
Request 4 → DB
...
Request 5000 → DB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database was protected by Redis a moment ago.&lt;/p&gt;

&lt;p&gt;Now thousands of requests are hitting it simultaneously.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;cache stampede&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Another name you'll often see for this pattern is &lt;strong&gt;thundering herd&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The important point is that the problem isn't simply that the cache missed.&lt;/p&gt;

&lt;p&gt;The problem is that &lt;strong&gt;many requests independently react to the same cache miss&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Defense #1: Single Flight
&lt;/h1&gt;

&lt;p&gt;One way to solve this is to allow only one request to refresh a missing key.&lt;/p&gt;

&lt;p&gt;Suppose 5,000 requests miss:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Redis MISS
                  |
        +---------+---------+
        |                   |
    Request 1            Requests 2-5000
        |                   |
      DB query              WAIT
        |                   |
        +--------+----------+
                 |
          Fresh result
                 |
             Redis SET
                 |
        Everyone gets result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request #1 becomes responsible for fetching the data.&lt;/p&gt;

&lt;p&gt;The other requests wait for the result instead of independently hitting the database.&lt;/p&gt;

&lt;p&gt;This pattern is often called &lt;strong&gt;single-flight&lt;/strong&gt; or &lt;strong&gt;request coalescing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The key idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One cache miss should not become 5,000 database queries.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is particularly useful when a small number of keys receive a very large amount of traffic.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Defense #2: TTL Jitter
&lt;/h1&gt;

&lt;p&gt;There is another failure pattern that can happen even when you aren't dealing with one single hot key.&lt;/p&gt;

&lt;p&gt;Imagine millions of cache entries are created at roughly the same time.&lt;/p&gt;

&lt;p&gt;If every entry gets exactly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TTL = 300 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then many of them can expire around the same time.&lt;/p&gt;

&lt;p&gt;That can create a synchronized wave of cache misses.&lt;/p&gt;

&lt;p&gt;Instead, you can introduce &lt;strong&gt;jitter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rather than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TTL = 300 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you might use something conceptually like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TTL = 300 + random(0, 60)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now expiration is spread across time.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ↓
              EVERYTHING EXPIRES
                    ↓
             DATABASE SPIKE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you get something more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ↓      ↓          ↓    ↓       ↓
   expire  expire     expire expire  expire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database sees a more distributed load pattern.&lt;/p&gt;

&lt;p&gt;TTL jitter doesn't eliminate cache misses.&lt;/p&gt;

&lt;p&gt;It reduces the probability of &lt;strong&gt;synchronized expiration&lt;/strong&gt; becoming a traffic spike.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Defense #3: Hot-Key Replication
&lt;/h1&gt;

&lt;p&gt;Now consider a different situation.&lt;/p&gt;

&lt;p&gt;One key becomes extremely popular.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;product:123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;might represent a product that suddenly goes viral.&lt;/p&gt;

&lt;p&gt;You can have thousands or millions of requests for essentially the same piece of data.&lt;/p&gt;

&lt;p&gt;Even if Redis is distributed, concentrating a huge amount of traffic around one key can create a bottleneck.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;hot key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One approach is to replicate frequently accessed data across multiple cache nodes so requests don't all depend on the same location.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  product:123
                       |
            +----------+----------+
            |          |          |
            v          v          v
         Redis-1    Redis-2    Redis-3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now requests can be distributed rather than concentrating entirely on one cache location.&lt;/p&gt;

&lt;p&gt;But this introduces another design question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do you keep replicated hot data consistent?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Again, the optimization introduces another system-design trade-off.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. The Pattern Behind All Three Failures
&lt;/h1&gt;

&lt;p&gt;This is the part that's easy to miss.&lt;/p&gt;

&lt;p&gt;You start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You add Redis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
     |
   Redis
     |
 Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have better read performance.&lt;/p&gt;

&lt;p&gt;Then production reveals stale data.&lt;/p&gt;

&lt;p&gt;So you add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TTL + Invalidation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then production traffic reveals cache stampedes.&lt;/p&gt;

&lt;p&gt;So you add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Single Flight
TTL Jitter
Request Coalescing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then traffic concentration reveals hot keys.&lt;/p&gt;

&lt;p&gt;So you consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Replication
Load Distribution
Failure Isolation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The architecture keeps evolving.&lt;/p&gt;

&lt;p&gt;That's because caching isn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Put Redis in front of the database."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're introducing another distributed component with its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistency behavior&lt;/li&gt;
&lt;li&gt;expiration behavior&lt;/li&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;failure modes&lt;/li&gt;
&lt;li&gt;traffic patterns&lt;/li&gt;
&lt;li&gt;recovery requirements&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  9. What to Design Before Adding Redis
&lt;/h1&gt;

&lt;p&gt;Before introducing a cache, I'd want the team to answer at least these questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What can be stale?
&lt;/h3&gt;

&lt;p&gt;Not every piece of data has the same consistency requirement.&lt;/p&gt;

&lt;p&gt;Ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can this value be 1 second old?
10 seconds?
5 minutes?
Never?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That answer should influence the caching strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What invalidates the data?
&lt;/h3&gt;

&lt;p&gt;Define the relationship between writes and cache entries.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User updated
    ↓
Database committed
    ↓
Invalidate user:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't leave invalidation as an afterthought.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. What happens when the key expires?
&lt;/h3&gt;

&lt;p&gt;Ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 request misses?
100?
10,000?
1,000,000?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the answer is "they all query the database," you may have a stampede waiting to happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. What happens when one key becomes extremely popular?
&lt;/h3&gt;

&lt;p&gt;Measure key access patterns.&lt;/p&gt;

&lt;p&gt;A distributed cache doesn't automatically mean distributed traffic.&lt;/p&gt;

&lt;p&gt;You can still have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;99% of requests → 1 key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. What happens when Redis is unavailable?
&lt;/h3&gt;

&lt;p&gt;This is one of the most important questions.&lt;/p&gt;

&lt;p&gt;If Redis disappears, does the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fail closed?
      or
Fall back to database?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything falls back to the database simultaneously, Redis failure can become a database incident.&lt;/p&gt;

&lt;p&gt;Your fallback path needs capacity planning too.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. The Real Lesson
&lt;/h1&gt;

&lt;p&gt;Caching is one of the easiest performance optimizations to add to an architecture.&lt;/p&gt;

&lt;p&gt;It's also easy to underestimate what you're introducing.&lt;/p&gt;

&lt;p&gt;The progression often looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache
  ↓
Stale Data
  ↓
TTL / Invalidation
  ↓
Cache Stampede
  ↓
Single Flight / Jitter
  ↓
Hot Keys
  ↓
Replication / Distribution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step solves a real problem.&lt;/p&gt;

&lt;p&gt;And each step introduces another design decision.&lt;/p&gt;

&lt;p&gt;That's the real lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A cache doesn't remove complexity. It moves complexity somewhere else in the system.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So before adding Redis, don't only ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"How much faster will this make our application?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What happens when the cache is stale?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What happens when the key expires?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What happens when 10,000 requests miss simultaneously?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What happens when one key receives 100× normal traffic?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What happens when Redis itself fails?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those questions are where caching stops being a feature and becomes &lt;strong&gt;system design&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>performance</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>I Tried to Break a $12 Server. It Took 5,000+ Concurrent Users.</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Sat, 26 Sep 2026 05:15:45 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/i-tried-to-break-a-12-server-it-took-5000-concurrent-users-3hbe</link>
      <guid>https://dev.to/gaurav_talesara/i-tried-to-break-a-12-server-it-took-5000-concurrent-users-3hbe</guid>
      <description>&lt;p&gt;There is a common assumption in backend engineering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you expect traffic to grow, you need to start thinking about scaling infrastructure early.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;More servers.&lt;br&gt;
More CPU.&lt;br&gt;
A dedicated database.&lt;br&gt;
Redis.&lt;br&gt;
Load balancers.&lt;br&gt;
Containers.&lt;br&gt;
Kubernetes.&lt;/p&gt;

&lt;p&gt;Sometimes you do.&lt;/p&gt;

&lt;p&gt;But sometimes the application isn't actually asking for more infrastructure yet.&lt;/p&gt;

&lt;p&gt;I wanted to see how far a very small server could go before reaching a real bottleneck.&lt;/p&gt;

&lt;p&gt;So I rented a server for &lt;strong&gt;$12/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The machine had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 CPU&lt;/li&gt;
&lt;li&gt;2 GB RAM&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;No dedicated database server&lt;/li&gt;
&lt;li&gt;No Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I started increasing the load until something broke.&lt;/p&gt;

&lt;p&gt;The interesting part wasn't how cheap the server was.&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;what became the bottleneck first&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  The experiment
&lt;/h2&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find the point where the application starts showing meaningful performance degradation, identify the bottleneck, and improve it without upgrading the server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I used a small API application running on a single machine.&lt;/p&gt;

&lt;p&gt;The application had a database-backed feed/workflow-style endpoint that required reading data from PostgreSQL and generating a response for the client.&lt;/p&gt;

&lt;p&gt;The database was running on the same machine as the application.&lt;/p&gt;

&lt;p&gt;There was no separate cache layer.&lt;/p&gt;

&lt;p&gt;No Redis.&lt;/p&gt;

&lt;p&gt;No horizontally scaled application servers.&lt;/p&gt;

&lt;p&gt;Just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet
   |
 Nginx
   |
 Node.js
   |
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server cost about &lt;strong&gt;$12/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That was the entire point.&lt;/p&gt;

&lt;p&gt;I wanted to see what the application could actually handle before adding infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Making the test more realistic
&lt;/h2&gt;

&lt;p&gt;A simple benchmark that repeatedly calls one endpoint isn't particularly interesting.&lt;/p&gt;

&lt;p&gt;Real users don't behave like that.&lt;/p&gt;

&lt;p&gt;They open something.&lt;/p&gt;

&lt;p&gt;They read.&lt;/p&gt;

&lt;p&gt;They perform an action.&lt;/p&gt;

&lt;p&gt;They come back.&lt;/p&gt;

&lt;p&gt;They refresh.&lt;/p&gt;

&lt;p&gt;They request more data.&lt;/p&gt;

&lt;p&gt;So I used &lt;strong&gt;k6&lt;/strong&gt; to create virtual users that followed a more realistic pattern.&lt;/p&gt;

&lt;p&gt;The virtual users would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request the feed/workflow data.&lt;/li&gt;
&lt;li&gt;Perform an occasional write/action.&lt;/li&gt;
&lt;li&gt;Request the data again.&lt;/li&gt;
&lt;li&gt;Repeat the cycle.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also populated the database with a meaningful amount of data rather than testing against an empty database.&lt;/p&gt;

&lt;p&gt;The load generator itself ran from a second VM so that the machine being tested wasn't also responsible for generating all the traffic.&lt;/p&gt;

&lt;p&gt;The goal was to put pressure on the application server while keeping the test environment simple.&lt;/p&gt;




&lt;h1&gt;
  
  
  Starting with a small load
&lt;/h1&gt;

&lt;p&gt;I didn't jump directly to thousands of users.&lt;/p&gt;

&lt;p&gt;The load increased progressively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10
50
100
200
1,000
2,000
3,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters because performance problems aren't always obvious when you only look at average latency.&lt;/p&gt;

&lt;p&gt;At low traffic, everything looked healthy.&lt;/p&gt;

&lt;p&gt;As the number of virtual users increased, the system continued to respond normally.&lt;/p&gt;

&lt;p&gt;Then something started changing around the higher loads.&lt;/p&gt;




&lt;h1&gt;
  
  
  2,000 users: the first warning sign
&lt;/h1&gt;

&lt;p&gt;At around &lt;strong&gt;2,000 virtual users&lt;/strong&gt;, the average response time still looked reasonable.&lt;/p&gt;

&lt;p&gt;But the tail latency started moving.&lt;/p&gt;

&lt;p&gt;This is where metrics like &lt;strong&gt;p95 and p99&lt;/strong&gt; become much more useful than simply looking at average latency.&lt;/p&gt;

&lt;p&gt;Imagine these two systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System A
Average: 100 ms
p95:     150 ms
p99:     200 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;versus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System B
Average: 100 ms
p95:     700 ms
p99:     2,000 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both have the same average.&lt;/p&gt;

&lt;p&gt;But the user experience is very different.&lt;/p&gt;

&lt;p&gt;The second system has a tail-latency problem.&lt;/p&gt;

&lt;p&gt;That was the first signal that the server was approaching a limit.&lt;/p&gt;




&lt;h1&gt;
  
  
  3,000 users: the test failed
&lt;/h1&gt;

&lt;p&gt;I increased the load again.&lt;/p&gt;

&lt;p&gt;At approximately &lt;strong&gt;3,000 virtual users&lt;/strong&gt;, the experiment crossed the failure criteria.&lt;/p&gt;

&lt;p&gt;That gave me an important data point:&lt;/p&gt;

&lt;p&gt;The server wasn't simply getting "a little slower."&lt;/p&gt;

&lt;p&gt;There was a point where additional concurrency started pushing the system beyond the acceptable performance envelope.&lt;/p&gt;

&lt;p&gt;So instead of continuing to increase the load blindly, I backed down.&lt;/p&gt;

&lt;p&gt;I wanted to understand the bottleneck first.&lt;/p&gt;




&lt;h1&gt;
  
  
  2,500 concurrent users
&lt;/h1&gt;

&lt;p&gt;At around &lt;strong&gt;2,500 concurrent users&lt;/strong&gt;, the system handled approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~232 requests/sec
~288 ms p95 latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those numbers were interesting.&lt;/p&gt;

&lt;p&gt;But the most interesting information came from the resource utilization.&lt;/p&gt;

&lt;p&gt;The server wasn't running out of memory.&lt;/p&gt;

&lt;p&gt;RAM usage was still &lt;strong&gt;under 1 GB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;PostgreSQL was also behaving normally.&lt;/p&gt;

&lt;p&gt;The CPU, however, was sitting around &lt;strong&gt;90%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That changed the direction of the investigation.&lt;/p&gt;

&lt;p&gt;The first instinct could have been:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The server is too small. Buy a bigger one."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the measurements were telling a different story.&lt;/p&gt;




&lt;h1&gt;
  
  
  Finding the actual bottleneck
&lt;/h1&gt;

&lt;p&gt;The resource picture looked roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RAM       &amp;lt; 1 GB
Postgres  Healthy
CPU       ~90%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CPU was the constraint.&lt;/p&gt;

&lt;p&gt;This is an important distinction.&lt;/p&gt;

&lt;p&gt;If RAM had been nearly exhausted, adding memory would have been a reasonable direction.&lt;/p&gt;

&lt;p&gt;If PostgreSQL had been saturated, database optimization would have been the next area to investigate.&lt;/p&gt;

&lt;p&gt;But neither was the immediate problem.&lt;/p&gt;

&lt;p&gt;The application was spending too much CPU doing work for requests.&lt;/p&gt;

&lt;p&gt;So I asked a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How much of this work actually needs to happen for every request?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That led directly to caching.&lt;/p&gt;




&lt;h1&gt;
  
  
  Optimization #1: Cache the response in Node.js
&lt;/h1&gt;

&lt;p&gt;The feed/workflow response wasn't changing every millisecond.&lt;/p&gt;

&lt;p&gt;Yet the application was repeatedly doing the same expensive work for requests that could safely receive a recently generated response.&lt;/p&gt;

&lt;p&gt;So I introduced a very simple cache.&lt;/p&gt;

&lt;p&gt;The idea was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   |
   v
Is cached response available?
   |
  Yes ----&amp;gt; Return cached response
   |
  No
   |
   v
Query database
   |
   v
Build response
   |
   v
Cache for 1 second
   |
   v
Return response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important detail was the TTL:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 second.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This wasn't an attempt to build a complicated distributed caching architecture.&lt;/p&gt;

&lt;p&gt;It was simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If another request arrives immediately after this one, don't repeat the same work unnecessarily.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That small change had a significant effect.&lt;/p&gt;

&lt;p&gt;The system moved from roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2,500 concurrent users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4,000 concurrent users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before reaching the same kind of limitation.&lt;/p&gt;

&lt;p&gt;And I hadn't changed the server.&lt;/p&gt;

&lt;p&gt;No additional CPU.&lt;/p&gt;

&lt;p&gt;No additional RAM.&lt;/p&gt;

&lt;p&gt;No Redis cluster.&lt;/p&gt;

&lt;p&gt;No second application server.&lt;/p&gt;

&lt;p&gt;The workload had simply changed.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why did a 1-second cache help so much?
&lt;/h1&gt;

&lt;p&gt;Caching works because computation has a cost.&lt;/p&gt;

&lt;p&gt;Consider a simplified request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   ↓
Node.js
   ↓
PostgreSQL query
   ↓
Process data
   ↓
Serialize response
   ↓
Send response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If 100 requests arrive close together and they all need essentially the same data, doing the complete operation 100 times may be unnecessary.&lt;/p&gt;

&lt;p&gt;With a short-lived cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request 1
   ↓
Generate response
   ↓
Cache

Request 2 ─┐
Request 3 ─┤
Request 4 ─┤──&amp;gt; Cached response
Request 5 ─┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expensive work can be shared across multiple requests.&lt;/p&gt;

&lt;p&gt;That reduces CPU work.&lt;/p&gt;

&lt;p&gt;It can also reduce database work.&lt;/p&gt;

&lt;p&gt;And because the response is already available, the application has less work to perform per request.&lt;/p&gt;

&lt;p&gt;The important point is that caching didn't make the CPU faster.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;reduced how much CPU work was required&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Optimization #2: Move the cache closer to the edge
&lt;/h1&gt;

&lt;p&gt;The next question was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why should Node.js be responsible for serving a response that Nginx can serve directly?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The architecture originally looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  |
 Nginx
  |
 Node.js
  |
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After introducing application-level caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  |
 Nginx
  |
 Node.js
  |
Cache
  |
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was already better.&lt;/p&gt;

&lt;p&gt;But there was another opportunity.&lt;/p&gt;

&lt;p&gt;If Nginx could cache the response, a cache hit wouldn't need to travel through the Node.js application at all.&lt;/p&gt;

&lt;p&gt;So the architecture became conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  |
 Nginx
  |
  +---- Cache hit ----&amp;gt; Response
  |
  +---- Cache miss ---&amp;gt; Node.js
                           |
                       PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the request could potentially be handled before reaching the application layer.&lt;/p&gt;

&lt;p&gt;This is an important optimization because every request that Nginx can satisfy is a request that doesn't consume Node.js CPU.&lt;/p&gt;




&lt;h1&gt;
  
  
  The result
&lt;/h1&gt;

&lt;p&gt;After moving the caching responsibility to Nginx, the system pushed &lt;strong&gt;past 5,000 concurrent users&lt;/strong&gt; on the same $12/month server.&lt;/p&gt;

&lt;p&gt;The progression was approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~2,500 users
     |
     | 1-second application cache
     v
~4,000 users
     |
     | Move cache to Nginx
     v
5,000+ users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The infrastructure didn't become more powerful.&lt;/p&gt;

&lt;p&gt;The application simply stopped doing unnecessary work for every request.&lt;/p&gt;

&lt;p&gt;That distinction is the main lesson from the experiment.&lt;/p&gt;




&lt;h1&gt;
  
  
  Concurrent users are not total users
&lt;/h1&gt;

&lt;p&gt;One important clarification:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5,000 concurrent users does not mean the server can only support 5,000 users total.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Concurrency and total user count are different measurements.&lt;/p&gt;

&lt;p&gt;If an application has 100,000 registered users but only 500 are actively making requests at a given moment, the server is dealing with roughly 500 concurrent users, not 100,000.&lt;/p&gt;

&lt;p&gt;That's why saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This server supports 5,000 users"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;would be misleading.&lt;/p&gt;

&lt;p&gt;The accurate statement from this experiment is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The setup was able to push past 5,000 concurrent virtual users under this particular load-test workload.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That doesn't automatically translate into a production capacity number.&lt;/p&gt;

&lt;p&gt;Real applications have different request patterns, payload sizes, database queries, background jobs, connection behavior, and traffic distributions.&lt;/p&gt;

&lt;p&gt;Benchmarks are useful when we understand exactly what was benchmarked.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I would not conclude from this experiment
&lt;/h1&gt;

&lt;p&gt;This experiment doesn't prove that everyone should run production systems on a $12 server.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;A production system may need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High availability&lt;/li&gt;
&lt;li&gt;Backups&lt;/li&gt;
&lt;li&gt;Replication&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Failover&lt;/li&gt;
&lt;li&gt;Security controls&lt;/li&gt;
&lt;li&gt;Multiple application instances&lt;/li&gt;
&lt;li&gt;Database replicas&lt;/li&gt;
&lt;li&gt;Disaster recovery&lt;/li&gt;
&lt;li&gt;Horizontal scaling&lt;/li&gt;
&lt;li&gt;Background workers&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those requirements are independent of whether a small server can handle a particular workload.&lt;/p&gt;

&lt;p&gt;The experiment answers a narrower question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How much performance can I get from simple infrastructure before infrastructure itself becomes the problem?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this case, quite a lot.&lt;/p&gt;




&lt;h1&gt;
  
  
  The bigger lesson: measure before scaling
&lt;/h1&gt;

&lt;p&gt;One of the easiest mistakes in backend engineering is solving a capacity problem before identifying the actual constraint.&lt;/p&gt;

&lt;p&gt;You see latency increasing.&lt;/p&gt;

&lt;p&gt;You add a bigger server.&lt;/p&gt;

&lt;p&gt;But what if the application is wasting CPU?&lt;/p&gt;

&lt;p&gt;You see database queries getting slower.&lt;/p&gt;

&lt;p&gt;You add a larger database instance.&lt;/p&gt;

&lt;p&gt;But what if the same expensive query is being executed thousands of times unnecessarily?&lt;/p&gt;

&lt;p&gt;You see more traffic.&lt;/p&gt;

&lt;p&gt;You add Redis.&lt;/p&gt;

&lt;p&gt;But what if a simple Nginx cache would have handled the workload?&lt;/p&gt;

&lt;p&gt;Infrastructure can absolutely solve performance problems.&lt;/p&gt;

&lt;p&gt;But infrastructure should be guided by measurements.&lt;/p&gt;

&lt;p&gt;In this experiment, the sequence was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Load test
   ↓
Observe latency
   ↓
Measure resources
   ↓
Find CPU bottleneck
   ↓
Reduce repeated work
   ↓
Test again
   ↓
Find the next limit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That loop is more valuable than any particular server size.&lt;/p&gt;




&lt;h1&gt;
  
  
  A simple scaling mindset
&lt;/h1&gt;

&lt;p&gt;When an application starts struggling, I like thinking about the problem in this order:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What exactly is getting slower?
&lt;/h3&gt;

&lt;p&gt;Don't stop at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"The API is slow."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Average latency&lt;/li&gt;
&lt;li&gt;p95&lt;/li&gt;
&lt;li&gt;p99&lt;/li&gt;
&lt;li&gt;Requests/sec&lt;/li&gt;
&lt;li&gt;Error rate&lt;/li&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Database utilization&lt;/li&gt;
&lt;li&gt;Connection counts&lt;/li&gt;
&lt;li&gt;Network&lt;/li&gt;
&lt;li&gt;Disk I/O&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. What resource is actually saturated?
&lt;/h3&gt;

&lt;p&gt;Find the constraint.&lt;/p&gt;

&lt;p&gt;In this experiment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RAM     → fine
Postgres → fine
CPU     → ~90%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That pointed the investigation toward application work.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Can the work be eliminated?
&lt;/h3&gt;

&lt;p&gt;Before making hardware bigger, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are we calculating the same thing repeatedly?&lt;/li&gt;
&lt;li&gt;Can the result be cached?&lt;/li&gt;
&lt;li&gt;Can a query be avoided?&lt;/li&gt;
&lt;li&gt;Can data be precomputed?&lt;/li&gt;
&lt;li&gt;Can work move to a cheaper layer?&lt;/li&gt;
&lt;li&gt;Can Nginx/CDN handle something before it reaches the application?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Test the change
&lt;/h3&gt;

&lt;p&gt;Don't assume the optimization worked.&lt;/p&gt;

&lt;p&gt;Run the same workload again.&lt;/p&gt;

&lt;p&gt;Compare the metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Scale only when necessary
&lt;/h3&gt;

&lt;p&gt;Eventually, the $12 server will hit another limit.&lt;/p&gt;

&lt;p&gt;That's completely fine.&lt;/p&gt;

&lt;p&gt;Scaling isn't the failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaling without understanding why you're scaling is the expensive part.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What surprised me most
&lt;/h1&gt;

&lt;p&gt;The surprising part wasn't that a cheap server handled thousands of concurrent virtual users.&lt;/p&gt;

&lt;p&gt;It was how quickly the result changed after removing unnecessary work.&lt;/p&gt;

&lt;p&gt;At roughly 2,500 concurrent users, CPU was close to its limit.&lt;/p&gt;

&lt;p&gt;A one-second cache increased the tested capacity to roughly 4,000.&lt;/p&gt;

&lt;p&gt;Moving that cache to Nginx pushed the test past 5,000.&lt;/p&gt;

&lt;p&gt;Same machine.&lt;/p&gt;

&lt;p&gt;Same CPU.&lt;/p&gt;

&lt;p&gt;Same RAM.&lt;/p&gt;

&lt;p&gt;The biggest change was the amount of work the application had to perform.&lt;/p&gt;

&lt;p&gt;That's a useful reminder for any backend system:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Before adding capacity, find out whether you can remove the work creating the demand.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the cheapest performance optimization isn't a bigger server.&lt;/p&gt;

&lt;p&gt;It's one less thing your server has to do.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>webdev</category>
      <category>devops</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Jev: AI for Decisions, Not Just Generation</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Thu, 24 Sep 2026 18:05:32 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/jev-ai-for-decisions-not-just-generation-3j88</link>
      <guid>https://dev.to/gaurav_talesara/jev-ai-for-decisions-not-just-generation-3j88</guid>
      <description>&lt;p&gt;Most AI applications today are built around generation.&lt;/p&gt;

&lt;p&gt;Give a model some context → ask a question → get text back.&lt;/p&gt;

&lt;p&gt;But many application workflows don't actually need generated text.&lt;/p&gt;

&lt;p&gt;They need a &lt;strong&gt;decision&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Should this support ticket go to billing or technical support?&lt;/p&gt;

&lt;p&gt;Is this lead worth prioritizing?&lt;/p&gt;

&lt;p&gt;Should an AI agent retry a failed action?&lt;/p&gt;

&lt;p&gt;Does this content need human review?&lt;/p&gt;

&lt;p&gt;Which tool should an agent call next?&lt;/p&gt;

&lt;p&gt;This is where Jev gets interesting.&lt;/p&gt;

&lt;p&gt;Instead of treating every AI problem as a text-generation problem, Jev is designed around &lt;strong&gt;decision-making&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You provide the current state and typed questions, and the model can return structured decisions along with probabilities and confidence.&lt;/p&gt;

&lt;p&gt;A simplified flow looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application State
       ↓
      Jev
       ↓
Decision + Probability + Confidence
       ↓
Application Action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"probability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application can then use that output directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where this could be useful
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Support automation&lt;/strong&gt;&lt;br&gt;
→ classify and route incoming tickets&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sales systems&lt;/strong&gt;&lt;br&gt;
→ score and prioritize leads&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI agents&lt;/strong&gt;&lt;br&gt;
→ decide which tool or action should happen next&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content pipelines&lt;/strong&gt;&lt;br&gt;
→ identify what requires human review&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk workflows&lt;/strong&gt;&lt;br&gt;
→ evaluate a situation before allowing an automated action&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data processing&lt;/strong&gt;&lt;br&gt;
→ classify and triage unstructured inputs&lt;/p&gt;

&lt;p&gt;The interesting architectural idea isn't simply adding another AI model.&lt;/p&gt;

&lt;p&gt;It's separating &lt;strong&gt;generation&lt;/strong&gt; from &lt;strong&gt;decision-making&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A general-purpose LLM is great when the output needs to be language.&lt;/p&gt;

&lt;p&gt;But when the application needs something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;route = billing
retry = false
risk = medium
next_action = create_ticket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a decision-oriented model can fit the workflow much more naturally.&lt;/p&gt;

&lt;p&gt;I'm interested to see where this pattern goes as AI applications move from chat interfaces toward systems that continuously make decisions and take actions.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>jev</category>
      <category>llm</category>
    </item>
    <item>
      <title>Voice AI can sound human and still fail at sales.

The real problem is often conversation logic: understanding customer state, adapting questions, and knowing when to hand off to a human.

I wrote about the architecture behind that.</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Sun, 13 Sep 2026 12:01:28 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/voice-ai-can-sound-human-and-still-fail-at-sales-the-real-problem-is-often-conversation-logic-4k7l</link>
      <guid>https://dev.to/gaurav_talesara/voice-ai-can-sound-human-and-still-fail-at-sales-the-real-problem-is-often-conversation-logic-4k7l</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/gaurav_talesara/voice-ai-doesnt-have-a-voice-problem-it-has-a-conversation-problem-pm9" class="crayons-story__hidden-navigation-link"&gt;Voice AI Doesn't Have a Voice Problem. It Has a Conversation Problem.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/gaurav_talesara" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3724256%2F3ab1fc88-aa7b-426c-9783-c019bd8e5915.png" alt="gaurav_talesara profile" class="crayons-avatar__image" width="800" height="960"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/gaurav_talesara" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Gaurav Talesara
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Gaurav Talesara
                
                
              
              &lt;div id="story-author-preview-content-4643467" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/gaurav_talesara" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3724256%2F3ab1fc88-aa7b-426c-9783-c019bd8e5915.png" class="crayons-avatar__image" alt="" width="800" height="960"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Gaurav Talesara&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/gaurav_talesara/voice-ai-doesnt-have-a-voice-problem-it-has-a-conversation-problem-pm9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/gaurav_talesara/voice-ai-doesnt-have-a-voice-problem-it-has-a-conversation-problem-pm9" id="article-link-4643467"&gt;
          Voice AI Doesn't Have a Voice Problem. It Has a Conversation Problem.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/gaurav_talesara/voice-ai-doesnt-have-a-voice-problem-it-has-a-conversation-problem-pm9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Voice AI Doesn't Have a Voice Problem. It Has a Conversation Problem.</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Sun, 13 Sep 2026 11:55:18 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/voice-ai-doesnt-have-a-voice-problem-it-has-a-conversation-problem-pm9</link>
      <guid>https://dev.to/gaurav_talesara/voice-ai-doesnt-have-a-voice-problem-it-has-a-conversation-problem-pm9</guid>
      <description>&lt;h2&gt;
  
  
  Voice AI can sound completely human and still be terrible at sales.
&lt;/h2&gt;



&lt;p&gt;The voice can be natural, the response time can be fast, and the agent can handle thousands of calls. It can qualify leads, answer questions, schedule follow-ups, and update the CRM.&lt;/p&gt;

&lt;p&gt;And the sales results can still be disappointing.&lt;/p&gt;

&lt;p&gt;The problem is that sounding human and having a good sales conversation are two different engineering problems.&lt;/p&gt;

&lt;p&gt;A customer rarely follows a predefined script. They interrupt, change direction, raise objections, ask their own questions, or reveal the most important information halfway through the conversation.&lt;/p&gt;

&lt;p&gt;That is where many Voice AI sales systems start to struggle.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with linear sales conversations
&lt;/h2&gt;

&lt;p&gt;A typical sales agent follows a simple flow: introduce the company, ask qualification questions, explain the product, handle objections, and try to book a meeting.&lt;/p&gt;

&lt;p&gt;It looks reasonable on a whiteboard.&lt;/p&gt;

&lt;p&gt;Real customers don't behave that way.&lt;/p&gt;

&lt;p&gt;Two customers can give the same answer but need completely different follow-ups. One may already be comparing vendors and ready to buy. Another may only be researching because a problem recently appeared.&lt;/p&gt;

&lt;p&gt;A rigid workflow sees the same answer and moves to the next predefined question.&lt;/p&gt;

&lt;p&gt;A good salesperson thinks about what the answer actually means.&lt;/p&gt;

&lt;p&gt;That difference is the core problem.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Model the customer, not just the lead
&lt;/h2&gt;

&lt;p&gt;Most sales systems already have plenty of customer data: lead score, company information, previous interactions, campaign source, product interest, and CRM history.&lt;/p&gt;

&lt;p&gt;That information is useful, but the agent still needs to answer one question during the conversation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should happen next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For that, the system needs conversational state.&lt;/p&gt;

&lt;p&gt;The agent should understand what the customer is trying to solve, how urgent the problem is, whether they are actively evaluating solutions, what they already know, and which objections have appeared.&lt;/p&gt;

&lt;p&gt;That state should change as the conversation develops.&lt;/p&gt;

&lt;p&gt;A customer can move from unfamiliar with the product to curious, then to problem-aware and eventually ready for a sales conversation. The opposite can happen too. A customer may discover that the timing is wrong or that the product isn't a fit.&lt;/p&gt;

&lt;p&gt;The system should respond to those changes instead of forcing everyone through the same flow.&lt;/p&gt;

&lt;p&gt;This is why I think a Voice AI sales agent needs a state machine, not a better prompt.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Make every answer useful
&lt;/h2&gt;

&lt;p&gt;The next question should depend on what the customer just said.&lt;/p&gt;

&lt;p&gt;Suppose a customer says price is the main concern.&lt;/p&gt;

&lt;p&gt;The agent shouldn't simply record "price objection" and continue with the script. It should understand what is behind that answer.&lt;/p&gt;

&lt;p&gt;Maybe the customer is comparing vendors. Maybe the budget isn't approved. Maybe the value isn't clear. Maybe they are interested but not ready to commit.&lt;/p&gt;

&lt;p&gt;Each situation requires a different response.&lt;/p&gt;

&lt;p&gt;The same applies to positive signals.&lt;/p&gt;

&lt;p&gt;If someone says they are interested, that doesn't automatically mean they want a demo. They may be researching the market or trying to understand whether the product solves a specific problem.&lt;/p&gt;

&lt;p&gt;The job of the next question is to reduce that uncertainty.&lt;/p&gt;

&lt;p&gt;This is where conversation logic becomes more important than prompt length.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimize for progression, not meetings
&lt;/h2&gt;

&lt;p&gt;A common mistake is making "book a meeting" the main objective.&lt;/p&gt;

&lt;p&gt;That can push the agent to ask for a meeting even when the customer isn't ready.&lt;/p&gt;

&lt;p&gt;A better objective is progression.&lt;/p&gt;

&lt;p&gt;The next useful action might be a meeting. It could also be sending pricing information, arranging a callback, connecting the customer with a specialist, or ending the conversation because there is no fit.&lt;/p&gt;

&lt;p&gt;Not every cold lead should become a warm lead.&lt;/p&gt;

&lt;p&gt;The goal is to reduce wasted conversations and increase the number of interactions that move toward a useful sales outcome.&lt;/p&gt;

&lt;p&gt;That also changes how the system should be measured. Call volume and conversation duration are useful operational metrics, but they don't tell you whether the sales process is improving.&lt;/p&gt;

&lt;p&gt;Meaningful conversations, qualified leads, warm-lead progression, appropriate human handoffs, meetings that turn into opportunities, and revenue influenced by the system are much more useful measures.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Human handoff is part of the product
&lt;/h2&gt;

&lt;p&gt;The human handoff is another place where Voice AI systems often lose context.&lt;/p&gt;

&lt;p&gt;Transferring a call to a salesperson is easy.&lt;/p&gt;

&lt;p&gt;Transferring the customer's understanding is harder.&lt;/p&gt;

&lt;p&gt;If the customer has spent five minutes explaining their situation and the salesperson starts the conversation from zero, the customer has to repeat everything.&lt;/p&gt;

&lt;p&gt;A good handoff should carry the relevant context: the customer's problem, intent, objections, urgency, important questions, and why the AI decided that a human should take over.&lt;/p&gt;

&lt;p&gt;The salesperson should be able to continue the conversation instead of restarting it.&lt;/p&gt;

&lt;p&gt;This is especially important for technical products where the AI may identify an integration, security, or implementation concern that should be handled by a specialist.&lt;/p&gt;

&lt;p&gt;The handoff is not an exception to the product. It is part of the product design.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the feedback loop
&lt;/h2&gt;

&lt;p&gt;The call itself isn't the final outcome.&lt;/p&gt;

&lt;p&gt;What happens after the call tells you whether the conversation logic worked.&lt;/p&gt;

&lt;p&gt;Did the salesperson accept the lead? Was the customer qualified? Did the meeting happen? Did the opportunity progress? Was the lead rejected because there was no fit?&lt;/p&gt;

&lt;p&gt;Those outcomes should flow back into the system.&lt;/p&gt;

&lt;p&gt;Without that feedback, teams can end up optimizing activity instead of results.&lt;/p&gt;

&lt;p&gt;A Voice AI agent may handle thousands of calls and produce impressive transcripts, but if qualified opportunities aren't increasing, the system still has a sales problem.&lt;/p&gt;

&lt;p&gt;The feedback loop connects conversation behavior to actual business outcomes.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture matters more than the prompt
&lt;/h2&gt;

&lt;p&gt;From an engineering perspective, I would separate customer context, conversation state, decision logic, response generation, human handoff, and outcome feedback.&lt;/p&gt;

&lt;p&gt;The prompt should not become the place where the entire sales process lives.&lt;/p&gt;

&lt;p&gt;Once the prompt contains customer-state management, qualification rules, CRM behavior, escalation logic, and every possible objection, it becomes difficult to test and maintain.&lt;/p&gt;

&lt;p&gt;A state-driven design gives the team clearer boundaries. You can test whether the system understood the customer's intent, whether the next action was appropriate, and whether the handoff happened at the right time.&lt;/p&gt;

&lt;p&gt;You can then improve each part without rewriting the entire conversation.&lt;/p&gt;

&lt;p&gt;Voice quality will continue to improve. Voices will become more natural and models will handle more complex conversations.&lt;/p&gt;

&lt;p&gt;But the harder problem is deciding what the agent should do with everything it hears.&lt;/p&gt;

&lt;p&gt;That requires customer context, conversational state, adaptive decision-making, clear handoff boundaries, and a feedback loop connected to real sales outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Voice AI sales agent doesn't need a better script. It needs a better model of the conversation.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Building AI systems? I’d love to connect.&lt;/p&gt;

&lt;p&gt;Website - &lt;a href="https://gauravspace.in/" rel="noopener noreferrer"&gt;gauravspace.in&lt;/a&gt; &lt;br&gt;
&lt;a href="https://www.linkedin.com/in/gaurav-talesara-8099ba147/" rel="noopener noreferrer"&gt;Connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gaurav Talesara&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>architecture</category>
      <category>performance</category>
    </item>
    <item>
      <title>The Website Is No Longer the Center of Commerce</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Wed, 02 Sep 2026 18:59:10 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/the-website-is-no-longer-the-center-of-commerce-2agi</link>
      <guid>https://dev.to/gaurav_talesara/the-website-is-no-longer-the-center-of-commerce-2agi</guid>
      <description>&lt;p&gt;For years, digital commerce has been built around a simple assumption:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get the user to the website.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the user arrives, guide them through a carefully designed journey.&lt;/p&gt;

&lt;p&gt;Search.&lt;/p&gt;

&lt;p&gt;Landing page.&lt;/p&gt;

&lt;p&gt;Product page.&lt;/p&gt;

&lt;p&gt;Cart.&lt;/p&gt;

&lt;p&gt;Checkout.&lt;/p&gt;

&lt;p&gt;The website was the center of the system.&lt;/p&gt;

&lt;p&gt;But that assumption is starting to change.&lt;/p&gt;

&lt;p&gt;AI-powered interfaces are creating a different model of interaction—one where users may discover products, evaluate options, and potentially complete transactions without following the traditional journey through a company's website.&lt;/p&gt;

&lt;p&gt;The journey is becoming something closer to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent → AI → Discovery → Decision → Transaction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The website may still exist.&lt;/p&gt;

&lt;p&gt;It may still be important.&lt;/p&gt;

&lt;p&gt;But it may no longer be the only interface between a business and its customers.&lt;/p&gt;

&lt;p&gt;As an engineering leader, I find the architectural implications of this shift more interesting than the interface itself.&lt;/p&gt;

&lt;p&gt;Because if AI becomes another layer between users and businesses, we need to ask a different question.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we build a better website?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We may need to start asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How does our product exist outside our website?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  From page-centric products to capability-centric systems
&lt;/h2&gt;

&lt;p&gt;Traditional web architecture is often built around pages.&lt;/p&gt;

&lt;p&gt;A user visits a page.&lt;/p&gt;

&lt;p&gt;The page loads data.&lt;/p&gt;

&lt;p&gt;The user performs an action.&lt;/p&gt;

&lt;p&gt;The backend processes that action.&lt;/p&gt;

&lt;p&gt;The journey is designed around a human navigating an interface.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
Website
  ↓
Product Page
  ↓
Cart
  ↓
Checkout
  ↓
Transaction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interface controls the experience.&lt;/p&gt;

&lt;p&gt;But AI introduces another possibility.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
Intent
  ↓
AI Interface / Agent
  ↓
Business Systems
  ↓
Decision
  ↓
Transaction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a fundamentally different interaction model.&lt;/p&gt;

&lt;p&gt;The AI does not necessarily need to understand how your website looks.&lt;/p&gt;

&lt;p&gt;It needs to understand what your business can do.&lt;/p&gt;

&lt;p&gt;What products do you offer?&lt;/p&gt;

&lt;p&gt;What are the prices?&lt;/p&gt;

&lt;p&gt;What is available?&lt;/p&gt;

&lt;p&gt;What are the policies?&lt;/p&gt;

&lt;p&gt;What actions can be performed?&lt;/p&gt;

&lt;p&gt;What restrictions exist?&lt;/p&gt;

&lt;p&gt;What systems can be accessed safely?&lt;/p&gt;

&lt;p&gt;This moves part of the engineering problem away from &lt;strong&gt;pages&lt;/strong&gt; and toward &lt;strong&gt;capabilities&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your product needs to become understandable
&lt;/h2&gt;

&lt;p&gt;Humans can navigate ambiguity.&lt;/p&gt;

&lt;p&gt;They can look at a product page, interpret an image, read descriptions, compare options, and understand context.&lt;/p&gt;

&lt;p&gt;Software systems cannot rely on that in the same way.&lt;/p&gt;

&lt;p&gt;AI systems and agents need structured information.&lt;/p&gt;

&lt;p&gt;If an external AI system needs to interact with your product, your underlying data becomes increasingly important.&lt;/p&gt;

&lt;p&gt;For commerce, that could include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product information&lt;/li&gt;
&lt;li&gt;Categories and attributes&lt;/li&gt;
&lt;li&gt;Pricing&lt;/li&gt;
&lt;li&gt;Availability&lt;/li&gt;
&lt;li&gt;Inventory&lt;/li&gt;
&lt;li&gt;Offers&lt;/li&gt;
&lt;li&gt;Shipping information&lt;/li&gt;
&lt;li&gt;Return policies&lt;/li&gt;
&lt;li&gt;Product compatibility&lt;/li&gt;
&lt;li&gt;Restrictions&lt;/li&gt;
&lt;li&gt;Business rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The quality of the user interface still matters.&lt;/p&gt;

&lt;p&gt;But structured information behind the interface may become equally important.&lt;/p&gt;

&lt;p&gt;A beautifully designed website is not enough if an external system cannot understand what the business actually offers.&lt;/p&gt;




&lt;h2&gt;
  
  
  APIs may become part of the product experience
&lt;/h2&gt;

&lt;p&gt;For a long time, APIs were mostly considered technical infrastructure.&lt;/p&gt;

&lt;p&gt;Something used by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile applications&lt;/li&gt;
&lt;li&gt;Internal systems&lt;/li&gt;
&lt;li&gt;Third-party integrations&lt;/li&gt;
&lt;li&gt;Partner platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But as AI agents become more capable of interacting with external systems, APIs and system capabilities could increasingly become part of the product experience itself.&lt;/p&gt;

&lt;p&gt;The question is no longer only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can our frontend perform this action?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It may become:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a trusted external system understand and safely perform this action?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check availability
Get price
Apply offer
Create order
Calculate delivery
Process payment
Track order
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These capabilities should not exist only inside tightly coupled frontend flows.&lt;/p&gt;

&lt;p&gt;They need to be represented clearly within the system.&lt;/p&gt;

&lt;p&gt;This does not mean every business suddenly needs a public API for everything.&lt;/p&gt;

&lt;p&gt;Security, authentication, permissions, and business risk still matter.&lt;/p&gt;

&lt;p&gt;But the architectural mindset is changing.&lt;/p&gt;

&lt;p&gt;The system needs to expose capabilities in a way that can be understood and controlled.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture behind AI commerce
&lt;/h2&gt;

&lt;p&gt;A useful way to think about the future architecture is through four layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Interface Layer
&lt;/h2&gt;

&lt;p&gt;This is where the user interacts.&lt;/p&gt;

&lt;p&gt;It could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A website&lt;/li&gt;
&lt;li&gt;A mobile app&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;An AI assistant&lt;/li&gt;
&lt;li&gt;A conversational interface&lt;/li&gt;
&lt;li&gt;A voice interface&lt;/li&gt;
&lt;li&gt;A third-party agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important point is that the business should not depend entirely on one interface.&lt;/p&gt;

&lt;p&gt;Interfaces can change.&lt;/p&gt;

&lt;p&gt;The core capabilities should remain stable.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Intelligence Layer
&lt;/h2&gt;

&lt;p&gt;This layer understands intent.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I need a laptop for software development under a certain budget."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system needs to interpret:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User requirements&lt;/li&gt;
&lt;li&gt;Budget&lt;/li&gt;
&lt;li&gt;Product preferences&lt;/li&gt;
&lt;li&gt;Constraints&lt;/li&gt;
&lt;li&gt;Available options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An AI system may help translate human intent into structured actions.&lt;/p&gt;

&lt;p&gt;But AI should not be responsible for inventing the truth.&lt;/p&gt;

&lt;p&gt;It should retrieve information from reliable systems.&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;AI can interpret.&lt;/p&gt;

&lt;p&gt;Your systems should remain the source of truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Business Capability Layer
&lt;/h2&gt;

&lt;p&gt;This is where the actual business operations exist.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product Catalog
Pricing Engine
Inventory System
Order Management
Payment System
Shipping System
Customer Management
Business Rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This layer should contain the actual capabilities of the business.&lt;/p&gt;

&lt;p&gt;The interface should consume these capabilities.&lt;/p&gt;

&lt;p&gt;An AI agent may consume them too.&lt;/p&gt;

&lt;p&gt;The website is just one consumer.&lt;/p&gt;

&lt;p&gt;That is the architectural shift I find particularly interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Trust and Control Layer
&lt;/h2&gt;

&lt;p&gt;Once AI systems begin taking actions, trust becomes a core engineering problem.&lt;/p&gt;

&lt;p&gt;An AI should not simply have unrestricted access to a system.&lt;/p&gt;

&lt;p&gt;Businesses need to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Authorization&lt;/li&gt;
&lt;li&gt;Permission boundaries&lt;/li&gt;
&lt;li&gt;Transaction limits&lt;/li&gt;
&lt;li&gt;Human confirmation&lt;/li&gt;
&lt;li&gt;Audit trails&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Rollbacks&lt;/li&gt;
&lt;li&gt;Fraud prevention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more autonomous the system becomes, the more important these controls become.&lt;/p&gt;

&lt;p&gt;AI agents may create a more flexible interface.&lt;/p&gt;

&lt;p&gt;But flexibility without control creates risk.&lt;/p&gt;




&lt;h2&gt;
  
  
  The website becomes one interface among many
&lt;/h2&gt;

&lt;p&gt;I don't think websites are disappearing.&lt;/p&gt;

&lt;p&gt;People will continue using websites.&lt;/p&gt;

&lt;p&gt;Brands will continue designing experiences.&lt;/p&gt;

&lt;p&gt;Companies will continue optimize their products for humans.&lt;/p&gt;

&lt;p&gt;But the website may gradually lose its position as the &lt;strong&gt;only center of the digital experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A product could increasingly exist across multiple interfaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Website
                    │
                    │
Search ─────── Business Systems ─────── Mobile App
                    │
                    │
               AI Agents
                    │
                    │
             Voice Interfaces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The business system becomes the foundation.&lt;/p&gt;

&lt;p&gt;Interfaces become ways of accessing it.&lt;/p&gt;

&lt;p&gt;This architecture is more resilient to changes in user behavior.&lt;/p&gt;

&lt;p&gt;If a new interface becomes important, you don't need to rebuild the entire business.&lt;/p&gt;

&lt;p&gt;You need to connect that interface to well-defined capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  The engineering challenge is bigger than adding AI
&lt;/h2&gt;

&lt;p&gt;This is why I don't think the right response is simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let's add an AI chatbot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The bigger opportunity is to look at the architecture underneath the product.&lt;/p&gt;

&lt;p&gt;Can the system clearly represent the business?&lt;/p&gt;

&lt;p&gt;Can capabilities be accessed independently?&lt;/p&gt;

&lt;p&gt;Are APIs reliable?&lt;/p&gt;

&lt;p&gt;Is product data structured?&lt;/p&gt;

&lt;p&gt;Are business rules centralized?&lt;/p&gt;

&lt;p&gt;Can actions be safely executed?&lt;/p&gt;

&lt;p&gt;Can the system explain what happened?&lt;/p&gt;

&lt;p&gt;Can failures be detected and recovered?&lt;/p&gt;

&lt;p&gt;These are engineering questions.&lt;/p&gt;

&lt;p&gt;And they will become increasingly important as AI moves from generating answers to coordinating actions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The real competitive advantage may move deeper into the stack
&lt;/h2&gt;

&lt;p&gt;For many years, companies competed heavily through the interface.&lt;/p&gt;

&lt;p&gt;Better UX.&lt;/p&gt;

&lt;p&gt;Better design.&lt;/p&gt;

&lt;p&gt;Better onboarding.&lt;/p&gt;

&lt;p&gt;Better conversion funnels.&lt;/p&gt;

&lt;p&gt;Those things will remain important.&lt;/p&gt;

&lt;p&gt;But AI-driven interfaces could make the underlying system architecture increasingly visible.&lt;/p&gt;

&lt;p&gt;If an AI agent cannot understand your product, access reliable information, or interact safely with your capabilities, you may become harder to discover and transact with outside your own interface.&lt;/p&gt;

&lt;p&gt;The competitive advantage may increasingly come from how well your business capabilities are represented inside the system.&lt;/p&gt;

&lt;p&gt;Not just how good the website looks.&lt;/p&gt;




&lt;h2&gt;
  
  
  A question I think engineering teams should start asking
&lt;/h2&gt;

&lt;p&gt;When building a new product, we often ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What screens do we need?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe we should increasingly ask another question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What capabilities does this business need to expose?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Instead of starting with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product Page
↓
Cart Page
↓
Checkout Page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start by understanding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discover Product
Get Product Details
Check Availability
Calculate Price
Apply Offer
Create Order
Authorize Payment
Arrange Delivery
Track Order
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the capabilities are clear, different interfaces can be built around them.&lt;/p&gt;

&lt;p&gt;A website.&lt;/p&gt;

&lt;p&gt;A mobile app.&lt;/p&gt;

&lt;p&gt;An AI assistant.&lt;/p&gt;

&lt;p&gt;A partner integration.&lt;/p&gt;

&lt;p&gt;A voice interface.&lt;/p&gt;

&lt;p&gt;The interfaces may change.&lt;/p&gt;

&lt;p&gt;The business capabilities remain.&lt;/p&gt;




&lt;h2&gt;
  
  
  The interface is becoming more flexible. The system needs to become more structured.
&lt;/h2&gt;

&lt;p&gt;That is the part of this shift that interests me most.&lt;/p&gt;

&lt;p&gt;AI-powered commerce is not only a change in search, advertising, or checkout.&lt;/p&gt;

&lt;p&gt;It could push engineering teams toward a different way of designing products.&lt;/p&gt;

&lt;p&gt;One where products need to serve both:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Humans interacting through interfaces.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And increasingly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI systems acting on behalf of humans.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The website is not disappearing.&lt;/p&gt;

&lt;p&gt;But it may become one interface among many.&lt;/p&gt;

&lt;p&gt;And the businesses best positioned for that future may be the ones that have built systems with clear data, well-defined capabilities, strong controls, and reliable foundations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The interface is becoming more flexible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The system behind it needs to become more structured.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And I think that's going to be one of the most interesting engineering challenges of the next few years.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>website</category>
      <category>google</category>
    </item>
    <item>
      <title>15 Things CA Firms Can Automate With AI — Starting With the Work Nobody Wants to Do</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Fri, 28 Aug 2026 17:26:27 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/15-things-ca-firms-can-automate-with-ai-starting-with-the-work-nobody-wants-to-do-499d</link>
      <guid>https://dev.to/gaurav_talesara/15-things-ca-firms-can-automate-with-ai-starting-with-the-work-nobody-wants-to-do-499d</guid>
      <description>&lt;p&gt;&lt;em&gt;WhatsApp follow-ups, missing documents, GST workflows, loan cases, bank queries, fee collection and more.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A client sends a WhatsApp message:&lt;/p&gt;

&lt;p&gt;“Sir, GST ka kya hua?”&lt;/p&gt;

&lt;p&gt;Someone from the CA firm's team opens WhatsApp, searches for the client, checks an Excel sheet, looks through Google Drive, asks another team member, and finally replies.&lt;/p&gt;

&lt;p&gt;The answer may take two minutes.&lt;/p&gt;

&lt;p&gt;Finding the answer can take ten.&lt;/p&gt;

&lt;p&gt;Now multiply that by hundreds of clients.&lt;/p&gt;

&lt;p&gt;This is where I think the real opportunity for AI in CA firms begins.&lt;/p&gt;

&lt;p&gt;Not with another chatbot.&lt;/p&gt;

&lt;p&gt;With the repetitive work happening around the CA every single day.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Shouldn't Replace the CA. It Should Remove the Work Around the CA.
&lt;/h2&gt;

&lt;p&gt;A CA's time is valuable.&lt;/p&gt;

&lt;p&gt;Professional judgment, tax planning, financial advice, audits, client relationships and complex decisions require experience.&lt;/p&gt;

&lt;p&gt;But many activities surrounding that work are repetitive.&lt;/p&gt;

&lt;p&gt;Someone has to ask for documents.&lt;/p&gt;

&lt;p&gt;Someone has to send reminders.&lt;/p&gt;

&lt;p&gt;Someone has to check whether documents arrived.&lt;/p&gt;

&lt;p&gt;Someone has to update an Excel sheet.&lt;/p&gt;

&lt;p&gt;Someone has to follow up with a client.&lt;/p&gt;

&lt;p&gt;Someone has to track a bank query.&lt;/p&gt;

&lt;p&gt;Someone has to remember which loan case is waiting for what.&lt;/p&gt;

&lt;p&gt;These are exactly the kinds of workflows where automation can help.&lt;/p&gt;

&lt;p&gt;The question isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Where can we add AI?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“What does the team repeatedly do every day that doesn't actually require professional judgment?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are 15 areas worth exploring.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Client Document Collection
&lt;/h2&gt;

&lt;p&gt;This is probably one of the easiest places to start.&lt;/p&gt;

&lt;p&gt;CA firms constantly need documents from clients: bank statements, purchase registers, sales data, invoices, investment proofs, previous ITRs, GST information and more.&lt;/p&gt;

&lt;p&gt;The difficult part isn't asking once.&lt;/p&gt;

&lt;p&gt;It's keeping track of what's still missing across hundreds of clients.&lt;/p&gt;

&lt;p&gt;Imagine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client: Patel Textiles

Required: 10 documents
Received: 8
Verified: 7
Missing: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An automation can send the request through WhatsApp or email.&lt;/p&gt;

&lt;p&gt;When the client uploads a document, the system can identify it, attach it to the correct client, update the checklist and request whatever is still missing.&lt;/p&gt;

&lt;p&gt;The staff no longer has to remember every outstanding document.&lt;/p&gt;

&lt;p&gt;The system does.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. AI Document Classification and Verification
&lt;/h2&gt;

&lt;p&gt;Receiving a document is only half the problem.&lt;/p&gt;

&lt;p&gt;The next question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the client send the right document?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI can classify uploaded files and perform basic checks before they reach the CA team.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Uploaded: bank_statement_august.pdf

Document type: Bank Statement
Client: Patel Textiles
Period: August
Readable: Yes
Status: Verified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected: Bank Statement

Received: Invoice

Status: Wrong Document
Action: Request correct document
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can save staff from manually opening and sorting hundreds of files.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. WhatsApp Client Query Automation
&lt;/h2&gt;

&lt;p&gt;WhatsApp has become one of the most important communication channels for many Indian businesses.&lt;/p&gt;

&lt;p&gt;CA firms receive questions throughout the day:&lt;/p&gt;

&lt;p&gt;“What documents do I need?”&lt;/p&gt;

&lt;p&gt;“When is the GST deadline?”&lt;/p&gt;

&lt;p&gt;“Did you receive my statement?”&lt;/p&gt;

&lt;p&gt;“What is pending from my side?”&lt;/p&gt;

&lt;p&gt;“Has my return been filed?”&lt;/p&gt;

&lt;p&gt;An AI assistant can handle the first level of these questions.&lt;/p&gt;

&lt;p&gt;But there is an important difference between a generic chatbot and a useful CA assistant.&lt;/p&gt;

&lt;p&gt;A generic chatbot knows what GST is.&lt;/p&gt;

&lt;p&gt;A useful assistant knows that &lt;strong&gt;this particular client's GST filing is waiting for two documents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Context is the real value.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Client Onboarding
&lt;/h2&gt;

&lt;p&gt;New clients create a surprising amount of administrative work.&lt;/p&gt;

&lt;p&gt;A new client may require:&lt;/p&gt;

&lt;p&gt;KYC.&lt;/p&gt;

&lt;p&gt;PAN.&lt;/p&gt;

&lt;p&gt;GST details.&lt;/p&gt;

&lt;p&gt;Previous returns.&lt;/p&gt;

&lt;p&gt;Accounting data.&lt;/p&gt;

&lt;p&gt;Bank statements.&lt;/p&gt;

&lt;p&gt;Engagement documentation.&lt;/p&gt;

&lt;p&gt;Service selection.&lt;/p&gt;

&lt;p&gt;Team assignment.&lt;/p&gt;

&lt;p&gt;Instead of managing this through spreadsheets and messages, an onboarding workflow can track everything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client Onboarding: 72%

Completed:
KYC
PAN
GST

Pending:
Previous ITR
Bank Statements
Accounting Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client sees what is pending.&lt;/p&gt;

&lt;p&gt;The staff sees what is incomplete.&lt;/p&gt;

&lt;p&gt;The partner sees the overall status.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. GST Compliance Readiness
&lt;/h2&gt;

&lt;p&gt;Compliance automation shouldn't stop at sending deadline reminders.&lt;/p&gt;

&lt;p&gt;Knowing that a GST return is due in five days is useful.&lt;/p&gt;

&lt;p&gt;Knowing &lt;strong&gt;why the return isn't ready&lt;/strong&gt; is much more useful.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GSTR-3B

Sales Data        Complete
Purchase Data     Complete
GSTR-2B           Complete
Reconciliation    3 Exceptions
CA Review         Pending
Client Approval   Pending
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the system can identify exactly what is blocking the filing.&lt;/p&gt;

&lt;p&gt;That turns a simple reminder system into a workflow system.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. GST Reconciliation and Exception Detection
&lt;/h2&gt;

&lt;p&gt;AI doesn't need to review everything.&lt;/p&gt;

&lt;p&gt;Sometimes its most valuable role is to find the things that deserve human attention.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicate invoices&lt;/li&gt;
&lt;li&gt;GST amount mismatches&lt;/li&gt;
&lt;li&gt;Purchase invoices missing from 2B&lt;/li&gt;
&lt;li&gt;Unusual ITC movements&lt;/li&gt;
&lt;li&gt;Sales data mismatches&lt;/li&gt;
&lt;li&gt;Unexpected changes in margins&lt;/li&gt;
&lt;li&gt;Credit-note anomalies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of asking someone to manually inspect everything, AI can create an exception list.&lt;/p&gt;

&lt;p&gt;The CA reviews the exceptions.&lt;/p&gt;

&lt;p&gt;This is a powerful pattern for professional services:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI prepares and prioritizes. Humans review and approve.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. ITR Document and Information Collection
&lt;/h2&gt;

&lt;p&gt;ITR preparation involves another predictable collection process.&lt;/p&gt;

&lt;p&gt;The firm may need Form 16, capital gains information, investment proofs, bank statements, interest certificates, previous returns and other supporting information.&lt;/p&gt;

&lt;p&gt;The workflow can become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ITR Client
↓
Checklist Generated
↓
Documents Requested
↓
Documents Received
↓
AI Classification
↓
Missing Information Identified
↓
Staff Review
↓
CA Review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system isn't preparing tax advice on its own.&lt;/p&gt;

&lt;p&gt;It's reducing the administrative work required to get the case ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Compliance Deadline Management
&lt;/h2&gt;

&lt;p&gt;A calendar tells you when something is due.&lt;/p&gt;

&lt;p&gt;A workflow tells you whether you're actually ready.&lt;/p&gt;

&lt;p&gt;A better compliance system can automatically create tasks based on the client's services.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
↓
GST
↓
TDS
↓
ITR
↓
ROC
↓
Audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each service creates its own workflow.&lt;/p&gt;

&lt;p&gt;Tasks can be assigned to staff.&lt;/p&gt;

&lt;p&gt;Missing information can trigger client reminders.&lt;/p&gt;

&lt;p&gt;Unresolved items can be escalated.&lt;/p&gt;

&lt;p&gt;The partner gets visibility without having to ask every employee for an update.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Internal Task Assignment
&lt;/h2&gt;

&lt;p&gt;One of the biggest problems in a growing CA firm is simply knowing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is doing what?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A compliance workflow could automatically create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client: ABC Industries

Task: GST Reconciliation
Owner: Rahul
Due: 25 August
Status: Waiting for Client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the documents arrive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: Ready for Review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the CA approves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: Completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a clear operational trail.&lt;/p&gt;

&lt;p&gt;It also makes workload visible across the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Fee and Payment Follow-ups
&lt;/h2&gt;

&lt;p&gt;Another repetitive process is collecting fees.&lt;/p&gt;

&lt;p&gt;The basic workflow is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invoice
↓
Due Date
↓
Reminder
↓
Client Response
↓
Payment
↓
Receipt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But automation can make this smarter.&lt;/p&gt;

&lt;p&gt;If a client says:&lt;/p&gt;

&lt;p&gt;“I'll pay on Friday.”&lt;/p&gt;

&lt;p&gt;The system can record the commitment.&lt;/p&gt;

&lt;p&gt;If Friday passes and payment hasn't arrived, the follow-up can happen automatically.&lt;/p&gt;

&lt;p&gt;Staff only needs to intervene when the normal workflow doesn't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Loan Lead Qualification
&lt;/h2&gt;

&lt;p&gt;This is where things get particularly interesting.&lt;/p&gt;

&lt;p&gt;Many CA firms also have finance or loan departments.&lt;/p&gt;

&lt;p&gt;They may help clients with business loans, working capital, project finance, machinery finance, home loans, vehicle loans and other financing requirements.&lt;/p&gt;

&lt;p&gt;A client might simply send:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Mare ₹2 crore ni working capital joiye che.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of immediately handing the conversation to someone, an AI assistant can collect the basic information required for an initial assessment.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Business Type
Annual Turnover
Existing Loans
Current Bank
GST Status
ITR History
Loan Requirement
Purpose
Collateral
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result becomes a structured finance lead instead of an unstructured WhatsApp conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Loan Document Collection
&lt;/h2&gt;

&lt;p&gt;Loan processing involves a significant amount of documentation.&lt;/p&gt;

&lt;p&gt;Depending on the case, the team may need financial statements, ITRs, GST information, bank statements, existing loan details, KYC, property documents and other lender-specific information.&lt;/p&gt;

&lt;p&gt;A Loan Desk can show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loan Case #1047

Required: 24
Received: 18
Verified: 14
Missing: 6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system can automatically follow up with the client.&lt;/p&gt;

&lt;p&gt;It can also identify which cases are blocked because of missing information.&lt;/p&gt;

&lt;p&gt;That makes the finance team's pipeline much easier to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Bank Query Tracking
&lt;/h2&gt;

&lt;p&gt;This is one of the most interesting workflows in loan processing.&lt;/p&gt;

&lt;p&gt;A bank might ask:&lt;/p&gt;

&lt;p&gt;“Please explain the increase in debtor days.”&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;“Please provide updated CMA.”&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;“Please submit promoter ITR.”&lt;/p&gt;

&lt;p&gt;These requests can arrive through email, WhatsApp or phone calls.&lt;/p&gt;

&lt;p&gt;A structured Loan Desk could turn each request into a task.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loan Case #1047

Bank Query:
Explain increase in debtor days

Owner:
Rahul

Status:
Waiting for Client

Due:
Tomorrow

Required:
Debtor Ageing Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the team knows exactly what is pending and who owns it.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. AI-Assisted CMA and Financial Analysis
&lt;/h2&gt;

&lt;p&gt;For CA firms involved in project finance and business loans, financial analysis can become another area for automation.&lt;/p&gt;

&lt;p&gt;A system could take historical financial information and help prepare a first-pass analysis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Historical Financials
↓
P&amp;amp;L
Balance Sheet
Cash Flow
↓
Financial Ratios
↓
Projected Financials
↓
CMA / Project Analysis
↓
CA Review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI could also help identify unusual changes or prepare explanations for financial movements.&lt;/p&gt;

&lt;p&gt;But the final assumptions, analysis and professional output should remain under human review.&lt;/p&gt;

&lt;p&gt;AI should accelerate the preparation.&lt;/p&gt;

&lt;p&gt;It shouldn't blindly make the decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. An AI Daily Brief for the CA Partner
&lt;/h2&gt;

&lt;p&gt;Eventually, all of these workflows can come together.&lt;/p&gt;

&lt;p&gt;But I don't think the answer is another dashboard filled with charts.&lt;/p&gt;

&lt;p&gt;A CA partner doesn't necessarily need more information.&lt;/p&gt;

&lt;p&gt;They need to know:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What needs my attention today?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The system could provide a simple daily summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;7 filings blocked
5 clients haven't submitted documents
3 bank queries pending
₹12.8L overdue
8 loan cases waiting for action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's more useful than opening five different spreadsheets and asking five different people for updates.&lt;/p&gt;

&lt;p&gt;The goal isn't more information.&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;less cognitive load&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Build Everything at Once
&lt;/h2&gt;

&lt;p&gt;This is probably the most important point.&lt;/p&gt;

&lt;p&gt;It is tempting to build a complete CA platform with:&lt;/p&gt;

&lt;p&gt;CRM.&lt;/p&gt;

&lt;p&gt;WhatsApp.&lt;/p&gt;

&lt;p&gt;AI chatbot.&lt;/p&gt;

&lt;p&gt;GST.&lt;/p&gt;

&lt;p&gt;ITR.&lt;/p&gt;

&lt;p&gt;Documents.&lt;/p&gt;

&lt;p&gt;Loans.&lt;/p&gt;

&lt;p&gt;CMA.&lt;/p&gt;

&lt;p&gt;Payments.&lt;/p&gt;

&lt;p&gt;Analytics.&lt;/p&gt;

&lt;p&gt;That can quickly turn into a six-month or one-year project before anyone knows whether the product solves a real problem.&lt;/p&gt;

&lt;p&gt;A better approach is to pick one workflow.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document Collection
↓
Document Verification
↓
Compliance Workflow
↓
GST Exceptions
↓
Loan Desk
↓
Financial Intelligence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each module can solve a real problem independently.&lt;/p&gt;

&lt;p&gt;Then they can gradually connect.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Should Actually Be Automated?
&lt;/h2&gt;

&lt;p&gt;A simple rule can help.&lt;/p&gt;

&lt;p&gt;Automate work that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repetitive&lt;/li&gt;
&lt;li&gt;High-volume&lt;/li&gt;
&lt;li&gt;Time-consuming&lt;/li&gt;
&lt;li&gt;Rule-based&lt;/li&gt;
&lt;li&gt;Easy to verify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep humans in control of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Professional judgment&lt;/li&gt;
&lt;li&gt;Tax positions&lt;/li&gt;
&lt;li&gt;Financial decisions&lt;/li&gt;
&lt;li&gt;Client advice&lt;/li&gt;
&lt;li&gt;Final approvals&lt;/li&gt;
&lt;li&gt;Lending decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best AI system isn't the one that makes every decision.&lt;/p&gt;

&lt;p&gt;It's the one that handles the repetitive work and brings the important exceptions to the professional.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Opportunity
&lt;/h2&gt;

&lt;p&gt;The future of CA-firm software probably isn't another chatbot.&lt;/p&gt;

&lt;p&gt;It's a system that understands the state of every client and every workflow.&lt;/p&gt;

&lt;p&gt;Which documents are missing?&lt;/p&gt;

&lt;p&gt;Which filings are blocked?&lt;/p&gt;

&lt;p&gt;Which tasks are overdue?&lt;/p&gt;

&lt;p&gt;Which loan cases are waiting for the bank?&lt;/p&gt;

&lt;p&gt;Which clients haven't paid?&lt;/p&gt;

&lt;p&gt;Which cases need the CA's attention?&lt;/p&gt;

&lt;p&gt;And which tasks can simply be handled automatically?&lt;/p&gt;

&lt;p&gt;The CA remains the expert.&lt;/p&gt;

&lt;p&gt;The team remains responsible for professional execution.&lt;/p&gt;

&lt;p&gt;AI becomes the operational layer that connects the work.&lt;/p&gt;

&lt;p&gt;That's where I think the opportunity becomes much more interesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you run a CA firm, what is the one repetitive process your team does every day that you would happily never have to manage manually again?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>NOOA: What If an AI Agent Was Just a Python Object?</title>
      <dc:creator>Gaurav Talesara</dc:creator>
      <pubDate>Wed, 12 Aug 2026 17:32:29 +0000</pubDate>
      <link>https://dev.to/gaurav_talesara/nooa-what-if-an-ai-agent-was-just-a-python-object-453o</link>
      <guid>https://dev.to/gaurav_talesara/nooa-what-if-an-ai-agent-was-just-a-python-object-453o</guid>
      <description>&lt;p&gt;There is something interesting happening in the AI agent space.&lt;/p&gt;

&lt;p&gt;We have spent the last couple of years building agents using prompts, tools, function calling, workflows, graphs, memory systems, orchestration layers, and increasingly complicated frameworks.&lt;/p&gt;

&lt;p&gt;And now NVIDIA Labs has released something that made me stop and think:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if an AI agent was just a Python object?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the basic idea behind &lt;strong&gt;NOOA — NVIDIA Object-Oriented Agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is an open-source, model-agnostic Python framework that represents an agent as a Python class, where the object's fields represent state, methods represent capabilities, docstrings can define instructions, and type annotations define interfaces.&lt;/p&gt;

&lt;p&gt;The project is still very new and explicitly described as research software. But I think the idea behind it is worth paying attention to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/NVIDIA-NeMo/labs-OO-Agents?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;NOOA on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what is actually different?
&lt;/h2&gt;

&lt;p&gt;Let's look at the traditional way we might build an agent.&lt;/p&gt;

&lt;p&gt;We could have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A system prompt&lt;/li&gt;
&lt;li&gt;A collection of tools&lt;/li&gt;
&lt;li&gt;Tool schemas&lt;/li&gt;
&lt;li&gt;A memory component&lt;/li&gt;
&lt;li&gt;An orchestration loop&lt;/li&gt;
&lt;li&gt;State management&lt;/li&gt;
&lt;li&gt;Some workflow engine&lt;/li&gt;
&lt;li&gt;Observability/tracing&lt;/li&gt;
&lt;li&gt;Retry logic&lt;/li&gt;
&lt;li&gt;Structured output handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these pieces are useful.&lt;/p&gt;

&lt;p&gt;But they also create a growing abstraction layer between the developer and the agent.&lt;/p&gt;

&lt;p&gt;NOOA takes a different approach.&lt;/p&gt;

&lt;p&gt;You define something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nooa&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SupportAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a customer support agent.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;order_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OrderDB&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_refund_eligible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt;
            &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;days_since_delivery&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ticket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Create a typed support ticket.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And suddenly the architecture feels very familiar.&lt;/p&gt;

&lt;p&gt;The agent is an object.&lt;/p&gt;

&lt;p&gt;Its state is on the object.&lt;/p&gt;

&lt;p&gt;Its capabilities are methods.&lt;/p&gt;

&lt;p&gt;Its interfaces are typed.&lt;/p&gt;

&lt;p&gt;Its instructions can live with the methods.&lt;/p&gt;

&lt;p&gt;And the interesting part is the &lt;code&gt;...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A method with a real Python implementation behaves like normal deterministic Python.&lt;/p&gt;

&lt;p&gt;A method with an &lt;code&gt;...&lt;/code&gt; body becomes an LLM-driven method at runtime.&lt;/p&gt;

&lt;p&gt;That is a surprisingly simple idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this matter?
&lt;/h2&gt;

&lt;p&gt;The thing that caught my attention isn't just the syntax.&lt;/p&gt;

&lt;p&gt;It is the &lt;strong&gt;mental model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We have traditionally thought about an AI agent as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prompt + Model + Tools + Memory + Loop&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NOOA is suggesting another abstraction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agent = Software Object + Model&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a meaningful shift.&lt;/p&gt;

&lt;p&gt;If the agent is a Python object, then many things software engineers already know how to do become natural again.&lt;/p&gt;

&lt;p&gt;Testing.&lt;/p&gt;

&lt;p&gt;Refactoring.&lt;/p&gt;

&lt;p&gt;Version control.&lt;/p&gt;

&lt;p&gt;Tracing.&lt;/p&gt;

&lt;p&gt;Dependency injection.&lt;/p&gt;

&lt;p&gt;Type checking.&lt;/p&gt;

&lt;p&gt;Composition.&lt;/p&gt;

&lt;p&gt;State management.&lt;/p&gt;

&lt;p&gt;Code review.&lt;/p&gt;

&lt;p&gt;Instead of learning another workflow DSL or another orchestration abstraction, developers can start with something they already understand: Python.&lt;/p&gt;

&lt;p&gt;NVIDIA's implementation goes further than simply wrapping an LLM in a class. The framework supports typed I/O, live Python objects passed by reference, model-generated Python as an action mechanism, programmable agent loops, context/event APIs, tracing, and long-term memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I find especially interesting: code as action
&lt;/h2&gt;

&lt;p&gt;This is probably one of the most interesting pieces of NOOA.&lt;/p&gt;

&lt;p&gt;Instead of every capability necessarily becoming a traditional function/tool schema that gets serialized into the model context, the model can generate Python and operate within the agent's environment.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model doesn't only call tools.&lt;br&gt;
The model can write code to use the agent's capabilities.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That changes the interface between the LLM and the application.&lt;/p&gt;

&lt;p&gt;Python methods and type annotations can become the interface the model works with.&lt;/p&gt;

&lt;p&gt;For developers, this could eventually mean less time maintaining huge collections of tool definitions and more time defining clean software interfaces.&lt;/p&gt;

&lt;p&gt;Of course, this also creates a very important security problem.&lt;/p&gt;

&lt;p&gt;If an LLM can generate and execute Python, we should treat that code as untrusted.&lt;/p&gt;

&lt;p&gt;NOOA's own documentation is very clear about this: its AST validation and module restrictions are defense-in-depth mechanisms, not a security boundary. The recommended containment boundary is OS-level sandboxing such as containers or NVIDIA OpenShell.&lt;/p&gt;

&lt;p&gt;And I think that distinction is extremely important.&lt;/p&gt;
&lt;h2&gt;
  
  
  Another interesting idea: agent state
&lt;/h2&gt;

&lt;p&gt;There is another architectural question that NOOA makes interesting.&lt;/p&gt;

&lt;p&gt;Where should an agent's state live?&lt;/p&gt;

&lt;p&gt;Today, a lot of agent state effectively lives inside the context window.&lt;/p&gt;

&lt;p&gt;The longer the conversation becomes, the more we start thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summarization&lt;/li&gt;
&lt;li&gt;context compression&lt;/li&gt;
&lt;li&gt;retrieval&lt;/li&gt;
&lt;li&gt;memory&lt;/li&gt;
&lt;li&gt;token optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NOOA instead treats the agent as an object with state.&lt;/p&gt;

&lt;p&gt;That opens the door to a different model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent
 ├── State
 ├── Capabilities
 ├── Memory
 ├── Methods
 ├── Context
 └── Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The LLM becomes part of the object rather than the object being constructed around an LLM conversation.&lt;/p&gt;

&lt;p&gt;That is subtle, but I think it could become important as agents become more persistent and autonomous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is NOOA going to replace other agent frameworks?
&lt;/h2&gt;

&lt;p&gt;I don't think we know that yet.&lt;/p&gt;

&lt;p&gt;And I would actually argue that this is the wrong question.&lt;/p&gt;

&lt;p&gt;NOOA is currently a &lt;strong&gt;0.x research preview&lt;/strong&gt;, and NVIDIA says its public API is not yet stable and can change between releases.&lt;/p&gt;

&lt;p&gt;So I wouldn't recommend looking at it today and saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This is the new standard for AI agents."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;But I would definitely recommend watching it.&lt;/p&gt;

&lt;p&gt;Because research projects like this sometimes introduce an abstraction that looks unusual initially and becomes obvious later.&lt;/p&gt;

&lt;p&gt;Remember how strange some ideas looked before they became standard programming patterns?&lt;/p&gt;

&lt;p&gt;The interesting question here is whether &lt;strong&gt;object-oriented programming becomes a useful abstraction for agent engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  My prediction
&lt;/h2&gt;

&lt;p&gt;I don't think the future will be one giant agent framework.&lt;/p&gt;

&lt;p&gt;I think we are going to see a convergence of several ideas.&lt;/p&gt;

&lt;p&gt;Agents will increasingly look like software components rather than chatbot conversations.&lt;/p&gt;

&lt;p&gt;They will have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent state&lt;/li&gt;
&lt;li&gt;Typed interfaces&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Capabilities&lt;/li&gt;
&lt;li&gt;Deterministic code&lt;/li&gt;
&lt;li&gt;Model-driven reasoning&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Sandboxed execution&lt;/li&gt;
&lt;li&gt;Testable behavior&lt;/li&gt;
&lt;li&gt;Composable sub-agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the boundary between &lt;strong&gt;"AI logic"&lt;/strong&gt; and &lt;strong&gt;"software logic"&lt;/strong&gt; will become much thinner.&lt;/p&gt;

&lt;p&gt;That's what makes NOOA interesting to me.&lt;/p&gt;

&lt;p&gt;It isn't necessarily introducing another way to call an LLM.&lt;/p&gt;

&lt;p&gt;It is asking a more fundamental question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What should an AI agent look like from a software engineer's perspective?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the answer from NVIDIA Labs is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Maybe it should just look like a Python object.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I want to see next
&lt;/h2&gt;

&lt;p&gt;This is where things get really interesting.&lt;/p&gt;

&lt;p&gt;I'd love to see how this approach evolves around:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Production reliability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How do these agents behave under real workloads, failures, retries, concurrency, and partial state?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If agents can generate and execute code, sandboxing will become a fundamental part of the architecture, not an optional feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Multi-agent systems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What happens when Python objects representing agents start collaborating with each other?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ResearchAgent
       ↓
PlanningAgent
       ↓
CodingAgent
       ↓
ReviewAgent
       ↓
DeploymentAgent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can these simply become composable software objects?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Agent testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This could be particularly powerful.&lt;/p&gt;

&lt;p&gt;Imagine being able to test an agent almost like any other Python component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_refund_policy&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SupportAgent&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_refund_eligible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then separately evaluate the probabilistic behavior of its LLM-driven methods.&lt;/p&gt;

&lt;p&gt;That separation between deterministic logic and model-driven behavior could become a very useful engineering pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Agent observability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NOOA already traces LLM calls, code execution, and method invocations.&lt;/p&gt;

&lt;p&gt;I think this will become critical.&lt;/p&gt;

&lt;p&gt;As agents become more autonomous, "the model said something weird" won't be enough for debugging.&lt;/p&gt;

&lt;p&gt;We will need to know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What did the agent know?
What state did it have?
What method did it invoke?
What code did it generate?
What did that code change?
What model decision happened?
What happened next?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is software observability applied to probabilistic systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger shift
&lt;/h2&gt;

&lt;p&gt;Maybe the most interesting thing about NOOA isn't NOOA itself.&lt;/p&gt;

&lt;p&gt;Maybe it is the direction it represents.&lt;/p&gt;

&lt;p&gt;The first generation of AI applications taught us how to integrate models into software.&lt;/p&gt;

&lt;p&gt;The next generation is teaching us how to make models behave like software components.&lt;/p&gt;

&lt;p&gt;And eventually, I think we will stop drawing such a sharp line between the two.&lt;/p&gt;

&lt;p&gt;An agent won't just be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"an LLM with some tools."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It may become:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"a software component whose reasoning happens to be powered by a model."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NOOA is still early.&lt;/p&gt;

&lt;p&gt;The APIs will change.&lt;/p&gt;

&lt;p&gt;The patterns will evolve.&lt;/p&gt;

&lt;p&gt;There will be competing approaches.&lt;/p&gt;

&lt;p&gt;Some ideas will work. Some won't.&lt;/p&gt;

&lt;p&gt;But that's exactly why I think it is worth experimenting with now.&lt;/p&gt;

&lt;p&gt;Not because NOOA is already the answer.&lt;/p&gt;

&lt;p&gt;But because it might be pointing toward a different question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does software engineering look like when the software itself can reason?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the part I'm watching.&lt;/p&gt;

&lt;p&gt;And I have a feeling we are going to see some very interesting updates in this space over the next year.&lt;/p&gt;




&lt;p&gt;If you're building AI agents today, I'm curious:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would you rather build your next agent as a workflow/graph — or as a Python object?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear what other engineers think.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI #AIAgents #AgenticAI #NVIDIA #Python #LLM #GenerativeAI #SoftwareEngineering #ArtificialIntelligence #DeveloperExperience
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>nvidia</category>
      <category>agentskills</category>
    </item>
  </channel>
</rss>
