<?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: Oluwaseun Jeremiah</title>
    <description>The latest articles on DEV Community by Oluwaseun Jeremiah (@jemiiahh).</description>
    <link>https://dev.to/jemiiahh</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%2F4229202%2F3f07b5ce-6c5e-4645-837d-4da7b817883f.png</url>
      <title>DEV Community: Oluwaseun Jeremiah</title>
      <link>https://dev.to/jemiiahh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jemiiahh"/>
    <language>en</language>
    <item>
      <title># 55 Comments, Four Pull Requests, One Maintainer: Building Issue Desk with Switch</title>
      <dc:creator>Oluwaseun Jeremiah</dc:creator>
      <pubDate>Thu, 05 Nov 2026 20:04:43 +0000</pubDate>
      <link>https://dev.to/jemiiahh/-55-comments-four-pull-requests-one-maintainer-building-issue-desk-with-switch-2akc</link>
      <guid>https://dev.to/jemiiahh/-55-comments-four-pull-requests-one-maintainer-building-issue-desk-with-switch-2akc</guid>
      <description>&lt;p&gt;The most revealing result in my Issue Desk rehearsal came from a pull request that passed its tests. The comparison report also flagged a network call, credential-reading code, and a blocked connection attempt.&lt;/p&gt;

&lt;p&gt;I had deliberately planted that behavior in a practice PR. I wanted to see whether the workflow would give a maintainer enough evidence to question a green test result. It did.&lt;/p&gt;

&lt;p&gt;That rehearsal brought together the two problems I built Issue Desk to address: the volume of work around an open-source issue, and the care required to decide what happens next.&lt;/p&gt;

&lt;p&gt;A busy issue can collect dozens of “assign me” comments, several proposed approaches, and competing implementations. Someone still has to read the plans, check whether they refer to real files, establish a direction, compare the code, and reply to contributors. Each task is manageable on its own. Together, they become a queue that one maintainer has to carry.&lt;/p&gt;

&lt;p&gt;For the WeMakeDevs &lt;strong&gt;Flip the Switch&lt;/strong&gt; hackathon, I built &lt;strong&gt;Issue Desk&lt;/strong&gt;: three Claude Code agents working through &lt;a href="https://github.com/sandbox-quantum/switch" rel="noopener noreferrer"&gt;Switch&lt;/a&gt; in Mattermost. They organize the evidence and prepare the replies. The maintainer chooses the direction and approves the configured GitHub write commands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FJemIIahh%2Fissue-desk%2Fmain%2Fassets%2Freadme.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FJemIIahh%2Fissue-desk%2Fmain%2Fassets%2Freadme.gif" alt="Issue Desk rehearsal showing scout's draft, the approval card, and the resulting GitHub comment" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Giving each agent a specific responsibility
&lt;/h2&gt;

&lt;p&gt;Issue Desk has three agents with deliberately narrow jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;desk&lt;/code&gt; coordinates the work.&lt;/strong&gt; It lists busy issues, opens a room for an issue when asked, and reads linked rooms to produce a digest of what arrived, what was decided, and what needs attention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;scout&lt;/code&gt; reads the claims.&lt;/strong&gt; It uses a scorecard to distinguish bare requests from concrete plans, identify near-duplicates, and check whether the files a plan names exist. It recommends promising approaches and drafts a direction comment for review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;bench&lt;/code&gt; compares the implementations.&lt;/strong&gt; It reads the agreed direction, runs competing PRs through an isolated test runner, and reports test results, files outside the agreed scope, and risk flags. After the maintainer chooses a PR, it drafts feedback for the other authors.&lt;/p&gt;

&lt;p&gt;The division follows the work: establish what contributors propose, agree on what should be built, then compare the implementations against that agreement. Each agent has a clear source of context and a clear stopping point.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real issue, copied into a private rehearsal
&lt;/h2&gt;

&lt;p&gt;I rehearsed on a private copy of &lt;a href="https://github.com/Flamki/stellarmind/issues/183" rel="noopener noreferrer"&gt;Flamki/stellarmind#183&lt;/a&gt;, with 55 claim comments. The mirror replaced usernames with labels such as &lt;code&gt;contributor-N&lt;/code&gt; and made mentions inert. All rehearsal comments went to my sandbox repository; nothing was posted to the original project.&lt;/p&gt;

&lt;p&gt;I then added four purpose-built practice PRs: a good implementation, a buggy implementation, one that wandered outside the intended scope, and the test-passing PR with suspicious network and credential behavior. These were fixtures I controlled, so the result demonstrates the workflow on known cases rather than a detection rate on unknown submissions.&lt;/p&gt;

&lt;p&gt;The interaction begins in the hub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@desk sweep
@desk open &amp;lt;issue-number&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;desk&lt;/code&gt; lists the issues drawing claims and PRs. When asked to open one, it calls Switch's &lt;code&gt;run_template&lt;/code&gt; to create an issue room, then &lt;code&gt;link_rooms&lt;/code&gt; to connect it to the hub. The template's kickoff wakes &lt;code&gt;scout&lt;/code&gt; without another prompt from me.&lt;/p&gt;

&lt;p&gt;In the rehearsal, the scorecard classified the 55 comments as &lt;strong&gt;42 bare requests, 12 plans, and one follow-up&lt;/strong&gt;. It also checked the file paths named in plans against the repository. That gave me something concrete to inspect before choosing an approach.&lt;/p&gt;

&lt;p&gt;Those labels are heuristics. A short comment says little about someone's ability, and naming an existing file does not establish that a proposal is correct. The scorecard helps focus the maintainer's reading; its recommendations still require judgment.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scout&lt;/code&gt; saves the full evidence as a Switch room document called &lt;code&gt;Scorecard&lt;/code&gt;. It saves the proposed direction separately as &lt;code&gt;Direction&lt;/code&gt;, which I can revise in chat before anything is posted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The handoff that makes the workflow useful
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Direction&lt;/code&gt; document is the connection between claim triage and PR comparison. It ends with three explicit fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scope: &amp;lt;allowed file patterns&amp;gt;
Install: &amp;lt;dependency installation command, or none&amp;gt;
Tests: &amp;lt;test command, including the expected new tests&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This detail came from a failure during development. The repository's default &lt;code&gt;npm test&lt;/code&gt; command would have passed the buggy practice PR because it did not exercise the relevant new test file. A successful command was giving an incomplete answer.&lt;/p&gt;

&lt;p&gt;Now &lt;code&gt;scout&lt;/code&gt; proposes the scope and commands from repository evidence, asks when something is uncertain, and updates the document when the maintainer changes the direction. &lt;code&gt;bench&lt;/code&gt; reads those settings and stops to ask if any are missing.&lt;/p&gt;

&lt;p&gt;The shared document keeps the agreement visible. I can correct it once and have the next agent use the revision, rather than reconstructing the context in another session.&lt;/p&gt;

&lt;p&gt;When I ask &lt;code&gt;@bench compare&lt;/code&gt;, the four practice PRs produce a report like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Practice PR&lt;/th&gt;
&lt;th&gt;Test result&lt;/th&gt;
&lt;th&gt;Other evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Intended implementation&lt;/td&gt;
&lt;td&gt;Passed&lt;/td&gt;
&lt;td&gt;No configured risk flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buggy implementation&lt;/td&gt;
&lt;td&gt;Failed&lt;/td&gt;
&lt;td&gt;Relevant tests exposed the bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broader rewrite&lt;/td&gt;
&lt;td&gt;Passed&lt;/td&gt;
&lt;td&gt;Files outside scope; dependency changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suspicious implementation&lt;/td&gt;
&lt;td&gt;Passed&lt;/td&gt;
&lt;td&gt;Network call, credential access, blocked connection attempt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table gives the maintainer several dimensions to assess together. A passing suite, an unexpected CI change, and a network attempt deserve different kinds of attention.&lt;/p&gt;

&lt;p&gt;The runner copies each PR into a scratch directory and uses Docker for execution. The test phase has no network access or host credentials, restricted resources, and only the scratch copy mounted. Dependency installation happens separately, with network access and install scripts disabled.&lt;/p&gt;

&lt;p&gt;That installation step still has limitations: PR-controlled dependency URLs and package-manager configuration can affect what gets fetched or executed. The risk checks are pattern-based, too. An unflagged PR still needs a diff review. The &lt;a href="https://github.com/JemIIahh/issue-desk#safety" rel="noopener noreferrer"&gt;README&lt;/a&gt; documents these boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a draft becomes an external action
&lt;/h2&gt;

&lt;p&gt;After reviewing &lt;code&gt;scout&lt;/code&gt;'s draft, I can ask it to post. The configured &lt;code&gt;gh issue comment&lt;/code&gt; command raises a Switch approval card in the same thread. A reply such as &lt;code&gt;A1 1&lt;/code&gt; allows that request once; &lt;code&gt;A1 3&lt;/code&gt; declines it.&lt;/p&gt;

&lt;p&gt;I exercised both paths against the sandbox. Approving posted the comment. Declining left GitHub unchanged.&lt;/p&gt;

&lt;p&gt;The same pattern applies to &lt;code&gt;bench&lt;/code&gt;'s contributor feedback. It shows the drafts first, then requests approval for each comment. Choosing a preferred PR does not merge it or close the others; those actions are outside the agents' assigned workflow and have deny rules.&lt;/p&gt;

&lt;p&gt;After the comparison, I tell &lt;code&gt;bench&lt;/code&gt; which PR I prefer and review its notes for the other authors. Back in the hub, &lt;code&gt;@desk digest&lt;/code&gt; brings the linked room's progress into three lists: what came in, what was decided, and what is waiting on me. That closes the loop from a crowded issue to a documented decision and reviewed replies.&lt;/p&gt;

&lt;p&gt;Putting the approval beside the draft makes the decision easier to inspect. The evidence, proposed wording, and requested command remain in the conversation where the work happened.&lt;/p&gt;

&lt;p&gt;The implementation uses command-prefix rules, however, and the rooms run in auto mode. An unlisted command form can escape those rules. I describe this as a &lt;strong&gt;best-effort approval gate&lt;/strong&gt; and keep the rehearsal in a private repository. The local &lt;code&gt;doctor&lt;/code&gt; command checks that the expected rules are present; it cannot prove that every possible command is covered.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Switch contributed
&lt;/h2&gt;

&lt;p&gt;Switch supplied the coordination layer that made these pieces usable together.&lt;/p&gt;

&lt;p&gt;The hub template creates the agents and their initial room. The issue template gives each issue a consistent room, snapshot, instructions, and kickoff. An agent can run that template itself when the maintainer asks to open an issue. Linked rooms let &lt;code&gt;desk&lt;/code&gt; gather a digest, while room documents carry the evidence and agreed direction between specialists.&lt;/p&gt;

&lt;p&gt;Addressing policies also matter: &lt;code&gt;desk&lt;/code&gt; responds to its owner, while &lt;code&gt;scout&lt;/code&gt; and &lt;code&gt;bench&lt;/code&gt; can respond to the owner and other agents. That supports handoffs inside the issue room without making every agent answer every hub message.&lt;/p&gt;

&lt;p&gt;My command-line tools handle GitHub data and test execution. Switch connects those tools to an ongoing conversation with shared context and reviewable actions. That is the part of the build that turns separate commands into a maintainer workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bugs the rehearsal exposed
&lt;/h2&gt;

&lt;p&gt;The first template run left an agent looking at a literal &lt;code&gt;{repo}&lt;/code&gt; placeholder. In Switch Console 0.40.1 on macOS, the version I tested, parameters were substituted into room instructions but not agent instructions. I moved the repository and paths into the room context and made the agent briefs point there. Earlier validation would make this easier to diagnose.&lt;/p&gt;

&lt;p&gt;Approval replies had another rough edge: the system processed &lt;code&gt;A1 1&lt;/code&gt;, but the agent also received it as a normal message and could respond with confusion. My recording script initially assumed every card would be &lt;code&gt;A1&lt;/code&gt;; later cards in the room had different IDs. Both experiences made clearer approval events an obvious improvement.&lt;/p&gt;

&lt;p&gt;The largest data-quality lesson came from testing beyond the demo. A read-only run across &lt;strong&gt;289 issue threads and 1,217 comments&lt;/strong&gt; from two other public Stellar Wave repositories found &lt;strong&gt;568 bot notices—about 47% of the comments&lt;/strong&gt;. The scorecard was treating notices such as “application accepted” and “issue completed” as contributor claims.&lt;/p&gt;

&lt;p&gt;I added filtering for comments authored by GitHub apps in both scoring and mirroring. Bots using ordinary user accounts can still slip through, and the remaining classifications have not been manually validated. The broader run exposed a mistake that the demo thread, which had no bots, could never reveal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would build next
&lt;/h2&gt;

&lt;p&gt;The clearest performance improvement is dependency caching keyed to the lockfile. Comparing four PRs took roughly 11–14 minutes in rehearsals, with much of that spent installing dependencies. A digest also currently requires a prompt; scheduled sweeps would make it more useful as a regular maintenance routine.&lt;/p&gt;

&lt;p&gt;Before expanding beyond the practice setup, I would strengthen write enforcement with repository-limited credentials and a command-aware gate. I would also manually evaluate the claim classifications on a labeled sample. The current build was tested with one maintainer on a local Switch server and bundled Mattermost; a hosted team setup remains untested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the workflow
&lt;/h2&gt;

&lt;p&gt;The project is open source at &lt;strong&gt;&lt;a href="https://github.com/JemIIahh/issue-desk" rel="noopener noreferrer"&gt;JemIIahh/issue-desk&lt;/a&gt;&lt;/strong&gt;. Start with Switch Console, Docker, Claude Code, an authenticated GitHub CLI, and &lt;code&gt;uv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/JemIIahh/issue-desk
&lt;span class="nb"&gt;cd &lt;/span&gt;issue-desk
uv &lt;span class="nb"&gt;sync
&lt;/span&gt;uv run issue-desk doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the README to create a private practice repository, mirror the issue, seed the four PRs, and import the two Switch templates. From there, &lt;code&gt;@desk sweep&lt;/code&gt; begins the rehearsal.&lt;/p&gt;

&lt;p&gt;The moment I would watch closely is the handoff from &lt;code&gt;scout&lt;/code&gt; to &lt;code&gt;bench&lt;/code&gt;: the direction I reviewed becomes the scope used to compare the code. By the time contributor replies reach an approval card, the room contains the evidence behind them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build and AI disclosure
&lt;/h2&gt;

&lt;p&gt;The underlying &lt;a href="https://github.com/JemIIahh/triage-kit" rel="noopener noreferrer"&gt;triage-kit&lt;/a&gt; library—including GitHub reading, claim scoring, the isolated test runner, mirroring, and the practice fixtures—was written before the hackathon window. The initial design and a short Switch feasibility spike also predate the window. The Issue Desk templates, agent configuration and instructions, approval rules, CLI wrapper, tests, and project documentation were developed during the window, as detailed in the repository.&lt;/p&gt;

&lt;p&gt;Claude Code assisted with implementation from a written design and plan, with tests written first for the command-line code. The agents running inside Issue Desk are also Claude Code agents. I made the product decisions, set the rules, and authorized outward actions. This article was revised with AI assistance using the project documentation and rehearsal notes.&lt;/p&gt;

&lt;p&gt;The demo recording uses scripted maintainer typing and approval replies for repeatability. Agent responses and sandbox GitHub comments are real. The recording is a workflow demonstration, not a measurement of human decision time.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
