<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3, branch docs/code-of-conduct</title>
<subtitle>Progmasoft Catch3: an independently maintained C++17 test framework with a parallel runner, property checks, snapshots and structured results.</subtitle>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/'/>
<entry>
<title>Keep the code of conduct within markdownlint's rules</title>
<updated>2026-11-15T10:54:16+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T10:54:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=7cc1c00efa137628dda3320a431637bd46ab6b01'/>
<id>7cc1c00efa137628dda3320a431637bd46ab6b01</id>
<content type='text'>
One blank line between sections and a mailto link for the reporting
address, as Codacy's markdownlint asks; the text is unchanged.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
One blank line between sections and a mailto link for the reporting
address, as Codacy's markdownlint asks; the text is unchanged.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>Move the code of conduct to Contributor Covenant 3.0</title>
<updated>2026-11-15T09:29:21+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T09:29:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=40756e6ba0cc3948e6bebc9505d2807c1eef413c'/>
<id>40756e6ba0cc3948e6bebc9505d2807c1eef413c</id>
<content type='text'>
The code of conduct inherited from Catch2 was Contributor Covenant 1.4.
It becomes version 3.0, the text every public Progmasoft repository now
carries: reports go to support@progmasoft.com, read by the maintainers
as the Community Moderators, and the enforcement ladder applies as the
Covenant writes it. The file keeps the Covenant's CC-BY-SA-4.0 license.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The code of conduct inherited from Catch2 was Contributor Covenant 1.4.
It becomes version 3.0, the text every public Progmasoft repository now
carries: reports go to support@progmasoft.com, read by the maintainers
as the Community Moderators, and the enforcement ladder applies as the
Covenant writes it. The file keeps the Covenant's CC-BY-SA-4.0 license.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #41 from Progmasoft/fix/version-tool-semver</title>
<updated>2026-11-15T09:15:51+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-11-15T09:15:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=ac438d0c34d89e14d51aebe3b0314c7e38000bb8'/>
<id>ac438d0c34d89e14d51aebe3b0314c7e38000bb8</id>
<content type='text'>
Number versions MAJOR.MINOR.PATCH in the version tool</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Number versions MAJOR.MINOR.PATCH in the version tool</pre>
</div>
</content>
</entry>
<entry>
<title>Refuse a next patch past the largest number</title>
<updated>2026-11-14T19:42:54+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-14T19:42:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=e2905c736cf2e36965c071c21bc7911eb3c59a7b'/>
<id>e2905c736cf2e36965c071c21bc7911eb3c59a7b</id>
<content type='text'>
NextPatch added one to the patch without a check, so a patch at
std::numeric_limits&lt;unsigned&gt;::max() wrapped to 0 and --next would have
moved the version back. It returns nothing there now; tests cover a
three- and a four-number version at the limit.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
NextPatch added one to the patch without a check, so a patch at
std::numeric_limits&lt;unsigned&gt;::max() wrapped to 0 and --next would have
moved the version back. It returns nothing there now; tests cover a
three- and a four-number version at the limit.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>Number versions MAJOR.MINOR.PATCH in the version tool</title>
<updated>2026-11-14T19:03:45+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-14T19:03:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=2d21d2e0f9c6e0789e9c55d6cba611234dc61a60'/>
<id>2d21d2e0f9c6e0789e9c55d6cba611234dc61a60</id>
<content type='text'>
Progmasoft repositories use Semantic Versioning since 2026-11-12, but
//tools:version still knew the four-number counters: given 0.4.0 it
wrote 0.4.0.0 everywhere, and --next stepped the fourth number.

- A Version is three numbers; ParseVersion takes exactly three, without
  leading zeros, and FormatVersion writes three.
- --next is the next patch release. It also follows a four-number
  version as the rule says: the fourth number goes and the patch rises,
  so 0.3.0.2 is followed by 0.3.1.
- ReleaseNotesOf finds a section by the version it was published as.
  Its fallback for "D = 0" read the fourth element of what is now a
  three-element array; it is gone.
- Tests for the new parsing, NextPatch and release-note lookup;
  docs/contributing.md and the tool's usage say what the tool does.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Progmasoft repositories use Semantic Versioning since 2026-11-12, but
//tools:version still knew the four-number counters: given 0.4.0 it
wrote 0.4.0.0 everywhere, and --next stepped the fourth number.

- A Version is three numbers; ParseVersion takes exactly three, without
  leading zeros, and FormatVersion writes three.
- --next is the next patch release. It also follows a four-number
  version as the rule says: the fourth number goes and the patch rises,
  so 0.3.0.2 is followed by 0.3.1.
- ReleaseNotesOf finds a section by the version it was published as.
  Its fallback for "D = 0" read the fourth element of what is now a
  three-element array; it is gone.
- Tests for the new parsing, NextPatch and release-note lookup;
  docs/contributing.md and the tool's usage say what the tool does.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #39 from Progmasoft/feature/per-test-coverage</title>
<updated>2026-11-14T13:46:04+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-11-14T13:46:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=94a996a3ceafa9f0004ffc28a7de5c543cdb51c2'/>
<id>94a996a3ceafa9f0004ffc28a7de5c543cdb51c2</id>
<content type='text'>
Keep per-test coverage with --coverage (roadmap step 4)</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Keep per-test coverage with --coverage (roadmap step 4)</pre>
</div>
</content>
</entry>
<entry>
<title>Make the start lock a never-destroyed object</title>
<updated>2026-11-13T21:56:32+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-13T21:56:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=5ad02bccfcb925df02d1273901b6e248d477c5fa'/>
<id>5ad02bccfcb925df02d1273901b6e248d477c5fa</id>
<content type='text'>
A function-local static std::mutex has an exit-time destructor, which
the macOS build rejects with -Wexit-time-destructors. The lock is now
allocated once and never destroyed, which also keeps it usable by a
thread that starts a child while the process exits.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
A function-local static std::mutex has an exit-time destructor, which
the macOS build rejects with -Wexit-time-destructors. The lock is now
allocated once and never destroyed, which also keeps it usable by a
thread that starts a child while the process exits.
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'devel' into feature/per-test-coverage</title>
<updated>2026-11-13T20:24:25+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-11-13T20:24:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=826735e00bfac9967a7979eae5a42cb49eac851b'/>
<id>826735e00bfac9967a7979eae5a42cb49eac851b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Start child processes one at a time; run gcov without a directory</title>
<updated>2026-11-13T20:24:10+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-13T20:24:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=b26486d68ece48a1dfdb208a9f3f1bd8acab0382'/>
<id>b26486d68ece48a1dfdb208a9f3f1bd8acab0382</id>
<content type='text'>
Reading the coverage profiles on several threads broke an assumption of
ChildProcess::Start on POSIX: it changes the working directory of the
whole process around posix_spawn. Two gcov runs started at once could
both run in one test's directory, so on the GCC job the map of
"Subtracts one" showed what "Adds one" reached.

- ChildProcess::Start holds a lock while a child starts, on POSIX and
  Windows, so the directory change and the handles a child inherits never
  overlap with another start.
- gcov gets the absolute path of the data file and no working directory,
  so no directory changes while profiles are read in parallel.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Reading the coverage profiles on several threads broke an assumption of
ChildProcess::Start on POSIX: it changes the working directory of the
whole process around posix_spawn. Two gcov runs started at once could
both run in one test's directory, so on the GCC job the map of
"Subtracts one" showed what "Adds one" reached.

- ChildProcess::Start holds a lock while a child starts, on POSIX and
  Windows, so the directory change and the handles a child inherits never
  overlap with another start.
- gcov gets the absolute path of the data file and no working directory,
  so no directory changes while profiles are read in parallel.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix the coverage review findings: branches, stale reports, exit status</title>
<updated>2026-11-13T18:55:26+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-13T18:55:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=454cca9b63991416f4d9bd1ca350f1ae14e278e7'/>
<id>454cca9b63991416f4d9bd1ca350f1ae14e278e7</id>
<content type='text'>
- gcov is run with --branch-probabilities; without it the JSON has no
  branches, so GCC runs had none in coverage.json and coverage.lcov.
- PrepareCoverageDirectory also removes coverage.json, coverage.lcov and
  coverage.profdata of an earlier run, so a run that writes no reports
  leaves none to be read as its own.
- WriteCoverageReports returns notes and failures apart. A profile the
  tools cannot read or a report that cannot be written counts as a missing
  report and fails a run whose tests passed; no profiles or missing tools
  stay notes. The paths are announced only for the reports written.
- ProfiledAttempt takes the last attempt whose profile exists, so a final
  retry or repeat that crashed before writing one no longer hides the
  coverage of the attempt before it.
- The per-test llvm-profdata/llvm-cov and gcov runs use as many threads
  as the run had workers; results keep the order of the tests.

Tests: earlier reports removed and no failure without profiles; an
attempt without a profile gives way to an earlier one; the fixture gains a
branch taken one way, checked in the combined LCOV for both LLVM and gcov.
Amalgamation regenerated.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- gcov is run with --branch-probabilities; without it the JSON has no
  branches, so GCC runs had none in coverage.json and coverage.lcov.
- PrepareCoverageDirectory also removes coverage.json, coverage.lcov and
  coverage.profdata of an earlier run, so a run that writes no reports
  leaves none to be read as its own.
- WriteCoverageReports returns notes and failures apart. A profile the
  tools cannot read or a report that cannot be written counts as a missing
  report and fails a run whose tests passed; no profiles or missing tools
  stay notes. The paths are announced only for the reports written.
- ProfiledAttempt takes the last attempt whose profile exists, so a final
  retry or repeat that crashed before writing one no longer hides the
  coverage of the attempt before it.
- The per-test llvm-profdata/llvm-cov and gcov runs use as many threads
  as the run had workers; results keep the order of the tests.

Tests: earlier reports removed and no failure without profiles; an
attempt without a profile gives way to an earlier one; the fixture gains a
branch taken one way, checked in the combined LCOV for both LLVM and gcov.
Amalgamation regenerated.
</pre>
</div>
</content>
</entry>
</feed>
