Skip to content

release: 0.3.0 - #98

Merged
donislawdev merged 2 commits into
mainfrom
release/v0.3.0
Sep 9, 2026
Merged

release: 0.3.0#98
donislawdev merged 2 commits into
mainfrom
release/v0.3.0

Conversation

@donislawdev

Copy link
Copy Markdown
Owner

The owner's decision, and his alone - immutable rule 12. 0.3.0 without the
suffix, which is the whole mechanical difference from 0.3.0-rc1: the release
workflow marks a release as a prerelease when the TAG NAME carries a hyphen,
and that is what kept rc1 off the front page and out of latest.

The changelog is one section, not two

The entries that shipped as 0.3.0-rc1 were folded into 0.3.0 on the owner's
instruction, and the ## [0.3.0-rc1] heading went with them along with its link
definition - a definition left behind points at a comparison nobody can reach
from the document.

The reason is stronger than tidiness. The Breaking list is only true read
whole: the padding of a ZIP, a TAR.GZ and a WAV changed after rc1 went out,
so the two halves describe one delta from 0.2.0. Somebody upgrading needs one
list, not two.

The merged section carries 67 entries - 9 Breaking, 22 Added,
5 Security, 14 Changed, 17 Fixed - under one heading of each kind.
[Unreleased] is empty, so both of the release gate's own conditions pass.

Nine copies of the number, seven of them held

Five readers take version.Version at run time and needed nothing. The copies
were found by grepping the tree rather than from memory:

copy what turns red
cmd/tfg/tfg.rc and its .syso exeproperties_test.go reads the COMPILED resource, so editing the script alone changes nothing - both were recompiled with windres and each lost exactly sixteen bytes
internal/gui/icon/chickpea.rc and cmd/tfg-gui/*.syso the same
about.png and about.xml screenpixels_test.go - one screen of twenty five rewritten, the text 37 px narrower
web/public/** site_test.go - thirteen pages, seventeen lines added and seventeen removed, every one carrying the version
CHANGELOG.md changelogshape_test.go and the gate in release.yml
the mutation entry the staleness check
README.md manifest example nothing - it still said 0.2.0, so it had drifted through a whole release. Fixed here and recorded as O198

The run lock has a second effect, and the changelog now says so

The pre-release ritual reported a failure about the disk filling part way
through a run. It was not a regression. Measured in a container with room for
twelve names, the same command through three binaries:

binary exit manifest
0.2.0 5 not written
0.3.0-rc1 5 not written
this release 8 written

Bisected over the 48 commits since rc1 to the run lock, and the cause is in
engine.go: the manifest name is now taken before the first file rather than
after the last one, so the manifest has a place reserved whatever happens to the
directory. The old run left files cleanup had nothing to remove them from.

Both codes follow the frozen table. What moved is which of them the situation
produces, and somebody's CI can be reading it, so the entry says so now.

What was run

  • the whole suite, 337.8 s, green
  • the pre-release ritual, 179 of 179, nine phases: real files through cmd,
    PowerShell 5.1, pwsh 7, Git Bash, WSL on the Linux binary and a Mac over
    ssh
    , a real window opened, and a comparison against the downloaded
    v0.2.0 - eleven formats unchanged, nine changed, all nine described under
    ### Breaking
  • the guard suite on Linux in Docker, amd64 and arm64, on overlayfs
  • three mutations named by the guards this touches, three caught

🤖 Generated with Claude Code

donislawdev and others added 2 commits September 9, 2026 15:53
The owner's decision, and his alone - immutable rule 12. This is the version
0.3.0-rc1 already carried, without the suffix, and the suffix is the whole
mechanical difference. The release workflow marks a release as a prerelease
when the TAG NAME carries a hyphen, which is what kept rc1 off the front page
and out of "latest". Dropping it is what puts this build there.

The entries that shipped as 0.3.0-rc1 were folded into the 0.3.0 section
rather than left beside it, on the owner's instruction. Somebody upgrading
from 0.2.0 needs one list of what changed rather than two, and the Breaking
list is only true read whole: the padding of a ZIP, a TAR.GZ and a WAV changed
after rc1 went out, so the two halves describe one delta from 0.2.0. The
merged section carries 67 entries - 9 Breaking, 22 Added, 5 Security, 14
Changed and 17 Fixed - under one heading of each kind. The [0.3.0-rc1] heading
goes with them and so does its link definition, because a definition left
behind points at a comparison nobody can reach from the document.

Both of the release gate's own conditions were run here and pass: the
changelog has a section for 0.3.0, and nothing is left under [Unreleased].

Outside internal/version the number has nine copies. Six are held by a guard
in this repository, one by a tool outside it, and two by nothing at all.

The Windows resource compiled into both binaries carries the version, and a
guard reads the COMPILED resource rather than the script beside it. Both
scripts were updated and both recompiled with windres, and each .syso lost
exactly sixteen bytes - four characters, twice over, two bytes apiece in
UTF-16. The numeric FILEVERSION fields were already 0,3,0,0 and did not move.

The about screen draws the version, so its stored picture and widget tree were
refreshed. One screen of twenty five was rewritten, which is what the writer
asking the guard's own verdict instead of comparing bytes was built to do. The
tree diff is one line and the text is 37 px narrower.

The site prints the version in its footer and in its JSON-LD block. Thirteen
pages, seventeen lines added and seventeen removed, every one of them carrying
the version and nothing else moved.

The README ships inside every release archive and its manifest example still
said 0.2.0, so that number had drifted through a whole release without being
noticed. Nothing holds it.

Folding the sections invalidated two mutation entries, both aimed at the rc1
link definitions. Both reported SKIP, which is the shape that reads as proven,
and the staleness check is the only thing that says otherwise. Repointed and
run: three mutations named by these guards, three caught.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Found on 2026-09-09 while closing 0.3.0, by the pre-release ritual reporting a
failure about a change that is an improvement.

The run lock moved the claim on the manifest name from after the last file to
before the first one, so the manifest has a place reserved whatever happens to
the directory afterwards. The entry describing that said what it does for two
runs competing for one directory and stopped there.

It does something else for a run nothing is competing with. Measured in a
container with room for twelve names, the same command through three binaries:
0.2.0 and 0.3.0-rc1 both end with exit code 5, print thirty files they could
not produce, write no manifest, and say that clearing the directory is a job by
hand. This release ends with the partial code 8 and writes a manifest, so
"tfg cleanup" can remove what the run left rather than leaving it to a person.

That is the better outcome and both codes follow the frozen table - what moved
is which of them the situation produces, and somebody's CI can be reading it.
The entry says so now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@donislawdev
donislawdev merged commit 75ed496 into main Sep 9, 2026
18 checks passed
@donislawdev
donislawdev deleted the release/v0.3.0 branch September 9, 2026 14:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant