<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutorial on PHP Boy Scout</title><link>https://phpboyscout.uk/tags/tutorial/</link><description>Recent content in Tutorial on PHP Boy Scout</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><copyright>Matt Cockayne</copyright><lastBuildDate>Thu, 27 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://phpboyscout.uk/tags/tutorial/index.xml" rel="self" type="application/rss+xml"/><item><title>Your first run with skillup</title><link>https://phpboyscout.uk/your-first-run-with-skillup/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://phpboyscout.uk/your-first-run-with-skillup/</guid><description>&lt;img src="https://phpboyscout.uk/your-first-run-with-skillup/cover-your-first-run-with-skillup.png" alt="Featured image of post Your first run with skillup" /&gt;&lt;p&gt;There&amp;rsquo;s a particular kind of bug I&amp;rsquo;ve grown to dislike more than the ones that crash.&lt;/p&gt;
&lt;p&gt;I publish a handful of Claude Code plugins from a marketplace, five segments of skills and commands that other people install. Both harnesses cache them by &lt;code&gt;&amp;lt;marketplace&amp;gt;/&amp;lt;plugin&amp;gt;/&amp;lt;version&amp;gt;&lt;/code&gt;, and neither of them resolves a git ref. So if I improve a skill, commit it, push it, and forget to move the version in its manifest&amp;hellip; the change is sat there on &lt;code&gt;main&lt;/code&gt;, looking for all the world like it shipped, and reaching precisely nobody.&lt;/p&gt;
&lt;p&gt;No error. No warning. Nothing red anywhere. Just a thing I thought I&amp;rsquo;d released that nobody has.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;skillup&lt;/code&gt; is the small tool that catches that, and this is ten minutes in a throwaway directory watching it happen and then stopping it. Nothing here touches a real repository.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You&amp;rsquo;ll need&lt;/strong&gt; Go 1.26.5 or newer, and git.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;This is the canonical walkthrough from the skillup docs, reproduced here so the two don&amp;rsquo;t drift. The docs are the source of truth: &lt;strong&gt;&lt;a class="link" href="https://skillup.phpboyscout.uk/tutorials/first-run/" target="_blank" rel="noopener"
 &gt;https://skillup.phpboyscout.uk/tutorials/first-run/&lt;/a&gt;&lt;/strong&gt;. Every command and every output below was validated by actually running it.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="1-install-it"&gt;1. Install it
&lt;/h2&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="cl"&gt;go install gitlab.com/phpboyscout/skillup/cmd/skillup@v0.1.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check it runs. &lt;code&gt;$(go env GOPATH)/bin&lt;/code&gt; needs to be on your &lt;code&gt;PATH&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; skillup --help
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Version the segments of a Claude Code plugin marketplace
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Usage:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; skillup [command]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Available Commands:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; apply skillup apply
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; check skillup check
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; completion Generate the autocompletion script for the specified shell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; help Help about any command
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; plan skillup plan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; tag skillup tag
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; version Print version, commit, and build date
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No Go toolchain, or you&amp;rsquo;d rather build from a clone? See &lt;a class="link" href="https://skillup.phpboyscout.uk/how-to/install/" target="_blank" rel="noopener"
 &gt;Install skillup&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="2-make-a-marketplace-to-point-it-at"&gt;2. Make a marketplace to point it at
&lt;/h2&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="cl"&gt;mkdir -p /tmp/demo/plugins/alpha/.claude-plugin /tmp/demo/.claude-plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/demo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init -q .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; .claude-plugin/marketplace.json &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;JSON&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;name&amp;#34;: &amp;#34;demo&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;owner&amp;#34;: { &amp;#34;name&amp;#34;: &amp;#34;you&amp;#34; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;plugins&amp;#34;: [{ &amp;#34;name&amp;#34;: &amp;#34;alpha&amp;#34;, &amp;#34;source&amp;#34;: &amp;#34;./plugins/alpha&amp;#34; }]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; plugins/alpha/.claude-plugin/plugin.json &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;JSON&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;name&amp;#34;: &amp;#34;alpha&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;description&amp;#34;: &amp;#34;A demo segment&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;version&amp;#34;: &amp;#34;0.3.0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add -A &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit -qm &lt;span class="s2"&gt;&amp;#34;chore: seed the marketplace&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One segment, at &lt;code&gt;0.3.0&lt;/code&gt;, and &lt;strong&gt;no tags anywhere&lt;/strong&gt;. Hold onto that, it matters at the end.&lt;/p&gt;
&lt;h2 id="3-ask-what-should-happen"&gt;3. Ask what should happen
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; skillup plan --path .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; every segment is at the version its commits warrant
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nothing has changed since the manifest was written, so there&amp;rsquo;s nothing to do.&lt;/p&gt;
&lt;h2 id="4-make-a-change-the-way-you-normally-would"&gt;4. Make a change, the way you normally would
&lt;/h2&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="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;a new capability&amp;#34;&lt;/span&gt; &amp;gt; plugins/alpha/feature.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add -A &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit -qm &lt;span class="s2"&gt;&amp;#34;feat(alpha): add a capability&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now ask again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; skillup plan --path .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; alpha 0.3.0 -&amp;gt; 0.4.0 (minor, 1 commit(s))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A &lt;code&gt;feat:&lt;/code&gt; earns a &lt;strong&gt;minor&lt;/strong&gt;. Had you written &lt;code&gt;fix:&lt;/code&gt;, it&amp;rsquo;d say &lt;code&gt;0.3.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And this is the moment the whole tool exists for.&lt;/strong&gt; If you pushed now, the content would be on the branch and the version would still say &lt;code&gt;0.3.0&lt;/code&gt;, and because both harnesses cache by version, nobody would ever receive it.&lt;/p&gt;
&lt;h2 id="5-watch-the-gate-fail"&gt;5. Watch the gate fail
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;check&lt;/code&gt; is what CI runs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; skillup check --path .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; alpha is 0.3.0 but its commits warrant 0.4.0 (minor)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; ac7f4ad9 feat(alpha): add a capability (minor)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; To fix, on your branch:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; skillup apply --path .
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; git add -u &amp;amp;&amp;amp; git commit --amend --no-edit # or a new commit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; The version is what ships a segment: both harnesses cache by
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; &amp;lt;marketplace&amp;gt;/&amp;lt;plugin&amp;gt;/&amp;lt;version&amp;gt; and neither resolves a git ref, so a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; version that does not move withholds your change from every consumer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;2026/08/13 06:56:44 ERRO a segment&amp;#39;s version is behind what its commits warrant
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Worth noticing where the instruction sits: &lt;strong&gt;above&lt;/strong&gt; the error, not below it. In a CI log the last line is a red &lt;code&gt;ERRO&lt;/code&gt;, and whoever scrolls to it is looking for something to do rather than a diagnosis. Putting the fix underneath would have been tidier and less useful.&lt;/p&gt;
&lt;h2 id="6-fix-it"&gt;6. Fix it
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; skillup apply --path .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; alpha 0.3.0 -&amp;gt; 0.4.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look at what changed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; git diff
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;- &amp;#34;version&amp;#34;: &amp;#34;0.3.0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;+ &amp;#34;version&amp;#34;: &amp;#34;0.4.0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;One line.&lt;/strong&gt; The rest of the manifest is untouched, byte for byte, which is the difference between a tool you let near your files and one you don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Commit it with the change that earned it:&lt;/p&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="cl"&gt;git add -u &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit -q --amend --no-edit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; skillup check --path . &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; every segment is at the version its commits warrant
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="7-nothing-was-ever-tagged"&gt;7. Nothing was ever tagged
&lt;/h2&gt;&lt;p&gt;You never created a tag, and it never asked for one. skillup worked out the previous version by reading the git history of &lt;code&gt;plugins/alpha/.claude-plugin/plugin.json&lt;/code&gt;, finding the commit where that version last changed.&lt;/p&gt;
&lt;p&gt;Prove it by making another change:&lt;/p&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="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;a fix&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; plugins/alpha/feature.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add -A &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit -qm &lt;span class="s2"&gt;&amp;#34;fix(alpha): correct it&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;skillup plan --path .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; alpha 0.4.0 -&amp;gt; 0.4.1 (patch, 1 commit(s))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It counted from &lt;code&gt;0.4.0&lt;/code&gt;, the version you committed a minute ago, not from the &lt;code&gt;0.3.0&lt;/code&gt; you started with. The manifest&amp;rsquo;s own history is the baseline, which is why an untagged repository is a perfectly good input&amp;hellip; and if you don&amp;rsquo;t believe me, &lt;code&gt;git tag&lt;/code&gt; in that directory prints nothing at all.&lt;/p&gt;
&lt;h2 id="clean-up"&gt;Clean up
&lt;/h2&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="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; .. &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf /tmp/demo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-failure-its-actually-guarding"&gt;The failure it&amp;rsquo;s actually guarding
&lt;/h2&gt;&lt;p&gt;Every other release tool I&amp;rsquo;ve used protects you from shipping something broken. This one protects against shipping something that works perfectly and never arrives, which is a harder failure to notice and a much more annoying one to debug three weeks later when somebody mentions the feature they still haven&amp;rsquo;t got.&lt;/p&gt;
&lt;p&gt;Once it&amp;rsquo;s a CI gate, the version simply cannot fall behind the commits, and I stop having to remember.&lt;/p&gt;
&lt;p&gt;Where to go next: &lt;a class="link" href="https://skillup.phpboyscout.uk/how-to/set-up-in-gitlab/" target="_blank" rel="noopener"
 &gt;set up the gate in GitLab CI&lt;/a&gt; or &lt;a class="link" href="https://skillup.phpboyscout.uk/how-to/set-up-in-github/" target="_blank" rel="noopener"
 &gt;in GitHub Actions&lt;/a&gt;, or read &lt;a class="link" href="https://skillup.phpboyscout.uk/explanation/why-not-tags/" target="_blank" rel="noopener"
 &gt;why the baseline is the manifest and not a tag&lt;/a&gt; if that decision seems odd to you.&lt;/p&gt;</description></item></channel></rss>