<?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: Utah Tech Labs</title>
    <description>The latest articles on DEV Community by Utah Tech Labs (utl).</description>
    <link>https://dev.to/utl</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%2Forganization%2Fprofile_image%2F15974%2F46418d18-76d6-4c1d-b795-3b1101ad151b.png</url>
      <title>DEV Community: Utah Tech Labs</title>
      <link>https://dev.to/utl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/utl"/>
    <language>en</language>
    <item>
      <title>How Our Technical PM Uses Claude Code to Review a PR, Fix It and Ship It</title>
      <dc:creator>Utah Tech Labs</dc:creator>
      <pubDate>Mon, 09 Nov 2026 12:05:47 +0000</pubDate>
      <link>https://dev.to/utl/how-our-technical-pm-uses-claude-code-to-review-a-pr-fix-it-and-ship-it-3h4c</link>
      <guid>https://dev.to/utl/how-our-technical-pm-uses-claude-code-to-review-a-pr-fix-it-and-ship-it-3h4c</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://www.utahtechlabs.com/blog/claude-code-pull-request-review-ci-cd" rel="noopener noreferrer"&gt;Utah Tech Labs blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A pull request can look clean and still be broken. The summary reads well, the commit list is short and GitHub says there are no conflicts with main. None of that tells you whether the code runs.&lt;/p&gt;

&lt;p&gt;Samprit, a Technical Project Manager at Utah Tech Labs, spends a large part of his week on exactly this gap. He reviews code from other developers, makes sure nothing breaks in any environment, checks that the tests pass, and then writes the deployment scripts that get the work into a target environment. In this 15-minute walkthrough he shows how Claude Code handles most of that loop, from a first local run to a published container image.&lt;/p&gt;

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

&lt;p&gt;The demo uses a simulated repository called golden bot, with three commits from a junior developer waiting to be merged into main. Here is what happens, step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Read the PR, then refuse to trust it
&lt;/h2&gt;

&lt;p&gt;The pull request has a detailed summary: new API endpoints, a changelog, and the number of tests the developer ran on his own machine. There are three commits and no conflicts with the base branch. On paper, it is ready.&lt;/p&gt;

&lt;p&gt;Samprit's point is that a review on paper is not enough. Tests that pass on one laptop prove little about the next environment. So instead of approving, he runs the branch himself, in isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: One prompt to build a local Docker test environment
&lt;/h2&gt;

&lt;p&gt;With the repository cloned, he opens a new Claude Code session. He uses the VS Code extension, though the CLI and the web version work the same way. He pastes the PR link and asks Claude Code to check every change listed in the PR by running it inside a Docker container on his machine. He also asks it to create a Dockerfile, a &lt;code&gt;.dockerignore&lt;/code&gt; and test files to validate the changes.&lt;/p&gt;

&lt;p&gt;Claude Code pulls the PR details, works out what the project needs to run, and writes the Docker files. The first run fails: the container runs as a non-root user, but the app hard-codes a path it can't write to. Claude Code finds the root cause, fixes it, and gets the container up and healthy. It then writes a pytest suite that gives each test its own temporary database.&lt;/p&gt;

&lt;p&gt;One habit Samprit stresses: watch what it does. Claude Code is changing files in your repository, and you should understand every change it makes on your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: What the review found
&lt;/h2&gt;

&lt;p&gt;With the app running, Claude Code tests each endpoint and gives a verdict on every one. Only two of the routes work the way the changelog says they should. It also flags two security issues: a SQL injection vulnerability, and a crash when input contains an apostrophe.&lt;/p&gt;

&lt;p&gt;This is the gap the PR summary hid. The developer reported passing tests, and the code still failed most of its own spec.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Post the findings back to the PR
&lt;/h2&gt;

&lt;p&gt;Next, Samprit asks Claude Code to post everything it found as a comment on the pull request. A minute later the comment appears on GitHub, grouped into critical, major and minor issues, plus a short list of what the changes got right. The developer gets specific, reproducible feedback instead of a one-line "doesn't work".&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Fix, re-run and re-test
&lt;/h2&gt;

&lt;p&gt;He then tells Claude Code to fix all the issues, re-run the project and test every endpoint again. It works through the list, rebuilds the container and repeats the tests. This time every endpoint returns the expected response and the test suite passes.&lt;/p&gt;

&lt;p&gt;Samprit is clear that in a real team, the developer who owns the PR should make these fixes. He does it himself here only to show the full loop in one video.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Generate the CI/CD pipeline
&lt;/h2&gt;

&lt;p&gt;The last prompt asks Claude Code to create a deployment pipeline that builds the image on merge, pushes it to GitHub Container Registry, and commits the files to the current branch. It writes a GitHub Actions workflow (&lt;code&gt;docker-publish.yml&lt;/code&gt;) and pushes two new commits.&lt;/p&gt;

&lt;p&gt;The CI run on the PR passes: the image builds and the health check succeeds. Samprit merges with a merge commit to keep the full commit history. The workflow then runs on main: lint and tests, image build, a smoke test, login to the registry, metadata extraction, and finally publishing the tagged image. Every stage goes green. Samprit wrote none of the workflow file himself; he only told Claude Code what it needed to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changes for a review
&lt;/h2&gt;

&lt;p&gt;The value here is not that Claude Code writes code. The review that actually matters, running the branch and testing it in a clean environment, usually gets skipped because setting it up takes longer than reading the diff. Claude Code removes that setup cost. Building the environment, testing the endpoints, writing up the feedback, fixing the bugs and writing the pipeline each became one plain-English instruction.&lt;/p&gt;

&lt;p&gt;Three things still need a person:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Judgment on the findings.&lt;/strong&gt; Claude Code flagged the SQL injection. A reviewer still decides what blocks a merge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ownership.&lt;/strong&gt; The fixes belong with the developer who wrote the code, not the reviewer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watching the session.&lt;/strong&gt; It edits files and runs containers on your machine. Read what it does.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one of many ways our team uses Claude Code day to day. It's the same approach we bring to client teams: engineers who work inside your codebase and set up AI-assisted workflows that hold up in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work with UTL
&lt;/h2&gt;

&lt;p&gt;Want this kind of review and deployment workflow running on your own codebase? &lt;a href="https://www.utahtechlabs.com/forward-deployed-engineering?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=claude-code-pr-review" rel="noopener noreferrer"&gt;See how UTL's forward-deployed engineers work with your team&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>docker</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
