<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>skilldrop releases</title>
  <subtitle>What each skilldrop release lets you do.</subtitle>
  <id>https://sananthanarayan.github.io/skilldrop/changelog/</id>
  <link rel="self" type="application/atom+xml" href="https://sananthanarayan.github.io/skilldrop/changelog/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/"/>
  <updated>2026-10-27T00:00:00Z</updated>
  <author><name>skilldrop</name><uri>https://github.com/sananthanarayan/skilldrop</uri></author>
  <entry>
    <title>skilldrop 1.2.0</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/1.2.0/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/1.2.0/"/>
    <updated>2026-10-27T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Four skills are retired: &lt;code&gt;md-to-html&lt;/code&gt;, &lt;code&gt;mermaid-render&lt;/code&gt;, &lt;code&gt;marketing-flyer&lt;/code&gt; and &lt;code&gt;deck-builder&lt;/code&gt;.&lt;/strong&gt; On their held-out evals, in each of two trials and with both blind judges, plain Claude Code on Sonnet 5.5 did the job better (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0068-five-skills-that-lost-to-the-plain-agent.md&quot;&gt;RFC-0068&lt;/a&gt;). - &lt;strong&gt;The first three&lt;/strong&gt; add no rule the plain agent breaks. It wrote the better web page in every run, fixed the same diagrams and ran the Mermaid CLI itself, and built the whole flyer with placeholders where the skill stopped. - &lt;strong&gt;&lt;code&gt;deck-builder&lt;/code&gt; was rebuilt around its rules first,&lt;/strong&gt; and measured on fresh evals with its script able to run. The plain agent&amp;#x27;s decks were still preferred, and met more checks (81% against 69%). - &lt;strong&gt;If you installed one, it keeps working.&lt;/strong&gt; &lt;code&gt;skilldrop outdated&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt; and &lt;code&gt;doctor&lt;/code&gt; now name it, with the reason and the uninstall command, and remove nothing. For &lt;code&gt;deck-builder&lt;/code&gt; they suggest &lt;code&gt;md-to-pptx&lt;/code&gt;. - &lt;strong&gt;To install one anyway,&lt;/strong&gt; pin the last commit that had it: &lt;code&gt;npx skilldrop-cli install &amp;lt;skill&amp;gt; --from https://github.com/sananthanarayan/skilldrop#43317a11eda9280e803e7224e9d1878211ee84f2&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The design pack captures your brand and outlines your deck.&lt;/strong&gt; Turn the outline into an on-brand &lt;code&gt;.pptx&lt;/code&gt; with &lt;code&gt;md-to-pptx&lt;/code&gt; from the converters pack, which reads the same &lt;code&gt;brand.json&lt;/code&gt;. The converters pack covers Word, Excel, PowerPoint and Confluence. To show a Mermaid diagram as a picture, the converters now say to render it with the Mermaid CLI (&lt;code&gt;npx -y @mermaid-js/mermaid-cli&lt;/code&gt;) and embed the PNG.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;file-to-markdown&lt;/code&gt; 0.4.0 was rebuilt, and now beats plain Claude Code on fresh evals&lt;/strong&gt; (judges 2 and 3 of 4; 72% of checks against 62%). - &lt;strong&gt;Images:&lt;/strong&gt; it saves embedded images from Word and PowerPoint files beside the Markdown, and links them where they sat. - &lt;strong&gt;Tracked changes:&lt;/strong&gt; they stay pending, as &lt;code&gt;{++added++}&lt;/code&gt; and &lt;code&gt;{--removed--}&lt;/code&gt;, never written as accepted text. - &lt;strong&gt;Contradictions:&lt;/strong&gt; it doesn&amp;#x27;t paste a figure the source contradicts into a table meant for publishing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Benchmark runs now install a skill&amp;#x27;s pip requirements&lt;/strong&gt;, for every arm, as a user would.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 1.1.3</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/1.1.3/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/1.1.3/"/>
    <updated>2026-10-25T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The standard tier now resolves to Sonnet 5.5 in Claude Code&lt;/strong&gt;, the same generation as light (Haiku 5.5) and heavy (Opus 5.5), at the same list price as Sonnet 5. The &lt;code&gt;model-router&lt;/code&gt; agent and the routing table&amp;#x27;s &lt;code&gt;/model&lt;/code&gt; advice pick it up for every skill assigned standard. On the 224 held-out evals Sonnet 5 had met fewer checks than Haiku 5.5, with a skill (78% against 83%) and without one (72% against 80%); Sonnet 5.5 meets 85% and 83%, and costs $0.07 a run with a skill against Sonnet 5&amp;#x27;s $0.13.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The benchmark on Sonnet 5.5 is published, and it does not favour the skills.&lt;/strong&gt; On all 308 held-out evals, two blind judges preferred the skill&amp;#x27;s result in 40% and 43% of pairs; on the 176 that no revision or admission was based on, 32% and 35%. On the older Sonnet 5 those 176 were at even, so the stronger the plain agent, the less the skill is preferred. The account, with all three tiers side by side, is in &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/explanation/what-the-benchmark-showed.html#standard-on-sonnet-55&quot;&gt;What the benchmark showed&lt;/a&gt;; the summary is &lt;code&gt;docs/benchmarks/standard-sonnet-5-5.json&lt;/code&gt;. No skill&amp;#x27;s tier changed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The held-out number now says what is in it.&lt;/strong&gt; &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/explanation/what-the-benchmark-showed.html#where-the-catalogue-stands&quot;&gt;What the benchmark showed&lt;/a&gt; splits the 308 held-out evals into those a skill was revised against afterwards, those a new skill was admitted on, and those nothing was decided on; the home page, the evals page and the README point to it, and the home page names the model the published run used.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 1.1.2</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/1.1.2/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/1.1.2/"/>
    <updated>2026-10-23T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The published benchmark now covers the current catalogue, split by who wrote the eval.&lt;/strong&gt; All 520 evals of the 117 skills ran on the standard tier against plain Claude Code, one trial, two blind judges. Skills meet 73% of their checks against 53% without them, and the judges prefer the skill&amp;#x27;s result in 62% and 61% of pairs. On the 212 evals written by each skill&amp;#x27;s author the preference is 69% and 68%; on the 308 written by someone who never read the skill it is 58% and 56%, with the second judge&amp;#x27;s interval touching even. The &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/&quot;&gt;home page&lt;/a&gt; leads with the held-out number, and the &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/evals/&quot;&gt;evals page&lt;/a&gt; shows both rows and every skill&amp;#x27;s own result. The previous published run was the 0.16.9 catalogue of 18 days earlier, mostly on authors&amp;#x27; evals.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The 21 skills admitted since that run now show their full-run measurement&lt;/strong&gt; on their skill pages instead of the admission result; the admissions list is empty until the next new skill.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/explanation/what-the-benchmark-showed.html&quot;&gt;What the benchmark showed&lt;/a&gt;&lt;/strong&gt; has the new standing: 49 skills above even on their held-out pairs, 36 below, 32 at even, each on two to four pairs.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 1.1.1</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/1.1.1/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/1.1.1/"/>
    <updated>2026-10-22T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Four skills that only just passed admission are stronger, and re-measured on fresh held-out evals&lt;/strong&gt; (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0066-strengthening-four-narrow-passes.md&quot;&gt;RFC-0066&lt;/a&gt;): - &lt;strong&gt;&lt;code&gt;md-to-pptx&lt;/code&gt;&lt;/strong&gt; splits a long section between list items and spreads it evenly over the continued slides, so no slide is left with two stray lines. It warns when an image is a tiny placeholder. It takes an internal note out of a deck you&amp;#x27;re sending outside the team, and never quotes the note in its reply. It met 59% of the judges&amp;#x27; checks, against 22% for plain Claude Code. - &lt;strong&gt;&lt;code&gt;event-contract-draft&lt;/code&gt;&lt;/strong&gt; answers each of your questions first, in its own line. It keeps your event names and fields, and lists every change it makes and why. It never pastes part of the spec. 56% against 31%. - &lt;strong&gt;&lt;code&gt;judge-audit&lt;/code&gt;&lt;/strong&gt; gives the figure it computes when a quoted one doesn&amp;#x27;t reproduce. It notices a judge that never uses one end of the scale, and checks what a score predicts against the outcomes. Every subgroup gets the same sample-size standard. One judge preferred it in all 4 pairs; 73% against 65%. - &lt;strong&gt;&lt;code&gt;bundle-size-review&lt;/code&gt;&lt;/strong&gt; gives each fix as the exact edit to a named file, and changes files only when you ask. A size budget it suggests is real configuration for a tool you have. 56% against 16%.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 1.1.0</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/1.1.0/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/1.1.0/"/>
    <updated>2026-10-22T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;context-graph&lt;/code&gt; now answers &amp;quot;has the code drifted since we decided this, and who changed it?&amp;quot;.&lt;/strong&gt; With &lt;code&gt;--git&lt;/code&gt;, each current decision that governs code lists the commits that changed that code since the decision&amp;#x27;s date, who made them, how many cite the record, and when the record itself was last edited. The skill reads those changes against the record&amp;#x27;s requirements. It reports drift as the requirement, the line, and the commit that broke it, and never as a commit count (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0065-context-graph-drift-and-core.md&quot;&gt;RFC-0065&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;context-graph&lt;/code&gt; is now in the core pack, so every pack installs it.&lt;/strong&gt; Its name, install command and page are unchanged.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The modernize and design loops now read the decisions before they act.&lt;/strong&gt; - &lt;code&gt;modernize&lt;/code&gt; surveys the recorded decisions behind the legacy component and where the code has drifted from them, so a rewrite keeps the constraints someone wrote down. - &lt;code&gt;design&lt;/code&gt; lists the decisions in force before setting targets. After the new ADR is written, it checks that every record it supersedes says so too.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Re-measured on two fresh held-out evals,&lt;/strong&gt; one with real git history: judges preferred it in 3 and 2.5 of 4 pairs, and it met 53% of their checks against 47% for plain Claude Code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Benchmark evals can carry git history.&lt;/strong&gt; A fixture&amp;#x27;s &lt;code&gt;git-history.json&lt;/code&gt; is replayed into a real repository for the run, and the judges see that history too.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 1.0.1</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/1.0.1/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/1.0.1/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;file-to-markdown&lt;/code&gt;&amp;#x27;s Office and Outlook readers are now fuzzed, and 16 bugs are fixed.&lt;/strong&gt; The fuzzer found 10. Reading the parser around them found 6 more, all hangs or memory blow-ups, which a time-limited fuzzer rarely reaches. The .msg reader is a hand-written binary parser, so it now has a valid Outlook message to start from. Each Office format is fuzzed twice: as a whole file, and with only its XML part changing inside a valid package, so the mutations get past the zip checksum. - &lt;strong&gt;Small files could hang it or fill memory.&lt;/strong&gt; A 2.5 KB .msg whose sector chain looped back on itself took 657 MB before it failed; it now stops at the first repeated sector. A spreadsheet with one value at &lt;code&gt;ZZZ999999&lt;/code&gt; built a grid of a million empty rows, and now keeps only the rows and columns that hold a value. A .msg that listed one FAT sector many times, a Word table cell spanning a billion columns, an HTML &lt;code&gt;colspan&lt;/code&gt; the same size, or a list nested 99 million levels deep are now capped at what each format allows. - &lt;strong&gt;Damaged files now fail with a one-line message, not a traceback.&lt;/strong&gt; That covers a corrupt or truncated .docx, .pptx, .xlsx, .msg or .eml, a package with a part marked as encrypted, a Word file with no body, and a cell reference that isn&amp;#x27;t one, which is now skipped. A password-protected Office file is now named as one, with the fix: remove the password and rerun. - &lt;strong&gt;Emails read on more inputs.&lt;/strong&gt; An unknown charset is read as UTF-8, as the HTML reader already did. A raw UTF-8 header keeps its text. A sent time past the year 9999 is left out. On Python 3.9, a date or MIME boundary that won&amp;#x27;t parse no longer stops the conversion. - &lt;strong&gt;The fuzzer also runs the converters both ways.&lt;/strong&gt; Markdown goes to .docx, .xlsx or .pptx and back through &lt;code&gt;file-to-markdown&lt;/code&gt;, so every file one writes must be one the other reads. &lt;code&gt;md-to-confluence&lt;/code&gt; is fuzzed too. All 28 targets then ran 4,000 mutated inputs on Python 3.9 and 3.14 without a crash, and in CI an input that takes over 10 seconds now counts as one (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0062-fuzzing-the-skill-scripts.md&quot;&gt;RFC-0062&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Four smaller fixes:&lt;/strong&gt; - &lt;code&gt;delivery-metrics-report&lt;/code&gt; and &lt;code&gt;team-status-report --plan-file&lt;/code&gt; now fail with a one-line message on a file that isn&amp;#x27;t UTF-8, where they used to show a traceback. - &lt;code&gt;rollout-plan&lt;/code&gt; rejects &lt;code&gt;--max-hours nan&lt;/code&gt; or &lt;code&gt;inf&lt;/code&gt;, which used to print &amp;quot;within nan h&amp;quot;. - &lt;code&gt;hypothesis-comparison&lt;/code&gt; gives an error&amp;#x27;s real line number after a blank line, and rejects a weight of &lt;code&gt;nan&lt;/code&gt; or &lt;code&gt;inf&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 1.0.0</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/1.0.0/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/1.0.0/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;skilldrop is 1.0, and it now says what stays stable.&lt;/strong&gt; From this release, versions follow Semantic Versioning for the CLI, a skill&amp;#x27;s folder and name, its scripts&amp;#x27; documented flags and exit codes, loops, packs and profiles, the GitHub Action and the plugin names. A change that would break one of them waits for 2.0 (&lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/reference/versioning-and-stability.html&quot;&gt;what stays stable&lt;/a&gt;, &lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0064-one-point-oh-stability.md&quot;&gt;RFC-0064&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A skill&amp;#x27;s instructions and output keep improving in any release.&lt;/strong&gt; That&amp;#x27;s what the measurements are for. A skill that stops beating the plain agent is retired with a record naming what to use instead, and your installed copy keeps working.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Deprecations come first,&lt;/strong&gt; in a minor release, with a changelog entry and a CLI warning, and keep working until the next major.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Python 3.9 is now tested in CI.&lt;/strong&gt; It&amp;#x27;s the &lt;code&gt;python3&lt;/code&gt; macOS ships, and the oldest Python the skills&amp;#x27; scripts support.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nothing you use changes in this release.&lt;/strong&gt; 1.0 is the promise, made on 117 skills, 11 loops and 6 reviewer agents, every script unit-tested and the file parsers fuzzed.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.46</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.46/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.46/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;context-graph&lt;/code&gt;, a new skill in &lt;code&gt;solution-architect&lt;/code&gt;, answers &amp;quot;why is it like this?&amp;quot; from your decision records.&lt;/strong&gt; It reads ADRs, RFCs and design records in MADR, Nygard or frontmatter form, and builds the graph between them: what supersedes or amends what, which records cite which, the files and folders each decision governs, and, with &lt;code&gt;--git&lt;/code&gt;, the commits behind each. It checks that graph against the code, and finds: - a supersession only one side records; - a current decision naming code that is gone or has moved; - a decision the code no longer follows; - a guide still teaching a superseded decision; - two current decisions on one path; - a reference to a record that doesn&amp;#x27;t exist. When nothing was written down, it says &amp;quot;no recorded decision&amp;quot; (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0063-context-graph.md&quot;&gt;RFC-0063&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;It was admitted on its third draft.&lt;/strong&gt; Blind judges preferred it to plain Claude Code in 4 and 5 of 8 pairs on new held-out evals, and it met 70% of their checks, against 45% without it.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.45</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.45/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.45/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The scripts that read your files are fuzzed.&lt;/strong&gt; 15 scripts are fuzzed: SQL, Lighthouse and Terraform JSON, brand files, cost and tracker exports, risk registers, event contracts, bundle stats, research matrices and Markdown. Coverage-guided fuzzing with Atheris runs in CI on every change to a script, and for longer every week. The same targets run briefly in the unit tests on every OS (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0062-fuzzing-the-skill-scripts.md&quot;&gt;RFC-0062&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The first runs found 11 more crashes, now fixed.&lt;/strong&gt; Five scripts crashed on a file that isn&amp;#x27;t UTF-8: &lt;code&gt;risk-register&lt;/code&gt;, &lt;code&gt;event-contract-draft&lt;/code&gt;, &lt;code&gt;bundle-size-review&lt;/code&gt;, &lt;code&gt;feedback-synthesis&lt;/code&gt; and &lt;code&gt;hypothesis-comparison&lt;/code&gt;. &lt;code&gt;risk-register&lt;/code&gt; also crashed on a stray carriage return. On Python 3.9, five CSV readers crashed on a NUL byte: &lt;code&gt;cloud-cost-review&lt;/code&gt;, &lt;code&gt;backlog-triage&lt;/code&gt;, &lt;code&gt;team-status-report&lt;/code&gt;, &lt;code&gt;feedback-synthesis&lt;/code&gt; and &lt;code&gt;hypothesis-comparison&lt;/code&gt;. Each now fails with a one-line message, and every target then ran 6,000 mutated inputs on Python 3.9 and 3.14 without a crash.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Atheris&amp;#x27;s first CI run found three more crashes, now fixed.&lt;/strong&gt; - &lt;code&gt;md-to-html&lt;/code&gt; broke on a NUL byte in Markdown, which collided with its own placeholders. It now drops those characters on input. - &lt;code&gt;web-performance-review&lt;/code&gt; broke on a number given as text, and &lt;code&gt;bundle-size-review&lt;/code&gt; on a list where an id belongs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;JSON that parses but has the wrong shape is now one clear error, not a traceback,&lt;/strong&gt; in the six scripts that read JSON: &lt;code&gt;web-performance-review&lt;/code&gt;, &lt;code&gt;bundle-size-review&lt;/code&gt;, &lt;code&gt;terraform-plan-review&lt;/code&gt;, &lt;code&gt;event-contract-draft&lt;/code&gt;, &lt;code&gt;brand-kit&lt;/code&gt; and &lt;code&gt;behaviour-equivalence&lt;/code&gt;. The message says to report it if the file is genuine.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.44</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.44/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.44/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The 60 bugs the unit tests found are fixed, in 35 skills.&lt;/strong&gt; Every known-failure marker is gone, and the tests prove each fix on Linux, macOS and Windows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Wrong results, now right:&lt;/strong&gt; - &lt;code&gt;cloud-cost-review&lt;/code&gt; counts AWS spot instances as compute. They were always $0. - &lt;code&gt;team-status-report --sprint &amp;quot;Sprint 1&amp;quot;&lt;/code&gt; no longer includes Sprint 14. - &lt;code&gt;md-to-confluence&lt;/code&gt; keeps a Markdown hard line break instead of joining two lines into one word. - &lt;code&gt;bundle-size-review&lt;/code&gt; reads &lt;code&gt;safari &amp;gt; 15.3&lt;/code&gt; as 15.4, not 16, so a polyfill Safari still needs isn&amp;#x27;t called unneeded. - &lt;code&gt;ai-usage-report&lt;/code&gt; counts 1–31 May as 31 days. - &lt;code&gt;sql-review&lt;/code&gt; accepts &lt;code&gt;1.0 * count(x)&lt;/code&gt; and a cast denominator, and catches a filter on an unaliased LEFT JOIN table. - &lt;code&gt;risk-register&lt;/code&gt; gives the right line number after a blank line. - &lt;code&gt;skill-review&lt;/code&gt; no longer counts a 500-line SKILL.md as 501. - &lt;code&gt;source-synthesis&lt;/code&gt; rejects &lt;code&gt;[S1:p4, S2:p7]&lt;/code&gt; as malformed. - &lt;code&gt;dependency-upgrade-review&lt;/code&gt; reads Yarn Berry lockfiles, and no longer matches &lt;code&gt;ws&lt;/code&gt; inside &lt;code&gt;aws-sdk&lt;/code&gt;. - &lt;code&gt;codebase-tour&lt;/code&gt; reads tox commands that span lines. - &lt;code&gt;backlog-triage&lt;/code&gt; parses Jira timestamps on Python 3.9. - &lt;code&gt;interactive-diagram&lt;/code&gt; writes its timeline summary correctly. - The career skills&amp;#x27; claim check no longer flags &amp;quot;Wrote SQL for Northwind Traders&amp;quot; when every name is in the source, and still flags a title the source doesn&amp;#x27;t support.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Inputs that used to crash with a traceback now fail with a one-line message&lt;/strong&gt; naming the file and the fix: a JSON list where an object belongs, a non-UTF-8 export, a header-only CSV, a missing config, or an out-of-range value. A UTF-8 file with a byte-order mark is now read normally. &lt;code&gt;behaviour-equivalence&lt;/code&gt; reports a bad rules file as BLOCKED (exit 2), not NOT EQUIVALENT.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The docs page loads faster:&lt;/strong&gt; median LCP on the live page went from 1.86 s to 0.98 s (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0061-own-skills-on-own-site.md&quot;&gt;RFC-0061&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.43</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.43/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.43/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Every skill script has unit tests:&lt;/strong&gt; 1,317 tests for the 48 scripts in 43 skills, run on Linux, macOS and Windows on every pull request. Every new script needs tests: &lt;code&gt;validate.py&lt;/code&gt; fails a skill whose scripts have none. Run them with &lt;code&gt;python3 -m unittest discover -s tests -t .&lt;/code&gt;. They use only the standard library and run offline (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0060-skill-script-unit-tests.md&quot;&gt;RFC-0060&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Two Windows bugs, found by running the tests on Windows, are fixed:&lt;/strong&gt; - &lt;code&gt;tracker-brief-sync&lt;/code&gt; 0.1.1 wrote its Jira and CSV imports with a blank row between every issue; - &lt;code&gt;interactive-diagram&lt;/code&gt; 0.2.3 crashed when the output file was on a different drive from the current folder.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Writing the tests found 60 bugs in 34 skills.&lt;/strong&gt; Each is recorded as a known failure and fixed in a follow-up release. About 25 give a wrong result, such as AWS spot compute always reported as $0, or a sprint filter that also matches a later sprint. The rest crash on input they should reject with a clear message.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.42</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.42/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.42/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;skilldrop&amp;#x27;s site is reviewed by its own skills&lt;/strong&gt;, and the &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/explanation/own-skills-on-own-site.html&quot;&gt;reviews are published&lt;/a&gt; (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0061-own-skills-on-own-site.md&quot;&gt;RFC-0061&lt;/a&gt;). - &lt;strong&gt;&lt;code&gt;accessibility-audit&lt;/code&gt;&lt;/strong&gt; found three problems, now fixed: - keyboard focus was invisible on three of the four install tabs on the home page; - text on the accent colour was just under 4.5:1; - search-field borders were too faint to find. Every checked page now scores 100 on Lighthouse&amp;#x27;s accessibility checks.&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;web-performance-review&lt;/code&gt;&lt;/strong&gt; found no vital at risk in the lab: LCP 1.0–1.9 s, CLS 0, no blocking time. The docs pages no longer wait on the code-colouring stylesheet before they paint.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pull requests here are reviewed by &lt;code&gt;pre-merge-review&lt;/code&gt;&lt;/strong&gt;, with the review posted to the check&amp;#x27;s summary. It reports and never blocks, and it runs only once the repository&amp;#x27;s API key is set.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.41</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.41/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.41/"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The share card says what sets skilldrop apart.&lt;/strong&gt; The card that shows when the site or repo is linked in Slack, Teams or LinkedIn says that skills are run with and without themselves, that 4 were retired for losing, and that gates can say no. &lt;code&gt;validate.py&lt;/code&gt; checks the retired count on the card against the catalogue, the same way it checks the other counts.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.40</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.40/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.40/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Every release can be verified.&lt;/strong&gt; Each GitHub Release now carries: - the exact tarball published to npm; - a Sigstore-signed build provenance for it (&lt;code&gt;gh attestation verify skilldrop-cli-&amp;lt;version&amp;gt;.tgz --repo sananthanarayan/skilldrop&lt;/code&gt;); - a CycloneDX SBOM. Its notes are this changelog entry, and its title is the pull request&amp;#x27;s (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0059-signed-releases-and-scorecard.md&quot;&gt;RFC-0059&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The repo is scored by &lt;a href=&quot;https://scorecard.dev/viewer/?uri=github.com/sananthanarayan/skilldrop&quot;&gt;OpenSSF Scorecard&lt;/a&gt;&lt;/strong&gt; every week and after every merge, with a badge on the README. - CI&amp;#x27;s own tools now install from hash-locked files. - Every workflow is read-only at the top level.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The README leads with the evidence:&lt;/strong&gt; - one real request answered with and without a skill, and the blind judge&amp;#x27;s verdict; - the last run&amp;#x27;s numbers; - the skills that were retired for losing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The CLI asks for a GitHub star once.&lt;/strong&gt; The line prints after your first successful install, at an interactive terminal only, never in CI, a pipe or &lt;code&gt;--json&lt;/code&gt;. Set &lt;code&gt;SKILLDROP_NO_STAR=1&lt;/code&gt; to turn it off. Nothing is sent anywhere.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.39</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.39/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.39/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Eval fixtures no longer raise Dependabot alerts.&lt;/strong&gt; A fixture&amp;#x27;s fake &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt;, &lt;code&gt;pyproject.toml&lt;/code&gt; or CI workflow is now stored as &lt;code&gt;&amp;lt;name&amp;gt;.fixture&lt;/code&gt;. GitHub no longer reads its pins as the repo&amp;#x27;s own dependencies, which had produced 33 alerts and six security PRs against code nothing installs or runs. &lt;code&gt;run_bench.py&lt;/code&gt; gives each file its real name in the run&amp;#x27;s workspace, and &lt;code&gt;validate.py&lt;/code&gt; fails on a fixture dependency file that keeps its real name (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0058-fixture-dependency-files.md&quot;&gt;RFC-0058&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.38</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.38/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.38/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/start/&quot;&gt;Get started&lt;/a&gt; page&lt;/strong&gt; takes a newcomer through four steps: - install with the CLI, the Claude Code plugin or a copied folder; - choose the work in front of you, with the install command and a first prompt for each choice; - make the first request in plain words; - check the verdict and where you decide. It is first in the site&amp;#x27;s navigation and on the home page.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The packs page opens with &amp;quot;Start with your role&amp;quot;&lt;/strong&gt;: thirteen roles, each pointing to its packs. Every pack must be placed under a role, so the site build fails if a new pack is missing from the list.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The docs have a copy button on every code block.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Each kind of guide has an index page.&lt;/strong&gt; Tutorials, how-tos, reference and explanation each list their guides, and the kind in a guide&amp;#x27;s header links back to that list.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Each tutorial card says how long the tutorial takes,&lt;/strong&gt; where the tutorial itself says so.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The contributing guide is in the docs&lt;/strong&gt;, published from &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; so the two can&amp;#x27;t disagree.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A pack page shows how long a session takes&lt;/strong&gt; beside the pack&amp;#x27;s size, when the pack&amp;#x27;s journey says so.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.37</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.37/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.37/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;bundle-size-review&lt;/code&gt;&lt;/strong&gt;, in the &lt;code&gt;frontend&lt;/code&gt; pack, finds what makes a JavaScript bundle heavy from webpack, esbuild or Vite stats. Before reaching a conclusion, it reads your repository: the browser targets, the bundler config, the installed versions, and the files that import each heavy package. It reports exact byte sizes for what each entry loads before first render, the import chain behind each heavy module, duplicates, and polyfills your browser targets don&amp;#x27;t need. Given before and after stats, it shows what grew and which per-entry budget would have caught it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;judge-audit&lt;/code&gt;&lt;/strong&gt;, in &lt;code&gt;ai-engineering&lt;/code&gt;, checks whether an LLM judge can be trusted for the decision its scores drive. It measures agreement with expert labels, using weighted kappa for 1–5 scores. Its numbers are broken down by the variants you&amp;#x27;re comparing, so a judge that favours one of them shows up. Each run is reported separately, a rare class gets precision and recall with intervals, and the result is checked against your own pass mark.&lt;/li&gt;&lt;li&gt;Both failed their first measurement in 0.16.36. They were revised from the judges&amp;#x27; reasons, then preferred to plain Claude Code on new held-out evals (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0057-standing-out-and-closing-gaps.md&quot;&gt;RFC-0057&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.36</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.36/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.36/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Ten new skills.&lt;/strong&gt; Each was preferred by blind judges to plain Claude Code on held-out evals (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0057-standing-out-and-closing-gaps.md&quot;&gt;RFC-0057&lt;/a&gt;). - &lt;strong&gt;&lt;code&gt;behaviour-equivalence&lt;/code&gt;&lt;/strong&gt; proves that a rewrite or migration behaves like the old code. It records the old system first and runs it twice to see what varies on its own, normalises one field at a time with a reason, and makes you classify every remaining difference. Its script does the diff. - &lt;strong&gt;&lt;code&gt;event-contract-draft&lt;/code&gt;&lt;/strong&gt; writes an AsyncAPI 3.0 event or message contract: event names, an id for deduplication, the partition key and the ordering it does and doesn&amp;#x27;t give, idempotent consumers, minimal personal data, and safe versioning. &lt;code&gt;api-contract-draft&lt;/code&gt; now hands event contracts to it. - &lt;strong&gt;&lt;code&gt;slo-spec&lt;/code&gt;&lt;/strong&gt; writes SLOs from your user journeys. Its script turns the error budget into minutes and bad requests and works out burn-rate paging alerts, and it checks each target against what your dependencies allow. - &lt;strong&gt;&lt;code&gt;lean-canvas&lt;/code&gt;&lt;/strong&gt; finds what could kill an idea: every box tagged as evidence or assumption, the riskiest assumption first with the cheapest test to disprove it, and the unit economics computed. - &lt;strong&gt;&lt;code&gt;agent-config-review&lt;/code&gt;&lt;/strong&gt; checks a Claude Code, Codex or Cursor setup for more access than the work needs, reading every settings scope plus hooks, MCP servers and subagents, and gives the exact config to replace each problem. - &lt;strong&gt;&lt;code&gt;agent-incident-response&lt;/code&gt;&lt;/strong&gt; covers the first hour after an agent leaks a key, deletes something or runs up a bill. It answers your question first, revokes the key before anyone touches git, and gives exact recovery steps. - &lt;strong&gt;A new &lt;code&gt;frontend&lt;/code&gt; pack:&lt;/strong&gt; - &lt;strong&gt;&lt;code&gt;web-performance-review&lt;/code&gt;&lt;/strong&gt; reads a Lighthouse or PageSpeed Insights report for what slows the page for real users, ranked by how much each fix moves the failing Core Web Vital. - &lt;strong&gt;&lt;code&gt;rendering-strategy&lt;/code&gt;&lt;/strong&gt; decides, route by route, whether each page is static, revalidated, server-rendered or client-rendered. - &lt;strong&gt;&lt;code&gt;md-to-pptx&lt;/code&gt;&lt;/strong&gt; turns Markdown into PowerPoint with nothing to install. Long sections split onto &amp;quot;continued&amp;quot; slides, and the reply names any speaker note that would go out with the file. - &lt;strong&gt;&lt;code&gt;md-to-confluence&lt;/code&gt;&lt;/strong&gt; turns Markdown into a Confluence page, and publishes it only after showing which page and version it will overwrite.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A &lt;code&gt;modernize&lt;/code&gt; loop&lt;/strong&gt; for replacing legacy code. It records the old component&amp;#x27;s behaviour before anything is rebuilt, a script compares the new one against those recordings (G10), and a person decides the cutover (G10.1).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;file-to-markdown&lt;/code&gt; reads email:&lt;/strong&gt; &lt;code&gt;.eml&lt;/code&gt;, and Outlook &lt;code&gt;.msg&lt;/code&gt; with nothing to install. You get the subject, sender, recipients, sent time and body, with attachments listed by name and size.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Three new review agents:&lt;/strong&gt; - &lt;strong&gt;&lt;code&gt;test-reviewer&lt;/code&gt;:&lt;/strong&gt; would these tests catch the bug? - &lt;strong&gt;&lt;code&gt;docs-reviewer&lt;/code&gt;:&lt;/strong&gt; do the docs still match the change? - &lt;strong&gt;&lt;code&gt;finding-adjudicator&lt;/code&gt;:&lt;/strong&gt; checks a review panel&amp;#x27;s findings against the code and returns one ranked list.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.35</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.35/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.35/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;file-to-markdown&lt;/code&gt; keeps PDF table columns apart when they sit close together.&lt;/strong&gt; A right-aligned amount next to a left-aligned date used to merge into one cell (&amp;quot;1,137 2027-02-01&amp;quot;), because the PDF&amp;#x27;s text puts only one space between them. Columns are now told apart by where each word sits on the page, and a normal word space never splits a cell, even in a monospace font. A table that already came out right is unchanged. On a 60-row table exported from Word, every row now has its four columns.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.34</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.34/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.34/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;skilldrop search &amp;lt;words&amp;gt;&lt;/code&gt;&lt;/strong&gt; finds skills, loops, agents and packs by what they&amp;#x27;re for, from the terminal and offline. It reads names, tags, packs, descriptions and the phrasings each skill&amp;#x27;s trigger evals route to it, so &lt;code&gt;skilldrop search why did our conversion drop&lt;/code&gt; finds &lt;code&gt;hypothesis-comparison&lt;/code&gt;. Every word must match, filler words are dropped, and if nothing matches every word it shows near matches and says so. Search a retired skill by name and you get its retirement note. &lt;code&gt;--kind&lt;/code&gt;, &lt;code&gt;--limit&lt;/code&gt; and &lt;code&gt;--json&lt;/code&gt; refine it (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0056-search-and-windows-ci.md&quot;&gt;RFC-0056&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The CLI is tested on Windows, macOS and Linux&lt;/strong&gt; on every pull request: installs into folders and git repos, &lt;code&gt;--project&lt;/code&gt;, &lt;code&gt;--local&lt;/code&gt;, agents, loops, containment, policies, mirrors and a skill&amp;#x27;s own Python script. Every check passed on Windows the first time.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fixed for Windows:&lt;/strong&gt; - &lt;strong&gt;Five skills&amp;#x27; scripts could fail on Windows.&lt;/strong&gt; They read files with Windows&amp;#x27; default encoding and stopped at the first non-ASCII character. They now read and write UTF-8: &lt;code&gt;brand-kit&lt;/code&gt;, &lt;code&gt;marketing-flyer&lt;/code&gt;, &lt;code&gt;deck-builder&lt;/code&gt;, &lt;code&gt;ai-usage-report&lt;/code&gt; and &lt;code&gt;pre-merge-review&lt;/code&gt;. Run &lt;code&gt;skilldrop update&lt;/code&gt; to get the fix. - &lt;strong&gt;&lt;code&gt;validate.py&lt;/code&gt; now runs on Windows&lt;/strong&gt;, so contributors can lint a clone there, and it rejects any script that reads text without an encoding.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.33</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.33/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.33/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Eval results now build a history.&lt;/strong&gt; The evals workflow runs the trigger queries every week and, from this release, the acceptance assertions every month under a dollar budget ($20 unless you set &lt;code&gt;EVALS_MONTHLY_BUDGET&lt;/code&gt;). Each run&amp;#x27;s counts are appended to an &lt;code&gt;eval-history&lt;/code&gt; branch, and the &lt;em&gt;How skills are checked&lt;/em&gt; page draws them week by week: trigger accuracy over time, the skills whose routing changed since the last run, and what each monthly run graded and spent. It starts once the repository has an &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; secret (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0055-eval-history-branch.md&quot;&gt;RFC-0055&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;run_evals.py --budget&lt;/code&gt;&lt;/strong&gt; stops starting new calls once the dollar cap is reached, and &lt;code&gt;--summary&lt;/code&gt; writes the counts-only file the history keeps.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;file-to-markdown&lt;/code&gt; reads scanned PDFs&lt;/strong&gt; when &lt;code&gt;tesseract&lt;/code&gt; is installed. Each page with no text layer is read by OCR (&lt;code&gt;--ocr-lang&lt;/code&gt; for other languages), and the reply says which pages were OCR&amp;#x27;d so you check their numbers and names. A table that runs onto the next page now comes out as one table, without the header the PDF repeats, and a paragraph after a table is no longer pulled into it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The converters&amp;#x27; output checked in real Office.&lt;/strong&gt; Word for Mac 16.114 opens the &lt;code&gt;md-to-docx&lt;/code&gt; example with no repair prompt and keeps its headings, table, image and links in its own PDF export. Excel 16.114 reads the &lt;code&gt;md-to-xlsx&lt;/code&gt; example&amp;#x27;s amounts, percentages, dates and TRUE/FALSE as real values, with filters on and the header frozen.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.32</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.32/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.32/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A skill&amp;#x27;s instructions are now held to its &lt;code&gt;permissions&lt;/code&gt;.&lt;/strong&gt; A skill without scripts can still tell your agent to run &lt;code&gt;terraform init&lt;/code&gt; or &lt;code&gt;curl&lt;/code&gt; a host. The scan now reads every fenced shell block in a skill&amp;#x27;s instructions, and &lt;code&gt;skilldrop validate&lt;/code&gt; fails one that runs a program or reaches a host it doesn&amp;#x27;t declare. &lt;code&gt;--contain&lt;/code&gt; lets shell commands reach only the declared hosts, so they now include the ones instructions need. Six bundled skills declare what their instructions run: &lt;code&gt;sonar-review&lt;/code&gt;, &lt;code&gt;terraform-module&lt;/code&gt;, &lt;code&gt;terraform-plan-review&lt;/code&gt;, &lt;code&gt;mermaid-render&lt;/code&gt;, &lt;code&gt;figma-diagrams&lt;/code&gt; and &lt;code&gt;dependency-upgrade-review&lt;/code&gt; (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0054-instruction-permissions-and-agent-scan.md&quot;&gt;RFC-0054&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;skilldrop scan&lt;/code&gt; checks agents too.&lt;/strong&gt; It applies the same rules it uses on skills, plus four of its own: - an agent with no &lt;code&gt;tools:&lt;/code&gt; list, which inherits every tool; - one that reads from the web or an MCP server and can run commands or edit files in the same context; - a permission mode that skips your approval; - hooks in its frontmatter. &lt;code&gt;scan --agent&lt;/code&gt; scans agents only. Installing agents from a third-party catalogue shows the findings, and a policy&amp;#x27;s &lt;code&gt;scan.max&lt;/code&gt; now refuses agents above its limit too.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;dependency-upgrade-review&lt;/code&gt; leads with the verdict and what decides it.&lt;/strong&gt; Each blocker says what breaks, where, why CI missed it, and how to fix it. The review now traces changed APIs to their callers, checks runtime floors against the image and CI, and flags one tag pinned to two SHAs. On new held-out evals, both judges preferred it to plain Claude Code in every pair (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0053-six-skills-for-the-lifecycle-gaps.md&quot;&gt;RFC-0053&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.31</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.31/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.31/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;rollout-plan&lt;/code&gt;&lt;/strong&gt; plans turning on a flagged or canaried change. It answers your question first, then builds the ramp around what actually limits it: a partner&amp;#x27;s daily cap, a billing cycle, a shadow run, or traffic too low for percentages to mean anything. Each step has a threshold measured against the flag-off group and a rule set in advance, and the plan says how long the step must run to catch a regression and what turning the flag off doesn&amp;#x27;t undo. It&amp;#x27;s an option in the &lt;code&gt;release&lt;/code&gt; loop&amp;#x27;s first stage, beside &lt;code&gt;migration-plan&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;refactor-plan&lt;/code&gt;&lt;/strong&gt; plans paying down one piece of technical debt in small steps, each its own PR, with main releasable after every one. Characterisation tests go first on the code that has caused incidents. Each step is labelled refactor or behaviour change, and the plan ends at the structure your goal needs. A question asked in chat gets a plan sized for chat.&lt;/li&gt;&lt;li&gt;Both failed their first measurement in 0.16.30, were revised from the judges&amp;#x27; reasons, and were then preferred to plain Claude Code in every pair on new held-out evals (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0053-six-skills-for-the-lifecycle-gaps.md&quot;&gt;RFC-0053&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.30</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.30/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.30/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Four new skills&lt;/strong&gt;, each admitted on held-out evals written by someone who saw only its description (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0053-six-skills-for-the-lifecycle-gaps.md&quot;&gt;RFC-0053&lt;/a&gt;): - &lt;strong&gt;&lt;code&gt;dependency-upgrade-review&lt;/code&gt;&lt;/strong&gt; gives a merge verdict on a Dependabot or Renovate pull request: MERGE, MERGE AFTER CHECKS or DO NOT MERGE. It reads the release notes for every skipped version and lists what the lockfile changes beyond the title. Each SHA pin stays unverified until it matches its tag. It says whether CI ran the changed code and writes the rollback. - &lt;strong&gt;&lt;code&gt;feedback-synthesis&lt;/code&gt;&lt;/strong&gt; turns tickets, NPS comments, reviews and interview notes into ranked problems. Each one is counted by distinct people, not mentions, with verbatim quotes and what the sample can&amp;#x27;t tell you. It&amp;#x27;s an option in the &lt;code&gt;discover&lt;/code&gt; loop&amp;#x27;s first stage. - &lt;strong&gt;&lt;code&gt;codebase-tour&lt;/code&gt;&lt;/strong&gt; orients someone in an unfamiliar repo before one change. Commands come from CI and the package scripts. The path the change touches is cited to file and line, and the tour flags where the README is wrong and what traps to avoid. It&amp;#x27;s an option in the &lt;code&gt;build&lt;/code&gt; loop&amp;#x27;s first stage. - &lt;strong&gt;&lt;code&gt;mcp-pairing&lt;/code&gt;&lt;/strong&gt; says which MCP servers a loop needs, stage by stage, with the narrowest access: read-only by default and never write access on a review or gate stage. It names no server you didn&amp;#x27;t, and gives a fallback for running without one.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;loop-stats&lt;/code&gt; combines a team&amp;#x27;s numbers and draws them.&lt;/strong&gt; Pass several run logs, or other people&amp;#x27;s &lt;code&gt;--json&lt;/code&gt; summaries, and it shows them as one view. &lt;code&gt;--html&lt;/code&gt; writes a dashboard of each gate&amp;#x27;s verdicts, overall and week by week, that loads nothing from the network. The &lt;code&gt;--json&lt;/code&gt; summary no longer includes the log&amp;#x27;s file path, so it can be shared (&lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/how-to/measure-your-loops.html&quot;&gt;how-to&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Compare two packs&lt;/strong&gt; side by side on the site, from the packs page or any pack&amp;#x27;s page: what each is for, its loops and where a person decides, and the skills only one has.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A how-to for every skill&lt;/strong&gt; in the docs: install it, requests that route to it, what a good result looks like, what to use instead, and which loops run it. There are now 191 guides.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.29</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.29/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.29/"/>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Three new loops, for jobs that run alongside delivery&lt;/strong&gt; (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0052-research-comply-measure-loops.md&quot;&gt;RFC-0052&lt;/a&gt;): - &lt;strong&gt;&lt;code&gt;research&lt;/code&gt;&lt;/strong&gt; takes a question about why something happened to an answer the evidence can carry. The plan fixes what would change the decision before any source is read. Its gate (G7) passes only when the evidence separates the leading explanation from the runner-up; otherwise it sends the work back for the one observation that would. &lt;code&gt;npx skilldrop-cli install --loop research&lt;/code&gt;. - &lt;strong&gt;&lt;code&gt;comply&lt;/code&gt;&lt;/strong&gt; takes a risky change (a launch, a vendor, new personal data) to a risk position its owner signs. The DPIA&amp;#x27;s risks to people join the register. A control the evidence map can&amp;#x27;t evidence gives a rating no credit. The register&amp;#x27;s own script decides G8, and only the named owner signs at G8.1. - &lt;strong&gt;&lt;code&gt;measure&lt;/code&gt;&lt;/strong&gt; takes a dashboard request to numbers people can defend. The spec cuts charts before any SQL is read. A query that fails review goes back through the spec, because the fix moves the number. Each metric&amp;#x27;s owner confirms its definition at G9.1, and an undefined metric is never filled in for them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A hand-written tutorial for each pack added in 0.14.0&lt;/strong&gt;, each worked on one example from start to finish, with output from real runs: &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/one-draft-every-format.html&quot;&gt;converters&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/page-to-service.html&quot;&gt;experience-design&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/why-question-to-evidence.html&quot;&gt;research&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/prd-to-honest-tracker.html&quot;&gt;trackers&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/dashboard-request-to-defensible-numbers.html&quot;&gt;data-analytics&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/risky-change-to-signed-risk.html&quot;&gt;grc&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/module-to-safe-apply.html&quot;&gt;infra-as-code&lt;/a&gt; and &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/tutorial/write-and-review-a-skill.html&quot;&gt;skill-engineering&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.28</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.28/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.28/"/>
    <updated>2026-10-19T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Contain what a skill can reach.&lt;/strong&gt; &lt;code&gt;skilldrop install &amp;lt;skill&amp;gt; --project --contain&lt;/code&gt; turns on Claude Code&amp;#x27;s strict sandbox for that project, sized to what the skills declare: shell commands, and everything they start, write only inside the project and reach only the hosts the skills say they need. It only ever tightens your settings, never loosens or widens them, keeps the file out of git, and refuses a skill that says it writes anywhere on disk. It also says plainly what the sandbox doesn&amp;#x27;t cover (Claude Code&amp;#x27;s file and web tools, MCP servers, hooks) and how to close that (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0051-declared-containment.md&quot;&gt;RFC-0051&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/how-to/contain-skills.html&quot;&gt;how-to&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A policy can require it.&lt;/strong&gt; With &lt;code&gt;&amp;quot;require_containment&amp;quot;: true&lt;/code&gt;, an install that isn&amp;#x27;t contained is refused, and Claude Code won&amp;#x27;t start in a contained project if its sandbox can&amp;#x27;t. &lt;code&gt;skilldrop inventory&lt;/code&gt; shows which projects are contained.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.27</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.27/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.27/"/>
    <updated>2026-10-19T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;An organisation can decide what its people install.&lt;/strong&gt; Hand out a policy file (&lt;code&gt;--policy&lt;/code&gt;, &lt;code&gt;SKILLDROP_POLICY&lt;/code&gt;, or &lt;code&gt;~/.config/skilldrop/policy.json&lt;/code&gt;) and the installer enforces it: only the catalogues you allow, pinned to a commit if you say so, only the skills you allow, none you block, and nothing whose supply-chain scan finds worse than you accept. A refused install writes nothing and names the rule; &lt;code&gt;update&lt;/code&gt; leaves refused skills as they are. A policy with a mistake stops the command rather than being half-applied (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0050-org-governance.md&quot;&gt;RFC-0050&lt;/a&gt;, &lt;a href=&quot;https://sananthanarayan.github.io/skilldrop/docs/how-to/govern-skills.html&quot;&gt;how-to&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;skilldrop inventory&lt;/code&gt; lists every install on a machine&lt;/strong&gt;, across every tool and scope, with what the policy thinks of each; &lt;code&gt;--merge&lt;/code&gt; combines reports from many machines into one view. Paths under your home directory are written as &lt;code&gt;~&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;An audit log that shows if it was edited.&lt;/strong&gt; With &lt;code&gt;audit&lt;/code&gt; in the policy, every install, update and uninstall is recorded; each line carries the fingerprint of the one before, and &lt;code&gt;skilldrop audit verify&lt;/code&gt; names the first line that doesn&amp;#x27;t follow. Entries name a pseudonym only your organisation can resolve, unless it chooses otherwise.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;skilldrop verify-mirror&lt;/code&gt; checks an internal mirror&lt;/strong&gt; against the fingerprints &lt;code&gt;skilldrop package&lt;/code&gt; recorded, and names every file changed, missing or added since.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.26</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.26/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.26/"/>
    <updated>2026-10-19T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;interactive-diagram&lt;/code&gt; asks for what a reader needs from the reply:&lt;/strong&gt; the link and the takeaway at the top, with at most one short line about the build before them. Three attempts to remove that line changed little, and a reader who has just watched the build run loses nothing to it (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0048-interactive-diagram.md&quot;&gt;RFC-0048&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.25</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.25/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.25/"/>
    <updated>2026-10-19T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The site shows live examples as a gallery.&lt;/strong&gt; The home page and each skill page with finished example pages show them as cards with a live, shrunken preview of the real page, which opens full size when clicked. The previews run in a sandbox with no access to the site and load only when scrolled to.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;interactive-diagram&lt;/code&gt; pages work inside a sandboxed frame&lt;/strong&gt; (an embed, or the site&amp;#x27;s preview), where the browser refuses saved preferences; the theme simply follows the system setting there.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;interactive-diagram&lt;/code&gt; has two more evals written by someone who never read the skill&lt;/strong&gt;, a repository&amp;#x27;s data flow and a process told in words; two blind judges preferred it to plain Claude Code in 4 and 3 of 4 pairs. A reply drafted by the script, tried to make replies open with the link, did not, and was reverted (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0048-interactive-diagram.md&quot;&gt;RFC-0048&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>skilldrop 0.16.24</title>
    <id>https://sananthanarayan.github.io/skilldrop/changelog/0.16.24/</id>
    <link rel="alternate" type="text/html" href="https://sananthanarayan.github.io/skilldrop/changelog/0.16.24/"/>
    <updated>2026-10-19T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Commits and content can&amp;#x27;t publish a maintainer&amp;#x27;s own identity by accident.&lt;/strong&gt; &lt;code&gt;python3 privacy.py&lt;/code&gt; reads who you are from your own machine (the signed-in Claude account, git config, your user name and home directory, plus anything you list in the git-ignored &lt;code&gt;.skilldrop-private&lt;/code&gt;) and stops your name, email, organization or home path reaching a commit, a commit message or any tracked file, without ever printing them. Turn the hooks on once per clone with &lt;code&gt;git config core.hooksPath .githooks&lt;/code&gt;; &lt;code&gt;validate.py&lt;/code&gt; runs the same scan. CI now fails a push or pull request whose commits use anything but a GitHub noreply email, for every account that commits (&lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/docs/rfcs/0049-identity-guard.md&quot;&gt;RFC-0049&lt;/a&gt;, &lt;a href=&quot;https://github.com/sananthanarayan/skilldrop/blob/main/SECURITY.md#keeping-your-identity-out&quot;&gt;SECURITY.md&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Benchmark runs say when an output named you.&lt;/strong&gt; A model will write the signed-in account&amp;#x27;s name into an Author field unasked (it did three times in the tier run, once with no skill at all). &lt;code&gt;run_bench.py&lt;/code&gt; now counts those runs in the report, replaces the name with [you] in &lt;code&gt;results.json&lt;/code&gt;, and refuses to publish a summary that contains it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;design-doc&lt;/code&gt; fills its Author field only from your brief&lt;/strong&gt;, and leaves it blank otherwise.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The benchmark guide shows how to run a long benchmark from a terminal&lt;/strong&gt;, detached, so a task time limit can&amp;#x27;t stop it halfway; a rerun resumes from the cache.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
</feed>
