Ritik Chaturvedi

Quality where the money is.

I own quality for the finance side of an ERP used by construction and manufacturing companies: accounts payable, payments, purchase orders, general ledger. Manual depth where it matters, Playwright automation where it repeats, and a root-cause write-up for every defect I raise.

QA Engineer at Merlin AI Software (YC S24), Bengaluru. Working toward backend engineering: I trace defects into the code and ship small, reviewed fixes with Claude Code.

Ritik ChaturvediQA Engineer, Merlin AI Software (YC S24)Bengaluru, India

I test the part of an ERP where mistakes cost money

Bills, payments, purchase orders, the general ledger: the screens an accountant uses every day, and where a wrong cent is a real problem, not a cosmetic one.

What I care about is why. A screenshot of something broken is the start of the job, not the end of it. I trace the symptom into the backend code, find what caused it, work out who else is affected by the same cause, and write that up so the fix is a decision rather than a guess. Increasingly I ship the fix too: small, well-scoped changes written with Claude Code, with the blast radius spelled out in the pull request and a developer's review before merge.

I automate the flows that repeat, in Python with Playwright, and I keep the automation honest: real clicks on real screens, no shortcuts through the API to make a test go green. A test that passes for the wrong reason is worse than no test.

I am working toward a backend engineering role, and I am doing it the long way round: by living inside the codebase I test.

How I got here, and where next

I am a tester first. The next stretch is about reading and writing backend code well enough to test it from the inside.

  1. Diploma, Mechanical Engineering (Production) Done

    Government Polytechnic Naraini.

  2. B.Tech, Computer Science Engineering Done

    Allenhouse Institute of Technology.

  3. QA Engineer at Merlin AI Software (YC S24) Current

    Quality for the finance side of a construction and manufacturing ERP, with root cause analysis and small reviewed fixes.

  4. Public test framework Done

    Playwright and pytest framework with an API layer, Postman collection and green CI. It is the suite running at the top of this page.

  5. Daily Python practice In progress

    Short exercises written from memory and committed to python-practice.

  6. Backend basics and a job application tracker Planned

    FastAPI, SQL with Postgres, and Docker, through one project: a small tracker API with its own test suite.

  7. Data structures and an AI layer Planned

    Problem-solving practice, then a small tool built on an AI API.

What I own at Merlin AI Software

QA Engineer, December 2025 to present. A construction and manufacturing ERP: Kotlin, Spring and MongoDB on the backend, Next.js and React on the front end.

Accounts payable

Bill creation and approval, approval reversal, paid and unpaid state, partial payments, recurring bills, credit notes, vendor AP and project AP rollups.

Payments

ACH, wire, cheque and card paths; bank confirmation numbers; future-dated payments; batch payment of several bills; bank-account and GL-account selection.

Receivables and deposits

Bulk deposits, manual deposits, GL, class and location coding, money not applied to an invoice.

Procurement

Purchase orders for materials and trade services, mixed POs, requisition-to-PO conversion, bids, receiving and shipment status, PO approval and void.

General ledger

Journal entries, CSV and payroll imports, import idempotency and retry, chart of accounts, bank reconciliation.

Integrations

QuickBooks sync: vendor and bill duplicate prevention, account mapping.

Access control

Granular role permissions across modules, user invitations and revocation.

Case studies

Seven defects and pieces of work, told the same way: what was reported, how I investigated, what the cause turned out to be, what changed. Customers are not named.

The automation suite

An end-to-end UI suite in Python and Playwright, built with AI assistance. It covers the critical money flows: creating and approving a bill, paying it by each payment method, raising a purchase order from a bid, converting a requisition, recording a deposit. The suite is private; these are the design decisions behind it.

A

Real clicks only

No script-dispatched clicks and no API calls to set up or shortcut a flow. In this product a scripted click can report success without the handler ever running, so a test that passes that way is lying. Every assertion is against what the screen actually did.

B

A findings registry

Known defects are recorded in one place and referenced by the tests that hit them, so a known failure stays visible as a known failure instead of either failing the run or quietly masking a new, different break in the same flow.

C

Written for a staged-rendering app

The app renders in stages and never reaches network idle, so waits are tied to the specific thing being waited for, not to a generic idle signal. Several screens have more than one implementation of the same control, so locators match any of the variants.

D

Environment-aware

Flows run against the environment the data lives in, with the workspace, supplier and account fixtures held in config rather than hard-coded in tests.

A public version you can watch run

The work suite is private, so I rebuilt the same way of working on public demo sites. These are its 18 tests: the left side lists them, the right side shows what each one does. Type a command or tap a test.

  1. Run API tests8 tests, no browser
  2. Run UI tests10 tests in Chromium
  3. Run Postman collectionwith Newman
  4. Upload reportsscreenshots and HTML
playwright-pytest-framework

    Browser
    Swag Labssaucedemo.com
    ProductsName (A to Z)1

    Your cart

      Checkout

      Checkout: your information

      Continue
      Thank you for your order!

      The left panel lists my real tests. The right panel is a drawn replay of what each one does, not a live run. See the real runs on GitHub Actions.

      What is inside the public repo

      Test plan, test cases, automation, defect report and root cause analysis, built with an AI-assisted workflow that is documented in the repo. Pick a folder.

      18automated tests, UI and API
      25written test cases, P0 to P2
      4page objects: login, inventory, cart, checkout
      3test stages in CI: API, UI, Newman

        The paperwork, as it sits in the repo

        Select a page to read it.

        Results

        38pull requests merged: 15 backend, 23 front end
        7finance areas owned end to end
        17customer-reported fixes verified in one programme
        2customer verification programmes run

        The 15 backend pull requests are the ones that matter most to where I am heading: Kotlin service logic, state machines, and uniqueness and invariant rules, each one written off a defect I had already traced to its cause.

        Changes I have shipped

        Each of these started from a defect I traced. They were written with Claude Code and reviewed by a developer before merge. The common thread: fix the cause at every place it reaches, not just the symptom that got reported.

        Scoping a uniqueness rule correctly

        Invoice numbers were unique across the whole organisation when they should only be unique per supplier, so two different suppliers using the same numbering scheme collided.

        Adding a missing case to a state machine

        The mixed purchase-order completion rule: an order with both materials and services could never complete, because each rollup only recognised its own kind of line.

        Enforcing an invariant at every entry point

        A material line needs either a part number or a description to be renderable, so the check went in at all four places such a line can be created or edited, rather than just the one the bug was reported against.

        Fixing a field mapping between front end and API

        A conversion flow read a field name the API never sends, so data silently did not carry across. Nothing errored; the value just was not there.

        Making a search actually search a field

        A payment's bank confirmation number was stored but neither search path looked at it, so searching by it returned nothing. Both paths plus the search index were updated together so they stay in step.

        Surfacing loading and error states

        A data fetch discarded its errors, so a failed fetch was indistinguishable from an empty result and a whole form field vanished with no explanation. Now it shows a loading state, and an error with a retry, rather than disappearing.

        Refusing an unsafe state transition

        Cancelling an approval could leave a bill in a state its payments contradicted, so the reversal now refuses when there is settled money it cannot explain, while still allowing the legitimate case.

        Writing honest error messages

        Actions that failed silently now say what failed, and a confirmation dialog that said delete for an action that actually revokes an invitation now says what it really does.

        How I work

        Rules I arrived at from being wrong and correcting it.

        1. Get the source data before judging the output

          A blank field or a dash is only a defect if the underlying record actually holds a value. I check the source first. It has saved me from raising defects that were not, and once it reversed a verdict I had already given.

        2. No shortcuts to a green test

          I do not call the API to set up or complete a flow an automated test is meant to be exercising, and I do not use scripted clicks that can succeed without the application responding.

        3. Blocked is not failed

          If I could not exercise something, I write that, with the specific reason. Inflating a pass rate costs more later than an honest gap does now.

        4. State the blast radius

          Every fix says what else the change reaches, so reviewers assess the actual risk rather than the diff size.

        5. Check the thing is really live

          A fix can be merged, deployed, and still reach nobody: behind a flag that is off, or on a branch the environment does not run. I confirm the code is actually running where I am testing before I report a result.

        6. After fixing one instance, look for the same shape

          Defects that do not throw errors hide for months. Once I know the shape of one, I sweep for others.

        7. Write for the person who has to act

          Reports go out in plain English with the steps I followed, so an account manager or an engineer can use them without translation.

        Break this cart

        This small cart has 3 planted bugs. Use it the way a tester would. When you hit one, the bug report writes itself from the steps you took, in the format I use.

        Trail backpack
        $29.99 each
        1
        Subtotal$29.99
        Discount$0.00
        Total$29.99
        0 of 3 bugs found
        Defect report
        No bug reported yet. Try the quantity buttons, the coupon and Remove.

        Skills, stated honestly

        Split by what I do on my own and what I do with support, so nothing here needs defending later.

        Testing

        Core

        Functional and exploratory testing, end-to-end flows, regression, matrix and permissions testing, test data design, defect reporting with root cause.

        Domain

        Deep

        Accounts payable and receivable, payment methods and batch payments, purchase orders and procurement, general ledger and journal imports, QuickBooks sync, role-based access.

        Automation

        Core, AI-assisted

        Python, Playwright, pytest, locator strategy for dynamic UIs, fixtures and config-driven environments. Built with AI assistance, verified by me.

        Tooling

        Core

        Git and GitHub, pull requests and code review, CI runs, branch and environment management, staging deploys, Postman, MongoDB queries, Jira-style tracking, Slack-based delivery.

        Tracing code

        With AI assistance

        Kotlin and Spring services, MongoDB documents and queries, React and Next.js components and data fetching: following a symptom to its cause across both layers, with Claude Code.

        Shipping fixes

        AI-assisted, reviewed

        Backend service logic, front-end field mapping and error states, unit tests alongside the change. Small and well-scoped, written with Claude Code, reviewed by a developer.

        Learning now

        In progress

        Writing Python without AI help, API design, FastAPI and Postgres, and writing backend changes unaided rather than from a traced cause.

        Projects

        Everything here is public. Open any of them.

        Hiring for a QA or SDET role?

        I am open to QA automation and SDET roles, and to backend-leaning QA work, in Bengaluru or remote. Email is the fastest way to reach me.