<?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: Balaji Thukuntala</title>
    <description>The latest articles on DEV Community by Balaji Thukuntala (@balajireddy1).</description>
    <link>https://dev.to/balajireddy1</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%2F3741104%2F3b94f01f-a3eb-415e-a2ed-297f2482cda0.jpeg</url>
      <title>DEV Community: Balaji Thukuntala</title>
      <link>https://dev.to/balajireddy1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/balajireddy1"/>
    <language>en</language>
    <item>
      <title>Nine people know this part of Kubernetes. It still depends on one.</title>
      <dc:creator>Balaji Thukuntala</dc:creator>
      <pubDate>Sun, 18 Oct 2026 15:28:09 +0000</pubDate>
      <link>https://dev.to/balajireddy1/nine-people-know-this-part-of-kubernetes-it-still-depends-on-one-4a5b</link>
      <guid>https://dev.to/balajireddy1/nine-people-know-this-part-of-kubernetes-it-still-depends-on-one-4a5b</guid>
      <description>&lt;p&gt;Every team has that one person. Every review waits for them, and when they say "I'll be offline next week", three people quietly panic.&lt;/p&gt;

&lt;p&gt;For Graph Hacks (WeMakeDevs x FalkorDB) I built something that finds these people in Kubernetes. It's called Understudy. Here's the story, mostly in memes.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/4ToHoa0cIWE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Every team has this moment
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fm783epf92i7pqf4y5s3e.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fm783epf92i7pqf4y5s3e.jpg" alt="This is fine meme: the team when the one person who knows the code says " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The lie we tell ourselves
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F01dh2qymzmefb00hwr0c.jpg" class="article-body-image-wrapper"&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%2Farticles%2F01dh2qymzmefb00hwr0c.jpg" alt="Buff Doge vs Cheems meme: the headcount says 9 know it and 6 approve it, but there's only 1 route between them" width="799" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a real part of Kubernetes, &lt;code&gt;pkg/kubelet/apis/config&lt;/code&gt;. Nine people know the code. Six people can approve changes. Sounds safe.&lt;/p&gt;

&lt;p&gt;Except every single path between those two groups goes through one person.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fy2tc0444l4b0jb974cfu.png" class="article-body-image-wrapper"&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%2Farticles%2Fy2tc0444l4b0jb974cfu.png" alt="The real Understudy stage for pkg/kubelet/apis/config: 9 know it, 6 approve it, understudy number 1" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So I stopped counting people
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fpr65fgra4v8wmbbpnv9x.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fpr65fgra4v8wmbbpnv9x.jpg" alt="Drake meme: no to counting people, yes to counting routes" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Understudy counts routes instead: someone who knows the code, connected to someone who can approve it, with nobody shared between routes. That count is the "understudy number". Here it's 1.&lt;/p&gt;

&lt;p&gt;FalkorDB does the counting with a built-in algorithm called max-flow, so it's an actual measurement, not a vibe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet contributor-25b5f
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fa0if9ukq58rj6upuwwpu.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fa0if9ukq58rj6upuwwpu.jpg" alt="Surprised Pikachu meme: every review goes through one person, that person takes a vacation, reviews stop" width="800" height="799"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone shows up as a pseudonym, so I don't know who this is. I just know they should never take a vacation.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I rehearsed them leaving
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fzeb3tirb9nvskxmvqaye.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fzeb3tirb9nvskxmvqaye.jpg" alt="Gru's plan meme: rehearse one person leaving, and 41 of 79 systems get weaker" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Understudy copies the whole graph, takes them off the copy, and checks what breaks. 41 of 79 parts of Kubernetes get weaker. The real data never changes.&lt;/p&gt;

&lt;p&gt;It also suggests the cheapest fix. Here, pairing one person who knows the code with one approver is enough to get a backup.&lt;/p&gt;

&lt;h2&gt;
  
  
  I added an AI agent. It's humble.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Ftl50uscav677zlgsh4fd.jpg" class="article-body-image-wrapper"&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%2Farticles%2Ftl50uscav677zlgsh4fd.jpg" alt="Two buttons meme: every AI agent choosing between making something up and saying " width="800" height="1210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can ask it questions in plain English. It can only answer from the graph, so when something isn't there, it presses the second button. Every answer also shows the queries it ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I argued with it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F1rfj0fo3dk2o87ghidoy.jpg" class="article-body-image-wrapper"&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%2Farticles%2F1rfj0fo3dk2o87ghidoy.jpg" alt="Woman yelling at cat meme: the answer check asks for a source, the agent says it's literally true" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every answer gets fact-checked against the graph before you see it. Here the agent was right, and the check was also right. I fixed it by making the tools say things in plain words, so the agent can quote them.&lt;/p&gt;

&lt;h2&gt;
  
  
  FalkorDB and I had one small disagreement
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F88y9k7lodtz2val4phg0.jpg" class="article-body-image-wrapper"&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%2Farticles%2F88y9k7lodtz2val4phg0.jpg" alt="Monkey puppet meme: networkx looking away when algo.maxFlow says the answer is 1" width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tested every number against networkx. With mixed capacities, max-flow came out low on 8 of 150 test graphs. With every capacity set to 1, they agreed every time. So everything is 1 now. Problem solved by not having the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  OK but does it actually work?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F20jered0totxpe48rqo4.jpg" class="article-body-image-wrapper"&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%2Farticles%2F20jered0totxpe48rqo4.jpg" alt="Waiting skeleton meme: me waiting for enough Kubernetes departures to prove my metric works" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I checked it against real people who left Kubernetes. Only 7 of 39 cases had enough data, and none of them hit a 1. So honestly, I can't prove it yet. The whole result, including what didn't work, is in the app anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It runs on a free server with a tenth of a CPU. Getting it to start in 30 seconds instead of 2 minutes was its own adventure.&lt;/p&gt;

&lt;p&gt;Live app: &lt;a href="https://understudy-u2qk.onrender.com" rel="noopener noreferrer"&gt;https://understudy-u2qk.onrender.com&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/BalajiReddy1" rel="noopener noreferrer"&gt;
        BalajiReddy1
      &lt;/a&gt; / &lt;a href="https://github.com/BalajiReddy1/understudy" rel="noopener noreferrer"&gt;
        understudy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      My Graph Hacks entry. Models Kubernetes as a company in FalkorDB and checks who could actually step in if someone left.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Understudy&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Understudy measures how many people a team can lose before nobody who approves changes to a system can reach anyone who knows its code. It models Kubernetes as a graph in FalkorDB, computes that number for every part of the codebase with max-flow, lets you rehearse a departure on a copy of the graph, and includes an agent that answers questions only from graph queries and shows every query it ran.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://understudy-u2qk.onrender.com" rel="nofollow noopener noreferrer"&gt;https://understudy-u2qk.onrender.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for Graph Hacks: Context for AI Agents (WeMakeDevs x FalkorDB), October 2026. Tracks: Company Brain, and Agents That Act on Connected Data.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/BalajiReddy1/understudy/docs/kubernetes.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FBalajiReddy1%2Funderstudy%2FHEAD%2Fdocs%2Fkubernetes.png" alt="The Kubernetes workspace: the call board, the agent with its query trace open, and the stage for pkg/kubelet/apis/config"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#why" rel="noopener noreferrer"&gt;Why&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#a-two-minute-tour" rel="noopener noreferrer"&gt;A two-minute tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#graph-model" rel="noopener noreferrer"&gt;Graph model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#queries-and-algorithms" rel="noopener noreferrer"&gt;Queries and algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#the-agent" rel="noopener noreferrer"&gt;The agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#using-it-from-claude-code-mcp" rel="noopener noreferrer"&gt;Using it from Claude Code (MCP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#does-the-number-predict-anything" rel="noopener noreferrer"&gt;Does the number predict anything?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#falkordb-issues-found" rel="noopener noreferrer"&gt;FalkorDB issues found&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#development" rel="noopener noreferrer"&gt;Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#project-layout" rel="noopener noreferrer"&gt;Project layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#limitations" rel="noopener noreferrer"&gt;Limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BalajiReddy1/understudy#ai-disclosure" rel="noopener noreferrer"&gt;AI disclosure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Counting the people who know a system makes it look safe…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/BalajiReddy1/understudy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;So, be honest. Does your team have a contributor-25b5f? Do they know? Tell me in the comments. Bonus points if it's you.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>ai</category>
      <category>falkordb</category>
      <category>graphhacks</category>
    </item>
  </channel>
</rss>
