Nuitka Website Changelog Updates
This skill covers producing changelog entries in the Nuitka website repository for a hotfix release
(e.g. 4.1.3) or a develop update, based on the git history of the Nuitka repository.
Workflow
Generate the prompt:
python3 update-changelog.py 4.1.3 --nuitka-repo ../Nuitka-develop # hotfix
python3 update-changelog.py 4.2 --nuitka-repo ../Nuitka-develop # final release
python3 update-changelog.py 4.2rc3 --nuitka-repo ../Nuitka-develop # pre-release
VERSION is required and must be one of: hotfix X.Y.Z (e.g. 4.1.3), final X.Y (e.g.
4.2), or pre-release X.YrcN (e.g. 4.2rc3). Anything else is rejected.
- The line "It currently covers changes up to version ...." tracks the last
VERSION
argument passed to the script and is updated by the script itself, never by hand.
- Running with a
VERSION that is already the documented state yields an empty range, that is
expected.
--website-repo PATH allows running from outside the website repo.
--output FILE writes the prompt to a file instead of stdout.
- This prints "Processing changelog for: ..." plus a technical writer prompt containing the raw
commit data.
Process the prompt: turn every relevant commit into entries in
site/changelog/Changelog-next.rst, following the content rules below. When done, verify
coverage mechanically: extract every unique commit subject from the prompt and check each one
against the changelog, so that no commit is missed by eyeballing.
When the entries are done, always run:
./auto-format site/changelog/Changelog-next.rst
The user often edits the file themselves in between. Read the file again before each edit,
preserve their edits, and learn from them.
Pre-release (develop) updates
What differs from the hotfix workflow:
- The range starts at the commit that introduced the last documented version. It may contain commits
already covered by earlier hotfix passes, so skip every commit whose change is already present in
Changelog-next.rst, do not create duplicate entries.
- The script uses
git log --no-merges, so merge commits never appear in the prompt, and skips
release-cycle commits ("New stable release.", "New release cycle.", ...).
- New entries get no
(Fixed in X.Y.Z already.) or (Added in X.Y.Z already.) suffix, and are
appended at the end of their group in each section, keeping the prefix grouping.
- A develop update covers commits up to the release of the version being documented. Commits after a
"New release cycle." commit belong to the next version and go to its changelog instead.
- Develop commits get their own entries even when related work was already announced in a hotfix
entry.
Researching commits
The raw commit data in the prompt includes diffs, but for anything unclear, inspect the actual code
in the Nuitka repository (default ../Nuitka-develop):
git show <hash> # the commit itself
git log --all --oneline --grep=... # related commits
git log --format="%h %ci %s" -1 <hash>
In particular:
- Check whether a changed feature is behind an experimental flag or is the default at the time of
the hotfix, so entries do not claim a regression that is not one (e.g. new style code objects were
--experimental until after 4.1.2).
- Get the actual semantics right, e.g.
_stdlib_module_raises is the list of modules known to
never raise on import.
- Name the actual helpers and options (e.g.
has_builtin_module, --disable-ccache), not vague
descriptions.
Content rules
Categorization
Use only the existing sections of Changelog-next.rst: Bug Fixes, Package Support, New Features,
Optimization, Anti-Bloat, Organizational, Tests, Cleanups. Never add new headings. A section that
stays empty keeps the placeholder - None yet. (with trailing period).
- Fixes for Nuitka itself -> Bug Fixes.
- Package support additions and fixes -> Package Support.
- New abilities -> New Features (use "Added").
- Performance or import-time optimizations -> Optimization.
- Avoided package dependencies -> Anti-Bloat.
- Release process, packaging (RPM, Debian), license, project tooling -> Organizational.
- Test suite changes -> Tests.
- Code quality, tools, styling -> Cleanups.
- Adding new tooling or functional enhancements of quality tools (new checker tools, new autoformat
behaviors, hook behavior changes) -> Organizational, not Cleanups.
- User visible warnings and handling of user options -> UI: prefix (e.g. duplicate data file
warning), placed per its category, usually Organizational or Bug Fixes.
- Release/packaging fixes -> Organizational with Release:, RPM:, or Debian: prefix.
Suffixes for hotfix entries
Since the commits are the hotfix itself, append:
(Fixed in X.Y.Z already.) to fixes.
(Added in X.Y.Z already.) to new features and package support additions, using "Added" rather
than "Fixed".
For develop updates, no such suffix unless certain.
Grouping inside Bug Fixes
Bug Fixes consists of groups that must stay separated: one group per hotfix batch (e.g. all 4.1.1
entries) and one group for all develop changes. The different rc versions of a develop cycle do
not form separate groups, they are one develop group. Groups are ordered by time: hotfix batches
first, the develop group last, appended after the existing hotfix groups.
Within each group, keep entries grouped by bold prefix in this order, appending new entries at the
end of their prefix run:
- Generic Python fixes without a prefix.
- Python version fixes:
**Python 3.x:**, **Python 3.x+:**, **Python3:**.
**Standalone:**.
**Plugins:**.
**Windows:**.
**macOS:**.
**Linux:** (and **Debian:** as part of the Linux group).
- Other non-platform prefixes (e.g.
**Distutils:**, **PGO:**, **Onefile:**, **Report:**,
**Zig:**, **NoGil:**, **UI:**).
- Other platforms (e.g.
**AIX:**) at the end.
Other sections are not grouped this way, but keep items of the same prefix together where it is
natural.
Ordering inside New Features
- An entry that pronounces a Python version as officially supported (e.g. "Python 3.14:
Pronounced Python 3.14 as officially supported.") is always the first entry of New Features.
- Hotfix entries are not grouped together in New Features. Place them by relevance among the
develop entries, keeping their
(Added in X.Y.Z already.) suffix.
Skipping commits
- Skip
fixup! commits entirely, they are folded into the entry of the commit they fix.
- Skip trivial or internal changes without general relevance for users, e.g. fixes to features that
are not yet the default (unless the user says otherwise).
- Never drop a commit whose content is not understood. Instead, check the code, add an entry with
the best possible description, and inform the user about it, so they can decide.
Audience and wording
The audience is the experienced Nuitka and Python user:
- Explain the actual mechanism and the user visible consequence, not just commit-title jargon. E.g.
prefer "compiled coroutines left the send slot result uninitialized when they finished by raising,
so
asyncio could observe garbage values" over "coroutine am_send could return wrong result
values".
- State the mechanism neutrally: describe what was missing rather than over-asserting the failure
mode (e.g. "the output was not used yet", not "was never obtained").
- For fixes, describe the wrong behavior in past tense and the corrected behavior in present tense
("was handling ... incorrectly, now ..."), avoid formulations like "handled X correctly" that put
the fix itself in the past.
- Never state the corrected behavior in past tense: not "Enabled UTF-8 mode", "added handling for",
"avoided permission issues", "no longer crashed", "solved the need", but "Enables UTF-8 mode",
"now handles", "no longer runs into", "no longer crashes", "no longer needs". Past tense is only
for the wrong behavior and for the change event itself ("Added support for", "Renamed").
- Avoid redundancy, do not repeat the topic word within an entry (e.g. "compiler binary was a
symlink" after already naming ccache), and avoid filler phrases like "closing a gap".
- Name the actual helpers and options (e.g.
has_builtin_module).
- Terminology: handlers for runtime situations where something is missing, failing to work (e.g.
certifi not present) are called "non-deployment handler", not "deployment handling".
- For hotfix entries that describe a change of behavior, showing what it was and what it is now can
be done in a code example comment, e.g.
# 4.1: None (bug), 4.1.1: KeyError (correct).
Quoting
- Double backticks for: option names (
--disable-ccache, --mode=dll), module and package names,
environment variables (PYTHON_FROZEN_MODULES), exception, function, and attribute names
(sys.exc_info(), __qualname__), experimental flag names
(--experimental=deferred-annotations), architecture names (x86_64), and Python keywords
(async, await, with).
- Double quotes only for the flavor name
"Python Build Standalone", since that name is highly
misleading. No other flavor names get quoted.
Code examples
When an entry benefits from a code example, place it inside the list item:
- **Python3:** Fix, ... (Fixed in 4.1.1 already.)
.. code:: python
...
./auto-format turns .. code-block:: python into .. code:: python and formats the Python code
inside (e.g. two blank lines between functions).
Improving this skill and the workflow
- Watch for conventions the user applies by editing
Changelog-next.rst themselves or by correcting
entries in prompts during a session.
- When a pattern emerges (wording, grouping, quoting, categorization), infer the intention behind
it, not the concrete case, and propose adding it to this skill and to the style guide embedded in
update-changelog.py.
- Propose such changes to the user rather than silently rewriting rules, the user is the authority
on the conventions.
- When the workflow itself is painful (script location, output handling, etc.), suggest improvements
to
update-changelog.py as well.
1---2name: nuitka-changelog3description: Use when creating or updating Nuitka changelog entries (hotfix releases like 4.1.3 or upcoming releases) in the Nuitka website repository, by running update-changelog.py to generate the commit prompt and editing site/changelog/Changelog-next.rst.4---56# Nuitka Website Changelog Updates78This skill covers producing changelog entries in the Nuitka website repository for a hotfix release9(e.g. `4.1.3`) or a develop update, based on the git history of the Nuitka repository.1011## Workflow12131. Generate the prompt:1415 ```16 python3 update-changelog.py 4.1.3 --nuitka-repo ../Nuitka-develop # hotfix17 python3 update-changelog.py 4.2 --nuitka-repo ../Nuitka-develop # final release18 python3 update-changelog.py 4.2rc3 --nuitka-repo ../Nuitka-develop # pre-release19 ```2021 - `VERSION` is required and must be one of: hotfix `X.Y.Z` (e.g. `4.1.3`), final `X.Y` (e.g.22 `4.2`), or pre-release `X.YrcN` (e.g. `4.2rc3`). Anything else is rejected.23 - The line "It currently covers changes up to version **...**." tracks the last `VERSION`24 argument passed to the script and is updated by the script itself, never by hand.25 - Running with a `VERSION` that is already the documented state yields an empty range, that is26 expected.27 - `--website-repo PATH` allows running from outside the website repo.28 - `--output FILE` writes the prompt to a file instead of stdout.29 - This prints "Processing changelog for: ..." plus a technical writer prompt containing the raw30 commit data.31322. Process the prompt: turn every relevant commit into entries in33 `site/changelog/Changelog-next.rst`, following the content rules below. When done, verify34 coverage mechanically: extract every unique commit subject from the prompt and check each one35 against the changelog, so that no commit is missed by eyeballing.36373. When the entries are done, always run:3839 ```40 ./auto-format site/changelog/Changelog-next.rst41 ```4243 The user often edits the file themselves in between. Read the file again before each edit,44 preserve their edits, and learn from them.4546## Pre-release (develop) updates4748What differs from the hotfix workflow:4950- The range starts at the commit that introduced the last documented version. It may contain commits51 already covered by earlier hotfix passes, so skip every commit whose change is already present in52 `Changelog-next.rst`, do not create duplicate entries.53- The script uses `git log --no-merges`, so merge commits never appear in the prompt, and skips54 release-cycle commits ("New stable release.", "New release cycle.", ...).55- New entries get no `(Fixed in X.Y.Z already.)` or `(Added in X.Y.Z already.)` suffix, and are56 appended at the end of their group in each section, keeping the prefix grouping.57- A develop update covers commits up to the release of the version being documented. Commits after a58 "New release cycle." commit belong to the next version and go to its changelog instead.59- Develop commits get their own entries even when related work was already announced in a hotfix60 entry.6162## Researching commits6364The raw commit data in the prompt includes diffs, but for anything unclear, inspect the actual code65in the Nuitka repository (default `../Nuitka-develop`):6667```68git show <hash> # the commit itself69git log --all --oneline --grep=... # related commits70git log --format="%h %ci %s" -1 <hash>71```7273In particular:7475- Check whether a changed feature is behind an experimental flag or is the default at the time of76 the hotfix, so entries do not claim a regression that is not one (e.g. new style code objects were77 `--experimental` until after 4.1.2).78- Get the actual semantics right, e.g. `_stdlib_module_raises` is the list of modules known to79 **never** raise on import.80- Name the actual helpers and options (e.g. `has_builtin_module`, `--disable-ccache`), not vague81 descriptions.8283## Content rules8485### Categorization8687Use only the existing sections of `Changelog-next.rst`: Bug Fixes, Package Support, New Features,88Optimization, Anti-Bloat, Organizational, Tests, Cleanups. Never add new headings. A section that89stays empty keeps the placeholder `- None yet.` (with trailing period).9091- Fixes for Nuitka itself -> Bug Fixes.92- Package support additions and fixes -> Package Support.93- New abilities -> New Features (use "Added").94- Performance or import-time optimizations -> Optimization.95- Avoided package dependencies -> Anti-Bloat.96- Release process, packaging (RPM, Debian), license, project tooling -> Organizational.97- Test suite changes -> Tests.98- Code quality, tools, styling -> Cleanups.99- Adding new tooling or functional enhancements of quality tools (new checker tools, new autoformat100 behaviors, hook behavior changes) -> Organizational, not Cleanups.101- User visible warnings and handling of user options -> **UI:** prefix (e.g. duplicate data file102 warning), placed per its category, usually Organizational or Bug Fixes.103- Release/packaging fixes -> Organizational with **Release:**, **RPM:**, or **Debian:** prefix.104105### Suffixes for hotfix entries106107Since the commits are the hotfix itself, append:108109- `(Fixed in X.Y.Z already.)` to fixes.110- `(Added in X.Y.Z already.)` to new features and package support additions, using "Added" rather111 than "Fixed".112113For develop updates, no such suffix unless certain.114115### Grouping inside Bug Fixes116117Bug Fixes consists of groups that must stay separated: one group per hotfix batch (e.g. all 4.1.1118entries) and one group for all develop changes. The different rc versions of a develop cycle do119**not** form separate groups, they are one develop group. Groups are ordered by time: hotfix batches120first, the develop group last, appended after the existing hotfix groups.121122Within each group, keep entries grouped by bold prefix in this order, appending new entries at the123end of their prefix run:1241251. Generic Python fixes without a prefix.1262. Python version fixes: `**Python 3.x:**`, `**Python 3.x+:**`, `**Python3:**`.1273. `**Standalone:**`.1284. `**Plugins:**`.1295. `**Windows:**`.1306. `**macOS:**`.1317. `**Linux:**` (and `**Debian:**` as part of the Linux group).1328. Other non-platform prefixes (e.g. `**Distutils:**`, `**PGO:**`, `**Onefile:**`, `**Report:**`,133 `**Zig:**`, `**NoGil:**`, `**UI:**`).1349. Other platforms (e.g. `**AIX:**`) at the end.135136Other sections are not grouped this way, but keep items of the same prefix together where it is137natural.138139### Ordering inside New Features140141- An entry that pronounces a Python version as officially supported (e.g. "**Python 3.14:**142 Pronounced Python 3.14 as officially supported.") is always the first entry of New Features.143- Hotfix entries are **not** grouped together in New Features. Place them by relevance among the144 develop entries, keeping their `(Added in X.Y.Z already.)` suffix.145146### Skipping commits147148- Skip `fixup!` commits entirely, they are folded into the entry of the commit they fix.149- Skip trivial or internal changes without general relevance for users, e.g. fixes to features that150 are not yet the default (unless the user says otherwise).151- Never drop a commit whose content is not understood. Instead, check the code, add an entry with152 the best possible description, and inform the user about it, so they can decide.153154### Audience and wording155156The audience is the experienced Nuitka and Python user:157158- Explain the actual mechanism and the user visible consequence, not just commit-title jargon. E.g.159 prefer "compiled coroutines left the send slot result uninitialized when they finished by raising,160 so `asyncio` could observe garbage values" over "coroutine am_send could return wrong result161 values".162- State the mechanism neutrally: describe what was missing rather than over-asserting the failure163 mode (e.g. "the output was not used yet", not "was never obtained").164- For fixes, describe the wrong behavior in past tense and the corrected behavior in present tense165 ("was handling ... incorrectly, now ..."), avoid formulations like "handled X correctly" that put166 the fix itself in the past.167- Never state the corrected behavior in past tense: not "Enabled UTF-8 mode", "added handling for",168 "avoided permission issues", "no longer crashed", "solved the need", but "Enables UTF-8 mode",169 "now handles", "no longer runs into", "no longer crashes", "no longer needs". Past tense is only170 for the wrong behavior and for the change event itself ("Added support for", "Renamed").171- Avoid redundancy, do not repeat the topic word within an entry (e.g. "compiler binary was a172 symlink" after already naming ccache), and avoid filler phrases like "closing a gap".173- Name the actual helpers and options (e.g. `has_builtin_module`).174- Terminology: handlers for runtime situations where something is missing, failing to work (e.g.175 `certifi` not present) are called "non-deployment handler", not "deployment handling".176- For hotfix entries that describe a change of behavior, showing what it was and what it is now can177 be done in a code example comment, e.g. `# 4.1: None (bug), 4.1.1: KeyError (correct)`.178179### Quoting180181- Double backticks for: option names (`--disable-ccache`, `--mode=dll`), module and package names,182 environment variables (`PYTHON_FROZEN_MODULES`), exception, function, and attribute names183 (`sys.exc_info()`, `__qualname__`), experimental flag names184 (`--experimental=deferred-annotations`), architecture names (`x86_64`), and Python keywords185 (`async`, `await`, `with`).186- Double quotes only for the flavor name `"Python Build Standalone"`, since that name is highly187 misleading. No other flavor names get quoted.188189### Code examples190191When an entry benefits from a code example, place it inside the list item:192193```194- **Python3:** Fix, ... (Fixed in 4.1.1 already.)195196 .. code:: python197198 ...199```200201`./auto-format` turns `.. code-block:: python` into `.. code:: python` and formats the Python code202inside (e.g. two blank lines between functions).203204## Improving this skill and the workflow205206- Watch for conventions the user applies by editing `Changelog-next.rst` themselves or by correcting207 entries in prompts during a session.208- When a pattern emerges (wording, grouping, quoting, categorization), infer the intention behind209 it, not the concrete case, and propose adding it to this skill and to the style guide embedded in210 `update-changelog.py`.211- Propose such changes to the user rather than silently rewriting rules, the user is the authority212 on the conventions.213- When the workflow itself is painful (script location, output handling, etc.), suggest improvements214 to `update-changelog.py` as well.