From ccf0fc0444dd02275c72a9e544c9e7693fc50ead Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 18 Mar 2026 08:58:33 +0000
Subject: [PATCH 1/4] Initial plan
From 443678aabcd635c7169dc1ff726491ef587be6c2 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 18 Mar 2026 09:40:35 +0000
Subject: [PATCH 2/4] chore: upgrade to Node.js 25 across all workflows,
configs, and documentation
Co-authored-by: pethers <1726836+pethers@users.noreply.github.com>
---
.github/skills/ci-cd-security/SKILL.md | 2 +-
.../gh-aw-github-actions-integration/SKILL.md | 18 ++--
.../workflows/check-cia-schema-updates.yml | 2 +-
.../workflows/compile-agentic-workflows.yml | 2 +-
.github/workflows/copilot-setup-steps.yml | 2 +-
.github/workflows/data-pipeline.yml | 2 +-
.github/workflows/deploy-s3.yml | 2 +-
.github/workflows/javascript-testing.yml | 6 +-
.github/workflows/jsdoc-validation.yml | 4 +-
.github/workflows/lighthouse-ci.yml | 2 +-
.../workflows/news-article-generator.lock.yml | 2 +-
.github/workflows/news-article-generator.md | 2 +-
.../workflows/news-committee-reports.lock.yml | 2 +-
.github/workflows/news-committee-reports.md | 2 +-
.../workflows/news-evening-analysis.lock.yml | 2 +-
.github/workflows/news-evening-analysis.md | 2 +-
.../workflows/news-interpellations.lock.yml | 2 +-
.github/workflows/news-interpellations.md | 2 +-
.github/workflows/news-month-ahead.lock.yml | 2 +-
.github/workflows/news-month-ahead.md | 2 +-
.../workflows/news-monthly-review.lock.yml | 2 +-
.github/workflows/news-monthly-review.md | 2 +-
.github/workflows/news-motions.lock.yml | 2 +-
.github/workflows/news-motions.md | 2 +-
.github/workflows/news-propositions.lock.yml | 2 +-
.github/workflows/news-propositions.md | 2 +-
.../workflows/news-realtime-monitor.lock.yml | 2 +-
.github/workflows/news-realtime-monitor.md | 2 +-
.github/workflows/news-translate.lock.yml | 2 +-
.github/workflows/news-translate.md | 2 +-
.github/workflows/news-week-ahead.lock.yml | 2 +-
.github/workflows/news-week-ahead.md | 2 +-
.github/workflows/news-weekly-review.lock.yml | 2 +-
.github/workflows/news-weekly-review.md | 2 +-
.github/workflows/quality-checks.yml | 6 +-
.github/workflows/release.yml | 4 +-
.github/workflows/sync-cia-schemas.yml | 2 +-
.github/workflows/test-dashboard.yml | 4 +-
.github/workflows/test-homepage.yml | 4 +-
.github/workflows/test-news.yml | 4 +-
.github/workflows/translation-validation.yml | 2 +-
.github/workflows/update-cia-stats.yml | 2 +-
.github/workflows/validate-cia-data.yml | 2 +-
.nvmrc | 1 +
End-of-Life-Strategy.md | 96 +++++++++++++------
FUTURE_ARCHITECTURE.md | 2 +-
FUTURE_WORKFLOWS.md | 26 ++---
README.md | 4 +-
TESTING.md | 4 +-
WORKFLOWS.md | 34 +++----
package-lock.json | 2 +-
package.json | 2 +-
52 files changed, 166 insertions(+), 125 deletions(-)
create mode 100644 .nvmrc
diff --git a/.github/skills/ci-cd-security/SKILL.md b/.github/skills/ci-cd-security/SKILL.md
index 927dc07d1..88c8908e2 100644
--- a/.github/skills/ci-cd-security/SKILL.md
+++ b/.github/skills/ci-cd-security/SKILL.md
@@ -99,7 +99,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install Dependencies
diff --git a/.github/skills/gh-aw-github-actions-integration/SKILL.md b/.github/skills/gh-aw-github-actions-integration/SKILL.md
index 579092abb..22af6e2d0 100644
--- a/.github/skills/gh-aw-github-actions-integration/SKILL.md
+++ b/.github/skills/gh-aw-github-actions-integration/SKILL.md
@@ -106,7 +106,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install Dependencies
@@ -323,7 +323,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install Dependencies
@@ -465,7 +465,7 @@ jobs:
- name: Setup Environment
uses: actions/setup-node@v4
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install Dependencies
@@ -532,7 +532,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install Dependencies
@@ -615,7 +615,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Setup Python
@@ -781,7 +781,7 @@ jobs:
- name: Setup Environment
uses: actions/setup-node@v4
with:
- node-version: '24'
+ node-version: '25'
- name: Run Agent Analysis
env:
@@ -903,7 +903,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
- node-version: ['24']
+ node-version: ['25']
fail-fast: false
steps:
@@ -961,7 +961,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install Dependencies
@@ -1261,7 +1261,7 @@ jobs:
my-task:
uses: ./.github/workflows/reusable-agent-setup.yml
with:
- node-version: '24'
+ node-version: '25'
python-version: '3.11'
secrets:
anthropic-key: ${{ secrets.ANTHROPIC_API_KEY }}
diff --git a/.github/workflows/check-cia-schema-updates.yml b/.github/workflows/check-cia-schema-updates.yml
index 96543ec91..8763a62a3 100644
--- a/.github/workflows/check-cia-schema-updates.yml
+++ b/.github/workflows/check-cia-schema-updates.yml
@@ -31,7 +31,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/compile-agentic-workflows.yml b/.github/workflows/compile-agentic-workflows.yml
index 0e4afc69c..9c32cf9bb 100644
--- a/.github/workflows/compile-agentic-workflows.yml
+++ b/.github/workflows/compile-agentic-workflows.yml
@@ -30,7 +30,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install gh-aw CLI
run: |
diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml
index b4f05fbd3..32bcbea5c 100644
--- a/.github/workflows/copilot-setup-steps.yml
+++ b/.github/workflows/copilot-setup-steps.yml
@@ -67,7 +67,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: "24"
+ node-version: "25"
- name: Cache dependencies
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
diff --git a/.github/workflows/data-pipeline.yml b/.github/workflows/data-pipeline.yml
index 2f2820660..1619aa6a4 100644
--- a/.github/workflows/data-pipeline.yml
+++ b/.github/workflows/data-pipeline.yml
@@ -40,7 +40,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/deploy-s3.yml b/.github/workflows/deploy-s3.yml
index f4c211c7f..db933267e 100644
--- a/.github/workflows/deploy-s3.yml
+++ b/.github/workflows/deploy-s3.yml
@@ -87,7 +87,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/javascript-testing.yml b/.github/workflows/javascript-testing.yml
index ea5eca26e..8a7d18787 100644
--- a/.github/workflows/javascript-testing.yml
+++ b/.github/workflows/javascript-testing.yml
@@ -64,7 +64,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
@@ -113,7 +113,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
@@ -163,7 +163,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/jsdoc-validation.yml b/.github/workflows/jsdoc-validation.yml
index 8eaef7ee3..827e3636b 100644
--- a/.github/workflows/jsdoc-validation.yml
+++ b/.github/workflows/jsdoc-validation.yml
@@ -23,10 +23,10 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- - name: Setup Node.js 24
+ - name: Setup Node.js 25
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install Dependencies
diff --git a/.github/workflows/lighthouse-ci.yml b/.github/workflows/lighthouse-ci.yml
index 05dc6cf2b..07d3d76dd 100644
--- a/.github/workflows/lighthouse-ci.yml
+++ b/.github/workflows/lighthouse-ci.yml
@@ -48,7 +48,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
- name: Prepare audit URLs
id: urls
diff --git a/.github/workflows/news-article-generator.lock.yml b/.github/workflows/news-article-generator.lock.yml
index 71030c4f2..3cb5c53e5 100644
--- a/.github/workflows/news-article-generator.lock.yml
+++ b/.github/workflows/news-article-generator.lock.yml
@@ -320,7 +320,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-article-generator.md b/.github/workflows/news-article-generator.md
index 46901fd17..57d87b993 100644
--- a/.github/workflows/news-article-generator.md
+++ b/.github/workflows/news-article-generator.md
@@ -97,7 +97,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-committee-reports.lock.yml b/.github/workflows/news-committee-reports.lock.yml
index 63b01c165..b2d118146 100644
--- a/.github/workflows/news-committee-reports.lock.yml
+++ b/.github/workflows/news-committee-reports.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-committee-reports.md b/.github/workflows/news-committee-reports.md
index 8ed5d2295..112690096 100644
--- a/.github/workflows/news-committee-reports.md
+++ b/.github/workflows/news-committee-reports.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-evening-analysis.lock.yml b/.github/workflows/news-evening-analysis.lock.yml
index 04d4e4ce3..ed7f12219 100644
--- a/.github/workflows/news-evening-analysis.lock.yml
+++ b/.github/workflows/news-evening-analysis.lock.yml
@@ -304,7 +304,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-evening-analysis.md b/.github/workflows/news-evening-analysis.md
index 7fe446aaa..35bc3e7e9 100644
--- a/.github/workflows/news-evening-analysis.md
+++ b/.github/workflows/news-evening-analysis.md
@@ -93,7 +93,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-interpellations.lock.yml b/.github/workflows/news-interpellations.lock.yml
index d1fa61f70..b86b4d0a5 100644
--- a/.github/workflows/news-interpellations.lock.yml
+++ b/.github/workflows/news-interpellations.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-interpellations.md b/.github/workflows/news-interpellations.md
index e82507df3..a7411fc7f 100644
--- a/.github/workflows/news-interpellations.md
+++ b/.github/workflows/news-interpellations.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-month-ahead.lock.yml b/.github/workflows/news-month-ahead.lock.yml
index f119eef60..a26cca780 100644
--- a/.github/workflows/news-month-ahead.lock.yml
+++ b/.github/workflows/news-month-ahead.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-month-ahead.md b/.github/workflows/news-month-ahead.md
index a8e557685..5c9c2f9e7 100644
--- a/.github/workflows/news-month-ahead.md
+++ b/.github/workflows/news-month-ahead.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-monthly-review.lock.yml b/.github/workflows/news-monthly-review.lock.yml
index bf3d0c9c7..6fcefd7dd 100644
--- a/.github/workflows/news-monthly-review.lock.yml
+++ b/.github/workflows/news-monthly-review.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-monthly-review.md b/.github/workflows/news-monthly-review.md
index 00e88270b..e15578e9d 100644
--- a/.github/workflows/news-monthly-review.md
+++ b/.github/workflows/news-monthly-review.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-motions.lock.yml b/.github/workflows/news-motions.lock.yml
index 90629b1bc..c51c324fe 100644
--- a/.github/workflows/news-motions.lock.yml
+++ b/.github/workflows/news-motions.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-motions.md b/.github/workflows/news-motions.md
index de5a96b24..c0977452f 100644
--- a/.github/workflows/news-motions.md
+++ b/.github/workflows/news-motions.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-propositions.lock.yml b/.github/workflows/news-propositions.lock.yml
index e3d637f3c..9bfd224f7 100644
--- a/.github/workflows/news-propositions.lock.yml
+++ b/.github/workflows/news-propositions.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-propositions.md b/.github/workflows/news-propositions.md
index 4231bbaaf..b625aea3f 100644
--- a/.github/workflows/news-propositions.md
+++ b/.github/workflows/news-propositions.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-realtime-monitor.lock.yml b/.github/workflows/news-realtime-monitor.lock.yml
index 2469e2c3c..602408383 100644
--- a/.github/workflows/news-realtime-monitor.lock.yml
+++ b/.github/workflows/news-realtime-monitor.lock.yml
@@ -305,7 +305,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-realtime-monitor.md b/.github/workflows/news-realtime-monitor.md
index cae7ec697..0e91366c8 100644
--- a/.github/workflows/news-realtime-monitor.md
+++ b/.github/workflows/news-realtime-monitor.md
@@ -96,7 +96,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-translate.lock.yml b/.github/workflows/news-translate.lock.yml
index 307faadf9..ab1638bf3 100644
--- a/.github/workflows/news-translate.lock.yml
+++ b/.github/workflows/news-translate.lock.yml
@@ -312,7 +312,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-translate.md b/.github/workflows/news-translate.md
index 0f1f7a9fb..3c198389d 100644
--- a/.github/workflows/news-translate.md
+++ b/.github/workflows/news-translate.md
@@ -94,7 +94,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-week-ahead.lock.yml b/.github/workflows/news-week-ahead.lock.yml
index 726813391..25cefffae 100644
--- a/.github/workflows/news-week-ahead.lock.yml
+++ b/.github/workflows/news-week-ahead.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-week-ahead.md b/.github/workflows/news-week-ahead.md
index dccc4c9a5..0594e2b04 100644
--- a/.github/workflows/news-week-ahead.md
+++ b/.github/workflows/news-week-ahead.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/news-weekly-review.lock.yml b/.github/workflows/news-weekly-review.lock.yml
index 69bbb1b24..d2015429f 100644
--- a/.github/workflows/news-weekly-review.lock.yml
+++ b/.github/workflows/news-weekly-review.lock.yml
@@ -296,7 +296,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
package-manager-cache: false
- name: Create gh-aw temp directory
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh
diff --git a/.github/workflows/news-weekly-review.md b/.github/workflows/news-weekly-review.md
index 10076f5d8..bc0da10a3 100644
--- a/.github/workflows/news-weekly-review.md
+++ b/.github/workflows/news-weekly-review.md
@@ -82,7 +82,7 @@ steps:
- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
- node-version: '24'
+ node-version: '25'
- name: Install dependencies
run: |
diff --git a/.github/workflows/quality-checks.yml b/.github/workflows/quality-checks.yml
index c50799d36..7f124c471 100644
--- a/.github/workflows/quality-checks.yml
+++ b/.github/workflows/quality-checks.yml
@@ -31,7 +31,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
@@ -83,7 +83,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
- name: Cache npm global packages
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
@@ -158,7 +158,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
- name: Cache npm packages
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8869a8bc5..3a34d0f85 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -100,7 +100,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: "24"
+ node-version: "25"
cache: "npm"
- name: Cache dependencies
@@ -389,7 +389,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: "24"
+ node-version: "25"
cache: "npm"
- name: Cache dependencies
diff --git a/.github/workflows/sync-cia-schemas.yml b/.github/workflows/sync-cia-schemas.yml
index b7b5e49e5..70a7bf9fb 100644
--- a/.github/workflows/sync-cia-schemas.yml
+++ b/.github/workflows/sync-cia-schemas.yml
@@ -32,7 +32,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/test-dashboard.yml b/.github/workflows/test-dashboard.yml
index 206f138c4..2a9db1f54 100644
--- a/.github/workflows/test-dashboard.yml
+++ b/.github/workflows/test-dashboard.yml
@@ -45,7 +45,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
@@ -86,7 +86,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/test-homepage.yml b/.github/workflows/test-homepage.yml
index b6f7c3a59..7bb800c7c 100644
--- a/.github/workflows/test-homepage.yml
+++ b/.github/workflows/test-homepage.yml
@@ -45,7 +45,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
@@ -85,7 +85,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/test-news.yml b/.github/workflows/test-news.yml
index 1acc78171..12e3333e6 100644
--- a/.github/workflows/test-news.yml
+++ b/.github/workflows/test-news.yml
@@ -45,7 +45,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
@@ -86,7 +86,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/translation-validation.yml b/.github/workflows/translation-validation.yml
index c86a460df..59980c7e4 100644
--- a/.github/workflows/translation-validation.yml
+++ b/.github/workflows/translation-validation.yml
@@ -37,7 +37,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Validate all translation files
diff --git a/.github/workflows/update-cia-stats.yml b/.github/workflows/update-cia-stats.yml
index bb77f36f2..10efa3360 100644
--- a/.github/workflows/update-cia-stats.yml
+++ b/.github/workflows/update-cia-stats.yml
@@ -44,7 +44,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.github/workflows/validate-cia-data.yml b/.github/workflows/validate-cia-data.yml
index 43b92dd45..d777aa3c0 100644
--- a/.github/workflows/validate-cia-data.yml
+++ b/.github/workflows/validate-cia-data.yml
@@ -42,7 +42,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
- node-version: '24'
+ node-version: '25'
cache: 'npm'
- name: Install dependencies
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 000000000..7273c0fa8
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+25
diff --git a/End-of-Life-Strategy.md b/End-of-Life-Strategy.md
index 968c05df5..1af2f17ac 100644
--- a/End-of-Life-Strategy.md
+++ b/End-of-Life-Strategy.md
@@ -6,24 +6,26 @@
๐ Technology Lifecycle Management for Static Intelligence Platform
- ๐ฆ Node.js 24 LTS Maintenance โข ๐ Vite/Vitest Ecosystem โข โก Future-Ready Architecture
+ ๐ฆ Node.js 25 Current โข โญ๏ธ Node.js 26 LTS Upgrade Imminent โข โก Future-Ready Architecture
-
+
-**๐ Document Owner:** CEO | **๐ Version:** 1.0 | **๐
Last Updated:** 2026-03-12 (UTC)
-**๐ Review Cycle:** Annual | **โฐ Next Review:** 2027-03-12
+**๐ Document Owner:** CEO | **๐ Version:** 1.1 | **๐
Last Updated:** 2026-03-18 (UTC)
+**๐ Review Cycle:** Annual | **โฐ Next Review:** 2027-03-18
---
## Overview
-**Riksdagsmonitor** is a static HTML5/CSS3 website deployed to AWS CloudFront + S3 (primary) and GitHub Pages (disaster recovery), built with **Vite**, tested with **Vitest** and **Cypress**, and powered by **Node.js 24 LTS**. The platform provides Swedish Parliament transparency through interactive **Chart.js** and **D3.js** visualisations across **14 languages**.
+**Riksdagsmonitor** is a static HTML5/CSS3 website deployed to AWS CloudFront + S3 (primary) and GitHub Pages (disaster recovery), built with **Vite**, tested with **Vitest** and **Cypress**, and powered by **Node.js 25 Current**. The platform provides Swedish Parliament transparency through interactive **Chart.js** and **D3.js** visualisations across **14 languages**.
+
+> **โก Upgrade Notice (March 2026):** Riksdagsmonitor has been upgraded to Node.js 25 (Current) as a stepping stone in preparation for the imminent **Node.js 26 LTS release (~April 1, 2026)**. Node.js 26 will be adopted immediately upon its release to stay on the supported LTS track. See the [Node.js Migration Roadmap](#๏ธ-nodejs-migration-roadmap) for the full plan.
This document defines the technology lifecycle management strategy โ covering the current stack, Node.js release schedule evolution, dependency EOL timelines, and migration plans โ to ensure stability, compatibility, and security throughout the project's operational life.
@@ -36,7 +38,7 @@ This strategy should be read alongside the [Business Continuity Plan](BCPPlan.md
**Primary Goal**: Maintain Riksdagsmonitor on a supported, secure technology stack by proactively tracking dependency lifecycles and planning migrations before components reach end-of-life.
**Key Principles**:
-- Upgrade to new Node.js LTS versions within **6 months** of release
+- Upgrade to new Node.js Current versions promptly; adopt LTS within **4 weeks** of promotion
- Keep build tooling (Vite, Vitest, TypeScript) on latest stable versions
- Maintain zero known critical/high vulnerabilities via automated scanning
- Plan major migrations **12 months** before dependency EOL dates
@@ -109,7 +111,7 @@ This allows early detection of breaking changes in Node.js alpha while keeping p
| Category | Technology | Current Version | EOL Date | Replacement Path |
|----------|-----------|----------------|----------|-----------------|
-| **Runtime** | [Node.js 24 LTS](https://nodejs.org/) | 24.14.0 | **October 2026** (end of Active LTS) / **April 2028** (Maintenance EOL) | Node.js 26 LTS โ Node.js 27 LTS |
+| **Runtime** | [Node.js 25 Current](https://nodejs.org/) | 25.x | **April 2026** (EOL when Node.js 26 releases) | Node.js 26 LTS (**imminent**, ~April 2026) โ Node.js 27 LTS |
| **Package Manager** | [npm](https://www.npmjs.com/) | Bundled with Node.js | Follows Node.js | Follows Node.js upgrades |
| **Language** | [TypeScript](https://www.typescriptlang.org/) | 5.9.3 | Active (monthly releases) | Track latest stable |
| **Build Tool** | [Vite](https://vite.dev/) | 7.3.1 | Active | Track latest major |
@@ -149,27 +151,45 @@ This allows early detection of breaking changes in Node.js alpha while keeping p
## ๐๏ธ Node.js Migration Roadmap
-### Current: Node.js 24 LTS (Active)
+### โ
Completed: Node.js 24 LTS
-| Milestone | Date | Action |
+| Milestone | Date | Status |
|-----------|------|--------|
| Node.js 24 Current Release | April 2025 | โ
Adopted |
| Node.js 24 LTS Promotion | October 2025 | โ
Production deployment |
-| Node.js 24 Active LTS End | **October 2026** | Begin migration to Node.js 26 LTS |
-| Node.js 24 Maintenance End | **April 2028** | Must be off Node.js 24 |
+| Node.js 24 โ 25 Migration | March 2026 | โ
**Completed** (this release) |
+
+### ๐ก Current: Node.js 25 Current (Interim)
+
+Node.js 25 is an **odd-numbered Current release** under the old model โ it will not receive LTS status. It serves as an interim upgrade to test Node.js 25 features and prepare for the imminent Node.js 26 LTS.
+
+| Milestone | Date | Action |
+|-----------|------|--------|
+| Node.js 25 Current Release | October 2025 | โ
Available |
+| Riksdagsmonitor upgrade to 25 | **March 2026** | โ
**Completed** |
+| Node.js 25 EOL | **~April 2026** | Node.js 26 releases โ 25 reaches EOL |
-### Next: Node.js 26 LTS (Old Schedule)
+> โ ๏ธ **Node.js 25 is short-lived.** Riksdagsmonitor will be on Node.js 25 for only ~2 weeks before upgrading to Node.js 26 LTS upon its release.
-Node.js 26 is the **last release under the old two-per-year schedule**.
+### ๐ Imminent: Node.js 26 LTS (Action: Upgrade in ~2 weeks)
+
+Node.js 26 is the **last release under the old two-per-year schedule** and will become LTS in October 2026. We plan to upgrade **immediately after Node.js 26 is released**.
| Milestone | Date | Action |
|-----------|------|--------|
-| Node.js 26 Current Release | April 2026 | Evaluate in CI |
-| Node.js 26 LTS Promotion | October 2026 | Plan migration |
-| Migration Window | Oct 2026 โ Mar 2027 | Upgrade riksdagsmonitor to Node.js 26 |
+| Node.js 26 Current Release | **~April 1, 2026** | ๐ **Upgrade riksdagsmonitor immediately after release** |
+| Node.js 26 LTS Promotion | October 2026 | โ
Already on Node.js 26 |
| Node.js 26 Active LTS End | **October 2027** | Begin evaluating Node.js 27 |
| Node.js 26 Maintenance End | **April 2029** | Must be off Node.js 26 |
+**Upgrade preparation checklist (for Node.js 26):**
+- [ ] Monitor [Node.js 26 release notes](https://nodejs.org/en/blog/) for breaking changes
+- [ ] Test `npm ci` and build/test suite on Node.js 26 RC in CI matrix
+- [ ] Update all `node-version: '25'` โ `'26'` across workflows
+- [ ] Update `package.json` `engines.node` from `>=25` to `>=26`
+- [ ] Update `.nvmrc` from `25` to `26`
+- [ ] Update documentation (End-of-Life-Strategy.md, WORKFLOWS.md, FUTURE_WORKFLOWS.md)
+
### Future: Node.js 27 LTS (New Schedule)
Node.js 27 is the **first release under the new one-per-year schedule** where every release becomes LTS.
@@ -182,6 +202,16 @@ Node.js 27 is the **first release under the new one-per-year schedule** where ev
| Migration Window | Oct 2027 โ Mar 2028 | Upgrade riksdagsmonitor to Node.js 27 |
| Node.js 27 EOL | ~April 2030 | Plan next migration |
+### Future: Node.js 28 LTS (New Schedule)
+
+| Milestone | Date | Action |
+|-----------|------|--------|
+| Node.js 28 Alpha Phase | October 2027 โ March 2028 | Add alpha to CI matrix |
+| Node.js 28 Current Release | April 2028 | Evaluate compatibility |
+| Node.js 28 LTS Promotion | October 2028 | Plan migration from Node.js 27 |
+| Migration Window | Oct 2028 โ Mar 2029 | Upgrade riksdagsmonitor to Node.js 28 |
+| Node.js 28 EOL | ~April 2031 | Plan next migration |
+
### Long-Term Node.js Upgrade Calendar
```mermaid
@@ -190,25 +220,31 @@ gantt
dateFormat YYYY-MM
axisFormat %Y-%m
- section Node.js 24 (old model)
- Active LTS :active, n24lts, 2025-10, 2026-10
- Maintenance :n24maint, 2026-10, 2028-04
- Migration Off 24 :crit, m24, 2026-10, 2027-03
+ section Node.js 24 (completed)
+ Active LTS :done, n24lts, 2025-10, 2026-03
+ Migration Off 24 :done, m24, 2026-03, 2026-03
+
+ section Node.js 25 (interim โ Current only)
+ Current (interim) :active, n25curr, 2025-10, 2026-04
+ Riksdagsmonitor on 25:crit, rm25, 2026-03, 2026-04
- section Node.js 26 (last old-model)
- Current :n26curr, 2026-04, 2026-10
- Active LTS :n26lts, 2026-10, 2027-10
- Maintenance :n26maint, 2027-10, 2029-04
+ section Node.js 26 (last old-model โ LTS)
+ Current :n26curr, 2026-04, 2026-10
+ Active LTS :n26lts, 2026-10, 2027-10
+ Maintenance :n26maint, 2027-10, 2029-04
+ Riksdagsmonitor on 26:active, rm26, 2026-04, 2027-10
section Node.js 27 (new model โ first annual LTS)
Alpha (27.0.0-alpha.x):n27alpha, 2026-10, 2027-04
Current :n27curr, 2027-04, 2027-10
LTS :n27lts, 2027-10, 2030-04
+ Riksdagsmonitor on 27 :rm27, 2027-10, 2030-04
section Node.js 28 (new model)
Alpha (28.0.0-alpha.x):n28alpha, 2027-10, 2028-04
Current :n28curr, 2028-04, 2028-10
LTS :n28lts, 2028-10, 2031-04
+ Riksdagsmonitor on 28 :rm28, 2028-10, 2031-04
```
---
@@ -252,7 +288,7 @@ Riksdagsmonitor outputs **static HTML5, CSS3, and ES2020+ JavaScript**. Browser
| GitHub Actions runners | `ubuntu-latest` | Auto-updated by GitHub |
| Action versions | SHA-pinned | Update via Dependabot |
| step-security/harden-runner | SHA-pinned | Update via Dependabot |
-| Node.js in CI | `node-version: '24'` | Update with LTS migrations |
+| Node.js in CI | `node-version: '25'` | Update with each Node.js migration |
---
@@ -262,7 +298,8 @@ Riksdagsmonitor outputs **static HTML5, CSS3, and ES2020+ JavaScript**. Browser
| Risk | Likelihood | Impact | Mitigation |
|------|-----------|--------|------------|
-| Node.js 24 reaches EOL before migration | Low | High | Migration planned 12+ months before Maintenance EOL (April 2028) |
+| Node.js 25 reaches EOL before Node.js 26 upgrade | **Very Low** | Medium | Node.js 26 upgrade planned immediately (~2 weeks); automated process ready |
+| Node.js 26 breaking changes | Low | Medium | Test on Node.js 26 RC in CI matrix before it releases |
| Vite major breaking changes | Medium | Medium | Pin to major version, test upgrades in branch |
| Chart.js/D3.js API deprecation | Low | Medium | Abstraction layer isolates visualisation logic |
| Cypress major breaking changes | Medium | Low | E2E tests are supplementary; can temporarily skip |
@@ -273,7 +310,8 @@ Riksdagsmonitor outputs **static HTML5, CSS3, and ES2020+ JavaScript**. Browser
| Migration | Complexity | Estimated Effort | Risk Level |
|-----------|-----------|-----------------|------------|
-| Node.js 24 โ 26 | Low | 1โ2 days | ๐ข Low |
+| Node.js 24 โ 25 | Very Low | < 1 day | ๐ข Very Low |
+| Node.js 25 โ 26 (**imminent**) | Very Low | < 1 day | ๐ข Very Low |
| Node.js 26 โ 27 (new schedule) | Low | 1โ2 days | ๐ข Low |
| Vite 7 โ next major | Medium | 2โ5 days | ๐ก Medium |
| TypeScript 5 โ 6 | LowโMedium | 1โ3 days | ๐ข Low |
@@ -355,6 +393,6 @@ The ongoing maintenance strategy aligns with Hack23 AB's [ISMS-PUBLIC framework]
**โ
Approved by:** James Pether Sรถrling, CEO
**๐ค Distribution:** Public
**๐ท๏ธ Classification:** [](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md#confidentiality-levels) [](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md#integrity-levels) [](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md#availability-levels)
-**๐
Effective Date:** 2026-03-12
-**โฐ Next Review:** 2027-03-12
+**๐
Effective Date:** 2026-03-18
+**โฐ Next Review:** 2027-03-18
**๐ฏ Framework Compliance:** [](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) [](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) [](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md)
diff --git a/FUTURE_ARCHITECTURE.md b/FUTURE_ARCHITECTURE.md
index 334643580..63ebfdca8 100644
--- a/FUTURE_ARCHITECTURE.md
+++ b/FUTURE_ARCHITECTURE.md
@@ -604,7 +604,7 @@ Amplify Hosting (SSR) โ CloudFront
**Compute:**
| Current | Future | Rationale |
|---------|--------|-----------|
-| Static HTML | AWS Lambda (Python 3.12, Node.js 24) | Serverless functions, pay-per-request |
+| Static HTML | AWS Lambda (Python 3.12, Node.js 25) | Serverless functions, pay-per-request |
| N/A | AWS Amplify Hosting | Server-side rendering (SSR), edge functions |
**API:**
diff --git a/FUTURE_WORKFLOWS.md b/FUTURE_WORKFLOWS.md
index e4b1ebefa..0f326407b 100644
--- a/FUTURE_WORKFLOWS.md
+++ b/FUTURE_WORKFLOWS.md
@@ -1,7 +1,7 @@
# ๐ฎ Riksdagsmonitor โ Future Workflows Vision
-**Document Version:** 2.1
-**Last Updated:** 2026-03-10
+**Document Version:** 2.2
+**Last Updated:** 2026-03-18
**Classification:** Public
**Owner:** Hack23 AB (Org.nr 5595347807)
**Horizon:** 2026โ2037
@@ -602,10 +602,11 @@ architecture:
| Year | Node.js | TypeScript | Bundler | Test Runner |
|------|---------|------------|---------|-------------|
-| 2026 | 24 | 5.9 | Vite 7 | Vitest 4 |
-| 2027 | 26 | 6.x | Vite 8 | Vitest 5 |
-| 2028 | 28 | 7.x | Vite 9 / Turbopack | Vitest 6 |
-| 2029 | 30 | 8.x | Next-gen bundler | Native test runner |
+| 2026 Q1 | 25 (Current) | 5.9 | Vite 7 | Vitest 4 |
+| 2026 Q2 | **26 LTS** (upgrade ~Apr 1) | 5.9 | Vite 7 | Vitest 4 |
+| 2027 | 27 LTS (new model) | 6.x | Vite 8 | Vitest 5 |
+| 2028 | 28 LTS (new model) | 7.x | Vite 9 / Turbopack | Vitest 6 |
+| 2029 | 29 LTS (new model) | 8.x | Next-gen bundler | Native test runner |
### AI & ML
@@ -667,11 +668,12 @@ gantt
| Year | Projected Total | New Capabilities |
|------|----------------|------------------|
-| 2026 Q1 | **43** | TypeScript foundation, 10 agentic workflows โ
|
+| 2026 Q1 | **43** | TypeScript foundation, 10 agentic workflows, Node.js 25 โ
|
+| 2026 Q2 | **44** | **Node.js 26 LTS upgrade** (immediately after ~Apr 1 release) |
| 2026 Q4 | **50** | CIA pipeline v2, preview deploys, visual regression |
-| 2027 Q4 | **55** | OSINT pipeline, ML predictions, real-time streams |
-| 2028 Q4 | **65** | Self-healing, canary deploy, AI editorial board |
-| 2029 Q4 | **75+** | Intelligence API, multi-parliament, federation |
+| 2027 Q4 | **55** | Node.js 27 LTS, OSINT pipeline, ML predictions, real-time streams |
+| 2028 Q4 | **65** | Node.js 28 LTS, self-healing, canary deploy, AI editorial board |
+| 2029 Q4 | **75+** | Node.js 29 LTS, intelligence API, multi-parliament, federation |
---
@@ -827,7 +829,7 @@ gantt
---
-**Document Version:** 2.1
-**Last Updated:** 2026-03-10
+**Document Version:** 2.2
+**Last Updated:** 2026-03-18
**Classification:** Public
**Owner:** Hack23 AB
diff --git a/README.md b/README.md
index 549657d56..01a460baa 100644
--- a/README.md
+++ b/README.md
@@ -323,7 +323,7 @@ Riksdagsmonitor integrates multiple authoritative Swedish open data sources:
- **Hosting:** GitHub Pages with CloudFront CDN
- **CI/CD:** GitHub Actions for automated testing and deployment
- **Data Platform:** CIA OSINT platform (Java/Spring Boot backend)
-- **Runtime:** Node.js 24.x
+- **Runtime:** Node.js 25.x
### JavaScript Architecture
- **8 Dashboard Modules:**
@@ -401,7 +401,7 @@ At Hack23 AB, we believe that true security comes through transparency and demon
## ๐ Development
### Prerequisites
-- **Node.js**: 24.x or higher
+- **Node.js**: 25.x or higher
- **npm**: 10.x or higher (comes with Node.js)
- Git with GPG signing configured
- GitHub account with MFA enabled
diff --git a/TESTING.md b/TESTING.md
index 3d496eca6..5b6cf517a 100644
--- a/TESTING.md
+++ b/TESTING.md
@@ -372,7 +372,7 @@ jobs:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
- node-version: '24'
+ node-version: '25'
- run: npm ci
- run: npm test
- run: npm run test:coverage
@@ -394,7 +394,7 @@ jobs:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
- node-version: '24'
+ node-version: '25'
- run: npm ci
- run: npm run build
- run: npm run cypress:run
diff --git a/WORKFLOWS.md b/WORKFLOWS.md
index de73ab642..c61f2cbea 100644
--- a/WORKFLOWS.md
+++ b/WORKFLOWS.md
@@ -17,7 +17,7 @@
[](https://riksdagsmonitor.com/docs/coverage/)
**Document Version:** 6.0
-**Last Updated:** 2026-03-10
+**Last Updated:** 2026-03-18
**Classification:** Public
**Owner:** Hack23 AB (Org.nr 5595347807)
@@ -25,7 +25,7 @@
This document describes the Continuous Integration and Continuous Deployment (CI/CD) workflows for Riksdagsmonitor. All workflows are implemented using GitHub Actions and follow Hack23 AB's [Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md).
-The project has been migrated from JavaScript to **TypeScript** (31 modules in `src/browser/`) with all workflows updated accordingly. TypeScript compilation is handled by Vite (esbuild) for browser bundles and Node 24's native type-stripping for scripts.
+The project has been migrated from JavaScript to **TypeScript** (31 modules in `src/browser/`) with all workflows updated accordingly. TypeScript compilation is handled by Vite (esbuild) for browser bundles and Node 25's native type-stripping for scripts.
**Total Workflows: 43** (23 standard YAML + 10 agentic markdown sources + 10 compiled lock files)
**Security Compliance: 100%** (all actions SHA-pinned, harden-runner enabled)
@@ -35,7 +35,7 @@ The project has been migrated from JavaScript to **TypeScript** (31 modules in `
| Component | Version | Purpose |
|-----------|---------|---------|
-| Node.js | 24 | Runtime (native TypeScript strip-types) |
+| Node.js | 25 | Runtime (native TypeScript strip-types) |
| TypeScript | 5.9.3 | Type system |
| Vite | 7.3.1 | Build toolchain (esbuild) |
| Vitest | 4.0.18 | Unit testing (2890 tests) |
@@ -189,7 +189,7 @@ graph TD
```yaml
steps:
- Checkout
- - Setup Node.js 24
+ - Setup Node.js 25
- Install dependencies (npm ci)
- Run ESLint: npx eslint .
- Artifact upload: eslint-results
@@ -238,7 +238,7 @@ Generates a consolidated step summary with pass/fail status for all jobs.
```yaml
steps:
- Checkout
- - Setup Node.js 24
+ - Setup Node.js 25
- Install dependencies
- TypeScript type-check (browser): npx tsc --project tsconfig.browser.json --noEmit
- TypeScript type-check (scripts): npx tsc --project tsconfig.scripts.json --noEmit
@@ -278,7 +278,7 @@ steps:
```yaml
steps:
- - Checkout, Setup Node.js 24, Install deps
+ - Checkout, Setup Node.js 25, Install deps
- Generate TypeDoc: npx typedoc
- Validate documentation coverage
- Check generated TypeDoc files exist
@@ -340,7 +340,7 @@ steps:
```yaml
steps:
- Checkout
- - Setup Node.js 24
+ - Setup Node.js 25
- Install dependencies: npm ci
- Build: npm run build # โ Critical: Vite build before deploy
- Configure AWS credentials
@@ -366,13 +366,13 @@ steps:
```yaml
steps:
- - Checkout, Setup Node.js 24, Install deps
- - Fetch: node scripts/load-cia-stats.ts # Node 24 native TS
- - Update: node scripts/update-stats-from-cia.ts # Node 24 native TS
+ - Checkout, Setup Node.js 25, Install deps
+ - Fetch: node scripts/load-cia-stats.ts # Node 25 native TS
+ - Update: node scripts/update-stats-from-cia.ts # Node 25 native TS
- Commit and push changes (if any)
```
-**Note:** Uses Node 24's native TypeScript type-stripping (`process.features.typescript === "strip"`). No `--experimental-strip-types` flag needed โ `.ts` files run directly with `node`.
+**Note:** Uses Node 25's native TypeScript type-stripping (`process.features.typescript === "strip"`). No `--experimental-strip-types` flag needed โ `.ts` files run directly with `node`.
#### 7.2 Data Pipeline (`data-pipeline.yml`)
@@ -481,7 +481,7 @@ Compiles `.md` workflow sources to `.lock.yml` using `gh aw compile`. Creates Gi
steps:
- Checkout
- Setup Web Test Environment (Chrome + Xvfb)
- - Setup Node.js 24
+ - Setup Node.js 25
- Install MCP server packages globally
- Install Playwright browsers
- Verify all MCP server installations
@@ -606,7 +606,7 @@ The following table summarizes how each workflow interacts with TypeScript:
| `codeql.yml` | Scans TS for vulnerabilities | `javascript-typescript` matrix |
| `release.yml` | Builds TS โ JS bundles | Vite/esbuild |
| `deploy-s3.yml` | Builds then deploys bundles | `npm run build` โ S3 sync |
-| `update-cia-stats.yml` | Runs `.ts` scripts directly | Node 24 native TS strip |
+| `update-cia-stats.yml` | Runs `.ts` scripts directly | Node 25 native TS strip |
| `vitest.config.js` | Coverage includes TS source | `src/browser/**/*.ts` in includes |
| `test-dashboard.yml` | Triggers on TS changes | `src/browser/**` in path filter |
| `test-homepage.yml` | Triggers on TS changes | `src/browser/**` in path filter |
@@ -620,7 +620,7 @@ The following table summarizes how each workflow interacts with TypeScript:
schedule:
- cron: '0 2 * * *' # Update CIA stats daily at 03:00 CET
steps:
- - node scripts/load-cia-stats.ts # Node 24 native TS
+ - node scripts/load-cia-stats.ts # Node 25 native TS
- node scripts/update-stats-from-cia.ts
- git commit + push (if changed)
```
@@ -719,8 +719,8 @@ paths:
- 'tsconfig*.json'
```
-#### Issue: Node 24 cannot run .ts scripts
-**Solution:** Node 24 has native TypeScript type-stripping. Verify:
+#### Issue: Node version cannot run .ts scripts
+**Solution:** Node.js 25 has native TypeScript type-stripping. Verify:
```bash
node -e "console.log(process.features.typescript)" # Should print "strip"
```
@@ -829,6 +829,6 @@ git commit -m "chore: recompile agentic workflow lock files"
---
**Document Version:** 6.0
-**Last Updated:** 2026-03-10
+**Last Updated:** 2026-03-18
**Classification:** Public
**Owner:** Hack23 AB
diff --git a/package-lock.json b/package-lock.json
index 6e7ba4fe0..c3aa88861 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -42,7 +42,7 @@
"worldbank-mcp": "1.0.1"
},
"engines": {
- "node": ">=24"
+ "node": ">=25"
},
"optionalDependencies": {
"cypress": "^15.12.0"
diff --git a/package.json b/package.json
index df5776c95..7437ebb1f 100644
--- a/package.json
+++ b/package.json
@@ -112,6 +112,6 @@
"glob": "^13.0.0"
},
"engines": {
- "node": ">=24"
+ "node": ">=25"
}
}
From b7df8b0c8dab5a43057deebe16f72ba3a3393a1a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 18 Mar 2026 09:42:51 +0000
Subject: [PATCH 3/4] =?UTF-8?q?docs:=20clarify=20Node.js=2026=20Current?=
=?UTF-8?q?=E2=86=92LTS=20in-place=20strategy=20and=20expand=20upgrade=20c?=
=?UTF-8?q?hecklist?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: pethers <1726836+pethers@users.noreply.github.com>
---
End-of-Life-Strategy.md | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/End-of-Life-Strategy.md b/End-of-Life-Strategy.md
index 1af2f17ac..69a8b89cf 100644
--- a/End-of-Life-Strategy.md
+++ b/End-of-Life-Strategy.md
@@ -38,7 +38,7 @@ This strategy should be read alongside the [Business Continuity Plan](BCPPlan.md
**Primary Goal**: Maintain Riksdagsmonitor on a supported, secure technology stack by proactively tracking dependency lifecycles and planning migrations before components reach end-of-life.
**Key Principles**:
-- Upgrade to new Node.js Current versions promptly; adopt LTS within **4 weeks** of promotion
+- Upgrade to new Node.js Current versions promptly; LTS promotion happens in-place (no second migration needed)
- Keep build tooling (Vite, Vitest, TypeScript) on latest stable versions
- Maintain zero known critical/high vulnerabilities via automated scanning
- Plan major migrations **12 months** before dependency EOL dates
@@ -171,24 +171,29 @@ Node.js 25 is an **odd-numbered Current release** under the old model โ it wil
> โ ๏ธ **Node.js 25 is short-lived.** Riksdagsmonitor will be on Node.js 25 for only ~2 weeks before upgrading to Node.js 26 LTS upon its release.
-### ๐ Imminent: Node.js 26 LTS (Action: Upgrade in ~2 weeks)
+### ๐ Imminent: Node.js 26 (Action: Upgrade in ~2 weeks)
-Node.js 26 is the **last release under the old two-per-year schedule** and will become LTS in October 2026. We plan to upgrade **immediately after Node.js 26 is released**.
+Node.js 26 is the **last release under the old two-per-year schedule**. It releases as "Current" in April 2026 and will be promoted to **LTS in October 2026** โ no additional migration will be needed at that point, as the project will already be on Node.js 26.
+
+> **Strategy**: Adopt Node.js 26 **immediately after its release** (~April 1, 2026). Since Node.js 26 will become LTS in October 2026, adopting it promptly as "Current" and staying on it satisfies the LTS principle โ the project will transition from Current to LTS **in-place** without another upgrade step.
| Milestone | Date | Action |
|-----------|------|--------|
| Node.js 26 Current Release | **~April 1, 2026** | ๐ **Upgrade riksdagsmonitor immediately after release** |
-| Node.js 26 LTS Promotion | October 2026 | โ
Already on Node.js 26 |
+| Node.js 26 LTS Promotion | October 2026 | โ
No migration needed โ already on Node.js 26 (Current โ LTS in-place) |
| Node.js 26 Active LTS End | **October 2027** | Begin evaluating Node.js 27 |
| Node.js 26 Maintenance End | **April 2029** | Must be off Node.js 26 |
**Upgrade preparation checklist (for Node.js 26):**
-- [ ] Monitor [Node.js 26 release notes](https://nodejs.org/en/blog/) for breaking changes
-- [ ] Test `npm ci` and build/test suite on Node.js 26 RC in CI matrix
-- [ ] Update all `node-version: '25'` โ `'26'` across workflows
+- [ ] Monitor [Node.js 26 release notes](https://nodejs.org/en/blog/) and test against Node.js 26 RC in CI matrix before stable release
+- [ ] Validate TypeScript native type-stripping (`process.features.typescript === "strip"`) still works
+- [ ] Confirm all 43+ workflows pass on Node.js 26 (blocking CI jobs)
+- [ ] Verify GitHub Actions `ubuntu-latest` runners include Node.js 26
+- [ ] Update all `node-version: '25'` โ `'26'` across all workflow YAML, lock, and markdown files
- [ ] Update `package.json` `engines.node` from `>=25` to `>=26`
- [ ] Update `.nvmrc` from `25` to `26`
-- [ ] Update documentation (End-of-Life-Strategy.md, WORKFLOWS.md, FUTURE_WORKFLOWS.md)
+- [ ] Update skills documentation (`./github/skills/**SKILL.md`) code examples
+- [ ] Update documentation (End-of-Life-Strategy.md, WORKFLOWS.md, FUTURE_WORKFLOWS.md, README.md, TESTING.md)
### Future: Node.js 27 LTS (New Schedule)
From 0b98d8d1fab735e4b39961324368364779e67309 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 18 Mar 2026 10:11:08 +0000
Subject: [PATCH 4/4] chore: upgrade TypeScript target and lib from ES2022 to
ES2024 in all tsconfigs
Co-authored-by: pethers <1726836+pethers@users.noreply.github.com>
---
scripts/article-template/registry.ts | 4 ++--
tsconfig.browser.json | 4 ++--
tsconfig.scripts.json | 4 ++--
tsconfig.typedoc.json | 4 ++--
4 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/scripts/article-template/registry.ts b/scripts/article-template/registry.ts
index 4f3fd082a..c841c68cf 100644
--- a/scripts/article-template/registry.ts
+++ b/scripts/article-template/registry.ts
@@ -379,9 +379,9 @@ const REGISTRY: Readonly> = {
* breaking-news layout rather than an error, ensuring graceful degradation
* across all content generation pipelines.
*
- * Uses `Object.hasOwn()` (ES2022) for prototype-pollution safety.
+ * Uses `Object.hasOwn()` (ES2022+) for prototype-pollution safety.
* This is compatible with the project's `tsconfig.scripts.json` target
- * (`"target": "ES2022"`) and the Node โฅ24 runtime requirement (`engines.node`).
+ * (`"target": "ES2024"`) and the Node โฅ25 runtime requirement (`engines.node`).
*
* @param type - ArticleType identifier
* @returns ArticleTemplate configuration object
diff --git a/tsconfig.browser.json b/tsconfig.browser.json
index d2eaba39a..2b3e9824a 100644
--- a/tsconfig.browser.json
+++ b/tsconfig.browser.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "ES2022",
+ "target": "ES2024",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
@@ -14,7 +14,7 @@
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "lib": ["ES2024", "DOM", "DOM.Iterable"],
"types": []
},
"include": [
diff --git a/tsconfig.scripts.json b/tsconfig.scripts.json
index a7ea229b2..9509ac3f0 100644
--- a/tsconfig.scripts.json
+++ b/tsconfig.scripts.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "ES2022",
+ "target": "ES2024",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
@@ -24,7 +24,7 @@
"@scripts/*": ["scripts/*"],
"@types/*": ["scripts/types/*"]
},
- "lib": ["ES2022"],
+ "lib": ["ES2024"],
"types": ["node"],
"isolatedModules": true,
"resolveJsonModule": true,
diff --git a/tsconfig.typedoc.json b/tsconfig.typedoc.json
index 0e48bb604..6b59cfd27 100644
--- a/tsconfig.typedoc.json
+++ b/tsconfig.typedoc.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "ES2022",
+ "target": "ES2024",
"module": "ESNext",
"moduleResolution": "bundler",
"allowJs": true,
@@ -12,7 +12,7 @@
"noEmit": true,
"resolveJsonModule": true,
"baseUrl": ".",
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "lib": ["ES2024", "DOM", "DOM.Iterable"],
"types": ["node"]
},
"include": [