Skip to content

Add an upgrade-notes document in the repository collecting breaking changes across versions #1410

Description

@Fantu

Is your feature request related to a problem? Please describe.

NSClient++ has no place in the repository that answers the single question every
upgrade starts with: what changes between the version I am running and the version
I am installing require me to do something, or silently change how my existing
configuration behaves?

The recent development pace makes this much more pressing: a lot of new checks,
fixes and behaviour changes across several releases in a short time (0.13.0 → 0.16.1
in roughly two months), so there are more versions to cross and more changes that can
bite. Those releases do contain genuinely good upgrade information — the "⚠️ Upgrade
notes" section at the bottom of the release notes — but it lives only in the GitHub
release body of each tag, so the number of places to consult grows with every release
while the answer stays scattered.

That said, the need does not come from the pace, it is only amplified by it. I have
been using NSClient++ for many years and the same difficulty was there when releases
were rarer and breaking changes fewer — arguably it is even easier to get caught
then, because a slow-moving project is exactly the one you install and forget. That
is the normal life of a monitoring agent: it is set up once, it works, nobody touches
it for months or years, and then someone upgrades it across a large version gap. At
that point it makes little difference whether the gap contains twenty releases or
two: what matters is whether the handful of changes that require intervention is
written down somewhere you can read in one go. So this would be worth having even if
development slowed down tomorrow — documenting breaking changes and significant
behaviour changes in a durable, versioned place seems to me a basic expectation for
any serious project, independently of how fast it moves.

Today that means:

  • opening the GitHub releases page and reading every single release body one by one —
    every one of them, because the version number tells you nothing about what is safe
    to skip: a minor or patch-level bump is not a guarantee of "no breaking changes",
    and in practice substantial changes do show up there too. Some releases turn out to
    have no upgrade notes at all, but you only find that out by opening them. There is
    no shortcut: you read them all, or you risk missing exactly the one that matters;
  • mentally merging the notes of N releases into one list, and hoping nothing was
    missed;
  • doing it online — there is nothing in the source tarball, in the installed
    package, or on the documentation site that answers "what breaks if I jump from
    0.13.0 to 0.16.1?".

And getting it wrong has consequences of very different severity: the agent may not
work at all after the upgrade, or work only in part, or work while quietly producing
different results than before. In every case you find out afterwards, by debugging,
instead of before, by reading. I have come across changes of this kind over the years,
and I have had a hard time precisely because a document like the one I am asking for
did not exist: upgrading an installation left alone for a long time meant piecing
together, after the fact, what had changed and why something no longer worked as
before. So this is not something the recent releases created — they only make an old
gap easy to see.

A second problem: sometimes a breaking change only turns out to be one after the
release, when users hit it. The release body of an already published tag is
effectively frozen in practice — nobody re-reads a release they already installed —
so there is no good place to record "this change in 0.15.0 also affects X, do Y".

Describe the solution you'd like

A dedicated, version-ordered upgrade document maintained inside the repository —
e.g. UPGRADING.md at the top level (and/or exposed on the docs site under Setup,
so it is also reachable from nsclient.org).

Everything below is a suggestion, not a requirement — name, structure and level of
detail are entirely yours to decide; I only care that the information exists in the
repository in some readable form.

Name: UPGRADING.md is the most common convention, but UPGRADE_NOTES.md,
UPGRADING_NOTES.md or simply "Upgrade notes" as a docs page title would all work —
whatever reads best next to the existing README.md / SECURITY.md.

Shape:

  • One section per version, newest first, each linking to the corresponding
    GitHub release for the full story.
  • Only actionable content: breaking changes, changed defaults, silent behaviour
    changes, renamed/removed settings and options, packaging/layout changes. The value
    of this file is that it is short and can be read top-down.
  • Each entry states what changed → what you must do, with the affected setting
    or module named explicitly, so it can be grepped (grep -i checknet UPGRADING.md).

Within each version it would help to split the entries into subsections, so that
someone upgrading across many versions can read only the first subsection of each and
still be safe. The criterion that seems to work best is not "how important is this"
but what it does to an existing installation that is upgraded unchanged:

  1. Requires action — the existing configuration stops working, or works
    differently in a way you must correct: removed or renamed settings and options,
    changed defaults that apply to existing installs, security defaults that now refuse
    what used to be allowed, changed file/install layout. Nobody may skip this section.
  2. Changes behaviour without requiring action — the configuration keeps working
    untouched, but the result is not identical: extra or renamed perfdata, different
    output or wording, a metric computed differently, a value that used to be literal
    and is now expanded. Nothing to fix, but worth knowing before the graphs or the
    alert thresholds start behaving differently.
  3. (optional) New things you have to opt into — additions that change nothing
    until you enable them, but that are easy to mistake for a broken upgrade: a new
    module that is not loaded by default, a new option that defaults to off, a new
    check that returns UNKNOWN until configured. Strictly speaking these are not
    upgrade notes at all; the reason to keep a short list here is that they answer
    "why doesn't this new thing work after upgrading?" in the place people are already
    looking. This is the subsection I am least sure about — an actual list of new
    features definitely does not belong here (that is what the release notes and/or
    a changelog are for), and if it risks growing, a one-line pointer per version
    ("see the release notes for the new checks in this version") is probably better.

To make the difference concrete, using the existing 0.14.1 notes: "CheckNet
perfdata is now on by default
" belongs in group 2 — an unchanged configuration
starts emitting perfdata it did not emit before — while "CheckSecurity is not
loaded by default
" belongs in group 3, since CheckSecurity is a module added in
that release: nothing was disabled by the upgrade, it simply has to be enabled if you
want to use the new checks. Today both sit under the same "Upgrade notes" heading,
which is exactly the distinction the subsections would make.

An alternative (or complement) is a severity marker per item, e.g.
⚠️ action required / ℹ️ behaviour change / ✅ opt-in only. If the entries are
already grouped in subsections, the markers are probably redundant — either mechanism
alone should be enough.

Usage is then trivial: "I am on 0.13.0, I want 0.16.1" → read every section from the
top down to your version, and you have the complete list, offline, in the source you
just downloaded.

Two things that would make it noticeably more useful:

  1. An ## Unreleased section at the top, updated by the PR that introduces the
    behaviour change, while the context is fresh. At release time that section is
    simply renamed to the version number — and it is also exactly the text to paste
    into the "⚠️ Upgrade notes" section of the GitHub release. This inverts today's
    flow (write it in the release body, and nowhere else) at essentially zero extra
    cost, and it makes it much harder to ship a breaking change with no note at all.

  2. Allowing entries to be added retroactively to older versions, for breaking
    changes whose impact only became clear later (bug reports, regressions found
    afterwards). Marking them as added after the fact, e.g.
    _(note added 2026-08-14)_, keeps it honest. This is something a frozen GitHub
    release body cannot do.

Starting small is fine. There is no need to archaeologically reconstruct the
whole history: seeding the file with the releases that already have written upgrade
notes (0.13.0, 0.14.0, 0.14.1, 0.15.0, 0.16.0, 0.16.1) is mostly copy-paste of text
that already exists, and covers the versions people are realistically upgrading from
today. Older versions can be added opportunistically, when someone asks or when a
problem surfaces — the file gets more valuable over time without ever being a big
one-off effort.

Rough skeleton:

# Upgrading NSClient++

Read every section from the version you are running up to the version you are
installing. Only changes that require action or that change behaviour are listed;
see the release notes for the full changelog.

## Unreleased

### Requires action

- **<setting/module> …** what changed, and what you have to do.

## 0.16.1 — 2026-08-14 ([release notes](https://github.com/mickem/nscp/releases/tag/0.16.1))

### Requires action

- **Settings urls with a query string now actually send it.** A server relying on
  receiving the bare path will now see the parameters; check the receiving end before
  upgrading. The old cache file is migrated to the new query-aware name once on first
  start.
- **Building the docs on non-Windows needs an explicit flag:**
  `-DNSCP_BUILD_DOCS_HTML=ON`.

### Changes behaviour without requiring action

- **`${hostname}` is now expanded in configuration.** It used to be left in place as
  literal text by `expand_hostname`; it now expands everywhere that helper is used,
  including the submit clients' `hostname` setting.

### New things you have to opt into

- **`check_logfile` bookmarks.** Without `bookmark` / `max-lines` the check reads the
  whole file exactly as before and stores no position.
- **`run on startup`** is off by default; enabling it for the `default` schedule
  affects the whole fleet, see `startup window`.

## 0.14.1 — 2026-07-06 ([release notes]())

### Changes behaviour without requiring action

- **CheckNet perfdata is now on by default.** Network checks emit performance data
  without an explicit `perf` syntax; graphs that showed nothing will start populating,
  and manually added perfdata may now be emitted twice.

### New things you have to opt into

- **`CheckSecurity` (new module) is not loaded by default.** Enable it before using
  the new checks: `nscp settings --active-module CheckSecurity`. Windows-only checks
  return UNKNOWN on other platforms.

Note: I briefly described it in Italian in a few minutes, then had Claude translate and explain it better, but unfortunately the result was terrible. I hope I fixed it enough in just over an hour.
The example parts are incomplete and may still contain errors because I checked more quickly and only corrected a couple of things.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions