Skip to content
View abhishekKokadwar's full-sized avatar

Highlights

  • Pro

Organizations

@kubeflow

Block or report abhishekKokadwar

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
abhishekKokadwar/README.md
abhishek kokadwar. data pipelines, backend, the boundaries between systems

Portfolio LinkedIn Email PyPI Medium


Resume


Hi, I'm Abhishek.

I actually started out building web apps, mostly because you can see what you built right away. But a couple of internships in, I noticed the part I actually cared about had quietly moved somewhere else. Not the page itself, but the schema underneath it, and how many round trips it took just to fill in a form.

So these days I spend most of my time on two things: data in motion, and trust boundaries. Basically the two places where a system is most likely to be confidently wrong without anyone noticing. A dashboard that renders perfectly off a stale aggregate. A tool server that swears it only needs to read one file.

The habit I keep trying to build is measuring things instead of assuming them. Anyone can write "real-time" in a readme. It's a lot harder to say what your watermark actually is, what happens when a packet shows up four minutes late, or what your number looks like when you go back and actually check it.

Experience

Two internships, remote, sole developer on both. Both shipped to a live domain — which is a different kind of pressure than a repo nobody deploys.

HiGigAi
Software Developer Intern
Jul 2026 – Aug 2026 · remote

next.js · sanity cms
cloudinary · vercel

↗ tridentpublicschool.com

A one-month engagement that had to outlive me. Five branch sites on five subdomains from a single Next.js codebase, so onboarding a sixth branch is content entry rather than a deploy.

25+ Sanity schemas with the Studio scoped through Structure Builder — the part that actually mattered: five branch admins manage 15+ page types with zero developer involvement, including mine.

Recurring infra came to $0/month. A planned Supabase tier replaced with Sanity-native forms and Cloudinary media, ISR plus webhooks for redeploy-free publishing. The cheapest thing to operate is the thing you didn't provision.

Trionix Technologies
Software Developer Intern
Jul 2025 – Sep 2025 · remote

next.js · postgresql
firebase · row-level security

↗ saaro-creations

Architected the Vyapar Pragati admin platform: 6 backend modules, 500+ users, real-time Firestore messaging in place of manual polling.

Normalized the PostgreSQL schema with Row-Level Security, so tenant isolation is a database guarantee rather than a WHERE clause somebody has to remember. Eliminated the N+1 queries that were doubling DB round-trips on SSR routes.

First time a design decision of mine had users attached to it. That's the part that stuck.

Currently building

CIDRA — CI debugging and repair agent

python · langgraph · claude api · docker · pydantic · repo →

A LangGraph pipeline (20 nodes) that reads a failing GitHub Actions run, works out why, and then — the part that matters — reproduces the failure in a network-isolated Docker container and proposes a fix only after it passes there with no other test breaking. A static audit gate refuses patches that make a test pass by cheating: deleted or skipped tests, weakened asserts, deleted or swallowed errors.

Measured on 40 real bugs from BugsInPy with a small model (claude-haiku-4-5, $0.65 for the whole run): 32/40 diagnosed correctly, all 16 out-of-scope bugs declined, 4 of 24 fixable bugs fixed. Every fix it calls verified is judged afterwards by held-out tests the model never saw — and 1 of those 4 was still wrong (4 of 9 in the run before, which is what drove the audit rules). That number is the one I care about: an agent that confidently proposes a broken fix is worse than one that says it doesn't know. results and method →

Shipped

GridPulse — real-time campus energy monitoring

kafka · spark · duckdb · delta lake · next.js · live → · repo →

Telemetry from 42 simulated sub-meters streamed through Kafka into Spark 5-minute windows, with PostgreSQL for the hot path and Delta Lake for history.

The part worth defending is what happens after the aggregate lands. Anomalies are flagged by Isolation Forest crossed with a z-score, and 24-hour load is forecast at 11.5% MAPE — accurate enough to fire a peak-shaving alert before the peak, which is the only time such an alert is worth anything.

Meters into Kafka into Spark Structured Streaming, then forking into a hot path to Postgres and a cold path to date-partitioned storage, with a dashboard reading the hot path.

A 5-minute sliding window with a 1-minute slide and a 2-minute event-time watermark, because sensor packets do not arrive in the order they were measured and pretending otherwise gives you clean-looking numbers that are wrong. The storage split is the design: freshness is bought with batch size, history with partitioning, and neither pays for the other.


MCP Zero-Trust Gateway — kernel confinement for agent tools

python · fastapi · seccomp-bpf · landlock · docker · PyPI → · repo → · evaluation →

An MCP tool server describes its own capabilities. That description is a claim, not a fact, and the gateway treats it that way: declare, verify, confine.

Declared capabilities compared against syscalls observed under strace in a locked-down container, compiled into a per-tool seccomp-BPF filter that denies anything outside the declaration at the kernel boundary.

Each server is profiled under strace in a --cap-drop ALL --read-only container, the observed syscalls are checked against what the server declared, and the verified result is compiled into a per-tool seccomp-BPF filter. Anything outside the declaration is denied at the kernel boundary, not by application code that can be talked out of it. Provenance gating on tool-call arguments and per-call manifest re-attestation close CVE-2025-54136.

The part I'd defend in an interview isn't the enforcement, it's the evaluation. A 7-corpus, 583-row harness that separates detection from containment, because a gateway that notices an attack and doesn't stop it deserves a different number than one that stops it. 84.6% runtime defence, 100% containment, 87.8% on MCPTox.


Trinetra — parking enforcement intelligence, Bengaluru

python · fastapi · xgboost · h3 · next.js · live → · repo →

112K parking violations clustered into 1,196 H3 hotspots, each ranked with a 0–100 congestion-risk score, then forecast a week ahead with XGBoost at 0.80 Precision@10 across 53 police stations.

Most of the work was in the join, not the model. Violation records, geospatial cells and time-of-day buckets have to line up before anything downstream means much — and the discipline is resisting the urge to read a hotspot into what is really just a place with more reporting. SHAP reason chips sit next to each prediction so an officer can see why a cell ranked high, and greedy routing turns the ranking into patrol routes for N units. The finding I liked most wasn't a prediction at all: a 5.5% afternoon enforcement blind spot city-wide, visible only once the data was honest.

Top 5% at the Flipkart Gridlock hackathon.


RTI Copilot — right-to-information assistant

next.js · llm api · vercel · live → · repo →

An RTI filed at the wrong ministry doesn't get rejected — it gets transferred, and the statutory clock starts over. That single detail is the product: route the request correctly the first time, or the citizen silently loses a month.

So it routes grievances to the right ministry through an LLM against a curated directory, then rewrites the complaint as a record request — the form an office is legally obliged to answer, rather than the form it can file away. Appeals draft themselves when a deadline passes, and the deadline alert lands by email before it does.


SmartReview — domain-adapted sentiment model

pytorch · huggingface transformers · model card →

DistilRoBERTa domain-adapted by masked-language-modelling over 61.5K phone reviews, then fine-tuned for 3-class sentiment — all of it on a single 4GB GPU, which shaped every decision about batch size and sequence length.

88.2% accuracy and 94.9% positive-class F1 on 8.4K held-out reviews, at roughly 50ms per review. The two-stage approach is the point: adapting the encoder to the vocabulary before touching the classification head is what a general-purpose sentiment model doesn't get you.

DSA

The most consistent thing I do — 306 active days, and the reason a cost-per-operation instinct shows up in everything above.

859 solved, LeetCode contest rating 1640, 29 contests, 273 easy / 399 medium / 55 hard

across LeetCode, GeeksforGeeks, Code360 (4x monthly topper) and CodeChef · rating and difficulty split fetched live · totals tracked on Codolio

Open source

Merged upstream pull requests, issues closed, the repos they landed in, and the most recent merges. Regenerated from the GitHub API.

Merged upstream across Kubeflow and Karmada, and a Kubeflow org member since September 2026. Small in line count, mostly; the interesting part is that each one was a disagreement between two pieces of a system that each looked correct alone.

kubeflow/trainer #3960
validation read live state, reconciliation read a snapshot

ValidateObjects always fetched the live TrainingRuntime, while NewObjects reconciles from the per-TrainJob snapshot introduced by KEP-2599. So editing a runtime retroactively broke validation for TrainJobs already reconciled against the old one: remove a volumeMount and resuming a paused job is rejected, even though reconciliation would have used the still-valid snapshot. Delete the runtime — now legal, since KEP-2599 dropped the finalizers — and the job is stuck permanently, reconciling fine but never passing admission. Fixed by resolving updates from the snapshot, falling back to live only for pre-snapshot jobs.

kubeflow/trainer #4088
the error path panicked before it could report the error

Reconcile handles an unresolvable runtimeRef by setting a Failed condition, then handed the runtime it had just failed to find to setTrainJobStatus, which called a method on a nil interface. controller-runtime recovers the panic and requeues, so the manager stays up, but the unwind happens before the status patch: the condition never reaches the API server, every retry panics at the same point, and the TrainJob sits there with nothing in its status saying why. Admission normally rejects these, which is why it went unnoticed, but a webhook failurePolicy of Ignore lets one through. Now the status is derived only when a runtime was found, with a test for a branch that had none.

kubeflow/trainer #3918
validation stopped at the first job it decided to skip

The Volcano plugin checks each ReplicatedJob's priorityClassName, but returned early on a reserved class instead of continuing, so every job listed after it went unvalidated and a bad name surfaced as a scheduling failure rather than at admission. The skip turned out to be unnecessary as well: the reserved classes are ordinary PriorityClass objects and resolve like any other. Verifying that in KinD surfaced the larger bug. The controller's ClusterRole never granted read on priorityclasses, so the informer cache never synced and the webhook timed out for any TrainJob using a user-defined class.

kubeflow/pipelines #14753
page two began with the same item as page one, and the tests agreed

With pipelines stored in Kubernetes, paging through ListPipelines could repeat items, skip them, or hand back the first page again. The store sorted by the requested field only, and the cache builds its list by ranging over a Go map, so objects with equal sort values came back in a different order on every call. The default sort is a creation timestamp with one-second precision, which makes ties easy to hit. And if the object the page token named had been deleted in the meantime, the lookup found nothing and the page silently restarted from index 0. Both list functions now share one helper that breaks ties by UUID and resumes at the first item at or after the token's position, the way the SQL stores already did. Four existing assertions had expected the duplicate.

kubeflow/pipelines #14739
the fake said yes to everything, so the test never ran its own case

If a recurring run's ScheduledWorkflow was gone from the cluster (deleted with kubectl, or the database restored onto another cluster), disabling the run and archiving its experiment both returned Internal Server Error, every time, leaving the experiment stuck. An earlier fix had removed the existence check before the patch but left the error from Patch itself fatal. A missing ScheduledWorkflow cannot trigger runs, so disabling now logs the NotFound and proceeds; enabling still fails, as it should. The reason this survived: the fake client's Patch returned nil, nil no matter what, so TestDisableJob_CustomResourceNotFound passed without ever exercising the case in its name. The fake now answers like the real API server.

kubeflow/mcp-server #344
with no allowlist, any string was a namespace

A caller-supplied namespace was checked only against the namespace policy, and with no allowlist configured the policy accepts anything. So Bad_NS! reached the Kubernetes API, the agent was told the job was not found, and nothing in that answer suggested the namespace was the problem. A confirmed delete went as far as sending the DELETE. The format check now lives in the shared helper every namespaced tool already calls, rather than in seven tools separately, which also closed the same gap in three submission tools the issue had not listed. One parametrized test covers every tool with a namespace parameter and asserts no API call is made, so a new tool is picked up automatically.

Smaller fixes, one line each:

  • kubeflow/mcp-server · #237 and #296: blocked responses and confirm-gate previews no longer advertise a next step for an action that never ran · #236: runtime names validated in the platform runtime tools · #411 and #426: an unknown persona or a broken policy file now stops the server with a one-line error instead of a traceback
  • Windows-only test failures · mcp-server #290: tests that slept 60 ms and trusted a 15.6 ms clock to measure it · #324: a test that built a fake home and read the real one · trainer #4191: a "stale manifests" failure that was CRLF at checkout
  • karmada-io/dashboard · #700: TypeScript strictness across the member-cluster services · #702: a shebang on the wrong line, so the i18n CLI could not run

Also contributing through GSSoC, and a published inference model on HuggingFace Hub. See all merged PRs.

Stack

Python SQL C++ TypeScript Bash

Kafka Spark PostgreSQL Docker Linux AWS

Next.js FastAPI Sanity Firebase LangChain HuggingFace

Lately

GitHub contributions, commits, merged PRs, public repos and stars, with a language share bar



contribution streak



contribution snake



Integrated Dual Degree (B.Tech IT + MBA) · IIITM Gwalior · graduating 2028


if something here looks wrong, it probably is. tell me

Pinned Loading

  1. campusSafe campusSafe Public

  2. gridlock gridlock Public

    Jupyter Notebook 1

  3. NitVision NitVision Public

    Jupyter Notebook

  4. CIDRA CIDRA Public

    Continuous Integration Debugging and Repair Agent

    Python

  5. GridPulse GridPulse Public

    Python

  6. myportfolio myportfolio Public

    TypeScript