refactor(release-notes): drop the date field from the release registry

The date was kept in the registry as an authoring reference and never
rendered, but it was still a date sitting in the notes file, and a
date-shaped value can always find its way to a screen. The ReleaseNote
type has no date field at all now, so one cannot be added without a
deliberate change to the contract.

A test walks the registry and fails on any date — a stray property, a
headline or a line of copy — so the popup carries a release number and
a commit and nothing else.

Release 6 also says what it is: Payments and Approvals is in beta. The
schema and the enforcement hooks are live on the PocketBase, but the
backend behind the queue is still being worked on.
This commit is contained in:
Dave 2026-11-05 01:19:50 +02:00
parent de6de3340f
commit e12a5ccb32
2 changed files with 18 additions and 14 deletions

View file

@ -31,4 +31,17 @@ describe("the release-note registry", () => {
expect(release.items.length).toBeGreaterThan(0);
}
});
it("carries no date anywhere in the registry", () => {
// The popup must never show when work was done. The type no longer
// carries a date, so this guards the runtime shape as well — a date
// slipped in through a cast still has to fail here.
const DATE =
/\b\d{4}-\d{2}-\d{2}\b|\b\d{1,2}\s+(January|February|March|April|May|June|July|August|September|October|November|December)\b/i;
for (const release of RELEASE_NOTES) {
expect(Object.keys(release)).not.toContain("date");
expect(release.title).not.toMatch(DATE);
for (const item of release.items) expect(item).not.toMatch(DATE);
}
});
});

View file

@ -8,9 +8,10 @@
* stays deliberate rather than being generated from commit messages.
*
* A release is identified by its number and by the commit it went out
* with. There are no dates on screen — `date` is kept here only so the
* author can see which window of commits a release covers while writing
* it, and it is deliberately never rendered.
* with. There are no dates anywhere — not on screen, and not in this
* file either. A date would tell the office what day work was done, and
* that is not this popup's job. The `ReleaseNote` type has no date field,
* so a date cannot be added without a deliberate change to the contract.
*
* To publish a release:
* 1. merge the work, then take the short SHA — `git log --oneline -1`
@ -24,11 +25,6 @@ export interface ReleaseNote {
release: number;
/** Short SHA of the commit this release went out with. */
commit: string;
/**
* Authoring reference only — the day the release was written up.
* Deliberately never rendered: the popup carries no dates.
*/
date: string;
/** One-line headline for the release. */
title: string;
/** The changes, one sentence each. */
@ -39,9 +35,9 @@ export const RELEASE_NOTES: ReleaseNote[] = [
{
release: 6,
commit: "4eb6ebf",
date: "2026-11-05",
title: "Supplier payments and approvals, and a theme picker that tells the truth",
items: [
"Payments and Approvals is in beta. The backend behind it is still being worked on, so expect it to change shape as we go.",
"Payments and Approvals — a new page under Orders. Flag an order item that needs paying and it lands in one queue with the customer, the supplier and the items it covers.",
"Attach the supplier's invoice or pro forma to the request. The buyer's purchase order is linked for you, so nothing gets downloaded and uploaded twice.",
"Mark it paid with a proof of payment attached. Until it is paid, that item cannot be marked ready for collection or go out with a driver.",
@ -53,7 +49,6 @@ export const RELEASE_NOTES: ReleaseNote[] = [
{
release: 5,
commit: "139ea25",
date: "2026-11-01",
title: "Delivery Pool, letterhead lock and a dark mode section",
items: [
"Delivery Pool: invoiced lines waiting to go out, one card per customer invoice. Assign a driver, upload the signed copy, and the delivery closes.",
@ -66,7 +61,6 @@ export const RELEASE_NOTES: ReleaseNote[] = [
{
release: 4,
commit: "83aec14",
date: "2026-10-30",
title: "Collection Confirm gets a second pair of eyes",
items: [
"Collection Confirm: a Notes button on each PO card, so the driver photos can be checked against the PO before you confirm.",
@ -78,7 +72,6 @@ export const RELEASE_NOTES: ReleaseNote[] = [
{
release: 3,
commit: "3eea87e",
date: "2026-10-28",
title: "Auto-push and a shortcut to AI settings",
items: [
"Collection Confirm can auto-push purple cards straight on to invoicing, with a two-day log of everything it moved.",
@ -88,7 +81,6 @@ export const RELEASE_NOTES: ReleaseNote[] = [
{
release: 2,
commit: "b212d0f",
date: "2026-10-26",
title: "A phone board for the managers",
items: [
"/manager is a mobile board for the managers: every order and where it is, on a phone.",
@ -98,7 +90,6 @@ export const RELEASE_NOTES: ReleaseNote[] = [
{
release: 1,
commit: "55cc7fa",
date: "2026-10-24",
title: "One POS matcher, AI-only quote matching",
items: [
"One size-aware matcher now drives the quote assistant, the order fill and the blue price check — so they can't disagree about an item.",