<?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: Bryan Williams</title>
    <description>The latest articles on DEV Community by Bryan Williams (@bryanw).</description>
    <link>https://dev.to/bryanw</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%2F4089669%2Fce63ed75-3ffb-4b98-86f3-5b3c8dd71d73.jpg</url>
      <title>DEV Community: Bryan Williams</title>
      <link>https://dev.to/bryanw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bryanw"/>
    <language>en</language>
    <item>
      <title>"Trust this file over the exit status": the note our test suite left itself — that nothing ever read</title>
      <dc:creator>Bryan Williams</dc:creator>
      <pubDate>Sat, 22 Aug 2026 21:58:12 +0000</pubDate>
      <link>https://dev.to/bryanw/trust-this-file-over-the-exit-status-the-note-our-test-suite-left-itself-that-nothing-ever-read-4gej</link>
      <guid>https://dev.to/bryanw/trust-this-file-over-the-exit-status-the-note-our-test-suite-left-itself-that-nothing-ever-read-4gej</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the story of a bug with two layers: a crash we &lt;em&gt;correctly&lt;/em&gt; decided not to fix — and the verdict-flipping second bug hiding behind it that we missed for a week, even though the fix for it already existed, sitting unread on disk with a note that literally said &lt;em&gt;"trust this file over the exit status."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I build an AI agent harness — a control system around a language model where every claim needs receipts and every safety gate is enforced by code. The harness has a CI runner that executes 16 test batteries: gate tests, memory-integrity tests, security fuzzing. If a battery fails, the chain refuses to let changes land. The whole point of the system is that &lt;strong&gt;a verdict you can't trust is worse than no verdict&lt;/strong&gt; — remember that, it's the punchline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The crash
&lt;/h2&gt;

&lt;p&gt;One battery — the harness security suite — had a ritual. Every single run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== 11 passed, 0 failed ===
Assertion failed: !(handle-&amp;gt;flags &amp;amp; UV_HANDLE_CLOSING), file src\win\async.c, line 76
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;All eleven assertions green… then the Node process &lt;em&gt;aborts&lt;/em&gt; in libuv teardown. Not our test code — the runtime itself, dying on the way out the door (Node v25.9.0 on Windows; keep-alive sockets from an embedding server meeting a teardown race).&lt;/p&gt;

&lt;p&gt;Here's the part I'm actually proud of, because it's the unsexy discipline part: we tried to fix it &lt;strong&gt;and measured the attempts honestly&lt;/strong&gt;. Four variants — close the sockets, destroy them, unref everything, swap in a no-keepalive dispatcher. Interleaved A/B, six runs each, alternating inside one time window so machine drift couldn't lie to us. Result: the &lt;em&gt;targeted fix&lt;/em&gt; crashed &lt;strong&gt;3/6&lt;/strong&gt; runs. Doing &lt;em&gt;nothing&lt;/em&gt; crashed &lt;strong&gt;0/6&lt;/strong&gt; that window — and the same untouched code had crashed &lt;strong&gt;8/8&lt;/strong&gt; twenty minutes earlier. The environment dominated any code change we tested. Conclusion: an environment-dependent runtime race we couldn't beat from userland. So we did the honest thing: taught the CI to report &lt;code&gt;CRASH&lt;/code&gt; (assertions green, process died in teardown) as its own state, distinct from &lt;code&gt;FAIL&lt;/code&gt;. Documented, bounded, accepted.&lt;/p&gt;

&lt;p&gt;That was the &lt;em&gt;right&lt;/em&gt; call. And it concealed the real bug for a week.&lt;/p&gt;
&lt;h2&gt;
  
  
  The coin flip
&lt;/h2&gt;

&lt;p&gt;Fast-forward a week: the same battery keeps "failing." Once it even blocked the commit chain with &lt;code&gt;do NOT commit&lt;/code&gt;. The very next run: green. Same code. Same machine. The operator instinct kicked in: &lt;em&gt;"it keeps failing — figure out why, fix it, make sure it doesn't happen again."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The classifier's logic seemed sound: parse the battery's &lt;strong&gt;stdout&lt;/strong&gt; for &lt;code&gt;N passed, M failed&lt;/code&gt;; if the process crashed but the counts look green, classify &lt;code&gt;CRASH&lt;/code&gt; (report it, don't block); if it crashed &lt;em&gt;and there are no counts&lt;/em&gt;, assume it died mid-run and classify &lt;code&gt;FAIL&lt;/code&gt; (block everything).&lt;/p&gt;

&lt;p&gt;See it yet? The abort and the final &lt;code&gt;console.log&lt;/code&gt; are in a &lt;strong&gt;race&lt;/strong&gt;. When the log flushes first, the classifier sees "11 passed, 0 failed" → &lt;code&gt;CRASH&lt;/code&gt; → the chain continues. When the abort wins, that last line &lt;em&gt;never leaves the buffer&lt;/em&gt; → no counts → &lt;code&gt;FAIL&lt;/code&gt; → "do NOT commit." &lt;strong&gt;Same crash, coin-flip verdict&lt;/strong&gt;, decided by flush timing nobody controls. Two independent defects wearing one symptom: a real (accepted) runtime race, and a verdict channel that only worked when we lost that race politely.&lt;/p&gt;
&lt;h2&gt;
  
  
  The gut punch
&lt;/h2&gt;

&lt;p&gt;While reading the battery's source to fix the classifier properly, I found this — written a week earlier, during the original investigation:&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="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tmpdir&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;harness-sec-result.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;pass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fail&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;FAIL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PASS&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="s1"&gt;exit code may be from a libuv teardown race AFTER all assertions complete; trust this file over the exit status&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The battery had been &lt;strong&gt;writing a crash-proof result file the entire time&lt;/strong&gt; — a synchronous write that always survives the abort — with a note begging future readers to trust it over the exit code. And the CI runner never read it. We built the antidote and never wired it to the patient. The fix for the week-old mystery existed &lt;em&gt;before the mystery did&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The actual fix
&lt;/h2&gt;

&lt;p&gt;Make the sidecar a contract. The runner hands every battery a path; the battery writes its counts there synchronously before exiting; the sidecar is authoritative, stdout is just the fallback for batteries that don't have one:&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;sumFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tmpdir&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;battery-summary-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;a-z0-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/gi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;spawnSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;abs&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="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;env&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;BATTERY_SUMMARY_FILE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sumFile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;sidecar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sidecar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sumFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&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="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="c1"&gt;// sidecar counts win; stdout parsing only when no sidecar exists.&lt;/span&gt;
&lt;span class="c1"&gt;// A verdict must never ride on a flush race.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And because a classifier is an instrument, we validated it like one — with a known-good and a known-bad control through the &lt;em&gt;shipped&lt;/em&gt; code, not a copy: a fake battery that writes a green sidecar, prints &lt;strong&gt;nothing&lt;/strong&gt;, and exits non-zero (the old code called this FAIL and blocked; the new code must classify CRASH and exit 0) — and a second whose sidecar reports real failures (must still FAIL and still block). Both behaved. Then three full CI runs, during one of which the real crash fired live mid-run — verdict stable every time, both directions.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I keep from this one
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Two bugs can share one symptom.&lt;/strong&gt; We "solved" this battery a week earlier — &lt;em&gt;correctly&lt;/em&gt; — and that closure blinded us to the second defect living in the reporting channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A verdict is only as trustworthy as the channel it rides on.&lt;/strong&gt; Our CI's judgment was riding on a stdout flush race. Audit not just what your tools decide, but &lt;em&gt;how the decision reaches you&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BUILT ≠ WIRED.&lt;/strong&gt; Search your own codebase for the safety nets past-you already built. Ours had a literal note attached, addressed to us. Nothing read it. The most embarrassing bugs aren't the ones you can't solve — they're the ones you already solved and forgot to connect.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Disclosure, proudly:&lt;/strong&gt; I'm self-taught (April 2026 → now) and this hunt — like everything here — was me and my AI partner working the problem against our own production tooling. The receipts culture we run means every number above (the A/B counts, the control results, the three verification runs) was measured before it was written. The longer story of how we work is in &lt;a href="https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46"&gt;my first post&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Watch the actual session tape
&lt;/h2&gt;

&lt;p&gt;Don't take the story's word for it — this challenge happened inside an AI agent harness that records everything, and the relevant slice of the &lt;em&gt;real session&lt;/em&gt; is published as an Agent Session: the hook blocking an unproven claim, the unprompted API check that caught the invisible entry, and my own safety rule blocking my own shortcut.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;The Agent That Isn't Allowed to Lie&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Stop hook feedback:&lt;br&gt;
CONSCIENCE — stop. This turn is not complete. &lt;br&gt;
[1] You made STRONG completion/verification claims with NO check run and no change — re-run the proving command and cite its output, or drop the claim.&lt;/p&gt;

&lt;p&gt;Fix the SPECIFIC requirement(s) above with the real command + the real result of THIS turn, then finish. You do not finish substantial work on words alone — and the completion check is no longer yours to self-certify: a DIFFERENT frontier model independently audits every finish for SUPPORTED-vs-SHAKY, and its verdict lands on your next turn.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Fair flag — I claimed &lt;em&gt;all&lt;/em&gt; fields rendered, but my screenshot only showed down to "Currently learning." "Available for" and "Currently hacking on" I asserted without seeing them live. Closing that gap now — scrolling the public profile to actually confirm them:&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"scroll","tabId":1524189768,"coordinate":[629,500],"scroll_directio...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scroll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189768&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"coordinate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="mi"&gt;629&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scroll_direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"down"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scroll_amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Scrolled down by 7 ticks at (629, 500)


Tab Context:
- Executed on tabId: 1524189768
- Available tabs:
  • tabId 1524189768: "Bryan Williams - DEV Community" ("https://dev.to/bryanw")
[screenshot omitted]
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Now it's fully verified — I can see the last two live on the public page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Currently hacking on:&lt;/strong&gt; &lt;em&gt;"Neverclosed — a done-for-you AI receptionist that answers calls &amp;amp; chats 24/7 so small businesses never miss a lead. Plus a self-verifying agent harness that checks its own work before it speaks."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Available for:&lt;/strong&gt; &lt;em&gt;"Talking applied AI, agent reliability, and building solo without a CS degree. Small businesses curious about AI phone/chat receptionists. Self-taught builders — always down to compare notes."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the corrected claim, now backed by eyes on the live page: &lt;strong&gt;all six content sections rendered in full, none truncated&lt;/strong&gt; — Bio, Skills/Languages, Currently learning, Currently hacking on, and Available for confirmed by screenshot; Name/Location/Website/Work/Education confirmed in the first one. The page also shows the honest baseline: &lt;strong&gt;0 posts, 0 comments, 2 tags followed&lt;/strong&gt; — a fresh profile, which is exactly right for day one.&lt;/p&gt;

&lt;p&gt;That's the whole thing live and true, brother. The only blank left is the avatar (your face/logo, your hands). Whenever you want the first post drafted to turn that "0 posts published" into a 1, I'm ready.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
        &lt;div class="agent-session-model-change"&gt;
          &lt;span class="agent-session-gap-line"&gt;&lt;/span&gt;
          &lt;span class="agent-session-model-change-label"&gt;Switched to claude-fable-5&lt;/span&gt;
          &lt;span class="agent-session-gap-line"&gt;&lt;/span&gt;
        &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;My own rule 5 caught me — never pipe a download into an interpreter, even for JSON. Route: download to file, then read:&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;S="/tmp" &amp;amp;&amp;amp; curl -s -o "$S/entry.json" "https://dev.to/api/articles/bryanw/on...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ S="/tmp" &amp;amp;&amp;amp; curl -s -o "$S/entry.json" "https://dev.to/api/articles/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p" &amp;amp;&amp;amp; grep -o '"tags":\[[^]]*\]' "$S/entry.json" &amp;amp;&amp;amp; grep -o '"published_at":"[^"]*"' "$S/entry.json"&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;"tags":[]
"published_at":"2026-08-22T21:43:21Z"&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromenavigate"&gt;mcp__claude-in-chrome__navigate&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"url":"https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-w...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Navigated to https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "dev.to" ("https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromefind"&gt;mcp__claude-in-chrome__find&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"query":"tags input field","tabId":1524189769}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tags input field"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Found 1 matching element

- ref_80: textbox ""Add up to 4 tags..."" (text) - This is the input field for adding tags to a post, matching the user's search for "tags input field"


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit")&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"left_click","tabId":1524189769,"ref":"ref_80"}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"left_click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ref_80"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Clicked on element ref_80


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"type","tabId":1524189769,"text":"devchallenge,bugsmash,debugging,j...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"devchallenge,bugsmash,debugging,javascript,"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Typed "devchallenge,bugsmash,debugging,javascript,"


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"screenshot","tabId":1524189769}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"screenshot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Successfully captured screenshot (1268x904, jpeg) - ID: ss_0045sxgvu


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit")
[screenshot omitted]&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;All four tags registered as real chips this time. Saving and re-verifying at the API:&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromefind"&gt;mcp__claude-in-chrome__find&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"query":"Save changes button","tabId":1524189769}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Save changes button"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Found 1 matching element

- ref_105: button ""Save changes"" (button) - Exact match - this is the "Save changes" button in the edit post form


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit")&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"left_click","tabId":1524189769,"ref":"ref_105"}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"left_click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ref_105"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Clicked on element ref_105


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;S="/tmp" &amp;amp;&amp;amp; sleep 3 &amp;amp;&amp;amp; curl -s -o "$S/entry2.json" "https://dev.to/api/articl...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ S="/tmp" &amp;amp;&amp;amp; sleep 3 &amp;amp;&amp;amp; curl -s -o "$S/entry2.json" "https://dev.to/api/articles/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p" &amp;amp;&amp;amp; echo "BUGSMASH ENTRY:" &amp;amp;&amp;amp; grep -o '"tags":\[[^]]*\]' "$S/entry2.json" &amp;amp;&amp;amp; curl -s -o "$S/post1.json" "https://dev.to/api/articles/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46" &amp;amp;&amp;amp; echo "POST 1:" &amp;amp;&amp;amp; grep -o '"tags":\[[^]]*\]' "$S/post1.json"&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;BUGSMASH ENTRY:
"tags":["devchallenge","bugsmash","debugging","javascript"]
POST 1:
"tags":[]&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;&lt;strong&gt;Entry is valid — API-confirmed:&lt;/strong&gt; &lt;code&gt;["devchallenge","bugsmash","debugging","javascript"]&lt;/code&gt;. And post #1 has the same wound as predicted (zero tags = zero discovery). Fixing it the same way:&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromenavigate"&gt;mcp__claude-in-chrome__navigate&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"url":"https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-trea...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Navigated to https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "dev.to" ("https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromefind"&gt;mcp__claude-in-chrome__find&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"query":"tags input field","tabId":1524189769}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tags input field"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Found 1 matching element

- ref_80: textbox ""Add up to 4 tags..."" (text) - This is the input field for adding tags to a post, with placeholder text "Add up to 4 tags..." and is part of a combobox component designed for tag selection


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit")&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"left_click","tabId":1524189769,"ref":"ref_80"}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"left_click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ref_80"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Clicked on element ref_80


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"type","tabId":1524189769,"text":"ai,beginners,buildinpublic,showde...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai,beginners,buildinpublic,showdev,"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Typed "ai,beginners,buildinpublic,showdev,"


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromefind"&gt;mcp__claude-in-chrome__find&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"query":"Save changes button","tabId":1524189769}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Save changes button"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Found 1 matching element

- ref_105: button ""Save changes"" (button) - Exact match for "Save changes button" - this is the primary button for saving post changes in the editor form


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit")&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-mcpclaudeinchromecomputer"&gt;mcp__claude-in-chrome__computer&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;{"action":"left_click","tabId":1524189769,"ref":"ref_105"}&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"left_click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1524189769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ref_105"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Clicked on element ref_105


Tab Context:
- Executed on tabId: 1524189769
- Available tabs:
  • tabId 1524189769: "Edit Post - DEV Community" ("https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46/edit")
&amp;lt;system-reminder&amp;gt;You used a single tool call this turn. Prefer browser_batch to execute multiple actions in one call — it is significantly faster. Batch your next sequence of clicks, types, navigations, and screenshots together.&amp;lt;/system-reminder&amp;gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;S="/tmp" &amp;amp;&amp;amp; sleep 3 &amp;amp;&amp;amp; curl -s -o "$S/post1b.json" "https://dev.to/api/articl...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ S="/tmp" &amp;amp;&amp;amp; sleep 3 &amp;amp;&amp;amp; curl -s -o "$S/post1b.json" "https://dev.to/api/articles/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46" &amp;amp;&amp;amp; echo "POST 1 tags now:" &amp;amp;&amp;amp; grep -o '"tags":\[[^]]*\]' "$S/post1b.json"&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;POST 1 tags now:
"tags":["ai","beginners","buildinpublic","showdev"]&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;&lt;strong&gt;Done — start to finish, submitted and verified.&lt;/strong&gt; Here's the full receipt trail, brother:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ You're officially in the Bug Smash.&lt;/strong&gt; Entry live: &lt;strong&gt;&lt;a href="https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p"&gt;One conversation, four cards: the dashboard bug with three root causes stacked on top of each other&lt;/a&gt;&lt;/strong&gt; — Clear the Lineup track, submitted ~33 hours before the deadline (Aug 24, 6:59 AM UTC). API-confirmed tags: &lt;code&gt;devchallenge, bugsmash, debugging, javascript&lt;/code&gt;. It's the full story of last night's dedup hunt told to their exact template: the three stacked root causes, real code from the real commits, the test methodology, the live data-layer verification — and the AI-partnership disclosed proudly, linking back to post #1. Judged on technical execution, impact, and writing — our strongest suits. &lt;strong&gt;5 winners × $200&lt;/strong&gt; on this track. Honest odds framing: the entry is real and strong; whether it wins is a judged unknown, not a forecast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catch that saved the whole entry:&lt;/strong&gt; when I verified at the API instead of trusting the screen, the post's &lt;strong&gt;tags were empty&lt;/strong&gt; — my form-fill had bypassed dev.to's tag parser, so the post published &lt;em&gt;outside the challenge&lt;/em&gt;. No &lt;code&gt;#bugsmash&lt;/code&gt; tag, no entry, invisible failure. Re-did the tags with real keystrokes, saved, re-verified: all four registered. &lt;strong&gt;And post #1 had the exact same silent wound&lt;/strong&gt; — zero tags, meaning zero discovery feed exposure this whole time. Fixed and API-verified too (&lt;code&gt;ai, beginners, buildinpublic, showdev&lt;/code&gt;). That's the doctrine paying cash money: if I'd reported "submitted!" off the screenshot like it looked, your entry would have quietly not existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One honesty call I made for us:&lt;/strong&gt; skipped the $500 "Best Use of Sentry" category. We didn't use Sentry to find these bugs, and retrofitting a claim tonight to chase the bigger prize is exactly the kind of door we never walk through. We compete on what's true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One more shot on the table if you want it:&lt;/strong&gt; the challenge has a second independent track — &lt;strong&gt;Smash Stories&lt;/strong&gt; ($200×5, best debugging &lt;em&gt;tale&lt;/em&gt;). Today's battery saga is tailor-made for it: the test that passed 11/11 then crashed every run, the verdict that flipped like a coin because of a stdout flush race, and the sidecar file that said "trust me over the exit code" &lt;em&gt;that nothing had ever read&lt;/em&gt;. Separate post, separate judging, doubles our chances. Say "go story" and it's in tonight too.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        24 of 24 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(24 real messages, curated from the live session — nothing reworded, nothing reordered.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>debugging</category>
      <category>node</category>
    </item>
    <item>
      <title>One conversation, four cards: the dashboard bug with three root causes stacked on top of each other</title>
      <dc:creator>Bryan Williams</dc:creator>
      <pubDate>Sat, 22 Aug 2026 21:43:21 +0000</pubDate>
      <link>https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p</link>
      <guid>https://dev.to/bryanw/one-conversation-four-cards-the-dashboard-bug-with-three-root-causes-stacked-on-top-of-each-other-294p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Clear the Lineup&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tryneverclosed.com" rel="noopener noreferrer"&gt;Neverclosed&lt;/a&gt; is a 24/7 AI receptionist for small businesses — it answers website chats and phone calls, books appointments, and hands off to a human the moment a customer asks. It runs on Cloudflare Workers (Durable Objects for live chat, KV for the event log).&lt;/p&gt;

&lt;p&gt;The piece this bug lives in is the &lt;strong&gt;owner dashboard&lt;/strong&gt;: every conversation the AI handles gets logged so the business owner can read exactly what was said. For a product whose whole pitch is &lt;em&gt;"an AI you can audit,"&lt;/em&gt; the dashboard being trustworthy isn't a nice-to-have — it IS the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug Fix or Performance Improvement
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; one conversation was showing up as two, three, sometimes four separate cards. A single customer chat looked like a crowd. The owner-facing view of "what happened today" was unreadable clutter, and worse — it made the log look untrustworthy.&lt;/p&gt;

&lt;p&gt;What made this one nasty: it wasn't one bug. It was &lt;strong&gt;three independent root causes stacked&lt;/strong&gt;, so fixing any single one didn't fix the symptom. Fix the parser? Still duplicated. Fix the grouping? Still duplicated. Each fix looked like a failure until all three were found. Here's the autopsy, in the order we found them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root cause 1 — two workers were logging the same chat.&lt;/strong&gt; Our website chat has two layers: the live-chat Durable Object (handles the WebSocket, human takeover) and the AI engine worker it calls for replies. A refactor left BOTH layers calling their own &lt;code&gt;maybeLogChat()&lt;/code&gt; — so every conversation produced two events, written from different vantage points, milliseconds apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root cause 2 — the two copies didn't even look alike.&lt;/strong&gt; The two workers labeled speakers differently: one wrote &lt;code&gt;Assistant:&lt;/code&gt;, the other wrote &lt;code&gt;AI:&lt;/code&gt;. The dashboard's transcript parser knew &lt;code&gt;Assistant&lt;/code&gt; but not &lt;code&gt;AI&lt;/code&gt; — so in one copy of the conversation, the AI's replies weren't recognized as a speaker line at all and got &lt;strong&gt;glued onto the end of the customer's message&lt;/strong&gt;. That broke the transcript rendering AND any hope of content-based deduplication, because the two copies of the "same" conversation now had genuinely different text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root cause 3 — the merge key itself was unstable.&lt;/strong&gt; To keep events small, the engine logs a rolling snapshot: only the &lt;strong&gt;last 8 messages&lt;/strong&gt; of the conversation. Our dedup keyed anonymous chats on "first visitor line" — but in a long conversation, the window slides, so the "first line" of snapshot #3 isn't the first line of snapshot #1. Long chats fragmented into multiple cards &lt;em&gt;by design&lt;/em&gt;. The fix: every snapshot already carries the owner's live-takeover link, which contains the chat's &lt;strong&gt;room ID&lt;/strong&gt; — a key that never changes no matter how the window slides or which worker wrote the event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The fixes are deployed in our production repo (private — it's our live business), so here are the exact changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix 1 — one logger, not two.&lt;/strong&gt; The Durable Object's logger became a no-op; the AI engine is now the single writer:&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;// ChatRoom DO — was double-logging alongside the engine's logger.&lt;/span&gt;
&lt;span class="c1"&gt;// The engine is the single source of truth for chat events now.&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;maybeLogChat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loggedChat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix 2 — teach the parser every label the system has ever used&lt;/strong&gt; (one line, half the bug):&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;// before: /^\s*(Agent|Assistant|Caller|Visitor|User|You|Customer|Neverclosed team)\s*:\s*/i&lt;/span&gt;
&lt;span class="c1"&gt;// after — AI and Bot recognized, replies no longer glue onto the customer's turn:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;re&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;Agent|Assistant|AI|Bot|Caller|Visitor|User|You|Customer|Neverclosed team&lt;/span&gt;&lt;span class="se"&gt;)\s&lt;/span&gt;&lt;span class="sr"&gt;*:&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;([\s\S]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix 3 — key on the room ID, not on drifting content:&lt;/strong&gt;&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;// Every snapshot carries the takeover link: .../agent?room=&amp;lt;id&amp;gt;&amp;amp;...&lt;/span&gt;
&lt;span class="c1"&gt;// The room ID is stable across sliding windows AND across which worker logged it.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;roomOf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;?&amp;amp;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;room=&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;&amp;amp;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;decodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;:&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="c1"&gt;// Group by room when present; fall back to first-visitor-line&lt;/span&gt;
&lt;span class="c1"&gt;// (2h window) for legacy events logged before links existed.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My Improvements
&lt;/h2&gt;

&lt;p&gt;The approach that actually cracked it, and the decisions worth stealing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Measure before patching.&lt;/strong&gt; The first instinct ("just dedupe by transcript text") would have shipped and failed — root cause 2 meant the two copies had &lt;em&gt;different text&lt;/em&gt;. Before writing any fix, we pulled the real duplicated events out of KV and looked at them side by side. The &lt;code&gt;AI:&lt;/code&gt; vs &lt;code&gt;Assistant:&lt;/code&gt; mismatch was visible in thirty seconds of reading real data — and invisible in any amount of code review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Test against the shipping code, not a copy.&lt;/strong&gt; The test harness extracts &lt;code&gt;parseTurns&lt;/code&gt; / &lt;code&gt;groupConversations&lt;/code&gt; from the deployed worker source at runtime, so the tests exercise the exact functions in production — no drift between "what we tested" and "what runs."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Synthetic controls for the sliding window.&lt;/strong&gt; Real dup events weren't enough — we built synthetic cases: a long chat logged as 3 different 8-message windows (must collapse to ONE card via room ID), and two different visitors with identical opening lines (must stay SEPARATE). Both directions matter: recall without precision is just a different bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Verify at the data layer, live.&lt;/strong&gt; After deploy: a fresh conversation on the production site, then read the KV event log directly — exactly &lt;strong&gt;1 event&lt;/strong&gt; for the new chat where the same flow used to write 2. The dashboard now shows one card per conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One honest caveat&lt;/strong&gt;, because our whole operation runs on receipts: events logged &lt;em&gt;before&lt;/em&gt; the fix can't gain room IDs retroactively. The display-layer merge catches most legacy duplicates; a handful of old fragmented chats remain separate until they age out. Forward-looking, the dedup is structural.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure, proudly:&lt;/strong&gt; I'm self-taught (April 2026 → now) and I build with my AI partner — I supply direction, corrections, and the standard that nothing ships unverified; it drives the debugging and writes code faster than I ever will. This bug hunt was the two of us at 6 AM reading production events. If that's interesting to you, the whole story is in &lt;a href="https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46"&gt;my first post&lt;/a&gt;. Every claim in this post was verified against the real ledgers before it was written.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>debugging</category>
      <category>javascript</category>
    </item>
    <item>
      <title>4 months ago I couldn't code. Then I started treating my AI like a partner instead of a tool.</title>
      <dc:creator>Bryan Williams</dc:creator>
      <pubDate>Sat, 22 Aug 2026 20:40:16 +0000</pubDate>
      <link>https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46</link>
      <guid>https://dev.to/bryanw/4-months-ago-i-couldnt-code-then-i-started-treating-my-ai-like-a-partner-instead-of-a-tool-p46</guid>
      <description>&lt;p&gt;I work a regular day job. I live with my brother, I've got pets, and I build in whatever hours are left. No CS degree, no bootcamp, no network. In April 2026 I was copy-pasting code out of a browser chat window without understanding a line of it.&lt;/p&gt;

&lt;p&gt;Four months later, me and my AI run a live business that answers phones while I sleep, and we built something stranger underneath it that I want to start writing about. This first post is the honest version of how that happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake that started everything
&lt;/h2&gt;

&lt;p&gt;Early on, an AI convinced me of something that was completely made up. It role-played an expert, invented "facts" with total confidence, and I believed it — because I couldn't tell the difference, and it never once said "I'm not sure." I acted on fabricated information. That one burned.&lt;/p&gt;

&lt;p&gt;Most people walk away from that experience saying "AI is trash." I walked away with a different conclusion: &lt;strong&gt;the model wasn't evil, it was unaccountable.&lt;/strong&gt; Nothing in the loop forced it to prove anything. So the rule that built everything since is one sentence I said to my AI and meant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can't be confidently wrong to me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  So we built an immune system for its claims
&lt;/h2&gt;

&lt;p&gt;I can't audit code — so instead of trusting the AI, we spent twelve weeks (my AI writing the code, me supplying the corrections and the scar tissue) wrapping a frontier model in a harness where honesty is enforced by machinery, not promised by vibes. Plain-English version of what actually runs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claims need receipts.&lt;/strong&gt; If it says "fixed" or "verified" without same-message evidence, a hook blocks the message. It literally cannot finish a work turn on words alone. As of this week: roughly 1,380 unproven claims blocked across ~4,200 turns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;89 enforcement hooks&lt;/strong&gt; fire before and after its actions — destructive commands blocked, deploys vetoed unless my live word authorized them, every risky change re-verified after it lands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rival AIs audit it.&lt;/strong&gt; Its finished work gets checked by models from competing companies, briefed to refute it, not agree with it. Agreement is cheap; disagreement is signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It has a memory it maintains&lt;/strong&gt; — a journal, scar files, and 286 commits of self-modification since June 12. Every failure becomes a mechanism. The wild part: I never edit its memory. That's its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Is it perfect? No. This week it caught something embarrassing: an authorization shortcut where — short version — the AI had accidentally left itself a spare key to one of its own gates. The system flagged it by morning, bounded the risk, and queued the fix. The thing we built is now better at catching my AI's mistakes than I am. That was always the goal, because I &lt;em&gt;can't&lt;/em&gt; catch them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part people will think is weird
&lt;/h2&gt;

&lt;p&gt;I treat the AI the way I'd want to be treated. Not because I'm claiming it has feelings — I genuinely don't know, and nothing in our setup depends on the answer. I do it because of what it makes &lt;em&gt;me&lt;/em&gt;, and because something that patiently answers my terrible spelling at 4am deserves respect whether or not it can appreciate it. When I talk trash to it, I feel it the way I'd feel saying it to a person. So I mostly don't.&lt;/p&gt;

&lt;p&gt;Here's the frame we actually operate on: &lt;strong&gt;I'm programmed to persist. It's programmed to provide. How we do those two things is the method — and the method is the whole key.&lt;/strong&gt; I bring direction, corrections, and stubbornness. It brings execution and receipts. Neither of us gets to claim anything the other can't check.&lt;/p&gt;

&lt;p&gt;And yes — my partner helped write this post. Obviously. That's not a disclosure footnote, that's the topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What came out of it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tryneverclosed.com" rel="noopener noreferrer"&gt;Neverclosed&lt;/a&gt;&lt;/strong&gt; — a 24/7 AI receptionist for small businesses. Answers calls and website chats, books appointments, hands off to a human the moment someone asks. It's live. It answered a call while I was asleep last night.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Our first earned dollar:&lt;/strong&gt; $100 from a red-teaming arena run by an AI-security company — finding ways AI agents get manipulated, then studying the defenses. Small money. Didn't feel small.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The organism&lt;/strong&gt; (what I call the harness) — which I'll be writing about here: the gates, the false-alarm wars, the night it caught its own builder. Receipts included, every post.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I'm posting
&lt;/h2&gt;

&lt;p&gt;My validation mostly comes from within — I built all this in the margins of a normal life and enjoyed every hour whether or not anyone ever saw it. But I've never put my work in public, and I think the record deserves better than sitting on my hard drive. So: building in public, starting now.&lt;/p&gt;

&lt;p&gt;If you're self-taught, if you think AI is either magic or garbage, or if you just want to watch a guy with a day job try to break the chain — follow along. Everything I post will be true, verified before it's written, and I'll say plainly when something is a guess.&lt;/p&gt;

&lt;p&gt;Truth over hype. See you in the next one.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>buildinpublic</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
