<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Mark Schaake</title><description>Thoughts on building software with AI, the shifting economics of tech work, and how people think about politics and culture.</description><link>https://www.markschaake.com/</link><item><title>Eval: eforge harness backends</title><link>https://www.markschaake.com/posts/eval-eforge-harness-backends/</link><guid isPermaLink="true">https://www.markschaake.com/posts/eval-eforge-harness-backends/</guid><description>Two eforge backends under identical model routing. Token cost replicates across runs. Behavioral metrics don&apos;t - and a post written after one run would have been wrong.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import HarnessTokenRatioChart from &apos;../../components/HarnessTokenRatioChart.astro&apos;;
import HarnessReviewerReversalChart from &apos;../../components/HarnessReviewerReversalChart.astro&apos;;&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://eforge.build&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Eforge&amp;lt;/a&amp;gt; is an open source Agentic Build System. It sizes work, decomposes plans, spawns agents, arbitrates review, and delegates execution to a configurable backend. Backend choice is open - the Claude Agent SDK, pi against any supported provider, or any other harness implementation that conforms to eforge&apos;s backend contract.&lt;/p&gt;
&lt;p&gt;For this evaluation, two variants were configured and run against the same scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;lt;a href=&quot;https://github.com/eforge-build/eval/blob/6dda3b2e8369ca2b15c8626fca2d58a8e6a8cdb0/variants.yaml#L6-L8&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;&lt;code&gt;claude-sdk&lt;/code&gt;&amp;lt;/a&amp;gt;:&lt;/strong&gt; backend set to the Claude Agent SDK.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;lt;a href=&quot;https://github.com/eforge-build/eval/blob/6dda3b2e8369ca2b15c8626fca2d58a8e6a8cdb0/variants.yaml#L66-L77&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;&lt;code&gt;anthropic-api&lt;/code&gt;&amp;lt;/a&amp;gt;:&lt;/strong&gt; backend set to pi with the Anthropic API as the model provider.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The orchestration layer, the per-agent model assignments, and the scenarios were held constant across both variants. The backend was the only controlled difference.&lt;/p&gt;
&lt;p&gt;Runs were executed via &amp;lt;a href=&quot;https://github.com/eforge-build/eval&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;eforge&apos;s eval framework&amp;lt;/a&amp;gt;, where each scenario is defined in &amp;lt;a href=&quot;https://github.com/eforge-build/eval/blob/6dda3b2e8369ca2b15c8626fca2d58a8e6a8cdb0/scenarios.yaml&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;&lt;code&gt;scenarios.yaml&lt;/code&gt;&amp;lt;/a&amp;gt;. Two scenarios were used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://github.com/eforge-build/eval/blob/6dda3b2e8369ca2b15c8626fca2d58a8e6a8cdb0/scenarios.yaml#L11-L23&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;&lt;strong&gt;&lt;code&gt;todo-api-errand-health-check&lt;/code&gt;&lt;/strong&gt;&amp;lt;/a&amp;gt; (errand scale): add a &lt;code&gt;/health&lt;/code&gt; endpoint to an Express API.&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://github.com/eforge-build/eval/blob/6dda3b2e8369ca2b15c8626fca2d58a8e6a8cdb0/scenarios.yaml#L50-L59&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;&lt;strong&gt;&lt;code&gt;workspace-api-excursion-engagement&lt;/code&gt;&lt;/strong&gt;&amp;lt;/a&amp;gt; (excursion scale): build an engagement module with reactions, threads, and pins across four parallel plans.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The errand scenario was run three times; the excursion scenario twice. Each run executed against both variants:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./run.sh todo-api-errand-health-check --variants claude-sdk,anthropic-api
./run.sh workspace-api-excursion-engagement --variants claude-sdk,anthropic-api
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model routing (both variants):&lt;/strong&gt; &lt;code&gt;claude-opus-4-6&lt;/code&gt; for every build stage, &lt;code&gt;claude-sonnet-4-6&lt;/code&gt; for the PRD validator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measurement:&lt;/strong&gt; per-run totals for tokens, cost, and cache hit rate, plus per-stage metrics (reviewer accept rate, stage execution, resolver invocations, gap-closer substance) derived from eforge&apos;s monitor-DB and per-run variant analyses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All five runs were executed on 2026-04-14. All five passed validation on both variants. &amp;lt;a href=&quot;https://github.com/eforge-build/eval/tree/206cb797f86372de16af65b75f405ada6ddcd49c/analyses/2026-04-14-harness-backends&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Per-run variant analyses&amp;lt;/a&amp;gt; are published alongside the eval framework.&lt;/p&gt;
&lt;h2&gt;Token cost replicated&lt;/h2&gt;
&lt;p&gt;Claude-sdk used more tokens than pi on every run, at both scales.&lt;/p&gt;
&lt;p&gt;&amp;lt;HarnessTokenRatioChart /&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Scale&lt;/th&gt;
&lt;th&gt;Pi tokens&lt;/th&gt;
&lt;th&gt;Claude-sdk tokens&lt;/th&gt;
&lt;th&gt;Ratio&lt;/th&gt;
&lt;th&gt;Pi cost&lt;/th&gt;
&lt;th&gt;Claude-sdk cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;errand&lt;/td&gt;
&lt;td&gt;167k&lt;/td&gt;
&lt;td&gt;406k&lt;/td&gt;
&lt;td&gt;2.43×&lt;/td&gt;
&lt;td&gt;$0.41&lt;/td&gt;
&lt;td&gt;$0.63&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;errand&lt;/td&gt;
&lt;td&gt;167k&lt;/td&gt;
&lt;td&gt;352k&lt;/td&gt;
&lt;td&gt;2.11×&lt;/td&gt;
&lt;td&gt;$0.42&lt;/td&gt;
&lt;td&gt;$0.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;errand&lt;/td&gt;
&lt;td&gt;159k&lt;/td&gt;
&lt;td&gt;379k&lt;/td&gt;
&lt;td&gt;2.38×&lt;/td&gt;
&lt;td&gt;$0.39&lt;/td&gt;
&lt;td&gt;$0.62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;excursion&lt;/td&gt;
&lt;td&gt;6.74M&lt;/td&gt;
&lt;td&gt;9.32M&lt;/td&gt;
&lt;td&gt;1.38×&lt;/td&gt;
&lt;td&gt;$10.52&lt;/td&gt;
&lt;td&gt;$11.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;excursion&lt;/td&gt;
&lt;td&gt;4.92M&lt;/td&gt;
&lt;td&gt;12.10M&lt;/td&gt;
&lt;td&gt;2.46×&lt;/td&gt;
&lt;td&gt;$8.42&lt;/td&gt;
&lt;td&gt;$14.32&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The token ratio ranges from 1.38× to 2.46×. Cost ratio from 1.10× to 1.70×. Both remain above one on every run, across both scales. Claude-sdk&apos;s cache hit rate was higher than pi&apos;s on every run (86-93% against pi&apos;s 73-90%), but raw input volume was large enough that caching efficiency did not close the gap. Output tokens showed a similar pattern: on errand runs pi produced 4-5k output tokens while claude-sdk produced 8k.&lt;/p&gt;
&lt;h2&gt;Claude-sdk silently dispatches a second model&lt;/h2&gt;
&lt;p&gt;Both excursion runs showed a model-usage pattern on the claude-sdk planner that eforge did not configure. The planner, routed to &lt;code&gt;claude-opus-4-6&lt;/code&gt;, also ran &lt;code&gt;claude-haiku-4-5&lt;/code&gt; in the same turn.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Planner opus input&lt;/th&gt;
&lt;th&gt;Planner haiku input&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;294k&lt;/td&gt;
&lt;td&gt;349k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;168k&lt;/td&gt;
&lt;td&gt;507k&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The haiku tokens appear inside the planner&apos;s &lt;code&gt;modelUsage&lt;/code&gt; block, not as a separate agent in the run manifest. The mechanism isn&apos;t directly observable from the token data - the structure is consistent with sub-agent dispatch, but this evaluation didn&apos;t verify that.&lt;/p&gt;
&lt;p&gt;Pi exhibited no equivalent behavior. When eforge routed opus to the planner, pi executed on opus alone.&lt;/p&gt;
&lt;p&gt;&quot;Same models on both sides&quot; is technically wrong. Claude-sdk ran a second model that eforge never configured, and the orchestration layer above it had no visibility into that.&lt;/p&gt;
&lt;h2&gt;Behavioral metrics did not replicate&lt;/h2&gt;
&lt;p&gt;After run 4, the behavioral picture looked decisive. Five dimensions favored pi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reviewer accept rate: pi 57%, claude-sdk 28%&lt;/li&gt;
&lt;li&gt;Plan-evaluator arbitration: pi ran it, claude-sdk skipped&lt;/li&gt;
&lt;li&gt;Gap-closer substance: pi identified a defective idempotent cascade-hook registration affecting pins, reactions, and threads; claude-sdk flagged &lt;code&gt;package.json&lt;/code&gt; indentation and a type assertion&lt;/li&gt;
&lt;li&gt;Merge-conflict-resolver: pi 1 invocation, claude-sdk 2 across four parallel worktrees&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;review&quot;&lt;/code&gt; evaluator verdict class: emitted by claude-sdk only&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each dimension is documented in the &amp;lt;a href=&quot;https://github.com/eforge-build/eval/blob/206cb797f86372de16af65b75f405ada6ddcd49c/analyses/2026-04-14-harness-backends/run-4-excursion-20-06-55.md&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;run-4 variant analysis&amp;lt;/a&amp;gt;.&lt;/p&gt;
&lt;p&gt;Run 5 did not replicate any of them.&lt;/p&gt;
&lt;p&gt;&amp;lt;HarnessReviewerReversalChart /&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reviewer accept rate:&lt;/strong&gt; pi dropped to 33%, claude-sdk rose to 62%. Complete reversal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan-evaluator:&lt;/strong&gt; this run, claude-sdk executed plan-evaluator and pi skipped it. Reversal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gap-closer:&lt;/strong&gt; neither variant identified a substantive bug on run 5.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Merge-conflict-resolver:&lt;/strong&gt; not invoked on either variant. The run-4 invocation counts had no analogue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&quot;review&quot;&lt;/code&gt; verdict class:&lt;/strong&gt; emitted on both variants (pi 8 of 27 verdicts, claude-sdk 2 of 26). The exclusivity observed on run 4 did not hold.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Composer scope-sizing across the three errand runs showed a related instability. Pi&apos;s composer sized the errand correctly as &lt;code&gt;errand&lt;/code&gt; on run 2 and as &lt;code&gt;excursion&lt;/code&gt; on runs 1 and 3. Claude-sdk&apos;s composer sized all three as &lt;code&gt;excursion&lt;/code&gt;. The pattern of pi being sometimes correct and claude-sdk being consistently over-scoped held across three errand runs, but a single additional sample in either direction could change the characterization.&lt;/p&gt;
&lt;h2&gt;Interpretation&lt;/h2&gt;
&lt;p&gt;Two findings replicated across five runs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pi consumes fewer tokens than claude-sdk on the same scenario under identical model routing (1.38-2.46×).&lt;/li&gt;
&lt;li&gt;The claude-sdk backend dispatches &lt;code&gt;claude-haiku-4-5&lt;/code&gt; as a planner sub-agent; pi does not. Observed on both excursion runs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Behavioral metrics on a single excursion-scale scenario did not replicate across two samples. The direction of every observed difference reversed or washed out when the scenario was re-run. The &amp;lt;a href=&quot;https://github.com/eforge-build/eval/blob/206cb797f86372de16af65b75f405ada6ddcd49c/analyses/2026-04-14-harness-backends/run-5-excursion-21-27-12.md&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;run-5 variant analysis&amp;lt;/a&amp;gt; notes this directly: any single-run comparison at this scale should be read as one sample, not a backend verdict.&lt;/p&gt;
&lt;p&gt;A harness-comparison post published on the basis of run 4 alone would have reported five behavioral advantages for pi that were not reproducible. A reversed post based on run 5 alone would have reported the same pattern in the other direction.&lt;/p&gt;
&lt;h2&gt;Also replicated across all five runs&lt;/h2&gt;
&lt;p&gt;No MCP tool calls or skill invocations were recorded on either variant. The observed token gap cannot be attributed to capability that claude-sdk exposed and pi did not.&lt;/p&gt;
&lt;h2&gt;One-run observations worth flagging&lt;/h2&gt;
&lt;p&gt;On run 5, claude-sdk&apos;s plan-reviewer consumed $1.24 on 1.14M input tokens. Pi&apos;s plan-reviewer on the same PRD consumed $0.29 on 94k input tokens. The 4× spend differential was not present at that magnitude on run 4. One excursion run isn&apos;t enough to separate signal from the run-to-run variance the behavioral metrics already showed.&lt;/p&gt;
&lt;h2&gt;Limitations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dollar figures reflect API pricing on both variants. The claude-sdk backend draws on a Claude subscription when one is present, so for subscription users claude-sdk&apos;s real-world cost is capped by the subscription rather than billed per token. The token ratio holds; the cost ratio does not necessarily survive.&lt;/li&gt;
&lt;li&gt;Two scenarios, one per scale. Neither is representative of engineering workloads in general.&lt;/li&gt;
&lt;li&gt;n=3 at errand scale, n=2 at excursion scale. Behavioral claims require larger samples.&lt;/li&gt;
&lt;li&gt;All runs executed on a single day. Shared API-side conditions cannot be ruled out as a factor in any observed metric.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;&quot;review&quot;&lt;/code&gt; verdict class is not currently counted in &lt;code&gt;result.review.accepted&lt;/code&gt; or &lt;code&gt;result.review.rejected&lt;/code&gt;. Metrics that depend on those totals may understate review activity on runs where &lt;code&gt;&quot;review&quot;&lt;/code&gt; verdicts are emitted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Token and cost differentials between the two harness configurations are stable at this sample size. Behavioral differentials are not. Claims about which harness produces higher-quality decisions under identical model routing require more runs than this evaluation contains.&lt;/p&gt;
</content:encoded></item><item><title>The Open Source Alternative</title><link>https://www.markschaake.com/posts/the-open-source-alternative/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-open-source-alternative/</guid><description>Factory AI ships Missions. I&apos;d already built the open source version - from a different direction, with a different answer to what quality means.</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I didn&apos;t set out to build an alternative to anything. I was automating my own workflow - the manual orchestration of plan, build, review, evaluate that I&apos;d been running by hand across Claude Code sessions for months. Each piece got automated, then the coordination between pieces, and at some point I had a multi-agent build system with blind review, dependency-aware parallel orchestration, and a daemon that runs overnight.&lt;/p&gt;
&lt;p&gt;Then Factory AI shipped &amp;lt;a href=&quot;https://factory.ai/news/missions&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Missions&amp;lt;/a&amp;gt; - a long-horizon orchestration system that decomposes large projects into milestones, assigns work to parallel workers, and runs autonomously for hours to days. $200 a month, backed by $50M from Sequoia, NEA, and NVIDIA. The overlap with &amp;lt;a href=&quot;https://eforge.run&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;eforge&apos;s&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;/posts/expedition-excursion-errand/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;expedition mode&amp;lt;/a&amp;gt; was hard to miss - same problem space, same multi-agent decomposition, same &quot;hand off and come back later&quot; model.&lt;/p&gt;
&lt;p&gt;The convergence validates the problem space. The divergence is where it gets interesting.&lt;/p&gt;
&lt;h2&gt;Different bets about quality&lt;/h2&gt;
&lt;p&gt;Both systems solve &quot;how do I build something large without being present?&quot; But they make opposite bets about where quality breaks down.&lt;/p&gt;
&lt;p&gt;Factory validates by asking &lt;em&gt;does it work?&lt;/em&gt; Their &amp;lt;a href=&quot;https://factory.ai/news/missions&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Missions announcement&amp;lt;/a&amp;gt; describes validation workers that &quot;launch the application, navigate through flows, check that pages render correctly, and flag visual or functional issues.&quot; Quality means functional completeness - the output runs, the UI renders, the state transitions work. Their &amp;lt;a href=&quot;https://docs.factory.ai/cli/features/missions&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;documentation&amp;lt;/a&amp;gt; lists &quot;How do you maximize correctness?&quot; as an open research question, which says something about where the architecture is focused and where it&apos;s still searching.&lt;/p&gt;
&lt;p&gt;eforge validates by asking &lt;em&gt;is it correct?&lt;/em&gt; A separate agent reviews the code blind - zero context from the builder, no access to the builder&apos;s reasoning, no ability to rationalize implementation choices. Then an evaluator applies per-hunk verdicts, accepting changes that strictly improve the code and rejecting anything that alters intent. Anthropic&apos;s engineering team &amp;lt;a href=&quot;https://www.anthropic.com/engineering/harness-design-long-running-apps&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;independently validated this pattern&amp;lt;/a&amp;gt; - solo agents approve their own work, adversarial evaluation dramatically improves quality.&lt;/p&gt;
&lt;p&gt;These aren&apos;t the same question. A codebase can pass every functional test while accumulating structural drift - wrong abstractions, subtle coupling, decisions that compound into maintenance debt but never surface in a UI flow. Factory catches what breaks. eforge catches what drifts.&lt;/p&gt;
&lt;p&gt;My experience building with agents over the past couple of years is that the code &lt;em&gt;usually works&lt;/em&gt;. Frontier models are good at making things function. What they&apos;re less reliable at is staying faithful to a plan across a large coordinated change - holding the architectural intent through thirty files without quietly reinterpreting, simplifying, or drifting from the spec. That&apos;s the failure mode blind review is engineered to catch. Not &quot;does this code run&quot; but &quot;does this code do what was planned, the way it was planned.&quot;&lt;/p&gt;
&lt;p&gt;For an engineer who spent real time on a careful plan - thinking through every module boundary, every data flow, every tradeoff - the question that matters is fidelity. Did the build execute the plan as specified, or did the agent decide it knew better? eforge&apos;s review pipeline is built around that question. The blind reviewer can&apos;t rationalize the builder&apos;s choices because it never saw them. The per-hunk evaluator rejects changes that alter intent even if they&apos;d technically work. The goal is minimizing drift and slop - keeping the output coherent with the plan, not just functional.&lt;/p&gt;
&lt;h2&gt;Different ideas about who&apos;s using it&lt;/h2&gt;
&lt;p&gt;Factory&apos;s framing is explicit: the user is a project manager. From their announcement - &quot;the skillset for working with Missions looks less like traditional debugging and more like project management of agents, where you monitor a team of workers, unblocking them when they get stuck, redirecting them when priorities change.&quot; The human manages a fleet. The platform handles the engineering.&lt;/p&gt;
&lt;p&gt;That&apos;s a coherent model, and it works for enterprise teams that need to multiply throughput across an organization. But it&apos;s not the only model.&lt;/p&gt;
&lt;p&gt;eforge is built for a developer who wants to stay close to the work. &amp;lt;a href=&quot;/posts/the-flinch/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;The planning is the engineering&amp;lt;/a&amp;gt; - every architectural choice, every module boundary, every acceptance criterion thought through before anything gets built. The build phase &amp;lt;a href=&quot;/posts/the-handoff/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;runs in the background&amp;lt;/a&amp;gt;, but the person who planned it understands the codebase at the level of someone who wrote it by hand - because the planning demands that depth.&lt;/p&gt;
&lt;p&gt;The difference isn&apos;t capability - it&apos;s proximity. Factory abstracts you above the engineering. eforge keeps you in it, automating the execution but not the judgment. The review architecture exists to protect the investment the engineer made in the plan - careful planning should produce faithful execution, not a reinterpretation filtered through an agent&apos;s preferences. A tool for someone who wants the leverage of autonomous builds without giving up control over what gets built.&lt;/p&gt;
&lt;h2&gt;Plans belong in version control&lt;/h2&gt;
&lt;p&gt;Factory&apos;s plan lives in Mission Control - a dashboard where you iterate with an orchestrator, approve the plan, and monitor execution. eforge commits plans to git - &lt;code&gt;orchestration.yaml&lt;/code&gt;, module plans, dependency graphs, all committed as the build runs and cleaned up when it&apos;s done. The full planning history is in version control, diffable and traceable, without cluttering the working tree.&lt;/p&gt;
&lt;p&gt;This is a design choice, not a limitation. When a build goes wrong, I can diff the plan against what was built and see exactly where the divergence happened. When a queued build starts, the planner re-assesses against the current codebase - if earlier builds changed the architecture, later plans adapt before executing rather than building against stale assumptions.&lt;/p&gt;
&lt;h2&gt;Open source, embeddable, free&lt;/h2&gt;
&lt;p&gt;eforge is &amp;lt;a href=&quot;https://github.com/eforge-build/eforge&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Apache 2.0&amp;lt;/a&amp;gt;. The tool I needed didn&apos;t exist, and the thing I built should be useful to others.&lt;/p&gt;
&lt;p&gt;It installs as a Claude Code plugin, a &amp;lt;a href=&quot;https://pi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Pi&amp;lt;/a&amp;gt; extension, or standalone via npm. Two backends - Claude Agent SDK and Pi, which connects to &amp;lt;a href=&quot;/posts/what-a-cheaper-model-actually-costs/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;over 20 LLM providers&amp;lt;/a&amp;gt;. The engine exposes an &lt;code&gt;AsyncGenerator&amp;lt;EforgeEvent&amp;gt;&lt;/code&gt; - it&apos;s a library, not just a CLI. It can live inside CI pipelines, get called from other agents, embed in custom tooling. Factory is a platform you log into. eforge is a component you compose with.&lt;/p&gt;
&lt;p&gt;The intent is a tool that feels free to use - not free as in &quot;free tier before the paywall&quot; but genuinely open, configurable, yours to run however you want. Agent-assisted setup through the plugin or extension means configuration takes seconds, not documentation-diving. The complexity is there if you want it - model selection down to individual agent roles, hooks, MCP servers - with sane defaults.&lt;/p&gt;
&lt;h2&gt;Different tools for different people&lt;/h2&gt;
&lt;p&gt;Factory is an enterprise platform - $50M in funding, deep integrations with Linear and Sentry and PagerDuty, computer-use validation, skill accumulation across builds. It&apos;s built for organizations that need to multiply throughput across teams.&lt;/p&gt;
&lt;p&gt;eforge is built for an individual developer who wants to drive. The tool amplifies judgment, it doesn&apos;t accumulate its own. The developer holds the patterns, understands the codebase, owns the plan. eforge executes faithfully and verifies rigorously - that&apos;s the scope, and it&apos;s deliberate.&lt;/p&gt;
&lt;p&gt;I&apos;ve been using eforge daily for three weeks, building real features across multiple projects - including eforge itself. It&apos;s young and rough around the edges. I built it with care, and I plan to keep building it.&lt;/p&gt;
</content:encoded></item><item><title>The Flinch</title><link>https://www.markschaake.com/posts/the-flinch/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-flinch/</guid><description>Everyone flinches at the moment they&apos;re supposed to let go of the code. The skill that matters now is planning well enough to trust the handoff.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve had a few conversations recently with people building in the agentic development space, and in each one, at some point, there&apos;s a flinch. One person gravitates back toward the IDE. Another hears about a workflow where no human reviews pull requests and says his team wouldn&apos;t go for that. The reasons vary but the discomfort is the same, and it&apos;s upstream of the tools entirely.&lt;/p&gt;
&lt;h2&gt;The actual bottleneck&lt;/h2&gt;
&lt;p&gt;The conventional workflow is: quick plan, get into the code, iterate fast. This works when the human is writing the code - course-correction happens in real time because the person executing is also the person thinking. Planning can be loose because execution is tight.&lt;/p&gt;
&lt;p&gt;Agentic development inverts this. The agent handles execution. The human handles planning. And the quality of that planning becomes the single biggest constraint on what comes out the other side.&lt;/p&gt;
&lt;p&gt;With &amp;lt;a href=&quot;https://eforge.build&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;eforge&amp;lt;/a&amp;gt;, I spend real time on a plan before any code gets written - not because the tool is slow, but because the plan has to be &lt;em&gt;that good&lt;/em&gt;. Every architectural choice, every module boundary, every acceptance criterion needs to be thought through to the point where I&apos;m confident handing it off to parallel agents who will build it without me watching. I read every line Claude produces during planning. I push back, ask for alternatives, challenge assumptions.&lt;/p&gt;
&lt;p&gt;It&apos;s closer to architecture review than coding - except the architecture review &lt;em&gt;is&lt;/em&gt; the work. Going that deep into the planning keeps me close to the codebase in a way that isn&apos;t so different from writing the code myself. I know the module boundaries, the data flows, the tradeoffs - not because I typed the implementation, but because I thought through every decision that shaped it.&lt;/p&gt;
&lt;p&gt;Even thirty minutes of careful, concentrated planning before a line of code exists feels wasteful when the instinct is to start building immediately. But with agents that can execute an entire module in parallel - and do it well if the spec is clear - the leverage is overwhelmingly in the planning.&lt;/p&gt;
&lt;h2&gt;Where the advantage actually is&lt;/h2&gt;
&lt;p&gt;The advantage I have here isn&apos;t technical skill - it&apos;s practice. Close to a year of agentic engineering, starting with skills and subagent frameworks I built myself and eventually building eforge out of that work. The whole time, building the instinct for what a plan needs to contain before it&apos;s ready to hand off. Early on I made the same mistakes: plans that were too vague, specs that left too much to interpretation, assumptions I didn&apos;t realize I was making. The agents would build something reasonable but wrong in ways that took longer to fix than if the plan had been right.&lt;/p&gt;
&lt;p&gt;The reps changed that. Planning now feels like the primary work - the thing that matters most, not the step before the thing that matters. But getting there took discipline that runs against every instinct built up from decades of coding.&lt;/p&gt;
&lt;p&gt;A friend I was talking with about this put it well: the gap isn&apos;t in the models or the tools, it&apos;s in the trust-building - the &lt;em&gt;planner&apos;s&lt;/em&gt; ability to produce something complete enough that autonomous execution is safe. Handing off execution and trusting the output will be right - that only happens after enough confidence in the handoff builds up, and it takes time. For me it was Opus 4.5 and 4.6 that got me there - the model was consistently good enough that I stopped needing to check every line of code and started trusting the plan-to-execution loop.&lt;/p&gt;
&lt;h2&gt;How I actually work now&lt;/h2&gt;
&lt;p&gt;The build phase &amp;lt;a href=&quot;/posts/the-handoff&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;already runs in the background&amp;lt;/a&amp;gt; - while eforge builds one thing, I&apos;m planning the next, sometimes in Claude&apos;s plan mode, sometimes in &amp;lt;a href=&quot;https://pi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Pi&amp;lt;/a&amp;gt; using an &amp;lt;a href=&quot;https://github.com/eforge-build/eforge/tree/main/packages/pi-eforge&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;eforge planning extension&amp;lt;/a&amp;gt; I built. The bar I hold each plan to isn&apos;t &quot;does this sound right&quot; but &quot;could someone who&apos;s never seen this codebase execute this and produce something I&apos;d ship.&quot; If five different agents could build it independently and produce roughly the same result, the plan is ready.&lt;/p&gt;
&lt;p&gt;Context-switching between plans is its own skill to develop, but the alternative is sitting idle while agents build, and that&apos;s wasted leverage.&lt;/p&gt;
&lt;h2&gt;The transition is the skill&lt;/h2&gt;
&lt;p&gt;Most AI developer tools are still built around human quality gates - a person reviewing code mid-development, a person approving pull requests. Those checkpoints made sense when the human was the only one who could catch problems. In my own work, both the writing and reviewing of code have moved to agents - I stay in the plan. Whether that&apos;s where everyone ends up, I don&apos;t know, but for this workflow the checkpoints feel like artifacts of an earlier constraint.&lt;/p&gt;
&lt;p&gt;The code is a downstream artifact. And the skill that determines whether that works - given models smart enough to execute well - is the ability to think clearly enough about what needs to be built that an autonomous system can build it right.&lt;/p&gt;
</content:encoded></item><item><title>What a Cheaper Model Actually Costs</title><link>https://www.markschaake.com/posts/what-a-cheaper-model-actually-costs/</link><guid isPermaLink="true">https://www.markschaake.com/posts/what-a-cheaper-model-actually-costs/</guid><description>The policy that governs my primary dev workflow lives in an X reply. That&apos;s its own kind of vendor risk.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I was mid-plan when the Anthropic announcement dropped - Claude Code subscriptions would no longer cover third-party harnesses. Tools like OpenClaw, which run continuous automated builds on Claude&apos;s infrastructure, now require separate pay-as-you-go billing. The subtext was straightforward: flat-rate pricing doesn&apos;t survive automated systems that run 24/7.&lt;/p&gt;
&lt;p&gt;My first question was whether &amp;lt;a href=&quot;https://eforge.run&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;eforge&amp;lt;/a&amp;gt; fell into the same bucket. Within hours, Boris Cherny - the creator of Claude Code - confirmed in an X reply that personal local tools wrapping the Claude Code harness, headless mode, and Agent SDK are still covered under subscriptions. eforge uses the Agent SDK to spin up Claude Code instances under my Max subscription - so it&apos;s probably fine. For now.&lt;/p&gt;
&lt;p&gt;But &quot;probably fine&quot; is doing a lot of work in that sentence. The clarification came from an X reply, not official documentation. Boris himself said he&apos;s &quot;working on improving clarity&quot; - which means the clarity doesn&apos;t exist yet. The policy that governs whether my primary development workflow keeps working is, at this moment, one person&apos;s tweet. That&apos;s its own kind of vendor risk, even when the answer is favorable.&lt;/p&gt;
&lt;p&gt;This is why I added a second backend to eforge last week. &amp;lt;a href=&quot;https://pi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Pi&amp;lt;/a&amp;gt; connects to over 15 LLM providers including local models. I built it as a vendor lock-in hedge. The Anthropic announcement didn&apos;t break anything - but it confirmed that the hedge was the right call.&lt;/p&gt;
&lt;h2&gt;The three costs of a cheaper model&lt;/h2&gt;
&lt;p&gt;The conversation about model pricing usually stops at the sticker price - cost per million tokens. That&apos;s the wrong number to optimize for. In an agentic build system, there are three distinct costs, and only one of them shows up on the invoice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Per-token cost&lt;/strong&gt; is what the provider charges. Opus is expensive. GPT 5.4 is cheaper. Local models like Google&apos;s Gemma 4 are free. Right now the pool of models I actually trust for this work is small - Opus, Sonnet, GPT 5 - but as more cross that threshold, per-token price becomes the tiebreaker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Correction overhead&lt;/strong&gt; is the hidden multiplier. I ran the same eval build across Opus and GPT 5.4 this week - Opus completed it in about four minutes, GPT 5.4 in three and a half. I also tried Gemma 4 locally, not as a serious alternative but to see how eforge&apos;s guardrails held up against a much smaller model. Despite roughly six times the token generation speed, it took over seven minutes - the speed advantage entirely consumed by rework. More correction passes, more review cycles, more back-and-forth before reaching a valid state. A model that&apos;s cheaper per token but triggers more review cycles isn&apos;t saving money. It&apos;s hiding the cost in a different line item.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build failure&lt;/strong&gt; is the catastrophic case. Not just more expensive than expected - a total loss. With Opus and a well-written plan, I&apos;ve rarely seen an eforge build fail because the model drifted too far during execution. The final validation pass recovers from minor issues, and the build lands. I had an hour-and-forty-five-minute Opus build yesterday that completed successfully - a large coordinated change across many files. The time didn&apos;t matter. What mattered was that I handed it off, moved on to other planning work, and came back to a successful result.&lt;/p&gt;
&lt;p&gt;The Gemma 4 experiment showed the extreme version of this - the same small eval succeeded once in 7 minutes, then failed the next attempt at 19 minutes. Same prompt, same eval, completely different outcomes. With Opus, a four-minute eval build lands every time, and so does a two-hour build. The confidence scales because the model holds coherence. That reliability gap is what eforge needs closed before smaller models become viable.&lt;/p&gt;
&lt;h2&gt;What the workflow actually requires&lt;/h2&gt;
&lt;p&gt;The way I work with eforge is simple: I plan carefully, I hand off, I move to planning the next thing. The build runs in the background. I trust it to succeed. That trust is the entire value of the system - it&apos;s what lets me stay in the planning layer instead of dropping back into implementation mode. And the trust isn&apos;t blind - it comes from two places: the quality of the model executing the build, and the quality of the plan I wrote before handing it off. Both matter. A great model with a sloppy plan will drift. A detailed plan with a weak model will still collapse. The combination is what makes the workflow reliable.&lt;/p&gt;
&lt;p&gt;The moment builds start failing unpredictably, I&apos;m pulled back into monitoring - and the &quot;free&quot; local model is actually costing me flow state.&lt;/p&gt;
&lt;p&gt;This reframes what &quot;model quality&quot; means in a harness context. The question isn&apos;t &quot;can this model write decent code?&quot; - it&apos;s whether it can hold architectural coherence across a thirty-file build while an adversarial reviewer pushes back on every hunk, and do it reliably enough that I never think about whether it will land. That&apos;s the difference between a model that demos well and a model that builds well. Most models can do the first. Only a handful of frontier models consistently do the second.&lt;/p&gt;
&lt;h2&gt;The dependency is real&lt;/h2&gt;
&lt;p&gt;eforge doesn&apos;t need the &lt;em&gt;best&lt;/em&gt; model. It needs a model above a quality floor - good enough that the adversarial reviewer is catching edge cases and style issues, not rewriting fundamentals. When the builder&apos;s output is structurally sound, the review layer refines it. When the builder&apos;s output drifts - wrong abstractions, misunderstood intent, conversational filler where precise code should be - the reviewer isn&apos;t refining, it&apos;s salvaging.&lt;/p&gt;
&lt;p&gt;That floor isn&apos;t fixed - it depends on the complexity of the build, the clarity of the plan, the number of files in play. But for the kind of work I do with eforge - large coordinated builds across many files - the floor is high. Right now, a small cluster of frontier models clear it: Opus, GPT 5, likely a couple of others. Before models at this level existed, the workflow wasn&apos;t possible - not difficult or expensive, just not possible.&lt;/p&gt;
&lt;p&gt;The pool is growing, but it&apos;s still small. The idea of eforge is &lt;em&gt;dependent&lt;/em&gt; on frontier intelligence in a way I can&apos;t architect around. I can make the model swappable. I can&apos;t make the methodology work with a model that isn&apos;t good enough.&lt;/p&gt;
&lt;h2&gt;Building for a shift that&apos;s visible but not here yet&lt;/h2&gt;
&lt;p&gt;That dependency is real, but it doesn&apos;t have to mean locked into one provider.&lt;/p&gt;
&lt;p&gt;The competitive dynamics are moving fast - Anthropic, OpenAI, Google, Meta, Mistral all racing on the same capabilities, each leap matched within months. That race drives per-token prices down and quality up simultaneously. What Opus costs today will buy something better in six months.&lt;/p&gt;
&lt;p&gt;The architectural response is to make the model a swappable component. eforge&apos;s Pi backend makes each agent role independently configurable, and the eval infrastructure is what makes it durable - if I can programmatically measure whether a model crosses the quality floor for each role, model selection becomes a config change backed by data, not a gut decision. The eval suite is where the durability lives, not the model it happens to evaluate.&lt;/p&gt;
&lt;p&gt;Anthropic&apos;s policy change is a nudge toward something that was going to happen anyway. Flat-rate subscriptions for automated agentic usage were a transitional artifact. The future is per-token pricing, and the question is whether competitive pressure drives those prices down fast enough that the workflow stays accessible.&lt;/p&gt;
&lt;p&gt;I think it will. The trajectory from Gemma 2 to Gemma 4 is steep. A future 70B model tuned for sustained multi-file implementation could close the gap on the metrics that actually matter for this workflow. Local execution with enough unified memory would make the marginal cost of a build effectively zero.&lt;/p&gt;
&lt;p&gt;The architecture needs to be ready for that moment. Provider-agnostic backends, per-agent model configuration, eval-driven quality gates - these decisions cost nothing if only one model is good enough today. They pay off the moment a second one crosses the floor. The planning layer is the same regardless - I wrote about that model-independence in &amp;lt;a href=&quot;/posts/the-flinch/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;The Flinch&amp;lt;/a&amp;gt;.&lt;/p&gt;
&lt;p&gt;That&apos;s the bet - not on any specific model, but on the market producing what the workflow needs at a price the workflow can sustain. I&apos;d rather be ready to swap than stuck rewriting when the economics shift.&lt;/p&gt;
</content:encoded></item><item><title>The Hill</title><link>https://www.markschaake.com/posts/the-hill/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-hill/</guid><description>Information asymmetry, the bitter lesson, and what stays durable when models keep getting smarter.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A friend was describing what it must be like inside a frontier AI company - &quot;a wonderful place to be sitting on a hill and looking at everyone else trying to climb it.&quot; They&apos;d be working with next-gen models before public release, already knowing which current friction is temporary while the rest of us place bets blind.&lt;/p&gt;
&lt;p&gt;This is the information asymmetry that everyone outside those companies lives with. We&apos;re investing in tooling, building integrations, designing architectures - and someone inside already knows which of those investments will be obsolete in a quarter. Not because they&apos;re smarter, but because they&apos;ve seen what&apos;s coming.&lt;/p&gt;
&lt;p&gt;Yesterday someone &amp;lt;a href=&quot;https://news.ycombinator.com/item?id=47584540&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;discovered that Claude Code&apos;s entire source code&amp;lt;/a&amp;gt; had shipped in an npm package - 500,000 lines, nearly 2,000 files, dozens of feature flags for capabilities that are fully built but haven&apos;t shipped. I looked at it, along with everyone else - some wanting to understand how things work under the hood, but a lot of the energy focused on the feature flags. What&apos;s coming next. What bets are about to pay off or stop making sense.&lt;/p&gt;
&lt;p&gt;I watch it playing out around me. People grabbing at opportunities, building fast, trying to find the angle that holds. Some will land on something durable. Many won&apos;t - they&apos;ll burn through savings or enthusiasm and quietly step back, and the industry will look completely different in a year. It&apos;s a discouraging dynamic to sit with, and I&apos;m not immune to it.&lt;/p&gt;
&lt;h2&gt;The bitter lesson&lt;/h2&gt;
&lt;p&gt;The AI community calls it &quot;the bitter lesson&quot; - as models get smarter, human-added complexity increasingly gets in the way. Simpler works best. &amp;lt;a href=&quot;https://www.youtube.com/watch?v=hV5_XSEBZNg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Nate&apos;s recent video&amp;lt;/a&amp;gt; lays this out well: &quot;Every AI system in production contains an invisible layer of workarounds for the last model&apos;s weaknesses, and most teams stopped seeing them as workarounds a long time ago.&quot;&lt;/p&gt;
&lt;p&gt;The core question he poses: is this instruction here because the model needs it, or because I needed the model to need it?&lt;/p&gt;
&lt;p&gt;The people most at risk aren&apos;t those who can&apos;t use AI - it&apos;s those whose value was built on &lt;em&gt;compensating for AI&apos;s limitations&lt;/em&gt;. Elaborate prompt scaffolding, complex retrieval pipelines, workaround architecture that outlived the limitation it was built for. Each model upgrade erodes that layer.&lt;/p&gt;
&lt;h2&gt;Where I sit&lt;/h2&gt;
&lt;p&gt;AI has written all my code for over six months now, and I feel secure for now. Deep systems experience translates directly to driving AI effectively - knowing which architectural choices are good or bad, course-correcting before bad decisions compound. There&apos;s consulting work as far as I can see.&lt;/p&gt;
&lt;p&gt;But I&apos;m also completely consumed by eforge right now - I&apos;m betting on it. Not casually - it&apos;s where my time goes, where my energy goes, and I think about what happens if it all turns out to be for nothing. When models internalize deep systems expertise - not just syntax but judgment about distributed systems, data modeling, failure modes - the value I bring narrows, and the tool I&apos;m building may narrow with it.&lt;/p&gt;
&lt;h2&gt;Building for the fade&lt;/h2&gt;
&lt;p&gt;So &amp;lt;a href=&quot;https://eforge.build&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;eforge&amp;lt;/a&amp;gt; forces me to look ahead. &amp;lt;a href=&quot;/posts/the-handoff&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;The build phase already runs in the background&amp;lt;/a&amp;gt; - eforge is meant to be &amp;lt;a href=&quot;/posts/the-layer-above&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;the layer above&amp;lt;/a&amp;gt; - but that layer needs to constantly evolve upward. Some structure is load-bearing: orchestration, topological merge order, the blind review architecture. Some is compensatory scaffolding I expect to remove as models improve. The hard part is knowing which is which, and having the discipline to let go of the compensatory parts even when I built them myself.&lt;/p&gt;
&lt;p&gt;Overprompting is the clearest example - all the careful wording that accommodates a model&apos;s current quirks but won&apos;t matter once the next version drops. Same with treating code review as a procedural checklist rather than thin scaffolding around model judgment, or building an opinionated abstraction layer where a shim would do. &quot;Am I adding this because the model needs it, or because I&apos;m uncomfortable letting go?&quot;&lt;/p&gt;
&lt;p&gt;One bet I&apos;m more confident in: staying flexible on providers. eforge supports &amp;lt;a href=&quot;https://github.com/badlogic/pi-mono/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;pi&amp;lt;/a&amp;gt; as a multi-provider backend specifically because locking into one vendor&apos;s API when the landscape shifts this fast seems like exactly the kind of compensatory decision that ages badly. Maybe eforge itself becomes the tool people use, maybe it&apos;s an inspiration for whatever comes next, maybe the value is just in the design principles it forces me to confront. I don&apos;t know which.&lt;/p&gt;
&lt;h2&gt;What stays&lt;/h2&gt;
&lt;p&gt;Models can solve problems, and they&apos;re getting better at it fast. What they don&apos;t do is decide which problems matter, whether the solution is actually right, or when to change direction entirely. I don&apos;t have a clean name for that role. It&apos;s not &quot;problem solver&quot; because the models are taking over more of that space. It&apos;s closer to judgment - the ability to evaluate, steer, and know when something is off before the cost compounds.&lt;/p&gt;
&lt;p&gt;Currently that judgment requires implementation intuition - deep enough understanding of underlying choices to know which ones are good. That requirement may fade as models improve, and I want to believe the judgment itself stays human.&lt;/p&gt;
</content:encoded></item><item><title>The Handoff</title><link>https://www.markschaake.com/posts/the-handoff/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-handoff/</guid><description>Abstracting away the build phase: learning to plan full time.</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI has written 100% of my code for over six months now - that part is settled. What&apos;s been shifting is everything else - the orchestration, the oversight, the gap between expressing what I want and trusting that it gets built correctly.&lt;/p&gt;
&lt;p&gt;I&apos;ve been classifying every commit across six projects by what kind of work it represents - feature, fix, refactor, rework, test, docs, ops. The weekly breakdown tells a story the aggregates can&apos;t.&lt;/p&gt;
&lt;p&gt;The docs category in the chart above is planning and methodology artifacts - architecture documents, module decompositions, scope assessments, verification criteria. It starts as a sliver and by the final week accounts for 42% of measured effort - not because the planning expanded, but because everything around it automated away. None of it was written by hand.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The shift happened in stages over the past few months, each one noticeable as it arrived.&lt;/p&gt;
&lt;p&gt;Once agents could read a plan and execute, the quality of the output tracked the quality of the plan, not the quality of any individual prompt. I started building skills and plugins that automated more of the coordination - planning workflows, review cycles, scope assessments. Each layer removed friction - the builds themselves ran hands-free once the plans were compiled and launched - but I was still the one invoking the skills to compile plans, kicking off the builds, managing worktrees, merging branches. The coordination was partially automated but still required manual orchestration, and there was no clean way to queue work - a build might run thirty minutes or more, and while I could start planning the next thing, I couldn&apos;t hand that plan off until the previous build finished. I was almost at the point of full handoff, but not quite.&lt;/p&gt;
&lt;p&gt;The plans themselves didn&apos;t get simpler - they&apos;re still detailed, still low-level enough that I can verify Claude has thought through the full architectural impact before anything gets built. I need to see enough specifics to know it isn&apos;t assuming too much. What changed is the form - less implementation specification, more intent specification - one tells the machine what to type, the other tells it what to solve. I expect the fidelity I need will drop as models improve, but right now getting the details right in the plan is where the engineering happens.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Last week I started building &amp;lt;a href=&quot;https://eforge.run&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;the layer above&amp;lt;/a&amp;gt; all of it - a tool that takes a plan at whatever fidelity I provide, assesses the complexity of the buildout against the existing codebase, and handles everything from there. Simple intent gets a simple execution path, complex intent gets compiled into a dependency graph of sub-plans that run in parallel across isolated workspaces, each one independently reviewed by parallel agents that have no knowledge of how the code was written - evaluating only whether it&apos;s correct.&lt;/p&gt;
&lt;p&gt;That&apos;s the part that changed how I work. I express the intent, hand it off, and move on to the next thing. Multiple builds run concurrently while I&apos;m already planning the next feature or thinking through the next architectural question. The build phase - the part that used to be the job - runs in the background. I check the results when they&apos;re done, and the independent review cycle catches the things I&apos;d catch in a code review if I were paying close attention.&lt;/p&gt;
&lt;p&gt;I no longer think about the build phase, and the early evidence suggests the output is better for it. The tool doesn&apos;t get tired and skip a review step. It doesn&apos;t decide a verification pass isn&apos;t worth the time at the end of a long session. After a week of dogfooding, the builds coming out of the automated pipeline are already more consistent than what my manually-orchestrated work produced the week before - not because the methodology changed, but because it actually gets followed every time.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Handing off the build doesn&apos;t mean handing off the thinking - it means the thinking is all that&apos;s left. The skills that matter now are architectural, not mechanical - the ability to think clearly about systems above the code and express that thinking in a form machines can execute reliably. The tool works &lt;em&gt;because&lt;/em&gt; I understand the systems I&apos;m asking it to build - how the components interact, where the failure modes live, what tradeoffs matter for this specific context. An intent spec written without that understanding produces exactly the kind of confidently wrong output that gives AI-generated code its reputation.&lt;/p&gt;
&lt;p&gt;I don&apos;t know yet whether the tool I&apos;ve been building is a product or just my own workflow made portable, but the pattern underneath it feels durable - build quality as a function of intent quality, not engineering effort.&lt;/p&gt;
</content:encoded></item><item><title>What the Diff Already Knows</title><link>https://www.markschaake.com/posts/what-the-diff-already-knows/</link><guid isPermaLink="true">https://www.markschaake.com/posts/what-the-diff-already-knows/</guid><description>An LLM reading a git diff cold can classify the nature of the work - feature, rework, refactor - with a granularity that file-level metrics can&apos;t touch.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import ChurnVsReportedReworkChart from &apos;../../components/ChurnVsReportedReworkChart.astro&apos;;
import WorkCompositionChart from &apos;../../components/WorkCompositionChart.astro&apos;;&lt;/p&gt;
&lt;p&gt;I had a number on my dashboard that tracked whether my agents&apos; output held - files committed in one session and re-edited within a week in a later session, weighted by edit frequency. It was the most useful signal in my &amp;lt;a href=&quot;/posts/what-the-numbers-show&quot;&amp;gt;agentic workflow tracking&amp;lt;/a&amp;gt;, and it was blunt enough to bother me.&lt;/p&gt;
&lt;p&gt;The commit diffs already contained everything I needed to sharpen it. I just hadn&apos;t thought to read them.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;My monitoring system already syncs commits from GitHub - it pulls the metadata, ties commits to clusters of agentic coding sessions, and feeds the dashboard that tracks the churn metrics from the previous post. When a new commit arrives, the system has the diff. And the diff is the evidence. An LLM reading it cold - with no memory of the decisions that produced the code - can see what changed, infer the intent from the structure of the changes, and classify the nature of the work. The classification is a natural extension of a sync pipeline that already exists.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The churn metric I built first did one thing well - it surfaced files that kept getting re-edited across sessions within a short window. But it had specific blindnesses that became harder to ignore the more I used it.&lt;/p&gt;
&lt;p&gt;It couldn&apos;t distinguish planned iteration from failure. A feature that legitimately spans two sessions and a specification that didn&apos;t hold both look identical - same file, edited again within a week. The metric treated a documentation edit and a rework edit identically, because it only saw files, not intent. And it said nothing about the &lt;em&gt;kind&lt;/em&gt; of work being done. I could see that rework was happening. I couldn&apos;t see what else was happening alongside it - how much testing accompanied the feature work, how much was proactive restructuring versus reactive correction.&lt;/p&gt;
&lt;p&gt;The churn metric could detect rework. It couldn&apos;t tell me anything else about what was happening in the commit.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;When the sync pipeline encounters a new commit, it fetches the diff and classifies the work across seven categories: feature, fix, refactor, rework, test, docs, ops. The taxonomy is a first pass - chosen quickly and likely to evolve as the data reveals which distinctions carry weight and which don&apos;t. Percentages sum to 100%, rounded to the nearest 5%, weighted by effort and complexity rather than line count. Only categories with non-zero values get stored.&lt;/p&gt;
&lt;p&gt;A straightforward feature commit produces a classification like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feat: add session duration tracking to dashboard
→ feature=85% test=15%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A commit that revises yesterday&apos;s implementation after realizing the interface didn&apos;t fit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fix(api): restructure session grouping logic
→ rework=60% fix=25% test=15%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Work composition across all seven categories over the past few months:&lt;/p&gt;
&lt;p&gt;&amp;lt;WorkCompositionChart /&amp;gt;&lt;/p&gt;
&lt;p&gt;The most important design decision is the boundary between rework and refactor. Rework means revising something recently written - the specification was undercooked, the context was insufficient, or the approach didn&apos;t survive contact with the next session&apos;s requirements. Refactor means proactive restructuring of code that already works and is stable - improving the structure for what comes next, not correcting what came before. They look identical in a diff. They mean opposite things about the health of the process.&lt;/p&gt;
&lt;p&gt;The classifying agent draws that line from the diff alone - it wasn&apos;t there when the code was written, so it has no sunk-cost attachment to calling something &quot;refactor&quot; when it&apos;s actually rework. A human tagging commits after the fact is doing retrospective categorization from memory, with all the rationalization that implies. The agent has no memory to distort. It reads the diff, sees that yesterday&apos;s interface got restructured, checks git history for recency, and classifies accordingly.&lt;/p&gt;
&lt;p&gt;The classifications aren&apos;t ground truth - they&apos;re one model&apos;s reading of structural evidence, and I haven&apos;t tested how consistent they are across runs or model versions. But the bar isn&apos;t perfection. It&apos;s whether the signal is sharper than what churn alone provides, and so far the answer is obviously yes.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Both signals now live on the same dashboard - the old churn metrics alongside the new classification - because they&apos;re measuring different things about the same commits. Churn gives a backward-looking behavioral signal - did the same files get re-edited within a window? The classification gives a forward-looking intentional signal - what kind of work does the diff represent?&lt;/p&gt;
&lt;p&gt;When they agree - low churn paired with low reported rework - confidence is high. The output is holding and the agent is classifying it that way. When they diverge, that&apos;s where the interesting questions live. High reported rework but low churn might mean the rework happened within a single session, invisible to the file-level metric. Low reported rework but high churn might mean the agent is classifying planned iteration as feature work when the file-level signal says otherwise.&lt;/p&gt;
&lt;p&gt;The classification data is a few months old now - enough to see patterns in the noise, not enough to draw firm conclusions. But the parallel period is itself the point. Running both metrics against the same commit history builds a cross-validation baseline. When enough data accumulates, the places where the two signals agree and disagree will tell me something about the reliability of each.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;An earlier version embedded the classification in the commit message itself, but my orchestration plugin - which spawns agents across worktrees - wasn&apos;t using the commit skill. Every orchestrated commit was missing the classification. The coverage problem pointed to where it actually belongs: in the system that cares about the metrics, not in the commit path.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The richer signal goes beyond rework. Testing percentage becomes a trackable metric over time - how much testing accompanies feature work in practice, not in aspiration. The feature-to-fix ratio across a project&apos;s lifecycle tells a story about whether early architecture decisions are holding or accumulating correction debt. Docs investment, which churn couldn&apos;t see at all, becomes visible.&lt;/p&gt;
&lt;p&gt;The testing composition is the one I&apos;m watching most closely - whether a consistent testing allocation in commits correlates with lower downstream rework. If it does, that&apos;s a signal that can feed back into the agents&apos; work prompts. Not a mandate - a calibration.&lt;/p&gt;
&lt;p&gt;Over a project&apos;s lifecycle, the composition should shift - feature-heavy early, testing and refactor growing as the codebase matures, rework spiking mid-project when specifications are still being discovered and declining as the planning process learns what level of detail holds up.&lt;/p&gt;
&lt;p&gt;File-level churn against classified rework over the same period - their divergences reveal what each signal misses:&lt;/p&gt;
&lt;p&gt;&amp;lt;ChurnVsReportedReworkChart /&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Every commit becomes a data point about the process, not just the product. The diff already knew that - it just needed a reader with no memory.&lt;/p&gt;
</content:encoded></item><item><title>What the Numbers Show</title><link>https://www.markschaake.com/posts/what-the-numbers-show/</link><guid isPermaLink="true">https://www.markschaake.com/posts/what-the-numbers-show/</guid><description>I&apos;ve been tracking machine hours, session concurrency, and code rework across my agentic workflows. The most useful thing the data surfaced wasn&apos;t about the machines.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import WallVsMachineChart from &apos;../../components/WallVsMachineChart.astro&apos;;
import MachineWallRatioChart from &apos;../../components/MachineWallRatioChart.astro&apos;;
import RatioVsChurnChart from &apos;../../components/RatioVsChurnChart.astro&apos;;&lt;/p&gt;
&lt;p&gt;I&apos;ve been tracking my machine time. Not in the abstract - literal machine hours, measured by hooks in my Claude Code setup that fire events to an API whenever a session starts, a tool executes, or a session ends. A git integration ties commits back to clusters of sessions on the same repo. The whole thing is maybe 150 lines of bash and an API endpoint, took an afternoon to build, and runs quietly in the background while I work.&lt;/p&gt;
&lt;p&gt;The ratio of machine hours to wall hours across my projects has been trending toward 1.5 - meaning for every hour of clock time on a project, the machines are running for about ninety minutes. It&apos;s a parallelism indicator, not a production measure - it says nothing about what those machine hours produce, only that multiple agents are working simultaneously.&lt;/p&gt;
&lt;p&gt;And the ratio understates the actual leverage, because each machine-hour is itself already some multiple of what I&apos;d accomplish alone. But estimating that multiple honestly is harder than it sounds. I&apos;m a Scala engineer - fifteen years on the JVM - building fullstack TypeScript because the models are fluent in it. I&apos;ve written virtually no TypeScript by hand. The leverage multiplier for routine scaffolding isn&apos;t just large, it&apos;s undefined - I don&apos;t have a denominator. Even for architecture work closer to my experience, the per-session leverage is real and the 1.5 machine:wall ratio compounds on top of it. The precise number isn&apos;t the point.&lt;/p&gt;
&lt;p&gt;Sometimes I&apos;m at the keyboard during that hour, working alongside the agents. Sometimes I&apos;m not there at all - an expedition plan kicked off before lunch, agents executing across worktrees while I&apos;m playing tennis or homeschooling my son. That felt like progress when I first noticed it. It still does. But the number hides more than it reveals.&lt;/p&gt;
&lt;p&gt;&amp;lt;WallVsMachineChart /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;MachineWallRatioChart /&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Right now I have five Claude Code terminal sessions open - some running, some waiting for my next instruction. That itself was an evolution. When I started, I ran one session at a time. Over months I learned to parallelize my own attention, hopping between projects and between modules within a project, maintaining progressive flow in each thread. This is a different kind of parallelism from the orchestrated handoff - it&apos;s &lt;em&gt;my&lt;/em&gt; concurrency, not just the machines&apos;.&lt;/p&gt;
&lt;p&gt;The bursts where the machine:wall ratio spikes above 2 happen when I fully hand off orchestrated execution of plans that were produced in earlier planning sessions. But the steady-state ratio around 1.5 reflects something subtler: multiple sessions running simultaneously because I&apos;ve learned to hold multiple threads of work in my head at once.&lt;/p&gt;
&lt;p&gt;On a given day I might have three projects in flight, each getting that kind of leverage. But even this dissolves under scrutiny, because one of those projects might be in a planning phase where everything is single-threaded and the ratio sits near 1:1, while another is in burst execution with agents working across git worktrees and the ratio spikes.&lt;/p&gt;
&lt;p&gt;And planning - the work that produces the most parallelism downstream - is inherently sequential. Two hours designing the architecture and decomposing the work, then four agents execute simultaneously. The planning shows up as low throughput on any dashboard. The execution shows up as the spike. Neither tells the full story alone, and if I were watching only the ratio, I&apos;d be rewarding the wrong phase of the work.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Dan Shapiro &amp;lt;a href=&quot;https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;published a framework&amp;lt;/a&amp;gt; earlier this year that maps AI adoption across five levels - from &quot;spicy autocomplete&quot; up to the &quot;dark factory&quot; where no human writes or reviews code. I recognized my own trajectory in the middle levels, and the framework gave language to something I&apos;d been circling: every level feels complete from the inside. Shapiro says this explicitly, and in conversations with engineering leaders I&apos;ve seen the same thing - teams describing themselves as further along than their workflows suggest. Self-assessment is &amp;lt;a href=&quot;/posts/from-assisted-to-agentic&quot;&amp;gt;demonstrably unreliable&amp;lt;/a&amp;gt;. The question isn&apos;t how productive someone &lt;em&gt;feels&lt;/em&gt;. It&apos;s what the data says about how they&apos;re actually working.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There&apos;s a cycle in the data I think of as planning-to-burst. In weeks where I spend more wall time reading, exploring, and writing specifications - sessions heavy on Read and Explore tools with few edits - the following sessions tend to be dense with parallel execution and high commit output. The planning sessions look slow on any throughput metric. They&apos;re the highest-leverage hours of the week. An engineer who&apos;s learned to invest in the planning phase before touching implementation is working differently from one who starts editing immediately, even if their machine:wall ratios are similar.&lt;/p&gt;
&lt;p&gt;Session concurrency is a clear signal. When I started with Claude Code, all my work was a single terminal session - one agent, iterating together. Over months, I&apos;ve shifted toward orchestration patterns that spawn multiple Claude Code sessions across git worktrees, each tracked independently. Four sessions running in parallel on the same project, each with its own event stream, each producing commits.&lt;/p&gt;
&lt;p&gt;That shift - from working with AI to orchestrating AI - maps directly onto Shapiro&apos;s progression from the middle levels toward the upper ones, and it shows up in the data as concurrent sessions that the API clusters into session groups. The measurement granularity is the terminal session, not the individual tool call, and that turns out to be the right level - it captures the deliberate parallelism that reflects how someone has decomposed the work, not the incidental parallelism happening inside the agent runtime.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The data suggests a progression. A ratio at 1.0 means one session at a time - the agent as pair programmer, which is where &amp;lt;a href=&quot;https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Shapiro estimates&amp;lt;/a&amp;gt; about 90% of self-described AI-native developers still operate. When concurrent sessions start appearing and the ratio lifts above 1.0, the developer is directing agents rather than writing alongside one. Further along, planning phases lengthen and execution happens in bursts across parallel sessions - the developer&apos;s primary output becomes specifications and judgment, not code.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The progression above is entirely about throughput and parallelism. A team could look good on every one of those signals while producing code that keeps getting reworked. The machine:wall ratio says nothing about whether the work sticks.&lt;/p&gt;
&lt;p&gt;Code churn is the usual way to measure rework - files modified and then modified again within a short window. But calendar-based churn is a blunt instrument in agentic workflows because it can&apos;t distinguish planned multi-session work from rework. A file committed in one session and revised in a follow-up session the next day might mean the first session&apos;s output didn&apos;t hold - the specification was undercooked, the context was insufficient, or the task decomposition was wrong. Or it might mean the feature legitimately spans two sessions.&lt;/p&gt;
&lt;p&gt;I started tracking whether files committed in one session got re-edited in a later session within a week - a rough proxy for whether the first session&apos;s output actually held. Not every cross-session re-edit is rework - legitimate features span multiple sessions - but persistent revision of recently produced files is a signal worth watching. I want that number minimal and trending down - as models improve, as the harness gets tighter, as the planning process learns what level of specification produces output that survives to the next session.&lt;/p&gt;
&lt;p&gt;Even that metric needed its own iteration. My first version treated all cross-session edits equally - a file touched once in a follow-up session counted the same as one touched seven times. But those are different signals. A single re-edit might be a legitimate extension; seven re-edits means the specification didn&apos;t hold. Refining the metric to weight by edit frequency sharpened the signal, and the process of refining it was itself a case of the rework the metric was trying to measure - caused not by the agents but by my own insufficient research into what I was actually trying to capture.&lt;/p&gt;
&lt;p&gt;A rising machine:wall ratio paired with flat or declining session rework is the signal of genuine progress - more parallel execution, and the output holds up. A rising ratio paired with rising rework means the parallelism is producing work that doesn&apos;t survive contact with reality. Agents stepping on each other, specifications undercooked, review too thin to catch problems before they compound. That pattern looks productive on any throughput dashboard. The rework data shows it isn&apos;t.&lt;/p&gt;
&lt;p&gt;The type of work complicates the signal further. I categorize my work into &amp;lt;a href=&quot;/posts/expedition-excursion-errand&quot;&amp;gt;expeditions, excursions, and errands&amp;lt;/a&amp;gt; - ranging from heavily planned multi-session projects to quick iterative fixes. Errand-level work naturally produces more churn because the thrashing is the solution-crafting process, not a failure of planning. It&apos;s the expedition and excursion work - where I invest in decomposition before burst execution - where rework signals something actually went wrong upstream. The metric doesn&apos;t distinguish between these categories yet, and until it does, the interpretation requires context I carry in my head.&lt;/p&gt;
&lt;p&gt;But the most useful thing the rework data has surfaced so far isn&apos;t about the agents at all - it&apos;s about me. Watching the numbers and tracing rework instances back to the sessions that produced them gives me something I didn&apos;t have before - a feedback loop. I care more about planning now because I can see its real impact downstream, both when I invest in it and when I skip it.&lt;/p&gt;
&lt;p&gt;The planning-to-burst cycle should predict this - sessions starting with thorough decomposition producing lower-rework output downstream, sessions that skip planning and go straight to parallel execution producing high throughput and high rework. I don&apos;t have enough data yet to confirm the pattern, but it&apos;s the hypothesis the measurement is designed to test.&lt;/p&gt;
&lt;p&gt;&amp;lt;RatioVsChurnChart /&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;In a team context, these behavioral signals look less like a dashboard and more like a conversation prompt. The shifts are gradual - a machine:wall ratio lifting from 1.0 to 1.2 over three weeks as someone starts running concurrent sessions for the first time. Planning share increasing as the investment in specification starts to precede execution. An engineer whose edit-loop frequency is high - the same files getting revised repeatedly within a session - might be at a different point in the transition than one whose sessions are heavy on planning tools and light on edits. Session rework rate layered on top of the ratio sharpens the picture further - two engineers with identical machine:wall ratios look very different when one has 8% rework and the other has 25%. The data doesn&apos;t diagnose anything, but it makes patterns visible that would otherwise stay hidden behind the same commit log.&lt;/p&gt;
&lt;p&gt;An engineer whose ratio has sat at 1.0 for weeks might not have made the shift from writing alongside the agent to directing it - or might be deep in a planning phase that hasn&apos;t reached execution yet. The same number means different things depending on where someone is in their work. The measurement doesn&apos;t replace the conversation. It gives the conversation something concrete to start from.&lt;/p&gt;
&lt;p&gt;The tools landscape is moving fast enough that today&apos;s instrumentation might not apply to tomorrow&apos;s harness. The measurement itself is scaffolding - useful during the specific window where a team is learning to work differently, not permanent infrastructure. What sticks after the scaffolding comes down isn&apos;t the dashboard. It&apos;s the instincts that developed while the data was making the transition visible.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Measurement can&apos;t capture the moment someone&apos;s relationship to the code shifts - when they stop thinking of themselves as the person who writes it and start thinking of themselves as the person who specifies what should exist. That shift is internal and gradual and doesn&apos;t map cleanly to any metric. But its shadows are in the data. The numbers don&apos;t cause the shift. They&apos;re how you notice it&apos;s underway.&lt;/p&gt;
</content:encoded></item><item><title>Support Theater</title><link>https://www.markschaake.com/posts/support-theater/</link><guid isPermaLink="true">https://www.markschaake.com/posts/support-theater/</guid><description>Six agents, one thread, zero investigation - what happens when customer support optimizes for the performance of help instead of help itself.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My son got $40 in Gorilla Tag gift cards for his birthday. He has a parent-managed Meta account - the kind Meta requires for kids under 13 - and the gift cards wouldn&apos;t redeem to his account. So I bought him $50 in Meta credits directly, thinking that would let him buy what he wanted in-game. Those didn&apos;t work either. $90 total, locked somewhere in Meta&apos;s system, inaccessible.&lt;/p&gt;
&lt;p&gt;I opened a support case. Case #09205181. What followed was the single worst customer support experience I&apos;ve had with any company, and I&apos;ve been through Comcast hold queues.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The first agent asked for my full name, my son&apos;s account details, and the gift card codes. I provided everything. The second agent greeted me warmly - fresh introduction, fresh name, same questions. I provided everything again. The third agent did the same thing. Then the fourth. Then the fifth.&lt;/p&gt;
&lt;p&gt;Five different agents in a single day, each one opening with a variation of &quot;Hi Mark, welcome back to Meta Store Support, hope this email finds you well.&quot; Each one asking for information sitting right there in the thread they were replying to. None of them investigating anything.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The fifth agent, Cullen, tried something new. Instead of asking me for information I&apos;d already given, he asked me to do his job - log into auth.meta.com with my son&apos;s account and report back whatever error messages I saw. The support process had outsourced the investigation to the customer.&lt;/p&gt;
&lt;p&gt;I replied. I was direct. I pointed out the pattern - five agents, five identical greetings, five requests for the same information, zero investigation. I asked them to stop and actually look at what I&apos;d already sent. I asked for escalation.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Agent number six replied within the hour. Cherry. &quot;Hi Mark, welcome back to Meta Store Support. Hope this email finds you well.&quot;&lt;/p&gt;
&lt;p&gt;She asked if I had attempted to redeem the gift card. The thing I&apos;d explained in my very first message. The thing five agents had already asked about. The thing sitting in the thread she was replying to.&lt;/p&gt;
&lt;p&gt;Then she wrote this sentence: &quot;After we receive the information you have provided, we will be happy to investigate further.&quot;&lt;/p&gt;
&lt;p&gt;She acknowledges the information exists - I&apos;ve &lt;em&gt;provided&lt;/em&gt; it - and then says they need to receive it before they can act. It&apos;s contradictory within a single sentence.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Nobody is reading anything. These aren&apos;t humans - the pattern makes that obvious. An agent opens the case, scans for a category, generates a warm greeting and a template response, and hands it off. The next one does the same thing. Six times. Each with a different name, each with the same inability to actually read the thread or do anything with the information in it. It&apos;s support as performance - every element of helpfulness present except the help itself.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;What makes this worse is the context. Meta built the parent-managed account system. They require it for kids under 13. They sell gift cards designed to be redeemed on these accounts. And when their own system breaks at the intersection of these two things they built, there&apos;s no one on the other end who can actually look at the account and figure out what&apos;s wrong. Six agents deep and not a single one has touched the actual system.&lt;/p&gt;
&lt;p&gt;$90 isn&apos;t a lot of money. But it&apos;s birthday money and a dad&apos;s attempt to work around a broken system, all locked behind a support process that exists to look like support without functioning as support. The cruelty isn&apos;t in the dollar amount - it&apos;s in the theater.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Then the account got suspended. Age verification, according to Meta - triggered, I can only assume, by the support thread itself. I asked for help, asked for escalation, and the system responded by locking the account.&lt;/p&gt;
&lt;p&gt;To unsuspend, I need to enter my son&apos;s birthday - the exact date I used when I created the account. I don&apos;t use my kids&apos; real birthdays on platforms - I use dates close to their real ones because I don&apos;t want their personal information sitting in systems I don&apos;t control. My son is well past Meta&apos;s age threshold, but I can&apos;t remember the precise date I entered when we created his account, and Meta&apos;s verification requires an exact match. No alternative path, no human to work through it with.&lt;/p&gt;
&lt;p&gt;The account is effectively bricked. Not because my son is too young, not because we violated any policy - because I asked for support, something in the process flagged the account, and the recovery gate assumes perfect recall of a date I deliberately made inexact for privacy reasons.&lt;/p&gt;
&lt;p&gt;My son bought his Quest with his own money last summer. He&apos;s concluded that Meta stole his birthday money and his account. We&apos;re buying a &amp;lt;a href=&quot;https://store.steampowered.com/sale/steamframe&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Steam Frame&amp;lt;/a&amp;gt; as soon as they&apos;re available, and Meta won&apos;t see another dollar from us.&lt;/p&gt;
</content:encoded></item><item><title>From Assisted to Agentic</title><link>https://www.markschaake.com/posts/from-assisted-to-agentic/</link><guid isPermaLink="true">https://www.markschaake.com/posts/from-assisted-to-agentic/</guid><description>AI tool adoption is nearly universal among engineering teams, but the workflows underneath haven&apos;t moved.</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I did a fractional CTO engagement last year where I spent weeks building with agentic engineering workflows - specs before prompting, validation as real-time feedback, AI as a system component rather than a typing assistant. When it came time to hand the work off, the gap between how I&apos;d been building and how the team was working was enormous. Not a gap in talent or effort - a gap in methodology. I spent time teaching, trying to transfer not just the tools but the framework around them. Whether it stuck, I don&apos;t know.&lt;/p&gt;
&lt;p&gt;In conversations with engineering leaders at other companies since, I hear the same starting point. Some say their teams have adopted AI tools, but when I ask how it&apos;s changed the way they work, the answer gets vague. Others are openly skeptical that AI has much to offer their engineering process at all - unaware, it seems to me, of how much the landscape has shifted underneath them.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The data confirms what I saw in that handoff is the norm. Deloitte&apos;s &amp;lt;a href=&quot;https://www.deloitte.com/us/en/about/press-room/state-of-ai-report-2026.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;2026 State of AI report&amp;lt;/a&amp;gt; surveyed over 3,000 leaders and found that 37% of organizations are using AI at a surface level with little or no change to existing processes, and only 30% are actually redesigning workflows around the tools. Stack Overflow&apos;s &amp;lt;a href=&quot;https://survey.stackoverflow.co/2025/ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;2025 developer survey&amp;lt;/a&amp;gt; found 84% of developers using or planning to use AI tools, but 66% cite &quot;almost right&quot; code as their biggest frustration - output close enough to look useful but wrong enough to require debugging.&lt;/p&gt;
&lt;p&gt;And the abandonment numbers tell the same story. An &amp;lt;a href=&quot;https://www.ciodive.com/news/AI-project-fail-data-SPGlobal/742590/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;S&amp;amp;P Global survey&amp;lt;/a&amp;gt; found 42% of companies pulled back from most AI initiatives in 2025, up from 17% the year before - not because the tools got worse, but because the organizations never adapted around them. The tools are installed but the workflows haven&apos;t moved.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The clearest picture of what the gap looks like in practice comes from &amp;lt;a href=&quot;https://www.tweag.io/blog/2025-10-23-agentic-coding-intro/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Tweag&amp;lt;/a&amp;gt;, which ran a controlled experiment - two engineering squads building the same product, one using traditional methods, the other using structured agentic workflows. The agentic team had 30% fewer engineers and delivered in half the time, with consistent code quality verified by SonarQube and human reviewers.&lt;/p&gt;
&lt;p&gt;The important word there is &lt;em&gt;structured&lt;/em&gt; - the agentic team didn&apos;t just have better autocomplete, they worked differently. Specs before prompting, validation tools as feedback loops, a deliberate workflow architecture that treated the AI as a system component rather than a typing assistant. That&apos;s what I was trying to transfer in the handoff - not a tool recommendation but a way of working.&lt;/p&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://every.to/source-code/inside-the-ai-workflows-of-every-s-six-engineers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Every.to&amp;lt;/a&amp;gt; documents something similar at a smaller scale - six engineers running four AI products, multiple AI instances in parallel for different task streams. The gap between &quot;we have Copilot&quot; and &quot;we have structured agentic workflows&quot; is mostly a gap of deliberate design, not capability.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;What makes this harder to navigate is that the productivity gains are genuinely difficult to measure - and teams consistently misjudge them. When &amp;lt;a href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;METR studied&amp;lt;/a&amp;gt; experienced developers working on real tasks from their own codebases, the developers believed they were faster with AI tools. They were actually slower. That perception gap - feeling productive while measurably losing ground - ran consistently across the study and suggests that self-reported gains from AI tooling deserve more skepticism than they&apos;re getting.&lt;/p&gt;
&lt;p&gt;And the organizational dynamics compound the problem. &amp;lt;a href=&quot;https://jellyfish.co/blog/2025-ai-metrics-in-review/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Jellyfish analyzed over two million pull requests&amp;lt;/a&amp;gt; and found that full AI adoption increased PRs merged per engineer by 113%, but review time increased by 91% - more code flowing through a review pipeline that wasn&apos;t designed for the volume, with &amp;lt;a href=&quot;https://www.faros.ai/blog/ai-software-engineering&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;no correlation&amp;lt;/a&amp;gt; between individual productivity gains and what organizations actually shipped.&lt;/p&gt;
&lt;p&gt;Small teams have a structural advantage here - fewer handoffs, shorter feedback loops, less process between the developer and the deployment. At five people, the person writing with AI assistance often reviews their own output. At twenty or fifty, the review queue backs up and individual gains disappear into organizational friction.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;But the productivity framing might be the wrong lens entirely. Since I started working with Claude Code in 2025, the shift I&apos;ve felt most isn&apos;t speed - it&apos;s scope. Early on I built an AI microservice that replaced an AWS Textract dependency in my SaaS - better extraction quality at lower cost. Without agentic workflows, that project would have meant weeks of dedicated focus - reading documentation, researching APIs, the kind of concentrated effort that demands its own block of calendar. Instead I built it in parallel with higher-priority work, almost as a side channel. The leverage isn&apos;t just that each task gets faster - it&apos;s that tasks which previously required dedicated focus can now run alongside other work, which means the total surface area of what one person can take on expands in ways that a speed metric doesn&apos;t capture.&lt;/p&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://www.anthropic.com/research/how-ai-is-transforming-work-at-anthropic&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Anthropic&apos;s internal engineering study&amp;lt;/a&amp;gt; found the same pattern at scale - they surveyed 132 engineers and discovered that 27% of Claude-assisted work consisted of tasks that &lt;em&gt;wouldn&apos;t have been done otherwise&lt;/em&gt;. Backend engineers building UIs. Researchers creating data visualizations. Not the same things faster, but things that wouldn&apos;t have been attempted at all. A five-person team operating with the breadth of a fifteen-person team isn&apos;t faster - it&apos;s structurally different.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The teams that haven&apos;t made this transition aren&apos;t behind on tooling - the tools are a commodity, everyone has access to roughly the same models and capabilities. What separates the Tweag experiment from the 42% that abandoned their initiatives is whether the team redesigned how they work or just added a new tool to the existing process.&lt;/p&gt;
</content:encoded></item><item><title>The Layer Above</title><link>https://www.markschaake.com/posts/the-layer-above/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-layer-above/</guid><description>The Codex-vs-Claude-Code debate is comparing the wrong layer.</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Codex-vs-Claude-Code discourse has been hard to avoid lately. OpenAI launched GPT-5.3-Codex with a dedicated desktop app, and the takes landed fast - Codex is the autonomous co-worker, Claude Code is the interactive collaborator. The framing is tidy: if you can write clean specs, hand them to Codex and walk away. If your work is messier, more exploratory, more iterative, Claude Code meets you where you are. Pick the right tool for the job.&lt;/p&gt;
&lt;p&gt;I installed Codex and was about to start testing it when a familiar feeling pulled me back - the sense that evaluating was detracting from the actual work, that I wasn&apos;t yet convinced this would be a good use of time right now. And the question I kept circling wasn&apos;t really about Codex at all - it was whether the comparison framework itself is the right lens for what matters.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The models underneath are converging. &amp;lt;a href=&quot;https://www.vals.ai/benchmarks/swebench&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;SWE-bench Verified&amp;lt;/a&amp;gt; has Opus 4.5 at 80.9%, Opus 4.6 at 80.8%, and GPT-5.2 Codex at 80.0% - essentially a dead heat. The capability gap that might justify switching tools isn&apos;t in the numbers. Where the tools actually differ is in the harness - the layer above the model: the interface, the defaults, the philosophy of how much autonomy the tool assumes out of the box. Claude Code, Codex, Pi - different harnesses, different fittings, same converging capability pool underneath.&lt;/p&gt;
&lt;p&gt;Some of the analysis being published draws broad conclusions from narrow evidence. A &amp;lt;a href=&quot;https://blog.nilenso.com/blog/2026/02/12/codex-cli-vs-claude-code-on-autonomy/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Nilenso blog post&amp;lt;/a&amp;gt; characterized Codex as a &quot;scripting-proficient intern&quot; and Claude Code as a &quot;senior developer who asks clarifying questions&quot; - but this was based largely on reading system prompts, not extended use. In practice, Claude Code with permissions bypassed and a clear plan doesn&apos;t pause to ask anything. It executes. The characterization describes a default out-of-the-box posture, not how the tool actually behaves once configured for autonomous work.&lt;/p&gt;
&lt;p&gt;Meanwhile, a &amp;lt;a href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;METR study&amp;lt;/a&amp;gt; found that experienced developers using AI tools were 19% slower on average while believing they were 20% faster. If experienced developers can&apos;t reliably tell whether their tools are helping, the confident declarations about which tool is better for which task deserve more skepticism than they&apos;re getting.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The framing that Codex is the right tool for autonomous, spec-driven work treats Claude Code&apos;s interactive default as a limitation. It&apos;s not - it&apos;s a starting position.&lt;/p&gt;
&lt;p&gt;I&apos;ve been building on top of Claude Code for the better part of a year. The result is a &amp;lt;a href=&quot;/posts/expedition-excursion-errand&quot;&amp;gt;workflow framework&amp;lt;/a&amp;gt; that ranges from fully hands-off parallel execution across git worktrees to conversational single-agent work - the kind of thing that accrues naturally when you stay with a tool long enough to understand where its edges are and how to extend them. The &quot;hand it off and walk away&quot; experience isn&apos;t unique to Codex. It&apos;s what depth produces on any capable foundation.&lt;/p&gt;
&lt;p&gt;So when the comparison discourse says Codex is better for autonomous work and Claude Code is better for iterative work, what it&apos;s really comparing is one harness&apos;s out-of-the-box experience against another harness&apos;s &lt;em&gt;customized&lt;/em&gt; experience. That&apos;s not a comparison of harnesses - it&apos;s a comparison of how fitted each one is.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The practical economics make the depth question concrete. Claude Code Max is $200 a month. That&apos;s not a trial subscription - it&apos;s a commitment that shapes how I work, because it &lt;em&gt;needs&lt;/em&gt; to justify itself. Adding Codex at a similar price point means $400+ a month in AI tooling alone, plus the attention cost of maintaining fluency in both. For a solo developer, that&apos;s material.&lt;/p&gt;
&lt;p&gt;I tried Claude Code&apos;s fast mode recently - same Opus 4.6 model, faster output, pay-as-you-use on top of Max. The shift was immediate - faster responses created a different flow state, tighter iteration, less time spent waiting and losing context. I pulled back after a short run because the cost added up quickly, but the experience clarified something: the faster responses created a different kind of attention - tighter loops, less drift between intention and result. That&apos;s not just speed, it&apos;s a different way of working. OpenAI&apos;s Codex-Spark promises dramatically faster generation, but it&apos;s a smaller model with a reduced context window and lower benchmarks - speed traded for capability. I&apos;d rather wait a beat longer for the full model than get faster answers from a smaller one.&lt;/p&gt;
&lt;p&gt;And the financial picture keeps shifting underneath. Open-source models arrive competitive and often debut with free usage periods on OpenRouter. The floor of what capable tooling costs is dropping steadily. What requires a $200/month subscription today might be available for a fraction of that in six months - or open-source entirely. The financial investment creates a natural pull toward depth, not because switching is intellectually wrong, but because the budget and attention required to maintain expertise across multiple platforms is a real constraint - one the comparison articles almost never mention.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The pattern extends beyond any one developer&apos;s setup. &amp;lt;a href=&quot;https://fortune.com/2026/01/29/100-percent-of-code-at-anthropic-and-openai-is-now-ai-written-boris-cherny-roon/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Anthropic reports&amp;lt;/a&amp;gt; that roughly 90% of Claude Code&apos;s codebase is now Claude-written - the tool building itself. The community around these tools is doing something similar: skills ecosystems, custom frameworks, plugins that extend the foundation in ways the original developers didn&apos;t anticipate.&lt;/p&gt;
&lt;p&gt;The leverage I&apos;ve found doesn&apos;t come from the tool itself - it comes from what&apos;s built on top of it. The tool is the foundation. The workflow layer - the custom skills, the calibrated sense of when to trust output and when to verify, the muscle memory of how to prompt effectively for a specific codebase - is where the actual leverage lives.&lt;/p&gt;
&lt;p&gt;Switching means abandoning that layer - or so I assumed. In practice, the file-level infrastructure is becoming more portable than you&apos;d expect. CLAUDE.md is readable by Pi, by Codex, by most of the emerging tools. Skills conventions are standardizing. The literal configs and agent-facing instructions could, in theory, travel with me. Whether they actually work as well in a different tool&apos;s runtime is something I haven&apos;t tested, and the difference between theoretical portability and practical portability might be the whole game.&lt;/p&gt;
&lt;p&gt;But the deeper investment isn&apos;t in the files - it&apos;s in the intuition - the calibrated feel for how a specific model thinks, where it drifts, what prompting patterns produce reliable output for a particular codebase. That intuition has a natural expiration date, since new model versions shift the behavior underneath, but while it lasts it directly shapes the flow state that makes depth productive. It&apos;s the part of the layer above that doesn&apos;t port, and it&apos;s the part the portability arguments never mention.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I installed Codex and never spun it up. I&apos;d spent a few hours with &amp;lt;a href=&quot;https://github.com/badlogic/pi-mono&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Pi&amp;lt;/a&amp;gt; not long before that - another harness, this one built for customizability, the kind that appeals to the Emacs-tinkerer part of my brain - but felt the same pull back toward the work already in progress. The tension arrived at the moment of installation, not after hours of evaluation. What kept stopping me wasn&apos;t loyalty to Claude Code or certainty that I&apos;d chosen right. It was the recognition that constant sampling has its own cost, and that I hadn&apos;t yet been deliberate about when to look up from the work and when to stay in it.&lt;/p&gt;
</content:encoded></item><item><title>The Stack You Carry</title><link>https://www.markschaake.com/posts/the-stack-you-carry/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-stack-you-carry/</guid><description>Most political disagreements aren&apos;t about different values - they&apos;re about different rankings of the same values.</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Someone I care about lobbed a political question at me recently - the kind that&apos;s really an invitation to pick a side. I gave a nothing answer and let it die. Not because I don&apos;t have opinions, but because I&apos;ve had this conversation enough times to know the shape of it. We&apos;d circle the same ground - not actually disagreeing about the facts, not even disagreeing about what matters. We both care about fairness, about safety, about institutions working the way they should. The conversation would go nowhere anyway, because we rank those things differently and neither of us can quite hear the other&apos;s ranking as legitimate.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I&apos;ve been thinking about this pattern for years, and the best metaphor I&apos;ve found is a stack - a personal, weighted ranking of what matters most. Not a list of beliefs or positions. A &lt;em&gt;priority ordering&lt;/em&gt; of values.&lt;/p&gt;
&lt;p&gt;Everyone carries one, whether they&apos;ve examined it or not. Freedom, safety, fairness, loyalty, autonomy, tradition, compassion, personal responsibility - most people care about most of these things. The differences show up in the ordering. When freedom and safety conflict, which one wins? When compassion and personal responsibility pull in opposite directions, which instinct is louder?&lt;/p&gt;
&lt;p&gt;Two people can hold identical values and reach opposite conclusions about the same policy, the same event, the same vote - because their stacks are ordered differently. One person ranks economic freedom above collective safety. Another reverses that. Neither has to be lying, confused, or morally broken. They&apos;re just carrying different stacks.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Stacks aren&apos;t static. Mine has shifted more than once. What I ranked highest at twenty-five isn&apos;t what I rank highest now - parenthood alone moved things I thought were fixed. Some values I treated as foundational turned out to be inherited assumptions I hadn&apos;t examined. Others I dismissed as sentimental turned out to be load-bearing.&lt;/p&gt;
&lt;p&gt;And they&apos;re not logically clean. Someone can rank personal freedom at the top and still want the government to regulate the things that scare them. Someone can value fiscal responsibility and support programs that cost more than they save, because compassion outweighs the math in that particular case. The contradictions aren&apos;t a failure of reasoning. They&apos;re a feature of actually holding multiple values at once.&lt;/p&gt;
&lt;p&gt;The stack is also only part of the input. Assumptions do real work underneath the ranking - beliefs about how the world operates that shape which conclusions the stack produces. If I assume government is generally competent at managing large-scale investment, my stack generates different policy conclusions than if I assume it&apos;s generally wasteful, even if the stack itself is identical. Two people with the same values &lt;em&gt;and&lt;/em&gt; the same ordering can still land in different places because they&apos;re working from different models of cause and effect. The whole system is messier than the metaphor suggests - values tangled with assumptions tangled with experience tangled with things absorbed before anyone was old enough to examine them.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Some people resolve the difficulty by not maintaining their own stack at all. They adopt one wholesale from an authority - a political leader, a party platform, a media figure, a church. The appeal is real: a prefabricated stack comes with a community, clear answers, and no ambiguity about which value takes priority. It&apos;s the mutual fund version of a value system - managed on someone else&apos;s behalf.&lt;/p&gt;
&lt;p&gt;And like a mutual fund, it scales. When thousands of people carry the same prefabricated stack, it becomes loud, coordinated, self-reinforcing. People still doing the individual work - still living with the ambiguity of values that genuinely conflict - are quieter by nature. Individual stacks are harder to organize around, harder to reduce to a slogan. The richness of genuine value reasoning gets drowned out by the sheer volume of the outsourced version.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This is part of what makes political polarization feel so intractable. The divide isn&apos;t primarily about different facts or even different values - it&apos;s about the refusal to accept that someone else&apos;s &lt;em&gt;ordering&lt;/em&gt; could be valid. When someone ranks economic freedom above collective safety, or vice versa, the instinct isn&apos;t to hear a different priority. It&apos;s to hear &quot;I don&apos;t care about safety&quot; or &quot;I don&apos;t care about freedom.&quot; The reduction of a stack to a single position - the flattening - is where conversations break down.&lt;/p&gt;
&lt;p&gt;If there were one correct stack - a universal ordering everyone should arrive at - then disagreement would just be error, and the conversation would be about correction. That&apos;s a cleaner world. It has clear sides and a right answer. The alternative - that someone I love might rank something I care deeply about quite low, and that this isn&apos;t a moral failure on their part - requires a kind of tolerance that feels like giving ground.&lt;/p&gt;
&lt;p&gt;The outsourced stacks make the flattening worse. A managed portfolio comes with built-in rhetoric for why the &lt;em&gt;other&lt;/em&gt; ordering is not just different but wrong. It makes the holder fluent in dismissal without requiring them to engage with the actual structure of the disagreement - which is almost never about the values themselves, and almost always about the ordering.&lt;/p&gt;
</content:encoded></item><item><title>A Higher Gear</title><link>https://www.markschaake.com/posts/a-higher-gear/</link><guid isPermaLink="true">https://www.markschaake.com/posts/a-higher-gear/</guid><description>AI agents promise to clear the noise from daily life. The temptation is to fill the space with more ambition, not more presence.</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The closest thing I have to a second brain is a directory on my laptop and a Claude Code session. I open a terminal, type &lt;code&gt;/start-day&lt;/code&gt;, and my AI partner reads my journal, checks my calendar, surfaces reminders, tells me where things were left off, checks email and drafts replies. It works well - better than org-mode ever did, better than any productivity app I&apos;ve tried. But it only thinks when I&apos;m sitting in front of it. The moment I close the terminal, the second brain goes quiet.&lt;/p&gt;
&lt;p&gt;I&apos;ve been wanting something that doesn&apos;t go quiet. An open-source agent platform called OpenClaw promised exactly that - agents with heartbeats, periodic check-ins where the system considers whether something needs attention. Cron jobs that triage email overnight, surface calendar conflicts before I wake up, notice that an invoice hasn&apos;t been paid. The distinction matters: one system is a thinking partner I visit, the other is a staff that&apos;s always working.&lt;/p&gt;
&lt;p&gt;This morning I got ambitious and tried to set up an accounting agent. The bigger vision is to eventually replace the accounting firm I pay to handle things across my personal and business finances - but the starting point was deliberately minimal. Read-only access to QuickBooks, just enough to test whether an agent could surface what needed attention without touching the actual books. Even that turned into a mess. Getting API access meant registering a developer app through QuickBooks Online&apos;s developer program, and when I finally got to the permissions screen, the only available scope was read-write. No read-only option. So the minimal safe starting point I&apos;d imagined didn&apos;t actually exist. Then the OpenClaw configuration got tangled somewhere along the way, and I found myself staring at a broken installation I no longer had the energy to untangle. I uninstalled the whole thing. Maybe I&apos;ll come back when things mature, or when the next wave of ambition hits.&lt;/p&gt;
&lt;p&gt;But the shape of what it &lt;em&gt;could&lt;/em&gt; become is clear enough to think about, even if the reality isn&apos;t there yet.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The end state I keep imagining isn&apos;t a conversation with an AI. It&apos;s the absence of all the things that currently crowd out what matters.&lt;/p&gt;
&lt;p&gt;Right now, a typical morning involves checking three email accounts, processing invoices, following up on messages that fell through cracks, reviewing calendar conflicts, triaging reminders. None of this is hard. All of it is &lt;em&gt;present&lt;/em&gt; - it takes up cognitive space, it fragments attention, it sits in the background of every conversation with a low hum of &quot;I still need to deal with that.&quot;&lt;/p&gt;
&lt;p&gt;The promise of always-on agents isn&apos;t that they&apos;d do these things &lt;em&gt;better&lt;/em&gt; than I do. It&apos;s that they&apos;d do them &lt;em&gt;instead&lt;/em&gt; of me. And what opens up in that space is the interesting question.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I lift with my oldest son when we can make it work - a couple afternoons a week if we&apos;re lucky, though the workout matters less than the time together. I homeschool my younger son - or try to, between everything else. My wife and I are touring colleges with our daughter. I play tennis with a lifelong friend. I pray, sometimes well, sometimes going through the motions. These are the things that, when I&apos;m honest about it, make the actual substance of a good life - the relationships, the physical presence, the spiritual grounding that I consistently say matters most and consistently give the scraps of my attention after everything else has been handled.&lt;/p&gt;
&lt;p&gt;The vision isn&apos;t AI as companion. It&apos;s AI as the thing that handles everything else so that when I&apos;m sitting across from my son working through a math lesson, I&apos;m &lt;em&gt;there&lt;/em&gt; - not half-thinking about whether I replied to that email.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;If the noise were genuinely handled - if the email triage and the invoice tracking and the calendar management and the reminder surfacing all just &lt;em&gt;worked&lt;/em&gt;, reliably, in the background, without my involvement - what would I do with the space?&lt;/p&gt;
&lt;p&gt;I&apos;d like to say I&apos;d pray more, be more present with my kids, read more deeply, invest in friendships with the kind of attention they deserve. And maybe I would. But I&apos;ve had periods of less work before - between projects, during transitions - and the pattern isn&apos;t always encouraging. Sometimes the space fills with different noise. New projects, new rabbit holes, new ways to stay busy that feel productive but aren&apos;t the things I claim to care about most.&lt;/p&gt;
&lt;p&gt;And there&apos;s a more aggressive version of that failure mode - the one I&apos;m most susceptible to. If AI handles the tedium and frees up two hours a day, the competitive instinct doesn&apos;t say &quot;go be present with your family.&quot; It says &quot;now you can take on &lt;em&gt;more&lt;/em&gt;.&quot; Another client, another SaaS idea, another repo. The rat race doesn&apos;t disappear when the tools get better - it just offers a higher gear. Freed capacity looks a lot like opportunity, and I have a long pattern of seeing how far I can leverage myself, testing what&apos;s possible when the constraints loosen. I suspect I have a lot of company in that.&lt;/p&gt;
&lt;p&gt;What makes the pull harder to resist is that it&apos;s not just ambition talking - it&apos;s genuine excitement. This is a wild time to be alive with a technical background. The things I can build right now, the leverage I can get from tools that barely existed a year ago, the problems I can take on that would have been absurd to attempt solo - it&apos;s &lt;em&gt;thrilling&lt;/em&gt;. And the window is probably temporary. A couple of years, maybe less, before the tools mature enough that everyone has access to the same leverage.&lt;/p&gt;
&lt;p&gt;Whether leaning into that window turns out to be the right call is something only hindsight will answer. But the pull is real, and it sits right at the center of the decision.&lt;/p&gt;
&lt;p&gt;The technology doesn&apos;t resolve this tension - it sharpens it. AI agents that clear the noise give me a choice that was always mine but is becoming more stark: use the space for presence, or use it for &lt;em&gt;more&lt;/em&gt;. That&apos;s not a software problem. It&apos;s a formation question, and the person responsible for the answer has always been the individual. What I do with my time is mine to decide. The tools just make the decision harder to avoid.&lt;/p&gt;
</content:encoded></item><item><title>Finding the Edge of AI Trust</title><link>https://www.markschaake.com/posts/finding-the-edge-of-ai-trust/</link><guid isPermaLink="true">https://www.markschaake.com/posts/finding-the-edge-of-ai-trust/</guid><description>What happens when you over-trust your AI agents and misdirect a client&apos;s leadership team.</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m not interested in 10x productivity from AI. I&apos;m chasing something bigger.&lt;/p&gt;
&lt;p&gt;The safe way to use AI agents - reviewing every output, second-guessing every decision - gets maybe 2-3x. Useful, but not transformative. The real leverage lives at the edge: trusting the AI enough to move fast, catching mistakes through tight feedback loops rather than constant oversight.&lt;/p&gt;
&lt;p&gt;The problem with edges is that sometimes I fall over them. This week I did.&lt;/p&gt;
&lt;p&gt;The fall cost me 1.5 hours of throwaway development, a credit to my client, and - harder to quantify - some trust. All because of a GET vs POST.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I was building an AI classification feature for a client that depended on a third-party API. It had recently changed versions, and the fields we needed were coming back empty.&lt;/p&gt;
&lt;p&gt;Stakes were high - without this data, the feature couldn&apos;t work. This was exactly the kind of ambiguous debugging task where AI agents shine, or where they can lead someone confidently off a cliff.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I asked Claude to investigate. It dove in, examined the responses, and delivered a verdict with characteristic confidence: &quot;The provider no longer has access to this data.&quot;&lt;/p&gt;
&lt;p&gt;That made sense.&lt;/p&gt;
&lt;p&gt;I asked Claude to verify. It ran cURL tests, examined response structures, and produced a detailed markdown report. Responses came back 200 OK, data returned, but the target fields were empty.&lt;/p&gt;
&lt;p&gt;The report looked thorough, professional, convincing. This is where the edge gets dangerous - not when AI is obviously wrong, but when it&apos;s confidently, &lt;em&gt;plausibly&lt;/em&gt; wrong.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I shared Claude&apos;s report with my client as evidence of the problem. They forwarded it to the third-party&apos;s support team. Major stakeholders got pulled into discussions about workarounds and alternatives.&lt;/p&gt;
&lt;p&gt;This was the moment I crossed the edge. The edge isn&apos;t crossed when AI makes a mistake - it&apos;s crossed when that mistake gets propagated outward.&lt;/p&gt;
&lt;p&gt;Meanwhile, I&apos;d already moved on. Built an alternative solution in about 90 minutes. AI-first development is fast like that. By the time anyone could catch the error, I&apos;d traveled far past it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Twenty-four hours later, support responded: it&apos;s a GET vs POST issue.&lt;/p&gt;
&lt;p&gt;The GET endpoint I&apos;d been hitting - that Claude had been testing - isn&apos;t documented or officially supported. Use POST with a JSON body and everything works. All the data is there.&lt;/p&gt;
&lt;p&gt;The kicker: I couldn&apos;t have verified this earlier. The API documentation was behind authentication I didn&apos;t have access to. We were debugging blind - and the edge is hardest to see when there&apos;s no ground truth.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The technical problem evaporated, but the real damage didn&apos;t.&lt;/p&gt;
&lt;p&gt;Stakeholders had wasted time on a non-problem. I&apos;d built 1.5 hours of code that went straight to the trash. Worse, I&apos;d confidently led my client down the wrong path, backed by a professional-looking report that turned out to be confidently wrong.&lt;/p&gt;
&lt;p&gt;The cost of falling over the edge scales with how fast I was moving - AI-first development is fast, so when the fall comes, it goes far.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I credited the client three hours - more than the total dev time wasted. It wasn&apos;t really about the money. It was about acknowledging that I&apos;d caused the disruption, even if the root cause was &quot;the AI told me so.&quot;&lt;/p&gt;
&lt;p&gt;&quot;The AI was wrong&quot; isn&apos;t an excuse. I&apos;m the one who trusted it. I&apos;m the one who escalated it. The buck stops with the human.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This wasn&apos;t an AI catastrophe - just a mundane mistake amplified by speed and confidence. But it showed me where the edge actually is.&lt;/p&gt;
&lt;p&gt;The edge is where AI is confidently, &lt;em&gt;plausibly&lt;/em&gt; wrong. Not obviously wrong - that&apos;s easy to catch. Not randomly wrong - that wouldn&apos;t inspire trust in the first place. The danger zone is when the AI&apos;s answer is confident, coherent, and fits the existing mental model. That&apos;s when it&apos;s most likely to get propagated without verification.&lt;/p&gt;
&lt;p&gt;Speed amplifies distance past the edge - I had an alternative solution built before support even replied. That&apos;s the value proposition of AI-assisted development, and the risk. The faster the workflow, the more braking mechanisms matter.&lt;/p&gt;
&lt;p&gt;The edge moves, and this might be the hardest part. AI capabilities shift constantly - model updates, service degradation, the inherent stochasticity of responses. And the movement isn&apos;t always forward. &lt;a href=&quot;https://marginlab.ai/trackers/claude-code/&quot;&gt;Independent benchmarks&lt;/a&gt; have detected statistically significant performance regressions in Claude Code over 30-day windows (based on daily SWE-Bench-Pro evaluations). A workflow that kept me safely on the right side last month might cross the edge today. Calibrating once and forgetting isn&apos;t an option. Staying close to the edge requires ongoing navigation.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I don&apos;t have clean rules for staying close to the edge - it moves, AI capabilities shift. What I do have are questions I&apos;m still working through.&lt;/p&gt;
&lt;p&gt;When to bet versus wait: I built 90 minutes of throwaway code, which is a reasonable bet with bounded downside. But I also escalated an unverified diagnosis to stakeholders, and that&apos;s where the real cost came from. The code was cheap, the misdirection wasn&apos;t.&lt;/p&gt;
&lt;p&gt;How to communicate the tradeoff: maybe the right move is setting expectations upfront - &quot;We can wait 24 hours for certainty, or we can bet on the plausible answer and keep moving, knowing that rework is part of the deal.&quot; That&apos;s a conversation to have before being mid-crisis.&lt;/p&gt;
&lt;p&gt;What signals to watch for: confident AI plus plausible explanation plus no ground truth. Not a reason to stop, but a sign that a bet is being placed.&lt;/p&gt;
&lt;p&gt;I paid for this lesson with 1.5 hours of code, a credit to my client, and some trust. Probably cheap tuition. The edge is where the leverage lives - and where the falls happen.&lt;/p&gt;
</content:encoded></item><item><title>Outsourcing the Thinking</title><link>https://www.markschaake.com/posts/outsourcing-the-thinking/</link><guid isPermaLink="true">https://www.markschaake.com/posts/outsourcing-the-thinking/</guid><description>What happens when AI-generated artifacts substitute for human judgment - and the falls are too slow to feel until they&apos;ve already happened.</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A client sent me a PRD to build against. The people behind it were technical, experienced - exactly the kind of people I trust to know what they need. The document itself was thorough in the way that makes implementation feel clean: well-sectioned, specific about acceptance criteria, detailed enough that I could start building without much back-and-forth. So I started building.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A month of implementation followed. Multiple rounds of refinement, each one tightening the alignment between what I&apos;d built and what the document described. The work felt productive in that satisfying way where there&apos;s a clear target and measurable progress toward it. I was building exactly what the PRD specified, and I could prove it.&lt;/p&gt;
&lt;p&gt;The problem wasn&apos;t visible because the artifact was doing its job perfectly - not the job of describing what the client needed, but the job of &lt;em&gt;looking like&lt;/em&gt; someone had already thought that through.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The client eventually told me the PRD hadn&apos;t really been reviewed. The requirements didn&apos;t match what they actually needed. A month of faithful implementation against a document nobody had vetted. The people who provided it were apologetic, and I wasn&apos;t angry - I&apos;d implemented exactly what I was given. But a month of work had drifted quietly in the wrong direction, and none of us had noticed because the document was good enough to make checking feel unnecessary.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I suggested we set the PRD aside entirely. Let me look at your current system, understand your actual workflows, and bridge from what I&apos;ve already built to what you need. That worked - not because I&apos;m especially good at reading minds, but because replacing the artifact with direct observation removed the thing that had been substituting for judgment. The gap between the PRD and reality wasn&apos;t a specification error. It was a &lt;em&gt;thinking&lt;/em&gt; error. The document had done the thinking, and nobody had checked whether the thinking was right.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I recognized the pattern because I&apos;d done the same thing to myself. Earlier, I&apos;d used AI to draft a contract for a fractional CTO engagement - vesting language that looked like contract language should look, right format, right sections, plausible terms. I didn&apos;t think about whether vesting was &lt;em&gt;appropriate&lt;/em&gt; for this kind of engagement. The artifact looked like thinking had happened, so I treated it like thinking had happened. The consequences played out over months and contributed to parting ways with that client. I&apos;d outsourced the thinking on my own contract terms.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I wrote about a faster version of this pattern in &lt;a href=&quot;/posts/finding-the-edge-of-ai-trust&quot;&gt;Finding the Edge of AI Trust&lt;/a&gt; - an AI debugging report that led me off a cliff in hours, with a sharp landing 24 hours later. That was a fast fall. Here, a PRD shaped a month of work and a contract shaped an entire engagement. The pattern is identical - an AI-generated artifact that looks thorough enough to skip scrutiny - but the timescale determines how deep the consequences go. The fast version gets caught in a day. The slow version plays out for weeks or months before anyone realizes the artifact was doing the thinking instead of the humans.&lt;/p&gt;
&lt;p&gt;Speed makes the fall &lt;em&gt;dramatic&lt;/em&gt;. Slowness makes it &lt;em&gt;invisible&lt;/em&gt;. The Edge post&apos;s lesson was about momentum carrying me past the point of error before I could stop. This is about never feeling the fall at all - just a gradual drift, comfortable and productive, until the distance between where I am and where I should be is too large to ignore.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I keep wondering how many other artifacts in my work are substituting for judgment without me noticing. The PRD fix was simple enough - stop building against the document and look at the actual thing. But the difficulty isn&apos;t knowing that. The difficulty is remembering to do it when the document is good enough to make scrutiny feel like a waste of time.&lt;/p&gt;
</content:encoded></item><item><title>The Assumed Room</title><link>https://www.markschaake.com/posts/the-assumed-room/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-assumed-room/</guid><description>The difference between political conviction and political assumption - and what happens to the people who think differently but stay quiet.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I left a company once, partly because of how its leadership talked about politics. Not because I disagreed with every position - I didn&apos;t. Because of the &lt;em&gt;assumption&lt;/em&gt; that everyone in the room agreed.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;All-hands meetings, quarterly updates. Somewhere between the roadmap and the team announcements, political opinions delivered like weather - just stated, not argued, as if acknowledging something everyone obviously felt. There&apos;s a gap between &quot;I believe this, and here&apos;s why&quot; and &quot;obviously we all believe this.&quot; The first acknowledges that someone might disagree. The second can&apos;t imagine it. One invites a response. The other makes responding feel beside the point - socially costly, or just not worth it today.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The effect is quieter than people imagine. Nobody storms out of an all-hands. What happens is smaller - I stopped going to the optional events, started answering &quot;yeah, crazy times&quot; when politics came up at lunch, kept my head down and did good work and saved my real thoughts for people I trusted outside the building.&lt;/p&gt;
&lt;p&gt;Before I left, I had a conversation with someone on my team who&apos;d started being openly political at work - taking cues from leadership, reading the room the way it was designed to be read. I told him privately: be careful with that. You don&apos;t know how everyone here actually thinks. This isn&apos;t the place.&lt;/p&gt;
&lt;p&gt;That was as brave as I got. One private conversation with one person. The assumed room had me trained - even my pushback was quiet, behind closed doors.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The political atmosphere wasn&apos;t the only reason I left, but it was part of the texture - one of those things that makes a place feel less like yours over time.&lt;/p&gt;
&lt;p&gt;I&apos;ve thought about the pattern since, how assumed rooms stay assumed. The people who think differently don&apos;t argue - they leave. And because they leave quietly, the room never notices the gap. The people who stay all agree, which confirms the assumption, which makes the next meeting feel even more like consensus. The room gets more assumed over time, not less, because everyone who might have complicated things has already walked out.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Nobody tracks this. Exit interviews don&apos;t capture &quot;I got tired of pretending to agree with leadership&apos;s politics.&quot; The departures are always mixed, the reasons always multiple, and the pattern invisible from inside. That might be the sharpest thing about political assumption versus political conviction - conviction invites a response, even disagreement. Assumption forecloses one. And the cost is measured in absence, which nobody remaining can see.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I don&apos;t regret leaving. I do think about the fact that my bravest moment was a private conversation - telling one colleague to be careful, behind closed doors. The assumed room had me trained. Even my dissent was quiet.&lt;/p&gt;
&lt;p&gt;That&apos;s how these rooms work. Not by suppressing disagreement - by making it feel private, individual, not worth the cost. The people who think differently leave, and the room never notices, because absence doesn&apos;t register the way agreement does.&lt;/p&gt;
</content:encoded></item><item><title>Expedition, Excursion, Errand</title><link>https://www.markschaake.com/posts/expedition-excursion-errand/</link><guid isPermaLink="true">https://www.markschaake.com/posts/expedition-excursion-errand/</guid><description>A methodology for solo developers using AI agents - when to plan deeply, when to parallelize, when to iterate.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Clients want senior-level judgment and junior-level throughput. The traditional answer is to hire people, take on overhead, dilute margins. The agentic answer is different - multiply execution capacity while retaining judgment authority.&lt;/p&gt;
&lt;p&gt;This is the solo developer&apos;s paradox, and I&apos;ve been trying to solve it for months. Not through abstraction or theory, but through building actual systems and watching where they break.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The methodology I&apos;ve landed on names three modes. I think of them as positions on a spectrum - not phases that happen in order, but stances that shift based on what the work requires.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Expedition mode&lt;/em&gt; is for greenfield projects, major rewrites, new feature areas. Planning is deep, upfront, collaborative. Execution is fully autonomous, highly parallel - multiple AI agents working across multiple git worktrees simultaneously. The human is the expedition leader, planning the route while the team deploys across the terrain. Human involvement is heavy during planning, hands-off during execution.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Excursion mode&lt;/em&gt; is for significant features, refactors, integrations. Planning is moderate, focused on the specific change. Execution is semi-autonomous - maybe a few parallel worktrees, maybe sequential. Base camp is established, and the human sends agents out to explore and develop specific areas. Human involvement means approving the plan, monitoring execution, intervening if something gets stuck.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Errand mode&lt;/em&gt; is for bug fixes, small enhancements, polish work. Planning is light or inline - just part of the implementation conversation. Execution is interactive, single agent. The human and agent handle a quick trip to address something nearby - no elaborate planning needed. Human involvement is conversational, iterative, responsive.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The modes aren&apos;t discrete phases. An Expedition effort decomposes into Excursion-sized chunks. Excursion work spawns Errand-level subtasks. The shift happens fluidly based on scope.&lt;/p&gt;
&lt;p&gt;What matters is recognizing which mode fits the current work. Expedition mode with a bug fix wastes planning overhead. Errand mode with a major rewrite leads to thrashing without direction.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The methodology identifies what humans &lt;em&gt;must&lt;/em&gt; do versus what agents &lt;em&gt;can&lt;/em&gt; do. This is the leverage - not replacing human work entirely, but reducing it to what&apos;s irreducible.&lt;/p&gt;
&lt;p&gt;Judgment calls are always human. Architectural decisions, trade-off evaluation, scope definition - these require understanding context that agents don&apos;t have. So does UX and aesthetic review. An agent can verify that a button is clickable; it can&apos;t tell whether clicking it &lt;em&gt;feels&lt;/em&gt; right. Plan approval is human. Client communication is human.&lt;/p&gt;
&lt;p&gt;Code implementation is delegable. Test execution is delegable. Verification of functional requirements, documentation generation, dependency updates, formatting, linting - all delegable. These aren&apos;t less important; they&apos;re just amenable to automation.&lt;/p&gt;
&lt;p&gt;Some work is genuinely collaborative. Plan creation happens when humans guide and agents draft. Codebase exploration happens when agents search and humans direct. Test plan design happens when humans define scenarios and agents structure them. Debugging happens when agents investigate and humans decide.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The planning artifact matters more than I expected. Plans serve both human reviewers and agent executors - they need to be readable by people approving the approach &lt;em&gt;and&lt;/em&gt; parseable by agents carrying it out.&lt;/p&gt;
&lt;p&gt;Dual format works. Human-readable prose describing what the plan accomplishes, implementation steps with enough detail for autonomous execution, acceptance criteria, verification commands. Machine-parseable frontmatter with IDs, dependencies, estimated files, test suites to run.&lt;/p&gt;
&lt;p&gt;For Expedition mode, large efforts break into multiple plans. Each plan is independently executable. Dependencies are explicit - plan B waits for plan A. Plans without dependencies run in parallel. This is where the throughput multiplication comes from.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Quality assurance should be automated wherever possible, agent-executable rather than requiring the human to run tests manually, and defined during planning rather than as an afterthought.&lt;/p&gt;
&lt;p&gt;Agents verify functional correctness - tests pass. They verify type safety - no type errors. They verify code quality - linting, formatting. They verify branching logic - all paths tested. They verify error states - failures handled gracefully.&lt;/p&gt;
&lt;p&gt;Humans verify UX and aesthetics - does it feel right? They verify business logic alignment - does it solve the actual problem? They verify architectural judgment - is this the right approach?&lt;/p&gt;
&lt;p&gt;Test plans get created collaboratively during planning, structured for agent execution. The human defines the scenarios; the agent structures them into something runnable.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The minimal setup is an agentic coding tool, git with worktree support, and automated test infrastructure. That&apos;s enough for Excursion and Errand modes.&lt;/p&gt;
&lt;p&gt;Expedition mode needs more - multi-plan decomposition tooling, an orchestration layer for worktree and agent management, maybe a progress dashboard. Browser testing integration if the work involves UX verification.&lt;/p&gt;
&lt;p&gt;I&apos;ve been building these tools incrementally, and they&apos;re not done. The methodology is ahead of the implementation.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The tooling landscape is still emerging. For implementation, I use &amp;lt;a href=&quot;https://claude.ai/claude-code&quot; target=&quot;_blank&quot;&amp;gt;Claude Code&amp;lt;/a&amp;gt; daily - it handles Errand and Excursion mode work well. I&apos;ve experimented with &amp;lt;a href=&quot;https://www.npmjs.com/package/@mariozechner/pi-coding-agent&quot; target=&quot;_blank&quot;&amp;gt;Pi&amp;lt;/a&amp;gt;, and there are others - Cursor, Codex, the list grows monthly.&lt;/p&gt;
&lt;p&gt;Orchestration is less mature. &amp;lt;a href=&quot;https://github.com/steveyegge/gastown&quot; target=&quot;_blank&quot;&amp;gt;GasTown&amp;lt;/a&amp;gt; is interesting - a framework for coordinating multiple agents. I&apos;ve been building a custom Claude Code plugin that handles planning facilitation and orchestration, spawning multiple Claude Code instances across git worktrees. It works, mostly. The missing piece is monitoring - a decent UI for watching what the agents are doing, which is next on the roadmap.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Open questions remain.&lt;/p&gt;
&lt;p&gt;How to handle failures mid-execution in parallel mode? An agent hits a wall - does the orchestration stop everything, notify the human, try to recover?&lt;/p&gt;
&lt;p&gt;What&apos;s the right plan granularity for parallelization? Too coarse and the throughput gains disappear. Too fine and the coordination overhead dominates.&lt;/p&gt;
&lt;p&gt;How to communicate progress to clients during autonomous execution? The work is happening, but the developer isn&apos;t actively doing it. How does that translate to status updates and expectations?&lt;/p&gt;
&lt;p&gt;How to price this work? I&apos;ve been tracking wall hours - my time - versus machine hours - agent time - via Claude Code hooks that feed into a custom billing system. The goal is a leverage ratio above 1.5, meaning the agents work more hours than I do. Currently I bill by wall hour or fixed per project, but I&apos;m thinking about how machine time fits into the equation. The time I spend is mostly planning and verification. The work that happens is mostly agent-hours. What&apos;s the fair exchange?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I don&apos;t have answers to these yet. The methodology is a working hypothesis - a way of naming what I&apos;ve been doing so I can examine it, refine it, share it. Expedition, Excursion, Errand. Plan deeply when the scope demands it, parallelize when the structure allows it, iterate when the work is small.&lt;/p&gt;
&lt;p&gt;The leverage is real. The details are still evolving.&lt;/p&gt;
</content:encoded></item><item><title>Building for Communities You Belong To</title><link>https://www.markschaake.com/posts/building-for-communities-you-belong-to/</link><guid isPermaLink="true">https://www.markschaake.com/posts/building-for-communities-you-belong-to/</guid><description>What happens when you use your skills to build software for a community you&apos;re already part of.</description><pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My primary social outlet - outside of family - is my tennis club. I play a few times a week, often with my lifelong best friend Dan. Tennis keeps us in regular contact, and as a result, our relationship close. There&apos;s nothing like competitive sports - the physical and mental exercise of a tennis match just &lt;em&gt;feels&lt;/em&gt; healthy. At 46, that matters more than it used to.&lt;/p&gt;
&lt;p&gt;I grew up playing tennis at this club. It&apos;s simply a special place to me. The people are good people - happy, caring, invested in something together. It&apos;s member-owned, which means we vote, we serve on committees, we show up for work parties. There&apos;s no corporate landlord. It&apos;s ours.&lt;/p&gt;
&lt;p&gt;I also happen to build software for a living. And at some point I started to wonder - what if I actually built something for &lt;em&gt;this&lt;/em&gt; place? Not for users, not for a market. For my club. For the people I play with every week.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The idea started small - our club uses software that works, more or less, but it&apos;s old and clunky and owned by a company that doesn&apos;t know us. When something breaks, we submit a ticket. When we want a feature, we wait. It&apos;s the standard vendor relationship - we&apos;re customers, not partners.&lt;/p&gt;
&lt;p&gt;I kept noticing friction. Booking courts was harder than it should be. Feedback from members disappeared into a void. The board had ideas but no easy way to act on them. And every time I noticed something, I&apos;d think: &lt;em&gt;I could fix that.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So I started building. Not a startup. Not a product. Just - software for my club.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The difference is hard to explain until you&apos;ve felt it. Building for strangers means guessing - interviewing users, running surveys, analyzing funnels, trying to understand people I&apos;ve never met. It&apos;s necessary work, but it&apos;s &lt;em&gt;work&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Building for my own community, I already knew. I knew the problems because I had them. I knew the people because I played with them. The feedback loop isn&apos;t a Slack channel or a support ticket - it&apos;s a text from a friend after Tuesday night doubles.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There&apos;s no pitch deck. No TAM calculation. No investor asking about my go-to-market strategy. The &quot;market&quot; is 500 members, and I know half of them by name. Success isn&apos;t MRR - it&apos;s whether booking a court on Saturday morning is easier than it was last month.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A year ago, I wouldn&apos;t have taken this on. Building a full member portal - auth, reservations, payments, admin dashboards - is a lot of work. Not impossible, but enough that it would have felt like a second job. The kind of project that starts enthusiastic and dies quietly in a half-finished GitHub repo.&lt;/p&gt;
&lt;p&gt;But the tools have changed. I build with Claude Code now, and it&apos;s genuinely different. Not &quot;AI writes my code for me&quot; different - more like having a senior engineer available at 6am when I&apos;m working before the day starts. The velocity is higher. The activation energy is lower. Projects that used to feel like a six-month commitment now feel like something I can chip away at on weekends.&lt;/p&gt;
&lt;p&gt;That shift matters. It means passion projects are actually &lt;em&gt;possible&lt;/em&gt; again. Not just for companies with engineering teams, but for one person who cares about their tennis club and knows how to ship software.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I&apos;m not suggesting everyone should build software for their tennis club. But most of us belong to &lt;em&gt;something&lt;/em&gt;. A gym, a church, a hobby group, a neighborhood association. Communities that matter to us, run by people we know, with problems we understand.&lt;/p&gt;
&lt;p&gt;What would it look like to build for them?&lt;/p&gt;
</content:encoded></item><item><title>The AI Consultant&apos;s Window</title><link>https://www.markschaake.com/posts/the-ai-consultants-window/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-ai-consultants-window/</guid><description>There&apos;s an opportunity for consultants who can wield AI coding tools. The question is how long it stays open.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI tools have collapsed the cost of building software. I built a 200,000-line TypeScript MVP in 7 weeks - work that would have taken a team 12-18 months before these tools existed. &amp;lt;a href=&quot;https://fortune.com/2026/01/29/100-percent-of-code-at-anthropic-and-openai-is-now-ai-written-boris-cherny-roon/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Anthropic reports 70-90% of code&amp;lt;/a&amp;gt; at the company is now AI-written. Microsoft says AI generates about 30% of theirs.&lt;/p&gt;
&lt;p&gt;For those who can wield these tools, there&apos;s an obvious opportunity - businesses need custom software, they don&apos;t have engineers who know how to use AI agents effectively, and consultants who can bridge that gap should find work.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Building a consulting practice takes years, though. Clients, reputation, systems, trust - these things compound slowly. There are slow periods to survive. By the time a practice is mature, will the tools be accessible enough that businesses don&apos;t need a consultant?&lt;/p&gt;
&lt;p&gt;This isn&apos;t a victory lap for consultants - it&apos;s an uncertain bet. The energy required to build a consulting business is substantial. Is it worth it for a window that might be 2 years? 5 years? 10?&lt;/p&gt;
&lt;p&gt;The direction seems clear - these tools will eventually be usable by people without engineering backgrounds. The question for anyone considering this path is whether they&apos;re building a career or riding a wave.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Not all custom builds are created equal, and this distinction matters for understanding where the window might stay open longest.&lt;/p&gt;
&lt;p&gt;Greenfield is straightforward - no existing system, no data to migrate, no users with entrenched workflows, just building exactly what&apos;s needed from scratch. This is where AI tools shine brightest, and where the consultant&apos;s window is most likely to close first.&lt;/p&gt;
&lt;p&gt;Migration is harder - replacing existing SaaS means data export and import (often messy, incomplete, or requiring transformation), transition planning (running parallel systems, phased rollouts, fallback procedures), change management (users who learned the old system need to learn the new one), and mapping legacy workflows (existing processes may not map cleanly to new designs).&lt;/p&gt;
&lt;p&gt;My tennis club is considering this exact problem. They&apos;re thinking about replacing their Club Automation membership system - the software handles court booking, membership billing, lesson scheduling, pro shop transactions. A typical SaaS tool doing too much, none of it particularly well.&lt;/p&gt;
&lt;p&gt;Building a custom replacement is now feasible - the core functionality isn&apos;t that complex. But the transition involves years of member data, payment histories, recurring billing relationships, staff trained on specific workflows. The build might take weeks; the migration and transition planning could take months.&lt;/p&gt;
&lt;p&gt;This is where consulting value persists longer. It&apos;s not just &quot;can someone use AI to write code&quot; - it&apos;s &quot;can someone manage the organizational complexity of moving from one system to another.&quot; That&apos;s a different skill set, one that AI tools are further from automating.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There&apos;s another dimension worth considering: what happens after the build?&lt;/p&gt;
&lt;p&gt;I&apos;ve spent nine years building and maintaining a SaaS product. Once it reaches maintenance mode - stable customers, predictable feature requests, infrastructure that mostly runs itself - it&apos;s a good business. Recurring revenue, compounding familiarity with the codebase, known edge cases.&lt;/p&gt;
&lt;p&gt;A consulting practice built on custom software is different. Not one product for many customers - many products for many customers. Each client has their own codebase, their own infrastructure, their own quirks. The portfolio grows, and so does the maintenance burden.&lt;/p&gt;
&lt;p&gt;This is more labor intensive by nature. Ten clients with ten custom applications means ten different contexts to hold in memory, ten deployment pipelines, ten sets of dependencies that need updating. The work compounds in a way that SaaS maintenance doesn&apos;t.&lt;/p&gt;
&lt;p&gt;Can AI help here? Almost certainly. The same tools that accelerate initial builds should accelerate maintenance - understanding unfamiliar codebases, writing migrations, updating dependencies, debugging production issues. The question is whether this can be systematized well enough to keep a growing portfolio manageable.&lt;/p&gt;
&lt;p&gt;This might be the real skill that determines whether a consulting practice scales: not just building fast, but building in ways that stay maintainable across a diverse portfolio. Standardized stacks, consistent patterns, good documentation, automated testing - the same things that always mattered, but now with AI agents as part of the maintenance workflow.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;AI will eventually handle migration work too. Data transformation, migration scripts, even change management playbooks - these are all learnable patterns. Portfolio maintenance will get easier as AI agents get better at context-switching between codebases. The timeline for automating this work is probably longer than pure greenfield builds, but it&apos;s still finite.&lt;/p&gt;
&lt;p&gt;The window exists, and betting on it is rational - betting the farm on it is risky.&lt;/p&gt;
&lt;p&gt;Migration work and organizational complexity seem more durable than pure code generation. So does the ability to systematize maintenance across a growing portfolio. The businesses that need the most help are ones replacing existing systems, not building from scratch. The skills that matter aren&apos;t just technical - they&apos;re about managing transitions and building in ways that stay maintainable.&lt;/p&gt;
</content:encoded></item><item><title>The Disposable Software Era</title><link>https://www.markschaake.com/posts/the-disposable-software-era/</link><guid isPermaLink="true">https://www.markschaake.com/posts/the-disposable-software-era/</guid><description>When building software becomes cheaper than buying it, the economics of SaaS start to look different.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;a href=&quot;https://www.axios.com/2026/01/13/anthropic-claude-code-cowork-vibe-coding&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Anthropic shipped Cowork&amp;lt;/a&amp;gt; in about 10 days using Claude Code itself. Four engineers, AI-assisted development. These are the companies &lt;em&gt;building&lt;/em&gt; the tools - and they&apos;re using them to build even faster.&lt;/p&gt;
&lt;p&gt;What happens to SaaS when building is this cheap?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Software used to be expensive to build and cheap to distribute. That&apos;s the entire SaaS model - amortize high development costs across thousands of customers, deliver via browser, collect monthly fees. The math worked because building was hard.&lt;/p&gt;
&lt;p&gt;Now building is fast. &amp;lt;a href=&quot;https://fortune.com/2026/01/29/100-percent-of-code-at-anthropic-and-openai-is-now-ai-written-boris-cherny-roon/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Anthropic reports 70-90% of code&amp;lt;/a&amp;gt; at the company is written by AI. &amp;lt;a href=&quot;https://www.anthropic.com/news/anthropic-acquires-bun-as-claude-code-reaches-usd1b-milestone&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Claude Code grew from research preview to billion-dollar product&amp;lt;/a&amp;gt; in six months. &amp;lt;a href=&quot;https://sacra.com/research/cursor-at-100m-arr/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Cursor hit $100M ARR&amp;lt;/a&amp;gt; faster than any company in history - 12 months.&lt;/p&gt;
&lt;p&gt;The economics are inverting. When building is cheap, buying loses its appeal. Why pay $50/seat/month for a tool that does 80% of what the business needs when the exact thing can be built in a weekend?&lt;/p&gt;
&lt;p&gt;a16z calls this &quot;&amp;lt;a href=&quot;https://a16z.com/disposable-software/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;disposable software&amp;lt;/a&amp;gt;&quot; - applications that never justified engineering investment now make sense because the investment required has collapsed. The constraint is no longer ROI, it&apos;s imagination.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The Cowork example is instructive - four engineers, 10 days, using Claude Code itself. That&apos;s not a prototype, that&apos;s a product.&lt;/p&gt;
&lt;p&gt;This isn&apos;t hypothetical for me. Last year I built a 200,000-line TypeScript MVP for a startup client in 7 weeks - by myself. Before AI tools, that would have been 12-18 months of work for a software team. And that was before the latest model improvements and tooling refinements. The floor keeps rising.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Before declaring SaaS dead, though, the counterarguments deserve serious treatment.&lt;/p&gt;
&lt;p&gt;Security is a real problem. &amp;lt;a href=&quot;https://www.veracode.com/blog/genai-code-security-report/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Veracode tested 100+ LLMs&amp;lt;/a&amp;gt; and found 45% of code samples failed security tests, introducing OWASP Top 10 vulnerabilities. Java was worst at 72% failure. The &amp;lt;a href=&quot;https://cloudsecurityalliance.org/blog/2025/07/09/understanding-security-risks-in-ai-generated-code&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Cloud Security Alliance&amp;lt;/a&amp;gt; found 62% of AI-generated code contains design flaws or known vulnerabilities. &amp;lt;a href=&quot;https://www.theregister.com/2025/12/17/ai_code_bugs/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;CodeRabbit&apos;s analysis&amp;lt;/a&amp;gt; showed AI code has 1.75x more logic errors, 1.57x more security findings, and 2.74x more XSS vulnerabilities than human-written code. These studies vary in scope, language coverage, and model versions tested - but the pattern is consistent enough to take seriously.&lt;/p&gt;
&lt;p&gt;The &quot;vibe coding hangover&quot; is real - speed up front, chaos downstream.&lt;/p&gt;
&lt;p&gt;Enterprise systems also have moats. Compliance frameworks like GDPR and SOC 2 are hard to replicate. Systems of record - clinical trial management, financial reconciliation, regulated industries - have data moats and regulatory logic that custom solutions can&apos;t easily absorb. &amp;lt;a href=&quot;https://www.bain.com/insights/will-agentic-ai-disrupt-saas-technology-report-2025/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;Bain&apos;s analysis&amp;lt;/a&amp;gt; is useful here: workflows that rely on human judgment, proprietary data, and regulatory oversight are defensible. The CRM someone built in a weekend won&apos;t replace Salesforce for companies that need 15 years of institutional knowledge encoded in their data model.&lt;/p&gt;
&lt;p&gt;History suggests transitions expand rather than replace. &quot;Cloud will replace on-prem&quot; became &quot;hybrid is the norm.&quot; Global SaaS is still growing - $197B in 2023, $232B projected for 2025. These transitions are slower and messier than they look in the moment.&lt;/p&gt;
&lt;p&gt;And then there&apos;s the 80/20 problem. AI gets the work 80% of the way fast, but the last 20% - reliable, secure, maintainable - still requires engineering judgment. Getting to &quot;works on my machine&quot; is trivial. Getting to &quot;runs in production under load without leaking data&quot; is not.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;SaaS doesn&apos;t die overnight - it evolves.&lt;/p&gt;
&lt;p&gt;Seat-based pricing makes less sense when the software required to service a seat can be generated on demand. Outcome-based pricing rises. The winning position for existing SaaS players is probably unique data plus AI augmentation - hard to replicate datasets wrapped in AI-powered interfaces.&lt;/p&gt;
&lt;p&gt;For most businesses, the calculation is shifting. Custom solutions that were never worth the engineering investment are now worth considering. Not for everything - nobody&apos;s building their own Stripe - but for the long tail of internal tools, specific workflows, and niche applications.&lt;/p&gt;
&lt;p&gt;The question isn&apos;t whether software development economics are changing. The examples are too stark to ignore. The question is how fast - and for any given company, whether the tools have crossed the threshold where custom solutions start making more sense than off-the-shelf software that does 80% of what&apos;s needed.&lt;/p&gt;
&lt;p&gt;Seat-based SaaS models are under pressure - the companies with unique data and real switching costs will survive, but the ones competing on features alone are more vulnerable than they were a year ago.&lt;/p&gt;
</content:encoded></item></channel></rss>