<?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: Panagiotis Nezis</title>
    <description>The latest articles on DEV Community by Panagiotis Nezis (@pnezis).</description>
    <link>https://dev.to/pnezis</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%2F4177755%2F5530f867-5b5a-4854-83a5-bb4707b7ac43.jpg</url>
      <title>DEV Community: Panagiotis Nezis</title>
      <link>https://dev.to/pnezis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pnezis"/>
    <language>en</language>
    <item>
      <title>I stopped answering "shall I proceed?" in the terminal</title>
      <dc:creator>Panagiotis Nezis</dc:creator>
      <pubDate>Sun, 11 Oct 2026 20:30:39 +0000</pubDate>
      <link>https://dev.to/pnezis/i-stopped-answering-shall-i-proceed-in-the-terminal-352k</link>
      <guid>https://dev.to/pnezis/i-stopped-answering-shall-i-proceed-in-the-terminal-352k</guid>
      <description>&lt;p&gt;Here is a moment I had several times a day for most of this year.&lt;/p&gt;

&lt;p&gt;Claude Code works for twenty minutes on a pull request review. It reads forty files and drafts eleven comments. Then, because I told it to check with me before posting anything, it stops and prints a summary that ends in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shall I proceed?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there it goes one of two ways. I type &lt;code&gt;y&lt;/code&gt;, because the summary looks fine and three other agents are waiting on me. Or I actually read it, find that comment seven is wrong and comment three is right but too harsh, and write a paragraph back: "drop the one about the cache, and soften the one about naming, the second one, no, the one in &lt;code&gt;tickets.ex&lt;/code&gt;".&lt;/p&gt;

&lt;p&gt;Both are bad. The first turns "human in the loop" into a formality. The second makes me the slowest part of a fast system, and the agent still has to guess which comment I meant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;Agents got very good at producing work. The part where a person decides whether that work is right barely changed: the work arrives flattened into a transcript, and the answer goes back through a one-bit channel. Anything richer than yes or no has to be written as prose, about items that have no address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every other craft solved this a long time ago with its own review tool.&lt;/strong&gt; Programmers have diffs with comments on lines. Editors have tracked changes. Designers pin notes on the artboard. Nobody reviews a logo in a diff tool, because the shape of the work decides what a useful review of it looks like.&lt;/p&gt;

&lt;p&gt;So I built that for agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pinrail
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pinrail.dev" rel="noopener noreferrer"&gt;Pinrail&lt;/a&gt; is a free, open-source desktop app (macOS and Linux, Apache 2.0) where every question an agent has for me lands in one inbox, and opens in a view made for that job.&lt;/p&gt;

&lt;p&gt;That PR review now shows up as the diff, with the agent's eleven proposed comments sitting on the lines they're about. I accept or reject each one, add a note where it needs rewording, and leave my own comment on a line it missed. Draft emails open as drafts I edit in place. Generated images open on a stage where I box the part to redo. I sign off in the work itself, not in a description of it.&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%2F07sn3h5bvh361jhstfpc.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%2F07sn3h5bvh361jhstfpc.png" alt="The code review view: a diff with the agent's proposed comments on their lines, each with its own verdict" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code isn't the only thing agents make. A round of generated images opens large on a stage, where I pick a favourite, keep or drop the rest, and box the spot that needs redrawing:&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%2F3a95rcoxwv6p2uzngy51.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%2F3a95rcoxwv6p2uzngy51.png" alt="The image view: candidate illustrations, one picked as the favourite, with a boxed region asking for a change" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And a design doc or a README opens rendered, with its outline, so I can comment on a section or a selected passage instead of quoting it back:&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%2F6mvs0ue47xgzpd76kos6.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%2F6mvs0ue47xgzpd76kos6.png" alt="The Markdown view: a rendered design doc with its outline, and comments on a diagram and on a section" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agent gets back
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most. The agent doesn't get "y", and it&lt;br&gt;
doesn't get my paragraph. It gets structured feedback, checked against a schema before it ever sees it. For that PR review, the response looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// what the agent gets back after I hand the review over &lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;decisions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Keep it, but less blunt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reject&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The duplicate check is intentional, we dedupe upstream&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lib/acme/tickets.ex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;side&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;new&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This also needs a test for the empty case&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;undecided&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It posts exactly what I approved, rewords what I asked it to, and learns why I rejected the rest. If I ask for changes, it comes back with a new round, and my earlier verdicts sit beside each item so I don't review everything again.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the agent asks
&lt;/h2&gt;

&lt;p&gt;The agents don't need to learn anything from me. Pinrail ships a skill, and connecting an agent in Settings installs it: Claude Code, Codex, Cursor, OpenCode and the others it finds get a global skill named &lt;code&gt;pinrail&lt;/code&gt; that tells them how to submit a review, which kinds of review exist, and how to read my decision. Any other agent can be given the same skill by hand.&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%2Fd04t64436vnotnpy7cac.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%2Fd04t64436vnotnpy7cac.png" alt="Settings, Agents: Claude Code and Cursor connected with the pinrail skill, Codex found and ready to connect" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So all I do is say &lt;em&gt;when&lt;/em&gt; I want to be asked, in whatever instructions the agent already follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Before posting review comments, ask me through Pinrail.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent picks the right kind of review, sends the work, waits until I decide, and carries on with my answer. If I discard a review, it's told to stop and why. Under the hood the skill runs one CLI command, so the same thing works from a CI job or a shell script.&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%2Fyyf5wr6upf78gqso5pht.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%2Fyyf5wr6upf78gqso5pht.png" alt="The inbox: reviews waiting from different agents and projects" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a view for your own job
&lt;/h2&gt;

&lt;p&gt;The views that come with the app cover lists, questions, code review,&lt;br&gt;
images and Markdown docs. But the view that helps most is the one for&lt;br&gt;
&lt;em&gt;your&lt;/em&gt; decision, and adding one is trivial.&lt;/p&gt;

&lt;p&gt;Here's a real example. I was making a promo video for Pinrail, and I&lt;br&gt;
wanted to give the agent feedback the way I'd give it to an editor: at this moment, over this stretch, on this part of the frame, or about the sound. No review tool I had did that for an agent. So I asked the agent to build a plugin for it, and it did. The next cut opened like this:&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%2F82descunoow7ufv2teyg.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%2F82descunoow7ufv2teyg.png" alt="The video plugin: the promo's opening on a stage, with scenes, picture and sound on a timeline, and comment and verdict controls" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I watched it, pinned comments to moments and to areas of the frame, asked for changes, and the agent got back a list of timestamped notes it could act on, scene by scene.&lt;/p&gt;

&lt;p&gt;That works because a plugin is small. &lt;code&gt;pinrail plugins new&lt;/code&gt; writes a&lt;br&gt;
folder that already runs, and the parts that matter are a manifest (with a sentence telling agents when to use it), a schema for what the agent sends, a schema for what comes back, and one HTML page. The page is ordinary JavaScript against a small SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Pinrail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nf"&gt;onInit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// the hand-over button, or Cmd/Ctrl+Enter, asks for the decision&lt;/span&gt;
  &lt;span class="nf"&gt;onCollect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;comments&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;--link&lt;/code&gt; the folder is served live, so when the view gets in your way ("let me comment on the sound too", "group these by owner") you tell the agent and the next review opens in the changed view. The schemas keep both sides honest while the view keeps changing, and every plugin runs in a sandboxed frame with no network access, so a view your agent wrote an hour ago can't reach anything it shouldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It runs entirely on your machine. The server listens on loopback only, and there's no account or cloud service.&lt;/li&gt;
&lt;li&gt;Views don't rewrite themselves. You still start that loop by saying what slowed you down; Pinrail just makes acting on it cheap.&lt;/li&gt;
&lt;li&gt;It's early. macOS and Linux builds are out (dmg, AppImage, .deb, .rpm), Windows isn't yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote the longer argument for why this step deserves real design here:&lt;br&gt;
&lt;a href="https://pinrail.dev/blog/we-deserve-a-better-agent-human-interaction/" rel="noopener noreferrer"&gt;We deserve a better agent-human interaction&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The code is at &lt;a href="https://github.com/forgeplane/pinrail" rel="noopener noreferrer"&gt;github.com/forgeplane/pinrail&lt;/a&gt;, and the website and docs are at &lt;a href="https://pinrail.dev" rel="noopener noreferrer"&gt;pinrail.dev&lt;/a&gt;. I'd really like to hear where it doesn't fit how you work with agents, and what view you'd build first.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
