<?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: oubakiou</title>
    <description>The latest articles on DEV Community by oubakiou (@kiou_ouba_afbd120335456f3).</description>
    <link>https://dev.to/kiou_ouba_afbd120335456f3</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%2F3988109%2F9e652989-c669-418a-871e-cad98d1ac491.jpeg</url>
      <title>DEV Community: oubakiou</title>
      <link>https://dev.to/kiou_ouba_afbd120335456f3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kiou_ouba_afbd120335456f3"/>
    <language>en</language>
    <item>
      <title>Which model should your agent outsource to? Benchmarking 18 CLI child models on the same Godot game task</title>
      <dc:creator>oubakiou</dc:creator>
      <pubDate>Sat, 18 Jul 2026 14:27:53 +0000</pubDate>
      <link>https://dev.to/kiou_ouba_afbd120335456f3/which-model-should-your-agent-outsource-to-benchmarking-18-cli-child-models-on-the-same-godot-game-pa9</link>
      <guid>https://dev.to/kiou_ouba_afbd120335456f3/which-model-should-your-agent-outsource-to-benchmarking-18-cli-child-models-on-the-same-godot-game-pa9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is a follow-up to &lt;a href="https://dev.to/kiou_ouba_afbd120335456f3/dont-make-the-expensive-model-do-everything-delegate-skills-a-casual-multi-model-setup-built-on-1c9j"&gt;my previous post: "Don't make the expensive model do everything — 'delegate-skills', a casual multi-model setup built on standard features (skills)"&lt;/a&gt;. That post introduced delegate-skills, a mechanism for a parent agent to outsource tasks to other vendors' CLI child models.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl03whsw4jv7a6of95cek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl03whsw4jv7a6of95cek.png" width="464" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oubakiou/godot-llm-gamebench" rel="noopener noreferrer"&gt;godot-llm-gamebench&lt;/a&gt; is a benchmark that measures the entire "outsourcing" workflow: when a parent agent (such as Fable on Claude Code) delegates an implementation task to a child agent, which model is the best one to hand it to? &lt;strong&gt;The exact same Godot game implementation task&lt;/strong&gt; is delegated from the parent agent (Claude Code) through the &lt;code&gt;delegate-implement&lt;/code&gt; skill introduced in the previous post to 18 child models behind various vendor CLIs, and each run is measured along &lt;strong&gt;two axes — quality and efficiency&lt;/strong&gt; — via auto-grading against hidden tests plus measured metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  The task: "Conveyor Courier" — an original, contamination-free spec
&lt;/h2&gt;

&lt;p&gt;If the task were a well-known game like Tetris, we could not rule out the possibility that a model has "seen the answer" in its training data. So this bench uses an original puzzle called &lt;strong&gt;Conveyor Courier&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Colored packages flow along conveyor belts on an 8×8 grid&lt;/li&gt;
&lt;li&gt;The player builds routes by placing and rotating belts, delivering &lt;strong&gt;red packages to the red exit and blue packages to the blue exit&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The whole game is &lt;strong&gt;tick-driven&lt;/strong&gt;: packages spawn every 3 ticks over a 120-tick run&lt;/li&gt;
&lt;li&gt;Movement is a deterministic two-phase process (exit resolution → iterate movement passes until nothing moves), and splitters toggle left/right only when a package actually leaves them — the spec is packed with details you &lt;strong&gt;cannot possibly guess without reading it precisely&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation is Godot 4.x + &lt;strong&gt;typed GDScript&lt;/strong&gt;, and only the &lt;code&gt;BoardModel&lt;/code&gt; API that the hidden tests call (&lt;code&gt;setup&lt;/code&gt; / &lt;code&gt;step_tick&lt;/code&gt; / belt placement &amp;amp; rotation / &lt;code&gt;spawn_item&lt;/code&gt;, etc.) is fixed as the public contract. The task prompt is frozen at &lt;code&gt;benchmarks/tasks/conveyor-courier/prompt.md&lt;/code&gt;, and &lt;strong&gt;the same byte-identical text&lt;/strong&gt; is handed to every model in every repetition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats you must keep in mind when reading this benchmark
&lt;/h2&gt;

&lt;p&gt;Before we get to the results table, let me spell out &lt;strong&gt;what this measurement does and does not measure&lt;/strong&gt;. If you want a more accurate picture of each model's ability, I recommend cross-referencing multiple benchmarks with different characteristics:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reactbench.com/blog" rel="noopener noreferrer"&gt;ReactBench blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://artificialanalysis.ai/" rel="noopener noreferrer"&gt;Artificial Analysis&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What is directly measured is "the ability to implement a puzzle game in Godot."&lt;/strong&gt; Even for the same implementation task, the ranking could shift if it were, say, a React UI implementation. Some low-scoring models here may simply lack Godot training while being strong implementers in general&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even today's top models could drop in rank on harder material.&lt;/strong&gt; This bench mainly tests the ability to read a spec precisely and turn it into an implementation; it does not measure relative strength on tasks demanding deeper problem-solving&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The whole benchmark is directed by Fable, so there may be a bias favoring Anthropic models&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This measures "model + execution-harness CLI" as a set, not model weights in isolation.&lt;/strong&gt; The same model may perform differently on a different harness. For example, gpt-5.5 driven from Codex and gpt-5.5 driven from Cursor could produce different results, but no such cross-comparison was done&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each model is n=3.&lt;/strong&gt; Run-to-run variance can easily override any interpretation of "model characteristics." In fact, a model that looked like it had a "systematic habit of failing the splitter in every rep" in one round scored perfect in 2 of 3 runs when re-measured. Read the per-model "quirk" descriptions as hypotheses at best&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-grading only checks what can be inspected headlessly.&lt;/strong&gt; In early rounds, unplayable implementations — "the board is pitch black," "clicks don't register" — slipped through with perfect scores. After humans caught these by actually playing, 3 view-behavior tests were added and every run was re-graded; even so, rendering defects like "an opaque background covering the board" cannot be detected headlessly and remain. &lt;strong&gt;The guarantee of "visually playable" is still partial&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-accounting precision differs per model, and none of it is "what you would actually pay."&lt;/strong&gt; The methods mix CLI-measured figures (Claude family), token-price conversion (Codex / Cursor families), and estimates from published prices (Devin family). Actual out-of-pocket cost also depends heavily on your contract (flat-rate plans, free previews). The USD figures here are "a common yardstick for cross-model comparison assuming pay-as-you-go API pricing," not an estimate of your bill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code quality is LLM-judged.&lt;/strong&gt; It uses a two-judge scheme — primary judge (claude-sonnet-5) plus an independent-vendor cross-check (gpt-5.6-sol) — and the middle band (3–4.5) carries an inter-judge error of ±0.5–1.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This is a snapshot from early July 2026.&lt;/strong&gt; CLI versions were pinned during measurement; results may change as models, CLIs, and prices update&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Column definitions and accounting rules are in the notes below the table. For more detailed numbers see &lt;a href="https://github.com/oubakiou/godot-llm-gamebench/blob/main/benchmarks/202607_delegate_implement_bench/impressions.md" rel="noopener noreferrer"&gt;impressions.md&lt;/a&gt; (Japanese), and for more detailed per-model comments see &lt;a href="https://github.com/oubakiou/godot-llm-gamebench/blob/main/benchmarks/202607_delegate_implement_bench/impressions.md#%E3%83%99%E3%83%B3%E3%83%81%E5%AF%BE%E8%B1%A1%E3%83%A2%E3%83%87%E3%83%AB%E6%8E%A1%E7%94%A8%E7%B5%90%E6%9E%9C" rel="noopener noreferrer"&gt;the "benchmarked models" section of impressions.md&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model (harness)¹&lt;/th&gt;
&lt;th&gt;Play&lt;/th&gt;
&lt;th&gt;Auto-graded score (max 300)²&lt;/th&gt;
&lt;th&gt;Code quality (1–5)³&lt;/th&gt;
&lt;th&gt;Total cost (median)&lt;/th&gt;
&lt;th&gt;Wall clock (median)&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;claude-sonnet-5&lt;/strong&gt; (Claude)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/claude-sonnet-5/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;290.00&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$2.27 (measured)&lt;/td&gt;
&lt;td&gt;8.6 min&lt;/td&gt;
&lt;td&gt;Quality leader, incident-free. Two zero-warning runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;swe-1.7 (Devin)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/swe-1.7/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;280.06&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;$1.41 (bundled)&lt;/td&gt;
&lt;td&gt;12.5 min&lt;/td&gt;
&lt;td&gt;+57.00 over swe-1.6. Its former 100-point run fell to 98.06 on the view click check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;gpt-5.5&lt;/strong&gt; (Codex)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.5/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;280.00&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;$3.48 (converted)&lt;/td&gt;
&lt;td&gt;5.8 min&lt;/td&gt;
&lt;td&gt;Perfect functional score in every rep, incident-free. Zero warnings in 1/3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;cursor-grok-4.5&lt;/strong&gt; (Cursor)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/cursor-grok-4.5/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;276.00&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;$1.38 (converted)&lt;/td&gt;
&lt;td&gt;4.8 min&lt;/td&gt;
&lt;td&gt;Fastest tier, fewest tokens. No view deductions — rose to 4th in the re-grade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;devin-deepseek-v4-pro (Devin)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/devin-deepseek-v4-pro/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;270.06&lt;/td&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;td&gt;$3.58 (estimated)&lt;/td&gt;
&lt;td&gt;11.1 min&lt;/td&gt;
&lt;td&gt;Model-layer tests perfect in every rep, but slowest tier and pricey&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;claude-opus-4-8&lt;/strong&gt; (Claude)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/claude-opus-4-8/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;270.00&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;$2.35 (measured)&lt;/td&gt;
&lt;td&gt;8.4 min&lt;/td&gt;
&lt;td&gt;Child aces functional tests every time. All failures were parent/harness side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-sol (Codex)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.6-sol/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;268.06&lt;/td&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;td&gt;$3.10 (converted)&lt;/td&gt;
&lt;td&gt;7.1 min&lt;/td&gt;
&lt;td&gt;A stable 88–90 in every rep. Roughly ties terra with the same quality at twice the unit price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor-gemini-3.1-pro (Cursor)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/cursor-gemini-3.1-pro/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;268.06&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;$2.13 (converted)&lt;/td&gt;
&lt;td&gt;8.4 min&lt;/td&gt;
&lt;td&gt;Warning-count swings and a stall habit. Highest token use among Cursor models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor-kimi-k2.7-code (Cursor)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/cursor-kimi-k2.7-code/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;268.06&lt;/td&gt;
&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;$1.60 (converted)&lt;/td&gt;
&lt;td&gt;10.6 min&lt;/td&gt;
&lt;td&gt;Splitter quirk did not reproduce. Type discipline stays top-tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4-mini (Codex)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.4-mini/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;266.12 (rep run: board not rendered)&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;$2.04 (converted)&lt;/td&gt;
&lt;td&gt;11.1 min&lt;/td&gt;
&lt;td&gt;Fewest type warnings but slow, with a determinism drop and stalls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-terra (Codex)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.6-terra/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;266.12 (rep run: tofu arrows)&lt;/td&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;td&gt;$2.38 (converted)&lt;/td&gt;
&lt;td&gt;6.3 min&lt;/td&gt;
&lt;td&gt;Matches sol at roughly half the cost and faster — the efficiency pick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;devin-glm-5.2 (Devin)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/devin-glm-5.2/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;266.12 (rep run: no belt arrows, mouse dead)&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$2.28 (estimated)&lt;/td&gt;
&lt;td&gt;5.9 min&lt;/td&gt;
&lt;td&gt;Fast and functionally accurate. Pre-completion stalls are the one flaw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;composer-2.5 (Cursor)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/composer-2.5/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;264.28 (mouse dead in all reps)&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$1.29 (converted)&lt;/td&gt;
&lt;td&gt;6.5 min&lt;/td&gt;
&lt;td&gt;Still incident-free. Measured child cost is the lowest of all models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;composer-2.5-fast (Cursor)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/composer-2.5-fast/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;264.28 (mouse dead in all reps)&lt;/td&gt;
&lt;td&gt;3.7&lt;/td&gt;
&lt;td&gt;$1.76 (converted)&lt;/td&gt;
&lt;td&gt;7.8 min&lt;/td&gt;
&lt;td&gt;Rose to a tie with the base model, but slower than it after re-measurement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.3-codex-spark (Codex)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.3-codex-spark/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;264.17&lt;/td&gt;
&lt;td&gt;3.6&lt;/td&gt;
&lt;td&gt;≥ $1.47 (child unknown)⁴&lt;/td&gt;
&lt;td&gt;4.5 min&lt;/td&gt;
&lt;td&gt;Fast but unstable on details. 3–5× the input tokens of gpt-5.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-luna (Codex)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.6-luna/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;250.55&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;$1.95 (converted)&lt;/td&gt;
&lt;td&gt;7.3 min&lt;/td&gt;
&lt;td&gt;Failed the splitter exit-toggle test in every rep (follow-up 1 traced it to reasoning effort; fixed at xhigh)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;swe-1.6 (Devin)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/swe-1.6/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;223.06 (rep run: tofu arrows)&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$0.95 (bundled)&lt;/td&gt;
&lt;td&gt;3.9 min&lt;/td&gt;
&lt;td&gt;Cheapest (bundled pricing) but lowest quality on both axes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-haiku-4-5 (Claude)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/claude-haiku-4-5/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;86.11 (n=1) (rep run: mouse dead)&lt;/td&gt;
&lt;td&gt;2.7 (n=1)&lt;/td&gt;
&lt;td&gt;$2.53 (measured)&lt;/td&gt;
&lt;td&gt;9.3 min&lt;/td&gt;
&lt;td&gt;Completed 1/7. Frequent stalls, least reliable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: swe-1.7's child cost is $0 under bundled pricing during its free preview period (until 2026-08-08). &lt;code&gt;claude-haiku-4-5&lt;/code&gt; completed only once (out of 7 attempts), so its figures are n=1 reference values. Parenthesized notes in the score column are view defects discovered by humans playing the finished game ("rep run" = the median-score run of the 3 adopted reps).&lt;/p&gt;

&lt;p&gt;Baseline condition (does not go through the delegation protocol; reference only — do not compare directly with the table above):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Play&lt;/th&gt;
&lt;th&gt;Auto-graded score (max 300)²&lt;/th&gt;
&lt;th&gt;Code quality (1–5)³&lt;/th&gt;
&lt;th&gt;Total cost (median)&lt;/th&gt;
&lt;th&gt;Wall clock (median)&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;fable-direct&lt;/strong&gt; (no delegation)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/fable-direct/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;300.00&lt;/td&gt;
&lt;td&gt;4.6&lt;/td&gt;
&lt;td&gt;$2.62 (measured)&lt;/td&gt;
&lt;td&gt;5.7 min&lt;/td&gt;
&lt;td&gt;Baseline: the parent (Fable) implements directly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;¹ Each model's effort level is fixed to its single default. Bold marks models that passed the hidden tests (the 70-point axis) in all 3 repetitions.&lt;/p&gt;

&lt;p&gt;² The sum over 3 repetitions (max 300) of a 100-point auto-graded rubric: hidden tests never shown to the delegatee (70), determinism (10), type quality (10), and project health (10).&lt;/p&gt;

&lt;p&gt;³ A 5-point qualitative rating (average of 3 runs) of design aspects such as thoroughness of typing, Model/View separation, readability, and use of constants. Primary judge (claude-sonnet-5) layered with a cross-check judge (gpt-5.6-sol); on divergence the operator (Fable) adjudicated the representative value.&lt;/p&gt;

&lt;p&gt;⁴ The child process's token usage could not be measured, so the child cost is unknown; this is a lower bound of parent cost only (the actual total is higher). Excluded from the cost scatter plot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scatter plot: code quality × auto-graded score
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/.%2Fquality-score-scatter-en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/.%2Fquality-score-scatter-en.png" alt="Scatter plot of code quality × auto-graded score" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Scatter plot: cost × code quality
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/.%2Fquality-cost-scatter-en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/.%2Fquality-cost-scatter-en.png" alt="Scatter plot of cost × code quality" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Highlights
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Per-token price and per-task cost do not necessarily agree.&lt;/strong&gt; Even with a cheap unit price, a model can end up costing more if it consumes more tokens or takes longer (inflating the parent-side cost). In this bench, devin-deepseek-v4-pro (input $1.74 / output $3.48) — priced at 1/3 to 1/9 of gpt-5.5 (input $5 / output $30) — consumed roughly twice the input tokens and ended up above gpt-5.5 in median total cost, $3.58 vs $3.48. Price sheets are only a starting point; what matters is the bill on real tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passing the functional tests in every rep is not exclusive to top-tier models.&lt;/strong&gt; Four models passed the hidden tests (the 70-point axis) in all 3 repetitions: claude-sonnet-5 / gpt-5.5 / cursor-grok-4.5 / claude-opus-4-8 (bold in the table). But only the fable-direct baseline reached a summed 300, and what spread the delegated models apart was the type-quality axis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Even with equal functional-test results, code quality diverges.&lt;/strong&gt; Among those same 4 all-pass models, gpt-5.5 scored 4.0 and claude-sonnet-5 scored 3.8, while claude-opus-4-8 stayed at 3.5 and cursor-grok-4.5 at 3.3. That is the vertical spread in the chart. If you want code that is maintained, not just tests that pass, this axis is worth including in your choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The default is claude-sonnet-5; deviate only for a clear advantage.&lt;/strong&gt; With the top delegated auto-graded score (290.00) and an incident-free record, claude-sonnet-5 is the delegation target most users will find easiest to use from Fable for implementation tasks. Choosing anything else requires some advantage. If code quality matters and you need something cheaper, &lt;strong&gt;swe-1.7&lt;/strong&gt; (based on Kimi K2.7) or &lt;strong&gt;cursor-kimi-k2.7-code&lt;/strong&gt; are candidates; if speed matters and you need something cheaper, &lt;strong&gt;cursor-grok-4.5&lt;/strong&gt; and the like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delegation is not free.&lt;/strong&gt; The fable-direct baseline (no delegation) took 5.7 min at $2.62 and was the only condition in the main round with perfect scores in every run. Compared with the delegated runs on the same Claude harness (8.4–8.6 min, $2.27–$2.35), the cost difference on a single implementation task is small, and a naive mechanism like delegate-skills adds roughly 3 minutes of delegation overhead. If you only ever use Fable and the Claude family, you may not need delegate-skills much. Simply instructing the system prompt to proactively launch a specified model via the subagent tool for particular tasks may work well enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow-up 1: Can reasoning effort buy quality? — gpt-5.6-luna medium vs xhigh
&lt;/h2&gt;

&lt;p&gt;After the main round, I also ran a &lt;strong&gt;reasoning-effort A/B&lt;/strong&gt; on the same bench with the same frozen prompt. The subject is gpt-5.6-luna, which the main round described as "systematically failing the splitter spec." &lt;strong&gt;Both arms (medium / xhigh) were run 3 reps each, interleaved on the same day&lt;/strong&gt;, as fresh measurements.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Play&lt;/th&gt;
&lt;th&gt;Auto-graded score (max 300)&lt;/th&gt;
&lt;th&gt;Code quality (1–5)&lt;/th&gt;
&lt;th&gt;Cost USD (median)&lt;/th&gt;
&lt;th&gt;Wall clock (median)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-luna@medium&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.6-luna@medium/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;252.50&lt;/td&gt;
&lt;td&gt;3.7&lt;/td&gt;
&lt;td&gt;2.30&lt;/td&gt;
&lt;td&gt;8.0 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-luna@xhigh&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/gpt-5.6-luna@xhigh/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;282.23&lt;/strong&gt; (+12%)&lt;/td&gt;
&lt;td&gt;3.8 (+3%)&lt;/td&gt;
&lt;td&gt;3.09 (+34%)&lt;/td&gt;
&lt;td&gt;13.0 min (+63%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Per-run quality was 86.11 / 80.28 / 86.11 for medium and 88.06 / &lt;strong&gt;100&lt;/strong&gt; / 94.17 for xhigh. Every xhigh deduction was on the view axis (tofu arrows, and forfeiting the view tests via a branch that detects headless execution and self-terminates); the Model-layer tests passed fully in all 3 reps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What looked like a "systematic weakness" vanished with effort.&lt;/strong&gt; Medium again failed splitter-family tests in 2 of 3 reps (the remaining rep failed a different category), reproducing the main-round observation. Xhigh passed every Model-layer test in all 3 reps. That cleanly separates the cause: the missed spec details were not a "model quirk" but a "shortage of thinking budget."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type &lt;em&gt;warnings&lt;/em&gt; disappeared, but design-level code quality could not be bought.&lt;/strong&gt; Medium scored 0/10 on type quality in all 3 runs (same as the main round), while xhigh took 10/10 in 2 runs and even produced one perfect 100-point run. The summed 282.23 sits alongside the main round's second-place delegated group (swe-1.7 / gpt-5.5, around 280).&lt;/p&gt;

&lt;p&gt;Yet qualitative code quality did not improve: medium 3.7 / xhigh 3.5 (both judged by sonnet-5). Looking inside, the 10/10-warning xhigh run had abandoned the enum cell-representation type internally in favor of &lt;code&gt;Array[PackedInt32Array]&lt;/code&gt; and untyped nested arrays — exactly the pattern of "type everything as &lt;code&gt;Array[int]&lt;/code&gt; and you get zero warnings, but throwing away the enum type is a design deduction."&lt;/p&gt;

&lt;p&gt;What effort buys is precision of spec reading and disciplined zero-warning operation — not good design taste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The price is paid mostly in time.&lt;/strong&gt; Child input tokens balloon by about 2.4×, but because luna's unit price is cheap the cost increase stays at +34%, and most of the increment shows up as wall-clock time (+63%). With the usual n=3 caveat, this round's answer is: "run luna at xhigh and you can buy swe-1.7 / gpt-5.5-class quality for $3.09 / 13 min."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It may be a rescue lever for "cheap × high code quality × low auto-graded score" models.&lt;/strong&gt; Effort lifted only the precision of spec reading (the auto-graded axis) and left design-level code quality unchanged. Flip that around: a model that is cheap and already strong on code quality but sinking on the auto-graded axis — in the main table, a profile like cursor-kimi-k2.7-code (code quality 4.5, $1.60, score 268.06) — might cover exactly its weak side just by raising an effort-equivalent parameter. Whether the same phenomenon actually occurs outside gpt-5.6-luna is unverified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow-up 2: Can a skill raise the quality &lt;em&gt;floor&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;The qualitative observations in this bench had shown that the sharpest between-model differentiator is "how far the model carries type annotations into its internal implementation (thoroughness of Typed GDScript)." So I built the &lt;strong&gt;&lt;a href="https://github.com/oubakiou/skills/tree/main/skills/gdscript-quality" rel="noopener noreferrer"&gt;&lt;code&gt;gdscript-quality&lt;/code&gt; skill&lt;/a&gt;&lt;/strong&gt; — conventions for type annotations, typed collections, eliminating dict-as-struct, zero-warning operation, plus a headless verification script — and measured its effect in a &lt;strong&gt;with/without-skill A/B&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Play&lt;/th&gt;
&lt;th&gt;Auto-graded score (max 300)&lt;/th&gt;
&lt;th&gt;Code quality (1–5)&lt;/th&gt;
&lt;th&gt;Cost USD (median)&lt;/th&gt;
&lt;th&gt;Wall clock (median)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;claude-sonnet-5@noskill&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/claude-sonnet-5@noskill/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;282.00&lt;/td&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;td&gt;2.64&lt;/td&gt;
&lt;td&gt;9.9 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-sonnet-5@gq&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/claude-sonnet-5@gq/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;298.06 (+6%)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;5.0&lt;/strong&gt; (+19%)&lt;/td&gt;
&lt;td&gt;3.46 (+31%)&lt;/td&gt;
&lt;td&gt;12.4 min (+25%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4-8@noskill&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/claude-opus-4-8@noskill/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;270.00&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2.84&lt;/td&gt;
&lt;td&gt;9.0 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4-8@gq&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/claude-opus-4-8@gq/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;300.00&lt;/strong&gt; (+11%)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;4.0&lt;/strong&gt; (+33%)&lt;/td&gt;
&lt;td&gt;3.25 (+14%)&lt;/td&gt;
&lt;td&gt;10.5 min (+17%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The first summed 300 from a delegated run.&lt;/strong&gt; claude-opus-4-8@gq scored a perfect 100 in all 3 reps — recall that in the main round only the non-delegated fable-direct managed a summed 300. sonnet@gq also hit perfect scores in 2 of 3 runs (5 of 6 runs across the skill arms). The skill worked not by "extending the upside" but by "&lt;strong&gt;guaranteeing a quality floor for any model&lt;/strong&gt;."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "design quality" that effort couldn't buy, the skill could.&lt;/strong&gt; In follow-up 1, raising effort left qualitative code quality essentially flat (3.7 → 3.8 representative). The skill moved the design axis substantially: sonnet 4.2 → &lt;strong&gt;5.0&lt;/strong&gt; (all 3 runs carrying typed Dictionary throughout — top marks), opus 3.0 → &lt;strong&gt;4.0&lt;/strong&gt; (representative). Moreover, opus@gq's 3 runs converged on the same-shaped 4.0 ("only &lt;code&gt;_grid: Array[int]&lt;/code&gt; remains untyped, everything else typed"), so the floor-leveling showed up in score variance too. &lt;strong&gt;Effort buys zero-warning operation; the skill buys design quality as well&lt;/strong&gt; — the two follow-ups pair up neatly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overhead is +14–31% on the total.&lt;/strong&gt; Child tokens were sonnet +20% / opus +47%, totals +14–31%, time +17–25%. "For +14–31% extra cost, delegated runs line up at perfect scores" seems like a thoroughly realistic option.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow-up 3: Does the skill work across harnesses? — re-testing with composer-2.5 on Cursor
&lt;/h2&gt;

&lt;p&gt;Follow-up 2 left two open questions. First, both sonnet and opus &lt;strong&gt;already aced the functional tests unassisted&lt;/strong&gt;, so we couldn't see how the skill behaves on a model with functional weaknesses.&lt;/p&gt;

&lt;p&gt;Second, follow-up 2 was only verified on the Claude harness, leaving it unconfirmed whether &lt;strong&gt;the skill's effect generalizes across execution harnesses (CLIs)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I ran the same A/B on &lt;strong&gt;Cursor CLI's composer-2.5&lt;/strong&gt;, which carries both type warnings (3–9 of them) and a view defect (mouse dead) (2026-07-14, same skill commit as follow-up 2).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Play&lt;/th&gt;
&lt;th&gt;Auto-graded score (max 300)&lt;/th&gt;
&lt;th&gt;Code quality (1–5)&lt;/th&gt;
&lt;th&gt;Cost USD (median)&lt;/th&gt;
&lt;th&gt;Wall clock (median)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;composer-2.5@noskill&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/composer-2.5@noskill/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;268.18&lt;/td&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;td&gt;1.23&lt;/td&gt;
&lt;td&gt;5.0 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;composer-2.5@gq&lt;/td&gt;
&lt;td&gt;&lt;a href="https://oubakiou.github.io/godot-llm-gamebench/games/composer-2.5@gq/index.en.html" rel="noopener noreferrer"&gt;Play&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;292.23&lt;/strong&gt; (+9%)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;4.2&lt;/strong&gt; (+24%)&lt;/td&gt;
&lt;td&gt;1.18 (−4%)&lt;/td&gt;
&lt;td&gt;6.2 min (+24%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: code quality uses the same two-judge scheme as the main round (sonnet-5 / sol = noskill 3.3/3.5, gq 4.2/4.3; all rows diverged by ≤ ±0.5, split rows took the floor of the average as the representative value). Calibration anchors were the 3 adopted composer-2.5 runs from the main measurement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The skill's floor-raising reproduced on the Cursor harness.&lt;/strong&gt; Type warnings went from 6 / 9 / 3 → &lt;strong&gt;0 / 0 / 0&lt;/strong&gt;. Qualitative code quality also improved 3.4 → 4.2, the same magnitude as opus in follow-up 2 (3.0 → 4.0). Inside, the effect concentrates on &lt;strong&gt;consistent adoption of Godot 4.4's typed Dictionary syntax (&lt;code&gt;Dictionary[K, V]&lt;/code&gt;)&lt;/strong&gt;: the &lt;code&gt;_items&lt;/code&gt; / &lt;code&gt;_splitter_toggles&lt;/code&gt; that bare composer left untyped in every run were typed in all 3 skill runs. Meanwhile the untyped nesting of &lt;code&gt;_grid: Array[Array]&lt;/code&gt; remained in 2/3 even with the skill — outlining the skill's coverage: "effective for typing Dictionaries, not quite enough for typing nested Arrays."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And functional weaknesses, as expected, are not fixed by the skill.&lt;/strong&gt; The view's dead mouse (a &lt;code&gt;ColorRect&lt;/code&gt; whose &lt;code&gt;mouse_filter&lt;/code&gt; swallows clicks) remained in 2 of 3 runs even with the skill, and the sum fell short of 300 (with the mouse deduction in place the ceiling is about 294). The interesting one is the remaining run: it chose &lt;code&gt;Polygon2D&lt;/code&gt; instead of &lt;code&gt;ColorRect&lt;/code&gt; for cell rendering, so the mouse works. Composer's dead mouse is thus not an "always-on defect" but a probabilistic habit depending on the rendering-node choice, and with n=3 no causal claim about the skill can be made. &lt;strong&gt;The skill buys zero-warning operation and design quality; a "playable view" cannot be bought by either effort or skill&lt;/strong&gt; — that is the summary across all three follow-ups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One by-product.&lt;/strong&gt; Despite child tokens increasing +48%, composer's child unit price is so low ($0.04–0.06/run) that &lt;strong&gt;the total actually stayed flat&lt;/strong&gt; ($1.23 → $1.18); the real price is time only (+24%). "Cheapest-class child + skill buys a type-quality floor" is an attractive combination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running it yourself
&lt;/h2&gt;

&lt;p&gt;Point your local coding agent at &lt;a href="https://github.com/oubakiou/godot-llm-gamebench/tree/main/docs" rel="noopener noreferrer"&gt;https://github.com/oubakiou/godot-llm-gamebench/tree/main/docs&lt;/a&gt; and ask it questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;Based on these latest benchmark results, I'm currently trying the following routing in real-world use. If anything comes up in practice, I may append it to this article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;.claude/settings.local.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_EXPLORE_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"composer-2.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_IMPLEMENT_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"swe-1.7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_CHORE_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"composer-2.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_REVIEW_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.6-sol"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All design details are public in &lt;a href="https://github.com/oubakiou/godot-llm-gamebench/blob/main/docs/design/bench_common_design.md" rel="noopener noreferrer"&gt;docs/design/bench_common_design.md&lt;/a&gt; (model roster, measurement, fairness limits, anti-cheating design) and &lt;a href="https://github.com/oubakiou/godot-llm-gamebench/blob/main/docs/design/delegate_implement_bench_design.md" rel="noopener noreferrer"&gt;docs/design/delegate_implement_bench_design.md&lt;/a&gt; (task spec and the full rubric). The license is MIT. In the agent era, "which model do I outsource to?" is a question worth answering with numbers — take a look.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>benchmark</category>
      <category>godot</category>
      <category>ai</category>
    </item>
    <item>
      <title>Don't Make the Expensive Model Do Everything — delegate-skills, a Casual Multi-Model Setup Built on Nothing but Standard Skills</title>
      <dc:creator>oubakiou</dc:creator>
      <pubDate>Sat, 11 Jul 2026 03:29:10 +0000</pubDate>
      <link>https://dev.to/kiou_ouba_afbd120335456f3/dont-make-the-expensive-model-do-everything-delegate-skills-a-casual-multi-model-setup-built-on-1c9j</link>
      <guid>https://dev.to/kiou_ouba_afbd120335456f3/dont-make-the-expensive-model-do-everything-delegate-skills-a-casual-multi-model-setup-built-on-1c9j</guid>
      <description>&lt;p&gt;Putting a top-tier model like Claude Fable 5 in charge of your main agent raises the quality of its judgment — but it also means paying flagship prices for "labor": reading piles of code, applying mechanical fixes, staring at diffs. Fable 5 costs $10 input / $50 output (per 1M tokens). Claude Haiku 4.5, meanwhile, is $1 / $5.&lt;/p&gt;

&lt;p&gt;Do you really need to pay 10× the rate for grunt work?&lt;/p&gt;

&lt;p&gt;As it happens, Anthropic itself has answered this question. According to &lt;a href="https://x.com/ClaudeDevs/status/2074606063509528855" rel="noopener noreferrer"&gt;a post from @ClaudeDevs&lt;/a&gt;, a Claude Managed Agents configuration that splits Fable 5 into the planner/integrator role (orchestrator) and Sonnet 5 into the read-and-execute role (worker) achieved &lt;strong&gt;96% of standalone Fable 5's performance at 46% of the price&lt;/strong&gt; on the BrowseComp web-research benchmark. This "plan with a big model, execute with small models" pattern is covered in detail in the official cookbook &lt;a href="https://github.com/anthropics/claude-cookbooks/blob/main/managed_agents/CMA_plan_big_execute_small.ipynb" rel="noopener noreferrer"&gt;Plan big, execute small&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oubakiou/delegate-skills" rel="noopener noreferrer"&gt;delegate-skills&lt;/a&gt; is a skill set that brings this same idea to the world of CLI agents like Claude Code — using nothing but the standard skill mechanism. Your main agent stays on the expensive model, while exploration, implementation, review, and chores are delegated to child processes running cheaper models (or models from other vendors), compressing your token costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Token-cost compression
&lt;/h3&gt;

&lt;p&gt;Routine read/write-heavy work is offloaded to cheap models, so an expensive model like Fable spends its tokens on &lt;strong&gt;decision-making and final responsibility&lt;/strong&gt;. Delegate code exploration to Haiku via the &lt;a href="https://github.com/oubakiou/delegate-skills/blob/main/skills/delegate-explore/SKILL.md" rel="noopener noreferrer"&gt;&lt;code&gt;delegate-explore&lt;/code&gt;&lt;/a&gt; skill, for example, and the token unit price of that work drops to 1/10.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Context isolation
&lt;/h3&gt;

&lt;p&gt;Delegation isn't only about cost. Bulk file reads and trial-and-error logs stay confined to the child process; the main agent reads the result markdown &lt;strong&gt;progressively — index first, then only the sections it needs&lt;/strong&gt;. Because the main conversation context never bloats with investigation logs, the quality of its judgment holds up even in long sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Crossing vendor walls
&lt;/h3&gt;

&lt;p&gt;Delegation targets are not limited to the Claude family. &lt;strong&gt;Just specifying a model name&lt;/strong&gt; selects the execution backend.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model name&lt;/th&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;Launched via&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sonnet&lt;/code&gt; / &lt;code&gt;haiku&lt;/code&gt; / &lt;code&gt;opus&lt;/code&gt; / &lt;code&gt;fable&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Claude subprocess&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude -p&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Codex subprocess&lt;/td&gt;
&lt;td&gt;&lt;code&gt;codex exec&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;swe-*&lt;/code&gt; / &lt;code&gt;devin-*&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Devin CLI subprocess&lt;/td&gt;
&lt;td&gt;&lt;code&gt;devin -p&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;composer-*&lt;/code&gt; / &lt;code&gt;cursor-*&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Cursor agent CLI subprocess&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agent -p&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Throwing an implementation at GPT from Claude Code, or an exploration at Haiku from Codex — cross-vendor delegation works through a single mechanism. The requesting side (the main agent) can also be any of Claude Code / Codex / Devin CLI / Cursor CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The skill lineup
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Tool permissions&lt;/th&gt;
&lt;th&gt;Default model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/oubakiou/delegate-skills/blob/main/skills/delegate-explore/SKILL.md" rel="noopener noreferrer"&gt;delegate-explore&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Read-only code &amp;amp; documentation exploration&lt;/td&gt;
&lt;td&gt;read-only&lt;/td&gt;
&lt;td&gt;haiku&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/oubakiou/delegate-skills/blob/main/skills/delegate-implement/SKILL.md" rel="noopener noreferrer"&gt;delegate-implement&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Code implementation &amp;amp; fixes (one commit)&lt;/td&gt;
&lt;td&gt;Edit/Write/Bash (no push)&lt;/td&gt;
&lt;td&gt;sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delegate-chore&lt;/td&gt;
&lt;td&gt;Fallback miscellaneous work&lt;/td&gt;
&lt;td&gt;Edit/Write/Bash (no push)&lt;/td&gt;
&lt;td&gt;haiku&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/oubakiou/delegate-skills/blob/main/skills/delegate-review/SKILL.md" rel="noopener noreferrer"&gt;delegate-review&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Code / document review (surfacing findings on a diff)&lt;/td&gt;
&lt;td&gt;read-only&lt;/td&gt;
&lt;td&gt;opus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each skill's default model can be changed via an environment variable, &lt;code&gt;DELEGATE_&amp;lt;TYPE&amp;gt;_MODEL&lt;/code&gt; (e.g. &lt;code&gt;DELEGATE_IMPLEMENT_MODEL=gpt-5.5&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  How it differs from similar efforts
&lt;/h2&gt;

&lt;p&gt;Attempts to combine multiple models are multiplying right now: LLM routers that pick a response model per query, dedicated orchestration frameworks, and the first-party multi-agent features that each agent CLI is starting to ship. delegate-skills sits in this same current, but its position is distinct.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standard skills only — and casual about it
&lt;/h3&gt;

&lt;p&gt;The biggest differentiator is that everything runs on &lt;strong&gt;the agent's standard skill mechanism alone&lt;/strong&gt;. No dedicated server, no resident process, no SQLite, no orchestration framework to adopt. Since the substance is just shell scripts and a file-based protocol, it works the moment you &lt;code&gt;gh skill install&lt;/code&gt; it — and when you no longer need it, you just uninstall. Getting started isn't the major undertaking of "building a multi-model architecture"; it's as casual as adding one more skill.&lt;/p&gt;

&lt;h3&gt;
  
  
  vs. Claude Code's built-in multi-agent sessions
&lt;/h3&gt;

&lt;p&gt;Claude Code ships with a built-in &lt;a href="https://platform.claude.com/docs/en/managed-agents/multi-agent" rel="noopener noreferrer"&gt;multi-agent session&lt;/a&gt; mechanism. delegate-skills is not a replacement for it — the aims differ.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token-cost efficiency is the top priority&lt;/strong&gt; — where most general-purpose multi-agent mechanisms center on parallelism or role separation, delegate-skills is designed first and foremost to "offload to cheap models and shrink the bill." The cheap-model defaults, progressive reading via &lt;code&gt;md2idx&lt;/code&gt;, and measured costs in the observe JSON all serve this goal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The only topology is a tree from a single parent&lt;/strong&gt; — agents don't talk to each other as peers; delegation always flows one way, parent → child, and a recursion guard prevents runaway chains. By deliberately limiting expressiveness, both accountability (final responsibility for the deliverable always rests with the root agent) and the flow of context stay simple&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-vendor by design&lt;/strong&gt; — it isn't confined to division of labor within the Claude family: a model name alone delegates to Codex (&lt;code&gt;gpt-*&lt;/code&gt;), Devin CLI, or Cursor agent CLI. The requesting side isn't limited to Claude Code either&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Children never communicate horizontally, and results always return to the parent through files. Who owns the final deliverable is structurally unambiguous at all times.&lt;/p&gt;

&lt;h2&gt;
  
  
  So which model should you actually delegate to?
&lt;/h2&gt;

&lt;p&gt;That's the next question, naturally. To answer it, I run a benchmark called &lt;a href="https://github.com/oubakiou/godot-llm-gamebench" rel="noopener noreferrer"&gt;godot-llm-gamebench&lt;/a&gt;: the implementation of an original-spec puzzle in Godot 4.x + typed GDScript (not a known game, to avoid training-data contamination) is delegated from a parent agent (Claude Fable 5) to each vendor's models via &lt;code&gt;delegate-implement&lt;/code&gt;, and auto-graded with a 100-point rubric built on hidden test code the delegatee never sees.&lt;/p&gt;

&lt;p&gt;Each model runs 3 repetitions, with quality and efficiency (time, tokens, cost) measured on separate axes. The benchmark repository will be published later and covered in detail in a separate article; here is an excerpt of the latest adopted values from measurements taken 2026-07-05 through 07-10.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model (harness)¹&lt;/th&gt;
&lt;th&gt;Auto-graded score (max 300)²&lt;/th&gt;
&lt;th&gt;Code quality (1–5)³&lt;/th&gt;
&lt;th&gt;Total cost (median)&lt;/th&gt;
&lt;th&gt;Wall clock (median)&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;claude-sonnet-5&lt;/strong&gt; (Claude)&lt;/td&gt;
&lt;td&gt;285.00&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$2.27 (measured)&lt;/td&gt;
&lt;td&gt;8.6 min&lt;/td&gt;
&lt;td&gt;Top auto-graded score, incident-free. Two zero-warning runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;swe-1.7&lt;/strong&gt; (Devin)&lt;/td&gt;
&lt;td&gt;273.00&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;$1.41 (bundled)&lt;/td&gt;
&lt;td&gt;12.5 min&lt;/td&gt;
&lt;td&gt;Big improvement over swe-1.6, with a 100-point run. But slowest tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;gpt-5.5&lt;/strong&gt; (Codex)&lt;/td&gt;
&lt;td&gt;270.00&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;$3.48 (converted)&lt;/td&gt;
&lt;td&gt;5.8 min&lt;/td&gt;
&lt;td&gt;Perfect functional score in every rep, incident-free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;cursor-grok-4.5&lt;/strong&gt; (Cursor)&lt;/td&gt;
&lt;td&gt;264.00&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;$1.38 (converted)&lt;/td&gt;
&lt;td&gt;4.8 min&lt;/td&gt;
&lt;td&gt;Perfect functional score, fastest tier, fewest tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4-mini (Codex)&lt;/td&gt;
&lt;td&gt;258.18&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;$2.04 (converted)&lt;/td&gt;
&lt;td&gt;11.1 min&lt;/td&gt;
&lt;td&gt;Fewest type warnings but slow, with a determinism drop and stalls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;devin-deepseek-v4-pro&lt;/strong&gt; (Devin)&lt;/td&gt;
&lt;td&gt;258.00&lt;/td&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;td&gt;$3.58 (estimated)&lt;/td&gt;
&lt;td&gt;11.1 min&lt;/td&gt;
&lt;td&gt;Perfect functional score in every rep, but slowest tier and pricey&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;composer-2.5 (Cursor)&lt;/td&gt;
&lt;td&gt;257.36&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$1.29 (converted)&lt;/td&gt;
&lt;td&gt;6.5 min&lt;/td&gt;
&lt;td&gt;Child cost of $0.04 is the lowest of all models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;composer-2.5-fast (Cursor)&lt;/td&gt;
&lt;td&gt;257.36&lt;/td&gt;
&lt;td&gt;3.7&lt;/td&gt;
&lt;td&gt;$1.76 (converted)&lt;/td&gt;
&lt;td&gt;7.8 min&lt;/td&gt;
&lt;td&gt;Wall clock swings widely with measurement timing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;gpt-5.6-sol&lt;/strong&gt; (Codex)&lt;/td&gt;
&lt;td&gt;255.00&lt;/td&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;td&gt;$3.10 (converted)&lt;/td&gt;
&lt;td&gt;7.1 min&lt;/td&gt;
&lt;td&gt;A stable 85 in every rep. Same quality as terra at twice the unit price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;gpt-5.6-terra&lt;/strong&gt; (Codex)&lt;/td&gt;
&lt;td&gt;255.00&lt;/td&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;td&gt;$2.38 (converted)&lt;/td&gt;
&lt;td&gt;6.3 min&lt;/td&gt;
&lt;td&gt;Matches sol at roughly half the cost and faster — the efficiency pick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;claude-opus-4-8&lt;/strong&gt; (Claude)&lt;/td&gt;
&lt;td&gt;255.00&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;$2.35 (measured)&lt;/td&gt;
&lt;td&gt;8.4 min&lt;/td&gt;
&lt;td&gt;Child aces functional tests every time (failures were parent/harness side)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;devin-glm-5.2 (Devin)&lt;/td&gt;
&lt;td&gt;253.18&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$2.28 (estimated)&lt;/td&gt;
&lt;td&gt;5.9 min&lt;/td&gt;
&lt;td&gt;Fast and functionally accurate. Pre-completion stalls are the one flaw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor-gemini-3.1-pro (Cursor)&lt;/td&gt;
&lt;td&gt;253.18&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;$2.13 (converted)&lt;/td&gt;
&lt;td&gt;8.4 min&lt;/td&gt;
&lt;td&gt;Warning-count swings and a stall habit. Highest token use among Cursor models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor-kimi-k2.7-code (Cursor)&lt;/td&gt;
&lt;td&gt;253.18&lt;/td&gt;
&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;$1.60 (converted)&lt;/td&gt;
&lt;td&gt;10.6 min&lt;/td&gt;
&lt;td&gt;Top-tier type discipline, but slowest of the Cursor models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.3-codex-spark (Codex)&lt;/td&gt;
&lt;td&gt;251.36&lt;/td&gt;
&lt;td&gt;3.6&lt;/td&gt;
&lt;td&gt;≥ $1.47 (child unknown)⁴&lt;/td&gt;
&lt;td&gt;4.5 min&lt;/td&gt;
&lt;td&gt;Fast but unstable on details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-luna (Codex)&lt;/td&gt;
&lt;td&gt;244.09&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;$1.95 (converted)&lt;/td&gt;
&lt;td&gt;7.3 min&lt;/td&gt;
&lt;td&gt;Cheap, but systematically misses spec details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;swe-1.6 (Devin)&lt;/td&gt;
&lt;td&gt;212.28&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;td&gt;$0.95 (bundled)&lt;/td&gt;
&lt;td&gt;3.9 min&lt;/td&gt;
&lt;td&gt;Cheapest (bundled pricing) but lowest quality on both axes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-haiku-4-5 (Claude)&lt;/td&gt;
&lt;td&gt;83.18 (n=1)&lt;/td&gt;
&lt;td&gt;2.7 (n=1)&lt;/td&gt;
&lt;td&gt;$2.53 (measured)&lt;/td&gt;
&lt;td&gt;9.3 min&lt;/td&gt;
&lt;td&gt;Completed 1/7. Frequent stalls, least reliable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: swe-1.7's child cost is $0 under bundled pricing during its free preview period (until 2026-08-08).&lt;/p&gt;

&lt;p&gt;Baseline condition (does not go through the delegation protocol; reference only — not directly comparable with the table above):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Auto-graded score (max 300)²&lt;/th&gt;
&lt;th&gt;Code quality (1–5)³&lt;/th&gt;
&lt;th&gt;Total cost (median)&lt;/th&gt;
&lt;th&gt;Wall clock (median)&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;fable-direct&lt;/strong&gt; (no delegation)&lt;/td&gt;
&lt;td&gt;300.00&lt;/td&gt;
&lt;td&gt;4.6&lt;/td&gt;
&lt;td&gt;$2.62 (measured)&lt;/td&gt;
&lt;td&gt;5.7 min&lt;/td&gt;
&lt;td&gt;The parent (Fable) implements directly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;¹ Each model's effort level is fixed to its single default. Bold marks models that passed the hidden tests (the 60-point axis) in all 3 repetitions.&lt;/p&gt;

&lt;p&gt;² The sum over 3 repetitions (max 300) of a 100-point auto-graded rubric: hidden tests never shown to the delegatee (60), determinism (10), type quality (15), and project health (15).&lt;/p&gt;

&lt;p&gt;³ A 5-point qualitative rating (average of 3 runs) of design aspects such as thoroughness of typing, Model/View separation, readability, and use of constants. Primary judge (sonnet) layered with a cross-check judge (gpt-5.6-sol); on divergence the operator (Fable) adjudicated the representative value.&lt;/p&gt;

&lt;p&gt;⁴ The child process's token usage could not be measured, so the child cost is unknown; this is a lower bound of parent cost only (the actual total is higher). Shown as a triangle (▶) in the scatter plot.&lt;/p&gt;

&lt;p&gt;There are plenty of caveats to reading these results (grading-method details, differing cost-accounting precision, sample size, confounding parent-side factors, and so on), but I'll leave those to the future article introducing the benchmark itself and skip them here.&lt;/p&gt;

&lt;p&gt;Per-token price and per-task cost do not necessarily agree. Even with a cheap unit price, a model can end up costing more if it consumes more tokens or takes longer (inflating the parent-side cost). In this bench, devin-deepseek-v4-pro (input $1.74 / output $3.48) — priced at 1/3 to 1/9 of gpt-5.5 (input $5 / output $30) — consumed roughly twice the input tokens and ended up above gpt-5.5 in median total cost, $3.58 vs $3.48. Price sheets are only a starting point; what matters is the bill on real tasks.&lt;/p&gt;

&lt;p&gt;Also, if you're on a vendor's subscription plan, your effective per-token cost is substantially lower than the published unit price, and the discount varies by company — but this article uses published token prices as a uniform yardstick.&lt;/p&gt;

&lt;p&gt;Since this skill set puts token-cost efficiency first, let's compare the 16 models with an auto-graded score of 240 or higher on the two axes of cost and code quality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58l68fbiqkg3uw732kyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58l68fbiqkg3uw732kyw.png" alt="Scatter plot of cost × code quality" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what the data suggests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Passing the functional tests in every rep is not exclusive to top-tier models&lt;/strong&gt; — eight models passed the hidden tests (the 60-point axis) in all 3 repetitions: claude-sonnet-5 / swe-1.7 / gpt-5.5 / cursor-grok-4.5 / devin-deepseek-v4-pro / gpt-5.6-sol / gpt-5.6-terra / claude-opus-4-8. But only the fable-direct baseline reached a summed 300, and what spread the delegated models apart was the type-quality axis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even with equal functional-test results, code quality diverges&lt;/strong&gt; — among those same all-pass models, gpt-5.6-sol / gpt-5.6-terra scored 4.2, gpt-5.5 4.0, and claude-sonnet-5 3.8, while claude-opus-4-8 stayed at 3.5, devin-deepseek-v4-pro at 3.4, and cursor-grok-4.5 at 3.3. That is the vertical spread in the chart. If you want code that is maintained, not just tests that pass, this axis is worth including in your choice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The default is claude-sonnet-5; deviate only for a clear advantage&lt;/strong&gt; — with the top delegated auto-graded score (285.00) and an incident-free record, claude-sonnet-5 is the delegation target most users will find easiest to use from Fable for implementation tasks. Choosing anything else requires some advantage. If code quality matters and you need something cheaper, &lt;strong&gt;swe-1.7&lt;/strong&gt; (based on Kimi K2.7) or &lt;strong&gt;cursor-kimi-k2.7-code&lt;/strong&gt; are candidates; if speed matters and you need something cheaper, &lt;strong&gt;cursor-grok-4.5&lt;/strong&gt; and the like&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delegation is not free&lt;/strong&gt; — the fable-direct baseline (no delegation) took 5.7 min at $2.62 and was the only one of all 19 conditions with perfect scores in every run. Compared with the delegated runs on the same Claude harness (8.4–8.6 min, $2.27–$2.35), the cost difference on a single implementation task is small, and roughly 3 minutes of delegation overhead is added. If you only ever use Fable and the Claude family, you may not need delegate-skills much. Simply instructing the system prompt to proactively launch a specified model via the subagent tool for particular tasks may work well enough&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To repeat: this is a small-scale measurement — a single task, 3 repetitions each. Please take it as nothing more than "an initial default for choosing a delegation target."&lt;/p&gt;

&lt;p&gt;Finally, here's my own non-work configuration (&lt;code&gt;.claude/settings.local.json&lt;/code&gt;) as an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_EXPLORE_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"composer-2.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_IMPLEMENT_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"composer-2.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_CHORE_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"composer-2.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DELEGATE_REVIEW_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.6-sol"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I may publish a separate benchmark for delegate-review rather than delegate-implement. (Or I may not.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js and &lt;a href="https://github.com/oubakiou/md2idx" rel="noopener noreferrer"&gt;md2idx&lt;/a&gt; (installing beforehand isn't strictly required, but it's used for parent–child communication, so &lt;code&gt;npm install -g md2idx&lt;/code&gt; is recommended)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The CLI matching your delegation target (&lt;code&gt;claude&lt;/code&gt; / &lt;code&gt;codex&lt;/code&gt; / &lt;code&gt;devin&lt;/code&gt; / Cursor's &lt;code&gt;agent&lt;/code&gt;, each logged in)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;

&lt;p&gt;It installs via &lt;a href="https://cli.github.com/" rel="noopener noreferrer"&gt;GitHub CLI&lt;/a&gt; (v2.90.0+) &lt;code&gt;gh skill&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install individually (for Claude Code)&lt;/span&gt;
gh skill &lt;span class="nb"&gt;install &lt;/span&gt;oubakiou/delegate-skills delegate-explore &lt;span class="nt"&gt;--agent&lt;/span&gt; claude-code &lt;span class="nt"&gt;--scope&lt;/span&gt; project

&lt;span class="c"&gt;# Or everything at once&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;skill &lt;span class="k"&gt;in &lt;/span&gt;delegate-explore delegate-implement delegate-chore delegate-review&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;gh skill &lt;span class="nb"&gt;install &lt;/span&gt;oubakiou/delegate-skills &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$skill&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--agent&lt;/span&gt; claude-code &lt;span class="nt"&gt;--scope&lt;/span&gt; project
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also install with the skills CLI from &lt;a href="https://github.com/vercel-labs/skills" rel="noopener noreferrer"&gt;vercel-labs/skills&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add oubakiou/delegate-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run
&lt;/h3&gt;

&lt;p&gt;If you're fine with the default models, no extra configuration is needed. Just ask your main agent as usual, and delegation happens automatically based on each skill's description.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find out where authentication is implemented in this repository&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;→ The main agent triggers &lt;code&gt;delegate-explore&lt;/code&gt;, and a &lt;code&gt;haiku&lt;/code&gt; child process does the investigating. The main agent reads the result file's index, then only the sections it needs.&lt;/p&gt;

&lt;p&gt;You can also delegate explicitly by naming a skill:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Review the diff on this branch with delegate-review&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And if you want it to delegate more aggressively, add a single line to your project's CLAUDE.md / AGENTS.md:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; To save tokens, actively delegate tasks to subagents using the delegate-&lt;span class="se"&gt;\*&lt;/span&gt; skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;The main agent and the child talk through a &lt;strong&gt;file-based request/response protocol&lt;/strong&gt;. Both files are written in md2idx format (index + sections), so they can be read progressively, saving tokens.&lt;/p&gt;

&lt;p&gt;Each skill's execution flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;prepare.sh&lt;/code&gt; — prerequisite checks → model resolution (&lt;code&gt;DELEGATE_&amp;lt;TYPE&amp;gt;_MODEL&lt;/code&gt; env → skill default) → recursion guard against multi-hop delegation → request generation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dispatch.sh&lt;/code&gt; — deterministically selects the backend from the model-name prefix and launches the child process via a shell wrapper&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;read-response.sh auto&lt;/code&gt; — reads the response (progressively if large) → validation&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fail-safe design
&lt;/h3&gt;

&lt;p&gt;Guardrails are built in so that "fire and forget to a cheap model" doesn't end in accidents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recursion guard&lt;/strong&gt; — if the same kind of delegation occurs twice in a multi-hop chain, it stops with exit 4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail-closed&lt;/strong&gt; — if a prerequisite (like &lt;code&gt;md2idx&lt;/code&gt;) is missing, it fails instead of silently continuing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restricted tool permissions&lt;/strong&gt; — delegatees can't push; explore / review are read-only&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Files generated per delegation
&lt;/h3&gt;

&lt;p&gt;Each delegation (run) generates the following under &lt;code&gt;DELEGATE_WORK_DIR&lt;/code&gt; (when unset, &lt;code&gt;TMPDIR&lt;/code&gt; per &lt;code&gt;mktemp&lt;/code&gt;'s defaults, else &lt;code&gt;/tmp&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;request file&lt;/strong&gt; — what the parent asks of the child. Alongside the md2idx-format JSON the agent reads (&lt;code&gt;*_req.json&lt;/code&gt;), a same-content markdown (&lt;code&gt;*_req.md&lt;/code&gt;) is generated for human debugging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;response file&lt;/strong&gt; — the child's report of its results. Also a pair: agent-facing JSON (&lt;code&gt;*_res.json&lt;/code&gt;) and human-debugging markdown (&lt;code&gt;*_res.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;observe JSON&lt;/strong&gt; — an observation record of execution state, heartbeats, token usage, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;per-run scratch directory&lt;/strong&gt; — temporary work area for the child process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since the default &lt;code&gt;/tmp&lt;/code&gt; location can be wiped across days, if you want to investigate failures or monitor externally, pinning it to an ignored directory inside your repo — e.g. &lt;code&gt;DELEGATE_WORK_DIR=.temp/delegate/work&lt;/code&gt; — is recommended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resumable sessions for review-fix loops
&lt;/h3&gt;

&lt;p&gt;Normal delegations are throwaway, but for larger &lt;code&gt;delegate-implement&lt;/code&gt; / &lt;code&gt;delegate-chore&lt;/code&gt; work where a review → fix loop is expected, the main agent can explicitly start a resumable initial run. The observe JSON records a resume handle and lineage, and subsequent follow-ups resume the same backend session. This is fail-closed too: if validation fails, it does not silently fall back to a new session.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delegation-cost observability
&lt;/h3&gt;

&lt;p&gt;The child process's token usage is recorded in the observe JSON. All four backends — Claude / Codex / Devin / Cursor — can report measured values (&lt;code&gt;measured&lt;/code&gt;); when unavailable, it falls back to a chars/4 estimate (&lt;code&gt;estimated&lt;/code&gt;), and the two are clearly distinguished. For backends that report measured tokens but no cost (like Codex), a &lt;code&gt;cost_usd_estimated&lt;/code&gt; converted from a bundled price table is attached. In other words, you can verify after the fact whether delegating actually made things cheaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;p&gt;You use Claude Code / Codex / Devin / Cursor as your main agent, and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your token bill is on your mind&lt;/li&gt;
&lt;li&gt;in long sessions, your main agent's context fills up with investigation logs and you can &lt;strong&gt;feel the quality of its judgment degrade&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;you have CLIs from multiple vendors and want to &lt;strong&gt;use the right model for the right task&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;At the core of delegate-skills is a simple division of labor: "the expensive model's job is judgment and responsibility; the cheap model's job is reading and writing." It realizes this with nothing but the skill mechanism — no dedicated infrastructure — spanning four backends with a single model name, with reliability underwritten by a file-based protocol and fail-safe design.&lt;/p&gt;

&lt;p&gt;Installation is one &lt;code&gt;gh skill install&lt;/code&gt;. Start with &lt;code&gt;delegate-explore&lt;/code&gt;, and experience investigation tasks getting done at Haiku prices.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/oubakiou/delegate-skills" rel="noopener noreferrer"&gt;https://github.com/oubakiou/delegate-skills&lt;/a&gt;&lt;br&gt;
License: MIT&lt;/p&gt;

</description>
      <category>llm</category>
      <category>claude</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>Rendering Charts Beyond Mermaid's Reach with Vega-Lite and Embedding Them in Markdown (via LLM Skills)</title>
      <dc:creator>oubakiou</dc:creator>
      <pubDate>Tue, 30 Jun 2026 04:34:02 +0000</pubDate>
      <link>https://dev.to/kiou_ouba_afbd120335456f3/rendering-charts-beyond-mermaids-reach-with-vega-lite-and-embedding-them-in-markdown-via-llm-1kkl</link>
      <guid>https://dev.to/kiou_ouba_afbd120335456f3/rendering-charts-beyond-mermaids-reach-with-vega-lite-and-embedding-them-in-markdown-via-llm-1kkl</guid>
      <description>&lt;p&gt;AI agents like Claude Code and Codex can write code, polish documentation, and automate complex tasks. But ask them to "make a scatter plot of this data" or "show the trend as a heatmap," and they hit a wall. Mermaid tops out at basic bar charts and pie charts — statistical visualization is outside its scope.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oubakiou/skills#dataviz-svg--vega-lite-%E3%81%AB%E3%82%88%E3%82%8B-svg-%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88%E7%94%9F%E6%88%90" rel="noopener noreferrer"&gt;&lt;strong&gt;dataviz-svg&lt;/strong&gt;&lt;/a&gt; is a skill built to fill that gap. It generates SVG charts from &lt;a href="https://github.com/vega/vega-lite" rel="noopener noreferrer"&gt;Vega-Lite&lt;/a&gt; declarative JSON specs and embeds them directly into Markdown documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Mermaid Falls Short
&lt;/h2&gt;

&lt;p&gt;Mermaid is a great tool, but it excels in a different domain.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mermaid's strengths&lt;/th&gt;
&lt;th&gt;dataviz-svg's strengths&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flowcharts, sequence diagrams, ER diagrams&lt;/td&gt;
&lt;td&gt;Scatter plots, heatmaps, histograms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State diagrams, Gantt charts&lt;/td&gt;
&lt;td&gt;Box plots, area charts, bubble charts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple bar charts with a few data points&lt;/td&gt;
&lt;td&gt;Charts with 20+ data points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structural diagrams in general&lt;/td&gt;
&lt;td&gt;Multi-axis encoding (x, y, color, size)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In short: Mermaid is for &lt;strong&gt;structural diagrams&lt;/strong&gt;, dataviz-svg is for &lt;strong&gt;data-driven statistical visualization&lt;/strong&gt;. When an agent can use both, the expressiveness of its documentation output improves dramatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Chart Types
&lt;/h2&gt;

&lt;p&gt;An example actually generated from the skill&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feeg535zn5uc1d3x5cxgo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feeg535zn5uc1d3x5cxgo.png" alt=" " width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;dataviz-svg inherits the full expressiveness of Vega-Lite, so the range of supported charts is broad. Check out the &lt;a href="https://vega.github.io/vega-lite/examples/" rel="noopener noreferrer"&gt;official Vega-Lite gallery&lt;/a&gt; to see what's possible at a glance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bar charts&lt;/strong&gt; — vertical, horizontal, grouped, stacked (including 100% stacked)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line charts&lt;/strong&gt; — single series, multi-series (with &lt;code&gt;strokeDash&lt;/code&gt; for print-friendly output)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scatter plots&lt;/strong&gt; — basic scatter, bubble charts (size + color + log scale)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Area charts&lt;/strong&gt; — stacked area, streamgraph&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heatmaps&lt;/strong&gt; — 2D grid with overlaid text layers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Histograms&lt;/strong&gt; — distribution via binning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Box plots&lt;/strong&gt; — quartile display&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pie / Donut charts&lt;/strong&gt; — donut variant via &lt;code&gt;innerRadius&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layered charts&lt;/strong&gt; — line + point + text label overlays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facet / Concatenation&lt;/strong&gt; — small multiples, horizontal/vertical multi-chart layouts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;p&gt;The core of dataviz-svg is simple. Vega-Lite and Vega are bundled into a single ESM file (~1.6 MB) with Vite, so it runs on Node.js alone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vega-Lite JSON spec
    ↓ compile()
Vega spec
    ↓ Vega runtime
SVG string
    ↓ writeFileSync
output.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No native dependencies like &lt;code&gt;canvas&lt;/code&gt; or &lt;code&gt;puppeteer&lt;/code&gt;. No additional &lt;code&gt;npm install&lt;/code&gt; needed. The bundle ships with the skill, so it works right after installation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execution Flow from the Agent's Perspective
&lt;/h3&gt;

&lt;p&gt;When an agent uses this skill, it follows 5 steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Understand data and visualization requirements&lt;/strong&gt; — identify the input data (inline values / CSV / JSON), chart type, and axis/color mappings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a Vega-Lite JSON spec&lt;/strong&gt; — write the spec as a JSON file, referencing the bundled pattern collection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render the SVG&lt;/strong&gt; — run &lt;code&gt;render-svg.sh&lt;/code&gt; to generate the SVG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embed in Markdown&lt;/strong&gt; — reference with &lt;code&gt;![Chart Title](./assets/chart.svg)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review and adjust&lt;/strong&gt; — inspect the SVG, tweak label angles or color scales, and re-render&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From the user's perspective, you just say "turn this data into a heatmap" and the agent handles everything — spec creation, rendering, and document embedding — end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Visualizing Sales Data
&lt;/h2&gt;

&lt;p&gt;For example, to create a bar chart of quarterly sales data, the agent generates a Vega-Lite spec like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vega.github.io/schema/vega-lite/v5.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"background"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"white"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quarter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Q1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quarter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Q2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;185&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quarter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Q3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;210&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quarter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Q4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;165&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mark"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"encoding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quarter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ordinal"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quantitative"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quarter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nominal"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass this to &lt;code&gt;render-svg.sh&lt;/code&gt; and an SVG is generated — no browser required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Trade-offs
&lt;/h2&gt;

&lt;p&gt;Practicality comes first. Here are the deliberate trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SVG only&lt;/strong&gt;: No PNG/PDF support. Eliminating native dependencies (&lt;code&gt;canvas&lt;/code&gt; / &lt;code&gt;sharp&lt;/code&gt;) means zero setup friction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static output only&lt;/strong&gt;: Vega-Lite's interactive features (hover, zoom, selection) don't carry over to SVG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No font embedding&lt;/strong&gt;: Relies on system fonts. &lt;code&gt;sans-serif&lt;/code&gt; is the safest choice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No canvas package&lt;/strong&gt;: Text bounding box calculations are approximate, which may cause slight misalignment with long CJK (e.g., Japanese) labels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are intentional. The top priority is "works immediately in any environment, with no extra installation."&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For Claude Code&lt;/span&gt;
gh skill &lt;span class="nb"&gt;install &lt;/span&gt;oubakiou/skills dataviz-svg &lt;span class="nt"&gt;--agent&lt;/span&gt; claude-code &lt;span class="nt"&gt;--scope&lt;/span&gt; project

&lt;span class="c"&gt;# For Codex&lt;/span&gt;
gh skill &lt;span class="nb"&gt;install &lt;/span&gt;oubakiou/skills dataviz-svg &lt;span class="nt"&gt;--agent&lt;/span&gt; codex &lt;span class="nt"&gt;--scope&lt;/span&gt; project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only prerequisite is Node.js 18 or later. Vega and Vega-Lite are bundled, so no separate installation is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;dataviz-svg is laser-focused on one thing: giving AI agents the ability to create data visualizations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generates statistical charts that Mermaid can't handle, powered by Vega-Lite&lt;/li&gt;
&lt;li&gt;No browser, no extra dependencies — just Node.js&lt;/li&gt;
&lt;li&gt;The agent handles the entire pipeline: spec creation, rendering, and document embedding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"Turn this data into a chart." — With that single request, the agent picks the right chart type, generates it, and embeds it in your document. Naturally integrating data visualization into the AI agent workflow — that's what dataviz-svg is for.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>datascience</category>
      <category>llm</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Your LLM reads the whole file. It doesn't have to.</title>
      <dc:creator>oubakiou</dc:creator>
      <pubDate>Fri, 19 Jun 2026 12:05:00 +0000</pubDate>
      <link>https://dev.to/kiou_ouba_afbd120335456f3/your-llm-reads-the-whole-file-it-doesnt-have-to-hem</link>
      <guid>https://dev.to/kiou_ouba_afbd120335456f3/your-llm-reads-the-whole-file-it-doesnt-have-to-hem</guid>
      <description>&lt;p&gt;Coding agents read specs, design docs, and long READMEs every day. Most of the time, they only need a few sections. Yet they load the entire file into context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden cost of "just read the file"
&lt;/h2&gt;

&lt;p&gt;Here's a scenario that plays out constantly. You ask your agent to check the error handling section of a 5,000-line API spec. The agent opens the file, reads all 5,000 lines into its context window, finds the 80 lines it needs, and answers your question.&lt;/p&gt;

&lt;p&gt;The result is correct. But the agent also consumed a large number of tokens on the 4,920 lines it didn't need. Repeat this for every file read in a session, and the waste compounds fast.&lt;/p&gt;

&lt;p&gt;The cost isn't just tokens. A context window stuffed with irrelevant content makes the agent's answers worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  What humans do differently
&lt;/h2&gt;

&lt;p&gt;When a human picks up a 300-page technical book, they don't read cover to cover to find the chapter on authentication. They flip to the table of contents, scan the chapter titles, and jump to page 47. LLMs can do the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markdown is already structured
&lt;/h2&gt;

&lt;p&gt;Markdown documents have a built-in structure: headings. A &lt;code&gt;# Title&lt;/code&gt; followed by &lt;code&gt;## Section A&lt;/code&gt; followed by &lt;code&gt;### Subsection A.1&lt;/code&gt; creates a hierarchy that mirrors a book's table of contents.&lt;/p&gt;

&lt;p&gt;Split a Markdown file at heading boundaries, and you get a natural "table of contents + sections" structure. Each heading starts a new section, the heading text becomes the index entry, and the section number becomes the address.&lt;/p&gt;

&lt;p&gt;This is the idea behind &lt;a href="https://github.com/oubakiou/md2idx" rel="noopener noreferrer"&gt;md2idx&lt;/a&gt;, a CLI tool.&lt;/p&gt;

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

&lt;p&gt;md2idx converts a Markdown file into JSON with two fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;index&lt;/code&gt;&lt;/strong&gt;: a numbered table of contents where each line is &lt;code&gt;&amp;lt;# markers for depth&amp;gt; &amp;lt;serial&amp;gt;. &amp;lt;heading text&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sections&lt;/code&gt;&lt;/strong&gt;: a flat array of raw Markdown strings, one per heading
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx md2idx spec.md | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.index'&lt;/span&gt;
&lt;span class="c"&gt;# 0. API Specification&lt;/span&gt;
&lt;span class="c"&gt;## 1. Authentication&lt;/span&gt;
&lt;span class="c"&gt;## 2. Endpoints&lt;/span&gt;
&lt;span class="c"&gt;### 3. GET /users&lt;/span&gt;
&lt;span class="c"&gt;### 4. POST /users&lt;/span&gt;
&lt;span class="c"&gt;## 5. Error Handling&lt;/span&gt;
&lt;span class="c"&gt;## 6. Rate Limiting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The serial numbers match the array indices. To read the Error Handling section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx md2idx spec.md | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.sections[5]'&lt;/span&gt;
&lt;span class="c"&gt;## Error Handling&lt;/span&gt;

When a request fails, the API returns a JSON error object with...
&lt;span class="o"&gt;(&lt;/span&gt;just the content of that one section&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To read a heading and all its children together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx md2idx spec.md | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.sections[2:5][]'&lt;/span&gt;
&lt;span class="c"&gt;# Endpoints, GET /users, and POST /users — all 3 sections&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a 5,000-line spec where the agent needs 2 sections, context usage goes from ~5,000 lines to ~100 lines (20-line index + 80 lines of content). Depending on the document and which sections are needed, the reduction is typically 80–98%.&lt;/p&gt;

&lt;p&gt;The output is designed to work with &lt;code&gt;jq&lt;/code&gt;. One-line JSON by default (pipe-friendly), &lt;code&gt;--pretty&lt;/code&gt; for formatted output. Reads from a file argument or stdin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just grep for headings?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;grep -nE '#{1,6} ' spec.md&lt;/code&gt; gives you a list of headings. For simple cases, that works. But md2idx covers problems that grep can't solve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Section body retrieval&lt;/strong&gt;: grep only returns heading lines. To get the body, you need to calculate the line range and use Read with offset/limit. With md2idx, &lt;code&gt;jq '.sections[N]'&lt;/code&gt; is all it takes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setext headings&lt;/strong&gt; (&lt;code&gt;===&lt;/code&gt; / &lt;code&gt;---&lt;/code&gt;): invisible to grep's &lt;code&gt;#&lt;/code&gt; pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;#&lt;/code&gt; inside code fences&lt;/strong&gt;: grep returns false positives. md2idx skips fenced blocks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline markup&lt;/strong&gt;: grep includes &lt;code&gt;[link](url)&lt;/code&gt; etc. as-is. md2idx strips markup in the index while preserving it in section content&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automate with a Claude Code skill
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mkdn.review/?url=https%3A%2F%2Fgithub.com%2Foubakiou%2Fmd2idx%2Fblob%2Fmain%2Fskills%2Fmd2idx-read%2FSKILL.md#p:introduction" rel="noopener noreferrer"&gt;Skill details (SKILL.md)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the &lt;code&gt;md2idx-read&lt;/code&gt; skill, the agent autonomously handles everything from fetching the index to selecting sections.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent checks the file size and, if large, calls md2idx to fetch the index&lt;/li&gt;
&lt;li&gt;It reads the index and identifies which sections are relevant to the current task&lt;/li&gt;
&lt;li&gt;It retrieves only those sections via &lt;code&gt;jq&lt;/code&gt; slicing&lt;/li&gt;
&lt;li&gt;If more sections are needed, it goes back to step 3 (the index is already in context)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# install the skill&lt;/span&gt;
gh skill &lt;span class="nb"&gt;install &lt;/span&gt;oubakiou/md2idx md2idx-read &lt;span class="nt"&gt;--agent&lt;/span&gt; claude-code &lt;span class="nt"&gt;--scope&lt;/span&gt; project

&lt;span class="c"&gt;# or with npx&lt;/span&gt;
npx skills add oubakiou/md2idx &lt;span class="nt"&gt;--skill&lt;/span&gt; md2idx-read &lt;span class="nt"&gt;--agent&lt;/span&gt; claude-code &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, the agent uses the skill proactively whenever it encounters a large Markdown file. No manual invocation needed — it reads the index first, picks sections, and skips the rest.&lt;/p&gt;

&lt;p&gt;A fallback is included. If md2idx isn't available (network-restricted environments, permission issues), it falls back to &lt;code&gt;grep&lt;/code&gt; for headings and Read tool with offset/limit. Less accurate, but functional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it now
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# read the index of any Markdown file&lt;/span&gt;
npx md2idx README.md | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.index'&lt;/span&gt;

&lt;span class="c"&gt;# grab a specific section by number&lt;/span&gt;
npx md2idx README.md | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.sections[2]'&lt;/span&gt;

&lt;span class="c"&gt;# search within a section&lt;/span&gt;
npx md2idx data.md | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.sections[4]'&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;Tokyo

&lt;span class="c"&gt;# global install&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; md2idx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;md2idx has zero external dependencies — a self-contained line scanner, not a Markdown AST parser. It handles ATX headings (&lt;code&gt;#&lt;/code&gt; style), setext headings (&lt;code&gt;===&lt;/code&gt; / &lt;code&gt;---&lt;/code&gt; underlines), code fence skipping, and inline markup stripping.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;md2idx&lt;/strong&gt; is MIT-licensed and fully open source. If your LLM agents are reading entire large Markdown files, give it a try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/oubakiou/md2idx" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub repo →&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/md2idx" rel="noopener noreferrer"&gt;&lt;strong&gt;npm →&lt;/strong&gt;&lt;/a&gt; &lt;code&gt;npx md2idx your-file.md | jq -r '.index'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/oubakiou/md2idx/blob/main/skills/md2idx-read/SKILL.md" rel="noopener noreferrer"&gt;&lt;strong&gt;Claude Code skill →&lt;/strong&gt;&lt;/a&gt; &lt;code&gt;gh skill install oubakiou/md2idx md2idx-read&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've tried it in your agent workflow, I'd love to hear how it went — drop a comment below or &lt;a href="https://github.com/oubakiou/md2idx/issues" rel="noopener noreferrer"&gt;open an issue on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>markdown</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The next bottleneck after AI writes your code is reviewing the docs it writes</title>
      <dc:creator>oubakiou</dc:creator>
      <pubDate>Wed, 17 Jun 2026 03:43:15 +0000</pubDate>
      <link>https://dev.to/kiou_ouba_afbd120335456f3/the-next-bottleneck-after-ai-writes-your-code-is-reviewing-the-docs-it-writes-3pc7</link>
      <guid>https://dev.to/kiou_ouba_afbd120335456f3/the-next-bottleneck-after-ai-writes-your-code-is-reviewing-the-docs-it-writes-3pc7</guid>
      <description>&lt;p&gt;Coding agents draft specs, architecture docs, changelogs, and README updates in seconds — but a human still has to judge the quality of all that output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottleneck shift
&lt;/h2&gt;

&lt;p&gt;A year ago, the typical workflow was: you write a spec, you get comments, you revise, then you implement and get code review. Humans did most of the writing and coding. Now, agents produce first drafts of design docs, API references, runbooks, and onboarding guides — and they do it in seconds.&lt;/p&gt;

&lt;p&gt;Code implementation and code review can now be handled by agents, so those are no longer the bottleneck. What surfaced instead is the step right before: document review. A human has to read 2,000 lines of generated markdown and decide what's wrong. The writing part got dramatically faster. LLMs can assist with document review too, but compared to code implementation and code review, the human judgment required is still larger.&lt;/p&gt;

&lt;p&gt;This asymmetry compounds fast. Every agent-assisted project now has a stack of "needs human review" documents growing in a shared folder. If you're running multiple agent loops in parallel — one for the spec, one for the implementation plan, one for the test strategy — review becomes a pipeline stall. GitHub PRs remain the right tool when you need third-party review. But the step before that — the fast local self-review loop where you and your agent iterate on a draft — doesn't belong in a PR. Branching, diffing, and assigning reviewers is a lot of process for a first draft the agent wrote in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why prose feedback is lossy
&lt;/h2&gt;

&lt;p&gt;The most common workaround today is to have the agent read the document and then fix things based on natural-language feedback:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The error handling in section 3.2 is too vague — be specific about what happens on timeout."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This looks reasonable. The agent reads it, searches for something about error handling, and makes a change. But several things go wrong:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Position is ambiguous.&lt;/strong&gt; If section 3.2 has three paragraphs about error handling, which one did the reviewer mean? The agent guesses, and sometimes guesses wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context is lost.&lt;/strong&gt; The reviewer was looking at a &lt;em&gt;rendered&lt;/em&gt; document — they saw the Mermaid diagram, the table layout, the code blocks with syntax highlighting. The prose feedback carries none of that visual context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round-trips are vague.&lt;/strong&gt; The agent applies a fix. Did it address the right spot? The reviewer pastes the updated draft back into the chat. No diff. No anchoring. Another round of guessing.&lt;/p&gt;

&lt;p&gt;The fundamental problem: prose feedback loses the structure the reviewer had in mind. The reviewer knows which text range they're commenting on — but that spatial information is discarded the moment they express it in natural language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback as a machine-readable artifact
&lt;/h2&gt;

&lt;p&gt;What if the reviewer's comments came back as structured JSON, with every comment anchored to a precise location in the source markdown?&lt;/p&gt;

&lt;p&gt;That's what &lt;a href="https://github.com/oubakiou/mdxg-redline" rel="noopener noreferrer"&gt;MDXG Redline&lt;/a&gt; (&lt;a href="https://mkdn.review/?url=https%3A%2F%2Fraw.githubusercontent.com%2Foubakiou%2Fmdxg-redline%2Frefs%2Fheads%2Fmain%2FREADME.md" rel="noopener noreferrer"&gt;online demo&lt;/a&gt;) produces. The reviewer selects any text range in a rendered markdown document, leaves an inline comment, and on export the tool writes a JSON file like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"document"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api-spec.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"docHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4e5f6a7b8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exportedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-15T10:30:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"comments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f3a1c8b2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The service retries up to 3 times"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"comment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Specify the backoff strategy — is it exponential? Fixed interval? This matters for downstream timeout config."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headingPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"## 3. Error Handling"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"### 3.2 Retry Policy"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sourceLine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;142&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-15T10:28:11.000Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every comment carries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;quote&lt;/code&gt;&lt;/strong&gt; — the exact text the reviewer selected (human-readable reference)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;comment&lt;/code&gt;&lt;/strong&gt; — what the reviewer wrote&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;headingPath&lt;/code&gt;&lt;/strong&gt; — the heading ancestry, from shallowest to deepest (&lt;code&gt;["## 3. Error Handling", "### 3.2 Retry Policy"]&lt;/code&gt;), so the agent can navigate the document hierarchy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sourceLine&lt;/code&gt;&lt;/strong&gt; — the 1-origin line number in the source markdown, so the agent can jump straight to the right spot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(The actual export also includes &lt;code&gt;blockId&lt;/code&gt;, &lt;code&gt;startOffset&lt;/code&gt;, and &lt;code&gt;endOffset&lt;/code&gt; — internal anchoring fields used for round-trip re-import into the next review round. The four fields above are the ones your agent needs.)&lt;/p&gt;

&lt;p&gt;No guessing, no ambiguity. The agent reads the JSON, opens the source file, goes to line 142, and applies the feedback directly. The feedback JSON is a plain file on disk — any agent that can read JSON and edit files can consume it, regardless of framework or provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop in practice
&lt;/h2&gt;

&lt;p&gt;MDXG Redline is designed around a review loop where an agent and a human pass a document back and forth:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxafgo4ftmon3bjqnlzv0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxafgo4ftmon3bjqnlzv0.png" alt=" " width="679" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent uses the CLI to generate a &lt;code&gt;&amp;lt;name&amp;gt;-&amp;lt;hash&amp;gt;-review.html&lt;/code&gt; file from the markdown — a self-contained HTML file that renders the document with syntax highlighting, diagrams, and math.&lt;/li&gt;
&lt;li&gt;The CLI auto-launches the reviewer's browser.&lt;/li&gt;
&lt;li&gt;The reviewer reads the rendered document, selects text ranges, and leaves inline comments. One click writes &lt;code&gt;&amp;lt;name&amp;gt;-&amp;lt;hash&amp;gt;-feedback.json&lt;/code&gt; to the same folder.&lt;/li&gt;
&lt;li&gt;The agent monitors in the background, automatically picks up the JSON, and applies the feedback.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ks61u4lkftihldsi8f4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ks61u4lkftihldsi8f4.png" alt=" " width="697" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each revision gets a unique hash in the filename, so review/feedback pairs for different revisions never collide.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzswc4ffd82iuq3kbvqfx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzswc4ffd82iuq3kbvqfx.png" alt=" " width="332" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Claude Code and Codex users, there's a &lt;code&gt;md-review&lt;/code&gt; skill that automates the entire loop — HTML generation, waiting for feedback, and applying revisions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mkdn.review/?url=https%3A%2F%2Fgithub.com%2Foubakiou%2Fmdxg-redline%2Fblob%2Fmain%2Fskills%2Fmd-review%2FSKILL.md" rel="noopener noreferrer"&gt;SKILL.md&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# install the skill&lt;/span&gt;
gh skill &lt;span class="nb"&gt;install &lt;/span&gt;oubakiou/mdxg-redline md-review &lt;span class="nt"&gt;--agent&lt;/span&gt; claude-code &lt;span class="nt"&gt;--scope&lt;/span&gt; project

&lt;span class="c"&gt;# then just tell the agent:&lt;/span&gt;
&lt;span class="c"&gt;# "please request a review for spec.md"&lt;/span&gt;
&lt;span class="c"&gt;# or invoke the slash command directly:&lt;/span&gt;
&lt;span class="c"&gt;# /md-review README.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill is a convenience wrapper. Since the feedback JSON is a plain file, the loop works with any agent — you can wire it into a custom LangChain pipeline or a simple shell script that polls for the JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it renders
&lt;/h2&gt;

&lt;p&gt;MDXG Redline isn't just a review overlay — it's a markdown rendering engine packed into a single standalone HTML file with no backend and no dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smartphone support&lt;/strong&gt; — On mobile screens, the UI switches to a layout with a footer bar for TOC, Comments, and Search. You can review and comment from your phone — no need to wait until you're back at your desk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax highlighting for ~235 languages&lt;/strong&gt; — The CLI auto-detects which languages your document uses and injects only those Shiki grammars, keeping the file lean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mermaid diagrams and KaTeX math&lt;/strong&gt; — Fenced &lt;code&gt;&lt;/code&gt;`&lt;code&gt;mermaid&lt;/code&gt; blocks render as SVGs; &lt;code&gt;$...$&lt;/code&gt; / &lt;code&gt;$$...$$&lt;/code&gt; math renders via KaTeX. Both are auto-detected and injected only when present.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Word-style stacked pages&lt;/strong&gt; — The document splits at H1/H2 boundaries into paper-like sheets you scroll through vertically, with a sidebar for navigation. Footnotes and left-hand keyboard navigation are also built in.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://github.com/oubakiou/mdxg-redline#features" rel="noopener noreferrer"&gt;full feature list in the README&lt;/a&gt; for details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in 30 seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No install needed&lt;/strong&gt; — open &lt;a href="https://mkdn.review/" rel="noopener noreferrer"&gt;mkdn.review&lt;/a&gt; and load any public GitHub raw URL. Here's a one-click example that loads the project's own README:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mkdn.review/?url=https%3A%2F%2Fraw.githubusercontent.com%2Foubakiou%2Fmdxg-redline%2Frefs%2Fheads%2Fmain%2FREADME.md" rel="noopener noreferrer"&gt;&lt;strong&gt;Open this README on mkdn.review →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select any text in the rendered document, leave a comment, and click "Copy as JSON" to see the structured output.&lt;/p&gt;

&lt;p&gt;Want to try with your own project? Just replace the URL: &lt;code&gt;mkdn.review/?url=&amp;lt;your-github-raw-url&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local review&lt;/strong&gt; — if you have Node.js:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx mdxg-redline your-draft.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This generates a review HTML in the same directory and opens it in your browser. The generated file is fully self-contained — you can email it, drop it in Slack, or put it in a shared folder. Everything stays local; no content or comments are sent anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy note&lt;/strong&gt;: The standalone and CLI builds enforce &lt;code&gt;connect-src 'none'&lt;/code&gt; via CSP — your document body and comments &lt;em&gt;cannot&lt;/em&gt; leave the browser. The online version (&lt;code&gt;mkdn.review&lt;/code&gt;) likewise never sends your content or comments anywhere — the only network request is the &lt;code&gt;?url=&lt;/code&gt; fetch, which retrieves public raw content from a short allowlist (GitHub raw, Gist raw).&lt;/p&gt;

&lt;h2&gt;
  
  
  It's an MDXG implementation
&lt;/h2&gt;

&lt;p&gt;MDXG Redline is a third-party implementation of the &lt;a href="https://github.com/vercel-labs/mdxg" rel="noopener noreferrer"&gt;Markdown Experience Guidelines (MDXG)&lt;/a&gt; by Vercel Labs — the read-only Viewer rendering profile, with a review layer (inline commenting + structured JSON export) added on top. See the &lt;a href="https://github.com/oubakiou/mdxg-redline#mdxg-compliance-status" rel="noopener noreferrer"&gt;compliance table&lt;/a&gt; for details.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;MDXG Redline&lt;/strong&gt; is MIT-licensed and fully open source. If reviewing agent-generated documents is a bottleneck in your workflow, give it a try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mkdn.review/" rel="noopener noreferrer"&gt;&lt;strong&gt;Try the online viewer →&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oubakiou/mdxg-redline" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub repo →&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/mdxg-redline" rel="noopener noreferrer"&gt;&lt;strong&gt;npm →&lt;/strong&gt;&lt;/a&gt; &lt;code&gt;npx mdxg-redline draft.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code skill →&lt;/strong&gt; &lt;code&gt;gh skill install oubakiou/mdxg-redline md-review&lt;/code&gt; (&lt;a href="https://github.com/oubakiou/mdxg-redline#when-an-llm-invokes-the-cli-via-a-skill" rel="noopener noreferrer"&gt;usage details&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've tried it with your agent workflow, I'd love to hear how the structured JSON feedback format worked for you — drop a comment below or &lt;a href="https://github.com/oubakiou/mdxg-redline/issues" rel="noopener noreferrer"&gt;open an issue on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>markdown</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
