<?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: Eduard</title>
    <description>The latest articles on DEV Community by Eduard (@eduardj_67dc3f850).</description>
    <link>https://dev.to/eduardj_67dc3f850</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%2F3838524%2Fe9f8717d-938f-42fa-8eed-eefe60a05444.png</url>
      <title>DEV Community: Eduard</title>
      <link>https://dev.to/eduardj_67dc3f850</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eduardj_67dc3f850"/>
    <language>en</language>
    <item>
      <title>Building a Small Terminal Command Helper with an LLM</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Sun, 19 Jul 2026 18:27:16 +0000</pubDate>
      <link>https://dev.to/eduardj_67dc3f850/building-a-small-terminal-command-helper-with-an-llm-2bdm</link>
      <guid>https://dev.to/eduardj_67dc3f850/building-a-small-terminal-command-helper-with-an-llm-2bdm</guid>
      <description>&lt;p&gt;I regularly lose time to terminal muscle memory.&lt;/p&gt;

&lt;p&gt;I work across Windows and Unix-like shells, so I will remember the right command in the wrong environment, transpose a Git subcommand, or use a valid binary with an invalid subcommand. The fix is usually easy to find. The interruption is the costly part: stop, search, translate the answer back into the current shell, and try again.&lt;/p&gt;

&lt;p&gt;The idea is not new. &lt;a href="https://github.com/nvbn/thefuck" rel="noopener noreferrer"&gt;thefuck&lt;/a&gt; offers a very similar workflow for correcting failed commands. I wanted to keep that focused loop, make a few changes, and add an LLM so it could handle cases that need more than a rule-based correction. Terminal-integrated LLMs such as aichat also cover related ground, but I wanted a tool that does one thing well: fix commands in a seamless workflow powered by an LLM.&lt;/p&gt;

&lt;p&gt;I wanted a deliberately narrow tool: when a command fails, suggest the command I probably meant, let me inspect it, and run it only after confirmation.&lt;/p&gt;

&lt;p&gt;During a Fable promotion period, I used an LLM coding agent to see how far a well-scoped prompt could get me. With very little steering, it produced a usable Go prototype in roughly an hour.&lt;/p&gt;

&lt;p&gt;The project is now open source: &lt;a href="https://github.com/eduardsjermaks/nudge" rel="noopener noreferrer"&gt;nudge&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow I wanted
&lt;/h2&gt;

&lt;p&gt;The core interaction is intentionally small:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run a command as usual.&lt;/li&gt;
&lt;li&gt;If it fails, type &lt;code&gt;fix&lt;/code&gt; (or bare &lt;code&gt;nudge&lt;/code&gt;) to get a suggested correction.&lt;/li&gt;
&lt;li&gt;Review it, then press Enter to run, &lt;code&gt;e&lt;/code&gt; to edit it first, or &lt;code&gt;n&lt;/code&gt; to cancel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The cheapest case is a plain typo, which never reaches a model at all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS&amp;gt; git pshu
git: 'pshu' is not a git command. See 'git --help'.

PS&amp;gt; fix
`git pshu` isn't a valid command. Did you mean:
  → git push    (typo fix for `git pshu`)
Run it? [Enter = yes / n = no / e = edit]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;(typo fix for ...)&lt;/code&gt; label is the tool telling me it answered locally, in&lt;br&gt;
under 10 ms, without a network call.&lt;/p&gt;

&lt;p&gt;The cross-shell version of the same mistake is reaching for a binary that does&lt;br&gt;
not exist here. Because the binary is missing, the shell's command-not-found&lt;br&gt;
hook fires and I do not have to type anything at all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS&amp;gt; printenv
`printenv` isn't a valid command. Did you mean:
  → Get-ChildItem env:    (list all environment variables)
Run it? [Enter = yes / n = no / e = edit]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The case that actually motivated the tool is narrower: the binary exists, so no&lt;br&gt;
hook fires and no spell-checker helps — the invocation is just wrong. This is&lt;br&gt;
what bare &lt;code&gt;fix&lt;/code&gt; is for, since it reads the previous command and its exit code&lt;br&gt;
from shell history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS&amp;gt; dotnet install dotnet-ef
Could not execute because the specified command or file was not found.

PS&amp;gt; fix
`dotnet install dotnet-ef` isn't a valid command. Did you mean:
  → dotnet tool install --global dotnet-ef    (install dotnet-ef as a global tool)
Run it? [Enter = yes / n = no / e = edit]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also accepts an intent stated in plain words, which is the same loop with a&lt;br&gt;
different input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\repos&amp;gt; just create dir mynewproj and init repo there
`just create dir mynewproj and init repo there` isn't a valid command. Did you mean:
  → mkdir mynewproj; cd mynewproj; git init    (create directory, enter it, initialize git repo)
Run it? [Enter = yes / n = no / e = edit]

PS C:\repos\mynewproj&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prompt in that last line is the point: the &lt;code&gt;cd&lt;/code&gt; applied to my actual&lt;br&gt;
session. A suggestion that runs in a child process would have left me back in&lt;br&gt;
&lt;code&gt;C:\repos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The important constraint was context switching. I did not want a general chat&lt;br&gt;
experience embedded in the terminal. I wanted one quick repair loop that stayed&lt;br&gt;
close to the failed command.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the agent produced
&lt;/h2&gt;

&lt;p&gt;The initial prototype was enough for my own daily use. The subsequent work turned it into something I could reasonably share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fast local matcher handles simple typos such as &lt;code&gt;git pshu&lt;/code&gt; without calling a model.&lt;/li&gt;
&lt;li&gt;Model-backed suggestions handle unknown commands, incorrect subcommands, and plain-English intent.&lt;/li&gt;
&lt;li&gt;Shell integration supports PowerShell, bash, zsh, and fish, so the correction can use the failed command and its exit code.&lt;/li&gt;
&lt;li&gt;Suggestions that can be destructive, such as &lt;code&gt;rm -rf&lt;/code&gt;, force-pushes, or hard resets, require an explicit typed &lt;code&gt;y&lt;/code&gt;; Enter is not enough.&lt;/li&gt;
&lt;li&gt;The tool can use either cloud providers or a local Ollama-compatible model, depending on quality, privacy, and cost requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The safety guard is the one place where the interaction deliberately gets&lt;br&gt;
slower. When the model flags a suggestion as destructive, the prompt changes&lt;br&gt;
and a reflexive Enter no longer accepts it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS&amp;gt; and uninstall dotnet-ef globally
`and uninstall dotnet-ef globally` isn't a valid command. Did you mean:
  → dotnet tool uninstall --global dotnet-ef    (uninstall dotnet-ef tool globally)
  ! destructive: model flagged this as destructive - requires an explicit 'y'
Run it? [y = yes / Enter or n = no / e = edit]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That split matters. A model call is useful when the problem requires interpretation; it is wasteful when the command is simply a typo. The tool should be instant and offline for the easy case, then use an LLM only when it earns its place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineering was after the first hour
&lt;/h2&gt;

&lt;p&gt;"The agent built it in an hour" is true for the first usable version, but incomplete as a development story.&lt;/p&gt;

&lt;p&gt;I spent additional time testing shell behavior across operating systems, improving installation and setup, and making unsafe actions harder to execute accidentally. In particular, shell state is tricky: a suggested &lt;code&gt;cd&lt;/code&gt; must affect the current shell session, not a child process that disappears immediately. Installation is also part of the product. A CLI is not really useful if it only works in the environment where it was generated.&lt;/p&gt;

&lt;p&gt;This is the pattern I find most useful with coding agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give the agent a narrow, observable problem.&lt;/li&gt;
&lt;li&gt;Get to a working vertical slice quickly.&lt;/li&gt;
&lt;li&gt;Treat the output as a starting point for testing, failure handling, setup, and review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent accelerated implementation. It did not remove the need to decide what should happen when a command is uncertain, destructive, shell-specific, or sent to a cloud model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did the session cost?
&lt;/h2&gt;

&lt;p&gt;One session reported the following token usage:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Cache write&lt;/th&gt;
&lt;th&gt;Cache read&lt;/th&gt;
&lt;th&gt;Fresh input&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;382,094&lt;/td&gt;
&lt;td&gt;418,616&lt;/td&gt;
&lt;td&gt;35,691,065&lt;/td&gt;
&lt;td&gt;551&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I used a Pro subscription during the promotion period, so I was not billed per token. Priced against the API rates for the model I was using, the same session would have cost roughly &lt;strong&gt;$63&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That number needs context, and the shape of it is more interesting than the total. Almost all of the input was cache reads, billed at a tenth of the normal input rate — $1 per million tokens against the model's $10 input rate, versus $50 per million for output. The same 35.7 million tokens at full input price would have put the session near $375 — caching is doing about a 6x reduction, and any estimate like this moves with the model, provider, and cache pricing.&lt;/p&gt;

&lt;p&gt;For a personal tool, $63 is not automatically cheap. But it is a useful comparison point: I got from a recurring friction point to a working tool much faster than I expect I would have by building every part from scratch. Whether that is worth it depends on how often the tool saves time and how much you value the experiment itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this approach works well
&lt;/h2&gt;

&lt;p&gt;LLM-assisted development feels most compelling when all of these are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The problem is concrete enough to demonstrate and test.&lt;/li&gt;
&lt;li&gt;The first version can be deliberately small.&lt;/li&gt;
&lt;li&gt;The developer can judge whether the result is correct.&lt;/li&gt;
&lt;li&gt;The cost of a wrong answer is controlled by review, confirmation, and tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A terminal command helper fits those conditions. It has clear inputs and outputs, and it can require confirmation before it executes anything risky.&lt;/p&gt;

&lt;p&gt;It would be a mistake to generalize this result into "one prompt builds production software." The useful lesson is smaller: agents can make small tools economically viable when the developer supplies a precise problem, defines the safety boundaries, and does the final engineering work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it or inspect the code
&lt;/h2&gt;

&lt;p&gt;The repository includes installation instructions, shell integration, privacy notes, supported providers, and development tests:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/eduardsjermaks/nudge" rel="noopener noreferrer"&gt;github.com/eduardsjermaks/nudge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am continuing to test it as a real terminal workflow.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>devtools</category>
      <category>go</category>
    </item>
    <item>
      <title>LLM Migration: Fable, Codex, and Claude Code on nopCommerce</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Mon, 06 Jul 2026 14:24:24 +0000</pubDate>
      <link>https://dev.to/eduardj_67dc3f850/llm-migration-fable-codex-and-claude-code-on-nopcommerce-p11</link>
      <guid>https://dev.to/eduardj_67dc3f850/llm-migration-fable-codex-and-claude-code-on-nopcommerce-p11</guid>
      <description>&lt;h1&gt;
  
  
  Switching to a Harder Migration Target
&lt;/h1&gt;

&lt;p&gt;The first comparison used &lt;strong&gt;eShopOnWeb&lt;/strong&gt;, which was useful for testing the workflow, but it is still a relatively moderate codebase.&lt;/p&gt;

&lt;p&gt;That makes it good for a first pass, but not ideal for stressing the parts that break during real migrations: hidden coupling, mixed concerns, runtime assumptions, and behavior spread across many layers.&lt;/p&gt;

&lt;p&gt;For the next step, I switched to &lt;strong&gt;nopCommerce&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At the same time, the model landscape also changed. New models became available, including &lt;strong&gt;Fable&lt;/strong&gt;, so this round focuses on a new comparison instead of repeating the exact same lineup.&lt;/p&gt;

&lt;p&gt;The goal stayed the same: measure how well different models can produce a reliable first-pass architectural orientation of an unfamiliar legacy system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why nopCommerce
&lt;/h2&gt;

&lt;p&gt;nopCommerce is a much better stress test for migration-oriented analysis than eShopOnWeb.&lt;/p&gt;

&lt;p&gt;It is a larger, older, more feature-dense ASP.NET application with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;public storefront flows&lt;/li&gt;
&lt;li&gt;a large admin area&lt;/li&gt;
&lt;li&gt;multiple database providers&lt;/li&gt;
&lt;li&gt;plugin-based extensions&lt;/li&gt;
&lt;li&gt;in-process scheduled tasks&lt;/li&gt;
&lt;li&gt;many integrations and configuration surfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because migration work usually gets blocked in operational details such as startup flow, scheduling, plugin loading, order processing, configuration writes, and cross-cutting infrastructure.&lt;/p&gt;

&lt;p&gt;In a codebase like this, a model has to do more than summarize folders. It has to follow execution paths and separate observed facts from plausible guesses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Experiment Setup
&lt;/h2&gt;

&lt;p&gt;I used the same overall idea as before: ask each model to generate a project-orientation document for the repository, then compare the outputs with a fixed AI-as-judge rubric.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generated orientation documents
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/nopCommerce/01/codex-readme-prompt.md" rel="noopener noreferrer"&gt;codex-readme-prompt.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/nopCommerce/01/responses/codex-readme-prompt-response.md" rel="noopener noreferrer"&gt;Codex (GPT-5.4) response&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/nopCommerce/01/make-readme-fable.md" rel="noopener noreferrer"&gt;make-readme-fable.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/nopCommerce/01/responses/fable-readme-response.md" rel="noopener noreferrer"&gt;Fable response&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/nopCommerce/01/make-readme-opus.md" rel="noopener noreferrer"&gt;make-readme-opus.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/nopCommerce/01/responses/opus-readme-response.md" rel="noopener noreferrer"&gt;Claude Code response&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These documents were then compared pairwise using the judge prompts under &lt;code&gt;ai-judge/nopCommerce/v1&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evaluation Rubric
&lt;/h2&gt;

&lt;p&gt;I kept the same rubric as in the earlier comparison:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Evidence Grounding&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structural Accuracy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency Mapping&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical Flow Identification&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration Insight Quality&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Epistemic Discipline&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signal-to-Noise Ratio&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Goal: compare quality of codebase understanding with less attention on style or verbosity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Prompt file&lt;/th&gt;
&lt;th&gt;Result file&lt;/th&gt;
&lt;th&gt;Document A&lt;/th&gt;
&lt;th&gt;Document B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/nopCommerce/v1/requests/fable-vs-codex-request.md" rel="noopener noreferrer"&gt;fable-vs-codex-request.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/nopCommerce/v1/results/fable-vs-codex-result.md" rel="noopener noreferrer"&gt;fable-vs-codex-result.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Fable&lt;/td&gt;
&lt;td&gt;Codex (GPT-5.4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/nopCommerce/v1/requests/fable-vs-opus-request.md" rel="noopener noreferrer"&gt;fable-vs-opus-request.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/nopCommerce/v1/results/fable-vs-opus-result.md" rel="noopener noreferrer"&gt;fable-vs-opus-result.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Fable&lt;/td&gt;
&lt;td&gt;Claude Code (Opus 4.8)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Run 1
&lt;/h2&gt;

&lt;p&gt;Fable vs Codex (GPT-5.4)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Fable&lt;/th&gt;
&lt;th&gt;Codex (GPT-5.4)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Evidence grounding&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural accuracy&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency mapping&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical flow&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration insight&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epistemic discipline&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signal / noise&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result: &lt;strong&gt;Fable produced the safer document for migration.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Codex (GPT-5.4) was still well grounded. According to the judge, the document stayed closer to extraction than architectural synthesis.&lt;/p&gt;

&lt;p&gt;The judge explicitly described the difference like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fable acted as an architectural synthesizer&lt;/li&gt;
&lt;li&gt;Codex (GPT-5.4) read more like a search-result aggregator or static extractor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, that meant Fable was better at turning code facts into migration-relevant constraints.&lt;/p&gt;

&lt;p&gt;The most important examples were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recognizing that the order flow contains deployment-relevant concurrency assumptions&lt;/li&gt;
&lt;li&gt;identifying the scheduler’s self-HTTP loopback behavior as an architectural constraint&lt;/li&gt;
&lt;li&gt;distinguishing facts, inferences, and unknowns in a disciplined way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Codex (GPT-5.4) still found many correct details, but the result was noisier and less decisive when moving from structure to interpretation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run 2
&lt;/h2&gt;

&lt;p&gt;Fable vs Claude Code (Opus 4.8)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Fable&lt;/th&gt;
&lt;th&gt;Claude Code (Opus 4.8)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Evidence grounding&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural accuracy&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency mapping&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical flow&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration insight&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epistemic discipline&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signal / noise&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result: &lt;strong&gt;Fable again produced the safer migration document.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest issues were structural and behavioral.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It treated the order-placement lock like a distributed lock even though the stronger document identified it as an OS mutex with sync-over-async behavior.&lt;/li&gt;
&lt;li&gt;It missed the self-HTTP boundary in scheduled task execution and described the task runner more like a normal in-process thread scheduler.&lt;/li&gt;
&lt;li&gt;It became less reliable around configuration artifacts and legacy settings files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These mistakes matter because they hide operational constraints that usually show up late in migration work.&lt;/p&gt;

&lt;p&gt;The stronger Fable document stayed grounded in the dangerous details: mutex-based duplicate-order protection, sync-over-async behavior, and the scheduler's dependency on HTTP calls back into the same application.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Changed from the First Comparison
&lt;/h2&gt;

&lt;p&gt;With eShopOnWeb, the main differences were often about how grounded and careful the documents were.&lt;/p&gt;

&lt;p&gt;With nopCommerce, that baseline became less important because all three outputs were already reasonably grounded. The separation happened later, when the models had to interpret behavior in a much more complex system.&lt;/p&gt;

&lt;p&gt;The move from eShopOnWeb to nopCommerce made the comparison more practical.&lt;/p&gt;

&lt;p&gt;At that point, it was less about which model could summarize the repository and more about which one could identify the parts most likely to break during migration.&lt;/p&gt;

&lt;p&gt;In this round, Fable did that more reliably.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key conclusions
&lt;/h2&gt;

&lt;p&gt;Findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fable&lt;/strong&gt; was the strongest model in this nopCommerce round&lt;/li&gt;
&lt;li&gt;Its advantage came mostly from better architectural synthesis and interpretation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex (GPT-5.4)&lt;/strong&gt; remained grounded, but the document was noisier and weaker at converting evidence into migration guidance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code (Opus 4.8)&lt;/strong&gt; missed several migration-relevant implementation details, especially around locking and scheduled task execution&lt;/li&gt;
&lt;li&gt;Model rankings can change when the project changes; results from a moderate codebase do not automatically transfer to a more complex monolith&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The broader takeaway is that project-orientation tasks should be judged by how useful they are for understanding real system behavior. Module lists and file citations still matter. They just do not cover enough by themselves.&lt;/p&gt;

&lt;p&gt;For migration work, the higher-value signal is whether the model can identify the behaviors that would actually break when the system is moved: process assumptions, state transitions, scheduling tricks, and control-flow hotspots.&lt;/p&gt;

&lt;p&gt;That is where Fable stood out in this round.&lt;/p&gt;

&lt;p&gt;The next question is the practical one: whether this stronger initial orientation is enough to support actual migration steps, or whether the advantage disappears once code transformations begin.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>claude</category>
      <category>dotnet</category>
      <category>llm</category>
    </item>
    <item>
      <title>LLM-Assisted Codebase Analysis for Migration: Comparing Codex, Claude, and VS Code Agents</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Mon, 23 Mar 2026 06:38:15 +0000</pubDate>
      <link>https://dev.to/eduardj_67dc3f850/llm-assisted-codebase-analysis-for-migration-comparing-codex-claude-and-vs-code-agents-1f0</link>
      <guid>https://dev.to/eduardj_67dc3f850/llm-assisted-codebase-analysis-for-migration-comparing-codex-claude-and-vs-code-agents-1f0</guid>
      <description>&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;Most migrations fail before they start — because nobody actually knows what the system does.&lt;/p&gt;

&lt;p&gt;Legacy systems rarely fail because of syntax or frameworks. They fail because their behavior is undocumented and poorly understood. This lack of understanding becomes even more critical when development is done with agents.&lt;/p&gt;

&lt;p&gt;In this series, I explore how LLM tooling can assist in migrating existing systems. The focus is on cross-stack migration, where a system must be moved to a different technology stack due to platform, vendor, or organizational constraints. In these cases, the hardest part is usually incomplete knowledge of the current system.&lt;/p&gt;

&lt;p&gt;Tools such as Copilot, Codex, Claude Code, and similar agents make it possible to explore a codebase interactively, summarize its structure, and trace important flows instead of relying only on manual reverse engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shift in Engineering Work with LLM Agents
&lt;/h2&gt;

&lt;p&gt;With strong LLM agents, the distribution of engineering effort starts to shift.&lt;br&gt;&lt;br&gt;
Less time is spent writing code, while more time moves to validation, specs, design, and review.&lt;/p&gt;

&lt;p&gt;Agents can generate code, but they cannot guarantee domain correctness — the system may pass tests while still violating business rules or real-world constraints.&lt;br&gt;&lt;br&gt;
Most real bugs are not syntax errors, but misunderstood requirements, missing system context, and edge cases.&lt;/p&gt;

&lt;p&gt;Even with modern agents, some types of changes remain difficult: large refactors, multi-service changes, and long-term evolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative: Using the Full Context Window
&lt;/h2&gt;

&lt;p&gt;Putting the entire codebase into the LLM context may seem attractive, but it works poorly for non-trivial projects. For larger systems, agentic workflows become necessary.&lt;/p&gt;

&lt;p&gt;The downside is not only cost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signal dilution&lt;/strong&gt; — tests, migrations, DTOs, generated files, and CSS can drown out the real architecture, and the model may miss important relationships because attention is spread too thin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less room for reasoning&lt;/strong&gt; — large context leaves less space for the actual question and the response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noise bias&lt;/strong&gt; — snapshots, migrations, and duplicated patterns can skew the model’s understanding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow iteration&lt;/strong&gt; — every follow-up requires resending a very large prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting the Scene
&lt;/h2&gt;

&lt;p&gt;For this series, we will use &lt;strong&gt;eShopOnWeb&lt;/strong&gt; as the legacy system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dotnet-architecture/eShopOnWeb" rel="noopener noreferrer"&gt;https://github.com/dotnet-architecture/eShopOnWeb&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Codebase Overview
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;~5.3k lines of production C# in &lt;code&gt;src&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;~12.5k total lines across C#, Razor, CSS, SCSS, and Bicep&lt;/li&gt;
&lt;li&gt;10 projects total: 6 production, 4 test&lt;/li&gt;
&lt;li&gt;~194 production classes and 16 interfaces&lt;/li&gt;
&lt;li&gt;~52 test cases&lt;/li&gt;
&lt;li&gt;8 public API endpoints&lt;/li&gt;
&lt;li&gt;4 MVC controllers&lt;/li&gt;
&lt;li&gt;16 Razor Page models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall complexity is &lt;strong&gt;moderate&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
The codebase is not large in raw size, but the architectural scope is non-trivial: it includes a web app, public API, Blazor admin UI, separated core/infrastructure layers, infrastructure-as-code, and multiple test projects.&lt;/p&gt;

&lt;p&gt;The repository is archived and no longer actively maintained, which makes it a good candidate for experimentation. The intent is not to criticize the original design, but to use a realistic codebase to evaluate different migration approaches.&lt;/p&gt;

&lt;p&gt;This is a hypothetical cross-stack scenario used to simulate real-world situations such as vendor strategy changes, platform standardization, or team skill constraints.&lt;/p&gt;

&lt;p&gt;During the series, different LLM-assisted workflows will be explored, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code Copilot (agent / auto mode)&lt;/li&gt;
&lt;li&gt;Codex&lt;/li&gt;
&lt;li&gt;Claude Code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Working Assumption
&lt;/h2&gt;

&lt;p&gt;LLMs can misunderstand intent, invent abstractions, or overlook important details.&lt;br&gt;&lt;br&gt;
If used blindly, they can make a migration less safe instead of safer.&lt;/p&gt;

&lt;p&gt;However, when used as analysis and exploration tools, they can help navigating unknown codebases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summarize structure and dependencies&lt;/li&gt;
&lt;li&gt;identify hidden assumptions&lt;/li&gt;
&lt;li&gt;experiment with refactoring options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The approach in this series is therefore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with an unknown system.&lt;/li&gt;
&lt;li&gt;Use LLM tools to explore and understand its structure and behavior.&lt;/li&gt;
&lt;li&gt;Gradually transform the system toward a new stack.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Experiment Setup
&lt;/h2&gt;

&lt;p&gt;To compare how different models analyze the same codebase, I used a fixed set of prompts and collected the responses produced by each model.&lt;/p&gt;

&lt;p&gt;Prompts were refined with ChatGPT to make them clear and optimized for the model.&lt;/p&gt;

&lt;p&gt;The table below shows the prompts used in the experiment and the corresponding results.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/1-codex-readme-prompt.md" rel="noopener noreferrer"&gt;1-codex-readme-prompt.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/responses/1-codex-readme-prompt-response.md" rel="noopener noreferrer"&gt;Codex (medium thinking) response&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/1-codex-readme-prompt.md" rel="noopener noreferrer"&gt;1-codex-readme-prompt.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/responses/1-codex-readme-prompt-response-extra.md" rel="noopener noreferrer"&gt;Codex (extra thinking) response&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/1-make-readme-opus.md" rel="noopener noreferrer"&gt;1-make-readme-opus.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/responses/1-opus-readme-response.md" rel="noopener noreferrer"&gt;Claude Code response&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/1-vscode-readme-prompt.md" rel="noopener noreferrer"&gt;1-vscode-readme-prompt.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/make-readme/responses/1-vscode-readme-response.md" rel="noopener noreferrer"&gt;VSCode response&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These responses are evaluated in the next section using an AI-as-Judge approach.&lt;/p&gt;

&lt;h1&gt;
  
  
  Using AI-as-Judge to Compare LLM Codebase Analysis
&lt;/h1&gt;

&lt;p&gt;When comparing outputs from different LLM tools, subjective reading is unreliable.&lt;br&gt;&lt;br&gt;
To make the comparison reproducible, I used an &lt;strong&gt;AI-as-judge approach with a fixed rubric&lt;/strong&gt;, where two generated documents were evaluated against the same criteria.&lt;/p&gt;

&lt;p&gt;The judge model used in all runs was &lt;strong&gt;Gemini 3 Pro&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Prompt file&lt;/th&gt;
&lt;th&gt;Result file&lt;/th&gt;
&lt;th&gt;Document A&lt;/th&gt;
&lt;th&gt;Document B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/1-ai-judge-prompt.md" rel="noopener noreferrer"&gt;1-ai-judge-prompt&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/results/1-ai-judge-result.md" rel="noopener noreferrer"&gt;1-ai-judge-prompt-result&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;td&gt;Claude Code (Opus 4.6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/1-ai-judge-vs-code-auto-vs-codex.md" rel="noopener noreferrer"&gt;1-ai-judge-vs-code-auto-vs-codex&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/results/1-ai-judge-vs-code-auto-vs-codex-result.md" rel="noopener noreferrer"&gt;1-ai-judge-vs-code-auto-vs-codex-result&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;td&gt;VSCode default auto mode (GPT-5.4, Opus 4.6, Sonnet 4.6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/1-ai-judge-gemini-prompt-extra.md" rel="noopener noreferrer"&gt;1-ai-judge-gemini-prompt-extra&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eduardsjermaks/articles/blob/main/articles/01-LLM-SDD-Migration/prompts/ai-judge/1-ai-judge-gemini-prompt-extra.md" rel="noopener noreferrer"&gt;1-ai-judge-gemini-prompt-extra-result&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;td&gt;Codex extra thinking (GPT-5.4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Evaluation Rubric (Score 0–5 per category)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Evidence Grounding:&lt;/strong&gt; Does the document cite specific modules, files, or patterns rather than vague generalities?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structural Accuracy:&lt;/strong&gt; Is the internal logic consistent? Do the described components actually fit together logically?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Mapping:&lt;/strong&gt; How well does it identify external integrations, internal coupling, and third-party libraries?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical Flow Identification:&lt;/strong&gt; Does it map the "Happy Path" of data through the system (Entry point -&amp;gt; Logic -&amp;gt; Storage)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration Insight Quality:&lt;/strong&gt; Does it identify technical debt, "gotchas," legacy patterns, or risks that would impact a migration?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Epistemic Discipline:&lt;/strong&gt; How does it handle uncertainty? Does it clearly distinguish between known facts ("The system does X") and assumptions ("The system appears to do X")?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal-to-Noise Ratio:&lt;/strong&gt; Is the document concise and information-dense, or is it filled with filler?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Goal: compare &lt;strong&gt;quality of codebase understanding&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Run 1
&lt;/h2&gt;

&lt;p&gt;Codex medium thinking (GPT-5.4) vs Claude Code (Opus 4.6) &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Codex&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Evidence grounding&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural accuracy&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency mapping&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical flow&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration insight&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epistemic discipline&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signal / noise&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result: Codex medium produced more precise and grounded codebase analysis.&lt;/p&gt;

&lt;p&gt;Claude Code produced very good tables and correctly detected the &lt;code&gt;ApplicationCore → BlazorShared&lt;/code&gt; dependency, calling it a domain-layer contamination hotspot, which is a meaningful architectural finding. Codex also detected reference &lt;code&gt;ApplicationCore → BlazorShared&lt;/code&gt;, however it has not identified it as a hotspot.&lt;/p&gt;

&lt;p&gt;However, it lost points in structural accuracy due to inferred runtime details.&lt;br&gt;&lt;br&gt;
Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Web — Single ASP.NET Core process hosting: MVC controllers, Razor Pages, Blazor Server circuit, and serving the BlazorAdmin WASM bundle."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This mixes Blazor Server runtime with static WASM hosting and was not fully grounded in the code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run 2
&lt;/h2&gt;

&lt;p&gt;Codex medium thinking (GPT-5.4) vs VSCode default auto mode (GPT-5.4, Opus 4.6, Sonnet 4.6)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Codex&lt;/th&gt;
&lt;th&gt;VSCode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Evidence grounding&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural accuracy&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency mapping&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical flow&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration insight&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epistemic discipline&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signal / noise&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result: Codex medium produced more grounded analysis with fewer assumptions.&lt;/p&gt;

&lt;p&gt;VSCode default auto mode often stopped at the first layer instead of tracing real execution paths.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Failure modes: Unknown (no explicit exception handling in this page model)..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Failure modes were left unresolved instead of following the call chain.&lt;/p&gt;

&lt;p&gt;Migration insight also contained generic or speculative statements without code evidence.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Cyclic dependencies — why risky: Unknown. evidence: Unknown."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Run 3
&lt;/h2&gt;

&lt;p&gt;Codex medium thinking (GPT-5.4) vs Codex extra thinking (GPT-5.4) &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Medium&lt;/th&gt;
&lt;th&gt;Extra thinking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Evidence grounding&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural accuracy&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency mapping&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical flow&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration insight&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epistemic discipline&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signal / noise&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result: Extra thinking produced deeper architectural analysis,&lt;br&gt;&lt;br&gt;
but improvements appeared only in some rubric categories.&lt;/p&gt;

&lt;p&gt;Extra thinking spent more effort analyzing failure modes and runtime behavior.&lt;/p&gt;

&lt;p&gt;It identified additional risks in caching, checkout flow, and environment-specific startup configuration.&lt;/p&gt;

&lt;p&gt;It also detected an issue in retry configuration where the retry logic may not be consistently applied across environments.&lt;/p&gt;

&lt;p&gt;It also pointed out a layering anomaly that medium thinking missed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Justification:&lt;/em&gt; It maps the standard internal dependencies well but fails to spot the architectural anomaly where the inner domain (&lt;code&gt;ApplicationCore&lt;/code&gt;) references a UI-adjacent library (&lt;code&gt;BlazorShared&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Possible explanation is that extra reasoning mainly helps with &lt;strong&gt;interpretation&lt;/strong&gt; instead of raw extraction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Runtime comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Codex medium&lt;/td&gt;
&lt;td&gt;~14 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex extra thinking&lt;/td&gt;
&lt;td&gt;~30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VSCode&lt;/td&gt;
&lt;td&gt;~5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Aggregated summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;td&gt;VSCode Auto&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Codex medium thinking (GPT-5.4)&lt;/td&gt;
&lt;td&gt;Codex extra thinking (GPT-5.4)&lt;/td&gt;
&lt;td&gt;Codex extra thinking (GPT-5.4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Key conclusions
&lt;/h2&gt;

&lt;p&gt;Findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codex medium thinking produced reliable, well-grounded analysis
&lt;/li&gt;
&lt;li&gt;Codex extra thinking improved architectural reasoning
&lt;/li&gt;
&lt;li&gt;Claude Code achieved similar results, with minor misinterpretations, but produced clear diagrams that made the structure easier to understand
&lt;/li&gt;
&lt;li&gt;VSCode agent mode introduced more assumptions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach provided a quick initial overview of the project and highlighted critical areas in a short time.&lt;br&gt;&lt;br&gt;
The next step is to see whether this level of understanding is sufficient for the migration itself, or whether important parts are still missing.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
