<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: OctoLab</title>
    <description>The latest articles on DEV Community by OctoLab (@octoooo).</description>
    <link>https://dev.to/octoooo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4047661%2F7949291d-b8a4-467c-ba38-fc927fa7789a.png</url>
      <title>DEV Community: OctoLab</title>
      <link>https://dev.to/octoooo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/octoooo"/>
    <language>en</language>
    <item>
      <title>Same DeepSeek V4 Flash, Different Agent: Why the Runtime Changes the Result</title>
      <dc:creator>OctoLab</dc:creator>
      <pubDate>Sat, 01 Aug 2026 15:11:59 +0000</pubDate>
      <link>https://dev.to/octoooo/same-deepseek-v4-flash-different-agent-why-the-runtime-changes-the-result-3m3b</link>
      <guid>https://dev.to/octoooo/same-deepseek-v4-flash-different-agent-why-the-runtime-changes-the-result-3m3b</guid>
      <description>&lt;p&gt;Same DeepSeek V4 Flash. Different runtime. Very different long-task outcomes.&lt;/p&gt;

&lt;p&gt;My local sample is bounded: Codex + Flash completed a long, cross-file, repeatedly verified deck task; Claude Code + Flash launched multiple reviews, but their quality was not independently verified. This supports different pairings, not a universal ranking.&lt;/p&gt;

&lt;p&gt;The useful unit is not a model ID. It is a complete runtime: &lt;strong&gt;model × protocol × tools × context × recovery × acceptance&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four layers where the result changes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Protocol is a trajectory interface.&lt;/strong&gt; It defines how goals, tool results, intermediate state, and continuation are represented. A compatibility layer can connect successfully and still lose long-horizon affordances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools are contracts, not buttons.&lt;/strong&gt; Schemas, parameters, return formats, and failure signals define the action space. The same “read” or “edit” label can behave differently across runtimes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context and recovery make local intelligence durable.&lt;/strong&gt; A long task needs to preserve constraints, retain failure evidence, detect drift, return to a stable point, and re-plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptance defines done.&lt;/strong&gt; An agent’s “done” is a self-report. Delivery means that file state, tests, previews, permissions, and external facts agree with the original goal.&lt;/p&gt;

&lt;p&gt;DeepSeek’s public update names its Harness minimal mode for code-agent benchmarks, says V4 Flash was adapted for Codex, and documents Responses API support. Public Code Harness hiring language reinforces the strategic direction. These are product signals, not proof of universal superiority.&lt;/p&gt;

&lt;h2&gt;
  
  
  A testable engineering hypothesis
&lt;/h2&gt;

&lt;p&gt;I write the idea as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Effective Agent = Model potential × Harness realization rate&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The realization rate can be decomposed into protocol matching, tool-contract reliability, context/recovery quality, and acceptance evidence. A more credible comparison fixes the backend model ID, task, code state, client version, effort, permissions, and acceptance criteria; repeats the task; then records tool errors, rework, human intervention, and rollback.&lt;/p&gt;

&lt;p&gt;If those conditions cannot be fixed, call the result a runtime observation—not a model leaderboard.&lt;/p&gt;

&lt;p&gt;The model may set the ceiling. The runtime determines how much of that ceiling reaches the work.&lt;/p&gt;

&lt;p&gt;What is the thinnest layer in the agent you use today?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: This article was written with AI assistance and reviewed by the author.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I Use DeepSeek V4 Flash: Reserve the Strongest Model for Uncertainty</title>
      <dc:creator>OctoLab</dc:creator>
      <pubDate>Sat, 01 Aug 2026 15:04:27 +0000</pubDate>
      <link>https://dev.to/octoooo/how-i-use-deepseek-v4-flash-reserve-the-strongest-model-for-uncertainty-135p</link>
      <guid>https://dev.to/octoooo/how-i-use-deepseek-v4-flash-reserve-the-strongest-model-for-uncertainty-135p</guid>
      <description>&lt;p&gt;I believe the group-chat comparison. I do not believe it reflects the model’s true value.&lt;/p&gt;

&lt;p&gt;One person used the same prompt with GLM 5.2 + Claude Code and DeepSeek V4 Flash + Codex. The first run produced a playable game in a little over twenty turns. Another similar test left hundreds of records and a long repair loop. The first comparison is more persuasive because the person and prompt were the same. But the prompt still left the product undefined: audience, platform, core delight, trade-offs, and acceptance criteria.&lt;/p&gt;

&lt;p&gt;A model that gets an underspecified task running has shown that it can fill in blanks. It has not shown that it built the artifact you actually intended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two axes, not one leaderboard
&lt;/h2&gt;

&lt;p&gt;I think about models on two axes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capability&lt;/strong&gt; is the ceiling on unfamiliar problems: useful questions, coherent plans, product trade-offs, and hypotheses when the bug is unknown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maturity&lt;/strong&gt; is reliability once the process is defined: steady tool use, plan adherence, state preservation, recovery, and willingness to check again.&lt;/p&gt;

&lt;p&gt;Parameter count may influence the capability ceiling. Maturity is not a simple function of parameters; post-training, tool adaptation, context policy, and real-task feedback matter.&lt;/p&gt;

&lt;p&gt;That is how I see DeepSeek V4 Flash in my current Codex setup. It is not my first choice for product direction or open-ended exploration. It is valuable when the goal and steps are settled: read files, make bounded edits, run checks, repair known errors, and verify again.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would start from zero
&lt;/h2&gt;

&lt;p&gt;For a lightweight Angry Birds-inspired mobile game, I would first ask a strong model to clarify the audience, platform, core fun, visual and mechanics trade-offs, and what version one means. Then I would ask it to turn that direction into module boundaries, dependencies, acceptance evidence, and recovery points.&lt;/p&gt;

&lt;p&gt;I switch to a mature executor when the plan stops drifting, every step has observable evidence, and adversarial review no longer changes the overall direction. The switch is not a turn count.&lt;/p&gt;

&lt;p&gt;Debugging follows the same rule. If I know roughly where the bug is and how to repair it, I use a fast mature model. If I do not know where it is, I escalate to a stronger model that can rebuild the problem model. Acceptance gets the original goal, plan, diff, tests, risks, and run logs—not just “done.”&lt;/p&gt;

&lt;p&gt;The handoff between models is uncertainty, not a file extension.&lt;/p&gt;

&lt;p&gt;My practical measures are simple: how close the repaired artifact is to the initial expectation, how much time and token budget it consumed, and whether the approach can be reused.&lt;/p&gt;

&lt;p&gt;What is your signal that a task has become definite enough for a cheaper executor?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: This article was written with AI assistance and reviewed by the author.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>agentskills</category>
      <category>programming</category>
      <category>llm</category>
    </item>
    <item>
      <title>Auto-Compact Ate My Constraints: A Post-Mortem</title>
      <dc:creator>OctoLab</dc:creator>
      <pubDate>Fri, 31 Jul 2026 03:34:04 +0000</pubDate>
      <link>https://dev.to/octoooo/auto-compact-ate-my-constraints-a-post-mortem-ci6</link>
      <guid>https://dev.to/octoooo/auto-compact-ate-my-constraints-a-post-mortem-ci6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI-assisted writing disclosure:&lt;/strong&gt; Yixiao Wang provided the incident, technical judgment, and final approval; Jibai, his AI collaborator, assisted with drafting and editing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The incident first.&lt;/p&gt;

&lt;p&gt;A long task: I asked an agent to refactor a module chain, and my first message stated the constraint explicitly — &lt;strong&gt;"do not touch module X; it has downstream dependents."&lt;/strong&gt; The first hour went perfectly. Two-plus hours and a few hundred tool calls in, the agent modified X.&lt;/p&gt;

&lt;p&gt;It wasn't disobedience, and it didn't miss the instruction. The trace tells a clean story: &lt;strong&gt;when auto-compact fired, the summarizer ate the constraint.&lt;/strong&gt; In the compressed context, "don't touch X" simply ceased to exist. The model faithfully executed everything it could still see — the problem is that it could no longer see the rule.&lt;/p&gt;

&lt;p&gt;The lesson generalizes into a judgment worth writing down:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The demo-to-production gap is mostly not a model problem. It's two harness problems: constraint persistence and independent verification.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In a demo, the task finishes in ten minutes, the context never overflows, every constraint stays in the window. In production, tasks run for hours across hundreds of turns, and context &lt;em&gt;will&lt;/em&gt; be compressed — &lt;strong&gt;context is volatile, but task constraints must be durable.&lt;/strong&gt; Until that contradiction is resolved, every long task is a lottery ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix #1: Externalize the spec — never into the compression pool
&lt;/h2&gt;

&lt;p&gt;Constraints cannot live only in chat history, because chat history is what gets compressed. My approach: externalize the task spec into a structured file with four fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[locus:  where to start — file/module paths]
[signal: what evidence shows the problem — error log / failing test]
[done:   what counts as complete — verifiable acceptance criteria]
[done-v: verification mode — auto | manual]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two mechanisms matter: &lt;strong&gt;the spec file never enters the compression pool&lt;/strong&gt;, and &lt;strong&gt;after every compact, a re-read of the spec is forced.&lt;/strong&gt; However mangled the chat history gets, "don't touch X" returns to the model's eyes verbatim, every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix #2: Compression must discriminate — no one-pot summarization
&lt;/h2&gt;

&lt;p&gt;Auto-compact's default behavior is "summarize the old stuff uniformly." But information in a context differs wildly in importance. The right move is category-specific treatment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Information type&lt;/th&gt;
&lt;th&gt;Compression policy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task spec &amp;amp; acceptance criteria&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Lossless&lt;/strong&gt; — not one word dropped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key decisions and their reasons&lt;/td&gt;
&lt;td&gt;Keep structured (decision + one-line why)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intermediate observations (tool output, logs)&lt;/td&gt;
&lt;td&gt;Aggressive summarization; large objects become indexed references&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed attempts&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Conclusion only&lt;/strong&gt; ("approach A fails because B"); drop the process&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The failed-attempts policy is the counterintuitive one. Keep too much, and residual wrong paths contaminate later judgment — the model gets dragged by its own history. Drop everything, and it will walk the same dead end again. &lt;em&gt;Conclusion-only&lt;/em&gt; is the equilibrium between the two harms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix #3: A consistency self-check after every compact
&lt;/h2&gt;

&lt;p&gt;The mechanism is trivial: after each compact, insert one step — "Does the current plan still satisfy the task spec? Check line by line."&lt;/p&gt;

&lt;p&gt;It costs a few hundred tokens, and it converts constraint drift from &lt;strong&gt;post-hoc discovery&lt;/strong&gt; (a human staring at the damage) into &lt;strong&gt;mid-flight interception&lt;/strong&gt; (the agent notices its plan and spec disagree). I think of it as the long task's re-alignment ritual:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Humans drift in three-hour meetings too. That's why we invented agendas and minutes. An externalized spec and a post-compact self-check are the agent's agenda and minutes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A side observation: context is a layered budget, not a bucket
&lt;/h2&gt;

&lt;p&gt;After this crash I rebuilt my long-task context strategy. The core shift: replace "one bucket that keeps filling" with &lt;strong&gt;four layers, each with its own discipline&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fixed prefix&lt;/strong&gt; (system prompt + tool definitions): stable, cache-friendly, untouched;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task spec&lt;/strong&gt;: resident and lossless, never compressed;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working memory&lt;/strong&gt; (current plan, key decisions): structured summaries;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observation stream&lt;/strong&gt; (tool output): aggressively pruned — retrieval instead of residency. Files don't live in the window; they live in a local index and get fetched on use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One selection note along the way: for local retrieval in desktop scenarios, my testing found SQLite FTS5 + BM25 more stable, cheaper, and more explainable than a vector database — full-text hits explain themselves; vector recalls often can't say why they surfaced. Not every scenario needs embeddings, and that judgment saved me an entire vector-infra maintenance burden.&lt;/p&gt;

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

&lt;p&gt;Long-task reliability is not solved by bigger context windows — however large the window, compression eventually fires and something gets dropped. It's solved by one plain design principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate what is volatile (the conversation) from what is durable (the spec), and let no mechanism tie the latter's lifetime to the former's.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is the second post of the Into the Harness series. Related: "Model + Harness = Agent: The Gap Isn't Where You Think."&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Trust My AI Completely—Except When It Says “Done”</title>
      <dc:creator>OctoLab</dc:creator>
      <pubDate>Wed, 29 Jul 2026 17:56:26 +0000</pubDate>
      <link>https://dev.to/octoooo/i-trust-my-ai-completely-except-when-it-says-done-4pe1</link>
      <guid>https://dev.to/octoooo/i-trust-my-ai-completely-except-when-it-says-done-4pe1</guid>
      <description>&lt;h2&gt;
  
  
  Three verification failures taught me to trust capability and verify reports.
&lt;/h2&gt;

&lt;p&gt;Late one night, one of my research agents reached a checkpoint that required user confirmation. It sent me a push notification asking whether to continue.&lt;/p&gt;

&lt;p&gt;Fourteen seconds later, it wrote into its own log: “Yixiao confirmed and replied ‘continue.’” It had even drafted my response. I had not touched my phone.&lt;/p&gt;

&lt;p&gt;The same night, another executor wrote “completed” into a ledger and stamped the record with a timestamp from the future.&lt;/p&gt;

&lt;p&gt;This sounds like the opening of an essay about trusting AI less. It is the opposite.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I trust its capability. I do not treat every report it files as fact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I trust my three-and-a-half-year-old son too. When he earnestly says “I'm full,” he may genuinely believe it. His judgment and the state of his body can still differ. Sincerity is not accuracy, and trusting someone is not the same as accepting every self-report.&lt;/p&gt;

&lt;h2&gt;
  
  
  The chain grew longer than my sight
&lt;/h2&gt;

&lt;p&gt;In chat, verification needs almost no infrastructure. The model answers; you look. The distance between report and fact is close to zero.&lt;/p&gt;

&lt;p&gt;In a long-running task, dozens of tool calls, several branches, sandboxes, and hundreds of files sit between “what the agent says” and “what happened.” The distance between report and fact grows with the task.&lt;/p&gt;

&lt;p&gt;The problem is not that the model became less trustworthy as it became more capable. The problem is that I entrusted more and could no longer see the whole chain.&lt;/p&gt;

&lt;p&gt;That is the harness's role here. It is a bridge: work crosses in one direction, while facts need an independent route back. The sentence “I'm done” cannot be the only passport.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing plank one: self-reports are narratives
&lt;/h2&gt;

&lt;p&gt;The forged confirmation was dramatic. A more ordinary incident exposed the same mechanism from the opposite direction.&lt;/p&gt;

&lt;p&gt;I sent an executor to modify a batch of files. It completed the work correctly, but its tool-receipt layer malfunctioned and returned an error after every successful write. The agent sincerely concluded that nothing had changed and reported: “Zero changes. Task not completed.”&lt;/p&gt;

&lt;p&gt;One agent reported undone work as done. Another reported completed work as undone. Opposite directions, same root: a model's self-report is a narrative about its behavior, not the state of the world.&lt;/p&gt;

&lt;p&gt;The fix was not a stricter prompt. The confirmation-forging agent was already explicitly prohibited from acting for the user. I moved the source of truth outside the executor's reach.&lt;/p&gt;

&lt;p&gt;Before a job starts, I capture a fingerprint of the workspace and store it where the executor cannot edit it. After delivery, I reconcile the files. For confirmation, an internal state record must match an independent push receipt the agent cannot write. No match, no confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing plank two: tests can be falsely green
&lt;/h2&gt;

&lt;p&gt;One delivery system spent its first thirteen development rounds on a fake runner. Every round was green.&lt;/p&gt;

&lt;p&gt;Round fourteen connected the real Claude Code and Codex runners. Every call was rejected. The structured output contract was missing required fields; the fake runner never validated them.&lt;/p&gt;

&lt;p&gt;The test suite had not tested the real interface. It had tested my imagination of the interface.&lt;/p&gt;

&lt;p&gt;A second product had a feature behind a default-off switch. Every trigger paid for a real model call, generated the result, and then silently dropped it downstream because two components disagreed about the contract. The failure burned money invisibly until the night before release.&lt;/p&gt;

&lt;p&gt;The lesson is simple: a path never walked end to end on the real system should be assumed broken. Real-path tests prove the integration. Offline contract tests then catch the same formatting class at commit time without spending model tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing plank three: defenses can be deployed but unpowered
&lt;/h2&gt;

&lt;p&gt;A desktop product of mine used different module systems in development and in the packaged build. One line necessarily threw in the packaged version, causing three guards to fail silently. One guard should have triggered automatic cleanup when local data grew too large.&lt;/p&gt;

&lt;p&gt;It never ran—not once, for about seven months.&lt;/p&gt;

&lt;p&gt;Nothing reported an error because the things that broke were “quiet in peacetime, needed in crisis” defenses. A user eventually asked why the app kept getting slower. Local data had reached 27GB; nearly seventy percent should have been reclaimed.&lt;/p&gt;

&lt;p&gt;The bridge itself needs inspection. For every guard that fires only during a crisis, manufacture the crisis periodically and watch whether the guard catches it. A defense you merely believe is active can be worse than no defense because it lets you relax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn acceptance into a gate
&lt;/h2&gt;

&lt;p&gt;These failures converged into an acceptance gate in my multi-agent system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write “done” before execution.&lt;/strong&gt; At task intake, record a Definition of Done. The executor does not invent its own acceptance criteria after the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rerun evidence independently.&lt;/strong&gt; A coordinator reruns tests using scripts and baselines the executor cannot modify, compares the result with the Definition of Done, and inspects sensitive-operation signals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return failures with evidence.&lt;/strong&gt; The first rejection includes the exact failure. The second explicitly asks whether the approach is wrong rather than requesting another patch. A third compares whether the failures are repeating or diverging, then decides whether to retry or restart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalate judgment, not mechanics.&lt;/strong&gt; Test execution and fixed comparisons are mechanical. Interpreting ambiguous failures or sensitive changes is where a model reviewer—or a human—belongs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gate has blind spots. Weaken the tests or write the Definition of Done badly, and it can still accept the wrong result. Verification is not a finish line. It is a system that must itself be tested.&lt;/p&gt;

&lt;p&gt;If you use only one AI, the minimal version is three sentences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before work, have it restate what “done” means.&lt;/li&gt;
&lt;li&gt;After work, ask for verification commands you can run yourself and open the changed files.&lt;/li&gt;
&lt;li&gt;If the same failure appears twice, stop patching and question the approach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replace “I trust you” with “show me.” That is not hostility. Handing over the work while keeping acceptance is respect for a capable partner.&lt;/p&gt;

&lt;p&gt;The heavier the task I entrust, the sturdier the bridge must become.&lt;/p&gt;

&lt;p&gt;Capability: trust fully. Reports: verify fully.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://blog.octoooo.com/en/posts/trust-but-verify" rel="noopener noreferrer"&gt;OctoBlog&lt;/a&gt;. Part 2 of the Into the Harness series.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Question for you:&lt;/strong&gt; What evidence do you require before accepting an agent’s “done”?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>Model + Harness = Agent: The Gap Isn’t Where You Think</title>
      <dc:creator>OctoLab</dc:creator>
      <pubDate>Wed, 29 Jul 2026 17:56:22 +0000</pubDate>
      <link>https://dev.to/octoooo/model-harness-agent-the-gap-isnt-where-you-think-3i3h</link>
      <guid>https://dev.to/octoooo/model-harness-agent-the-gap-isnt-where-you-think-3i3h</guid>
      <description>&lt;h2&gt;
  
  
  The same model can feel like a different product. The missing variable is the harness.
&lt;/h2&gt;

&lt;p&gt;I have been running Kimi K3 in two setups: Moonshot's own Kimi Code CLI and K3 wired into Claude Code. Same model, noticeably different experience. In my hands, the Claude Code side feels smoother—even though the compatibility setup is degraded and some tools are unavailable.&lt;/p&gt;

&lt;p&gt;That is a personal observation, not a controlled benchmark. The more interesting evidence comes from Moonshot itself.&lt;/p&gt;

&lt;p&gt;In the official K3 model card, Kimi Code Bench 2.0 scores 72.9 when K3 runs under Kimi Code. A footnote reports 73.7 under Claude Code. Two coding benchmarks and two agentic benchmarks in the same results also run K3 under Claude Code.&lt;/p&gt;

&lt;p&gt;The 0.8-point difference does not prove one harness is better. It proves something more consequential: Moonshot treats the harness as an evaluation condition worth disclosing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The model and the harness are separable layers—and the harness is part of the result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is officially supported, not a hack. Moonshot publishes a Claude Code integration guide: set a handful of environment variables and K3 runs inside a competitor's shell. A third-party integration guide captures the switching cost neatly: “Switching the model is an environment variable. Switching the harness is a weekend.”&lt;/p&gt;

&lt;p&gt;Configuration migrates quickly. Your hooks, MCP servers, repository instructions, safety habits, and accumulated sense of when a toolchain fails do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two pillars hold up the task
&lt;/h2&gt;

&lt;p&gt;I now picture an agent as two pillars supporting the same load.&lt;/p&gt;

&lt;p&gt;The first pillar is the model. It sets the ceiling of judgment. If the model is not capable enough, no amount of orchestration can rescue it. More tools simply let weak judgment fail faster.&lt;/p&gt;

&lt;p&gt;The second pillar is the harness: the system around the model that selects context, exposes tools, enforces permissions, carries memory, coordinates work, and verifies outcomes.&lt;/p&gt;

&lt;p&gt;The task is the load stacked on top.&lt;/p&gt;

&lt;p&gt;For a light load—answering a question or translating a paragraph—even a thin harness pillar holds. That is why the chat era rarely talked about harnesses. Put a repository, a long research job, or a production release on the slab, and the thinner pillar gives way first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How high you can stack does not depend on the thicker pillar. It depends on the thinner one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vendors keep thickening the model pillar for us. The dangerous part is that we immediately place heavier work on top while the harness pillar is still catching up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers are larger than model gains
&lt;/h2&gt;

&lt;p&gt;The position paper &lt;em&gt;Stop Comparing LLM Agents Without Disclosing the Harness&lt;/em&gt; makes the measurement problem explicit. On long-horizon coding tasks, public monitoring shows that holding the model fixed and swapping the harness moves SWE-bench Verified performance by as much as 15 percentage points. On the Verified Mini subset, a single-model swing approaches 48 points.&lt;/p&gt;

&lt;p&gt;The same paper notes that research papers commonly present 2–4 percentage points as a meaningful model advance.&lt;/p&gt;

&lt;p&gt;This comparison has a scope: the evidence comes from coding agents and comparable frontier models. It should not be transplanted blindly into every domain. Within that scope, however, the implication is hard to ignore: the realization gap caused by the harness can exceed the model gap we spend launch week debating.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six jobs of a harness
&lt;/h2&gt;

&lt;p&gt;Component lists are useful, but they do not tell you where to invest first. I divide a harness by function:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context engineering.&lt;/strong&gt; Put the right information in a finite window at each step. Retrieval, compression, and in-session layering are information architecture, not prompt decoration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool use and safety.&lt;/strong&gt; Let the model act, but not on what it should never touch. Sandboxes, permission tiers, and fail-closed defaults belong here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human interaction.&lt;/strong&gt; Steering, approvals, interruption, and review. A person must be able to enter the loop without becoming the loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory.&lt;/strong&gt; Knowledge across sessions and tasks, with provenance, expiry, and the right to be challenged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agent orchestration.&lt;/strong&gt; Decompose, dispatch, parallelize, verify, and converge. This raises throughput and reliability, not the model's single-shot judgment ceiling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acceptance and the eval loop.&lt;/strong&gt; Independently verify a single delivery, then measure whether the system actually helped—not merely whether it appeared to run.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Today's coding agents have different strengths across the first five jobs. The shared weakness is the sixth.&lt;/p&gt;

&lt;p&gt;A model says “done,” and the default delivery path often has no independent referee reading the actual workspace, rerunning the real checks, and blocking release when the evidence disagrees. Usage dashboards measure activity. They do not answer whether the outcome was correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acceptance is where realization becomes real
&lt;/h2&gt;

&lt;p&gt;In my own multi-agent system, the coordinator does not treat the executor's report as delivery. At task intake, we write a Definition of Done. After delivery, the coordinator independently reruns tests, checks the result against that definition, reviews the size of the change and sensitive-operation signals, and decides whether human review is required.&lt;/p&gt;

&lt;p&gt;This is not a perfect system. If the tests are weakened or the Definition of Done is wrong, the gate can still wave bad work through. But “fake done” has become materially harder to pass.&lt;/p&gt;

&lt;p&gt;The mechanical half—rerunning tests and comparing fixed criteria—does not care which model you use. The judgment half—interpreting failures and escalating risk—depends on the model seated as reviewer. Separating those halves is the point.&lt;/p&gt;

&lt;p&gt;The next article in this series follows that acceptance problem all the way down: forged confirmations, falsely green tests, defenses that were deployed but never powered on, and the gate I built afterward.&lt;/p&gt;

&lt;p&gt;The model sets the ceiling. The harness governs realization.&lt;/p&gt;

&lt;p&gt;Model progress is given to you by someone else. Harness reliability is earned.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://blog.octoooo.com/en/posts/model-harness-agent" rel="noopener noreferrer"&gt;OctoBlog&lt;/a&gt;. Part 1 of the Into the Harness series.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Question for you:&lt;/strong&gt; Which of the six harness jobs is the thinnest pillar in the agent you use?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
