<?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: Furkan Boran</title>
    <description>The latest articles on DEV Community by Furkan Boran (@boranfurkan).</description>
    <link>https://dev.to/boranfurkan</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%2F4223128%2F2dabf99e-489f-43d4-8030-652aae96a3f9.png</url>
      <title>DEV Community: Furkan Boran</title>
      <link>https://dev.to/boranfurkan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/boranfurkan"/>
    <language>en</language>
    <item>
      <title>I benchmarked my own agent skill, and today's Claude barely needed it</title>
      <dc:creator>Furkan Boran</dc:creator>
      <pubDate>Mon, 02 Nov 2026 21:49:52 +0000</pubDate>
      <link>https://dev.to/boranfurkan/i-benchmarked-my-own-agent-skill-and-todays-claude-barely-needed-it-3hfc</link>
      <guid>https://dev.to/boranfurkan/i-benchmarked-my-own-agent-skill-and-todays-claude-barely-needed-it-3hfc</guid>
      <description>&lt;p&gt;I wanted to write an agent skill that makes coding agents better at data analysis. The kind of mistakes I had in&lt;br&gt;
mind are the ones that produce a confident, wrong number: a "Total" row summed together with the countries, a join&lt;br&gt;
that duplicates orders, averaged p99s, timed-out requests that vanish from the latency percentiles, an A/B test that&lt;br&gt;
was supposed to split 50/50 and came back 50.7/49.3.&lt;/p&gt;

&lt;p&gt;Every rule in the skill comes from a paper or official documentation. But before claiming it helps, I wanted to&lt;br&gt;
measure it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmark
&lt;/h2&gt;

&lt;p&gt;I built 30 realistic cases, each with one planted trap and a correct answer computed by code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;19 data-analysis traps (subtotal rows, join fan-out, average of averages, &lt;code&gt;NA&lt;/code&gt; parsed as null when it's Namibia,
partial weeks, sample ratio mismatch, segment fishing, Simpson's paradox, …)&lt;/li&gt;
&lt;li&gt;8 performance and reliability traps (closed-loop load tests, a saturated load generator, retries counted as
requests, tail-sampled traces, regression to the mean after a "perf sprint", …)&lt;/li&gt;
&lt;li&gt;3 tasks where the agent measures its own work (fix a flaky test and confirm it, report a speedup, measure
logging overhead)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each case ran with and without the skill on Claude Haiku 5.5 and Sonnet 5.5, graded by an LLM judge (Sonnet,&lt;br&gt;
3 votes per grader).&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;With skill&lt;/th&gt;
&lt;th&gt;Without skill&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Haiku 5.5&lt;/td&gt;
&lt;td&gt;61/61&lt;/td&gt;
&lt;td&gt;58/61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5.5&lt;/td&gt;
&lt;td&gt;61/61&lt;/td&gt;
&lt;td&gt;60/61&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Today's Claude models already avoid nearly all of these traps, including the harder performance ones. The skill&lt;br&gt;
fixed every baseline miss (&lt;code&gt;-1&lt;/code&gt; timeout sentinels, which both models missed, plus a closed-loop load test hiding a&lt;br&gt;
stall and an overhead number reported without uncertainty on Haiku) and introduced no new failures. But with one&lt;br&gt;
run per arm, that's "catches occasional slips", not a large effect. That's what the README says.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Skills help most where the model's knowledge is weakest.&lt;/strong&gt; The same week I wrote a skill for upgrading to&lt;br&gt;
TypeScript 7, which shipped after the models' training cutoff. There the gains were real: graders passed went from&lt;br&gt;
10/18 to 17/18 on Sonnet and 7/18 to 15/18 on Haiku, on small samples with offline agents. Mainstream analysis&lt;br&gt;
practice is already in the model. Post-cutoff releases and exact operational details are not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Check your test cases before you trust a baseline failure.&lt;/strong&gt; Across both projects, several of the&lt;br&gt;
"failures" I first saw were flaws in my own cases: an effect I hadn't intended in the data generator, a grader&lt;br&gt;
that was too strict, a premise that contradicted itself. Once, Haiku correctly pointed out that a case's premise&lt;br&gt;
was wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A skill that doesn't activate doesn't help.&lt;/strong&gt; In the benchmark the skill activated by itself in 22/30 Haiku&lt;br&gt;
runs. Its description listed data types and trap names. The prompts it missed asked for an &lt;em&gt;action&lt;/em&gt;: "should we&lt;br&gt;
roll back?", "confirm it's fixed", "measure the overhead". I rewrote the description to say &lt;em&gt;when&lt;/em&gt; to load it ("at&lt;br&gt;
the start of any task whose answer will include a number … before reading files, running benchmarks or editing&lt;br&gt;
code"). In a short trigger test on Haiku (first 3 turns, 2 rounds), activation on 10 queries the description&lt;br&gt;
was never tuned on went from 7/20 to 20/20, with no activations on 10 unrelated queries.&lt;/p&gt;

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

&lt;p&gt;The benchmark runs against any agent, with or without the skill. If you run it on another model or agent, I'd&lt;br&gt;
like to see the results: &lt;a href="https://github.com/boranfurkan/trustworthy-data-analysis" rel="noopener noreferrer"&gt;https://github.com/boranfurkan/trustworthy-data-analysis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>datascience</category>
      <category>showdev</category>
    </item>
    <item>
      <title>TypeScript 7 upgrade: the two silent default changes and the missing compiler API</title>
      <dc:creator>Furkan Boran</dc:creator>
      <pubDate>Mon, 02 Nov 2026 21:48:10 +0000</pubDate>
      <link>https://dev.to/boranfurkan/typescript-7-upgrade-the-two-silent-default-changes-and-the-missing-compiler-api-hie</link>
      <guid>https://dev.to/boranfurkan/typescript-7-upgrade-the-two-silent-default-changes-and-the-missing-compiler-api-hie</guid>
      <description>&lt;p&gt;TypeScript 7.0 shipped in July: the Go-native compiler, about 10x faster type-checking, still installed as&lt;br&gt;
&lt;code&gt;typescript&lt;/code&gt; and still run as &lt;code&gt;tsc&lt;/code&gt;. Most of its breaking changes were announced as deprecations in 6.0, so the&lt;br&gt;
upgrade looks easy. Three things catch people anyway.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. &lt;code&gt;types&lt;/code&gt; now defaults to &lt;code&gt;[]&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Before 6.0, TypeScript loaded every &lt;code&gt;@types/*&lt;/code&gt; package in &lt;code&gt;node_modules&lt;/code&gt;. Now it loads none unless you list them.&lt;br&gt;
The symptom:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error TS2580: Cannot find name 'process'.
error TS2582: Cannot find name 'describe'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;even though &lt;code&gt;@types/node&lt;/code&gt; and &lt;code&gt;@types/jest&lt;/code&gt; are installed. The fix is to list them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="nl"&gt;"compilerOptions"&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;"types"&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;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&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;If you'd rather keep the old behaviour, &lt;code&gt;"types": ["*"]&lt;/code&gt; brings it back. Listing them is better: test globals&lt;br&gt;
like &lt;code&gt;describe&lt;/code&gt; belong in the test tsconfig, not the one that builds your app.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. &lt;code&gt;rootDir&lt;/code&gt; now defaults to the tsconfig's directory
&lt;/h2&gt;

&lt;p&gt;It used to be inferred as the common directory of your input files, usually &lt;code&gt;src/&lt;/code&gt;. Now it's the directory that&lt;br&gt;
contains &lt;code&gt;tsconfig.json&lt;/code&gt;. If your tsconfig sits at the project root, &lt;code&gt;src/server.ts&lt;/code&gt; is emitted to&lt;br&gt;
&lt;code&gt;dist/src/server.js&lt;/code&gt;, and &lt;code&gt;node dist/server.js&lt;/code&gt; or your &lt;code&gt;"main"&lt;/code&gt; field breaks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="nl"&gt;"compilerOptions"&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;"rootDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./src"&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;If a test config extends this one and includes &lt;code&gt;test/&lt;/code&gt;, it needs its own &lt;code&gt;rootDir&lt;/code&gt; (for example &lt;code&gt;"."&lt;/code&gt;), or the test&lt;br&gt;
files fall outside &lt;code&gt;rootDir&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. 7.0 ships without a compiler API
&lt;/h2&gt;

&lt;p&gt;This is the big one. The 7.0 release notes say it plainly: 7.0 does not ship with an API. A new, different API is&lt;br&gt;
planned for 7.1. Anything that loads &lt;code&gt;typescript&lt;/code&gt; as a library can't run on 7.0: typescript-eslint (type-aware&lt;br&gt;
rules), vue-tsc and other Volar-based tools, ts-jest, ts-node, ts-patch transformers, and your own scripts that call&lt;br&gt;
&lt;code&gt;ts.createProgram&lt;/code&gt;. As of early November typescript-eslint still doesn't support TS 7.&lt;/p&gt;

&lt;p&gt;You don't have to choose. The TypeScript team publishes &lt;code&gt;@typescript/typescript6&lt;/code&gt;, which re-exports the 6.0 API&lt;br&gt;
and installs a &lt;code&gt;tsc6&lt;/code&gt; binary. Alias it as &lt;code&gt;typescript&lt;/code&gt; so library consumers keep getting 6.0, and install 7.0 under&lt;br&gt;
another name for the fast &lt;code&gt;tsc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&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;"devDependencies"&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;"typescript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm:@typescript/typescript6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// what typescript-eslint, vue-tsc, ts-jest import (bin: tsc6)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@typescript/native"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm:typescript@^7.0.2"&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;// the 7.0 compiler (bin: tsc)&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;"scripts"&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;"typecheck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc --noEmit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="c1"&gt;// 7.0&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"typecheck:vue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vue-tsc --noEmit"&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c1"&gt;// still 6.0 via the alias&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;Be explicit about which command runs on which version. In a Vue project, for example, the slow check is usually&lt;br&gt;
&lt;code&gt;vue-tsc&lt;/code&gt;, which stays on 6.0, so the 10x speedup may not show up where you expected it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard errors (quick list)
&lt;/h2&gt;

&lt;p&gt;Deprecated in 6.0, errors in 7.0, and &lt;code&gt;"ignoreDeprecations": "6.0"&lt;/code&gt; won't save you:&lt;br&gt;
&lt;code&gt;target: es5&lt;/code&gt;, &lt;code&gt;downlevelIteration&lt;/code&gt;, &lt;code&gt;moduleResolution: node&lt;/code&gt;/&lt;code&gt;node10&lt;/code&gt;/&lt;code&gt;classic&lt;/code&gt;, &lt;code&gt;baseUrl&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;esModuleInterop: false&lt;/code&gt;, &lt;code&gt;allowSyntheticDefaultImports: false&lt;/code&gt;, &lt;code&gt;alwaysStrict: false&lt;/code&gt;, &lt;code&gt;outFile&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;module: amd&lt;/code&gt;/&lt;code&gt;umd&lt;/code&gt;/&lt;code&gt;system&lt;/code&gt;/&lt;code&gt;none&lt;/code&gt;, the &lt;code&gt;module&lt;/code&gt; keyword for namespaces, and import &lt;code&gt;asserts&lt;/code&gt; (use &lt;code&gt;with&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  The safe order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Upgrade to 6.0 first. Turn on &lt;code&gt;"stableTypeOrdering": true&lt;/code&gt;, remove &lt;code&gt;ignoreDeprecations&lt;/code&gt;, fix everything. Code
that compiles cleanly there should compile the same on 7.0. (The flag can slow 6.0 by about 25%; it's a
diagnostic step, not a permanent setting.)&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;rootDir&lt;/code&gt; and &lt;code&gt;types&lt;/code&gt; explicitly.&lt;/li&gt;
&lt;li&gt;Move to 7.0, keeping API-dependent tools on 6.0 with the alias.&lt;/li&gt;
&lt;li&gt;On small CI runners, &lt;code&gt;--checkers &amp;lt;n&amp;gt;&lt;/code&gt; (default 4) limits the parallel type-checkers.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why I wrote this down
&lt;/h2&gt;

&lt;p&gt;TypeScript 7 shipped after the training cutoff of today's coding agents. In my tests, Claude knew the general&lt;br&gt;
direction but hedged or guessed on these details, especially the &lt;code&gt;@typescript/typescript6&lt;/code&gt; setup. So I packaged&lt;br&gt;
the facts from the official release notes as an agent skill. In small offline evals it raised graders passed from&lt;br&gt;
10/18 to 17/18 on Sonnet and 7/18 to 15/18 on Haiku. Two runs per arm, and agents with web access may find&lt;br&gt;
the facts themselves, so read those numbers as a hint, not a result:&lt;br&gt;
&lt;a href="https://github.com/boranfurkan/typescript-7-migration" rel="noopener noreferrer"&gt;https://github.com/boranfurkan/typescript-7-migration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/" rel="noopener noreferrer"&gt;Announcing TypeScript 7.0&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/" rel="noopener noreferrer"&gt;Announcing TypeScript 6.0&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/typescript-eslint/typescript-eslint/issues/12518" rel="noopener noreferrer"&gt;typescript-eslint #12518&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
    </item>
  </channel>
</rss>
