<?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/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>SDD on Aotokitsuruya is learning</title><link>https://blog.aotoki.me/en/tags/SDD/</link><description>Recent content in SDD on Aotokitsuruya is learning</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>contact@aotoki.me (Aotokitsuruya)</managingEditor><webMaster>contact@aotoki.me (Aotokitsuruya)</webMaster><lastBuildDate>Mon, 24 Aug 2026 20:52:28 +0800</lastBuildDate><atom:link href="https://blog.aotoki.me/en/tags/SDD/index.xml" rel="self" type="application/rss+xml"/><item><title>Sumitsubo: Turning Specs into a Linter</title><link>https://blog.aotoki.me/en/posts/2026/08/26/sumitsubo-spec-as-linter/</link><category>LLM</category><category>AI</category><category>Experience</category><category>Ruby</category><category>SDD</category><pubDate>Wed, 26 Aug 2026 00:00:00 +0800</pubDate><author>contact@aotoki.me (Aotokitsuruya)</author><guid>https://blog.aotoki.me/en/posts/2026/08/26/sumitsubo-spec-as-linter/</guid><description>&lt;p&gt;Midway through building &lt;a href="https://github.com/elct9620/kobako"&gt;Kobako&lt;/a&gt;, the question of whether the spec and the implementation were still aligned kept bothering me. Spec-Driven Development is ideal in theory, but language models are not deterministic by design, and even with a spec to refer to they still drift, or leave things out.&lt;/p&gt;
&lt;p&gt;So &lt;a href="https://github.com/elct9620/sumitsubo"&gt;Sumitsubo&lt;/a&gt; came together recently as a general-purpose checking tool.&lt;/p&gt;</description><content:encoded>&lt;p&gt;Midway through building &lt;a href="https://github.com/elct9620/kobako"&gt;Kobako&lt;/a&gt;, the question of whether the spec and the implementation were still aligned kept bothering me. Spec-Driven Development is ideal in theory, but language models are not deterministic by design, and even with a spec to refer to they still drift, or leave things out.&lt;/p&gt;
&lt;p&gt;So &lt;a href="https://github.com/elct9620/sumitsubo"&gt;Sumitsubo&lt;/a&gt; came together recently as a general-purpose checking tool.&lt;/p&gt;
&lt;h2 id="ideal-and-real"&gt;The Ideal and the Reality&lt;/h2&gt;
&lt;p&gt;Proving that a spec has actually been implemented is hard to confirm efficiently unless you run the thing and read the source yourself, and it only gets harder once the project grows and becomes more complex.&lt;/p&gt;
&lt;p&gt;If we want work that resists mechanization to have a chance of being handled mechanically, structured data is a good option. Anthropic&amp;rsquo;s &lt;a href="https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents"&gt;Effective harnesses for long-running agents&lt;/a&gt; last year happened to show one promising possibility, registering the spec as JSON and then letting Claude Code implement it.&lt;/p&gt;
&lt;p&gt;In practice this still cannot guarantee perfect coverage, but it at least proves that maintaining JSON is no longer difficult for AI. Maintaining features according to what the JSON says is reasonably stable, and it runs smoothly enough for most of the features to get implemented.&lt;/p&gt;
&lt;p&gt;Ideally there would be some magical way to map a piece of natural language onto a piece of implementation, but that is hard to pull off in reality. Taking a step back and using a &amp;ldquo;claim&amp;rdquo; instead, letting the AI assert that a given spec has been implemented, is an acceptable consideration in the trade-off between checking nothing at all and checking perfectly.&lt;/p&gt;
&lt;h2 id="guide-the-agent"&gt;Guiding the Agent&lt;/h2&gt;
&lt;p&gt;Before Sumitsubo existed, Kobako checked things with an &amp;ldquo;anchor&amp;rdquo; mechanism. When the spec defined behavior &lt;code&gt;B-25&lt;/code&gt;, that &lt;code&gt;B-25&lt;/code&gt; had to appear at least once in a test comment to pass, which to some extent nudged the AI into working out why a feature the spec mentioned had no test covering it.&lt;/p&gt;
&lt;p&gt;Moving to Sumitsubo, the approach became a &amp;ldquo;behavior marking&amp;rdquo; implemented in a BDD (Behavior-Driven Development) style paired with an identifier. This is not a new idea, Gherkin has its own &lt;code&gt;@B-25&lt;/code&gt; tagging mechanism, but I turned the manual maintenance into something the AI handles.&lt;/p&gt;
&lt;div class="codeblock not-prose" data-controller="codeblock"&gt;
&lt;div data-codeblock-target="code"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Behavior&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;The scenarios a project declares, and where each one sits.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;include&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;test/behavior_test.rb&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;scenarios&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;B-001&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;What the directory declares, and where&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;given&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;a behavior directory holding more than one specification&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;when&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;the directory is loaded&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;then&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;every scenario answers with the line of the file that declares it&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="codeblock__copy"
data-action="codeblock#copy"
data-codeblock-target="button"
data-copy-text="Copy"
data-copied-text="Copied!"
data-copy-label="Copy code to clipboard"
data-copied-label="Code copied to clipboard"
aria-label="Copy code to clipboard"&gt;
Copy
&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;Above is one of the behavior rules Sumitsubo maintains for itself, kept under the &lt;code&gt;.spec/behavior/&lt;/code&gt; directory. &lt;code&gt;B-001&lt;/code&gt; confirms that every spec gets loaded, so in &lt;code&gt;behavior_test.rb&lt;/code&gt; you can find a marking like this.&lt;/p&gt;
&lt;div class="codeblock not-prose" data-controller="codeblock"&gt;
&lt;div data-codeblock-target="code"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# @behavior B-001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--- what the directory declares, and where ---&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="no"&gt;Sumitsubo&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Behavior&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test/fixtures/behavior/.spec/behavior&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;includes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scenarios&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; given &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; when &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; then &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;scenario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="codeblock__copy"
data-action="codeblock#copy"
data-codeblock-target="button"
data-copy-text="Copy"
data-copied-text="Copied!"
data-copy-label="Copy code to clipboard"
data-copied-label="Code copied to clipboard"
aria-label="Copy code to clipboard"&gt;
Copy
&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;This way the AI shows for itself that &amp;ldquo;I have tested this rule&amp;rdquo; rather than saying so with nothing to back it up. Without the behavior marking, &lt;code&gt;sumi verify&lt;/code&gt; reports a message like this&lt;/p&gt;
&lt;div class="codeblock not-prose" data-controller="codeblock"&gt;
&lt;div data-codeblock-target="code"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;$ sumi verify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;.spec/behavior/behavior.json:6 @behavior B-001 is claimed nowhere in test/*_test.rb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt; differences&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="codeblock__copy"
data-action="codeblock#copy"
data-codeblock-target="button"
data-copy-text="Copy"
data-copied-text="Copied!"
data-copy-label="Copy code to clipboard"
data-copied-label="Code copied to clipboard"
aria-label="Copy code to clipboard"&gt;
Copy
&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;During implementation the AI then notices the missing piece on its own and goes on to add a test for it, which gives some degree of confidence that a given spec has been tested at least once.&lt;/p&gt;
&lt;p&gt;In practice the marking only says the test claims to cover that spec, it does not guarantee the test really verifies it. This is still a claim rather than a proof, but compared with having no correspondence at all, the gap at least becomes visible.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The test above looks the way it does because it uses &lt;a href="https://github.com/matz/spinel"&gt;Spinel&lt;/a&gt;, the new project Matz announced at RubyKaigi in Japan this year, which compiles Ruby into C ahead of time and then turns it into a static executable. The test therefore runs the real executable and compares its output instead of verifying with assertions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="auto-spec"&gt;Specs That Maintain Themselves&lt;/h2&gt;
&lt;p&gt;Building Sumitsubo made me wonder whether Spec-Driven Development is still necessary, or whether it will really fade away as Harness Engineering matures, because I noticed something quite interesting once Sumitsubo was used to check itself.&lt;/p&gt;
&lt;p&gt;The reason we moved toward spec first and implementation second was that code alone is too hard to understand, and in past software development experience documentation and implementation were very hard to keep aligned. In the AI era that alignment is achievable to some degree, so spec first really did become a sensible mechanism, especially when AI was weaker and the guidance mattered.&lt;/p&gt;
&lt;p&gt;While building Sumitsubo, though, I wanted it to maintain its own spec using itself, so I deliberately did not start from &lt;code&gt;SPEC.md&lt;/code&gt; (my preferred spec document) and went from scratch instead. Once the behavior marking mechanism was set up on the project together with a Claude Code Hook, the AI was able to spot spec discrepancies and correct them on its own.&lt;/p&gt;
&lt;p&gt;For example, Sumitsubo&amp;rsquo;s &amp;ldquo;marking&amp;rdquo; mechanism records a rule that a comment with no code after it does not count as a marking. When I started adding Rust support for Kobako and abstracted out the concept of &lt;code&gt;Language&lt;/code&gt;, the AI noticed on its own that this rule sat more sensibly with the language behavior than the marking behavior, and went ahead and adjusted the markings, revised the behaviors, and so on.&lt;/p&gt;
&lt;p&gt;When the tooling is in place, designed properly that is, perhaps many of the mechanisms that rely on prompts are what actually constrain the AI. Suppose we hand it a systematic tool for maintaining specs, then an instruction as simple as &amp;ldquo;use &lt;code&gt;sumi verify&lt;/code&gt; to check the spec&amp;rdquo; might be enough to keep most of the spec in good shape.&lt;/p&gt;
&lt;p&gt;I am a fairly firm believer in Spec-Driven Development, yet once I turned the spec into something verifiable, a linter, I genuinely started to doubt it. I am still not sure how this will develop, but it is certainly a new direction worth trying.&lt;/p&gt;</content:encoded></item></channel></rss>