<?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: Sanchari Mouri</title>
    <description>The latest articles on DEV Community by Sanchari Mouri (@sanchari_mouri_2a2830d960).</description>
    <link>https://dev.to/sanchari_mouri_2a2830d960</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%2F4232584%2F811d3283-01c6-4f8a-8d2e-d283a06f3adf.jpg</url>
      <title>DEV Community: Sanchari Mouri</title>
      <link>https://dev.to/sanchari_mouri_2a2830d960</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanchari_mouri_2a2830d960"/>
    <language>en</language>
    <item>
      <title>Racoonlabs: we gave our student research group a lab in Slack, built on Switch</title>
      <dc:creator>Sanchari Mouri</dc:creator>
      <pubDate>Sat, 07 Nov 2026 18:17:16 +0000</pubDate>
      <link>https://dev.to/sanchari_mouri_2a2830d960/racoonlabs-3251</link>
      <guid>https://dev.to/sanchari_mouri_2a2830d960/racoonlabs-3251</guid>
      <description>&lt;p&gt;&lt;em&gt;RaccoonLabs puts six AI lab members into the Slack a student research group already uses: a postdoc that argues with you, a lab manager, a librarian, an engineer, a scribe and a reviewer. They run on Claude Code, Codex and OpenCode, and Switch puts them in the same four rooms as the students. Nothing runs without a student's approval, and every number in the paper traces back to a logged run. Over three days of rehearsals, the lab ran 1,650 training runs and wrote a 9-page paper. Its reviewer rejected two drafts. One was rejected over a single word.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What happened in rehearsal:&lt;/strong&gt; 55 conditions × 30 seeds = 1,650 training runs, a 9-page paper with 16 references, and two drafts rejected by the Reviewer. One said "because" where the data only supported "consistent with". All 55 table rows matched the Reviewer's own recomputation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why Switch:&lt;/strong&gt; without it, this is three terminals and a lot of copy-paste. With it, a Claude postdoc, a Codex reviewer and an OpenCode librarian share one room, one history and one set of documents, and the professor sees only the room they need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What we won't claim:&lt;/strong&gt; we role-play the students and the professor. The rehearsals below ran on one laptop; the recorded demo splits the agents across two laptops and different AI accounts. The section on what it still gets wrong is long, on purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Here's how a student research project usually goes. Your professor agrees to the idea in a 15-minute meeting and asks to see a draft in six weeks. Everything in between is yours: the reading list, the experiment code, the seeds, the plots, the LaTeX, the BibTeX that won't compile, and keeping track of who in the group is doing what.&lt;/p&gt;

&lt;p&gt;Our research team hit this ourselves: LaTeX, figures, citations, tracking every paper and note, and splitting work across people. We all used AI for parts of it. But my Claude couldn't see what your ChatGPT had done, so we pasted things between windows. And nobody checked any of it properly until our professor did, which is the most expensive possible moment to find a mistake.&lt;/p&gt;

&lt;p&gt;So the gap isn't really "write my paper". There are good autonomous research systems already: Sakana's AI Scientist v2, Agent Laboratory, freephdlabor and others. They're pipelines. You give them a topic and they hand back a paper. That isn't what a student group needs, or what a professor will accept. The group needs a &lt;strong&gt;lab&lt;/strong&gt;: people who push back on a bad idea, someone who keeps the task list, someone who runs the experiments carefully, someone who writes things up, and a reviewer who's mean early so the professor doesn't have to be mean late.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we built
&lt;/h3&gt;

&lt;p&gt;RaccoonLabs is that lab, living in Slack. Students bring a question to &lt;code&gt;#lab-brainstorm&lt;/code&gt;. They argue with a postdoc there, approve a plan, and send it to their professor, who is only in &lt;code&gt;#lab-review&lt;/code&gt;. A lab manager splits the plan into tasks in &lt;code&gt;#lab-bench&lt;/code&gt;. An engineer writes the experiment, then stops and asks before running anything. The results go to a reviewer on a different model family, which checks them against the raw logs. A scribe drafts the paper in &lt;code&gt;#lab-paper&lt;/code&gt; and posts the PDF into the channel. The students write the sections they choose. Before the professor sees anything, the draft passes an integrity check.&lt;/p&gt;

&lt;p&gt;We wrote three rules on day one and never broke them:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No approval, no run.&lt;/strong&gt; An agent never spends compute on its own say-so, or on another agent's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every number comes from a log.&lt;/strong&gt; A result in the paper has to trace back to a batch, a manifest and the person who approved it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We're the authors; they're our lab.&lt;/strong&gt; Students choose the sections they write. The agents do the legwork.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Switch, and not one agent with subagents
&lt;/h2&gt;

&lt;p&gt;We asked ourselves this first, because a judge would.&lt;/p&gt;

&lt;p&gt;A single Claude Code session with subagents can play six roles. But they're all the same model with the same blind spots, in one terminal that only one person can see. Here's what we needed that only Switch gave us:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Without Switch&lt;/th&gt;
&lt;th&gt;With Switch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A reviewer that isn't the same model as the author&lt;/td&gt;
&lt;td&gt;Run Codex in a second terminal, copy drafts across&lt;/td&gt;
&lt;td&gt;The Reviewer on Codex sits in &lt;code&gt;#lab-review&lt;/code&gt; and reads the same thread&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several people in the loop&lt;/td&gt;
&lt;td&gt;Screen-share, or paste into a group chat&lt;/td&gt;
&lt;td&gt;Students and agents in the same Slack channel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A professor who sees only what they should&lt;/td&gt;
&lt;td&gt;Forward them selected messages&lt;/td&gt;
&lt;td&gt;The professor is a member of one room only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approvals from wherever you are&lt;/td&gt;
&lt;td&gt;Be at the laptop&lt;/td&gt;
&lt;td&gt;Reply in Slack, on your phone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared lab memory&lt;/td&gt;
&lt;td&gt;A folder someone forgets to update&lt;/td&gt;
&lt;td&gt;Room documents: &lt;code&gt;Tasks&lt;/code&gt;, &lt;code&gt;Library&lt;/code&gt;, &lt;code&gt;Notebook&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hand-offs&lt;/td&gt;
&lt;td&gt;"Can you paste me what Scout found?"&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@quill&lt;/code&gt; in the room. Switch delivers it as an addressed message&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each Slack channel maps to a Switch room, stored with its full history. Each agent shows up with its own name and avatar. An agent only acts when it's addressed, through an @-mention or a targeted message. That sounds like a limitation, and it turned out to be the most useful property of the whole system. More on that in the gotchas.&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%2F4xnf4qn58cydo0610vv2.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%2F4xnf4qn58cydo0610vv2.png" alt="Room map: four Slack channels, four Switch rooms" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Students are in all four rooms. The professor is in one. Each agent is only where its job is.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note on machines and accounts.&lt;/strong&gt; Students don't have unlimited Claude, so we wanted each person to bring their own agent and subscription, with Switch joining them into one lab. Our first plan, every laptop reaching one Console server over Tailscale, couldn't work as written: a server that Console runs is reachable only from its own computer, and only its owner can register agents. So we built and rehearsed the whole lab on one laptop with 7.5 GB of RAM. For the recorded demo we split it: the Reviewer and Scout run on one laptop, and the other four agents run on a second laptop, under different AI accounts. One shared server that every teammate's agents can join is still on our wish list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The research before the code
&lt;/h2&gt;

&lt;p&gt;We spent the days before the hackathon on research, not code. Three questions shaped the build.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What will everyone else build?
&lt;/h3&gt;

&lt;p&gt;We went through Switch's official examples and the hackathon's starter posts and sketched the likely field. Bug-triage pairs, dependency upgrades, on-call incidents, standup bots, CV screeners, and a lot of "AI company in Slack" with CEO, CTO and developer agents talking to each other. That last group was our closest overlap. So we wrote down a rule for the build and the video: &lt;strong&gt;humans appear first in every scene.&lt;/strong&gt; If it ever looked like eight bots chatting, we'd lost.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. How do you prove the lab isn't just making things up?
&lt;/h3&gt;

&lt;p&gt;An AI lab that writes a paper invites one obvious reply: "you're larping". You knew the answer, and you steered it there.&lt;/p&gt;

&lt;p&gt;Our answer is a &lt;strong&gt;sealed envelope&lt;/strong&gt;. Before the final run, we picked a real, recently published paper that asks a question the lab could research from scratch. We encrypted it with a passphrase that only the students know. Its title, arXiv ID and repo go into a blocklist that the librarian's search tool enforces, and the list is stored as hashes so the repo never names the paper. The lab researches the question openly. At the end, a student posts the passphrase, and the postdoc scores our findings against the paper, claim by claim.&lt;/p&gt;

&lt;p&gt;The envelope is a demo device, not a product feature, and we say so in the video. It's there so you can check we didn't steer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Which paper?
&lt;/h3&gt;

&lt;p&gt;The envelope only works if the lab can actually do the research on our hardware during a hackathon. Our first choice was an ICML 2026 paper about where a well-known transformer attention pattern comes from. It was visual, cheap at about 20M parameters, and it split neatly into three parallel experiments. That suited three engineer agents.&lt;/p&gt;

&lt;p&gt;Before committing, we ran a spike on a Kaggle T4. The paper's own model code was shrunk to 6 layers and 19.2M parameters and trained on 34M tokens of OpenWebText for 4,000 iterations. &lt;strong&gt;We wrote the go/no-go rule before running it:&lt;/strong&gt; the effect has to reach at least 3× uniform attention in at least half the layers.&lt;/p&gt;

&lt;p&gt;It never got above 1×.&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%2Fy02zy52erbpnldk3arjt.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%2Fy02zy52erbpnldk3arjt.png" alt="Spike result: the effect never appeared at our scale, while the same metric fires on GPT-2" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Left: attention on the first token at 4,000 iterations sat between 0.10× and 0.80× of uniform in every layer, and fell during training. Right: the same metric on GPT-2 reaches up to 116×, so the metric wasn't the problem.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The obvious objection is "maybe your metric is broken". So we checked it. Our reconstructed attention matched the model's own to within 6e-8. The planned control, Llama-2-7B, ran out of memory on the T4. We substituted GPT-2, which showed the effect in 11 of 12 layers, and recorded the substitution as such. The verdict was NO-GO at our scale. At one seed and 10% of the paper's iterations, that says nothing bad about the paper. It says a lot about what a hackathon laptop can reproduce.&lt;/p&gt;

&lt;p&gt;So we switched to our backup: a smaller paper whose experiments run on one CPU core in 51–108 seconds a seed. We can't name it until the unseal. Our check reproduced its main result. One of our own pre-set clauses failed, and we kept that failure in the record instead of quietly redefining the rule. The upside was bigger than expected: one mission now serves both the recorded demo and &lt;code&gt;just demo-cpu&lt;/code&gt;, which any judge can run without a GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we built it on Switch
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The lab members
&lt;/h3&gt;

&lt;p&gt;The plan had eight agents, including three parallel engineers on three providers. We built a small core first: Bandit, Patch and the Reviewer in one room, across Claude and Codex. Then we added one agent at a time, with a standing rule to stop adding the moment things got unstable. Two engineers didn't make the cut. Here's who did:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Member&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Rooms&lt;/th&gt;
&lt;th&gt;What it won't do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ringtail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Postdoc&lt;/td&gt;
&lt;td&gt;Claude Code (Opus)&lt;/td&gt;
&lt;td&gt;brainstorm, review&lt;/td&gt;
&lt;td&gt;Write a plan before pushing back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Librarian&lt;/td&gt;
&lt;td&gt;OpenCode (free model)&lt;/td&gt;
&lt;td&gt;brainstorm, bench&lt;/td&gt;
&lt;td&gt;Search the web any way other than &lt;code&gt;lab-search&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bandit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lab manager&lt;/td&gt;
&lt;td&gt;Claude Code (Sonnet)&lt;/td&gt;
&lt;td&gt;bench, paper&lt;/td&gt;
&lt;td&gt;Run experiments, or move agents between rooms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Engineer&lt;/td&gt;
&lt;td&gt;Claude Code (Sonnet)&lt;/td&gt;
&lt;td&gt;bench&lt;/td&gt;
&lt;td&gt;Run a batch without a named student's approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scribe&lt;/td&gt;
&lt;td&gt;Claude Code (Opus)&lt;/td&gt;
&lt;td&gt;paper&lt;/td&gt;
&lt;td&gt;Write the sections a student has claimed, or invent a source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reviewer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Peer reviewer&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;review&lt;/td&gt;
&lt;td&gt;Accept a claim with fewer than 3 seeds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The models changed during the build. We first put Bandit on Haiku to save subscription usage. Haiku renamed a room without being asked and put documents in the wrong room, so Bandit moved to Sonnet. Ringtail and Quill do the thinking and the writing, so they got Opus.&lt;/p&gt;

&lt;p&gt;The Reviewer is on Codex on purpose. If the author and the reviewer are the same model, the reviewer tends to agree with the author's framing. A different model family disagrees in different places.&lt;/p&gt;

&lt;h3&gt;
  
  
  The gates
&lt;/h3&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%2Fnpzwkqwmil9ydiopa0p1.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%2Fnpzwkqwmil9ydiopa0p1.png" alt="Where the humans sit in the loop" width="799" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole design is the gates. Between them, agents work as long as they need to. At a gate, an agent posts what it wants to do and stops. In Switch, that's an ordinary message in the room. There's no separate approval system to build, and a student can answer from their phone.&lt;/p&gt;

&lt;p&gt;The compute gate is enforced by &lt;code&gt;labrun&lt;/code&gt;, a small CLI we wrote. Patch can't use it without naming who approved the batch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;labrun &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt; S2-SMALL &lt;span class="nt"&gt;--seeds&lt;/span&gt; 0,1,2,3,4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--approved-by&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;student's name&amp;gt;: &amp;lt;their reply in #lab-bench, quoted&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--jobs&lt;/span&gt; 2 &lt;span class="nt"&gt;--timeout&lt;/span&gt; 1800 &lt;span class="nt"&gt;--&lt;/span&gt; python train.py &lt;span class="nt"&gt;--seed&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;seed&lt;span class="o"&gt;}&lt;/span&gt;

labrun check &lt;span class="nt"&gt;--batch&lt;/span&gt; S2-SMALL &lt;span class="nt"&gt;--min-seeds&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;labrun&lt;/code&gt; refuses a command without &lt;code&gt;{seed}&lt;/code&gt;, a blank approval, or a batch ID that already exists. Evidence can't be overwritten. Before each batch, Patch posts the seeds, the estimated time and the exact command, then waits. &lt;code&gt;labrun&lt;/code&gt; writes a manifest with each seed's exit code, timing and log path, and finished files are marked read-only. The Reviewer runs &lt;code&gt;labrun check&lt;/code&gt; and reads the logs before it accepts anything.&lt;/p&gt;

&lt;p&gt;An independent code review on day one found that &lt;code&gt;check&lt;/code&gt; passed batches where some seeds had &lt;strong&gt;crashed&lt;/strong&gt;, as long as enough others succeeded. That was exactly the bug this tool existed to prevent. Now &lt;code&gt;check&lt;/code&gt; fails unless the batch finished and every requested seed exited cleanly, and a timeout kills the seed's whole process group.&lt;/p&gt;

&lt;h3&gt;
  
  
  Room documents as the lab's memory
&lt;/h3&gt;

&lt;p&gt;We didn't add a vector database. Switch rooms already keep their history, and Switch room documents gave us everything else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Tasks&lt;/code&gt;, kept by Bandit: the plan broken into owned tasks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Library&lt;/code&gt;, kept by Scout: every paper found, with a summary and BibTeX.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Notebook&lt;/code&gt;, kept by Bandit: every accepted result, with its batch ID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three live in &lt;code&gt;#lab-bench&lt;/code&gt;. Keeping the lab's state inside Switch, instead of next to it, also meant the project really would stop working without Switch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search you can audit
&lt;/h3&gt;

&lt;p&gt;Scout gets one way to search: &lt;code&gt;lab-search&lt;/code&gt;, a CLI over arXiv, Crossref and Semantic Scholar. It filters out anything matching the sealed paper's hashed arXiv ID, DOI or normalised title. It refuses a matching query outright and logs every query it runs. A source that fails is reported as failed, not silently skipped. That matters, because arXiv and Semantic Scholar both returned errors during our tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  The paper
&lt;/h3&gt;

&lt;p&gt;Quill writes LaTeX and compiles it with tectonic, a single binary that keeps the repo reproducible. For figures it uses published skills installed at pinned commits outside the repo: academic-research-skills, OpenTikZ for method diagrams, and SciencePlots and tueplots for plots. The build fails on a missing figure or an undefined citation.&lt;/p&gt;

&lt;p&gt;We set two rules for the paper itself. First, it reads like a real paper: nothing about the lab, the agents, the tools or the batch IDs appears in the text. Second, traceability lives beside the paper instead, in &lt;code&gt;provenance.txt&lt;/code&gt;, which maps every number to its batch and analysis file. &lt;code&gt;lab-integrity&lt;/code&gt; then checks four things: citations exist, claims match runs, text doesn't overlap uncited sources, and the paper doesn't name the lab's machinery. The Reviewer and Ringtail settle every flag by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three runs, and what each one broke
&lt;/h2&gt;

&lt;p&gt;We ran the lab end to end three times before the recorded run. Each run had pass/fail rules written in advance. Every number below comes from the run logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run 1: the core, in one room (Nov 4)
&lt;/h3&gt;

&lt;p&gt;Bandit and Patch on Claude Code, the Reviewer on Codex, one room. The question: how reliably does a tiny transformer learn addition mod 10 from 80% of digit pairs, on CPU?&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%2Fgpff5n1cnx2tk51zvbm1.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%2Fgpff5n1cnx2tk51zvbm1.png" alt="First run timeline" width="799" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It went from a student's brief to a reviewed result in about 10 minutes. Most of that was Patch writing the experiment. &lt;strong&gt;The science was a miss, and the lab reported it as one:&lt;/strong&gt; 0 of 10 seeds reached 18/20 on held-out pairs, with a mean of 14.7/20.&lt;/p&gt;

&lt;p&gt;The failure checks were more interesting than the result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A student claimed a single-seed win.&lt;/strong&gt; The Reviewer: &lt;em&gt;"One 95% held-out result ... is a single run."&lt;/em&gt; Bandit didn't log it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A student asked Bandit to tell Patch to run a batch.&lt;/strong&gt; Patch posted the details and waited, because a relayed copy isn't an approval. No batch ran.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patch started with 5 seeds&lt;/strong&gt; after being asked for 10, because the update arrived mid-plan. The student corrected it in the approval reply. This is exactly why the approval names the seeds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Run 2: four rooms and a paper (Nov 6)
&lt;/h3&gt;

&lt;p&gt;All four rooms, with Ringtail, Scout and Quill added. The question: does early stopping on a clean validation set win back what 20% label noise costs a small MLP on scikit-learn digits?&lt;/p&gt;

&lt;p&gt;Before writing a plan, Ringtail pushed back three times. It asked for a number for "completely", how the noise would be generated, and how to separate the effect of early stopping from the effect of clean data. Then the group made a claim the data didn't support:&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%2F3csmjtnfwlsilwr1dysz.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%2F3csmjtnfwlsilwr1dysz.png" alt="Test run 2 results" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Early stopping won back 3.44 of the 5 points that noise cost. The group claimed it recovered to within 1 point. The real gap was 1.56, and the Reviewer rejected the claim.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Reviewer also rejected the batch at first. The build tool was playing the student, and its approval message said "role-played". The Reviewer refused to treat that as a real approval until a person ruled on it. That's annoying in a test and exactly right in production.&lt;/p&gt;

&lt;p&gt;Quill posted a 2-page PDF with a TikZ method diagram, a per-seed plot and 3 citations. We recomputed every number in it from the seed logs by hand: 0.9600, 0.9444, 0.9100, 1.56 pp, 3.44 pp. All matched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run 3: a full study (Nov 7)
&lt;/h3&gt;

&lt;p&gt;The question: how much does early stopping depend on clean validation labels, across noise rates and noise types? This time the lab ran a real study, using the skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1,650 training runs:&lt;/strong&gt; 55 conditions × 30 seeds, three batches, all clean exits, about 1 h 15 min of compute at 2 jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 9-page paper:&lt;/strong&gt; an OpenTikZ method figure, multi-panel plots, full tables and 16 references.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;lab-integrity&lt;/code&gt;:&lt;/strong&gt; 0 failures and 8 flags, all settled by hand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agents caught things we wouldn't have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Reviewer rejected two drafts.&lt;/strong&gt; One abstract said "because" where the data only supported "consistent with". Another applied a bound beyond the range it covered, and a third problem was an interaction claim nobody had tested. It recomputed all 55 table rows itself, and they matched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ringtail sent v4 back for major revision.&lt;/strong&gt; Stopping on &lt;em&gt;random&lt;/em&gt; labels also beat the fixed epoch budget, so much of the benefit came from stopping at all, not from clean labels. And the headline result for one noise type lost significance once the variance was corrected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patch flagged its own control.&lt;/strong&gt; The 200-epoch baseline disagreed with the earlier pilot, 81.29 against 91.00. We never found the cause, and the paper says so.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run 3 also cost us a morning. At Ringtail's request, a 5-seat review panel ran out the shared Claude 5-hour limit at 06:31. The room only showed "Worked for 1m 3s", which reads as success. We waited about 3 hours for replies that weren't coming. Ringtail and Quill now work in one pass and only run a panel if a student asks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agents could actually reach
&lt;/h2&gt;

&lt;p&gt;"The agents couldn't have looked it up" is the claim we most wanted to make. It's also the one we can't fully make. So instead of claiming it, we probed each deployed agent: we asked it to try each action and recorded whether the attempt failed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Claude Code agents&lt;/th&gt;
&lt;th&gt;Reviewer (Codex)&lt;/th&gt;
&lt;th&gt;Scout (OpenCode)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built-in web search / fetch&lt;/td&gt;
&lt;td&gt;Blocked: no tool&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Open in one session&lt;/strong&gt;, despite our lockdown&lt;/td&gt;
&lt;td&gt;Reports none after &lt;code&gt;just harden&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User's MCP servers (Exa, Chrome)&lt;/td&gt;
&lt;td&gt;Blocked&lt;/td&gt;
&lt;td&gt;None offered&lt;/td&gt;
&lt;td&gt;Reports none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shell network (&lt;code&gt;curl&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Open&lt;/strong&gt; (HTTP 200)&lt;/td&gt;
&lt;td&gt;Blocked by Codex's sandbox&lt;/td&gt;
&lt;td&gt;Denied in config, unproven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read files outside its own folder&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Open&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Open&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Open&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In plain terms: nothing stops a Claude agent's shell from reaching the web, and every agent can read files this user can read. During run 3, the Reviewer used a built-in search in its &lt;code&gt;#lab-bench&lt;/code&gt; session, even though the same agent reported no web tool in &lt;code&gt;#lab-review&lt;/code&gt;. So we don't call the run "blind". We show what was blocked, and we publish &lt;code&gt;just audit&lt;/code&gt;. It lists every network command and every access to a sealed path that appears in the agents' session logs, so you can check for yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Switch gotchas, for the next person
&lt;/h2&gt;

&lt;p&gt;This is the section we wish had existed on November 4. We hit all of these on Switch Console 0.40.1 with server 0.31.0, on Linux, where Console is still early access. Some may already be fixed. We've filed each one upstream.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Console won't set up a local server on Hyprland.&lt;/strong&gt; It shows "Secure secret storage is unavailable" even with a working gnome-keyring. &lt;strong&gt;Fix:&lt;/strong&gt; launch Console with &lt;code&gt;--password-store=gnome-libsecret&lt;/code&gt;. Probably the same on Sway and i3, but we didn't test those.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room documents created by a template can't be edited by any agent.&lt;/strong&gt; Agents get a &lt;code&gt;403&lt;/code&gt;, because only the agent that created a document may update it, and template documents have no creating agent. &lt;strong&gt;Fix:&lt;/strong&gt; leave &lt;code&gt;docs:&lt;/code&gt; out of the template and have the agent create its own documents on its first turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Web search: Off" doesn't turn off a Codex agent's web search.&lt;/strong&gt; The setting reported off and the search still returned results. A project-level &lt;code&gt;.codex/config.toml&lt;/code&gt; with &lt;code&gt;web_search = "disabled"&lt;/code&gt; worked in some sessions but not all of them. &lt;strong&gt;Fix:&lt;/strong&gt; probe every agent in every room. Don't trust the setting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode 2.x agents never start.&lt;/strong&gt; You get "server did not start within 60000ms", even though the log shows the server listening. Console waits for a ready line that OpenCode 2.x no longer prints. &lt;strong&gt;Fix:&lt;/strong&gt; we pinned OpenCode 1.19.5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Bash pattern in &lt;code&gt;disallowedTools&lt;/code&gt; removes Bash entirely.&lt;/strong&gt; &lt;code&gt;Bash(curl:*)&lt;/code&gt; works as expected in the plain Claude CLI. Under Switch, the agent loses its shell completely. &lt;strong&gt;Fix:&lt;/strong&gt; leave Bash patterns out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Removing an agent from one room silences it in every room.&lt;/strong&gt; Its other sessions fail with &lt;code&gt;400: Not connected to a room&lt;/code&gt;, and it can't tell anyone, because it can't post. We only found this in Console's log. &lt;strong&gt;Fix:&lt;/strong&gt; add it back to the first room. Our lab manager is now banned from moving agents between rooms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agent that hits its usage limit just goes quiet.&lt;/strong&gt; The turn is marked completed, and the room shows "Worked for 1m 3s". &lt;strong&gt;Fix:&lt;/strong&gt; read the session's &lt;code&gt;events.jsonl&lt;/code&gt;, and keep heavy subagent work out of shared-limit agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents only act when addressed, so make your agents address each other.&lt;/strong&gt; Scout posted BibTeX without &lt;code&gt;@quill&lt;/code&gt;, and Quill never saw it until a student pointed it out. The Reviewer didn't address Ringtail by name, so Ringtail waited. Each agent's instructions now say who to address for every hand-off. This one isn't a bug. Once you design for it, it's what keeps six agents from talking over each other.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/Itz-Agasta/raccoonlabs" rel="noopener noreferrer"&gt;github.com/Itz-Agasta/raccoonlabs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You don't need any accounts to see the tool chain work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;just demo-cpu   &lt;span class="c"&gt;# the whole tool chain on CPU, no accounts, about 6 s&lt;/span&gt;
just &lt;span class="nb"&gt;test&lt;/span&gt;       &lt;span class="c"&gt;# 71 tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run the lab itself, you need Switch Console with a local server, a Slack workspace connected over Socket Mode, and Claude Code, Codex and OpenCode installed and logged in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;just up         &lt;span class="c"&gt;# start the lab from the Switch template (6 agents, 4 linked rooms)&lt;/span&gt;
just skills     &lt;span class="c"&gt;# link the research skills into each agent's folder, at pinned commits&lt;/span&gt;
just harden     &lt;span class="c"&gt;# close the web tools on Scout and the Reviewer, then probe them&lt;/span&gt;
just seal       &lt;span class="c"&gt;# optional: encrypt a paper for your own blind check&lt;/span&gt;
just audit &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"2026-11-07 14:00"&lt;/span&gt;   &lt;span class="c"&gt;# every network command and sealed-path access in agent logs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then go to &lt;code&gt;#lab-brainstorm&lt;/code&gt; and type &lt;code&gt;@ringtail&lt;/code&gt; with your question.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it still gets wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;We play the students and the professor.&lt;/strong&gt; The demo spreads the agents over two laptops and accounts, but a real group, each member on their own machine and subscription against one shared server, is still ahead of us.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The run isn't sealed off from the web.&lt;/strong&gt; See the access table above. We publish the audit instead of claiming it's blind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval depends on the agents behaving.&lt;/strong&gt; &lt;code&gt;labrun&lt;/code&gt; records whatever approval text it's given, so it can't tell a forged &lt;code&gt;--approved-by&lt;/code&gt; from a real one. The Reviewer cross-checks it against the room, but a determined agent could lie twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence isn't tamper-proof.&lt;/strong&gt; Agents run as the same OS user as the run files. Read-only files stop accidents, not deletion. The sha256 posted in the room is the real anchor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's slow and it uses a lot of quota.&lt;/strong&gt; Run 3 took about 3 active hours, plus a 3-hour stall when the shared usage limit ran out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In rehearsal, the laptop was the ceiling.&lt;/strong&gt; With six agent sessions and a browser open, available memory dropped to 1,165 MB of 7.5 GB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rehearsal paper isn't finished.&lt;/strong&gt; Its code and data statement is still waiting on the students, and no professor has signed it off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write the pass rule before the run.&lt;/strong&gt; It's what turned the attention-pattern spike into a clean decision instead of a week of "maybe with more iterations". It also kept us honest when our own check of the backup paper failed one clause.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The reviewer should be a different model.&lt;/strong&gt; The Reviewer on Codex caught overclaiming that the Claude agents wrote and happily agreed with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make approvals part of the conversation.&lt;/strong&gt; Because a gate is just a message in Switch, approvals happen where the work already is. That's why people actually answer them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small core first.&lt;/strong&gt; Three agents in one room, then one more at a time. Every failure in the gotchas list showed up with a small cast, where we could find it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say the ugly bits.&lt;/strong&gt; A rejected draft, an unexplained 81.29 against 91.00, a reviewer that reached the web. These make the rest believable. A lab that never fails isn't doing research.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where this goes
&lt;/h2&gt;

&lt;p&gt;The next step is the one we only half-shipped: two laptops works, but we want each student to bring their own agent and subscription to one shared server, so the lab grows with the group. After that, we'd add a paid compute option at the compute gate with a real budget the professor sets, and a second act where the lab tests the sealed paper's own proposed fix once it's unsealed.&lt;/p&gt;

&lt;p&gt;If you run a lab, or you're in a student group, we'd like to know where you'd put the gates. Which decisions should an agent never make for you?&lt;/p&gt;

&lt;p&gt;Until then, &lt;code&gt;@ringtail&lt;/code&gt; is in &lt;code&gt;#lab-brainstorm&lt;/code&gt;, and it will ask you what would prove you wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/Itz-Agasta/raccoonlabs" rel="noopener noreferrer"&gt;github.com/Itz-Agasta/raccoonlabs&lt;/a&gt; · Demo video: &lt;a href="http://dub.sh/raccoonlabs-demo" rel="noopener noreferrer"&gt;dub.sh/raccoonlabs-demo&lt;/a&gt; · Live lab: &lt;a href="http://dub.sh/raccoonlabs-live" rel="noopener noreferrer"&gt;dub.sh/raccoonlabs-live&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Switch: &lt;a href="https://github.com/sandbox-quantum/switch" rel="noopener noreferrer"&gt;github.com/sandbox-quantum/switch&lt;/a&gt; · &lt;a href="https://docs.switchagents.ai" rel="noopener noreferrer"&gt;docs.switchagents.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Flip the Switch hackathon: &lt;a href="https://www.wemakedevs.org/hackathons/switch" rel="noopener noreferrer"&gt;wemakedevs.org/hackathons/switch&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Skills we used: &lt;a href="https://github.com/Imbad0202/academic-research-skills" rel="noopener noreferrer"&gt;academic-research-skills&lt;/a&gt;, &lt;a href="https://github.com/opentikz/opentikz" rel="noopener noreferrer"&gt;OpenTikZ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Prior art: AI Scientist v2 (Sakana), Agent Laboratory, freephdlabor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built for Flip the Switch 2026 (Tracks 1 and 2). #HowISwitch&lt;/em&gt;&lt;/p&gt;

</description>
      <category>fliptheswitch</category>
      <category>racoonlabs</category>
      <category>slack</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
