From be0df96e9b7105fa6de4222b0915545490ae1faa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:56:40 +0000 Subject: [PATCH] feat: add extinctionMarker uniqueness validation in build-milestones.js and unit test Agent-Logs-Url: https://github.com/nitrocode/token-deathclock/sessions/b85f10fb-f28f-495c-9000-2bbb1711db50 Co-authored-by: nitrocode <7775707+nitrocode@users.noreply.github.com> --- scripts/build-milestones.js | 12 ++++++++++++ tests/death-clock.test.js | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/scripts/build-milestones.js b/scripts/build-milestones.js index 561ce12..a4fbf96 100644 --- a/scripts/build-milestones.js +++ b/scripts/build-milestones.js @@ -63,8 +63,20 @@ milestones.forEach((m, i) => { console.error(`ERROR: milestone[${i}] (id="${m.id}") reference must be a string URL.`); process.exit(1); } + + if (m.extinctionMarker !== undefined && m.extinctionMarker !== true) { + console.error(`ERROR: milestone[${i}] (id="${m.id}") extinctionMarker must be true if set.`); + process.exit(1); + } }); +const extinctionMarkers = milestones.filter((m) => m.extinctionMarker === true); +if (extinctionMarkers.length > 1) { + const ids = extinctionMarkers.map((m) => `"${m.id}"`).join(', '); + console.error(`ERROR: exactly one milestone may have extinctionMarker: true, but found ${extinctionMarkers.length}: ${ids}`); + process.exit(1); +} + // ── Generate JS ─────────────────────────────────────────────────────────────── function jsString(s) { // Emit as a template-literal-safe single-quoted JS string. diff --git a/tests/death-clock.test.js b/tests/death-clock.test.js index 5cee049..3ab889e 100644 --- a/tests/death-clock.test.js +++ b/tests/death-clock.test.js @@ -447,6 +447,11 @@ describe('Constants', () => { } }); + test('at most one milestone has extinctionMarker: true', () => { + const marked = MILESTONES.filter((m) => m.extinctionMarker === true); + expect(marked.length).toBeLessThanOrEqual(1); + }); + test('HISTORICAL_DATA is a non-empty array', () => { expect(Array.isArray(HISTORICAL_DATA)).toBe(true); expect(HISTORICAL_DATA.length).toBeGreaterThan(0);