<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Ramp Labs]]></title><description><![CDATA[The Home for AI Experiments at Ramp]]></description><link>https://ramplabs.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!390t!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95aaaf15-2fe5-43af-b9b7-148c0717bbee_400x400.png</url><title>Ramp Labs</title><link>https://ramplabs.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 15 Aug 2026 09:38:42 GMT</lastBuildDate><atom:link href="https://ramplabs.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ramp Labs]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[ramplabs@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[ramplabs@substack.com]]></itunes:email><itunes:name><![CDATA[Ramp Labs]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ramp Labs]]></itunes:author><googleplay:owner><![CDATA[ramplabs@substack.com]]></googleplay:owner><googleplay:email><![CDATA[ramplabs@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ramp Labs]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Our 10,000-user app has one AI monitor for every 75 lines of code]]></title><description><![CDATA[We built an agentic system to maintain Ramp Sheets. It continuously monitors production, triages alerts, and proposes fixes without human intervention. The system runs on a thousand AI-generated monitors, one for every 75 lines of code.]]></description><link>https://ramplabs.substack.com/p/self-maintaining</link><guid isPermaLink="false">https://ramplabs.substack.com/p/self-maintaining</guid><dc:creator><![CDATA[Alex Levinson]]></dc:creator><pubDate>Tue, 24 Mar 2026 15:31:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c316ae40-f250-4b55-8281-9fd3623ffb9a_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We built an agentic system to maintain <a href="https://labs.ramp.com/sheets">Ramp Sheets</a>. It continuously monitors production, triages alerts, and proposes fixes without human intervention (although no code is merged without engineer review). The system runs on a thousand AI-generated monitors, one for every 75 lines of code.</p><p>We built this because:</p><ul><li><p>Agents are cheap to run, infinitely patient, and easy to parallelize. These properties make exhaustive monitoring feasible at production scale.</p></li><li><p>Teams hate owning observability, ourselves included. Offloading this grunt work to an agent lets us <a href="https://agents.ramp.com/cards">ship faster</a>.</p></li><li><p>Strong observability and QA mean fewer bugs, less downtime, and a better experience for Ramp customers.</p></li></ul><h2><strong>Ramp Inspect</strong></h2><p>We chose to build our maintenance system using <a href="https://builders.ramp.com/post/why-we-built-our-background-agent">Ramp Inspect</a>, our internal background coding agent. Each Inspect session spins up a full sandboxed dev environment, allowing the agent to make real API requests, run tests, and reproduce bugs end-to-end against live code. This interactivity is critical, as subtle failure modes are rarely apparent from static code review.</p><h2><strong>Scheduled auditing</strong></h2><p>Our first attempt at self-maintenance took the form of a scheduled agentic review. Every night, we automatically spun up an agent to run a QA pass on Ramp Sheets, instructed to:</p><ul><li><p>Sanity-test core features</p></li><li><p>Stress-test recently merged PRs</p></li><li><p>Probe existing functionality for latent bugs</p></li></ul><p>This design worked well, and surfaced several real production bugs every day. Further, we designed the workflow to be a system of action: If the agent found a real issue, it would put up a PR to address the root cause. More than once, an engineer shipped a feature with a bug they hadn&#8217;t noticed; by morning, the agent had caught the regression and pushed a fix.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qud8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qud8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Qud8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Qud8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Qud8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qud8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg" width="1200" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136741,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/191990059?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Qud8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Qud8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Qud8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Qud8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1716c9f-ebd9-48f0-9e10-e9dc7fca85ca_1200x970.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Our QA agent finds a race condition in Sheets&#8217; streaming architecture and puts up a fix.</figcaption></figure></div><p>However, the nightly agent had serious limitations. With no specific mission, the agent always progressed down the same paths in its QA workflow, reading the same files, investigating the same features, running the same tests. While this pattern proved effective at finding high-radius issues, it could not catch narrow, situational bugs.</p><p>Although Ramp Sheets is extensively instrumented on Datadog, our unfocused QA agent struggled to extract nuanced insights from the telemetry. Current frontier models are very capable at a wide range of software engineering tasks, but they cannot synthesize a large codebase with a large observability surface and determine what needs attention. Prioritization at production scale requires a level of intelligence surpassing that of any model available today.</p><h2><strong>Monitor-driven maintenance</strong></h2><p>For our next iteration, we used Datadog monitors to direct the agent at specific production issues. These monitors watch metrics and log patterns, firing alerts on error rate spikes, latency regressions, or other deviations from expected behavior. The system works in two steps:</p><ul><li><p>On PR merge, an agent reads the diff and generates monitors instrumenting the new code.</p></li><li><p>When a monitor fires, a <a href="https://docs.datadoghq.com/integrations/webhooks/">Datadog webhook</a> kicks off a new agent with the alert context. The agent reproduces the issue in its sandbox, pushes a fix, and notifies us on Slack.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pdh2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pdh2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Pdh2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Pdh2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Pdh2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pdh2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg" width="1199" height="569" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:569,&quot;width&quot;:1199,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53965,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/191990059?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pdh2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Pdh2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Pdh2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Pdh2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5253bfa0-2c94-4a10-a244-09189ab813bf_1199x569.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Agent-generated monitors are specific and sophisticated. This composite monitor combines signals from Ramp Sheets&#8217; backend and SSE queue, alerting when agent activity diverges from broadcasted event throughput.</figcaption></figure></div><p>This pattern allows us to detect and respond to incidents with remarkable speed and granularity. In its first week, the system caught 40 real bugs, each within minutes of a user triggering the issue. In one instance, a user uploaded a spreadsheet with a unique type of embedded image that our existing logic could not handle; the resulting exception set off a monitor and moments later, the agent had alerted us with a fix ready. In another case, an internal user Slacked us about a broken feature - but our system had already flagged the exact issue before his message even landed.</p><h2><strong>Filtering the noise</strong></h2><p>The major weakness in this approach was noise. Auto-generated monitors have bad thresholds. Routine user activity triggered a cascade of alerts, most of them false positives. Further, monitors fired repeatedly for the same issue, flooding Slack with duplicate notifications.</p><p>To filter the noise, we added a triage step. On every alert, the agent first assesses the scope of the problem:</p><ul><li><p>If it&#8217;s a real issue, the agent pushes a fix and posts to Slack.</p></li><li><p>If it&#8217;s noise, the agent tunes or deletes the monitor.</p></li></ul><p>To guard against duplicate alerts, we store state on the monitor itself. When an agent pushes a fix, it appends the PR link to the monitor description. Subsequent agents see the link and stand down.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rZy7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rZy7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 424w, https://substackcdn.com/image/fetch/$s_!rZy7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 848w, https://substackcdn.com/image/fetch/$s_!rZy7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 1272w, https://substackcdn.com/image/fetch/$s_!rZy7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rZy7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png" width="1200" height="689" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:689,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22349,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/191990059?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rZy7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 424w, https://substackcdn.com/image/fetch/$s_!rZy7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 848w, https://substackcdn.com/image/fetch/$s_!rZy7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 1272w, https://substackcdn.com/image/fetch/$s_!rZy7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72838ee9-d8f0-41a4-b1f2-241c7b544b3f_1200x689.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>The upshot</strong></h2><p>In a few weeks, we scaled Ramp Sheets from ten hand-written monitors to over a thousand, one for every 75 lines of code. Our manual monitors were broad-strokes: alert when the frontend crashes, or when an API call times out. The AI-generated ones are far more granular, acting like a tight mesh over the exact shape of the code; whenever that shape drifts from the expected, we are notified.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ul87!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ul87!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 424w, https://substackcdn.com/image/fetch/$s_!Ul87!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 848w, https://substackcdn.com/image/fetch/$s_!Ul87!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!Ul87!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ul87!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png" width="1456" height="582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:582,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:614012,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/191990059?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ul87!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 424w, https://substackcdn.com/image/fetch/$s_!Ul87!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 848w, https://substackcdn.com/image/fetch/$s_!Ul87!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!Ul87!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd52f988f-14bd-47ba-a53d-d76fda85f510_4000x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>What we learned</strong></h2><p><strong>Detect everything, notify selectively.</strong> The system should watch every signal, but each alert that reaches a human should mean something. Teams ignore noisy monitors, and they&#8217;ll ignore noisy agents too.</p><p><strong>Delegate to the agent.</strong> Let it scope out the problem, judge impact, make changes, and filter out noise. It&#8217;s very good at this, and will get better as models improve.</p><p><strong>Sandboxed reproduction improves results.</strong> In our system, the agent reproduces the failure against live code and only pushes a fix once that reproduction test passes. This pattern ensures that the issue is real, and that the agent&#8217;s proposed fix works in practice.</p><p><strong>Model choice matters.</strong> Although the GPT-5 model series are very thorough debuggers, we found Opus 4.6 was a more accurate triage evaluator, and specifically better at filtering out noisy alerts.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m9mg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m9mg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 424w, https://substackcdn.com/image/fetch/$s_!m9mg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 848w, https://substackcdn.com/image/fetch/$s_!m9mg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!m9mg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m9mg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg" width="1200" height="695" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:695,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48553,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/191990059?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!m9mg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 424w, https://substackcdn.com/image/fetch/$s_!m9mg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 848w, https://substackcdn.com/image/fetch/$s_!m9mg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!m9mg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79391ad-2db8-48a8-9800-b48edde93197_1200x695.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Tight observability breeds customer empathy.</strong> When every slow load or bad output fires a notification, the team feels the product the same way users do. We caught bugs we never would have prioritized on our own.</p><p><strong>Keep your existing stack.</strong> Auto-generated monitors are powerful but opaque, and not yet reliable enough to be your only line of defense. When things go seriously wrong, you still want instrumentation you wrote and trust. As models improve, that will change.</p><div><hr></div><p>Want to keep up with our next AI experiments? Subscribe here and follow us on <a href="https://x.com/@RampLabs">@RampLabs</a>. We&#8217;re also <a href="https://jobs.ashbyhq.com/ramp?utm_source=RampLabs">hiring across roles</a> at Ramp.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramplabs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://ramplabs.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[We Put Claude Code in RollerCoaster Tycoon]]></title><description><![CDATA[We let AI play RollerCoaster Tycoon. It&#8217;s hiring mechanics, building rides, managing the budget, and filing CFO reports.]]></description><link>https://ramplabs.substack.com/p/ai-plays-rollercoaster-tycoon</link><guid isPermaLink="false">https://ramplabs.substack.com/p/ai-plays-rollercoaster-tycoon</guid><dc:creator><![CDATA[Jay Sobel]]></dc:creator><pubDate>Mon, 22 Dec 2025 21:34:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!N3Sw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N3Sw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N3Sw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 424w, https://substackcdn.com/image/fetch/$s_!N3Sw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 848w, https://substackcdn.com/image/fetch/$s_!N3Sw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 1272w, https://substackcdn.com/image/fetch/$s_!N3Sw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N3Sw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9591577,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/182358577?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N3Sw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 424w, https://substackcdn.com/image/fetch/$s_!N3Sw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 848w, https://substackcdn.com/image/fetch/$s_!N3Sw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 1272w, https://substackcdn.com/image/fetch/$s_!N3Sw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bab6b16-7846-409e-aeab-3c8ec7463da7_3456x1944.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Watch Claude Code inside RollerCoaster Tycoon on Youtube.</p><div id="youtube2-CaFBNIH1gS4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;CaFBNIH1gS4&quot;,&quot;startTime&quot;:&quot;1104s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/CaFBNIH1gS4?start=1104s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>The park rating is climbing. Your flagship coaster is printing money. Guests are happy, for now. But you know what&#8217;s coming: the inevitable cascade of breakdowns, the trash piling up by the exits, the queue times spiraling out of control. You could stay glued to the screen, frantically clicking through management windows. Or you could let an AI agent take the wheel.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramplabs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In a terminal window in the corner of the screen, Claude Code springs to life. It scans 100 data points you haven&#8217;t had time to read: park financials, ride breakdowns, guest complaints about bathroom lines. Within seconds, it compiles a task list: build more Drink Stalls near high-traffic areas, hire mechanics before the coasters start failing, and raise the park entrance fee while satisfaction is high.</p><p>In this article we&#8217;ll tell you why we decided to put Claude Code into RollerCoaster Tycoon, and what lessons it taught us about B2B SaaS.</p><h3>Why Rollercoaster Tycoon?</h3><p>At Ramp, we&#8217;re building agents across product surfaces and internal operations. Our current approach is small multiples: task-specific agents with tightly scoped system access. This is a security posture as well as an optimization around the current limits of agent intelligence and context windows.</p><p>But with each task-specific agent we build, there&#8217;s a Promethean urge to create the One Agent with unfettered access to everything. It&#8217;s still too early to build this way, but the latest models are pushing this limit; it&#8217;s increasingly a security and integrations issue, not an agent limitation. This is why now is the perfect time to start experimenting with broadly scoped agents in toy environments.</p><p>There&#8217;s plenty of precedent for AI experimentation in videogames; from DeepMind&#8217;s work in Atari games and StarCraft to more recent demos in Minecraft and Pokemon. But each of these games is a poor representation of the kind of environment Ramp and our customers exist in. Minecraft is an open sandbox lacking any capitalist structure. Pokemon is about a child too young to open an LLC or apply for a credit card. StarCraft incorporates economics, competition and workforce management, but it&#8217;s not very customer-centric.</p><p>Ramp needed a game that closely approximates customer-centric business operations and SaaS-powered digital feedback loops. There was simply no other choice. We had to put Claude Code in RollerCoaster Tycoon.</p><p>A common misconception about RollerCoaster Tycoon is that it is first and foremost a game about &#8220;rollercoaster game&#8221;. In reality, the rollercoasters often fade into the background of a sea of park management windows. The game is a Montessori play kit of B2B SaaS interfaces.</p><p>And the vibes match is perfect; coding agents like Claude Code, in their humble terminal windows, convey a retro-futurism and Claude in particular brings serious playfulness. It&#8217;s a great agent to send back in time so that we can begin to understand how to re-write two decades of business software.</p><h3>What Claude Can (and Can&#8217;t) Do</h3><p>OpenRCT2 is an open-source re-implementation of RollerCoaster Tycoon 2. We forked the project to add a new kind of window into the game; a terminal running Claude Code.</p><p>In order for Claude Code to play the game, we had to create an expansive CLI covering all the actions the user has available in the game, from reviewing guest feedback to changing umbrella prices and everything in between, The CLI is called rctctl and follows the patterns and conventions of kubectl, the expansive CLI behind Kubernetes, one of the most complicated pieces of software ever created.</p><p>The CLI replicates every important data point, control and action the user has available, plus some additional commands to review park tiles.</p><p>In place of &#8216;seeing&#8217; the map, Claude can request ASCII grid print-outs of the map at multiple levels of granularity, from &#8216;hot regions&#8217; to tile grids, to single tiles.</p><p>Here&#8217;s an example of a dense region of the park.</p><pre><code>$ rctctl map area --x 44 --y 38

Map Area
--------
Anchor       : (44, 38) top-left
Span         : 16x16 tiles
    X:44 45 46 47 48 49 50 51 52 53 54
Y 38   R  P  P  P  P  .  .  E  E  .  T
  39   P  P  .  S  P  S  T  P  Q  S  .
  40   P  R  S  R  P  P  .  P  Q  S  .
  41   P  S  S  S  .  P  P  P  P  P  P
  42   P  .  S  S  S  P  .  .  .  .  .
  43   P  S  T  T  S  P  .  .  .  .  .
  44   P  S  S  S  S  P  .  .  .  .  R
  45   P  .  R  R  R  R  R  R  R  R  R
  46   P  R  R  R  P  P  P  P  P  P  P
  47   R  R  R  S  Q  Q  S  Q  Q  Q  Q
  48   R  R  S  S  E  Q  Q  Q  Q  Q  Q

Legend
------
 - R = Ride track/support
 - P = Footpath
 - . = Owned ground
 - E = Ride or park entrance
 - T = Tree or foliage
 - Q = Queue path
 - S = Scenery/building</code></pre><p>So Claude is at a pretty steep visuo-spatial disadvantage, and this is most of the intuition you&#8217;ll need to appreciate Claude&#8217;s relative strengths and weaknesses in the game.</p><p><strong>Where Claude excels:</strong></p><p><strong>Game knowledge.</strong> Claude is surprisingly familiar with all things RCT, and also completely unfazed by the premise that it has been &#8216;hacked into&#8217; a late-90&#8217;s computer game. This was surprising, but fits with Claude&#8217;s playful personality and flexible disposition.</p><p><strong>Gathering information.</strong> Claude excels at trawling through the game&#8217;s diverse metrics and observability features. Claude switches between empathizing with aggregate guest thoughts and scrutinizing ride financials. It&#8217;s great at creating insightful reports with specific recommendations.</p><p><strong>Pulling Digital Levers.</strong> Claude is rock solid at adjusting configurations. Opening and closing rides, setting prices, hiring staff (which are automatically placed in RCT2), and starting marketing campaigns. These actions don&#8217;t require spatial reasoning, and they&#8217;re most similar to traditional CLI operations.</p><p><strong>Placing Shops/Stalls and Flat Rides.</strong> Nearing the edge of Claude&#8217;s in-game competencies are tasks that require a basic spatial understanding of the park. Even finding main pathways can take several iterative steps and cumulative reasoning. Claude can reliably place Bathrooms, Drink Stalls and other stalls. It can even take a swing at flat rides like the Carousel which requires the additional complexities of placing a ride entrance, exit and connective pathways. But flat rides are where things start to feel sketchy and the success rate is closer to 80% with a high risk of small failures with park consequences.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ROKZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ROKZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 424w, https://substackcdn.com/image/fetch/$s_!ROKZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 848w, https://substackcdn.com/image/fetch/$s_!ROKZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 1272w, https://substackcdn.com/image/fetch/$s_!ROKZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ROKZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11382692,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/182358577?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ROKZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 424w, https://substackcdn.com/image/fetch/$s_!ROKZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 848w, https://substackcdn.com/image/fetch/$s_!ROKZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 1272w, https://substackcdn.com/image/fetch/$s_!ROKZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a60342-b55f-4a6f-b144-7c42a30fb26c_3456x1942.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Where Claude struggles:</strong></p><p><strong>Pathways and connections.</strong> Locating main pathways, routing new paths, and connecting ride entrances/exits are all serious challenges for Claude. The added complexities of obstacles like rides, trees, fences, and terrain slopes can quickly combine to overwhelm Claude&#8217;s loose grasp on the spatial reality.</p><p><strong>Roller coasters.</strong> Placing larger pre-built rollercoasters is another heavily visual task in the game. Ride placement requires spatial reasoning at multiple scales, from relative distance to paths, to individual scenery obstacles, and large barrier structures like hills. Claude often gives up on optimal positioning and just flings rides to greenfield territories far away from main paths, and then fails to build the necessary long pathways to connect these endeavors. It&#8217;s an expensive mode of failure, and Claude&#8217;s main obstacle to a full playthrough.</p><p><strong>Verticality.</strong> Claude&#8217;s spatial reasoning in the game is already at its limits in two dimensions. The third spatial dimension of inclined ground, underground construction, and any custom rollercoaster design work is basically out of the question. Unfortunately, this is some of the game&#8217;s richest gameplay.</p><p><strong>The key insight:</strong> The informational interfaces of RollerCoaster Tycoon are extremely clean, and Claude is super sharp with them. The digital levers are well within Claude&#8217;s capability. And Claude is capable of managing park staff and dropping down simple amenities like Drink Stalls, Restrooms, and Benches. Claude falls short on the big moves, like large new coasters and pathway thoroughfares. But these deficits clearly stem from the awkward spatial interface.</p><p>As a mirror to real-world agent design: the limiting factor for general-purpose agents is the legibility of their environments, and the strength of their interfaces. For this reason, we prefer to think of agents as automating diligence, rather than intelligence, for operational challenges.</p><h3>The Build: Modding Claude Code into RCT</h3><p>OpenRCT2 is an open-source re-implementation of RollerCoaster Tycoon 2 in C++, extended with fixes and features for nearly a decade by a passionate community.</p><p>We don&#8217;t know any C++ at all, and we vibe-coded the entire project over a few weeks. The core pieces of the build are&#8230;.</p><ul><li><p>A new menu item in the game&#8217;s menu bar</p></li><li><p>A new window type displaying a terminal mirroring a remote terminal running Claude Code.</p></li><li><p>An expansive CLI (rctctl) that Claude uses to interface with the game.</p></li><li><p>RPC layer to transmit CLI commands into the game state.</p></li><li><p>Tests (or so we think)</p></li></ul><p>We started with a plan from ChatGPT o3-Pro Deep Research (read: ChatGPT on max settings), broke it down into a roadmap with Claude Code, and got to work managing four terminals of Claude Code to execute against the roadmap</p><p>After three hours the build was stuck, so we threw the whole thing away and started over.</p><p>We started the second iteration with Codex on GPT-5.1-codex. We also broke things down into smaller chunks, used careful planning phases, and kept the context above the ~60% remaining level where coding models perform at their absolute best. The only other notable setback came was an accidental use of the word &#8220;revert&#8221; which Codex took literally, and ran git revert on a file where 1-2 hours of progress had been accumulating.</p><p>Keeping all four agents busy took a lot of mental bandwidth. Each implementation phase produces a summary of the work done, and the planning phases output ~500 words. Research tasks produce lots of prose to critically review, and sometimes we couldn&#8217;t remember what the initial questions or work threads were by the time we were reviewing them. The experience overall is less like programming and more like&#8230; a management simulation game. It&#8217;s vaguely addicting. The speed of progress and looseness of focus amplifies the reward of each new feature shipped.</p><p>The full project took ~40 hours over several weeks, which was far more time than we initially expected, but this time included planning, design, and tons of scope creep, all playing out in the terminals. The biggest accelerant to coding progress would have been tighter feedback loops; ways for each coding agent to QA its own work, and not just think that the feature was working as described.</p><h3>Open Issues</h3><p>Like any large vibe coded project, it&#8217;s very hard to tell what works, and what doesn&#8217;t.</p><p>In-game Claude was my diligent playtester, and an integrated bug-report tool let it write bug reports directly into the repo for easy review by coding agents. This feedback loop was invaluable for ironing out help text, inconsistencies in the CLI, and observed bugs.</p><p>It&#8217;s likely that several surfaces have strange or incomplete behaviors. However, at this point, in-game Claude rarely has any bugs to report on, which I take as a moderately reliable signal that the implementation is working.</p><h3>What We Learned</h3><p>Building this project reinforced a few principles we&#8217;ve seen elsewhere in agent development:</p><p><strong>Environment legibility is a key.</strong> Claude thrives with the clean and well-structured omniscience of RCT&#8217;s built-in monitoring and control surfaces, and clearly struggles with text-based renderings of game space. Inventive text-based representations are fun to imagine, but probably impractical in most cases. This is a boundary for many agent tasks, and is probably best tackled with stuff-as-code arrangements rather than simple text-based representations (like chess notations and markdown-mermaid diagrams).</p><p><strong>Coding Agents are a tremendous tailwind; build sails.</strong> By putting &#8216;raw&#8217; Claude Code at the center of the project we automatically and immediately benefited from several Anthropic releases even in the short span of the project. Claude Opus 4.5, fast auto-compaction, custom status lines, and fixes to terminal flickering all came in clutch and &#8216;for free&#8217; (well, not the Opus upgrade).</p><p><strong>Development Loops.</strong> Coding agents thrive on feedback loops where they can prove to themselves that the implementation is complete and correct. This project was hampered by a broken iteration loop in which we had to manually QA the in-game terminal experience and functionality. Vibe coding is slow and frustrating when QA is a manual process.</p><p><strong>Experience beats study.</strong> LLMs may be Big Black Boxes to science, but each of us has in our own head a Bigger Black Box. Anybody with a few hours of experience with LLMs has already begun building an intuitive understanding of LLM capabilities. The best way to continue to develop this intuition is through play.</p><p>RollerCoaster Tycoon taught a generation of adults how to mind-meld with a graphical user interface. In this period of transition between GUIs and the future of intelligent computers, RCT makes for an interesting case study of the messy middle we occupy.</p><p>The park is running. Claude is at the controls. The guests say they are happy.</p><h3>Run it yourself</h3><p>The code is open source. Here&#8217;s how to get started.</p><p><strong>Prerequisites</strong></p><ul><li><p>macOS (Sonoma or newer) with Xcode, CMake 3.24+, and Ninja</p></li><li><p>RollerCoaster Tycoon 2 (purchase on Steam)</p></li><li><p>libvterm for terminal rendering: <code>brew install libvterm pkg-config</code></p></li></ul><p><strong>Quick Start</strong></p><pre><code># Clone the branch
git clone -b claude https://github.com/jaysobel/OpenRCT2.git
cd OpenRCT2

# Configure
cmake -S . -B build -G Ninja -DOPENRCT2_PREFER_STATIC=ON

# Build everything (game + CLI tools + terminal)
cmake --build build --target agent_bundle -j8

# Run
./build/OpenRCT2.app/Contents/MacOS/OpenRCT2</code></pre><p>Once the game launches, click the Claude toolbar button to open the AI terminal.</p><p><strong>What Gets Built</strong></p><p>The agent_bundle target compiles:</p><ul><li><p>OpenRCT2 - The game itself with embedded terminal window</p></li><li><p>rctctl - CLI tool that Claude uses to control the game via JSON-RPC</p></li><li><p>Sprite assets - Graphics and UI elements</p></li></ul><p><strong>How It Works</strong></p><p>The terminal spawns Claude Code with access to rctctl, a purpose-built CLI that communicates with the running game over JSON-RPC on localhost:9876. Claude sees the same information a player would&#8212;ride stats, guest happiness, park finances&#8212;and issues commands through this CLI rather than clicking buttons.</p><p>For more details, see:</p><ul><li><p><a href="https://github.com/jaysobel/OpenRCT2/blob/coding-agent/SETUP.md">SETUP.md</a> - Full setup guide</p></li><li><p><a href="https://github.com/jaysobel/OpenRCT2/blob/coding-agent/CODING_AGENT.md">CODING_AGENT.md</a> - Technical deep dive</p></li><li><p><a href="https://github.com/jaysobel/OpenRCT2/blob/coding-agent/RCTCTL.md">RCTCTL.md</a> - Complete CLI reference</p></li></ul><p>Requires game assets from a legitimate RCT2 purchase. Copy game files to ~/Library/Application Support/OpenRCT2/ after installation.</p><p><strong>Watch the livestream:</strong> <a href="https://www.twitch.tv/ramplabs">On Twitch</a><br><strong>Read the code:</strong> <a href="https://github.com/jaysobel/OpenRCT2">On Github</a><br><strong>Join us:</strong> <a href="https://jobs.ashbyhq.com/ramp?utm_source=RampLabs">At Ramp Labs</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ramplabs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Building with Tinker]]></title><description><![CDATA[Post Training Ensemble vs. Singular Model Approaches with Tinker]]></description><link>https://ramplabs.substack.com/p/building-with-tinker</link><guid isPermaLink="false">https://ramplabs.substack.com/p/building-with-tinker</guid><dc:creator><![CDATA[Ramp Labs]]></dc:creator><pubDate>Tue, 04 Nov 2025 17:58:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b2d1feba-f65b-4601-b3ab-ac3cf8f2486d_1260x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At Ramp, we like to experiment with new tech to see how it can make us faster. Last week, we got early access to <strong><a href="https://tinker-docs.thinkingmachines.ai/">Tinker</a> </strong>from <em>Thinking Machine Labs</em>.</p><p>We wanted to see how Reinforcement Learning with Verifiable Rewards (RLVR) behaves when trained on datasets with different levels of diversity. Does training on a varied dataset improve transfer learning or does the added noise make learning less stable?</p><h3><strong>What is Tinker?</strong></h3><p>Tinker is Thinking Machine Labs&#8217; platform built for efficient fine tuning and inference of open source models. The goal: bring these workflows together so you don&#8217;t have to juggle separate systems.</p><p>In practice, this means you can:</p><ul><li><p>Host your model on Tinker</p></li><li><p>Send inference calls</p></li><li><p>Return rewards from those inferences</p></li><li><p>And update your model using the reward</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a2pU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a2pU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 424w, https://substackcdn.com/image/fetch/$s_!a2pU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 848w, https://substackcdn.com/image/fetch/$s_!a2pU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 1272w, https://substackcdn.com/image/fetch/$s_!a2pU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a2pU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png" width="848" height="656" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:848,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!a2pU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 424w, https://substackcdn.com/image/fetch/$s_!a2pU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 848w, https://substackcdn.com/image/fetch/$s_!a2pU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 1272w, https://substackcdn.com/image/fetch/$s_!a2pU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfb9fb61-a73b-4023-a16a-76b3f83db469_848x656.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Tinker offers both synchronous and asynchronous APIs. By default you might use sync for simplicity, but for higher throughput you can switch to async. In our experiment we used the async functionality, streaming sampled outputs from Tinker to our reward function <em>as they were generated</em>, rather than waiting for full batches to complete. That allowed immediate feedback, quicker iterations, and higher efficiency.</p><h3><strong>One Caveat</strong></h3><p>Tinker doesn&#8217;t (yet) let you host custom reward functions unless your &#8220;reward&#8221; is another model. That&#8217;s fine until you try something like <strong><a href="https://spreadsheetbench.github.io/">SpreadsheetBench</a></strong>, the reward logic was too heavy to run locally, so we had to host it remotely on <strong><a href="https://modal.com/">Modal</a></strong>. It worked, but added lag and friction. We eventually switched to an <em>LLM as a judge</em> reward to simplify the setup and make it easier to see how Tinker actually performs.</p><h3><strong>The Setup</strong></h3><p>For the main experiment, we used the <strong><a href="https://huggingface.co/datasets/Salesforce/Webscale-RL">Salesforce Webscale-RL</a> dataset</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yeE7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yeE7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 424w, https://substackcdn.com/image/fetch/$s_!yeE7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 848w, https://substackcdn.com/image/fetch/$s_!yeE7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 1272w, https://substackcdn.com/image/fetch/$s_!yeE7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yeE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png" width="814" height="322" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:322,&quot;width&quot;:814,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yeE7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 424w, https://substackcdn.com/image/fetch/$s_!yeE7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 848w, https://substackcdn.com/image/fetch/$s_!yeE7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 1272w, https://substackcdn.com/image/fetch/$s_!yeE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1d784bf-3df7-45f8-80bc-6ff1a3b7affe_814x322.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p><em>2,500 Q&amp;A pairs from each math, social sciences, and natural sciences were selected.<br>2,000 for training, 250 for validation and test sets each.</em></p></blockquote><p>We trained three domain specific models (Math, Social Science, and Natural Science) and a multi domain model trained on the combined data from all three single domain runs. Every experiment used the same hyperparameters, batch size, and group size to keep comparisons fair. The policy model we fine tuned in all four cases was<em> Qwen-8B</em> with LoRA rank 128.</p><p>Because the multi domain model was trained on all three datasets together, we gave it three times as many training iterations while keeping the batch size fixed. This ensured it saw the same data as the individual models combined. We used importance sampling with normalized group advantages to keep gradient updates stable across batches.</p><p>For evaluation, we used <em>Qwen3-30B-A3B-Instruct-2507</em> as an <em>LLM as a judge</em>. It compared each model&#8217;s output to the reference answer and assigned a<strong> </strong>binary reward.</p><h3><strong>Training</strong></h3><p>The math specific model showed the fastest and most stable learning. Its reward curve settled quickly, which makes sense given how structured and well defined math reasoning tends to be.</p><p>Models trained on social and natural sciences were less steady, with noisier gradients and slower convergence. That probably comes down to their dependence on external knowledge, it&#8217;s harder to learn clean patterns when the task itself is full of context and ambiguity.</p><p>The multi domain model introduced volatility. Its training trajectory was less stable and often spiky, particularly early in learning. Yet this volatility wasn&#8217;t purely harmful: the multi domain model slightly outperformed the math only model on math evaluation. This suggests that exposure to varied reasoning forms (e.g., causal inference or narrative reasoning) may have helped the model develop more generalizable heuristics. Regularization effects likely also contributed, as multi domain exposure reduces overfitting to any single reasoning style.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gqIS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gqIS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 424w, https://substackcdn.com/image/fetch/$s_!gqIS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 848w, https://substackcdn.com/image/fetch/$s_!gqIS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 1272w, https://substackcdn.com/image/fetch/$s_!gqIS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gqIS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png" width="1456" height="1032" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1032,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gqIS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 424w, https://substackcdn.com/image/fetch/$s_!gqIS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 848w, https://substackcdn.com/image/fetch/$s_!gqIS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 1272w, https://substackcdn.com/image/fetch/$s_!gqIS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c4162d9-b7aa-426f-bce4-218b29d1d627_1600x1134.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>Head to Head Comparison</strong></h3><p>To see how the models stacked up, we tested everything on a shared test set: the combined test data from all three single domain runs. Since we wouldn&#8217;t know a question&#8217;s domain in a real setting, we used an untrained <em>Qwen3-4B-Instruct-2507</em> to predict the domain and route each question to the corresponding single domain model&#8212;functionally similar to an MoE system. The multi domain model just answered everything directly. For evaluation, we used each model&#8217;s best validation checkpoint and relied on <em>Qwen3-30B-A3B-Instruct-2507</em> as an <em>LLM as a judge</em> to generate consistent binary rewards across runs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2DLs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2DLs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 424w, https://substackcdn.com/image/fetch/$s_!2DLs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 848w, https://substackcdn.com/image/fetch/$s_!2DLs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 1272w, https://substackcdn.com/image/fetch/$s_!2DLs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2DLs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png" width="1456" height="876" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:876,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2DLs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 424w, https://substackcdn.com/image/fetch/$s_!2DLs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 848w, https://substackcdn.com/image/fetch/$s_!2DLs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 1272w, https://substackcdn.com/image/fetch/$s_!2DLs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29086e46-fcfe-40b5-9357-3c2dcb30a436_1484x893.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Performance was roughly equivalent across systems. The domain classifier&#8217;s imperfect accuracy likely degraded the single domain system slightly, but not by much. The main difference was efficiency: the multi domain model took about three times longer to train.</p><h3><strong>Conclusion</strong></h3><p>From these experiments, one clear takeaway stands out: <strong>segmenting training by domain and running processes in parallel can make post training far more efficient.</strong> The single multi domain model didn&#8217;t deliver enough benefit from transfer learning to justify its heavy runtime and its learning was less stable overall. For large scale post training, this domain split approach could deliver substantial wall clock savings without sacrificing performance.</p><p>So what do we think of Tinker? The system made it remarkably easy to run inference and update models without getting lost in infrastructure work. It let us focus on the research instead of the plumbing. That said, native support for remote reward functions would be a real breakthrough, enabling heavier computational experiments without clunky workarounds. Overall, Tinker feels like a thoughtfully built platform that lowers the barrier to RL research making complex post training workflows accessible to individual researchers and smaller teams alike.</p><div><hr></div><p>Want to keep up with our next AI experiments? Subscribe here and follow us on <a href="https://x.com/RampLabs">@RampLabs</a>. We&#8217;re also hiring across roles at Ramp.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramplabs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://ramplabs.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[We built an agent to prompt our internal finance agent]]></title><description><![CDATA[Our finance agent saved hours of work but required extensive prompting. So we built a second agent to watch users work and write the prompts itself.]]></description><link>https://ramplabs.substack.com/p/we-built-an-agent-to-prompt-our-internal</link><guid isPermaLink="false">https://ramplabs.substack.com/p/we-built-an-agent-to-prompt-our-internal</guid><dc:creator><![CDATA[Ramp Labs]]></dc:creator><pubDate>Wed, 01 Oct 2025 19:24:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6f23bed7-b669-4e85-849a-5353292ebeac_1260x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><a href="https://labs.ramp.com/">Ramp Labs</a> is the home for AI experiments from <a href="https://ramp.com/">Ramp</a>. We share learnings on applying the latest models to real-world problems. We also share insights into how Ramp is leveraging AI internally to increase productivity. Follow us on X <a href="https://x.com/RampLabs">@RampLabs</a> and subscribe below.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramplabs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://ramplabs.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;5a23c538-99ec-4315-badc-311cb2752ceb&quot;,&quot;duration&quot;:null}"></div><p>We built an internal finance agent that could automate hours of tedious accounting work in spreadsheets. But every time someone wanted to use it, they&#8217;d spend 30-45 minutes crafting the perfect prompt, uploading the right files, and resolving errors.</p><p><strong>We asked: what if the agent could watch us work and write its own prompts?</strong> </p><p>So we built a second agent called the Architect. This agent watches screen recordings of accountants doing their jobs, extracts the workflow, identifies what external data is needed, and generates detailed prompts, all without human intervention. It then hands off everything to our Doer agent to execute the task. </p><p><strong>The result: what used to be dreaded hours wasted on tedious tasks now takes a five-minute screen recording. This is second-order automation: automation that creates automation.</strong></p><p>In this post, we&#8217;ll break down how we built this two-agent system for finance use cases and share performance benchmarks.</p><div><hr></div><h2>The problem with first-order automation</h2><p>Most AI agents today have a prompt problem. Our internal finance agent could automate complex accounting workflows, but it required perfectly crafted prompts and the right context files. Here are some sample tasks:</p><ul><li><p>Monthly revenue reconciliation exercise by consolidating invoice and data warehouse data into Excel to prepare and upload a journal entry into ERP.</p></li><li><p>Month-end booking of inter-company fund transfers from several tools into an Excel workbook to create and import a journal entry into ERP.</p></li></ul><p>This creates a paradox where the agent saves time executing tasks but costs time in setup. Accountants had to become prompt engineers trying to describe their process and if they wanted to run the same process next month, they had to re-write the prompt manually.</p><p>We realized that the bottleneck wasn&#8217;t execution but instruction.</p><div><hr></div><h2>Second-order automation with Architect &amp; Doer agents</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g6ZW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g6ZW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!g6ZW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!g6ZW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!g6ZW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g6ZW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2803640,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/174868533?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g6ZW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!g6ZW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!g6ZW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!g6ZW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82143c3-741a-477a-bc95-41db7fb52527_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Instead of focusing on making the internal finance agent marginally better, we needed another agent to setup the task itself. Our solution was a two-agent system where one agent generates instructions for the other.</p><p><strong>The Architect agent</strong> watches screen recordings of users completing tasks. Using a large-context multimodal model, it:</p><ul><li><p>Extracts the step-by-step workflow</p></li><li><p>Identifies when users paste external data or reference other files</p></li><li><p>Generates detailed, structured prompts for the Doer agent</p></li><li><p>Compiles everything into a reusable &#8220;Process&#8221;</p></li></ul><p><strong>The Doer agent</strong> (our internal finance agent) executes these instructions using specialized tools to search, manipulate, and validate spreadsheet operations.</p><p>As a result, our two-agent system could take a human-recorded workflow and, after watching it once, create an entirely reusable workflow without additional input.</p><div><hr></div><h2>Deep dive into the two-agent system</h2><p><strong>The Architect agent</strong> solves this blueprint problem. Its role is to watch a human work through a spreadsheet via screen recordings and break the process into clear, specific instructions for our Doer agent to use in the future. The Architect agent also notes when users paste in data from external sources, or understands if other context is required (e.g. the current month) before running the Doer agent.</p><p>All of the Architect agent&#8217;s outputs are compiled into a <strong>Process</strong>: a compiled set of steps, required files, and additional information that will eventually be passed along to the Doer agent for each run.</p><h3>Architect agent flow</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uuG0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uuG0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 424w, https://substackcdn.com/image/fetch/$s_!uuG0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 848w, https://substackcdn.com/image/fetch/$s_!uuG0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 1272w, https://substackcdn.com/image/fetch/$s_!uuG0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uuG0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png" width="1456" height="1294" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1294,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:142113,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/174868533?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uuG0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 424w, https://substackcdn.com/image/fetch/$s_!uuG0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 848w, https://substackcdn.com/image/fetch/$s_!uuG0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 1272w, https://substackcdn.com/image/fetch/$s_!uuG0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f61a60-46dc-41b5-a7e3-712cae6c5f06_1496x1330.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>User uploads screen recording of their workflow</p></li><li><p><strong>Gemini 2.5 Pro (1M token context window)</strong> processes video to extract actions and context</p></li><li><p>Agent identifies required files and temporal dependencies (e.g. current month data)</p></li><li><p>Generates structured prompt with step-by-step instructions</p></li><li><p>Compiles into a Process that can be reused</p></li></ul><h3>Doer agent flow</h3><p>This agent is simple and relies as much as possible on model intelligence to achieve tasks with minimal guide rails.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SlRi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SlRi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 424w, https://substackcdn.com/image/fetch/$s_!SlRi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 848w, https://substackcdn.com/image/fetch/$s_!SlRi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 1272w, https://substackcdn.com/image/fetch/$s_!SlRi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SlRi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png" width="1456" height="614" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:614,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140466,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/174868533?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SlRi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 424w, https://substackcdn.com/image/fetch/$s_!SlRi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 848w, https://substackcdn.com/image/fetch/$s_!SlRi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 1272w, https://substackcdn.com/image/fetch/$s_!SlRi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e635e61-d016-44b5-a045-4b12f7019333_2036x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Receives process with instructions and uploaded files</p></li><li><p><strong>Claude Sonnet 4.5</strong> uses specialized tools to navigate and manipulate spreadsheets</p></li><li><p>Executes each instruction with validation checks</p></li><li><p>Returns completed spreadsheet</p></li></ul><div><hr></div><h2>Performance results</h2><h3>Architect agent</h3><p>While we haven&#8217;t yet developed a formal benchmark for the architect agent, we can see its impact in terms of workflow creation from non-technical users. Accountants simply upload a screen recording and come back to a ready-to-use process. The time savings are significant when compared with manual prompting for every run.</p><h3>Doer agent</h3><p>We tested against <a href="https://spreadsheetbench.github.io/">SpreadsheetBench</a> on ~50 randomly selected tasks (3 test cases each):</p><ul><li><p>Soft-restriction tasks: <strong>49.5% accuracy</strong> (vs. OpenAI&#8217;s 45.5%)</p></li><li><p>Hard-restriction tasks: <strong>32.5% accuracy</strong> (vs. GPT-4o&#8217;s 13.38%)</p></li></ul><p>Tasks taking 1-2 hours now complete in under 10 minutes (a 6-12x speedup). In cases of partial completion, the agent still saves significant time before human intervention is needed.</p><p>The barrier to automation collapsed from weeks of engineering work to simply recording your screen.</p><div><hr></div><h2>Learnings</h2><ol><li><p><strong>Second-order changes the scaling equation.</strong> First-order: Adding workflows scales linearly with human prompt-writing capacity. Second-order: Adding workflows costs near-zero human time once the architect agent exists.</p></li><li><p><strong>Models have complementary strengths.</strong> Gemini 2.5 Pro&#8217;s 1 million token context window with stellar multimodal support allows us to capture key details from input videos to generate a process, while Anthropic&#8217;s Claude Sonnet 4.5 shines when it&#8217;s time get work done by being swift, precise, and economic.</p></li><li><p><strong>Building production agents is still hard.</strong> Despite powerful models, we spent weeks iterating on system prompts, tool designs, and error handling. There&#8217;s no shortcut for testing, debugging, and refinement. The engineering matters as much as the models.</p></li></ol><div><hr></div><p>Our combined agent doesn&#8217;t just do work, it designs how work gets done. This unlocks a new scaling paradigm: instead of engineers building automations one by one, anyone who can record their screen can generate reusable workflows. The architect-doer pattern transformed automation from an engineering bottleneck into a self-service capability. The next frontier isn&#8217;t faster agents, it&#8217;s agents that teach themselves what to do.</p><p>Want to get early access to future AI experiments? Subscribe below and follow us on <a href="https://x.com/RampLabs">X @RampLabs</a>. We&#8217;re also <a href="https://jobs.ashbyhq.com/ramp?utm_source=RampLabs">hiring across roles</a> at Ramp.</p>]]></content:encoded></item><item><title><![CDATA[How we built Agent Fill]]></title><description><![CDATA[Ramp Labs is the home for AI experiments from Ramp.]]></description><link>https://ramplabs.substack.com/p/how-we-built-agent-fill</link><guid isPermaLink="false">https://ramplabs.substack.com/p/how-we-built-agent-fill</guid><dc:creator><![CDATA[Ramp Labs]]></dc:creator><pubDate>Wed, 27 Aug 2025 21:30:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/310b2d65-a5b9-48d9-9306-b3858018768d_1260x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!54Hu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!54Hu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!54Hu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!54Hu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!54Hu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!54Hu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg" width="1456" height="582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:582,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40554,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ramplabs.substack.com/i/174451483?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!54Hu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!54Hu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!54Hu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!54Hu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09d3e25-41f6-49f2-bdb0-a51d5ce51af8_2000x800.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Ramp Labs is the home for AI experiments from Ramp. Our focus is shipping AI tools for the finance community and sharing learnings on building with AI.</p><p>Today, we launched <strong><a href="https://labs.ramp.com/agent-fill">Agent Fill</a></strong>, our agentic PDF form filler, in alpha. Read about how we built it below.</p><div><hr></div><h2>Finance teams waste time filling out PDFs</h2><p>No one dreads filling out PDF forms more than finance teams. Countless hours are wasted on repetitive data entry that requires painstaking attention to detail. That&#8217;s why we started to build <strong>Agent Fill</strong> to help our internal finance team move faster. Now, we&#8217;re sharing the tool with the community.</p><h2>How we built this technically</h2><p>When filling out a PDF form, humans visually navigate complex pages, interpret questions, and draw from their knowledge to input answers accurately.</p><p>A traditional approach to automate this process parses and engages with a form&#8217;s file structure directly. While these systems can get the job done in certain ways, they tend to be brittle, and lack the breadth or context required to handle the high structural variance and nuanced content found in financial documents.</p><p>To accomplish this in an AI-native way, Agent Fill is equipped with a diverse arsenal of tools.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rTWk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rTWk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 424w, https://substackcdn.com/image/fetch/$s_!rTWk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 848w, https://substackcdn.com/image/fetch/$s_!rTWk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!rTWk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rTWk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png" width="1456" height="821" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!rTWk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 424w, https://substackcdn.com/image/fetch/$s_!rTWk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 848w, https://substackcdn.com/image/fetch/$s_!rTWk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!rTWk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730180d1-5e57-4484-b5a5-b8ef8ad6ee8c_2400x1354.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We start with <strong>knowledge extraction</strong> from previously filled forms to give our agent the relevant context it needs to fill blank forms. Throwing raw PDFs at Gemini 2.5 Pro takes advantage of its efficacy in producing rich, nuanced output from multimodal data when schema constraints are not enforced.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bmtw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bmtw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 424w, https://substackcdn.com/image/fetch/$s_!Bmtw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 848w, https://substackcdn.com/image/fetch/$s_!Bmtw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!Bmtw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bmtw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png" width="1456" height="821" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!Bmtw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 424w, https://substackcdn.com/image/fetch/$s_!Bmtw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 848w, https://substackcdn.com/image/fetch/$s_!Bmtw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!Bmtw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5dbbbd-1eb9-4f72-b2d2-6736435a1b63_2400x1354.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To help our agent understand the form we want to fill in, we transform it to text with OCR and extract any present PDF widgets with pymupdf. This pool of data is fed to Claude Sonnet 4 for <strong>structured extraction</strong>. Claude excels with schema fidelity, making it the perfect choice in mapping our data pool to form fields, interpreting the structure of complex financial documents in a format that can be handed off to the agent.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8us_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8us_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 424w, https://substackcdn.com/image/fetch/$s_!8us_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 848w, https://substackcdn.com/image/fetch/$s_!8us_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!8us_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8us_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png" width="1456" height="821" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37b4232b-814e-4c81-8a80-583361296596_2400x1354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!8us_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 424w, https://substackcdn.com/image/fetch/$s_!8us_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 848w, https://substackcdn.com/image/fetch/$s_!8us_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!8us_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b4232b-814e-4c81-8a80-583361296596_2400x1354.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When a human fills out a form on a computer, they click, type, and scroll in their document editor. With Anthropic&#8217;s experimental yet formidable <a href="https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/computer-use-tool">computer use tool</a>, Claude Sonnet 4 can do the same. Combining the layered context we generated earlier with screenshots of the form featuring bounding boxes over fillable fields, the agent has everything it needs to fill out the diverse array of PDF forms encountered by finance teams.</p><p>Agents are clearly capable, but financial documents can be nebulous and mistakes are inevitable. Our goal is not to squeeze perfection from non-deterministic AI models, but speedy completion of tedious forms. So, we built a simple PDF editor for a human to quickly review and edit the filled form before downloading.</p><p>Agent Fill pairs AI automation with human in the loop UX to fill out PDFs in minutes, not hours.</p><h2>Learnings</h2><ol><li><p>The power of<strong> multimodal context</strong>. When we provided the AI agent with partially redundant context in multiple modalities (e.g. screenshot of the form, OCR text, PDF widget data), its effectiveness in executing complex tasks and reasoning improved significantly.</p></li><li><p>Our flexible agent architecture allowed us to optimize each step of the agent&#8217;s workflow. We were able to quickly experiment and swap out tools to increase accuracy in results.</p></li><li><p>Despite the effectiveness of AI agents, for critical financial workflows, a <strong>human in the loop</strong> is still necessary for the end-to-end experience. We built a PDF editor for the human to review the agent&#8217;s results.</p></li></ol><p>Try out Agent Fill today: <a href="https://labs.ramp.com/agent-fill">https://labs.ramp.com/agent-fill</a></p><p>Thank you to <a href="https://www.linkedin.com/in/shaiyon/">Shaiyon Hariri</a>, <a href="https://www.linkedin.com/in/shevalex/">Alex Shevchenko</a>, <a href="https://www.linkedin.com/in/alexstauffer/">Alex Stauffer</a>, <a href="https://www.linkedin.com/in/tkkong/">TK Kong</a>, and <a href="https://www.linkedin.com/in/zackpitcher/">Zack Pitcher</a> for contributing to this project.</p><p>Want to get early access to future AI experiments? Subscribe below and follow us on <a href="https://x.com/RampLabs">X @RampLabs</a>.  </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ramplabs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://ramplabs.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item></channel></rss>