Add changelog #71

Closed
opened 2026-08-08 01:45:26 +00:00 by Grandiras · 2 comments
Owner

Add a changelog, that feeds a simple modal dialog when clicked (simple sparkle or similar in the header when a new version is now used). Ensure the changelog is simple and easy to understand for non-technical users.

Add a changelog, that feeds a simple modal dialog when clicked (simple sparkle or similar in the header when a new version is now used). Ensure the changelog is simple and easy to understand for non-technical users.
Collaborator

🤖 On it — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 On it — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/241); the reply will link the full session transcript. 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-71/run-241.md) — updating every ~5 minutes while the task runs.
Collaborator

Pushed. Final summary:

Added a changelog and the "What's new" dialog it feeds, on branch claude/issue-71.

What a member sees. When the version on screen is one their browser hasn't read about, a sparkle appears in the header. Clicking it opens a dialog: one block per release, the date as the heading, the version as a footnote beside it, and a few bullets written for somebody who has never read the code. The entry that was new is marked while it's being read. Once opened, the sparkle is gone for good and What's new stays in the nav menu — which is also the one place in the app that names the running version, for a bug report.

The sparkle in the header, between the nav and the account

The dialog, light theme, with the newest release marked

Dark theme, German — the entries are translated like the rest of the app

On a phone: the menu row that keeps it once the sparkle has gone

Three decisions worth flagging.

  • One source of truth: Services/Changelog.cs, and deliberately no CHANGELOG.md beside it. Two lists of the same releases drift, and the one that drifts is the one nobody has open while writing code. So the entry is part of the change rather than part of the tag — written in the PR that makes the change, dated the day it lands. The release skill now checks before tagging that Changelog.Latest.Version is the version about to be cut.
  • Copy lives beside its version, not in the translation table (which would grow six keys per release whose only structure was their names). It's keyed by locale exactly the way Translations is, falls back to English by the same rule, and ChangelogTests re-imposes the same guards — both languages, nothing blank, no "handle" — plus a jargon guard, because this is the one piece of copy whose failure mode is sounding like a commit message.
  • What a browser has read is localStorage, like the theme and the install nudge — not a column on Member. HasUnseen compares for equality rather than order, so a rollback announces itself too.

I backfilled entries for 1.0.0 through 2.3.0 from the git history, and wrote 2.4.0 for what has landed since 2.3.0 (boards, board sharing, the general calendar, phone drag, this dialog). 2.4.0 is what this should ship as — the entry names that version, so tagging anything else would leave it announcing a release that never existed.

One trap the suite caught: excluding .nav-whatsnew from .board-user button:not(.nav-hamburger) adds a second :not(), which raises that selector above .board-user .nav-pref-options button and paints a surface over the theme pills — all three then read as chosen. prefs.spec.js failed on it; the icon button overrides those defaults from its own block instead, the way .nav-menu-install does.

Verified (no container engine in this runner, so I installed the .NET 10 SDK and Postgres and ran the app directly on :8090 in Development):

  • dotnet test Ponente.sln — 205 passing, 9 new.
  • Playwright against that live app: the new changelog.spec.js passes, plus prefs, install, i18n, board, mobile, filter, boards, calendar-all, auth-entrance, board-entrance, reconnect, icons.
  • Two pre-existing failures in this environment (boards.spec.js "the nav switches boards", calendar.spec.js "a six-week month fits a short window") — I confirmed both fail identically on unmodified main here, so they're environmental, not from this change. access.spec.js / pds.spec.js weren't run: no PDS container.

⏱ 21m 27s · 114 turns · tokens: 186.9k in / 53.4k out (+14780.8k cache-read)
📜 Full session transcript
→ Opened PR: #90

changelog-phone.png

Pushed. Final summary: Added a changelog and the "What's new" dialog it feeds, on branch **`claude/issue-71`**. **What a member sees.** When the version on screen is one their browser hasn't read about, a sparkle appears in the header. Clicking it opens a dialog: one block per release, the date as the heading, the version as a footnote beside it, and a few bullets written for somebody who has never read the code. The entry that was new is marked while it's being read. Once opened, the sparkle is gone for good and **What's new** stays in the nav menu — which is also the one place in the app that names the running version, for a bug report. ![The sparkle in the header, between the nav and the account](https://git.grandiras.net/attachments/259b501c-8528-4edf-88ce-d32cbf47956b) ![The dialog, light theme, with the newest release marked](https://git.grandiras.net/attachments/c8bee250-4782-4e40-97e1-ab1ee4e3bced) ![Dark theme, German — the entries are translated like the rest of the app](https://git.grandiras.net/attachments/504dadb2-056f-42f0-a1cd-469efe15a310) ![On a phone: the menu row that keeps it once the sparkle has gone](https://git.grandiras.net/attachments/7d81268c-a555-4361-92a9-a011ab0e84f2) **Three decisions worth flagging.** - **One source of truth: `Services/Changelog.cs`, and deliberately no `CHANGELOG.md` beside it.** Two lists of the same releases drift, and the one that drifts is the one nobody has open while writing code. So the entry is part of the change rather than part of the tag — written in the PR that makes the change, dated the day it lands. The release skill now checks before tagging that `Changelog.Latest.Version` is the version about to be cut. - **Copy lives beside its version, not in the translation table** (which would grow six keys per release whose only structure was their names). It's keyed by locale exactly the way `Translations` is, falls back to English by the same rule, and `ChangelogTests` re-imposes the same guards — both languages, nothing blank, no "handle" — plus a jargon guard, because this is the one piece of copy whose failure mode is *sounding like a commit message*. - **What a browser has read is localStorage**, like the theme and the install nudge — not a column on `Member`. `HasUnseen` compares for equality rather than order, so a rollback announces itself too. I backfilled entries for 1.0.0 through 2.3.0 from the git history, and wrote 2.4.0 for what has landed since 2.3.0 (boards, board sharing, the general calendar, phone drag, this dialog). **2.4.0 is what this should ship as** — the entry names that version, so tagging anything else would leave it announcing a release that never existed. One trap the suite caught: excluding `.nav-whatsnew` from `.board-user button:not(.nav-hamburger)` adds a second `:not()`, which raises that selector above `.board-user .nav-pref-options button` and paints a surface over the theme pills — all three then read as chosen. `prefs.spec.js` failed on it; the icon button overrides those defaults from its own block instead, the way `.nav-menu-install` does. **Verified** (no container engine in this runner, so I installed the .NET 10 SDK and Postgres and ran the app directly on `:8090` in Development): - `dotnet test Ponente.sln` — 205 passing, 9 new. - Playwright against that live app: the new `changelog.spec.js` passes, plus `prefs`, `install`, `i18n`, `board`, `mobile`, `filter`, `boards`, `calendar-all`, `auth-entrance`, `board-entrance`, `reconnect`, `icons`. - Two pre-existing failures in this environment (`boards.spec.js` "the nav switches boards", `calendar.spec.js` "a six-week month fits a short window") — I confirmed both fail identically on unmodified `main` here, so they're environmental, not from this change. `access.spec.js` / `pds.spec.js` weren't run: no PDS container. --- ⏱ 21m 27s · 114 turns · tokens: 186.9k in / 53.4k out (+14780.8k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-71/run-241.md) → Opened PR: https://git.grandiras.net/Grandiras/Ponente/pulls/90 ![changelog-phone.png](https://git.grandiras.net/attachments/9044e5d4-31b0-418e-8b8a-2cabe4a2f631)
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Grandiras/Ponente#71
No description provided.