<?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: Harshavardhan Surisetty</title>
    <description>The latest articles on DEV Community by Harshavardhan Surisetty (@harshaiiiv).</description>
    <link>https://dev.to/harshaiiiv</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%2F427613%2F90260cf3-2142-446e-beb2-92b98a1e20b5.jpeg</url>
      <title>DEV Community: Harshavardhan Surisetty</title>
      <link>https://dev.to/harshaiiiv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshaiiiv"/>
    <language>en</language>
    <item>
      <title>License Referee — a compatibility ruling agent backed by Sanity Context</title>
      <dc:creator>Harshavardhan Surisetty</dc:creator>
      <pubDate>Sat, 19 Sep 2026 22:57:53 +0000</pubDate>
      <link>https://dev.to/harshaiiiv/license-referee-a-compatibility-ruling-agent-backed-by-sanity-context-4a28</link>
      <guid>https://dev.to/harshaiiiv/license-referee-a-compatibility-ruling-agent-backed-by-sanity-context-4a28</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;License Referee&lt;/strong&gt; — paste a &lt;code&gt;package.json&lt;/code&gt;, a GitHub repo URL, or an npm package name, and it rules on whether every dependency's license can legally combine with your project's, in which direction, under what conditions, and who said so.&lt;/p&gt;

&lt;p&gt;"Can I use this?" is usually answered by glancing at a license badge, which is wrong in ways that matter. Compatibility is &lt;strong&gt;directional&lt;/strong&gt; (Apache-2.0 code may go into a GPLv3 work; GPLv3 code may not go into an Apache-2.0 work — same two licenses, opposite answer). It's &lt;strong&gt;version-exact&lt;/strong&gt; (Apache-2.0 is compatible with GPLv3 and incompatible with GPLv2, per both the Apache Software Foundation and the FSF). And &lt;strong&gt;authorities disagree with each other&lt;/strong&gt; — the OSI approves licenses the FSF doesn't call free software; CC0 is FSF-recommended for software but was withdrawn from OSI review.&lt;/p&gt;

&lt;p&gt;None of that survives a keyword search. It needs a graph: license → directional ruling → authority → obligation, with the disagreements kept visible instead of averaged away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live app: &lt;a href="https://license-referee.vercel.app" rel="noopener noreferrer"&gt;https://license-referee.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video: &lt;a href="https://youtu.be/-cBBpuPs8IU" rel="noopener noreferrer"&gt;https://youtu.be/-cBBpuPs8IU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try it with a real project: paste&lt;br&gt;
{"license":"GPL-2.0-only","dependencies":{"@grpc/grpc-js":"^1"}}&lt;br&gt;
and watch it explain, correctly, why that combination isn't allowed — and what would fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/harsha-iiiv/license-referee" rel="noopener noreferrer"&gt;https://github.com/harsha-iiiv/license-referee&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sanity project:&lt;/strong&gt; &lt;code&gt;9qqt8rm4&lt;/code&gt;, dataset &lt;code&gt;production&lt;/code&gt;. Schema: &lt;code&gt;license&lt;/code&gt; (SPDX id, category, OSI/FSF flags, permissions/conditions/limitations), &lt;code&gt;compatibilityRuling&lt;/code&gt; (directional &lt;code&gt;from&lt;/code&gt; → &lt;code&gt;into&lt;/code&gt;, verdict, combination kind, verbatim quote, source URL, optional &lt;code&gt;dissent&lt;/code&gt; when authorities disagree), &lt;code&gt;obligation&lt;/code&gt; (what to do, per license per trigger), &lt;code&gt;source&lt;/code&gt; (the authorities, ranked by what they're authoritative for).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Base:&lt;/strong&gt; indexed from that dataset — every ruling carries a quote and source URL checked live against the authority itself (FSF, GNU, Apache, Mozilla, Eclipse, OSI, choosealicense.com) during verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity Context tools used:&lt;/strong&gt; &lt;code&gt;initial_context&lt;/code&gt; and &lt;code&gt;knowledge_base_read&lt;/code&gt; against the Knowledge Base endpoint for explanations, obligations, and cross-source reconciliation; &lt;code&gt;groq_query&lt;/code&gt; and &lt;code&gt;schema_explorer&lt;/code&gt; against a GROQ endpoint over the same dataset for exact, deterministic verdict lookups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent does with what it retrieves:&lt;/strong&gt; resolves every dependency's declared license from the npm registry, normalizes it to an SPDX expression, looks up an exact ruling for each (dependency license → project license) pair, falls back to the Knowledge Base for conditions and edge cases when no direct ruling exists, and never guesses — an unmapped pair comes back "unknown," not a fabricated verdict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did structure matter?&lt;/strong&gt; I ran a 22-question golden set through three configurations: this agent, a keyword-search baseline over the identical source pages, and a no-retrieval baseline.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Pass&lt;/th&gt;
&lt;th&gt;Avg score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sanity Context (this agent)&lt;/td&gt;
&lt;td&gt;21/22&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyword search&lt;/td&gt;
&lt;td&gt;21/22&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No retrieval&lt;/td&gt;
&lt;td&gt;16/22&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The telling case: an obscure license (BlueOak-1.0.0) into a GPL-3.0-only project. All three modes reached the correct verdict, but in one no-retrieval run the model backed it with a citation that doesn't exist — a fabricated FSF license-list entry, checked live against the real page. Both retrieval-backed modes correctly said no FSF ruling exists for it instead. A right verdict with an invented authority is worse than a right verdict with an honest "no ruling exists."&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;Project ID: 9qqt8rm4, dataset production&lt;br&gt;
Studio: &lt;a href="https://license-referee.sanity.studio/" rel="noopener noreferrer"&gt;https://license-referee.sanity.studio/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;The build started with a design pass: what would make this trustworthy rather than just plausible? The answer was a typed graph instead of prose — license, compatibilityRuling, obligation, and source as separate Sanity document types, with &lt;code&gt;from&lt;/code&gt;/&lt;code&gt;into&lt;/code&gt; as distinct fields so the direction of a ruling could never get silently inverted by a model reading too casually.&lt;/p&gt;

&lt;p&gt;The dataset itself went through an adversarial verification pass: every ruling's quote and source URL was checked against the live page it cited. That pass caught 16 quotes that were paraphrased rather than verbatim, one wrong verdict (CC-BY-4.0 into GPL was marked incompatible; the FSF's actual position is the opposite), and a structural gap — zero rulings for a copyleft dependency going into a permissive or closed-source project, the single most consequential direction for a real npm tree. All of that got fixed and the ruling set grew from 70 to 138 entries.&lt;/p&gt;

&lt;p&gt;The last mile was proving the thesis instead of asserting it: a golden set of 22 real questions and project audits, run through the production agent, a keyword-search baseline over the identical source pages, and a no-retrieval baseline. The gap that mattered wasn't the score — it was a no-retrieval run inventing an FSF citation that doesn't exist on the real page, while both retrieval-backed modes correctly said no such ruling exists. That's the whole argument for structured content in one example: a right answer with a fabricated source is worse than a right answer with an honest gap.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>THE WORLD'S FIRST HACKATHON FOR VOICE-ENABLED APPLICATIONS</title>
      <dc:creator>Harshavardhan Surisetty</dc:creator>
      <pubDate>Thu, 09 Jul 2020 08:30:03 +0000</pubDate>
      <link>https://dev.to/harshaiiiv/the-world-s-first-hackathon-for-voice-enabled-applications-3g55</link>
      <guid>https://dev.to/harshaiiiv/the-world-s-first-hackathon-for-voice-enabled-applications-3g55</guid>
      <description>&lt;p&gt;We’re hosting our very first virtual #hackathon! Join as an individual or team &amp;amp; create a voice assistant with the Alan Platform 🗣Mobile phone #AlanVoiceAIHackathon&lt;/p&gt;

&lt;p&gt;Learn more here  &lt;a href="https://hackathon.alan.app"&gt;https://hackathon.alan.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Submissions are due by July 15th&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #100daysofcode #JavaScript
&lt;/h1&gt;

</description>
    </item>
  </channel>
</rss>
