diff --git a/src/lib/release-notes.test.ts b/src/lib/release-notes.test.ts index 584ce92..910afd7 100644 --- a/src/lib/release-notes.test.ts +++ b/src/lib/release-notes.test.ts @@ -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); + } + }); }); diff --git a/src/lib/release-notes.ts b/src/lib/release-notes.ts index 85842d5..2f25b9d 100644 --- a/src/lib/release-notes.ts +++ b/src/lib/release-notes.ts @@ -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.",