Ajinkya KunjirStaff Quality Engineer · Ottawa

I’m Ajinkya, a quality engineer who builds the tools that make releases boring.

Seven years of test automation across payments, security platforms and composable commerce. These days I lead quality at Orium and ship open-source tooling for testers on the side.

Experience

  • 2023 – NowOriumStaff Quality Analyst
  • 2022 – 23PLATO · OLG DigitalTest Automation, Web & Mobile
  • 2021 – 22Metron SecuritySecurity Platform QA
  • 2019iACCESS · Ministry of Ed.QA Co-op
  • 2019 – 21Lakehead UniversityMaster of Computer Science

Selected work

Open source · Client work · Research
nfunc-mcpOpen source · 2026

An MCP server that turns five web scanners into one prioritized defect list and a release verdict.

Notary-POMOpen source · 2026

A Playwright page object generator that proves every locator against the live DOM, and emits nothing it cannot prove.

The 500s that weren’t the serverPerformance · Orium

A load test reported a 49% failure rate. The defect was in the script, and fixing it changed the conversation with the client.

Evaluating agentic systemsAI quality · 2026

Golden datasets, LLM-as-judge scoring and tracing to catch hallucinations before they reach users.

What I do

I help engineering teams ship with confidence by building test systems that are fast, trustworthy and cheap to maintain.

  • Test automation architecturePlaywright, Selenium, Appium, Cypress
  • Performance engineeringk6, JMeter, Grafana, Datadog
  • Payments & checkout QAStripe, Adyen, Avalara, PayPal, Visa, Mastercard
  • AI quality & evalsDeepEval, Promptfoo, LangChain, Arize Phoenix
  • Accessibility testingAxe, pa11y, Level Access
  • CI quality gatesJenkins, GitLab CI, sharded parallel runs
  • Security-minded testingOWASP Top 10, OSINT, Semgrep, SIEM/SOAR platforms
  • Release authorityGo / no-go calls, triage, defect escape tracking

About

A staff quality engineer with 7 years of making releases predictable.

Story

I’m Ajinkya Kunjir. I live in Kanata, Ottawa, and work remotely as a Staff Quality Analyst at Orium, a composable commerce consultancy in Toronto. I joined as an SDET in 2023 and now own quality for client releases, including the go / no-go call.

Before Orium I automated web and mobile payment flows at PLATO Consulting for OLG Digital, and tested enterprise security platforms like QRadar, Splunk and ServiceNow at Metron Security. That security work never left me: I study the OWASP Top 10 and PortSwigger’s Web Security Academy, and I hold the IBM Cybersecurity Analyst certificate.

Outside the day job I build open-source tools for testers. I hold a few strong opinions: flakiness is usually a locator design problem, load test failures are often harness defects, and coverage targets tend to make quality worse.

Focus

Performance is where most of my work starts. I build load suites in k6 and JMeter, and spend as much time proving the harness honest as I do the system under test. At Orium that work has delivered 20–30% latency improvements, with Grafana and Datadog dashboards the client teams actually read.

The other half is web security testing. I work from OWASP fundamentals and use OSINT techniques to look at an application from the outside in: what is exposed, what leaks, and what a scanner never thinks to ask.

Lately most of my energy goes into agentic QA. I build AI workflows for client teams — agents that draft and maintain tests and run inside CI, with evals around them so we can tell when the agent is wrong rather than merely confident. The judgement stays with the engineers; three junior QA engineers now run these workflows day to day.

<5%defect escape rate on client releases
49%“server errors” traced to a harness defect

Education

  • Master of Computer ScienceLakehead University, Thunder Bay · 2019–2021
  • B.E. Computer EngineeringPune University

Certifications

  • IBM Cybersecurity AnalystIBM
  • AI Agent Developer SpecializationVanderbilt University
  • Cloud Digital LeaderGoogle Cloud

Get in touch

If you feel like talking shop about QA, agentic testing or consulting work, get in touch — it’s the kind of conversation I’ll always make time for.

ajinkyajr101@gmail.com

Open source · MCP server · 2026

nfunc-mcp

// claude_desktop_config.json
{ "mcpServers": { "nfunc": { "command": "npx", "args": ["nfunc-mcp"] } } }

› "Is the checkout page ready to ship?"

P1  2 blockers   P2  5 should-fix   P3  16 notes
verdict  BLOCK RELEASE
sample output, illustrative
Role
Creator & maintainer
Team
Solo
Status
v0.8 on npm
Stack
TypeScript, MCP (stdio), Lighthouse, pa11y, ESLint, Semgrep, PageSpeed Insights

Overview

nfunc-mcp is an open-source Model Context Protocol server that gives an AI assistant a full non-functional quality check of a web page. It runs performance, accessibility, code quality and security scanners, then returns one prioritized defect list with a release verdict.

Challenge

Every scanner speaks its own dialect. Lighthouse gives scores, pa11y gives WCAG codes, Semgrep gives rule IDs. Someone still has to translate five reports into one answer to the question a release manager actually asks: can we ship this?

Approach

  • Wrapped Lighthouse, pa11y, ESLint, Semgrep and PageSpeed Insights behind a single stdio MCP server in TypeScript.
  • Normalized every finding into one defect shape and ranked it P1, P2 or P3 by user and business impact.
  • Added a release verdict so the output ends in a decision, not a dashboard.
  • Kept lab data and field data separate, since they often disagree.

Results

Published to npm as nfunc-mcp under the ISC licence, with the source on GitHub. Launched with a LinkedIn post and article, with follow-ups planned on conformance and lab-versus-field data.

Open source · Playwright · 2026

Notary-POM

$ notary-pom crawl -c demo.config.js
  1 pages, 123 elements, 4 unresolved.

  strategy                       count
  role ........................... 56
  css (positional, fragile) ...... 39
  testId ......................... 24

from the README walkthrough against
scrapingcourse.com/ecommerce
Role
Designer & builder
Team
Solo
Status
v0.1 on GitHub
Stack
TypeScript, Playwright, CLI with a thin MCP wrapper

Overview

Notary-POM opens a real browser, waits for the page to stop moving, harvests every interactive element, and then tries a ladder of locator strategies against the running DOM until one provably resolves to the exact element it observed. What it cannot prove, it refuses to emit. You get page objects, a smoke spec that passes on first generation, and a checked-in JSON notebook recording every decision and every rejected candidate.

Challenge

Hand-writing page objects is slow, and brittle locators are the main source of flaky UI tests. Generators that skip verification just move the flakiness to day one.

Approach

  • Rank locator candidates and prefer roles and labels over CSS.
  • Verify every locator at generation time, before code is written.
  • Deterministic naming, with optional LLM refinement.
  • Generated base class plus a hand-owned subclass, so regeneration never overwrites your code.
  • Pass-through contextOptions (storageState, extraHTTPHeaders, httpCredentials) for authenticated pages later.

Status

Public on GitHub since September 2026 under the Apache-2.0 licence, at v0.1.0 and not yet published to npm. The CLI installs as notary-pom with the shorter alias npom, and crawl, generate, diff and build:pom are also available as npm scripts. diff classifies element and page drift by severity and carries a severity exit code, so a re-crawl reads as a diff of what changed on the site. Public storefronts work today; authenticated flows are next.

The project was called POMBuilder until the September rename; the MCP tool names still carry the old prefix.

Performance engineering · Client work at Orium

The 500s that weren’t the server

export const options = {
  scenarios: { join: {
    executor: 'shared-iterations',   // was: per-VU loops
    vus: 30,
  } },
};
const key = idempotencyKey(vu, iter);   // deterministic, no collisions
retry(req, { max: 3 });                 // bounded
check(res, { 'CREDIT confirmed': ... });  // gate before next step
Role
Performance test lead
Scale
30 virtual users, k6 cloud
Signal
49% HTTP 500 rate
Stack
k6, Grafana, Datadog

Overview

A cloud load test of a payment-backed audience-join flow came back with almost half of all requests failing with HTTP 500. On paper the service looked broken.

Challenge

A number like 49% gets escalated fast. Before anyone started tuning the service, the test itself needed to be proven trustworthy.

Approach

  • Traced the failures back to the harness: virtual users were colliding on shared state and retrying without limits.
  • Moved to a shared-iterations executor so work was split cleanly across users.
  • Generated deterministic idempotency keys per user and iteration.
  • Bounded retries, and added a CREDIT confirmation gate before each next step.

Results

The rewritten script removed the false failure signal, so the team could focus on real bottlenecks. More broadly, k6 work at Orium has delivered 20–30% latency improvements, with Grafana and Datadog dashboards adopted by client teams.

AI quality · 2026

Evaluating agentic systems

# promptfooconfig.yaml (excerpt)
tests:
  - vars: { question: "What is the refund window?" }
    assert:
      - type: llm-rubric
        value: "Answer matches the golden policy text"
      - type: contains
        value: "30 days"
illustrative example
Role
Quality engineer
Focus
Hallucination and tool-use checks
Method
Golden dataset, LLM-as-judge, string match
Stack
DeepEval, Promptfoo, LangChain, Arize Phoenix

Overview

Agentic systems fail differently from regular software. The same input can produce different output, so pass or fail needs a judge, not just an assertion.

Challenge

Catch confident wrong answers before users see them, without a human reading every response.

Approach

  • Built golden datasets of expected answers for the flows that matter most.
  • Combined LLM-as-judge scoring with deterministic string-match metrics.
  • Ran suites in DeepEval and Promptfoo, with LangChain and Arize Phoenix for tracing.
  • Worked in Claude Code daily to build and test agentic workflows, and folded AI into CI and test creation.

Results

Evals caught hallucinations by comparing responses against the golden set, turning a vague worry into a test that fails.