Skip to content

Say what has actually been released, and check that the page agrees - #266

Merged
fstubner merged 2 commits into
mainfrom
fix/changelog-tells-the-truth
Aug 28, 2026
Merged

fstubner merged 2 commits into
mainfrom
fix/changelog-tells-the-truth

Conversation

@fstubner

Copy link
Copy Markdown
Owner

Finding #4 from the assessment, plus a regression of my own from #263 that it turned up.

0.3.1 was dated but never tagged

## [0.3.1] — 2026-08-24, and git ls-remote --tags has no v0.3.1. The website reads that date straight out of this file, so netscli.com presented 0.3.1 as published for four days, and [0.3.1]: …/releases/tag/v0.3.1 pointed at a page that does not exist.

The date and the link come off. The heading stays — the version bump is real, the release is not.

Also worth knowing: gh release list reports v0.3.0 as a Draft. The last published release is v0.2.6, from May. My assessment said only 0.3.1 was untagged; I had inferred a release from the tag existing, which was wrong. Publishing the 0.3.0 draft is your call and I have not touched it.

Seven merged changes were undocumented

[Unreleased] was empty while #258–#265 sat on top of the release commit. They are in 0.3.1 now, which is where they belong while it has not shipped: the ARP add/delete fault, the MCP truncation count, the uncapped pcap job results, the database downgrade guard, the greyed packet-capture entry, the winget version, and four website corrections under a new ### Website group.

The rule that was missing

docs/PUBLISHING.md's bump checklist listed CHANGELOG.md as "the release heading and its link reference" without saying when. It now says: the heading goes on at bump time, the date and the link go on with the tag. One is a statement about this repository; the other is a claim about a release that exists.

A regression from #263

mergeRelease dropped published_at for any entry marked unreleased. But render-static.ts marks every entry that way, because at build time nothing has confirmed any tag — so the no-JS page lost the dates of releases that really had shipped:

dates: []          # every card, including v0.2.6

Now keyed on confirmedUnreleased, the same distinction the heading label already drew four lines below. It reached main because I verified #263 against the running dev server and never against the built page.

So: a check that reads the built page

site/scripts/changelog-dates.mjs compares every rendered card against CHANGELOG.md, and asks git whether a dated version is actually tagged. Both faults fail it — verified by reintroducing each:

- 0.3.0: CHANGELOG.md dates it 2026-08-20, the page shows no date.
  A shipped release lost its date.
- 0.3.1: CHANGELOG.md dates it 2026-08-24, but there is no v0.3.1 tag.
  The date goes on with the tag, not with the version bump.

Neither is visible to astro check, the a11y pass, or a source diff — it is markup that renders as something plausible and wrong on a page nobody re-reads. The site build job now checks out with fetch-depth: 0 so the tag half has tags to ask about, and the script fails rather than skips when it has none, since a check that quietly passes on an empty tag list is the same shape of bug.

Verified at both layers

v0.3.1 v0.3.0 v0.2.6
No-JS built page no date 20 Aug 2026 6 May 2026
With JS Not yet released, unlinked, no date Not yet released, unlinked, no date linked, 6 May 2026

The two layers differ on 0.3.0 on purpose: the static render relays this file (the tag exists), the client asks GitHub (no published release). Each is honest about what it knows.

astro check 0 errors · CSS budget 59 · check:changelog passes.

0.3.1's changelog heading was dated 2026-08-24 and no v0.3.1 tag exists. The
website reads that date straight out of this file, so netscli.com presented
0.3.1 as published for four days, and the `[0.3.1]` link reference pointed at
a tag page that does not exist. The date and the link come off; the heading
stays, because the version bump itself is real.

Seven merged changes had also landed after the release commit with the
Unreleased section left empty -- the ARP add/delete fault, three MCP and
database fixes, the greyed packet-capture entry, the winget version, and four
website corrections. They are in 0.3.1 now, which is where they belong while
it has not shipped.

`docs/PUBLISHING.md` records the rule the bump checklist was missing: a
version heading gets its date and its link in the change that pushes the tag,
not in the change that bumps the version. One is a statement about this
repository and can happen whenever; the other is a claim about a release that
exists.

Fixes a regression from #263. `mergeRelease` dropped `published_at` for any
entry marked `unreleased` -- but the build-time render marks *every* entry
that way, since nothing has confirmed a tag before the page loads, so the
no-JS page lost the dates of releases that really had shipped. It now keys on
`confirmedUnreleased`, the same distinction the heading label already drew.
That reached main because #263 was verified against the running dev server
and never against the built page.

Which is what site/scripts/changelog-dates.mjs is for. It reads the built
HTML and compares each card against CHANGELOG.md, and asks git whether a
dated version is actually tagged. Both faults above fail it:

  - 0.3.0: CHANGELOG.md dates it 2026-08-20, the page shows no date.
    A shipped release lost its date.
  - 0.3.1: CHANGELOG.md dates it 2026-08-24, but there is no v0.3.1 tag.
    The date goes on with the tag, not with the version bump.

Neither was visible to `astro check` or the a11y pass, and neither shows up
in a source diff. The site build job checks out with fetch-depth 0 so the tag
half has tags to ask about, and the script fails rather than skips when it
has none.
@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Site preview: https://pr-266.netscli-site-preview.pages.dev

Built from 41890c1 with NETSCLI_PREVIEW=1 — noindex, and analytics disabled so it does not report into netscli.com's numbers.

Production is unaffected: netscli.com is served from GitHub Pages via pages.yml, which is manual-only.

The check parsed "20 Aug 2026" and the CI runner renders "Aug 20, 2026":
release-list.ts formats with the ambient locale, so the same build produces
different text on an en-GB machine and an en-US runner, and a reader that
assumed either one failed on the other. It now formats the expected date the
way the page does -- same Intl options, same UTC-midnight Date -- and
compares the strings, so it agrees with whatever locale it runs in.

Both sabotage checks still fail as they should: 7 "lost its date" failures
with the mergeRelease regression reintroduced, and the untagged-version
failure with 0.3.1 re-dated.
@fstubner
fstubner merged commit 3052f7c into main Aug 28, 2026
16 checks passed
@fstubner
fstubner deleted the fix/changelog-tells-the-truth branch August 28, 2026 16:25
fstubner added a commit that referenced this pull request Aug 28, 2026
The 0.3.1 section stopped where #266 left it, and eleven merges since then
were undocumented with [Unreleased] empty. That is the same gap #266 fixed,
recreated by merging all day without writing entries as I went; the check
added in #266 catches a wrong date, not a missing entry.

Added: the tab context menu.

Website: even page padding, the heading scale, anchor links landing clear of
the header, the nav's hover highlight lining up with the current page's, the
theme selector's focus ring and dropdown, the search and menu buttons
matching, the breadcrumb separators, mobile search filling the screen, the
install section leading with winget and losing its repeated rows, the
interface coverage table's ticks and dashes and corrected semantics, and two
FAQ answers written from the Search Console data.

The winget entry is rewritten rather than added to. It said the submission
"would have published the wrong version"; `v0.2.2` through `v0.2.6` are
already in the public catalog that way, so it now says what actually
happened, that upgrades still work because winget normalises a leading `v`,
and that the publish job asserts the shape rather than trusting the strip.

Deliberately not listed, because a changelog is for people who use the thing
rather than people who build it, and none of these change what ships:

  - the dead-CSS prune (cascade winners identical before and after)
  - the preferences refactor (no behaviour change)
  - the Node version pin (contributors only)
  - the preview host change and its revert, which net to zero and were never
    in a release

astro check 0 errors, a11y 0 violations in both themes, and the new entries
render on the built changelog page.
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