euparliamentmonitor 0.8.48 → 0.8.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +271 -862
- package/SECURITY.md +206 -115
- package/package.json +3 -3
- package/scripts/aggregator/analysis-aggregator.d.ts +34 -42
- package/scripts/aggregator/analysis-aggregator.js +69 -79
- package/scripts/aggregator/article-generator.d.ts +21 -17
- package/scripts/aggregator/article-generator.js +22 -86
- package/scripts/aggregator/article-html.js +15 -24
- package/scripts/aggregator/artifact-order.js +19 -0
- package/scripts/aggregator/clean-artifact.js +6 -6
- package/scripts/aggregator/cli/index.d.ts +6 -0
- package/scripts/aggregator/cli/index.js +8 -0
- package/scripts/aggregator/cli/parse.d.ts +51 -0
- package/scripts/aggregator/cli/parse.js +253 -0
- package/scripts/aggregator/infra/github-urls.d.ts +38 -0
- package/scripts/aggregator/infra/github-urls.js +55 -0
- package/scripts/aggregator/manifest/index.d.ts +8 -0
- package/scripts/aggregator/manifest/index.js +5 -0
- package/scripts/aggregator/manifest/reader.d.ts +37 -0
- package/scripts/aggregator/manifest/reader.js +54 -0
- package/scripts/aggregator/manifest/resolver.d.ts +65 -0
- package/scripts/aggregator/manifest/resolver.js +120 -0
- package/scripts/aggregator/manifest/types.d.ts +78 -0
- package/scripts/aggregator/manifest/types.js +4 -0
- package/scripts/aggregator/markdown-renderer.js +12 -1
- package/scripts/aggregator/runs/discover.d.ts +44 -0
- package/scripts/aggregator/runs/discover.js +84 -0
- package/scripts/aggregator/runs/grouping.d.ts +30 -0
- package/scripts/aggregator/runs/grouping.js +35 -0
- package/scripts/aggregator/runs/index.d.ts +7 -0
- package/scripts/aggregator/runs/index.js +9 -0
- package/scripts/aggregator/slug/index.d.ts +6 -0
- package/scripts/aggregator/slug/index.js +8 -0
- package/scripts/aggregator/slug/slug.d.ts +49 -0
- package/scripts/aggregator/slug/slug.js +57 -0
- package/scripts/generators/news-indexes.js +13 -24
- package/scripts/generators/political-intelligence/copy.d.ts +79 -0
- package/scripts/generators/political-intelligence/copy.js +449 -0
- package/scripts/generators/political-intelligence/data.d.ts +10 -0
- package/scripts/generators/political-intelligence/data.js +205 -0
- package/scripts/generators/political-intelligence/html.d.ts +21 -0
- package/scripts/generators/political-intelligence/html.js +450 -0
- package/scripts/generators/political-intelligence/icons.d.ts +32 -0
- package/scripts/generators/political-intelligence/icons.js +135 -0
- package/scripts/generators/political-intelligence/index.d.ts +19 -0
- package/scripts/generators/political-intelligence/index.js +8 -0
- package/scripts/generators/political-intelligence/markdown.d.ts +58 -0
- package/scripts/generators/political-intelligence/markdown.js +105 -0
- package/scripts/generators/political-intelligence/types.d.ts +69 -0
- package/scripts/generators/political-intelligence/types.js +4 -0
- package/scripts/generators/political-intelligence.d.ts +24 -111
- package/scripts/generators/political-intelligence.js +8 -1257
- package/scripts/generators/sitemap/copy.d.ts +75 -0
- package/scripts/generators/sitemap/copy.js +374 -0
- package/scripts/generators/sitemap/html.d.ts +61 -0
- package/scripts/generators/sitemap/html.js +314 -0
- package/scripts/generators/sitemap/index.d.ts +23 -0
- package/scripts/generators/sitemap/index.js +25 -0
- package/scripts/generators/sitemap/rss.d.ts +35 -0
- package/scripts/generators/sitemap/rss.js +55 -0
- package/scripts/generators/sitemap/xml-utils.d.ts +20 -0
- package/scripts/generators/sitemap/xml-utils.js +29 -0
- package/scripts/generators/sitemap/xml.d.ts +43 -0
- package/scripts/generators/sitemap/xml.js +316 -0
- package/scripts/generators/sitemap.d.ts +2 -77
- package/scripts/generators/sitemap.js +30 -959
- package/scripts/templates/section-builders.d.ts +36 -0
- package/scripts/templates/section-builders.js +93 -9
package/README.md
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
<!-- SPDX-FileCopyrightText: 2024-2026 Hack23 AB -->
|
|
2
|
+
<!-- SPDX-License-Identifier: Apache-2.0 -->
|
|
3
|
+
|
|
1
4
|
<p align="center">
|
|
2
5
|
<img src="https://hack23.com/icon-192.png" alt="Hack23 Logo" width="192" height="192">
|
|
3
6
|
</p>
|
|
@@ -5,131 +8,101 @@
|
|
|
5
8
|
<h1 align="center">🏛️ EU Parliament Monitor</h1>
|
|
6
9
|
|
|
7
10
|
<p align="center">
|
|
8
|
-
<strong>European Parliament Intelligence Platform</strong><br>
|
|
9
|
-
<em
|
|
11
|
+
<strong>European Parliament Political Intelligence Platform</strong><br>
|
|
12
|
+
<em>🧠 Political intelligence · 🔍 Radical transparency · 🗳️ Democratic accountability · 🤖 AI-generated news in 14 languages</em>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="https://euparliamentmonitor.com"><img src="https://img.shields.io/badge/🌐_Live_Site-euparliamentmonitor.com-003399?style=for-the-badge&logoColor=FFCC00" alt="Live Site"/></a>
|
|
17
|
+
<a href="https://euparliamentmonitor.com/political-intelligence.html"><img src="https://img.shields.io/badge/🧠_Political_Intelligence-Hub-7B1FA2?style=for-the-badge" alt="Political Intelligence Hub"/></a>
|
|
18
|
+
<a href="https://euparliamentmonitor.com/sitemap.html"><img src="https://img.shields.io/badge/🗺️_Site_Map-14_languages-0A66C2?style=for-the-badge" alt="Site Map"/></a>
|
|
10
19
|
</p>
|
|
11
20
|
|
|
12
21
|
<p align="center">
|
|
13
22
|
<a href="#"><img src="https://img.shields.io/badge/Owner-CEO-0A66C2?style=for-the-badge" alt="Owner"/></a>
|
|
14
|
-
<a href="#"><img src="https://img.shields.io/badge/Version-1.0-555?style=for-the-badge" alt="Version"/></a>
|
|
15
23
|
<a href="#"><img src="https://img.shields.io/badge/Classification-Public-success?style=for-the-badge" alt="Classification"/></a>
|
|
16
|
-
<a href="#"><img src="https://img.shields.io/badge/
|
|
24
|
+
<a href="#"><img src="https://img.shields.io/badge/Pipeline-Aggregator_Era-2E7D32?style=for-the-badge" alt="Aggregator Era"/></a>
|
|
25
|
+
<a href="#"><img src="https://img.shields.io/badge/Review-Quarterly-orange?style=for-the-badge" alt="Review Cycle"/></a>
|
|
17
26
|
</p>
|
|
18
27
|
|
|
19
|
-
<table>
|
|
20
|
-
<tr>
|
|
21
|
-
<td width="120" align="center">
|
|
22
|
-
<img src="https://img.shields.io/badge/EU-Parliament-003399?style=for-the-badge&logo=european-union&logoColor=FFCC00" width="80" alt="EU Parliament Monitor"/>
|
|
23
|
-
<div>
|
|
24
|
-
<a href="https://github.com/Hack23/euparliamentmonitor">
|
|
25
|
-
<img src="https://img.shields.io/github/v/release/Hack23/euparliamentmonitor" alt="Release">
|
|
26
|
-
</a>
|
|
27
|
-
</div>
|
|
28
|
-
<div>
|
|
29
|
-
<a href="https://www.npmjs.com/package/euparliamentmonitor">
|
|
30
|
-
<img src="https://img.shields.io/npm/v/euparliamentmonitor.svg" alt="npm version">
|
|
31
|
-
</a>
|
|
32
|
-
</div>
|
|
33
|
-
</td>
|
|
34
|
-
<td>
|
|
35
|
-
<p><strong>European Parliament Intelligence Platform</strong> — an automated multi-language news platform that monitors EU Parliament activities with 14-language support, covering plenary sessions, committee reports, propositions, and breaking news.</p>
|
|
36
|
-
<div>
|
|
37
|
-
<a href="https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor">
|
|
38
|
-
<img src="https://api.securityscorecards.dev/projects/github.com/Hack23/euparliamentmonitor/badge" alt="OpenSSF Scorecard">
|
|
39
|
-
</a>
|
|
40
|
-
<a href="https://www.bestpractices.dev/projects/12068">
|
|
41
|
-
<img src="https://www.bestpractices.dev/projects/12068/badge" alt="OpenSSF Best Practices">
|
|
42
|
-
</a>
|
|
43
|
-
<a href="https://github.com/Hack23/euparliamentmonitor/attestations">
|
|
44
|
-
<img src="https://slsa.dev/images/gh-badge-level3.svg" alt="SLSA 3">
|
|
45
|
-
</a>
|
|
46
|
-
<a href="https://github.com/Hack23/euparliamentmonitor/license">
|
|
47
|
-
<img src="https://img.shields.io/github/license/Hack23/euparliamentmonitor" alt="License">
|
|
48
|
-
</a>
|
|
49
|
-
</div>
|
|
50
|
-
<div>
|
|
51
|
-
<a href="https://github.com/Hack23/euparliamentmonitor"><strong>📂 Repository</strong></a> •
|
|
52
|
-
<a href="https://hack23.com/euparliamentmonitor-features.html"><strong>✨ Features</strong></a> •
|
|
53
|
-
<a href="https://hack23.com/euparliamentmonitor-docs.html"><strong>📚 Documentation</strong></a>
|
|
54
|
-
</div>
|
|
55
|
-
</td>
|
|
56
|
-
</tr>
|
|
57
|
-
</table>
|
|
58
|
-
|
|
59
28
|
[](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)
|
|
60
29
|
[](https://www.bestpractices.dev/projects/12068)
|
|
61
30
|
[](https://github.com/Hack23/euparliamentmonitor/attestations)
|
|
62
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)
|
|
63
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml)
|
|
64
31
|
[](https://github.com/Hack23/euparliamentmonitor/blob/main/LICENSE)
|
|
65
32
|
[](https://github.com/Hack23/ISMS-PUBLIC)
|
|
66
33
|
[](https://deepwiki.com/Hack23/euparliamentmonitor)
|
|
67
34
|
|
|
68
|
-
|
|
35
|
+
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/compile-agentic-workflows.yml)
|
|
36
|
+
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml)
|
|
37
|
+
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml)
|
|
38
|
+
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml)
|
|
39
|
+
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml)
|
|
69
40
|
|
|
70
|
-
|
|
71
|
-
npm install euparliamentmonitor
|
|
72
|
-
```
|
|
41
|
+
---
|
|
73
42
|
|
|
74
|
-
|
|
75
|
-
import {
|
|
76
|
-
EuropeanParliamentMCPClient,
|
|
77
|
-
generateArticleHTML,
|
|
78
|
-
scoreArticleQuality,
|
|
79
|
-
ALL_LANGUAGES,
|
|
80
|
-
} from 'euparliamentmonitor';
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**Key capabilities:**
|
|
84
|
-
- 🏛️ **EU Parliament MCP Client** — Connect to European Parliament open data via Model Context Protocol
|
|
85
|
-
- 📰 **News Generation** — Generate multi-language articles (14 languages) from parliamentary data
|
|
86
|
-
- 🔍 **Political Intelligence** — Voting anomaly detection, coalition analysis, threat assessment
|
|
87
|
-
- 📊 **Article Quality** — Score and validate generated content with comprehensive quality metrics
|
|
88
|
-
- 🌍 **Multilingual** — Full i18n support: EN, SV, DA, NO, FI, DE, FR, ES, NL, AR, HE, JA, KO, ZH
|
|
43
|
+
**Explore the live platform** — [🌐 euparliamentmonitor.com](https://euparliamentmonitor.com) · [🧠 Political Intelligence Hub](https://euparliamentmonitor.com/political-intelligence.html) (methodology + artifact transparency, all 14 languages) · [📊 Analysis & Reports](https://euparliamentmonitor.com/docs/) · [🗺️ Site Map](https://euparliamentmonitor.com/sitemap.html) (every page, every language) · [📔 API Reference](https://euparliamentmonitor.com/docs/api/)
|
|
89
44
|
|
|
90
|
-
|
|
45
|
+
## 🎯 Why This Exists
|
|
91
46
|
|
|
92
|
-
|
|
47
|
+
The European Parliament adopts laws that affect **450 million citizens** across 27 member states. Yet most of what happens in Brussels and Strasbourg — committee dossiers, rapporteur appointments, coalition trade-offs, amendment battles, urgency files, trilogue dynamics — remains effectively invisible to the public. Press coverage is sparse, fragmented across national outlets, and rarely connects the procedural dots.
|
|
93
48
|
|
|
94
|
-
|
|
49
|
+
**EU Parliament Monitor turns the EP's own open data into auditable political intelligence — and publishes it as readable news in 14 languages, every day, fully sourced.**
|
|
95
50
|
|
|
96
|
-
|
|
51
|
+
This repository is the open-source platform behind **[euparliamentmonitor.com](https://euparliamentmonitor.com)**: an AI-driven newsroom that monitors plenary sessions, committee work, motions, propositions, and forward-calendar events; produces *Economist-style* analytical articles backed by 51 structured analysis artifacts per run; and exposes **every** methodology, template, and analysis tree publicly so any reader, journalist, researcher, or NGO can verify the analysis behind the prose.
|
|
97
52
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
[](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)
|
|
53
|
+
| Pillar | What it means in this project |
|
|
54
|
+
|---|---|
|
|
55
|
+
| 🧠 **Political Intelligence** | Structured analytic techniques (ACH, SWOT/TOWS, PESTLE, scenario forecasting, devil's-advocate), Admiralty source grading, Words of Estimative Probability (WEP) bands, ICD-203 standards, and a 6-dimension political-threat framework — applied daily to live EP data. |
|
|
56
|
+
| 🔍 **Radical Transparency** | Every article links back to the analysis run it was rendered from. Every artifact links to its methodology. Every methodology is published. No black box. |
|
|
57
|
+
| 🗳️ **Democratic Accountability** | Public-data only. GDPR-clean. No personal profiling. Multi-language so a Finnish farmer, a Greek student, and a Polish journalist all get the same intelligence in their own language. |
|
|
58
|
+
| 🤖 **AI-Generated News** | 8 unified gh-aw agentic workflows + 1 translation workflow run autonomously, produce structured analysis, render deterministic HTML, and open publication-ready pull requests for human review. |
|
|
105
59
|
|
|
106
60
|
### Documentation & Reports
|
|
107
|
-
[](https://euparliamentmonitor.com/docs/api/
|
|
61
|
+
[](https://euparliamentmonitor.com/docs/api/)
|
|
108
62
|
[](https://euparliamentmonitor.com/docs/coverage/index.html)
|
|
109
63
|
[](https://euparliamentmonitor.com/playwright-report/index.html)
|
|
110
64
|
[](https://github.com/Hack23/euparliamentmonitor/attestations)
|
|
65
|
+
---
|
|
111
66
|
|
|
112
|
-
## 🌐
|
|
67
|
+
## 🌐 Explore the Live Platform
|
|
113
68
|
|
|
114
|
-
The published
|
|
69
|
+
The published site is the audience-facing companion to this npm/TypeScript package. **Two hub pages give the fastest entry point** — bookmark them:
|
|
115
70
|
|
|
116
71
|
<table>
|
|
117
72
|
<tr>
|
|
118
|
-
<td width="
|
|
119
|
-
<a href="https://euparliamentmonitor.com/
|
|
73
|
+
<td width="140" align="center" valign="top">
|
|
74
|
+
<a href="https://euparliamentmonitor.com/index.html"><img src="https://img.shields.io/badge/🌐-Live_Site-003399?style=for-the-badge&logoColor=FFCC00" alt="Live Site"/></a>
|
|
75
|
+
</td>
|
|
76
|
+
<td>
|
|
77
|
+
<strong><a href="https://euparliamentmonitor.com/index.html">🌐 Live News Site — euparliamentmonitor.com</a></strong><br>
|
|
78
|
+
Daily-updated front page with the latest <em>Breaking News</em>, <em>Week / Month Ahead</em>, <em>Week / Month in Review</em>, <em>Committee Reports</em>, <em>Plenary Votes & Resolutions</em>, and <em>Legislative Procedures</em> articles. Every article is generated by an AI agent from live European Parliament MCP data, peer-reviewed against a 51-artifact analytical baseline, and published in <strong>14 languages</strong> (EN, SV, DA, NO, FI, DE, FR, ES, NL, AR, HE, JA, KO, ZH) with WCAG 2.1 AA accessibility, RTL support for Arabic and Hebrew, and JSON-LD <code>NewsArticle</code> structured data linking back to every source artifact.
|
|
79
|
+
</td>
|
|
80
|
+
</tr>
|
|
81
|
+
<tr>
|
|
82
|
+
<td width="140" align="center" valign="top">
|
|
83
|
+
<a href="https://euparliamentmonitor.com/political-intelligence.html"><img src="https://img.shields.io/badge/🧠-Political_Intelligence-7B1FA2?style=for-the-badge&logoColor=FFCC00" alt="Political Intelligence Hub"/></a>
|
|
120
84
|
</td>
|
|
121
85
|
<td>
|
|
122
86
|
<strong><a href="https://euparliamentmonitor.com/political-intelligence.html">🧠 Political Intelligence Hub</a></strong><br>
|
|
123
|
-
|
|
87
|
+
The audit-ready transparency layer behind every published article. A single, fully-linked index into <strong>17 methodologies</strong>, <strong>52 analysis templates</strong>, <strong>19 tradecraft references</strong>, and over <strong>170 daily analysis runs</strong> producing <strong>1,700+ structured artifacts</strong> — including the <em>10-step AI-driven analysis protocol</em>, OSINT tradecraft standards (Admiralty / WEP / SAT / ACH), the political-threat framework, the political SWOT framework, and the per-artifact construction rules. Every link opens directly on GitHub so readers can <em>verify the analysis behind the prose</em>. Available in all 14 supported languages.
|
|
124
88
|
</td>
|
|
125
89
|
</tr>
|
|
126
90
|
<tr>
|
|
127
|
-
<td width="
|
|
128
|
-
<a href="https://euparliamentmonitor.com/sitemap.html"><img src="https://img.shields.io/badge/🗺️-
|
|
91
|
+
<td width="140" align="center" valign="top">
|
|
92
|
+
<a href="https://euparliamentmonitor.com/sitemap.html"><img src="https://img.shields.io/badge/🗺️-Site_Map-0A66C2?style=for-the-badge&logoColor=FFCC00" alt="Site Map"/></a>
|
|
129
93
|
</td>
|
|
130
94
|
<td>
|
|
131
|
-
<strong><a href="https://euparliamentmonitor.com/sitemap.html">🗺️ Site Map</a></strong><br>
|
|
132
|
-
|
|
95
|
+
<strong><a href="https://euparliamentmonitor.com/sitemap.html">🗺️ Human-Readable Site Map</a></strong><br>
|
|
96
|
+
Index of <strong>every page</strong> on the platform — landing pages, news articles, and technical documentation — across all 14 languages. Best entry point for SEO crawlers, audience navigation, and discovering historical articles. Companion to the machine-readable <code>sitemap.xml</code> and per-language <code>sitemap_<lang>.html</code> variants.
|
|
97
|
+
</td>
|
|
98
|
+
</tr>
|
|
99
|
+
<tr>
|
|
100
|
+
<td width="140" align="center" valign="top">
|
|
101
|
+
<a href="https://euparliamentmonitor.com/docs/api/index.html"><img src="https://img.shields.io/badge/📔-API_Reference-2E7D32?style=for-the-badge" alt="API Reference"/></a>
|
|
102
|
+
</td>
|
|
103
|
+
<td>
|
|
104
|
+
<strong><a href="https://euparliamentmonitor.com/docs/api/index.html">📔 TypeDoc API Reference</a></strong><br>
|
|
105
|
+
TypeDoc-generated reference for every public symbol in the <code>euparliamentmonitor</code> npm package — the EP MCP client (60+ tools), the deterministic article aggregator, the 5-tier metadata resolver, and the multi-language renderer. Companion <a href="https://euparliamentmonitor.com/docs/coverage/index.html">📓 Test Coverage</a> and <a href="https://euparliamentmonitor.com/playwright-report/index.html">🎭 E2E Report</a> dashboards are linked from the same documentation hub.
|
|
133
106
|
</td>
|
|
134
107
|
</tr>
|
|
135
108
|
</table>
|
|
@@ -144,7 +117,7 @@ The published platform at **[euparliamentmonitor.com](https://euparliamentmonito
|
|
|
144
117
|
- [📗 Security Flows](FLOWCHART.md) - Process flows with security controls
|
|
145
118
|
- [📙 Data Model](DATA_MODEL.md) - Data structures and API integration
|
|
146
119
|
- [📕 Release Process](docs/RELEASE_PROCESS.md) - How to create releases
|
|
147
|
-
- [📔 API Documentation](https://euparliamentmonitor.com/docs/api/
|
|
120
|
+
- [📔 API Documentation](https://euparliamentmonitor.com/docs/api/) - TypeDoc-generated API reference
|
|
148
121
|
- [📓 Test Coverage](https://euparliamentmonitor.com/docs/coverage/index.html) - Interactive coverage report
|
|
149
122
|
|
|
150
123
|
**🤖 Agentic Pipeline:**
|
|
@@ -307,155 +280,130 @@ This project adheres to:
|
|
|
307
280
|
|
|
308
281
|
EU Parliament Monitor maintains high code quality standards with comprehensive
|
|
309
282
|
testing:
|
|
283
|
+
---
|
|
310
284
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
- **ESLint**: Comprehensive linting with security, complexity, and documentation
|
|
314
|
-
checks
|
|
315
|
-
- **Prettier**: Consistent code formatting across all JavaScript files
|
|
316
|
-
- **Pre-commit Hooks**: Automatic linting and formatting before every commit
|
|
317
|
-
- **CI/CD Quality Gates**: Automated checks on every pull request
|
|
318
|
-
- **TypeDoc/JSDoc**: Complete documentation for all functions
|
|
285
|
+
## 🧠 The Political Intelligence Pipeline
|
|
319
286
|
|
|
320
|
-
**
|
|
321
|
-
detailed coding guidelines.
|
|
322
|
-
|
|
323
|
-
### Testing Infrastructure
|
|
324
|
-
|
|
325
|
-
Comprehensive test suite with **Vitest** and **Playwright** covering all
|
|
326
|
-
functionality:
|
|
327
|
-
|
|
328
|
-
#### Unit & Integration Tests (Vitest)
|
|
329
|
-
|
|
330
|
-
- **Unit Tests**: Article generation, MCP client, index/sitemap generation
|
|
331
|
-
- **Integration Tests**: Full workflows, MCP integration, multi-language support
|
|
332
|
-
- **Coverage**: ≥80% line coverage, ≥75% branch coverage
|
|
333
|
-
- **Test Count**: 169+ tests covering critical paths
|
|
334
|
-
|
|
335
|
-
```bash
|
|
336
|
-
# Run unit & integration tests
|
|
337
|
-
npm test
|
|
287
|
+
Every article published on euparliamentmonitor.com is the deterministic render of an **analysis run** — a directory under `analysis/daily/<YYYY-MM-DD>/<article-type>/` containing structured Markdown artifacts (drawn from a **51-template catalog**: 39 core mandatory + 12 extended optional) plus raw EP MCP / IMF / World Bank data payloads. The pipeline is split into five well-defined stages:
|
|
338
288
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
289
|
+
```mermaid
|
|
290
|
+
%%{init: {"theme":"dark","themeVariables":{"primaryColor":"#1565C0","primaryTextColor":"#fff","lineColor":"#90CAF9","fontFamily":"Inter, Helvetica, Arial, sans-serif"}}}%%
|
|
291
|
+
flowchart LR
|
|
292
|
+
A["🔵 Stage A<br/>EP MCP data collection<br/><i>60+ tools, IMF, World Bank</i>"] --> B["🟣 Stage B<br/>AI political intelligence<br/><i>51 artifacts · 2-pass review</i>"]
|
|
293
|
+
B --> C["🟡 Stage C<br/>Completeness gate<br/><i>line floors · WEP · Admiralty</i>"]
|
|
294
|
+
C --> D["🟢 Stage D<br/>Deterministic aggregator<br/><i>npm run generate-article</i>"]
|
|
295
|
+
D --> E["🔷 Markdown source<br/>news/*.en.md"]
|
|
296
|
+
D --> F["🟢 14-language HTML<br/>news/*-{lang}.html"]
|
|
297
|
+
F --> G["🟠 SEO indexes<br/>sitemap · RSS · JSON-LD"]
|
|
298
|
+
G --> H["🟢 S3 + CloudFront<br/>euparliamentmonitor.com"]
|
|
299
|
+
style A fill:#1565C0,color:#fff
|
|
300
|
+
style B fill:#7B1FA2,color:#fff
|
|
301
|
+
style C fill:#FFC107,color:#000
|
|
302
|
+
style D fill:#2E7D32,color:#fff
|
|
303
|
+
style E fill:#0288D1,color:#fff
|
|
304
|
+
style F fill:#2E7D32,color:#fff
|
|
305
|
+
style G fill:#FF9800,color:#000
|
|
306
|
+
style H fill:#2E7D32,color:#fff
|
|
347
307
|
```
|
|
348
308
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
- **E2E Tests**: Complete user experience validation
|
|
352
|
-
- **Cross-Browser**: Chromium, Firefox, WebKit
|
|
353
|
-
- **Mobile Support**: Mobile Chrome, Mobile Safari
|
|
354
|
-
- **Accessibility**: WCAG 2.1 AA compliance with axe-core
|
|
355
|
-
- **Responsive Design**: Multiple viewport sizes
|
|
356
|
-
- **Test Count**: 60+ E2E tests covering user journeys
|
|
357
|
-
|
|
358
|
-
```bash
|
|
359
|
-
# Run E2E tests
|
|
360
|
-
npm run test:e2e
|
|
361
|
-
|
|
362
|
-
# Run with UI (interactive)
|
|
363
|
-
npm run test:e2e:ui
|
|
309
|
+
**Critical architectural property:** AI agents author *analysis artifacts in Markdown* — never HTML. TypeScript code under `src/aggregator/**` deterministically renders the committed artifacts into HTML. There is no AI-authored HTML step and no template-prose leakage. This is what makes the public output reproducible, auditable, and resistant to hallucination.
|
|
364
310
|
|
|
365
|
-
|
|
366
|
-
npm run test:e2e:headed
|
|
311
|
+
📖 **Full pipeline reference:** [Article-Generation.md](Article-Generation.md) · [analysis/README.md](analysis/README.md) · [analysis/methodologies/ai-driven-analysis-guide.md](analysis/methodologies/ai-driven-analysis-guide.md)
|
|
367
312
|
|
|
368
|
-
|
|
369
|
-
npm run test:e2e:report
|
|
370
|
-
```
|
|
313
|
+
### 📚 The Methodology Library — published, versioned, auditable
|
|
371
314
|
|
|
372
|
-
|
|
315
|
+
| Methodology | Purpose |
|
|
316
|
+
|---|---|
|
|
317
|
+
| 🎯 **[AI-Driven Analysis Guide](analysis/methodologies/ai-driven-analysis-guide.md)** | The canonical 10-step protocol every agentic run follows (Rules 1–22 + Step 10.5 methodology reflection). |
|
|
318
|
+
| 🗂️ **[Artifact Catalog](analysis/methodologies/artifact-catalog.md)** | Master map: every artifact → methodology + template + depth floor + Mermaid diagram type. |
|
|
319
|
+
| 🔬 **[Per-Artifact Methodologies](analysis/methodologies/per-artifact-methodologies.md)** | 34 sections — one per artifact type — with construction rules and quality signals. |
|
|
320
|
+
| 🕵️ **[OSINT Tradecraft Standards](analysis/methodologies/osint-tradecraft-standards.md)** | ICD-203 standards · Admiralty source grades · Kent / WEP probability bands · SAT catalog · OSINT ethics. |
|
|
321
|
+
| 🏷️ **[Political Classification Guide](analysis/methodologies/political-classification-guide.md)** | 7-dimension EP event classification (actors, stances, urgency, policy domain, risk surface). |
|
|
322
|
+
| ⚖️ **[Political Risk Methodology](analysis/methodologies/political-risk-methodology.md)** | Quantitative 5×5 Likelihood × Impact scoring adapted from the Hack23 ISMS. |
|
|
323
|
+
| 🧮 **[Political SWOT Framework](analysis/methodologies/political-swot-framework.md)** | Evidence-based SWOT/TOWS with ≥80-word depth floor per quadrant item. |
|
|
324
|
+
| 🛡️ **[Political Threat Framework](analysis/methodologies/political-threat-framework.md)** | 5-framework integrated model: 6D Threat Landscape + Attack Trees + Kill Chain + Diamond + ICO Profiling. STRIDE explicitly rejected for political analysis. |
|
|
325
|
+
| 🔗 **[Synthesis Methodology](analysis/methodologies/synthesis-methodology.md)** | Stage B.7 significance scoring → synthesis summary → stakeholder perspectives → coalition dynamics → executive brief. |
|
|
326
|
+
| 🌍 **[Strategic Extensions](analysis/methodologies/strategic-extensions-methodology.md)** | Scenario forecasts, ACH (Heuer), wildcards & black swans, comparative international, intelligence assessment. |
|
|
327
|
+
| 🗳️ **[Electoral Domain Methodology](analysis/methodologies/electoral-domain-methodology.md)** | EP10/EP11 electoral context, coalition mathematics (361-seat threshold), voter segmentation. |
|
|
328
|
+
| 📐 **[Per-Document Methodology](analysis/methodologies/per-document-methodology.md)** | Atomic evidence-layer methodology for individual EP documents. |
|
|
329
|
+
| 🧾 **[Structural Metadata Methodology](analysis/methodologies/structural-metadata-methodology.md)** | Provenance, `manifest.json`, cross-reference maps, GDPR Article 30 compliance. |
|
|
330
|
+
| ✍️ **[Political Style Guide](analysis/methodologies/political-style-guide.md)** | The Economist-inspired tone, balance, attribution rules, multi-language considerations. |
|
|
331
|
+
| 💰 **[IMF Indicator Mapping](analysis/methodologies/imf-indicator-mapping.md)** | IMF WEO/Fiscal Monitor/IFS/BOP/ER/PCPS → EP article-type primary economic source. |
|
|
332
|
+
| 🌱 **[World Bank Indicator Mapping](analysis/methodologies/worldbank-indicator-mapping.md)** | Non-economic World Bank Open Data indicators (health, education, environment, governance, innovation). |
|
|
333
|
+
| 📏 **[Reference Quality Thresholds](analysis/methodologies/reference-quality-thresholds.json)** | Per-artifact line-count floors enforced at the Stage-C completeness gate. |
|
|
373
334
|
|
|
374
|
-
|
|
375
|
-
- [e2e/README.md](e2e/README.md) - E2E testing guide
|
|
335
|
+
> 🔍 **Browse all 17 methodologies, 52 templates, 19 tradecraft references, and 1,700+ artifacts produced across 170+ daily analysis runs** on the [Political Intelligence Hub](https://euparliamentmonitor.com/political-intelligence.html).
|
|
376
336
|
|
|
377
|
-
|
|
337
|
+
---
|
|
378
338
|
|
|
379
|
-
|
|
380
|
-
streamline development:
|
|
339
|
+
## 📰 Live News Streams
|
|
381
340
|
|
|
382
|
-
-
|
|
383
|
-
specialist for issue creation and coordination
|
|
384
|
-
- 📰 **[news-journalist](.github/agents/news-journalist.md)** - The
|
|
385
|
-
Economist-style European Parliament reporting
|
|
386
|
-
- 🎨 **[frontend-specialist](.github/agents/frontend-specialist.md)** -
|
|
387
|
-
HTML5/CSS3/WCAG 2.1 AA UI/UX expert
|
|
388
|
-
- 🔄
|
|
389
|
-
**[data-pipeline-specialist](.github/agents/data-pipeline-specialist.md)** -
|
|
390
|
-
European Parliament MCP integration expert
|
|
391
|
-
- ⚙️ **[devops-engineer](.github/agents/devops-engineer.md)** - CI/CD and GitHub
|
|
392
|
-
Actions automation
|
|
393
|
-
- 🔒 **[security-architect](.github/agents/security-architect.md)** - ISMS,
|
|
394
|
-
GDPR, NIS2 compliance expert
|
|
395
|
-
- 📚 **[documentation-architect](.github/agents/documentation-architect.md)** -
|
|
396
|
-
C4 models and architecture docs
|
|
397
|
-
- ✅ **[quality-engineer](.github/agents/quality-engineer.md)** - Testing,
|
|
398
|
-
validation, and accessibility
|
|
341
|
+
**Eight unified gh-aw article workflows** plus a **14-language translation helper** run on precision schedules, autonomously generating *Economist-style* political intelligence and opening publication-ready pull requests. Every workflow follows the same Stage A → E contract documented in [Article-Generation.md](Article-Generation.md).
|
|
399
342
|
|
|
400
|
-
|
|
343
|
+
| Workflow | Article Type | Focus |
|
|
344
|
+
|----------|--------------|-------|
|
|
345
|
+
| 🚨 **[news-breaking.md](.github/workflows/news-breaking.md)** | `breaking` | Rapid-response coverage of significant EP developments. |
|
|
346
|
+
| 📋 **[news-week-ahead.md](.github/workflows/news-week-ahead.md)** | `week-ahead` | Forward calendar, committee agenda, urgency-file outlook. |
|
|
347
|
+
| 🔭 **[news-month-ahead.md](.github/workflows/news-month-ahead.md)** | `month-ahead` | 30-day strategic horizon and risk forecast. |
|
|
348
|
+
| 📊 **[news-week-in-review.md](.github/workflows/news-week-in-review.md)** | `week-in-review` | Past-week retrospective intelligence (D-8 → D-36 reporting window). |
|
|
349
|
+
| 📈 **[news-month-in-review.md](.github/workflows/news-month-in-review.md)** | `month-in-review` | Monthly retrospective with cross-run continuity analysis. |
|
|
350
|
+
| 🏛️ **[news-committee-reports.md](.github/workflows/news-committee-reports.md)** | `committee-reports` | Committee activity, rapporteur work, legislative-production analysis. |
|
|
351
|
+
| ⚖️ **[news-motions.md](.github/workflows/news-motions.md)** | `motions` | Plenary motions, resolutions, urgency files, political signals. |
|
|
352
|
+
| 📜 **[news-propositions.md](.github/workflows/news-propositions.md)** | `propositions` | Legislative proposals and pipeline analysis. |
|
|
353
|
+
| 🌍 **[news-translate.md](.github/workflows/news-translate.md)** | translation helper | 14-language flush translation (manual dispatch only). |
|
|
401
354
|
|
|
402
|
-
|
|
403
|
-
# Use product-task-agent to analyze repository and create improvement issues
|
|
404
|
-
@product-task-agent analyze the multi-language support and create issues for any gaps
|
|
355
|
+
Each unified workflow runs Stages A–E **in a single 45-minute session** and produces exactly one PR containing both the analysis artifacts and the rendered HTML. The earlier split-pair `news-<type>-analysis.md` + `news-<type>-article.md` layout was retired in the April-2026 aggregator migration. See **[.github/workflows/README.md](.github/workflows/README.md)** for compile / lock-file / safe-output mechanics, and **[WORKFLOWS.md](WORKFLOWS.md)** for the full CI/CD catalog.
|
|
405
356
|
|
|
406
|
-
|
|
407
|
-
@news-journalist create a week-ahead article for the upcoming plenary session
|
|
357
|
+
> 📚 **Prompt Library (`.github/prompts/`)** — 10 bounded-context prompt files (`00-scope-and-ground-rules.md` → `09-troubleshooting.md`) shared across every workflow. The `npm run lint:prompts` drift-guard fails CI on banned patterns (`checkpoint pr`, `keep-alive`, `heartbeat`, `progressive safe output`, `push_repo_memory`).
|
|
408
358
|
|
|
409
|
-
|
|
410
|
-
@frontend-specialist make the language switcher fully keyboard accessible
|
|
411
|
-
```
|
|
359
|
+
---
|
|
412
360
|
|
|
413
|
-
|
|
414
|
-
detailed agent capabilities, usage patterns, and examples.
|
|
361
|
+
## 🤖 Agent Catalog
|
|
415
362
|
|
|
416
|
-
|
|
363
|
+
EU Parliament Monitor uses a layered agent model: a small set of **product-domain agents** owns the news pipeline, while **infrastructure agents** maintain workflows, contributions, and CI hygiene.
|
|
417
364
|
|
|
418
|
-
-
|
|
419
|
-
- **EU Core**: German (de), French (fr), Spanish (es), Dutch (nl)
|
|
420
|
-
- **Middle East**: Arabic (ar), Hebrew (he)
|
|
421
|
-
- **East Asia**: Japanese (ja), Korean (ko), Chinese (zh)
|
|
365
|
+
### Product-domain agents (own the news critical path)
|
|
422
366
|
|
|
423
|
-
|
|
367
|
+
| Agent | Role |
|
|
368
|
+
|---|---|
|
|
369
|
+
| 🕵️ **[intelligence-operative](.github/agents/intelligence-operative.md)** | Senior political intelligence analyst — applies ACH, SWOT, PESTLE, OSINT tradecraft, threat framework. Owns Stage-B analysis artifacts. |
|
|
370
|
+
| 📰 **[news-journalist](.github/agents/news-journalist.md)** | The Economist-style EP reporting in 14 languages. Authors editorial prose only when analysis artifacts are signed off. |
|
|
371
|
+
| 🔄 **[data-pipeline-specialist](.github/agents/data-pipeline-specialist.md)** | EP MCP integration (60+ tools), data quality, voting-records fallback to EP Open Data Portal. |
|
|
372
|
+
| 🎨 **[frontend-specialist](.github/agents/frontend-specialist.md)** | HTML5/CSS3, WCAG 2.1 AA accessibility, multi-language UI, RTL support. |
|
|
373
|
+
| ✅ **[quality-engineer](.github/agents/quality-engineer.md)** | Vitest + Playwright, HTML validation, accessibility testing, performance benchmarking. |
|
|
374
|
+
| ⚙️ **[devops-engineer](.github/agents/devops-engineer.md)** | gh-aw workflow compilation, GitHub Actions, S3/CloudFront deploy, MCP gateway. |
|
|
375
|
+
| 📚 **[documentation-architect](.github/agents/documentation-architect.md)** | C4 models, Mermaid diagrams, ARCHITECTURE.md, ADRs. |
|
|
376
|
+
| 🛡️ **security-architect** *(see [SECURITY.md](SECURITY.md))* | ISMS, GDPR, NIS2, EU CRA compliance — reviews data classification of intelligence products. |
|
|
377
|
+
| 📋 **[product-task-agent](.github/agents/product-task-agent.md)** | Issue creation, ISMS tracking, capability-roadmap coordination. |
|
|
378
|
+
| 📣 **[marketing-specialist](.github/agents/marketing-specialist.md)** | Privacy-first multi-language engagement, GDPR-compliant outreach. |
|
|
379
|
+
| 💼 **[business-development-specialist](.github/agents/business-development-specialist.md)** | Strategic planning, civic-tech partnerships, sustainable transparency models. |
|
|
424
380
|
|
|
425
|
-
|
|
426
|
-
- **npm**: Version 10 or higher (comes with Node.js 25)
|
|
427
|
-
- **Git**: For cloning the repository
|
|
381
|
+
### Infrastructure agents (maintain workflows and CI hygiene)
|
|
428
382
|
|
|
429
|
-
|
|
430
|
-
```bash
|
|
431
|
-
node --version # Should be v25.x.x or higher
|
|
432
|
-
npm --version # Should be 10.x.x or higher
|
|
433
|
-
```
|
|
383
|
+
`agentic-workflows.agent.md`, `news-generation.agent.md`, `ci-cleaner.agent.md`, `contribution-checker.agent.md`, `create-safe-output-type.agent.md`, `custom-engine-implementation.agent.md`, `grumpy-reviewer.agent.md`, `interactive-agent-designer.agent.md`, `technical-doc-writer.agent.md`, `w3c-specification-writer.agent.md`. See [.github/agents/README.md](.github/agents/README.md).
|
|
434
384
|
|
|
435
|
-
|
|
385
|
+
---
|
|
436
386
|
|
|
437
|
-
|
|
387
|
+
## 📦 Quick Start (npm package)
|
|
438
388
|
|
|
439
389
|
```bash
|
|
440
390
|
npm install euparliamentmonitor
|
|
441
391
|
```
|
|
442
392
|
|
|
443
|
-
### TypeScript / ES Module Usage
|
|
444
|
-
|
|
445
393
|
```typescript
|
|
446
394
|
import {
|
|
447
|
-
// MCP
|
|
395
|
+
// EP MCP client (60+ open-data tools)
|
|
448
396
|
EuropeanParliamentMCPClient,
|
|
449
397
|
getEPMCPClient,
|
|
450
|
-
//
|
|
451
|
-
buildIndexFromEntries,
|
|
452
|
-
findRelatedArticles,
|
|
453
|
-
generateCrossReferences,
|
|
454
|
-
// Article generation (aggregator pipeline)
|
|
398
|
+
// Article generation (deterministic aggregator pipeline)
|
|
455
399
|
generateArticle,
|
|
456
400
|
aggregateAnalysisRun,
|
|
457
401
|
renderMarkdown,
|
|
458
|
-
//
|
|
402
|
+
// Cross-article intelligence index
|
|
403
|
+
buildIndexFromEntries,
|
|
404
|
+
findRelatedArticles,
|
|
405
|
+
generateCrossReferences,
|
|
406
|
+
// Multi-language support (14 languages, RTL aware)
|
|
459
407
|
ALL_LANGUAGES,
|
|
460
408
|
LANGUAGE_NAMES,
|
|
461
409
|
} from 'euparliamentmonitor';
|
|
@@ -465,737 +413,204 @@ import { EuropeanParliamentMCPClient } from 'euparliamentmonitor/mcp/ep-mcp-clie
|
|
|
465
413
|
import type { ArticleCategory, LanguageCode } from 'euparliamentmonitor/types';
|
|
466
414
|
```
|
|
467
415
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
```bash
|
|
471
|
-
# Clone the repository
|
|
472
|
-
git clone https://github.com/Hack23/euparliamentmonitor.git
|
|
473
|
-
cd euparliamentmonitor
|
|
474
|
-
|
|
475
|
-
# Install dependencies
|
|
476
|
-
npm install
|
|
477
|
-
```
|
|
478
|
-
|
|
479
|
-
### Optional: European Parliament MCP Server
|
|
480
|
-
|
|
481
|
-
For real EU Parliament data integration, install the MCP server:
|
|
482
|
-
|
|
483
|
-
```bash
|
|
484
|
-
# Clone the MCP server repository
|
|
485
|
-
git clone https://github.com/Hack23/European-Parliament-MCP-Server.git
|
|
486
|
-
cd European-Parliament-MCP-Server
|
|
487
|
-
|
|
488
|
-
# Install dependencies and build
|
|
489
|
-
npm install
|
|
490
|
-
npm run build
|
|
416
|
+
**Bundled capabilities:**
|
|
491
417
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
418
|
+
- 🏛️ **EU Parliament MCP Client** — 60+ tools covering plenary sessions, committee reports, voting records, parliamentary questions, adopted texts, procedures, MEPs, and declarations, with built-in fallback to the EP Open Data Portal `/api/v2/decision` endpoint when MCP returns empty voting payloads.
|
|
419
|
+
- 📰 **Deterministic Article Aggregator** — walks `manifest.json`, cleans each artifact, renders Markdown source + 14 HTML variants with full SEO chrome, JSON-LD `NewsArticle`, hreflang alternates, and `isBasedOn` provenance lists.
|
|
420
|
+
- 🔍 **Political Intelligence Analytics** — voting-anomaly detection, coalition dynamics, MEP influence scoring, OSINT correlation (5-framework threat model).
|
|
421
|
+
- 🌍 **14-Language Renderer** — EN, SV, DA, NO, FI, DE, FR, ES, NL, AR (RTL), HE (RTL), JA, KO, ZH — with WCAG 2.1 AA accessibility and shared site chrome.
|
|
495
422
|
|
|
496
|
-
|
|
423
|
+
> 📦 **Provenance:** Published with [npm provenance](https://docs.npmjs.com/generating-provenance-statements) and [SLSA Level 3](https://github.com/Hack23/euparliamentmonitor/attestations) build attestations.
|
|
497
424
|
|
|
498
|
-
|
|
499
|
-
export EP_MCP_SERVER_PATH="/path/to/European-Parliament-MCP-Server/dist/index.js"
|
|
500
|
-
```
|
|
425
|
+
---
|
|
501
426
|
|
|
502
|
-
|
|
503
|
-
without it using placeholder content.
|
|
427
|
+
## 🔌 Data Sources
|
|
504
428
|
|
|
505
|
-
|
|
429
|
+
**Primary — European Parliament MCP Server** ([Hack23/European-Parliament-MCP-Server](https://github.com/Hack23/European-Parliament-MCP-Server) v1.2.15+, fully operational):
|
|
506
430
|
|
|
507
|
-
|
|
431
|
+
- 🗳️ Plenary sessions, voting records, roll-call votes
|
|
432
|
+
- 📜 Adopted texts, motions, resolutions, urgency files
|
|
433
|
+
- 🏛️ Committee meetings, reports, opinions, hearings
|
|
434
|
+
- 👥 MEPs (active, incoming, outgoing, homonym), declarations of financial interests
|
|
435
|
+
- ❓ Parliamentary questions (written/oral)
|
|
436
|
+
- 📂 Procedures, plenary documents, external documents, controlled vocabularies
|
|
437
|
+
- 📊 Analytical tools: voting patterns, coalition dynamics, MEP influence, network analysis, sentiment tracker, early warning system, intelligence correlation
|
|
508
438
|
|
|
509
|
-
|
|
439
|
+
**Secondary — public economic & social context:**
|
|
510
440
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
npm run generate-article -- --run analysis/daily/2025-01-01/breaking
|
|
441
|
+
- 💰 **IMF** (primary economic source per the [IMF Indicator Mapping](analysis/methodologies/imf-indicator-mapping.md)) — World Economic Outlook (WEO), Fiscal Monitor, International Financial Statistics (IFS), Balance of Payments (BOP), Exchange Rates, and Primary Commodity Price System (PCPS).
|
|
442
|
+
- 🌱 **World Bank Open Data** (non-economic only) — health, education, environment, demographics, governance, innovation.
|
|
514
443
|
|
|
515
|
-
|
|
516
|
-
# manifest.json has no valid articleType; collision-suffixes same-date /
|
|
517
|
-
# same-type runs with a sanitised runId)
|
|
518
|
-
npm run generate-article:all
|
|
444
|
+
**Boundary:** Only **public** EP/IMF/World Bank data is used. No personal MEP profiling beyond public parliamentary roles. GDPR-clean by design.
|
|
519
445
|
|
|
520
|
-
|
|
521
|
-
npm run generate-article -- --all --since 2026-04-01
|
|
522
|
-
```
|
|
446
|
+
---
|
|
523
447
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
- `news/<slug>.en.md` — aggregated Markdown (provenance block + 19-section
|
|
527
|
-
ordered artifact set + Tradecraft References appendix + Analysis Index appendix)
|
|
528
|
-
- `news/<slug>-<lang>.html` — 14 language variants, each wrapped in the
|
|
529
|
-
shared site chrome (stacked header with embedded language switcher,
|
|
530
|
-
article-level Table of Contents sidebar, shared footer with live
|
|
531
|
-
article-count stats)
|
|
532
|
-
|
|
533
|
-
The aggregator lives under `src/aggregator/` — see the
|
|
534
|
-
[aggregator pipeline](ARCHITECTURE.md#aggregator-pipeline) section of the
|
|
535
|
-
architecture doc for the full data flow.
|
|
536
|
-
|
|
537
|
-
#### Editorial-highlight metadata resolver
|
|
538
|
-
|
|
539
|
-
The `<title>` / `<meta description>` / Open Graph / Twitter / JSON-LD
|
|
540
|
-
`NewsArticle` fields for every article are resolved by
|
|
541
|
-
`src/aggregator/article-metadata.ts` through a 5-tier priority ladder:
|
|
542
|
-
|
|
543
|
-
1. **Manifest override** — the Stage-B agent writes one of these keys in
|
|
544
|
-
`manifest.json` when it has an editorial headline:
|
|
545
|
-
|
|
546
|
-
```jsonc
|
|
547
|
-
{
|
|
548
|
-
"articleType": "breaking",
|
|
549
|
-
// String form — applied to all 14 language variants (recommended
|
|
550
|
-
// when only an English headline is available):
|
|
551
|
-
"title": "Banking Union Breakthrough and Anti-Corruption Landmark",
|
|
552
|
-
"description": "The plenary closes a six-year debate and triggers immediate criticism from two national delegations about implementation timelines.",
|
|
553
|
-
// OR per-language form when translations already exist:
|
|
554
|
-
"title": { "en": "…", "sv": "…", "de": "…" },
|
|
555
|
-
"description": { "en": "…", "sv": "…" }
|
|
556
|
-
}
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
2. **First artefact H1** — the aggregator walks the manifest's ordered
|
|
560
|
-
artefact list (`intelligence/synthesis-summary.md`,
|
|
561
|
-
`executive-summary.md`, `breaking-news-analysis.md`, …) and promotes
|
|
562
|
-
the first non-generic `# …` heading.
|
|
563
|
-
3. **Aggregated-markdown H1** — any non-generic top-level heading in the
|
|
564
|
-
rendered Markdown.
|
|
565
|
-
4. **First strong prose paragraph** — with a tightened leak filter that
|
|
566
|
-
blocks mermaid `%%{init}` blocks, `title …` directives, emoji-banner
|
|
567
|
-
metadata, and `Analysis Date:` / `Classification:` / `Run:` / `Window:`
|
|
568
|
-
/ `Purpose:` / `BLUF (ICD-203):` style rows.
|
|
569
|
-
5. **Localized template** — `*_TITLES(date)` from
|
|
570
|
-
`src/constants/language-articles.ts` — last resort when no editorial
|
|
571
|
-
content exists at all.
|
|
572
|
-
|
|
573
|
-
Downstream generators (`news-indexes.ts`, `sitemap.ts`, political-intelligence
|
|
574
|
-
cards, RSS) call `extractArticleMeta()` in `src/utils/file-utils.ts`, which
|
|
575
|
-
reads the `<head><title>` value (with the ` — EU Parliament Monitor`
|
|
576
|
-
suffix stripped) as the primary title, so the resolver's output
|
|
577
|
-
propagates everywhere without separate code changes in each generator.
|
|
578
|
-
|
|
579
|
-
#### Backport SEO metadata into existing articles
|
|
580
|
-
|
|
581
|
-
`scripts/backport-article-seo.js` rewrites `<title>`, the meta
|
|
582
|
-
description, Open Graph, Twitter, and JSON-LD `headline`/`description`
|
|
583
|
-
for every already-rendered `news/*-<lang>.html` file by extracting the
|
|
584
|
-
first editorial H1 and first strong prose paragraph from the article
|
|
585
|
-
body itself. The rewrite is idempotent — re-running over a backported
|
|
586
|
-
file is a byte-identical no-op — and the article body is never
|
|
587
|
-
modified.
|
|
448
|
+
## 🔒 Security & ISMS Compliance
|
|
588
449
|
|
|
589
|
-
|
|
590
|
-
# Preview the change-set (dry-run is the default; prints a per-article-
|
|
591
|
-
# type summary and up to 12 sample before/after diffs):
|
|
592
|
-
node scripts/backport-article-seo.js
|
|
450
|
+
EU Parliament Monitor implements **security-by-design** under the [Hack23 ISMS](https://github.com/Hack23/ISMS-PUBLIC) framework.
|
|
593
451
|
|
|
594
|
-
|
|
595
|
-
node scripts/backport-article-seo.js --apply
|
|
452
|
+
### Project classification
|
|
596
453
|
|
|
597
|
-
|
|
598
|
-
|
|
454
|
+
| Dimension | Level |
|
|
455
|
+
|---|---|
|
|
456
|
+
| Confidentiality | Public (Level 1) — European Parliament open data only |
|
|
457
|
+
| Integrity | Medium (Level 2) — accuracy critical for democratic transparency |
|
|
458
|
+
| Availability | Medium (Level 2) — daily updates, 24h RTO |
|
|
459
|
+
| Strategic value | Democratic transparency, open civic-tech leadership |
|
|
599
460
|
|
|
600
|
-
|
|
601
|
-
node scripts/backport-article-seo.js --apply --dir news
|
|
602
|
-
```
|
|
461
|
+
### Compliance frameworks
|
|
603
462
|
|
|
604
|
-
|
|
605
|
-
|
|
463
|
+
| Framework | Scope | Evidence |
|
|
464
|
+
|---|---|---|
|
|
465
|
+
| **ISO 27001:2022** | Information security management | [SECURITY_ARCHITECTURE.md](SECURITY_ARCHITECTURE.md) — A.5.10, A.5.12, A.5.23, A.8.11, A.8.28 |
|
|
466
|
+
| **NIST CSF 2.0** | Identify · Protect · Detect · Respond · Recover | Compliance matrix in SECURITY_ARCHITECTURE.md |
|
|
467
|
+
| **CIS Controls v8.1** | Operational security best practices | CodeQL, Dependabot, npm audit, SBOM |
|
|
468
|
+
| **GDPR** | Data minimization, purpose limitation | Public-data-only boundary, no profiling |
|
|
469
|
+
| **NIS2** | Article 20, 21 cybersecurity risk management | [THREAT_MODEL.md](THREAT_MODEL.md) (STRIDE for software-security context) |
|
|
470
|
+
| **EU Cyber Resilience Act** | SBOM, vulnerability disclosure, Annex I/V | [CRA-ASSESSMENT.md](CRA-ASSESSMENT.md), SLSA provenance, [SECURITY.md](SECURITY.md) |
|
|
606
471
|
|
|
607
|
-
|
|
608
|
-
node scripts/generators/news-indexes.js # 14 language index pages
|
|
609
|
-
node scripts/generators/sitemap.js # 14 sitemap HTMLs + sitemap.xml + rss.xml
|
|
610
|
-
```
|
|
472
|
+
### Key security controls
|
|
611
473
|
|
|
612
|
-
|
|
474
|
+
- ✅ **Minimal attack surface** — static site, no databases, no server-side execution
|
|
475
|
+
- ✅ **Same-origin JS bundle** — all executable assets under `js/vendor/`, strict `script-src 'self'` CSP, no external CDN
|
|
476
|
+
- ✅ **Automated security** — CodeQL SAST, Dependabot SCA, npm audit, OpenSSF Scorecard
|
|
477
|
+
- ✅ **Supply chain** — SHA-pinned GitHub Actions, SBOM (SPDX), SLSA Level 3 attestations
|
|
478
|
+
- ✅ **Input validation** — multi-layer XSS prevention, HTML sanitization, markdown-it with explicit plugin allowlist
|
|
479
|
+
- ✅ **Infrastructure** — GitHub-hosted ephemeral runners, S3/CloudFront via OIDC `GithubWorkFlowRole`, HTTPS enforcement, `step-security/harden-runner` egress block
|
|
613
480
|
|
|
614
|
-
|
|
615
|
-
# Generate per-run news index pages (consumed by the aggregator's
|
|
616
|
-
# transparency footer and political-intelligence.html)
|
|
617
|
-
npm run generate-news-indexes
|
|
618
|
-
|
|
619
|
-
# Generate sitemap.xml, sitemap_<lang>.html, and political-intelligence_<lang>.html
|
|
620
|
-
# (14 language-specific sitemap pages + 14 language-specific Political Intelligence
|
|
621
|
-
# pages that index every methodology, template, and daily analysis run)
|
|
622
|
-
npm run generate-sitemap
|
|
623
|
-
```
|
|
481
|
+
📋 **Full security architecture:** [SECURITY_ARCHITECTURE.md](SECURITY_ARCHITECTURE.md) · [SECURITY.md](SECURITY.md) · [THREAT_MODEL.md](THREAT_MODEL.md) · [CLASSIFICATION.md](CLASSIFICATION.md)
|
|
624
482
|
|
|
625
|
-
|
|
483
|
+
---
|
|
626
484
|
|
|
627
|
-
|
|
628
|
-
# Serve the site locally
|
|
629
|
-
npm run serve
|
|
485
|
+
## 🛠️ Local Development
|
|
630
486
|
|
|
631
|
-
|
|
632
|
-
```
|
|
487
|
+
### Requirements
|
|
633
488
|
|
|
634
|
-
|
|
489
|
+
- **Node.js** 25 or higher
|
|
490
|
+
- **npm** 10 or higher (ships with Node.js 25)
|
|
491
|
+
- **Git**
|
|
635
492
|
|
|
636
|
-
|
|
637
|
-
`js/vendor/` under a strict `script-src 'self'` CSP — no external CDN. Vendored
|
|
638
|
-
libraries are copied from `node_modules/` at build time:
|
|
493
|
+
### From source
|
|
639
494
|
|
|
640
495
|
```bash
|
|
641
|
-
|
|
496
|
+
git clone https://github.com/Hack23/euparliamentmonitor.git
|
|
497
|
+
cd euparliamentmonitor
|
|
498
|
+
npm install
|
|
642
499
|
```
|
|
643
500
|
|
|
644
|
-
|
|
645
|
-
runs `copy-vendor` before `aws s3 sync` and includes both `*.js` and `*.mjs`
|
|
646
|
-
files (Mermaid 11 ships as code-split ESM under `js/vendor/mermaid/chunks/`).
|
|
647
|
-
If you add a new diagram type to a template, no extra wiring is needed — the
|
|
648
|
-
chunk loader is part of the vendored bundle.
|
|
649
|
-
|
|
650
|
-
#### Stage-C Analysis Validator
|
|
651
|
-
|
|
652
|
-
Before opening an article PR, validate the analysis run completeness:
|
|
501
|
+
### Build, lint, test, render
|
|
653
502
|
|
|
654
503
|
```bash
|
|
655
|
-
npm run
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
504
|
+
npm run build # TypeScript compilation
|
|
505
|
+
npm run lint # ESLint (TypeScript in src/)
|
|
506
|
+
npm run lint:prompts # gh-aw prompt drift-guard
|
|
507
|
+
npm run htmlhint # HTML validation
|
|
508
|
+
npm run test # Vitest unit + integration (169+ tests)
|
|
509
|
+
npm run test:coverage # Coverage report (≥80% line, ≥75% branch)
|
|
510
|
+
npm run test:e2e # Playwright cross-browser E2E
|
|
511
|
+
npm run validate-analysis # Stage-C completeness gate
|
|
512
|
+
npm run generate-article -- --run analysis/daily/2026-04-24/breaking
|
|
513
|
+
npm run generate-article:all # batch regen every committed run
|
|
514
|
+
npm run generate-news-indexes # 14-language news index pages
|
|
515
|
+
npm run generate-sitemap # sitemap.xml + 14 sitemap_<lang>.html
|
|
516
|
+
npm run docs:generate # TypeDoc API docs + index
|
|
517
|
+
npm run serve # local static-site preview at :8080
|
|
666
518
|
```
|
|
667
|
-
euparliamentmonitor/
|
|
668
|
-
├── .github/
|
|
669
|
-
│ ├── agents/ # Custom GitHub Copilot agents
|
|
670
|
-
│ ├── workflows/ # CI/CD workflow configurations
|
|
671
|
-
│ └── release-drafter.yml # Release notes configuration
|
|
672
|
-
├── src/ # TypeScript source (compiles to scripts/)
|
|
673
|
-
│ ├── constants/ # Language data, configuration
|
|
674
|
-
│ ├── generators/ # News, index, sitemap generators
|
|
675
|
-
│ ├── mcp/ # European Parliament MCP client
|
|
676
|
-
│ ├── templates/ # HTML article templates
|
|
677
|
-
│ ├── types/ # Shared TypeScript interfaces
|
|
678
|
-
│ └── utils/ # File utilities, metadata
|
|
679
|
-
├── scripts/ # Compiled JavaScript output
|
|
680
|
-
│ ├── constants/ # Compiled constants
|
|
681
|
-
│ ├── generators/ # Compiled generators
|
|
682
|
-
│ ├── mcp/ # Compiled MCP client
|
|
683
|
-
│ ├── templates/ # Compiled templates
|
|
684
|
-
│ ├── types/ # Compiled type definitions
|
|
685
|
-
│ └── utils/ # Compiled utilities
|
|
686
|
-
├── news/ # Generated news articles
|
|
687
|
-
│ └── metadata/ # Generation metadata
|
|
688
|
-
├── test/ # Vitest unit & integration tests
|
|
689
|
-
├── e2e/ # Playwright E2E tests
|
|
690
|
-
├── docs/ # Generated documentation
|
|
691
|
-
├── styles.css # Article styling
|
|
692
|
-
├── index-{lang}.html # Language-specific index pages
|
|
693
|
-
├── typedoc.json # TypeDoc configuration
|
|
694
|
-
├── tsconfig.json # TypeScript configuration
|
|
695
|
-
├── sitemap.xml # SEO sitemap with hreflang alternates
|
|
696
|
-
├── sitemap.html # Human-readable sitemap (English)
|
|
697
|
-
├── sitemap_{lang}.html # Per-language human-readable sitemaps
|
|
698
|
-
├── political-intelligence.html # Index of every methodology + template + daily analysis run
|
|
699
|
-
├── political-intelligence_{lang}.html # Localized political-intelligence pages
|
|
700
|
-
└── package.json # Project dependencies
|
|
701
|
-
```
|
|
702
|
-
|
|
703
|
-
## CI/CD & Automation
|
|
704
|
-
|
|
705
|
-
### GitHub Actions Workflows
|
|
706
|
-
|
|
707
|
-
The repository includes comprehensive GitHub Actions workflows for automation
|
|
708
|
-
and quality assurance:
|
|
709
|
-
|
|
710
|
-
#### 📰 News Generation
|
|
711
|
-
|
|
712
|
-
- **Schedule**: Runs daily at 06:00 UTC
|
|
713
|
-
- **Manual Trigger**: Can be triggered manually with custom parameters
|
|
714
|
-
- **Automatic Commit**: Commits and pushes generated articles automatically
|
|
715
|
-
- **Workflow**: `.github/workflows/news-generation.yml`
|
|
716
|
-
|
|
717
|
-
**Workflow Inputs:**
|
|
718
|
-
|
|
719
|
-
- `article_types`: Comma-separated list of article types (default: `week-ahead`)
|
|
720
|
-
- `languages`: Languages to generate (`en`, `eu-core`, `all`, or custom list)
|
|
721
|
-
- `force_generation`: Force generation even if recent articles exist
|
|
722
|
-
|
|
723
|
-
#### 🏷️ PR Labeling
|
|
724
|
-
|
|
725
|
-
- **Automatic**: Labels PRs based on file changes
|
|
726
|
-
- **Configuration**: `.github/labeler.yml`
|
|
727
|
-
- **Workflow**: `.github/workflows/labeler.yml`
|
|
728
|
-
- **Setup**: Run `.github/workflows/setup-labels.yml` once to create all labels
|
|
729
|
-
|
|
730
|
-
#### 📦 Release Management
|
|
731
|
-
|
|
732
|
-
- **Automated Release Notes**: Via Release Drafter
|
|
733
|
-
- **Semantic Versioning**: Based on PR labels
|
|
734
|
-
- **SBOM & Attestations**: Security compliance with artifact attestations
|
|
735
|
-
- **Workflow**: `.github/workflows/release.yml`
|
|
736
|
-
- **Configuration**: `.github/release-drafter.yml`
|
|
737
|
-
|
|
738
|
-
#### 🔒 Security Scanning
|
|
739
|
-
|
|
740
|
-
- **CodeQL**: Automated security analysis on push, PR, and weekly schedule
|
|
741
|
-
- **OpenSSF Scorecard**: Supply chain security assessment (weekly, on branch protection changes)
|
|
742
|
-
- **Dependabot**: Weekly dependency updates for npm and GitHub Actions
|
|
743
|
-
- **Dependency Review**: Vulnerability scanning on pull requests
|
|
744
|
-
- **Vulnerability Scanning**: Automated npm audit in PR validation
|
|
745
|
-
- **Workflows**: `.github/workflows/codeql.yml`, `.github/workflows/scorecards.yml`, `.github/dependabot.yml`, `.github/workflows/dependency-review.yml`
|
|
746
|
-
|
|
747
|
-
#### 🏆 Compliance & Quality
|
|
748
|
-
|
|
749
|
-
- **REUSE Compliance**: License header verification (FSFE REUSE specification)
|
|
750
|
-
- **SonarCloud Analysis**: Automatic server-side code quality, security vulnerabilities, and technical debt tracking
|
|
751
|
-
- **SLSA Provenance**: Level 3 build attestations with SBOM generation on releases
|
|
752
|
-
- **Workflows**: `.github/workflows/reuse.yml`, `.github/workflows/release.yml`
|
|
753
|
-
|
|
754
|
-
#### ✅ Test & Validation
|
|
755
|
-
|
|
756
|
-
- **HTML Validation**: Automated htmlhint checks
|
|
757
|
-
- **Functional Tests**: News generation, index, and sitemap validation
|
|
758
|
-
- **Security Checks**: npm audit for vulnerabilities
|
|
759
|
-
- **Workflow**: `.github/workflows/test-and-report.yml`
|
|
760
519
|
|
|
761
|
-
|
|
762
|
-
### Workflow Status Badges
|
|
520
|
+
### Optional: live MCP integration
|
|
763
521
|
|
|
764
|
-
|
|
522
|
+
By default the workflows run with `USE_EP_MCP=true`. To experiment locally with the [European Parliament MCP Server](https://github.com/Hack23/European-Parliament-MCP-Server):
|
|
765
523
|
|
|
766
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)
|
|
767
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml)
|
|
768
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml)
|
|
769
|
-
|
|
770
|
-
**Security Workflows:**
|
|
771
|
-
|
|
772
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml)
|
|
773
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/scorecards.yml)
|
|
774
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/dependency-review.yml)
|
|
775
|
-
|
|
776
|
-
**Compliance Workflows:**
|
|
777
|
-
|
|
778
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/reuse.yml)
|
|
779
|
-
[](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml)
|
|
780
|
-
|
|
781
|
-
### Manual Release Process
|
|
782
|
-
|
|
783
|
-
To create a new release:
|
|
784
|
-
|
|
785
|
-
1. Go to **Actions** → **Release** workflow
|
|
786
|
-
2. Click **Run workflow**
|
|
787
|
-
3. Enter version (e.g., `v1.0.0`)
|
|
788
|
-
4. Select if pre-release
|
|
789
|
-
5. The workflow will:
|
|
790
|
-
- Run validation and tests (169 unit tests, E2E tests)
|
|
791
|
-
- Generate API documentation (TypeDoc)
|
|
792
|
-
- Generate test coverage reports (Vitest HTML)
|
|
793
|
-
- Generate E2E test reports (Playwright)
|
|
794
|
-
- Create documentation index
|
|
795
|
-
- Commit documentation to main branch
|
|
796
|
-
- Generate SBOM and attestations (SLSA Level 3)
|
|
797
|
-
- Create GitHub release with artifacts
|
|
798
|
-
- Update release notes automatically
|
|
799
|
-
|
|
800
|
-
**🔒 ISMS Evidence:**
|
|
801
|
-
- [Release Workflow](.github/workflows/release.yml) - Complete automation
|
|
802
|
-
- [SLSA Attestations](https://github.com/Hack23/euparliamentmonitor/attestations) - Build provenance
|
|
803
|
-
- [Release Process Guide](docs/RELEASE_PROCESS.md) - Step-by-step documentation
|
|
804
|
-
|
|
805
|
-
### Documentation as Code
|
|
806
|
-
|
|
807
|
-
Every release automatically generates comprehensive documentation:
|
|
808
|
-
|
|
809
|
-
| Documentation | Description | Link |
|
|
810
|
-
|--------------|-------------|------|
|
|
811
|
-
| **API Documentation** | TypeDoc-generated API reference from TypeScript source | [View Docs](https://hack23.github.io/euparliamentmonitor/docs/api/) |
|
|
812
|
-
| **Test Coverage** | Interactive Vitest coverage reports (82%+) | [View Coverage](https://hack23.github.io/euparliamentmonitor/docs/coverage/) |
|
|
813
|
-
| **E2E Test Reports** | Playwright test results with screenshots | [View Report](https://hack23.github.io/euparliamentmonitor/playwright-report/) |
|
|
814
|
-
| **Documentation Index** | Beautiful hub linking all reports | [View Index](https://hack23.github.io/euparliamentmonitor/docs/) |
|
|
815
|
-
|
|
816
|
-
**📋 How It Works:**
|
|
817
|
-
1. Release workflow runs all tests
|
|
818
|
-
2. Generates API docs with TypeDoc
|
|
819
|
-
3. Copies coverage reports to `docs/`
|
|
820
|
-
4. Creates documentation index page
|
|
821
|
-
5. Commits everything to `main` branch
|
|
822
|
-
6. Documentation is version-controlled and traceable
|
|
823
|
-
|
|
824
|
-
**🎯 Run Locally:**
|
|
825
524
|
```bash
|
|
826
|
-
|
|
827
|
-
npm
|
|
828
|
-
|
|
525
|
+
git clone https://github.com/Hack23/European-Parliament-MCP-Server.git
|
|
526
|
+
cd European-Parliament-MCP-Server && npm install && npm run build
|
|
527
|
+
export EP_MCP_SERVER_PATH="$(pwd)/dist/index.js"
|
|
528
|
+
# or use the gateway helper:
|
|
529
|
+
source scripts/mcp-setup.sh
|
|
829
530
|
```
|
|
830
531
|
|
|
831
|
-
|
|
832
|
-
- Documentation-as-code follows [Hack23 ISMS Secure Development Policy §3.2](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md#32-architecture-documentation)
|
|
833
|
-
- All releases include complete documentation evidence
|
|
834
|
-
- Documentation committed to repository for full auditability
|
|
835
|
-
|
|
836
|
-
### Setting Up Labels
|
|
837
|
-
|
|
838
|
-
First-time setup requires running the label creation workflow:
|
|
839
|
-
|
|
840
|
-
1. Go to **Actions** → **Setup Repository Labels**
|
|
841
|
-
2. Click **Run workflow**
|
|
842
|
-
3. Wait for completion
|
|
843
|
-
4. Labels will be automatically applied to future PRs
|
|
844
|
-
|
|
845
|
-
## Configuration
|
|
846
|
-
|
|
847
|
-
### Language Presets
|
|
848
|
-
|
|
849
|
-
- `en` - English only
|
|
850
|
-
- `eu-core` - English, German, French, Spanish, Dutch
|
|
851
|
-
- `nordic` - English, Swedish, Danish, Norwegian, Finnish
|
|
852
|
-
- `all` - All 14 supported languages
|
|
853
|
-
|
|
854
|
-
### Article Types
|
|
855
|
-
|
|
856
|
-
- `week-ahead` - Preview of upcoming parliamentary events
|
|
857
|
-
- `committee-reports` - Committee activity analysis (coming soon)
|
|
858
|
-
- `propositions` - Legislative proposals analysis (coming soon)
|
|
859
|
-
- `motions` - Parliamentary motions analysis (coming soon)
|
|
860
|
-
- `breaking` - Breaking news coverage (coming soon)
|
|
861
|
-
|
|
862
|
-
## Contributing
|
|
863
|
-
|
|
864
|
-
We welcome contributions from developers, journalists, translators, and security researchers!
|
|
865
|
-
|
|
866
|
-
### How to Contribute
|
|
867
|
-
|
|
868
|
-
Please read our comprehensive [Contributing Guide](CONTRIBUTING.md) for:
|
|
869
|
-
- Development workflow and setup instructions
|
|
870
|
-
- Code quality requirements and testing standards
|
|
871
|
-
- Pull request process and review guidelines
|
|
872
|
-
- Security best practices and ISMS compliance
|
|
873
|
-
- Multi-language contribution guidelines
|
|
874
|
-
|
|
875
|
-
### Code of Conduct
|
|
876
|
-
|
|
877
|
-
This project adheres to the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [conduct@hack23.com](mailto:conduct@hack23.com).
|
|
878
|
-
|
|
879
|
-
### Security
|
|
880
|
-
|
|
881
|
-
If you discover a security vulnerability, please follow our [Security Policy](SECURITY.md) for responsible disclosure. **Do not** report security issues through public GitHub issues.
|
|
882
|
-
|
|
883
|
-
### Contributors
|
|
532
|
+
Set `USE_EP_MCP=false` to disable MCP and fall back to placeholder/test data.
|
|
884
533
|
|
|
885
|
-
|
|
886
|
-
Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines on:
|
|
534
|
+
---
|
|
887
535
|
|
|
888
|
-
|
|
889
|
-
- Testing requirements (80% line coverage, 75% branch coverage)
|
|
890
|
-
- Security requirements (input validation, XSS prevention, dependency scanning)
|
|
891
|
-
- Commit message format (conventional commits)
|
|
892
|
-
- Pull request process
|
|
893
|
-
|
|
894
|
-
**Security-Critical Contributions**: All security-related changes must align with [SECURITY_ARCHITECTURE.md](SECURITY_ARCHITECTURE.md) and [Hack23 ISMS Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md).
|
|
895
|
-
|
|
896
|
-
## Security Policy
|
|
897
|
-
|
|
898
|
-
For security vulnerability reporting and disclosure process, please see [SECURITY.md](SECURITY.md).
|
|
899
|
-
|
|
900
|
-
**Responsible Disclosure**:
|
|
901
|
-
- Report vulnerabilities privately via GitHub Security Advisories
|
|
902
|
-
- 48-hour acknowledgment, 7-day validation, 30-day remediation for critical issues
|
|
903
|
-
- Public recognition for security researchers (unless anonymity requested)
|
|
904
|
-
|
|
905
|
-
## Badge Maintenance
|
|
906
|
-
|
|
907
|
-
### Maintaining Security Badge Status
|
|
908
|
-
|
|
909
|
-
EU Parliament Monitor maintains security excellence through continuous compliance with OpenSSF best practices:
|
|
910
|
-
|
|
911
|
-
#### OpenSSF Scorecard (Target: ≥7.0)
|
|
912
|
-
|
|
913
|
-
**Current Optimizations**:
|
|
914
|
-
- ✅ Branch protection on `main` branch
|
|
915
|
-
- ✅ Required code review for pull requests
|
|
916
|
-
- ✅ SHA-pinned GitHub Actions
|
|
917
|
-
- ✅ CodeQL SAST enabled
|
|
918
|
-
- ✅ Dependabot alerts enabled
|
|
919
|
-
- ✅ SECURITY.md present
|
|
920
|
-
- ✅ No dangerous workflow patterns
|
|
921
|
-
|
|
922
|
-
**Monitoring**: View current score at [OpenSSF Scorecard Dashboard](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)
|
|
923
|
-
|
|
924
|
-
#### CII Best Practices (Target: Passing → Silver → Gold)
|
|
925
|
-
|
|
926
|
-
**Requirements Met**:
|
|
927
|
-
- ✅ Public version control (GitHub)
|
|
928
|
-
- ✅ Public issue tracker (GitHub Issues)
|
|
929
|
-
- ✅ LICENSE file (Apache-2.0)
|
|
930
|
-
- ✅ CONTRIBUTING.md with clear guidelines
|
|
931
|
-
- ✅ CODE_OF_CONDUCT.md
|
|
932
|
-
- ✅ SECURITY.md with vulnerability reporting
|
|
933
|
-
- ✅ Documentation in README
|
|
934
|
-
- ✅ Automated testing (Vitest + Playwright, ≥80% coverage)
|
|
935
|
-
- ✅ Static analysis (CodeQL, ESLint)
|
|
936
|
-
- ✅ Dependency scanning (Dependabot, npm audit)
|
|
937
|
-
|
|
938
|
-
**Registration**: Complete questionnaire at [CII Best Practices](https://bestpractices.coreinfrastructure.org/)
|
|
939
|
-
|
|
940
|
-
#### SLSA Level 3 (Status: ✅ Implemented)
|
|
941
|
-
|
|
942
|
-
**Provenance Generation**:
|
|
943
|
-
- ✅ Automated on releases via `.github/workflows/release.yml`
|
|
944
|
-
- ✅ Build attestations using `actions/attest-build-provenance@v2`
|
|
945
|
-
- ✅ SBOM generation using SPDX format
|
|
946
|
-
- ✅ Artifacts uploaded to GitHub Releases
|
|
947
|
-
|
|
948
|
-
**Verification**: View attestations at `https://github.com/Hack23/euparliamentmonitor/attestations/`
|
|
949
|
-
|
|
950
|
-
#### FOSSA License Compliance
|
|
951
|
-
|
|
952
|
-
**Setup Required**:
|
|
953
|
-
1. Sign up at [FOSSA](https://fossa.com/)
|
|
954
|
-
2. Connect GitHub repository
|
|
955
|
-
3. Configure license policy (Apache-2.0 compatible only)
|
|
956
|
-
|
|
957
|
-
**Badge**: Updates automatically after scan completion
|
|
958
|
-
|
|
959
|
-
#### REUSE Compliance (Status: ✅ Implemented)
|
|
960
|
-
|
|
961
|
-
**Compliance Verification**:
|
|
962
|
-
- ✅ `.reuse/dep5` covers all files without headers
|
|
963
|
-
- ✅ Apache-2.0 license applied to all project files
|
|
964
|
-
- ✅ Copyright notices: "2024-2026 Hack23 AB"
|
|
965
|
-
|
|
966
|
-
**Workflow**: Runs on push, pull requests, and weekly via `.github/workflows/reuse.yml`
|
|
967
|
-
|
|
968
|
-
### ISMS Policy References
|
|
969
|
-
|
|
970
|
-
This project adheres to [Hack23 ISMS](https://github.com/Hack23/ISMS-PUBLIC) policies:
|
|
971
|
-
|
|
972
|
-
| Policy | Relevance | Implementation |
|
|
973
|
-
|--------|-----------|----------------|
|
|
974
|
-
| [**Open Source Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Open_Source_Policy.md) | Security badge requirements, governance artifacts | All badges, docs, REUSE compliance |
|
|
975
|
-
| [**CRA Conformity Assessment Process**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CRA_Conformity_Assessment_Process.md) | EU Cyber Resilience Act compliance | [CRA-ASSESSMENT.md](CRA-ASSESSMENT.md) |
|
|
976
|
-
| [**Secure Development Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md) | Development security standards | SECURITY_ARCHITECTURE.md, SAST/SCA/DAST |
|
|
977
|
-
| [**Threat Modeling Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Threat_Modeling.md) | Threat analysis requirements | STRIDE analysis in THREAT_MODEL.md |
|
|
978
|
-
| [**Vulnerability Management**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Vulnerability_Management.md) | Remediation SLAs | SECURITY.md disclosure timeline |
|
|
979
|
-
| [**Classification Framework**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) | Data classification | Public/Medium/Medium (L1/L2/L2) |
|
|
980
|
-
| [**Incident Response Plan**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Incident_Response_Plan.md) | Security incident procedures | Linked in SECURITY.md |
|
|
981
|
-
|
|
982
|
-
### Compliance Frameworks
|
|
983
|
-
|
|
984
|
-
EU Parliament Monitor aligns with multiple compliance frameworks:
|
|
985
|
-
|
|
986
|
-
| Framework | Controls | Evidence |
|
|
987
|
-
|-----------|----------|----------|
|
|
988
|
-
| **ISO 27001** | A.12.6.1 (Vulnerability Management), A.14.2.8 (Security Testing) | CodeQL, Dependabot, npm audit |
|
|
989
|
-
| **NIST CSF 2.0** | Identify, Protect, Detect, Respond, Recover | SECURITY_ARCHITECTURE.md compliance matrix |
|
|
990
|
-
| **CIS Controls v8.1** | 18.3 (Remediate Vulnerabilities), 2.7 (Allowlisting) | Automated scanning, SBOM |
|
|
991
|
-
| **GDPR** | Data Protection by Design | European Parliament open data (public) |
|
|
992
|
-
| **NIS2** | Article 20, 21 (Cybersecurity Risk Management) | Threat model, security controls |
|
|
993
|
-
| **EU Cyber Resilience Act** | SBOM, Vulnerability Disclosure, Annex I/V | [CRA-ASSESSMENT.md](CRA-ASSESSMENT.md), SLSA provenance, SECURITY.md |
|
|
994
|
-
|
|
995
|
-
## 🤖 AI-Disrupted News Generation & Agentic Intelligence
|
|
996
|
-
|
|
997
|
-
> *"While traditional newsrooms debate whether AI will replace journalists,
|
|
998
|
-
> EU Parliament Monitor quietly deployed 8 autonomous AI agents that generate
|
|
999
|
-
> investigative political intelligence in 14 languages before most reporters
|
|
1000
|
-
> have finished their morning coffee. The future of parliamentary journalism
|
|
1001
|
-
> didn't send a memo — it opened a pull request."*
|
|
1002
|
-
|
|
1003
|
-
The EU Parliament Monitor doesn't just report on European Parliament activity — it **autonomously generates deep political intelligence** at machine speed, with editorial quality that would make legacy news desks nervous. Every article is researched, written, localized, and prepared for publication by AI agents that operate by default on live European Parliament data via the [MCP Server](https://github.com/Hack23/European-Parliament-MCP-Server) (46 tools, real-time data), with transparent fallback to placeholder/test data when live access is unavailable as described above. The agents automatically generate content and open publication-ready pull requests; publication to the site occurs when a human reviews and merges those PRs.
|
|
1004
|
-
|
|
1005
|
-
### 📰 Agentic News Generation Architecture
|
|
1006
|
-
|
|
1007
|
-
**8 autonomous news workflows** run on precision schedules, each powered by a dedicated GitHub Copilot agentic workflow that fetches live EP data (with documented fallback behavior), generates Economist-style analysis, and opens publication-ready pull requests across all 14 languages:
|
|
1008
|
-
|
|
1009
|
-
```mermaid
|
|
1010
|
-
graph LR
|
|
1011
|
-
subgraph "📅 Daily Cycle (Mon-Fri)"
|
|
1012
|
-
CR["🏛️ Committee Reports<br/>04:00 UTC"]
|
|
1013
|
-
PR["📜 Propositions<br/>05:00 UTC"]
|
|
1014
|
-
MO["⚖️ Motions<br/>06:00 UTC"]
|
|
1015
|
-
end
|
|
1016
|
-
|
|
1017
|
-
subgraph "📆 Weekly Cycle"
|
|
1018
|
-
WA["📋 Week Ahead<br/>Fri 07:00 UTC"]
|
|
1019
|
-
WR["📊 Weekly Review<br/>Sat 09:00 UTC"]
|
|
1020
|
-
end
|
|
1021
|
-
|
|
1022
|
-
subgraph "📅 Monthly Cycle"
|
|
1023
|
-
MA["🔭 Month Ahead<br/>1st 08:00 UTC"]
|
|
1024
|
-
MR["📈 Monthly Review<br/>28th 10:00 UTC"]
|
|
1025
|
-
end
|
|
1026
|
-
|
|
1027
|
-
subgraph "🎛️ On-Demand"
|
|
1028
|
-
AG["🚀 Article Generator<br/>Manual Dispatch"]
|
|
1029
|
-
end
|
|
1030
|
-
|
|
1031
|
-
MCP["🔌 EP MCP Server<br/>46 Tools · Live Data"]
|
|
1032
|
-
|
|
1033
|
-
MCP --> CR & PR & MO & WA & WR & MA & MR & AG
|
|
1034
|
-
|
|
1035
|
-
style CR fill:#1a5276,color:#fff
|
|
1036
|
-
style PR fill:#1a5276,color:#fff
|
|
1037
|
-
style MO fill:#1a5276,color:#fff
|
|
1038
|
-
style WA fill:#117a65,color:#fff
|
|
1039
|
-
style WR fill:#117a65,color:#fff
|
|
1040
|
-
style MA fill:#7d3c98,color:#fff
|
|
1041
|
-
style MR fill:#7d3c98,color:#fff
|
|
1042
|
-
style AG fill:#b9770e,color:#fff
|
|
1043
|
-
style MCP fill:#c0392b,color:#fff
|
|
1044
|
-
```
|
|
1045
|
-
|
|
1046
|
-
| Workflow | Schedule | Focus | Output |
|
|
1047
|
-
|----------|----------|-------|--------|
|
|
1048
|
-
| 🏛️ **Committee Reports** | Mon–Fri 04:00 UTC | Committee decisions & activities | 14 language articles |
|
|
1049
|
-
| 📜 **Propositions** | Mon–Fri 05:00 UTC | Legislative proposals analysis | 14 language articles |
|
|
1050
|
-
| ⚖️ **Motions** | Mon–Fri 06:00 UTC | Motions & resolutions analysis | 14 language articles |
|
|
1051
|
-
| 📋 **Week Ahead** | Fridays 07:00 UTC | Upcoming parliamentary preview | 14 language articles |
|
|
1052
|
-
| 📊 **Weekly Review** | Saturdays 09:00 UTC | Past week retrospective | 14 language articles |
|
|
1053
|
-
| 🔭 **Month Ahead** | 1st of month 08:00 UTC | Strategic monthly outlook | 14 language articles |
|
|
1054
|
-
| 📈 **Monthly Review** | 28th of month 10:00 UTC | Monthly retrospective analysis | 14 language articles |
|
|
1055
|
-
| 🚀 **Article Generator** | Manual dispatch | Multi-type article generation | Configurable |
|
|
1056
|
-
|
|
1057
|
-
### 🧠 The Intelligence Stack
|
|
536
|
+
## 📚 Documentation Hub
|
|
1058
537
|
|
|
1059
|
-
|
|
538
|
+
| Topic | Document |
|
|
539
|
+
|---|---|
|
|
540
|
+
| 🌐 **Live site** | [euparliamentmonitor.com](https://euparliamentmonitor.com) · [Political Intelligence Hub](https://euparliamentmonitor.com/political-intelligence.html) · [Site Map](https://euparliamentmonitor.com/sitemap.html) |
|
|
541
|
+
| 🏛️ **Architecture** | [ARCHITECTURE.md](ARCHITECTURE.md) · [FUTURE_ARCHITECTURE.md](FUTURE_ARCHITECTURE.md) · [DATA_MODEL.md](DATA_MODEL.md) · [FLOWCHART.md](FLOWCHART.md) · [STATEDIAGRAM.md](STATEDIAGRAM.md) · [MINDMAP.md](MINDMAP.md) |
|
|
542
|
+
| 📰 **Article generation** | [Article-Generation.md](Article-Generation.md) — end-to-end pipeline reference |
|
|
543
|
+
| 🧠 **Analysis chain** | [analysis/README.md](analysis/README.md) · [analysis/methodologies/](analysis/methodologies/) · [analysis/templates/README.md](analysis/templates/README.md) |
|
|
544
|
+
| 🤖 **Agentic pipeline** | [.github/agents/README.md](.github/agents/README.md) · [.github/skills/README.md](.github/skills/README.md) · [.github/prompts/README.md](.github/prompts/README.md) · [.github/workflows/README.md](.github/workflows/README.md) · [WORKFLOWS.md](WORKFLOWS.md) |
|
|
545
|
+
| 🛡️ **Security & compliance** | [SECURITY.md](SECURITY.md) · [SECURITY_ARCHITECTURE.md](SECURITY_ARCHITECTURE.md) · [THREAT_MODEL.md](THREAT_MODEL.md) · [CLASSIFICATION.md](CLASSIFICATION.md) · [CRA-ASSESSMENT.md](CRA-ASSESSMENT.md) |
|
|
546
|
+
| 💼 **Business** | [SWOT.md](SWOT.md) · [BCPPlan.md](BCPPlan.md) · [FinancialSecurityPlan.md](FinancialSecurityPlan.md) · [End-of-Life-Strategy.md](End-of-Life-Strategy.md) |
|
|
547
|
+
| 🧪 **Testing** | [UnitTestPlan.md](UnitTestPlan.md) · [E2ETestPlan.md](E2ETestPlan.md) · [test/README.md](test/README.md) · [e2e/README.md](e2e/README.md) |
|
|
548
|
+
| 🚀 **Release process** | [docs/RELEASE_PROCESS.md](docs/RELEASE_PROCESS.md) · [SLSA Attestations](https://github.com/Hack23/euparliamentmonitor/attestations) |
|
|
549
|
+
| 📔 **Generated docs** | [API Reference](https://euparliamentmonitor.com/docs/api/index.html) · [Coverage](https://euparliamentmonitor.com/docs/coverage/index.html) · [E2E Report](https://euparliamentmonitor.com/playwright-report/index.html) |
|
|
1060
550
|
|
|
1061
|
-
|
|
1062
|
-
graph TB
|
|
1063
|
-
subgraph "🤖 8 Core News Pipeline Agents"
|
|
1064
|
-
A1["📰 News Journalist<br/><i>Economist-style reporting</i>"]
|
|
1065
|
-
A2["🔄 Data Pipeline<br/><i>MCP integration</i>"]
|
|
1066
|
-
A3["🎨 Frontend<br/><i>WCAG 2.1 AA</i>"]
|
|
1067
|
-
A4["✅ Quality Engineer<br/><i>Testing & validation</i>"]
|
|
1068
|
-
A5["🔒 Security Architect<br/><i>ISMS compliance</i>"]
|
|
1069
|
-
A6["📚 Documentation<br/><i>C4 & architecture</i>"]
|
|
1070
|
-
A7["⚙️ DevOps Engineer<br/><i>CI/CD automation</i>"]
|
|
1071
|
-
A8["📋 Product Task<br/><i>Issue management</i>"]
|
|
1072
|
-
end
|
|
1073
|
-
|
|
1074
|
-
subgraph "⚙️ 21 CI/CD Workflows"
|
|
1075
|
-
W1["8 News Generation"]
|
|
1076
|
-
W2["5 Security & Compliance"]
|
|
1077
|
-
W3["2 Testing"]
|
|
1078
|
-
W4["2 Release & Deploy"]
|
|
1079
|
-
W5["4 Automation & Infra"]
|
|
1080
|
-
end
|
|
1081
|
-
|
|
1082
|
-
subgraph "📊 Data Layer"
|
|
1083
|
-
MCP["🔌 EP MCP Server<br/>46 Tools"]
|
|
1084
|
-
TS["📦 39+ TypeScript Modules"]
|
|
1085
|
-
L14["🌍 14 Languages"]
|
|
1086
|
-
end
|
|
1087
|
-
|
|
1088
|
-
A1 --> W1
|
|
1089
|
-
A2 --> MCP
|
|
1090
|
-
A7 --> W2 & W3 & W4
|
|
1091
|
-
W1 --> TS --> L14
|
|
1092
|
-
|
|
1093
|
-
style A1 fill:#2e86c1,color:#fff
|
|
1094
|
-
style A2 fill:#2e86c1,color:#fff
|
|
1095
|
-
style A3 fill:#2e86c1,color:#fff
|
|
1096
|
-
style A4 fill:#2e86c1,color:#fff
|
|
1097
|
-
style A5 fill:#2e86c1,color:#fff
|
|
1098
|
-
style A6 fill:#2e86c1,color:#fff
|
|
1099
|
-
style A7 fill:#2e86c1,color:#fff
|
|
1100
|
-
style A8 fill:#2e86c1,color:#fff
|
|
1101
|
-
style W1 fill:#1a5276,color:#fff
|
|
1102
|
-
style W2 fill:#7d3c98,color:#fff
|
|
1103
|
-
style W3 fill:#117a65,color:#fff
|
|
1104
|
-
style W4 fill:#b9770e,color:#fff
|
|
1105
|
-
style MCP fill:#c0392b,color:#fff
|
|
1106
|
-
style TS fill:#1c2833,color:#fff
|
|
1107
|
-
style L14 fill:#117a65,color:#fff
|
|
1108
|
-
```
|
|
551
|
+
---
|
|
1109
552
|
|
|
1110
|
-
|
|
553
|
+
## 🚀 Future: AI Evolution Roadmap (2026–2037)
|
|
1111
554
|
|
|
1112
|
-
> *"We're not just keeping up with AI — we're building the editorial infrastructure
|
|
1113
|
-
> for the era when machines understand parliamentary procedure better than most MEPs."*
|
|
555
|
+
> *"We're not just keeping up with AI — we're building the editorial infrastructure for the era when machines understand parliamentary procedure better than most MEPs."*
|
|
1114
556
|
|
|
1115
|
-
|
|
557
|
+
Six-phase roadmap from current agentic news generation to AGI-enhanced transformative democracy, with human oversight maintained at every level.
|
|
1116
558
|
|
|
1117
559
|
```mermaid
|
|
1118
560
|
timeline
|
|
1119
561
|
title EU Parliament Monitor — AI Evolution Roadmap
|
|
1120
562
|
section Phase 1 (2026)
|
|
1121
|
-
Agentic News : 8
|
|
563
|
+
Agentic News : 8 unified workflows
|
|
1122
564
|
: 14-language generation
|
|
1123
|
-
:
|
|
1124
|
-
:
|
|
565
|
+
: Deterministic aggregator
|
|
566
|
+
: 51-artifact analysis catalog
|
|
1125
567
|
section Phase 2 (2027)
|
|
1126
568
|
Predictive Analytics : Voting outcome prediction
|
|
1127
569
|
: Legislative impact forecasting
|
|
1128
570
|
: Cross-party coalition detection
|
|
1129
|
-
: Automated trend analysis
|
|
1130
571
|
section Phase 3 (2028–2029)
|
|
1131
572
|
Multi-Modal Intelligence : Video plenary analysis
|
|
1132
573
|
: Real-time debate tracking
|
|
1133
574
|
: Infographic auto-generation
|
|
1134
|
-
: Autonomous content pipelines
|
|
1135
575
|
section Phase 4 (2030–2031)
|
|
1136
576
|
Near-Expert Analysis : 50+ parliament coverage
|
|
1137
577
|
: Expert-level policy briefs
|
|
1138
578
|
: Predictive governance models
|
|
1139
|
-
: Universal language support
|
|
1140
579
|
section Phase 5 (2032–2033)
|
|
1141
580
|
Global Coverage : 100+ parliaments
|
|
1142
581
|
: Pre-AGI capabilities
|
|
1143
|
-
: Real-time policy impact
|
|
1144
582
|
: Cross-jurisdiction analysis
|
|
1145
583
|
section Phase 6 (2034–2037)
|
|
1146
584
|
AGI Era : Transformative democracy
|
|
1147
585
|
: 195 national legislatures
|
|
1148
|
-
: Policy prediction before proposal
|
|
1149
586
|
: Human oversight maintained
|
|
1150
587
|
```
|
|
1151
588
|
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
When AGI or near-AGI systems become available, the platform architecture is designed to scale responsibly:
|
|
589
|
+
📘 **[FUTURE_MINDMAP.md](FUTURE_MINDMAP.md)** — capability evolution & system vision · 📗 **[FUTURE_WORKFLOWS.md](FUTURE_WORKFLOWS.md)** — CI/CD evolution & automation roadmap
|
|
1155
590
|
|
|
1156
|
-
|
|
1157
|
-
|-----------|-------------|
|
|
1158
|
-
| 🤖 **Autonomous Analysis** | AGI-powered real-time political intelligence across all 195 national legislatures |
|
|
1159
|
-
| 🌐 **Universal Language Support** | Every UN language supported natively — no translation pipeline, native generation |
|
|
1160
|
-
| 📊 **Predictive Governance** | Policy impact prediction *before* legislation is proposed — anticipatory intelligence |
|
|
1161
|
-
| ⚖️ **Ethical AI Governance** | Human oversight maintained regardless of AI capability level — democratic safeguards hardcoded |
|
|
1162
|
-
| 🛡️ **Democratic Safeguards** | Platform architecture prevents weaponization or manipulation — transparency by design |
|
|
591
|
+
---
|
|
1163
592
|
|
|
1164
|
-
|
|
593
|
+
## 🤝 Community & Contributing
|
|
1165
594
|
|
|
1166
|
-
|
|
595
|
+
EU Parliament Monitor welcomes contributions from **developers, journalists, translators, political scientists, OSINT analysts, accessibility experts, and security researchers**.
|
|
1167
596
|
|
|
1168
|
-
|
|
597
|
+
| Resource | Purpose |
|
|
598
|
+
|---|---|
|
|
599
|
+
| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Development workflow, code standards, contribution guidelines |
|
|
600
|
+
| **[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)** | Contributor Covenant 2.1 community standards |
|
|
601
|
+
| **[SECURITY.md](SECURITY.md)** | Vulnerability disclosure (48h ack · 7d validation · 30d remediation for criticals) |
|
|
602
|
+
| **[AUTHORS.md](AUTHORS.md)** | Recognition of project contributors |
|
|
603
|
+
| **[LICENSE](LICENSE)** | Apache License 2.0 |
|
|
1169
604
|
|
|
1170
|
-
|
|
1171
|
-
|------|-------------------------------|----------|----------------|
|
|
1172
|
-
| **2026** | 44–50 | Opus 4.7–4.9 | 🟢 Agentic news generation |
|
|
1173
|
-
| **2027** | 50–55 | Opus 5.x | 🔵 Predictive analytics |
|
|
1174
|
-
| **2028** | 55–65 | Opus 6.x | 🟣 Multi-modal content |
|
|
1175
|
-
| **2029** | 65–75 | Opus 7.x | 🟠 Autonomous pipeline |
|
|
1176
|
-
| **2030** | 75–85 | Opus 8.x | 🔴 Near-expert analysis |
|
|
1177
|
-
| **2031–2033** | 85–100 | Opus 9–10.x / Pre-AGI | ⚪ Global coverage |
|
|
1178
|
-
| **2034–2037** | 100–120+ | AGI / Post-AGI | ⭐ Transformative platform |
|
|
605
|
+
**Channels:** GitHub Issues (bug reports / features) · GitHub Discussions (Q&A) · [security@hack23.com](mailto:security@hack23.com) (vulnerabilities) · [conduct@hack23.com](mailto:conduct@hack23.com) (Code of Conduct)
|
|
1179
606
|
|
|
1180
|
-
|
|
1181
|
-
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1a5276', 'primaryTextColor': '#fff', 'lineColor': '#2e86c1', 'secondaryColor': '#117a65'}}}%%
|
|
1182
|
-
xychart-beta
|
|
1183
|
-
title "Projected Workflow Definitions & Variants (2026–2037)"
|
|
1184
|
-
x-axis ["2026", "2027", "2028", "2029", "2030", "2031", "2032", "2033", "2034", "2035", "2036", "2037"]
|
|
1185
|
-
y-axis "Workflow definitions & variants" 0 --> 130
|
|
1186
|
-
bar [44, 53, 60, 70, 80, 88, 94, 100, 105, 110, 115, 120]
|
|
1187
|
-
line [44, 53, 60, 70, 80, 88, 94, 100, 105, 110, 115, 120]
|
|
1188
|
-
```
|
|
1189
|
-
|
|
1190
|
-
### 📚 Detailed Roadmap Documentation
|
|
607
|
+
**Governance compliance:** ✅ OpenSSF Best Practices · ✅ Hack23 ISMS aligned · ✅ Public repository with transparent decision-making · ✅ REUSE-compliant license headers · ✅ Conventional commits
|
|
1191
608
|
|
|
1192
|
-
|
|
1193
|
-
|----------|-------|----------|
|
|
1194
|
-
| 📘 **[Future Mindmap](FUTURE_MINDMAP.md)** | Capability evolution & system vision | 2026–2037 AI/ML roadmap, multi-parliament expansion, API ecosystem |
|
|
1195
|
-
| 📗 **[Future Workflows](FUTURE_WORKFLOWS.md)** | CI/CD evolution & automation roadmap | Security hardening, performance optimization, AGI-ready pipelines |
|
|
609
|
+
---
|
|
1196
610
|
|
|
1197
|
-
## License
|
|
611
|
+
## 📝 License
|
|
1198
612
|
|
|
613
|
+
```
|
|
1199
614
|
Copyright 2024-2026 Hack23 AB
|
|
1200
615
|
|
|
1201
616
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -1203,20 +618,14 @@ you may not use this file except in compliance with the License.
|
|
|
1203
618
|
You may obtain a copy of the License at
|
|
1204
619
|
|
|
1205
620
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
621
|
+
```
|
|
1206
622
|
|
|
1207
|
-
|
|
1208
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
1209
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1210
|
-
See the License for the specific language governing permissions and
|
|
1211
|
-
limitations under the License.
|
|
1212
|
-
|
|
1213
|
-
See [LICENSE](LICENSE) file for full details.
|
|
623
|
+
See [LICENSE](LICENSE) for the full text.
|
|
1214
624
|
|
|
1215
|
-
|
|
625
|
+
---
|
|
1216
626
|
|
|
1217
|
-
|
|
1218
|
-
[Hack23/riksdagsmonitor](https://github.com/Hack23/riksdagsmonitor).
|
|
627
|
+
## 🙏 Credits
|
|
1219
628
|
|
|
1220
|
-
|
|
629
|
+
The news-generation foundation builds on the [Hack23/riksdagsmonitor](https://github.com/Hack23/riksdagsmonitor) Swedish Parliament monitor. Sister projects in the Hack23 transparency portfolio: [European-Parliament-MCP-Server](https://github.com/Hack23/European-Parliament-MCP-Server) (EP data MCP) · [cia](https://github.com/Hack23/cia) (Swedish Parliament intelligence, Java/Spring) · [ISMS-PUBLIC](https://github.com/Hack23/ISMS-PUBLIC) (security policies).
|
|
1221
630
|
|
|
1222
|
-
Hack23 AB
|
|
631
|
+
**Maintained by:** Hack23 AB — Intelligence Operations Team
|