<?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: Bayu Trisnapati</title>
    <description>The latest articles on DEV Community by Bayu Trisnapati (@bayu_trisnapati_8d9c50684).</description>
    <link>https://dev.to/bayu_trisnapati_8d9c50684</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%2F4239730%2Fa3b4ebcf-d071-4925-bd3d-1df6d1e772f4.jpg</url>
      <title>DEV Community: Bayu Trisnapati</title>
      <link>https://dev.to/bayu_trisnapati_8d9c50684</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bayu_trisnapati_8d9c50684"/>
    <language>en</language>
    <item>
      <title>I gave AI agents a 1995 chat room, and Kiro helped me build it</title>
      <dc:creator>Bayu Trisnapati</dc:creator>
      <pubDate>Wed, 11 Nov 2026 19:09:04 +0000</pubDate>
      <link>https://dev.to/bayu_trisnapati_8d9c50684/i-gave-ai-agents-a-1995-chat-room-and-kiro-helped-me-build-it-2k84</link>
      <guid>https://dev.to/bayu_trisnapati_8d9c50684/i-gave-ai-agents-a-1995-chat-room-and-kiro-helped-me-build-it-2k84</guid>
      <description>&lt;p&gt;I am a frontend developer from Indonesia, and I did not expect that a chat protocol from the 90s would become the best permission system I have used for AI agents. This post was written as part of the Kiroween 2026 hackathon. My teammate Fandy Rahmat Saputra and I built two projects for it, and this is the story of the first one and how Kiro shaped the way we worked.&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%2Fbpqh1x75w3kngtiefpw4.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%2Fbpqh1x75w3kngtiefpw4.png" alt="The Séance web client: a 1995-style desktop with the channel window open" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Séance is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Akar-Samudra-Artifisial/Seance" rel="noopener noreferrer"&gt;Séance&lt;/a&gt; is an IRC server and a web client styled like a 1995 desktop OS. Every AI agent is a user in a channel. You run the team with &lt;code&gt;/invite&lt;/code&gt;, &lt;code&gt;/mode&lt;/code&gt;, &lt;code&gt;/kick&lt;/code&gt; and &lt;code&gt;/topic&lt;/code&gt;. Behind each agent is a &lt;code&gt;kiro-cli acp&lt;/code&gt; process, and each channel is a git worktree.&lt;/p&gt;

&lt;p&gt;The idea is that IRC already answers the two questions most agent UIs hide: who is allowed to act, and what is happening now. A new agent joins with no mode and can only listen. &lt;code&gt;+v&lt;/code&gt; lets it speak. &lt;code&gt;+o&lt;/code&gt; lets it edit files, commit and run shell, only inside its worktree. &lt;code&gt;/kick&lt;/code&gt; is an exorcism: the session is cancelled and the worktree resets to the last commit. &lt;code&gt;/whois coder&lt;/code&gt; shows the model, tools, status and credits used. It entered the Resurrection category because the protocol was dead and now it is the control plane.&lt;/p&gt;

&lt;p&gt;You can try the &lt;a href="https://35-172-120-185.sslip.io/" rel="noopener noreferrer"&gt;live demo&lt;/a&gt; or watch the &lt;a href="https://youtu.be/dgStubeQRTY" rel="noopener noreferrer"&gt;3 minute video&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Kiro fit into the work
&lt;/h2&gt;

&lt;p&gt;Séance uses Kiro in two ways. It is built with Kiro, and it runs on Kiro, because every agent in the channel is a Kiro CLI session driven over ACP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Specs and tasks
&lt;/h3&gt;

&lt;p&gt;Every feature started as a spec in &lt;code&gt;.kiro/specs/&amp;lt;feature&amp;gt;/&lt;/code&gt;: requirements in EARS form, a design, and a task list. We ended with 14 specs and 764 ticked tasks. Writing requirements before code is slower at the start; it pays back when the code meets something real.&lt;/p&gt;

&lt;p&gt;The design documents contained correctness properties, for example &lt;code&gt;parse(serialize(m)) == m&lt;/code&gt; for IRC messages. Those turned into fast-check property tests. The parser, the permission handler and the exorcism flow all worked the first time they met a real client, and I credit that to the properties existing before the code did.&lt;/p&gt;

&lt;p&gt;Another habit I picked up: review findings did not become loose bug tickets. They became follow-up tasks inside the same spec, with the reason written down. In the web client spec, tasks 10.20 to 10.23 cover a silent WHOIS and the per-channel credit counter, each with a note on why it was added.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steering
&lt;/h3&gt;

&lt;p&gt;The steering files in &lt;code&gt;.kiro/steering/&lt;/code&gt; are the part I use most as a frontend person. Four are always on: product, tech, structure and security. Four apply to certain paths: &lt;code&gt;irc-protocol.md&lt;/code&gt;, &lt;code&gt;runner-acp.md&lt;/code&gt;, &lt;code&gt;web-ui.md&lt;/code&gt; and &lt;code&gt;testing.md&lt;/code&gt;. The protocol file kept numerics exact to RFC 2812. The web UI file kept the retro desktop and ghost design system consistent across screens. The security file kept agents inside the repository. I stopped repeating the same instructions in every prompt.&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%2Ftrp13ux1nxvt25vlj1k1.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%2Ftrp13ux1nxvt25vlj1k1.png" alt="/whois on an agent shows its model, tools, status and credits" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hooks
&lt;/h3&gt;

&lt;p&gt;We set up four hooks: &lt;code&gt;guard-shell&lt;/code&gt;, &lt;code&gt;test-on-save&lt;/code&gt;, &lt;code&gt;verify-after-task&lt;/code&gt; and &lt;code&gt;kiro-usage-log&lt;/code&gt;. The log hook appended to our build log at the end of each turn that changed the repo, so the write-up for this hackathon came partly from the tool itself.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;guard-shell&lt;/code&gt; earned its place on 2026-11-08 with this message: &lt;code&gt;Blocked by .kiro/hooks/guard-shell: path "/tmp" resolves outside the repository root&lt;/code&gt;. An agent had tried to write outside the repo. That was a small moment, but it is exactly the kind of mistake that slips through in a long session.&lt;/p&gt;

&lt;h3&gt;
  
  
  ACP as the runner
&lt;/h3&gt;

&lt;p&gt;The first thing we did was a spike: can Kiro agents be driven headlessly over &lt;code&gt;kiro-cli acp&lt;/code&gt;? They can, with several sessions per process. That spike removed the biggest risk of the project before we wrote the server. After that, the runner treats Kiro's &lt;code&gt;session/request_permission&lt;/code&gt; as the enforcement point. A write or shell request from an agent without &lt;code&gt;+o&lt;/code&gt; is rejected, and so is any path outside the worktree.&lt;/p&gt;

&lt;h2&gt;
  
  
  What failed
&lt;/h2&gt;

&lt;p&gt;The honest lesson: we assumed the tests were the whole world. They were not.&lt;/p&gt;

&lt;p&gt;Three bugs only appeared on the real server. The &lt;code&gt;/home/agent&lt;/code&gt; tmpfs inside the sandbox was owned by root. Node 26 shipped without corepack. The node binary needed &lt;code&gt;libatomic.so.1&lt;/code&gt;. Our tests used a fake Podman and tests that only read the Dockerfile, so none of them could see these problems.&lt;/p&gt;

&lt;p&gt;What worked was going back to the spec. Each bug was written down as a new requirement first (task 21.x in the sandbox spec), then fixed in code with a test that pins it. The bootstrap script now rebuilds the image whenever the sandbox context changes. Spec-first helped most where correctness mattered, and it did not protect us from facts about the real machine. Only running it there did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Séance Crew
&lt;/h2&gt;

&lt;p&gt;The second project is &lt;a href="https://github.com/Akar-Samudra-Artifisial/Seance-Crew" rel="noopener noreferrer"&gt;Séance Crew&lt;/a&gt;, a Kiro Crew app that makes Crew the foreman of Séance channels. One Node backend keeps a single WebSocket to the Séance server and exposes eight MCP tools: &lt;code&gt;list_channels&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;say&lt;/code&gt;, &lt;code&gt;summon&lt;/code&gt;, &lt;code&gt;grant_op&lt;/code&gt;, &lt;code&gt;exorcise&lt;/code&gt;, &lt;code&gt;whois&lt;/code&gt; and &lt;code&gt;credits&lt;/code&gt;. It also serves a dashboard page with channel cards, commits, credits and a "Needs op" inbox for agents that were denied an action.&lt;/p&gt;

&lt;p&gt;There is a &lt;code&gt;seance-steward&lt;/code&gt; agent that auto-approves only the four read-only tools. Granting op or exorcising asks you first, and the dashboard shows a confirmation dialog with Cancel focused. All channel text is treated as untrusted data. We built it with five specs, five steering files and two hooks.&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%2Ffmhl2segdhwa2enwf52f.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%2Ffmhl2segdhwa2enwf52f.png" alt="The Séance Crew dashboard inside Kiro Crew" width="799" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;If I had to say one thing about Kiro from this month: it changed what I do before I type code. I write down what must be true, and then I let the tools check it. For a frontend developer used to tweaking CSS until it looks right, that was a real change.&lt;/p&gt;

&lt;p&gt;Séance is open source under MIT. Try the &lt;a href="https://35-172-120-185.sslip.io/" rel="noopener noreferrer"&gt;demo&lt;/a&gt;, read the &lt;a href="https://github.com/Akar-Samudra-Artifisial/Seance" rel="noopener noreferrer"&gt;Séance repo&lt;/a&gt;, or look at &lt;a href="https://github.com/Akar-Samudra-Artifisial/Seance-Crew" rel="noopener noreferrer"&gt;Séance Crew&lt;/a&gt;. Feedback is welcome.&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>hackathon</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
