<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xml:base="https://specificlanguages.com/">
  <channel>
    <title>Specific Languages</title>
    <link>https://specificlanguages.com/</link>
    <description>Recent content on Specific Languages</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>sergej@specificlanguages.com (Sergej Koščejev)</managingEditor>
    <webMaster>sergej@specificlanguages.com (Sergej Koščejev)</webMaster>
    <lastBuildDate>Mon, 14 Sep 2026 18:10:53 +0200</lastBuildDate>
    
    <atom:link href="https://specificlanguages.com/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>MPS Office Hours 🆓</title>
      <link>https://specificlanguages.com/services/mps-office-hours/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/services/mps-office-hours/</guid>
      <description>&lt;p&gt;You have a problem with MPS and you don&amp;rsquo;t know how to solve it. Worst of all, you don&amp;rsquo;t even know what words to use to
describe the problem, or what to look for in the forum or the documentation. But, you are sure that if you could demo it
for a few minutes to an expert, a hint would get you unstuck very quickly.&lt;/p&gt;
&lt;p&gt;Well, now you can do just that! I&amp;rsquo;m offering MPS Office Hours, a regular group call where you can demonstrate your
problem and get hints from myself or other present experts.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/services/mps-office-hours/"><![CDATA[ <p>You have a problem with MPS and you don&rsquo;t know how to solve it. Worst of all, you don&rsquo;t even know what words to use to
describe the problem, or what to look for in the forum or the documentation. But, you are sure that if you could demo it
for a few minutes to an expert, a hint would get you unstuck very quickly.</p>
<p>Well, now you can do just that! I&rsquo;m offering MPS Office Hours, a regular group call where you can demonstrate your
problem and get hints from myself or other present experts.</p>
<p>And if you don&rsquo;t have a problem yet but just want to watch and learn from others, you can, too!</p>
<p>Best of all, it&rsquo;s free!</p>
<blockquote>
<p>I wasn&rsquo;t expecting to participate in the Office Hours today. My plan was to just watch and learn. I&rsquo;m used to the
try-it-and-see and RTFM before asking for help. Still, I&rsquo;m glad that I did participate, got good feedback and
pointers. It&rsquo;s a valuable resource for the community.</p>
<p>&ndash; Nuba Princigalli</p>
</blockquote>
<h2 id="interested">Interested?</h2>
<p>Here are the important details:</p>
<ul>
<li>The call takes place <strong>every Monday and Thursday from 14:30 until 15:00</strong> CE(S)T (GMT+1 or +2, dependent on daylight
savings).</li>
<li>We meet on Google Meet. To avoid zoombombing, the link is not shared publicly but will be posted to the
<code>#office-hours</code> channel in the offical <a href="http://slack-mps.jetbrains.com">MPS Slack</a>.</li>
<li>Discussion related to MPS Office Hours also takes place in the <code>#office-hours</code> channel.</li>
<li>The office hours are <strong>not recorded</strong> currently but this may change in the future.</li>
<li>Attendance is <strong>free</strong> and the meeting is <strong>public</strong>. If you want a private consultation, <a href="https://specificlanguages.com/about/">contact me</a>.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>MPS Advisory Service</title>
      <link>https://specificlanguages.com/services/mps-advisory-service/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/services/mps-advisory-service/</guid>
      <description>&lt;p&gt;Are you worried about unforeseen challenges of technical nature with MPS development? Afraid that you don&amp;rsquo;t know what
you don&amp;rsquo;t know?&lt;/p&gt;
&lt;p&gt;To help reduce the risk of your team getting stuck on a difficult issue, I offer MPS Advisory Service where I answer
your technical questions related to MPS with a response time of one business day.&lt;/p&gt;
&lt;h2 id=&#34;examples-of-topics-that-are-covered&#34;&gt;Examples of topics that are covered&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How to implement a particular editing feature&lt;/li&gt;
&lt;li&gt;Understanding an error message and suggestions on how to best fix the underlying cause&lt;/li&gt;
&lt;li&gt;How to automate the build process&lt;/li&gt;
&lt;li&gt;How to best integrate MPS with a particular system or environment&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-not-covered&#34;&gt;What is not covered&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Developing production code – but I might create a small example to illustrate a point or a technique, if necessary.&lt;/li&gt;
&lt;li&gt;Maintaining or debugging existing code – but I could give you tips to help you do it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;The service is offered to you as a single person (a team lead, an architect, a CTO). You ask questions by email, I
reply to my best ability within one business day, but usually faster. If necessary and convenient, we may jump on a
videocall to understand the problem better, but the service is mostly asynchronous.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/services/mps-advisory-service/"><![CDATA[ <p>Are you worried about unforeseen challenges of technical nature with MPS development? Afraid that you don&rsquo;t know what
you don&rsquo;t know?</p>
<p>To help reduce the risk of your team getting stuck on a difficult issue, I offer MPS Advisory Service where I answer
your technical questions related to MPS with a response time of one business day.</p>
<h2 id="examples-of-topics-that-are-covered">Examples of topics that are covered</h2>
<ul>
<li>How to implement a particular editing feature</li>
<li>Understanding an error message and suggestions on how to best fix the underlying cause</li>
<li>How to automate the build process</li>
<li>How to best integrate MPS with a particular system or environment</li>
</ul>
<h2 id="what-is-not-covered">What is not covered</h2>
<ul>
<li>Developing production code – but I might create a small example to illustrate a point or a technique, if necessary.</li>
<li>Maintaining or debugging existing code – but I could give you tips to help you do it.</li>
</ul>
<h2 id="how-it-works">How it works</h2>
<p>The service is offered to you as a single person (a team lead, an architect, a CTO). You ask questions by email, I
reply to my best ability within one business day, but usually faster. If necessary and convenient, we may jump on a
videocall to understand the problem better, but the service is mostly asynchronous.</p>
<h2 id="terms">Terms</h2>
<ul>
<li>The service costs 3 000 EUR/month (30 days), paid in full in advance.</li>
<li>In case of vacations/holidays the duration of the service is extended.</li>
<li>To ensure a high quality of service I only take 2 clients in a given month.</li>
</ul>
<p>Interested? Contact me at <a href="mailto:sergej@specificlanguages.com">sergej@specificlanguages.com</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Improving mops</title>
      <link>https://specificlanguages.com/posts/2026-09/14-improving-mops/</link>
      <pubDate>Mon, 14 Sep 2026 18:10:53 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-09/14-improving-mops/</guid>
      <description>&lt;p&gt;Last week I was improving &lt;a href=&#34;https://github.com/specificlanguages/mops/&#34;&gt;mops&lt;/a&gt;, my open-source CLI for working with MPS
projects. The most important addition was &amp;lsquo;code mode&amp;rsquo;: the ability to execute Groovy scripts in the context of an MPS
project.&lt;/p&gt;
&lt;p&gt;Here is an example Groovy script that returns the names of all Java classes in a project:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; conceptName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;jetbrains.mps.baseLanguage.ClassConcept&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; project&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; concept &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; project&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;concept&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;conceptName&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; names &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  mops&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;eachInstanceOf&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;concept&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; project&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;scope&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; node &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    names &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; node&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;properties&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; names
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note &lt;code&gt;project.read&lt;/code&gt; method for executing code in a read action, &lt;code&gt;project.concept&lt;/code&gt; for looking up concepts by name, as
well as &lt;code&gt;mops.search.eachInstanceOf&lt;/code&gt; for executing an instance search.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-09/14-improving-mops/"><![CDATA[ <p>Last week I was improving <a href="https://github.com/specificlanguages/mops/">mops</a>, my open-source CLI for working with MPS
projects. The most important addition was &lsquo;code mode&rsquo;: the ability to execute Groovy scripts in the context of an MPS
project.</p>
<p>Here is an example Groovy script that returns the names of all Java classes in a project:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-groovy" data-lang="groovy"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> conceptName <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;jetbrains.mps.baseLanguage.ClassConcept&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">return</span> project<span style="color:#f92672">.</span><span style="color:#a6e22e">read</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> concept <span style="color:#f92672">=</span> project<span style="color:#f92672">.</span><span style="color:#a6e22e">concept</span><span style="color:#f92672">(</span>conceptName<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> names <span style="color:#f92672">=</span> <span style="color:#f92672">[]</span>
</span></span><span style="display:flex;"><span>  mops<span style="color:#f92672">.</span><span style="color:#a6e22e">search</span><span style="color:#f92672">.</span><span style="color:#a6e22e">eachInstanceOf</span><span style="color:#f92672">(</span>concept<span style="color:#f92672">,</span> project<span style="color:#f92672">.</span><span style="color:#a6e22e">scope</span><span style="color:#f92672">)</span> <span style="color:#f92672">{</span> node <span style="color:#f92672">-&gt;</span>
</span></span><span style="display:flex;"><span>    names <span style="color:#f92672">&lt;&lt;</span> node<span style="color:#f92672">.</span><span style="color:#a6e22e">properties</span><span style="color:#f92672">[</span><span style="color:#e6db74">&#39;name&#39;</span><span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> names
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>Note <code>project.read</code> method for executing code in a read action, <code>project.concept</code> for looking up concepts by name, as
well as <code>mops.search.eachInstanceOf</code> for executing an instance search.</p>
<p>And here is how you execute it, say, against MPS-extensions:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-plain" data-lang="plain"><span style="display:flex;"><span>mops --project-root=code --mps-home=&#39;.../mps/2025.1.3&#39; --java-home=&#39;.../jbr&#39; code run .../mops/examples/concept-names.groovy
</span></span></code></pre></div><p>Since it is tedious to figure out the right <code>--mps-home</code> and <code>--java-home</code> parameters, I have also implemented a
<code>mops wrapper</code> subcommand which can guess their values for common Gradle builds and write a wrapper script for launching
<code>mops</code> in the context of the project.</p>
<p>I think the Groovy scripting interface is going to become more important in the future. For agents, Groovy is a good fit
because they are already quite adept at writing it, and editing models from Groovy is likely to be easier than
alternatives. For humans, it could provide an easier-to-run alternative to MPS Console scripts and a convenient way to
export data. Groovy also makes it easy to add language-specific functionality and helps keep the script readable (as
illustrated by the direct access to the <code>name</code> property above).</p>
<p>I am still iterating on both the functionality and the best way to expose it. I have added Java parsing (under
<code>mops.parsing.java</code>) and build script reloading (<code>mops.editing.build.reloadModulesFromDisk</code>). I want it to be easy to
add further extensions, such as parsing other languages (KernelF, or even structure and editor languages), or executing
an intention.</p>
<p>These changes were motivated by trying to get <code>mops</code> to a state where it could autonomously reproduce an issue reported
against MPS-extensions and write an automated test for it. I am of course discovering bugs along the way and fixing
them. (Did you know that headless MPS will save your models only when explicitly asked, and will <em>not</em> save the
project&rsquo;s list of modules <em>even if</em> explicitly asked? Well, I know now.) I am reaching the point where the tools are in
place and my focus will have to shift to helping agents use them, which means I am going to turn to skill writing at
some point in the near future.</p>
<p>I must admit, I am not entirely happy with the code quality of mops because I am letting agents (Codex/Astra these days)
write most of it. It does have tests, but some are of questionable utility. The code is not modularized the way I would
like, and despite having prompted most of the code into existence, I am not that familiar with it. I am however
deliberately trading off code quality for exploration at the moment (also known as taking on technical and cognitive
debt). After we reach <del>AGI</del> the state where mops can write editor tests on its own, I plan to pause and clean things
up.</p>
<p>I will be talking about mops at LangDev (confirmed) and at the MPS Community Meetup (pending acceptance). Let me know if
you are going to attend one of these events and want to meet for a chat.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Deduplication continued</title>
      <link>https://specificlanguages.com/posts/2026-09/07-deduplication-continued/</link>
      <pubDate>Mon, 07 Sep 2026 12:08:08 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-09/07-deduplication-continued/</guid>
      <description>&lt;p&gt;Continuing on my deduplication adventures that I wrote about
&lt;a href=&#34;https://specificlanguages.com/posts/2026-08/31-how-do-you-best-use-ai-to-find-duplicate-models/&#34;&gt;previously&lt;/a&gt;. It turns out, the client
does not need any structural similarity checks, and it is enough to just check the names for duplicates.&lt;/p&gt;
&lt;p&gt;As I wrote previously, I was unable to get the agent to look for duplicates without tooling. However, I must admit I
didn&amp;rsquo;t try too hard either. I probably could have altered the prompt or disabled all the tools but the problem is, I
wouldn&amp;rsquo;t be able to trust the reply too much. What if the model overlooks a clear duplicate? What if it hallucinates one
that is not there? Well, this last problem can be solved by asking the model for a proof and checking it by a
deterministic script. But as soon as deterministic scripts enter the picture, why not do more work in such a script and
only use the AI for the parts that cannot be automated?&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-09/07-deduplication-continued/"><![CDATA[ <p>Continuing on my deduplication adventures that I wrote about
<a href="https://specificlanguages.com/posts/2026-08/31-how-do-you-best-use-ai-to-find-duplicate-models/">previously</a>. It turns out, the client
does not need any structural similarity checks, and it is enough to just check the names for duplicates.</p>
<p>As I wrote previously, I was unable to get the agent to look for duplicates without tooling. However, I must admit I
didn&rsquo;t try too hard either. I probably could have altered the prompt or disabled all the tools but the problem is, I
wouldn&rsquo;t be able to trust the reply too much. What if the model overlooks a clear duplicate? What if it hallucinates one
that is not there? Well, this last problem can be solved by asking the model for a proof and checking it by a
deterministic script. But as soon as deterministic scripts enter the picture, why not do more work in such a script and
only use the AI for the parts that cannot be automated?</p>
<p>Thinking about the problem some more, I decided to ask the model to write a &ldquo;canonicalizing&rdquo; script: I give it a list of
German/English names such as &lsquo;DSGVO&rsquo;, &lsquo;Datenschutz-Grundverordnung&rsquo;, or &lsquo;GDPR&rsquo;, and out comes &ldquo;general data protection
regulation&rdquo;. This turns out to be a very simple deterministic script, all the difficulty lies in the data: you have to
have a German-English dictionary and a glossary of abbreviations.</p>
<p>So the hard problem is now reduced to providing this dictionary. And this is a task that should nowadays be solvable
even by a rather simple language model: &ldquo;Given the task of searching for duplicate names, this list of English/German
names, and this current dictionary/glossary, what entries are missing in the dictionary?&rdquo;</p>
<p>Overall, the reason for using a deterministic script rather than an LLM seems to be analogous to the reason to use a
machine instead of a human: machines are faster and more reliable than humans, but need some initial investment and
ongoing maintenance by humans. Deterministic scripts are faster and more reliable than LLMs but need some initial
investment and maintenance (by humans, but perhaps even LLMs would be enough?)</p>
<p>Anyway, the next step would be to set this up as a simple workflow/check, including regular dictionary updates and some
machinery to mark duplicates as acceptable.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How do you best use AI to find duplicate models?</title>
      <link>https://specificlanguages.com/posts/2026-08/31-how-do-you-best-use-ai-to-find-duplicate-models/</link>
      <pubDate>Mon, 31 Aug 2026 11:43:59 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-08/31-how-do-you-best-use-ai-to-find-duplicate-models/</guid>
      <description>&lt;p&gt;A client of mine is modeling components in MPS. They are a large, multinational manufacturing company, so they have
hundreds to thousands of them. Some are fully fleshed out, some are just stubs that have nothing but a name. The
modeling task is split across several teams, and two teams may end up modeling the same component, for example, one that
they need as a dependency.&lt;/p&gt;
&lt;p&gt;How do we detect these duplicates? It sounds like a fairly simple problem, just collect them and check for similar
names. It is, however, made complicated by the fact that one team may choose to model the components in English while
another models them in German. Or one team uses an abbreviation and the other spells out the full name. Language
translation is something that large language models have always been good for, so it feels obvious that AI could be part
of the solution. But what should be its place exactly?&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-08/31-how-do-you-best-use-ai-to-find-duplicate-models/"><![CDATA[ <p>A client of mine is modeling components in MPS. They are a large, multinational manufacturing company, so they have
hundreds to thousands of them. Some are fully fleshed out, some are just stubs that have nothing but a name. The
modeling task is split across several teams, and two teams may end up modeling the same component, for example, one that
they need as a dependency.</p>
<p>How do we detect these duplicates? It sounds like a fairly simple problem, just collect them and check for similar
names. It is, however, made complicated by the fact that one team may choose to model the components in English while
another models them in German. Or one team uses an abbreviation and the other spells out the full name. Language
translation is something that large language models have always been good for, so it feels obvious that AI could be part
of the solution. But what should be its place exactly?</p>
<p>I decided to start simple: let&rsquo;s export all components to a text file, feed the file to the LLM and ask it if it sees
any duplicates. In fact, even simpler: let&rsquo;s just export the component <em>names</em>, paste them in, and ask the LLM to
canonicalize them by translating from German to English and expanding abbreviations where possible.</p>
<p>Sounds trivial? Well, not so fast. One does not simply paste a 3,000-line file into a Copilot prompt. Copilot just stows
it away in some session-specific directory and tells the agent where it is. This is basically the same as @-mentioning
it in the prompt. The result is that the LLM only sees the file name and instead of trying to produce an answer from
context, it reads a few hundred lines to understand what it&rsquo;s up against, then rolls up its sleeves and starts writing
Python scripts. Just like a real, lazy programmer: it&rsquo;s far more interesting to spend a day writing a script that takes
a minute to run, than producing an answer in five minutes. (Of course, being a lazy programmer myself, I kind of
empathize and agree with the approach. Especially since my goal is to automate this and run it repeatedly, so I welcome
deterministic scripts.)</p>
<p>Interestingly, in the scripts it writes, it <em>will</em> include a small German-English dictionary, based on the actual words
it encounters in the input. So this gave me another idea: structure the workflow so that we do as much mechanical work
as possible outside of the LLM, and only give the LLM a simple, focused translation task. This kind of goes against The
Bitter Lesson (which says that general-purpose methods will outperform special-purpose human-engineered approaches given
enough compute), but I guess that lesson applies only as a macro trend, not on a micro scale.</p>
<p>All this was just dealing with the names. Who knows, maybe in the end just using some structural similarity score will
fare better. We&rsquo;ll see next time.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>mops demo recording</title>
      <link>https://specificlanguages.com/posts/2026-07/16-mops-demo-recording/</link>
      <pubDate>Thu, 16 Jul 2026 17:34:59 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-07/16-mops-demo-recording/</guid>
      <description>&lt;p&gt;If you missed today’s mops demo, the recording is
&lt;a href=&#34;https://drive.google.com/file/d/1O4kRz9rHrrbDLe4Rjt2FMzSSYkNBDlbm/view?usp=drivesdk&#34;&gt;now available&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We covered the functionality, architecture, and future plans for mops, as well as why mops was created and how it is
different to other approaches.&lt;/p&gt;
&lt;p&gt;If you have any comments or questions, just reply to this email.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-07/16-mops-demo-recording/"><![CDATA[ <p>If you missed today’s mops demo, the recording is
<a href="https://drive.google.com/file/d/1O4kRz9rHrrbDLe4Rjt2FMzSSYkNBDlbm/view?usp=drivesdk">now available</a>.</p>
<p>We covered the functionality, architecture, and future plans for mops, as well as why mops was created and how it is
different to other approaches.</p>
<p>If you have any comments or questions, just reply to this email.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>mops demo this Thursday at 14:30 CEST</title>
      <link>https://specificlanguages.com/posts/2026-07/13-mops-demo-this-thursday/</link>
      <pubDate>Mon, 13 Jul 2026 22:10:00 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-07/13-mops-demo-this-thursday/</guid>
      <description>&lt;p&gt;I would like to invite you to the demo of mops (MPS OPerationS), a command-line tool for working with MPS projects. As I
have mentioned a few times, I believe that a command-line tool is more versatile than an MCP server, and I have tried to
design mops to be useful not only to agents but also to humans.&lt;/p&gt;
&lt;p&gt;In the demo I will show how mops works, how it can be used by agents and humans, and where I would like to take it.
There will also be time to answer your questions.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-07/13-mops-demo-this-thursday/"><![CDATA[ <p>I would like to invite you to the demo of mops (MPS OPerationS), a command-line tool for working with MPS projects. As I
have mentioned a few times, I believe that a command-line tool is more versatile than an MCP server, and I have tried to
design mops to be useful not only to agents but also to humans.</p>
<p>In the demo I will show how mops works, how it can be used by agents and humans, and where I would like to take it.
There will also be time to answer your questions.</p>
<p>The demo will take place in the usual MPS Office Hours Google Meet on Thursday, July 16th, at 14:30 CEST. The meeting
will be recorded.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>MPS pre-commit hooks</title>
      <link>https://specificlanguages.com/posts/2026-06/29-mps-pre-commit-hooks/</link>
      <pubDate>Mon, 29 Jun 2026 14:56:38 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-06/29-mps-pre-commit-hooks/</guid>
      <description>&lt;p&gt;I have started a repository with pre-commit hooks for MPS,
&lt;a href=&#34;https://github.com/specificlanguages/mps-pre-commit-hooks&#34;&gt;specificlanguages/pre-commit-hooks&lt;/a&gt;, designed for use with
&lt;a href=&#34;https://pre-commit.com&#34;&gt;pre-commit&lt;/a&gt; or &lt;a href=&#34;https://prek.j178.dev&#34;&gt;prek&lt;/a&gt; (preferred).&lt;/p&gt;
&lt;p&gt;MPS pre-commit hooks are Python scripts that do not launch MPS but inspect files directly. This makes them complementary
to MPS model checks. Hooks are much faster but they cannot check domain logic. Rather, they focus on checking the basic
shape of the project for consistency.&lt;/p&gt;
&lt;p&gt;For example, hooks can check for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;zero-length XML files (caused by MPS misresolving deleted/modified conflicts),&lt;/li&gt;
&lt;li&gt;modules present in the repository but missing from the MPS project,&lt;/li&gt;
&lt;li&gt;modules present in the MPS project but missing on disk,&lt;/li&gt;
&lt;li&gt;modules present in the repository but not mentioned in any MPS build script,&lt;/li&gt;
&lt;li&gt;models present on disk but not mentioned in any model root (e.g. leftover generator models),&lt;/li&gt;
&lt;li&gt;modules whose file/directory name does not match their name in MPS,&lt;/li&gt;
&lt;li&gt;path variables used in &lt;code&gt;modules.xml&lt;/code&gt; or &lt;code&gt;libraries.xml&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am currently setting up the mbeddr platform build to use them (see PR
&lt;a href=&#34;https://github.com/mbeddr/mbeddr.core/pull/3466&#34;&gt;mbeddr/mbeddr.core#3466&lt;/a&gt;). On this repository they only take about a
second or so to run, and detect many consistency issues that have accumulated over the years.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-06/29-mps-pre-commit-hooks/"><![CDATA[ <p>I have started a repository with pre-commit hooks for MPS,
<a href="https://github.com/specificlanguages/mps-pre-commit-hooks">specificlanguages/pre-commit-hooks</a>, designed for use with
<a href="https://pre-commit.com">pre-commit</a> or <a href="https://prek.j178.dev">prek</a> (preferred).</p>
<p>MPS pre-commit hooks are Python scripts that do not launch MPS but inspect files directly. This makes them complementary
to MPS model checks. Hooks are much faster but they cannot check domain logic. Rather, they focus on checking the basic
shape of the project for consistency.</p>
<p>For example, hooks can check for:</p>
<ul>
<li>zero-length XML files (caused by MPS misresolving deleted/modified conflicts),</li>
<li>modules present in the repository but missing from the MPS project,</li>
<li>modules present in the MPS project but missing on disk,</li>
<li>modules present in the repository but not mentioned in any MPS build script,</li>
<li>models present on disk but not mentioned in any model root (e.g. leftover generator models),</li>
<li>modules whose file/directory name does not match their name in MPS,</li>
<li>path variables used in <code>modules.xml</code> or <code>libraries.xml</code>,</li>
<li>and so on.</li>
</ul>
<p>I am currently setting up the mbeddr platform build to use them (see PR
<a href="https://github.com/mbeddr/mbeddr.core/pull/3466">mbeddr/mbeddr.core#3466</a>). On this repository they only take about a
second or so to run, and detect many consistency issues that have accumulated over the years.</p>
<p>If you are interested in trying them out, install <a href="https://prek.j178.dev">prek</a> and add a <code>.pre-commit-config.yaml</code> to
your repository with this contents:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">repos</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">repo</span>: <span style="color:#ae81ff">https://github.com/specificlanguages/mps-pre-commit-hooks</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">rev</span>: <span style="color:#ae81ff">v0.1.0</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">hooks</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-orphan-modules</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-unbuilt-modules</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-missing-modules</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-orphan-models</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-orphan-mpsr-files</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-zero-sized-xmls</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-module-naming</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">id</span>: <span style="color:#ae81ff">mps-check-path-variables</span>
</span></span></code></pre></div><p>Then run <code>prek install</code> in the repository to have the hooks run on the files changed in a commit. If you want to run
hooks on all files, run <code>prek run -a</code>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Benchmarking AI tools for MPS</title>
      <link>https://specificlanguages.com/posts/2026-06/19-mps-ai-benchmark-harness/</link>
      <pubDate>Fri, 19 Jun 2026 09:20:07 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-06/19-mps-ai-benchmark-harness/</guid>
      <description>&lt;p&gt;As I mentioned &lt;a href=&#34;https://specificlanguages.com/posts/2026-05/13-what-ai-agents-can-do-in-mps/&#34;&gt;earlier&lt;/a&gt;, I am developing
&lt;a href=&#34;https://github.com/specificlanguages/mops&#34;&gt;a CLI tool for MPS&lt;/a&gt;. JetBrains has also been at work developing their own
tool set,
&lt;a href=&#34;https://www.jetbrains.com/help/mps/2026.1/mps-projectional-agent-toolkit.html#practical-ideas&#34;&gt;Projectional Agent Toolkit&lt;/a&gt;,
available now in MPS 2026.1 RC1. At the same time, there have been
&lt;a href=&#34;https://platform.jetbrains.com/t/ai-coding-assistents-dsls-and-mps/3709/9&#34;&gt;reports&lt;/a&gt; that the no-tooling baseline is
already quite powerful with the state-of-the-art models (GPT 5.5 and Opus 4.8). In fact, giving the agent a bad tool may
hurt performance: the tool may confuse the agent and cause it to run in circles without making progress. Whether a tool
hinders or helps thus depends on the agent harness, the model being used, the tool itself, and the task given to the
agent.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-06/19-mps-ai-benchmark-harness/"><![CDATA[ <p>As I mentioned <a href="https://specificlanguages.com/posts/2026-05/13-what-ai-agents-can-do-in-mps/">earlier</a>, I am developing
<a href="https://github.com/specificlanguages/mops">a CLI tool for MPS</a>. JetBrains has also been at work developing their own
tool set,
<a href="https://www.jetbrains.com/help/mps/2026.1/mps-projectional-agent-toolkit.html#practical-ideas">Projectional Agent Toolkit</a>,
available now in MPS 2026.1 RC1. At the same time, there have been
<a href="https://platform.jetbrains.com/t/ai-coding-assistents-dsls-and-mps/3709/9">reports</a> that the no-tooling baseline is
already quite powerful with the state-of-the-art models (GPT 5.5 and Opus 4.8). In fact, giving the agent a bad tool may
hurt performance: the tool may confuse the agent and cause it to run in circles without making progress. Whether a tool
hinders or helps thus depends on the agent harness, the model being used, the tool itself, and the task given to the
agent.</p>
<p>This has left me wondering how I can properly evaluate whether a tool is beneficial or harmful for certain tasks. So
far, I have been evaluating the performance of my tooling manually. I asked the developers of other MPS AI tooling how
they were approaching the measurements of their tools, and the answer has been the same: we run it and observe what it
does. While this is certainly a possible and in some cases good enough approach, I felt the need for a more
reproducible, automated, and overall rigorous approach.</p>
<p>This is why I have spent the past several weeks developing a harness for benchmarking MPS tooling. The tool lets you
start from a known good state (reproducibility), set up MPS in a way that helps the tools run unattended (automation),
and record the results: the final state on disk, the session transcript, and the metadata such as the versions of MPS
and the coding agent used, the token count and the estimated cost (rigor).</p>
<p>Running a first benchmark with the harness showed that, on a simple prompt to write a Java method manipulating some
nodes in the project, the agent did better with tooling than without, and more consistently so, but at almost double the
cost.</p>
<table>
	<thead>
			<tr>
					<th>Condition</th>
					<th>Rep</th>
					<th>Score</th>
					<th style="text-align: right">Duration</th>
					<th style="text-align: right">Cost</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>baseline</td>
					<td>rep1</td>
					<td>14/20</td>
					<td style="text-align: right">28m42s</td>
					<td style="text-align: right">$9.14</td>
			</tr>
			<tr>
					<td>baseline</td>
					<td>rep2</td>
					<td>5/20</td>
					<td style="text-align: right">27m44s</td>
					<td style="text-align: right">$8.92</td>
			</tr>
			<tr>
					<td>baseline</td>
					<td>rep3</td>
					<td>11/20</td>
					<td style="text-align: right">31m17s</td>
					<td style="text-align: right">$5.89</td>
			</tr>
			<tr>
					<td>mps-mcp</td>
					<td>rep1</td>
					<td>14/20</td>
					<td style="text-align: right">21m50s</td>
					<td style="text-align: right">$9.15</td>
			</tr>
			<tr>
					<td>mps-mcp</td>
					<td>rep2</td>
					<td>15/20</td>
					<td style="text-align: right">39m24s</td>
					<td style="text-align: right">$13.37</td>
			</tr>
			<tr>
					<td>mps-mcp</td>
					<td>rep3</td>
					<td>15/20</td>
					<td style="text-align: right">37m44s</td>
					<td style="text-align: right">$20.09</td>
			</tr>
	</tbody>
</table>
<p>However, the results can definitely provoke many objections:</p>
<ul>
<li>The task should have been more complex.</li>
<li>The prompt should have been less ambiguous.</li>
<li>The tooling has evolved, a newer version should have been used.</li>
<li>The setup was wrong and was missing parameter <code>foo</code>.</li>
<li>A different model should have been used.</li>
<li>A different agent should have been used.</li>
<li>The results should be scored differently – in my view, for example, the baseline was almost as good as mps-mcp on this
particular task, even though the scores suggest otherwise.</li>
</ul>
<p>Instead, I invite you to check out the harness and try it yourself. The harness is available on GitHub under
<a href="https://github.com/specificlanguages/mps-ai-benchmarks">specificlanguages/mps-ai-benchmarks</a>. Check it out,
<a href="https://github.com/specificlanguages/mps-ai-benchmarks#setup">set it up</a> and let it run.</p>
<p>I have developed it with the help of Fable 5 (during the few days it was available) and Opus 4.8, in Claude Code. It is
a set of Python and Bash scripts, currently only supporting macOS and Claude Code. However, support for other operating
systems, agents, and tools is probably a single prompt away.</p>
<p>So far this is 99 % vibe-coded, I have let agents write all of the code and documentation and decide upon the
architecture. If it catches on, I will invest some time in refactoring it.</p>
<p>If you have questions or want help with running the benchmarks, I&rsquo;m happy to help by email, on Slack, or in <a href="https://specificlanguages.com/services/mps-office-hours/">office
hours</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Does AI make MPS obsolete?</title>
      <link>https://specificlanguages.com/posts/2026-05/14-does-ai-make-mps-obsolete/</link>
      <pubDate>Thu, 14 May 2026 11:26:46 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-05/14-does-ai-make-mps-obsolete/</guid>
      <description>&lt;p&gt;As I described &lt;a href=&#34;https://specificlanguages.com/posts/2026-05/13-what-ai-agents-can-do-in-mps/&#34;&gt;yesterday&lt;/a&gt;, I tried coding agents for the first time at
the beginning of this year. Like many, I was impressed by their capabilities. An agent was able to produce non-trivial
functioning pieces of software for me based on natural language prompting, leaving me to wonder, like probably many of
us, whether I am going to be out of work soon.&lt;/p&gt;
&lt;p&gt;I have also had several contacts admit to me that they are considering moving away from MPS towards more mainstream
languages to make use of the newly available AI capabilities. Instead of generating code from MPS, they would generate
code by talking to AI.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-05/14-does-ai-make-mps-obsolete/"><![CDATA[ <p>As I described <a href="https://specificlanguages.com/posts/2026-05/13-what-ai-agents-can-do-in-mps/">yesterday</a>, I tried coding agents for the first time at
the beginning of this year. Like many, I was impressed by their capabilities. An agent was able to produce non-trivial
functioning pieces of software for me based on natural language prompting, leaving me to wonder, like probably many of
us, whether I am going to be out of work soon.</p>
<p>I have also had several contacts admit to me that they are considering moving away from MPS towards more mainstream
languages to make use of the newly available AI capabilities. Instead of generating code from MPS, they would generate
code by talking to AI.</p>
<p>I was left to wonder whether I should consider a different specialization. Instead of continuing to work with MPS and
around its numerous quirks, should we all switch to writing Kotlin and TypeScript and go find ourselves new jobs as
full-stack developers?</p>
<p>After some time and experience, I think I can now give the traditional answer to the title question: it depends.</p>
<p>I believe the recent advances in LLMs and coding agents make the weakest case for MPS even weaker: using it mainly as an
expensive boilerplate generator when the domain structure is shallow. If the model is little more than a description of
database entities for a CRUD application, MPS was probably not the right tool in the first place. Recent AI advances
only make that clearer.</p>
<p>However, most of the value of MPS has never been in just generating code. MPS is most valuable when the hard part is not
producing text but maintaining a model of a complex domain over time. Its utility comes from things like:</p>
<ul>
<li>structure: explicitly defined concepts with typed properties, children, and references;</li>
<li>constraints, typesystem and checking rules;</li>
<li>rich projectional editing with tables, diagrams, go-to-reference navigations, including in diffs;</li>
<li>custom IDE support with actions;</li>
<li>scripting;</li>
<li>migrations;</li>
<li>generators.</li>
</ul>
<p>AI makes boilerplate code generation less special, but it does not replace the maintenance value of explicit domain
structure, executable checks, or migrations.</p>
<p>With MPS, you encode the domain knowledge in the language definitions and models, not in the generated code. The models
and language definitions are what you maintain. With AI-generated code the knowledge moves to the generated code itself,
potentially into Markdown documents, or in the worst case into the developers&rsquo; heads. The AI-written code, along with
the documentation, now has to be understood, reviewed, changed, and deleted. This means that your agent had
better help you reduce maintenance costs, not just generate more code faster, as James Shore argues in his
article, <a href="https://www.jamesshore.com/v2/blog/2026/you-need-ai-that-reduces-your-maintenance-costs">You Need AI That Reduces Maintenance Costs</a>.</p>
<p>Thus, we can say that AI narrows the case for MPS mostly by removing weak arguments for it. MPS remains relevant for
complex domains where the value is in domain modeling, controlled maintenance and evolution.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
