<?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: 阿小卡卡</title>
    <description>The latest articles on DEV Community by 阿小卡卡 (@kakacheaper).</description>
    <link>https://dev.to/kakacheaper</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3936364%2Fadf9c7f4-62f5-488a-9498-a2385ddb340f.jpg</url>
      <title>DEV Community: 阿小卡卡</title>
      <link>https://dev.to/kakacheaper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kakacheaper"/>
    <language>en</language>
    <item>
      <title>I deleted 4080 lines and rebuilt from scratch. Here's why call graphs are wrong for AI-generated code.</title>
      <dc:creator>阿小卡卡</dc:creator>
      <pubDate>Sun, 17 May 2026 15:34:17 +0000</pubDate>
      <link>https://dev.to/kakacheaper/i-deleted-4080-lines-and-rebuilt-from-scratch-heres-why-call-graphs-are-wrong-for-ai-generated-1606</link>
      <guid>https://dev.to/kakacheaper/i-deleted-4080-lines-and-rebuilt-from-scratch-heres-why-call-graphs-are-wrong-for-ai-generated-1606</guid>
      <description>&lt;p&gt;AI writes 5000 lines in 5 minutes. I need 3 hours to review them.&lt;br&gt;
The code works. The tests pass. But I no longer understand my own project.&lt;/p&gt;

&lt;p&gt;I tried fixing this 3 times. Failed 3 times. Deleted 4080 lines along the way.&lt;br&gt;
Here's what finally worked.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: every code visualization tool you've ever tried is showing you the wrong layer. Call graphs, dependency maps, AST trees — all wrong. Here's why.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Attempt 1: Call graphs
&lt;/h2&gt;

&lt;p&gt;First instinct: visualize how functions call each other. Tools like &lt;a href="https://github.com/pahen/madge" rel="noopener noreferrer"&gt;Madge&lt;/a&gt; and &lt;a href="https://github.com/sverweij/dependency-cruiser" rel="noopener noreferrer"&gt;dependency-cruiser&lt;/a&gt; do this beautifully.&lt;/p&gt;

&lt;p&gt;The result was a hairball.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parseRequest() → validateInput() → fetchUser() → comparePassword() → ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each node was a function name. Each edge was a &lt;code&gt;call&lt;/code&gt;. Beautiful. Useless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: I didn't want to know which function calls which. I wanted to know &lt;strong&gt;what the project does for the user&lt;/strong&gt;. A call graph shows the &lt;em&gt;how&lt;/em&gt;, not the &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Imagine asking "What does scrambled eggs with tomatoes taste like?" and getting "&lt;code&gt;prepare()&lt;/code&gt; calls &lt;code&gt;slice()&lt;/code&gt; then &lt;code&gt;whisk()&lt;/code&gt;". That's a call graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt 2: AST + import maps
&lt;/h2&gt;

&lt;p&gt;OK, so call graphs are too granular. Let me zoom out — module-level dependencies, AST analysis, the whole tree.&lt;/p&gt;

&lt;p&gt;Tools I tried: ts-morph, PyCG, language servers.&lt;/p&gt;

&lt;p&gt;Result: a &lt;em&gt;prettier&lt;/em&gt; hairball. Now my nodes were files instead of functions, but the same fundamental problem — &lt;strong&gt;structure, not semantics&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I could see "auth/login.ts imports utils/jwt.ts" but that's not "the user logs in by submitting their password, the system verifies it, then signs a JWT".&lt;/p&gt;

&lt;p&gt;The first sentence is structure. The second is the actual &lt;em&gt;story&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt 3: UCG (Universal Code Graph)
&lt;/h2&gt;

&lt;p&gt;Now I got architectural. I designed a 5-layer system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Language adapter (TS, Python) → UCG IR (universal graph)
  → Framework plugins → AI semantic layer → Canvas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea: structure is truth, semantics is decoration. Build a precise call graph at the bottom, let AI add labels on top.&lt;/p&gt;

&lt;p&gt;I built it. It compiled. It rendered.&lt;/p&gt;

&lt;p&gt;It still showed the wrong thing.&lt;/p&gt;

&lt;p&gt;The semantic labels AI generated were like putting lipstick on the call graph. "src/graph/" got labeled "Canvas Rendering" — accurate but uninformative. "f-login" got labeled "User Authentication" — same thing the path already said.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real insight&lt;/strong&gt;: The structure of code (what functions call what) and the structure of features (what the project does for the user) are &lt;strong&gt;two different graphs&lt;/strong&gt;. They're not aligned. You can't get from one to the other by adding labels.&lt;/p&gt;

&lt;p&gt;I deleted 4080 lines of UCG code in one commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What finally worked: FCG (Feature &amp;amp; Flow Graph)
&lt;/h2&gt;

&lt;p&gt;The breakthrough was admitting AI doesn't need help finding the structure. AI &lt;strong&gt;already knows&lt;/strong&gt; what each feature does — it just wrote them. So I let AI describe features directly, in user terms:&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.amazonaws.com%2Fuploads%2Farticles%2Fsp6gr8gf2u0rg1pfsmp1.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.amazonaws.com%2Fuploads%2Farticles%2Fsp6gr8gf2u0rg1pfsmp1.png" alt="FCG overview: 6 epics arranged by user journey order, connected by semantic flow arrows" width="800" height="397"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Overview view — 6 epics laid out in user-journey order, semantic edges between them.&lt;/em&gt;&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="s2"&gt;"f-login"&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;"User Login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&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;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;"Receive credentials"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"input"&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;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;"Find user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data-read"&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;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;"Verify password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth"&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;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;"Issue token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compute"&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;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;"Return token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"output"&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;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;"Return auth failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&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;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"flow"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"issue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"conditional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password correct"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"conditional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password wrong"&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;span class="p"&gt;]&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;This is what I actually want to see when reviewing AI work. Not "function A calls function B". But "step 1 happens, then step 2, except when X then step 3".&lt;/p&gt;

&lt;p&gt;It's the &lt;em&gt;story&lt;/em&gt; of the feature.&lt;/p&gt;

&lt;p&gt;I called this format &lt;strong&gt;FCG (Feature &amp;amp; Flow Graph)&lt;/strong&gt; and built a viewer for it. AI writes the JSON during normal workflow (every code change → AI updates &lt;code&gt;features.json&lt;/code&gt;). I read the graph, not the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three principles that emerged
&lt;/h2&gt;

&lt;p&gt;After validating on two real projects (a 40-feature simulation engine and a hackathon submission), three rules crystallized:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Semantic control belongs to AI / &lt;code&gt;features.json&lt;/code&gt;&lt;/strong&gt; — naming, ordering, grouping. The frontend never infers semantics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual &amp;amp; interaction belongs to the frontend&lt;/strong&gt; — drag, zoom, theme, layout algorithms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When uncertain, let AI write it down explicitly&lt;/strong&gt; — no frontend heuristics. Schema gets richer, the canvas stays a pure consumer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These rules saved me from rebuilding it a fourth time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real example: the tool modeling itself
&lt;/h2&gt;

&lt;p&gt;Here's what convinced me FCG works:&lt;/p&gt;

&lt;p&gt;I had AI generate &lt;code&gt;features.json&lt;/code&gt; for &lt;strong&gt;CodeSee itself&lt;/strong&gt;. The graph shows install → scan → viewer → layout → sync as a clean user journey, with 22 features grouped under 6 epics, all the cross-feature relationships rendered as semantic edges.&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.amazonaws.com%2Fuploads%2Farticles%2Fsjl8zzqrrteranhkozip.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.amazonaws.com%2Fuploads%2Farticles%2Fsjl8zzqrrteranhkozip.png" alt="Features view: 22 features grouped under 6 epic containers" width="800" height="397"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Features view — drill down into any epic, see its features grouped in containers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A new contributor can now understand the project in 30 seconds by &lt;a href="https://Kaka-cheaper.github.io/codeSee/?example=codesee-en" rel="noopener noreferrer"&gt;opening the live demo&lt;/a&gt; — no need to read the code.&lt;/p&gt;

&lt;p&gt;Drill down further and you see the actual flow inside a single feature:&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.amazonaws.com%2Fuploads%2Farticles%2Fn3g8x19ttu151co5kdjo.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.amazonaws.com%2Fuploads%2Farticles%2Fn3g8x19ttu151co5kdjo.png" alt="Steps view: directed flow with async, conditional, and error branches" width="800" height="397"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Steps view — async (dashed animated), conditional (with condition labels), error branches all rendered with distinct visual language.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;If you're working with AI-generated code and feeling that same loss of ownership:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't try to make sense of the code structure&lt;/strong&gt;. The code is fine, you just can't keep up with the volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't try to summarize code with AI labels&lt;/strong&gt;. Wrong abstraction layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have AI describe what the code does for the user, in user terms&lt;/strong&gt;. Then you read the description.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part: AI is &lt;em&gt;already&lt;/em&gt; doing this work mentally when it generates code. It just doesn't usually write it down. CodeSee's prompts make it write it down.&lt;/p&gt;

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

&lt;p&gt;CodeSee is open source (MIT) and the viewer runs as a static site — no install needed:&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://Kaka-cheaper.github.io/codeSee/?example=codesee-en" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt; (modeling itself, drop your own &lt;code&gt;features.json&lt;/code&gt; to try)&lt;br&gt;
→ &lt;a href="https://github.com/Kaka-cheaper/codeSee" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Works with Cursor, Claude Code, Kiro, Copilot, Codex, Gemini CLI, and any AI IDE that reads &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I'm an independent developer building this in my spare time. If you give it a try, I'd love feedback — open an issue or find me on &lt;a href="https://linux.do/" rel="noopener noreferrer"&gt;LinuxDo&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's the worst code visualization tool you've used? What do you wish existed instead?&lt;/strong&gt; Drop a comment — I'm collecting pain points to drive the roadmap.&lt;/p&gt;

&lt;p&gt;Building this took three rebuilds and two real projects to validate. One stable schema came out of it. If it sounds useful: &lt;strong&gt;a star helps me know I'm onto something&lt;/strong&gt; — &lt;a href="https://github.com/Kaka-cheaper/codeSee" rel="noopener noreferrer"&gt;⭐ here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
