@ansvar/ch-farm-safety-mcp 0.1.0

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.
Files changed (109) hide show
  1. package/.github/workflows/check-freshness.yml +53 -0
  2. package/.github/workflows/ci.yml +21 -0
  3. package/.github/workflows/codeql.yml +30 -0
  4. package/.github/workflows/ghcr-build.yml +45 -0
  5. package/.github/workflows/gitleaks.yml +24 -0
  6. package/.github/workflows/ingest.yml +67 -0
  7. package/.github/workflows/publish.yml +24 -0
  8. package/CHANGELOG.md +23 -0
  9. package/CODEOWNERS +1 -0
  10. package/COVERAGE.md +54 -0
  11. package/DISCLAIMER.md +51 -0
  12. package/Dockerfile +26 -0
  13. package/LICENSE +17 -0
  14. package/PRIVACY.md +25 -0
  15. package/README.md +129 -0
  16. package/SECURITY.md +25 -0
  17. package/TOOLS.md +140 -0
  18. package/data/coverage.json +22 -0
  19. package/data/database.db +0 -0
  20. package/data/sources.yml +36 -0
  21. package/dist/db.d.ts +25 -0
  22. package/dist/db.d.ts.map +1 -0
  23. package/dist/db.js +200 -0
  24. package/dist/db.js.map +1 -0
  25. package/dist/http-server.d.ts +2 -0
  26. package/dist/http-server.d.ts.map +1 -0
  27. package/dist/http-server.js +250 -0
  28. package/dist/http-server.js.map +1 -0
  29. package/dist/jurisdiction.d.ts +18 -0
  30. package/dist/jurisdiction.d.ts.map +1 -0
  31. package/dist/jurisdiction.js +16 -0
  32. package/dist/jurisdiction.js.map +1 -0
  33. package/dist/metadata.d.ts +10 -0
  34. package/dist/metadata.d.ts.map +1 -0
  35. package/dist/metadata.js +20 -0
  36. package/dist/metadata.js.map +1 -0
  37. package/dist/server.d.ts +3 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +196 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/tools/about.d.ts +15 -0
  42. package/dist/tools/about.d.ts.map +1 -0
  43. package/dist/tools/about.js +27 -0
  44. package/dist/tools/about.js.map +1 -0
  45. package/dist/tools/check-freshness.d.ts +15 -0
  46. package/dist/tools/check-freshness.d.ts.map +1 -0
  47. package/dist/tools/check-freshness.js +26 -0
  48. package/dist/tools/check-freshness.js.map +1 -0
  49. package/dist/tools/get-accident-reporting.d.ts +49 -0
  50. package/dist/tools/get-accident-reporting.d.ts.map +1 -0
  51. package/dist/tools/get-accident-reporting.js +31 -0
  52. package/dist/tools/get-accident-reporting.js.map +1 -0
  53. package/dist/tools/get-chemical-safety.d.ts +47 -0
  54. package/dist/tools/get-chemical-safety.d.ts.map +1 -0
  55. package/dist/tools/get-chemical-safety.js +31 -0
  56. package/dist/tools/get-chemical-safety.js.map +1 -0
  57. package/dist/tools/get-machinery-safety.d.ts +46 -0
  58. package/dist/tools/get-machinery-safety.d.ts.map +1 -0
  59. package/dist/tools/get-machinery-safety.js +31 -0
  60. package/dist/tools/get-machinery-safety.js.map +1 -0
  61. package/dist/tools/get-risk-assessment-requirements.d.ts +47 -0
  62. package/dist/tools/get-risk-assessment-requirements.d.ts.map +1 -0
  63. package/dist/tools/get-risk-assessment-requirements.js +31 -0
  64. package/dist/tools/get-risk-assessment-requirements.js.map +1 -0
  65. package/dist/tools/get-young-worker-rules.d.ts +47 -0
  66. package/dist/tools/get-young-worker-rules.d.ts.map +1 -0
  67. package/dist/tools/get-young-worker-rules.js +31 -0
  68. package/dist/tools/get-young-worker-rules.js.map +1 -0
  69. package/dist/tools/list-sources.d.ts +18 -0
  70. package/dist/tools/list-sources.d.ts.map +1 -0
  71. package/dist/tools/list-sources.js +51 -0
  72. package/dist/tools/list-sources.js.map +1 -0
  73. package/dist/tools/search-bul-guidance.d.ts +23 -0
  74. package/dist/tools/search-bul-guidance.d.ts.map +1 -0
  75. package/dist/tools/search-bul-guidance.js +35 -0
  76. package/dist/tools/search-bul-guidance.js.map +1 -0
  77. package/dist/tools/search-safety-rules.d.ts +25 -0
  78. package/dist/tools/search-safety-rules.d.ts.map +1 -0
  79. package/dist/tools/search-safety-rules.js +26 -0
  80. package/dist/tools/search-safety-rules.js.map +1 -0
  81. package/docker-compose.yml +12 -0
  82. package/eslint.config.js +27 -0
  83. package/package.json +54 -0
  84. package/scripts/ingest.ts +879 -0
  85. package/server.json +31 -0
  86. package/src/db.ts +241 -0
  87. package/src/http-server.ts +282 -0
  88. package/src/jurisdiction.ts +30 -0
  89. package/src/metadata.ts +30 -0
  90. package/src/server.ts +219 -0
  91. package/src/tools/about.ts +28 -0
  92. package/src/tools/check-freshness.ts +42 -0
  93. package/src/tools/get-accident-reporting.ts +52 -0
  94. package/src/tools/get-chemical-safety.ts +52 -0
  95. package/src/tools/get-machinery-safety.ts +52 -0
  96. package/src/tools/get-risk-assessment-requirements.ts +52 -0
  97. package/src/tools/get-young-worker-rules.ts +52 -0
  98. package/src/tools/list-sources.ts +65 -0
  99. package/src/tools/search-bul-guidance.ts +51 -0
  100. package/src/tools/search-safety-rules.ts +35 -0
  101. package/tests/db.test.ts +121 -0
  102. package/tests/helpers/seed-db.ts +134 -0
  103. package/tests/jurisdiction.test.ts +54 -0
  104. package/tests/tools/about.test.ts +44 -0
  105. package/tests/tools/check-freshness.test.ts +68 -0
  106. package/tests/tools/list-sources.test.ts +75 -0
  107. package/tests/tools/search-safety-rules.test.ts +75 -0
  108. package/tsconfig.json +19 -0
  109. package/vitest.config.ts +9 -0
@@ -0,0 +1,879 @@
1
+ /**
2
+ * Switzerland Farm Safety MCP — Data Ingestion Script
3
+ *
4
+ * Populates the database with Swiss farm workplace safety data from:
5
+ * - BUL/SPAA — Lebenswichtige Regeln, Merkblaetter, Safe@Work
6
+ * - Suva — Arbeitssicherheit Landwirtschaft, MAK-Werte, Unfallmeldung
7
+ * - EKAS — Branchenloesung Landwirtschaft, ASA-Konzept
8
+ * - Agriss — Unfallstatistik Schweizer Landwirtschaft
9
+ * - SECO — Jugendarbeitsschutz, ArG/ArGV 5
10
+ *
11
+ * Usage: npm run ingest
12
+ */
13
+
14
+ import { createDatabase } from '../src/db.js';
15
+ import { mkdirSync, writeFileSync } from 'fs';
16
+
17
+ mkdirSync('data', { recursive: true });
18
+ const db = createDatabase('data/database.db');
19
+
20
+ const now = new Date().toISOString().split('T')[0];
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // 1. Safety Rules — BUL lebenswichtige Regeln per Arbeitsbereich
24
+ // Source: BUL/SPAA, Suva, EKAS Branchenloesung Landwirtschaft
25
+ // ---------------------------------------------------------------------------
26
+
27
+ interface SafetyRule {
28
+ topic: string;
29
+ rule: string;
30
+ area: string;
31
+ description: string;
32
+ source: string;
33
+ }
34
+
35
+ const safetyRules: SafetyRule[] = [
36
+ // --- Maschinen ---
37
+ {
38
+ topic: 'Traktor — Ueberrollschutz',
39
+ rule: 'Traktor nur mit Ueberrollschutzvorrichtung (ROPS) betreiben',
40
+ area: 'maschinen',
41
+ description: 'Alle Traktoren muessen mit einem typengeprueften Ueberrollschutz (ROPS — Roll Over Protective Structure) ausgeruestet sein. Bei Traktoren ohne Kabine muss der Ueberrollbuegel aufgestellt sein. Aeltere Traktoren ohne ROPS muessen nachgeruestet werden.',
42
+ source: 'BUL Lebenswichtige Regel Maschinen Nr. 1; VTS Art. 114',
43
+ },
44
+ {
45
+ topic: 'Traktor — Gurtpflicht',
46
+ rule: 'Sicherheitsgurt tragen bei Traktoren mit ROPS',
47
+ area: 'maschinen',
48
+ description: 'Bei Traktoren mit Ueberrollschutz ist der Sicherheitsgurt obligatorisch. Ohne Gurt wird der Fahrer bei einem Umsturz aus dem Schutzbereich geschleudert. Der Gurt haelt den Fahrer im geschuetzten Bereich. Ausnahme: Kabinentraktoren mit geschlossener Kabine.',
49
+ source: 'BUL Lebenswichtige Regel Maschinen Nr. 2; SVG Art. 57a',
50
+ },
51
+ {
52
+ topic: 'Traktor — MFK und Zulassung',
53
+ rule: 'Traktor regelmaessig zur Motorfahrzeugkontrolle (MFK) vorfuehren',
54
+ area: 'maschinen',
55
+ description: 'Landwirtschaftliche Motorfahrzeuge unterliegen der periodischen Fahrzeugpruefung (MFK). Erstpruefung nach 4 Jahren, danach alle 3 Jahre. Bremsen, Lenkung, Beleuchtung, ROPS und Gurt werden geprueft. Fahrzeuge ohne gueltige MFK duerfen nicht auf oeffentlichen Strassen verkehren.',
56
+ source: 'VTS Art. 33; VRV Art. 73',
57
+ },
58
+ {
59
+ topic: 'Traktor — Geschwindigkeit',
60
+ rule: 'Hoechstgeschwindigkeit einhalten: 30 km/h (Standard) oder 40 km/h (mit Bewilligung)',
61
+ area: 'maschinen',
62
+ description: 'Landwirtschaftliche Fahrzeuge: max. 30 km/h bauartbedingt. Mit kantonaler Bewilligung und Zusatzausruestung (Bremsen, Beleuchtung) sind 40 km/h moeglich. Anhaenger-Bremsen muessen der Geschwindigkeit entsprechen. Hangfahrten mit angepasster Geschwindigkeit.',
63
+ source: 'VTS Art. 150; BUL Merkblatt Traktorfahren',
64
+ },
65
+ {
66
+ topic: 'Zapfwelle (PTO)',
67
+ rule: 'Zapfwelle und Gelenkwelle immer mit Schutzvorrichtung betreiben',
68
+ area: 'maschinen',
69
+ description: 'Rotierende Zapfwellen und Gelenkwellen muessen mit typengeprueften Schutzvorrichtungen abgedeckt sein. Vor jedem Einsatz Schutzeinrichtungen pruefen. Defekte Schutzrohre und Schutzglocken sofort ersetzen. Nie in die Naehe rotierender Teile greifen. Locker sitzende Kleidung ist verboten.',
70
+ source: 'BUL Lebenswichtige Regel Maschinen Nr. 3; VUV Art. 28',
71
+ },
72
+ {
73
+ topic: 'Kreiselmaeher / Kreiselschwader',
74
+ rule: 'Sicherheitsabstand einhalten und Schutzeinrichtungen nicht entfernen',
75
+ area: 'maschinen',
76
+ description: 'Kreiselmaehwerke schleudern Steine und Fremdkoerper mit hoher Geschwindigkeit. Sicherheitsabstand mindestens 20 Meter zu Personen. Steinschlagschutz (Schuerze, Ketten) muss montiert sein. Keine Wartung bei laufender Maschine. Vor dem Abkoppeln Maschine abstellen und Zapfwelle ausschalten.',
77
+ source: 'BUL Merkblatt Futtererntetechnik; Maschinenrichtlinie 2006/42/EG',
78
+ },
79
+ {
80
+ topic: 'Ladewagen / Haecksler',
81
+ rule: 'Einzugsbereiche absichern und nie bei laufender Maschine eingreifen',
82
+ area: 'maschinen',
83
+ description: 'Ladewagen und Feldhacksler haben lebensgefaehrliche Einzugsbereiche. Verstopfungen nur bei abgestelltem Motor und gesicherter Maschine beseitigen. Pick-up-Zinken koennen Gliedmassen erfassen. Rueckwaertsfahren nur mit Einweiser.',
84
+ source: 'BUL Lebenswichtige Regel Maschinen Nr. 5',
85
+ },
86
+ {
87
+ topic: 'Motorsaege',
88
+ rule: 'Motorsaege nur mit vollstaendiger Schutzausruestung und Ausbildung verwenden',
89
+ area: 'maschinen',
90
+ description: 'Schnittschutzhose, Sicherheitsschuhe (Schnittschutzeinlage), Helm mit Gehoer- und Gesichtsschutz, Handschuhe sind obligatorisch. Motorsaege-Kurs (Grundkurs mind. 5 Tage) erforderlich. Keine Arbeiten ueber Schulterhoehe. Kettenbremse muss funktionieren.',
91
+ source: 'BUL Lebenswichtige Regel Wald Nr. 1; EKAS Richtlinie 2134',
92
+ },
93
+
94
+ // --- Tiere ---
95
+ {
96
+ topic: 'Mutterkuehe',
97
+ rule: 'Mutterkuh-Herden nie ohne Fluchtmoeglichkeit betreten',
98
+ area: 'tiere',
99
+ description: 'Mutterkuehe mit Kaelbern zeigen ausgepraegtes Schutzverhalten und greifen Personen an. Weide nur mit Fluchtmoeglichkeit betreten. Hunde nicht in die Herde nehmen (Hunde loesen Herdenschutzinstinkt aus). Kalbende Kuehe separieren. Mutterkuh-Rassen (Aubrac, Limousin, Angus) besonders aufmerksam. Jaehrlich mehrere schwere Unfaelle in der Schweiz.',
100
+ source: 'BUL Lebenswichtige Regel Tiere Nr. 1; Agriss Unfallstatistik',
101
+ },
102
+ {
103
+ topic: 'Stiere',
104
+ rule: 'Stiere nie ohne Sicherheitsmassnahmen fuehren oder treiben',
105
+ area: 'tiere',
106
+ description: 'Stiere ab 18 Monaten immer mit Nasenring fuehren. Einzelhaltung in sicherem Stall mit Fluchtmoeglichkeit fuer Betreuer. Stallwände mindestens 1.5 m hoch. Stiere nie den Ruecken zukehren. Bei Deckstieren erhoehte Vorsicht. Stierenfuehrung nur durch erfahrene Personen.',
107
+ source: 'BUL Lebenswichtige Regel Tiere Nr. 2; TSchV Art. 38',
108
+ },
109
+ {
110
+ topic: 'Pferde',
111
+ rule: 'Pferde korrekt anbinden und Fluchtverhalten beruecksichtigen',
112
+ area: 'tiere',
113
+ description: 'Pferde sind Fluchttiere und treten nach hinten aus. Immer seitlich an Pferde herantreten, nie direkt von hinten. Anbinden nur mit Panikhaken (loest bei starkem Zug). Hufpflege und Beschlagen nur durch ausgebildete Personen. Beim Reiten: Helm, geschlossene Schuhe.',
114
+ source: 'BUL Merkblatt Pferdehaltung; TSchV Art. 59',
115
+ },
116
+ {
117
+ topic: 'Schweine',
118
+ rule: 'Vorsicht beim Umgang mit Muttersauen und Ebern',
119
+ area: 'tiere',
120
+ description: 'Muttersauen verteidigen Ferkel aggressiv. Eber koennen unkontrolliert angreifen. Behandlungen in der Abferkelbucht nur mit Schutzwand (Treibbrett). Verladen ueber sichere Rampen mit seitlicher Begrenzung. Schweine nie am Schwanz oder an den Ohren hochheben.',
121
+ source: 'BUL Merkblatt Schweinehaltung; TSchV Art. 46',
122
+ },
123
+ {
124
+ topic: 'Tiertransport',
125
+ rule: 'Tiere nur mit geeigneten Fahrzeugen und gesicherter Verladung transportieren',
126
+ area: 'tiere',
127
+ description: 'Verladung nur ueber sichere Rampen (rutschfest, seitliche Begrenzung). Trennwaende im Fahrzeug verwenden. Hoechstbeladung einhalten. Transportdauer: max. 8 Stunden (6 Stunden Schlachttiere). Transportbewilligung und Sachkundenachweis erforderlich.',
128
+ source: 'BUL Merkblatt Tiertransport; TSchV Art. 152-166',
129
+ },
130
+
131
+ // --- Wald / Holzerei ---
132
+ {
133
+ topic: 'Holzerei — Sturzbereich',
134
+ rule: 'Sturzbereich (doppelte Baumlaenge) absichern und freihalten',
135
+ area: 'wald',
136
+ description: 'Vor dem Faellen den Sturzbereich (mindestens doppelte Baumlaenge, ca. 50 m Radius) von Personen freiraeumen. Rueckzugsweg in 45-Grad-Winkel zur Fallrichtung festlegen und freiraeumen. Warnsignale (Ruf: "Achtung Baum faellt!") geben. Nie allein im Wald holzen.',
137
+ source: 'BUL Lebenswichtige Regel Wald Nr. 2; EKAS Richtlinie 2134',
138
+ },
139
+ {
140
+ topic: 'Holzerei — Aufarbeitung',
141
+ rule: 'Unter Spannung stehende Staemme nur mit korrekter Schnitttechnik aufarbeiten',
142
+ area: 'wald',
143
+ description: 'Staemme unter Spannung (Haengenbleiber, Windwurf) sind extrem gefaehrlich. Spannungsanalyse vor jedem Schnitt. Druckseite zuerst einschneiden, dann Zugseite. Seilwinde verwenden bei Haengenbleibern. Nie unter einem haengenden Stamm durchgehen.',
144
+ source: 'BUL Lebenswichtige Regel Wald Nr. 3; Suva Merkblatt 88175',
145
+ },
146
+
147
+ // --- Hoehe / Absturz ---
148
+ {
149
+ topic: 'Absturz — Daecher und Heubuehnen',
150
+ rule: 'Ab 2 Metern Absturzhoehe Sicherung verwenden',
151
+ area: 'hoehe',
152
+ description: 'Arbeiten auf Daechern, Heubuehnen, Futtersilos und Leitern: Ab 2 m Absturzhoehe sind Schutzmassnahmen Pflicht (Gelaender, Auffangnetz, Anseilschutz). Leitern nur als Zugang, nicht als Arbeitsplatz. Fragile Dacheindeckungen (Faserzement, Lichtplatten) nie ohne Laufsteg betreten.',
153
+ source: 'BUL Lebenswichtige Regel Hoehe Nr. 1; BauAV Art. 15',
154
+ },
155
+ {
156
+ topic: 'Leitern',
157
+ rule: 'Leitern standsicher aufstellen und korrekt verwenden',
158
+ area: 'hoehe',
159
+ description: 'Anstellwinkel 65-75 Grad. Leiter muss mindestens 1 m ueber die Ausstiegsstelle hinausragen. Immer mit drei Punkten halten (zwei Haende + ein Fuss oder zwei Fuesse + eine Hand). Keine schweren Lasten auf Leitern tragen. Defekte Leitern entsorgen.',
160
+ source: 'BUL Merkblatt Leitern; Suva Checkliste 67028',
161
+ },
162
+ {
163
+ topic: 'Heubuehnensturz',
164
+ rule: 'Oeffnungen in Heubuehnen und Futtertenn sichern',
165
+ area: 'hoehe',
166
+ description: 'Heubuehnen-Durchsturz ist eine haeufige Unfallursache. Alle Oeffnungen (Fuetterloecher, Schachtabdeckungen) mit tragfaehigen Abdeckungen oder Gelaendern sichern. Beleuchtung in Tenne und auf Heubuehne installieren. Kinder vom Futtertenn fernhalten.',
167
+ source: 'BUL Lebenswichtige Regel Hoehe Nr. 2; Agriss Unfallstatistik',
168
+ },
169
+
170
+ // --- Chemie / PSM ---
171
+ {
172
+ topic: 'Pflanzenschutzmittel — Anwenderschutz',
173
+ rule: 'PSM nur mit vorgeschriebener Schutzausruestung anwenden',
174
+ area: 'chemie',
175
+ description: 'Sicherheitsdatenblatt (SDB) vor jeder Anwendung lesen. Persoenliche Schutzausruestung (PSA) gemaess Produktetikett: Schutzhandschuhe (Nitrilkautschuk), Schutzbrille, Atemschutz (mind. Halbmaske P2/A1), Overall. Fachbewilligung PSM erforderlich (Kurs + Pruefung). Keine Anwendung bei Wind > 3 m/s.',
176
+ source: 'BUL Lebenswichtige Regel Chemie Nr. 1; PSMV Art. 5; ChemRRV Anhang 2.5',
177
+ },
178
+ {
179
+ topic: 'PSM — Lagerung',
180
+ rule: 'Pflanzenschutzmittel in abschliessbarem, belueftetem Lager aufbewahren',
181
+ area: 'chemie',
182
+ description: 'Pflanzenschutzmittel-Lager: abschliessbar, frostfrei, belueftet, nicht im Wohnbereich, Auffangwanne (mind. 10% des Lagervolumens), Boden undurchlaessig, Beschriftung, kein Lebensmittelkontakt. Originalbehaelaer verwenden. Aufbrauchfristen beachten. Entsorgung ueber Sonderabfall (nicht in Kanalisation).',
183
+ source: 'BUL Merkblatt PSM-Lager; ChemRRV Anhang 2.5; GSchV Art. 22',
184
+ },
185
+ {
186
+ topic: 'PSM — Spritzenfuellplatz',
187
+ rule: 'Spritze nur auf befestigtem Platz mit Ruecklaufsicherung befuellen',
188
+ area: 'chemie',
189
+ description: 'Befuellplatz: befestigt, undurchlaessig, mit Ablauf in Auffanggrube oder Biobed. Ruecklaufventil am Wasserschlauch (Schutz vor Ruecksaugen ins Trinkwasser). Spritzenreinigung: dreimal mit 10% Restmenge spuelen, Reinigungswasser auf der Flaeche ausbringen. Phytobac / Biobed fuer Restmengen.',
190
+ source: 'BUL Merkblatt Spritzenfuellplatz; GSchV Art. 22',
191
+ },
192
+
193
+ // --- Silogas ---
194
+ {
195
+ topic: 'Silogas — Lebensgefahr',
196
+ rule: 'Fahrsilos und Hochsilos: 3-Wochen-Sperrfrist nach Befuellung einhalten',
197
+ area: 'silogas',
198
+ description: 'Beim Silieren von Mais und Gras entsteht Silogas (Stickstoffdioxid NO2 und Kohlendioxid CO2). NO2 ist schwerer als Luft und sammelt sich in Silos und angrenzenden Raeumen. Bereits geringe Konzentrationen fuehren zu Lungenoedem und Tod. 3 Wochen nach Befuellung: kein Betreten ohne Gaswarngeraet und Belueftung. Tueren und Luken offen halten.',
199
+ source: 'BUL Lebenswichtige Regel Silogas; Suva Merkblatt 11030',
200
+ },
201
+ {
202
+ topic: 'Silogas — Belueftung und Gaswarngeraet',
203
+ rule: 'Vor Betreten von Siloraum: belueften und mit Gaswarngeraet messen',
204
+ area: 'silogas',
205
+ description: 'Vor Betreten des Siloraums: mindestens 30 Minuten mechanisch belueften (Ventilator). Gaswarngeraet (NO2-Sensor) verwenden. Nie allein in Siloraeume einsteigen. Rettungskonzept: Person ausserhalb ueberwacht den Einstieg, Rettungsseil bereithalten. Bei Verdacht auf Silogas: sofort Raum verlassen, 144 anrufen.',
206
+ source: 'BUL Merkblatt Silogas; Suva Merkblatt 11030',
207
+ },
208
+ {
209
+ topic: 'Guelle — Erstickungsgefahr',
210
+ rule: 'Guellegrube nie ohne Belueftung und Sicherung betreten',
211
+ area: 'silogas',
212
+ description: 'Guellegruben enthalten Schwefelwasserstoff (H2S), Methan (CH4) und CO2 in lebensbedrohlichen Konzentrationen. Beim Ruehren der Guelle werden Gase freigesetzt. Grube nie betreten. Falls Einstieg unvermeidlich: Belueftung mind. 30 min, umluftunabhaengiges Atemschutzgeraet, Sicherungsseil, Rettungsposten. Abdeckungen und Gelaender an allen Oeffnungen.',
213
+ source: 'BUL Merkblatt Guellelager; Suva Merkblatt 66113',
214
+ },
215
+
216
+ // --- Allgemein ---
217
+ {
218
+ topic: 'Erste Hilfe — Notrufnummern Schweiz',
219
+ rule: 'Notrufnummern kennen und Notfallplan am Betrieb aushangen',
220
+ area: 'allgemein',
221
+ description: 'Notrufnummern: 144 (Sanitaetsnotruf / Ambulanz), 1414 (Rega — Rettungshelikopter), 117 (Polizei), 118 (Feuerwehr), 145 (Vergiftungen — Tox Info Suisse). Notfallplan gut sichtbar im Stall und in der Werkstatt aufhaengen. Jeder Betrieb sollte eine Hofapotheke (BUL-Empfehlung) mit Verbandsmaterial, Desinfektionsmittel, Augenspuelflasche bereithalten.',
222
+ source: 'BUL Merkblatt Erste Hilfe; VUV Art. 36',
223
+ },
224
+ {
225
+ topic: 'Hofapotheke',
226
+ rule: 'Hofapotheke vollstaendig und aktuell halten',
227
+ area: 'allgemein',
228
+ description: 'BUL-Empfehlung Hofapotheke: Verbandsmaterial (sterile Kompressen, Verbandpaeckchen, Dreieckstuch, Pflaster), Einmalhandschuhe, Schere, Pinzette, Desinfektionsmittel, Kuehlelemente, Rettungsdecke, Augenspuelflasche. Standorte: Stall, Werkstatt, Traktor. Inhalt jaehrlich pruefen, abgelaufenes Material ersetzen.',
229
+ source: 'BUL Merkblatt Erste Hilfe auf dem Bauernhof',
230
+ },
231
+ {
232
+ topic: 'Alleinarbeit',
233
+ rule: 'Alleinarbeit bei gefaehrlichen Taetigkeiten vermeiden oder absichern',
234
+ area: 'allgemein',
235
+ description: 'Bei gefaehrlichen Arbeiten (Holzerei, Siloarbeiten, Arbeiten in der Hoehe, Arbeiten mit Stieren) darf nicht allein gearbeitet werden. Falls Alleinarbeit unvermeidlich: Risikobeurteilung durchfuehren, Kommunikationsmittel (Mobiltelefon), regelmaessige Kontrollkontakte, Totmannschaltung (automatischer Alarm bei Bewegungslosigkeit), GPS-Tracker.',
236
+ source: 'BUL Merkblatt Alleinarbeit; VUV Art. 8',
237
+ },
238
+ {
239
+ topic: 'Agriss-Statistik — Ueberblick',
240
+ rule: 'Unfallstatistik: ~40 toedliche Unfaelle pro Jahr in der Schweizer Landwirtschaft',
241
+ area: 'allgemein',
242
+ description: 'Laut Agriss-Statistik sterben jaehrlich rund 40 Personen bei landwirtschaftlichen Unfaellen in der Schweiz. Hauptursachen: Traktorunfaelle ca. 30% (Umsturz, Ueberfahren, Absturz von Boeschung), Sturz/Absturz ca. 20%, Tierkontakt ca. 15% (v.a. Mutterkuehe, Pferde), Waldarbeit ca. 10%, Maschinenunfaelle ca. 10%, Uebrige ca. 15%. Saisonaler Schwerpunkt: Juni-Oktober (Ernte). Die Landwirtschaft hat die hoechste Berufstodesrate aller Branchen in der Schweiz.',
243
+ source: 'Agriss Jahresstatistik; BUL Jahresbericht',
244
+ },
245
+ {
246
+ topic: 'EKAS Branchenloesung Landwirtschaft',
247
+ rule: 'Jeder Betrieb mit Angestellten muss ein ASA-Konzept (Branchenloesung) umsetzen',
248
+ area: 'allgemein',
249
+ description: 'Betriebe mit Angestellten muessen gemaess EKAS-Richtlinie 6508 ein ASA-Konzept (Arbeitsaerzte und andere Spezialisten der Arbeitssicherheit) umsetzen. Die Branchenloesung Landwirtschaft (AgriTOP) erfuellt diese Anforderung. Inhalt: Sicherheitsleitbild, Gefahrenermittlung, Massnahmenplanung, Instruktion, Kontrolle, Unfallabklaerung. Betriebsleiter ist verantwortlich.',
250
+ source: 'EKAS Richtlinie 6508; VUV Art. 11a-e',
251
+ },
252
+ {
253
+ topic: 'Sonnenschutz und Hitze',
254
+ rule: 'Bei Hitze Schutzmassnahmen ergreifen und genuegend trinken',
255
+ area: 'allgemein',
256
+ description: 'Landwirtschaftliche Arbeit bei Hitze (Ernte, Heuen): Sonnenschutz tragen (Hut, langaermelige Kleidung), genuegend Wasser trinken (mind. 2-3 Liter bei schwerer Arbeit), regelmaessige Pausen im Schatten, schwere Arbeiten auf fruehe Morgen- oder spaete Abendstunden verlegen. Hitzschlag-Symptome kennen (Kopfschmerzen, Schwindel, Uebelkeit, heisse trockene Haut).',
257
+ source: 'Suva Merkblatt Hitzearbeit; BUL Empfehlungen',
258
+ },
259
+ ];
260
+
261
+ const insertSafetyRule = db.instance.prepare(
262
+ 'INSERT INTO safety_rules (topic, rule, area, description, source, jurisdiction) VALUES (?, ?, ?, ?, ?, ?)'
263
+ );
264
+
265
+ for (const r of safetyRules) {
266
+ insertSafetyRule.run(r.topic, r.rule, r.area, r.description, r.source, 'CH');
267
+ }
268
+ console.log(`Inserted ${safetyRules.length} safety rules`);
269
+
270
+ // ---------------------------------------------------------------------------
271
+ // 2. Risk Assessments — EKAS / VUV Risikobeurteilung
272
+ // ---------------------------------------------------------------------------
273
+
274
+ interface RiskAssessment {
275
+ activity_type: string;
276
+ requirement: string;
277
+ content: string;
278
+ update_trigger: string;
279
+ legal_basis: string;
280
+ }
281
+
282
+ const riskAssessments: RiskAssessment[] = [
283
+ {
284
+ activity_type: 'Alleinarbeit',
285
+ requirement: 'Risikobeurteilung Alleinarbeit gemaess VUV Art. 8',
286
+ content: 'Ermittlung: Welche Taetigkeiten werden allein ausgefuehrt? Bewertung: Welche Verletzungen koennen auftreten und wuerde die Person nach einem Unfall Hilfe erhalten? Massnahmen: Kommunikationsmittel (Mobiltelefon, Funk), automatischer Alarm (Totmannschaltung), Kontrollkontakte mit definierten Zeitabstaenden, Verbot von Alleinarbeit bei hohem Risiko (Holzerei, Hochsilo, Guelle).',
287
+ update_trigger: 'Bei neuen Taetigkeiten, nach Unfaellen, bei Aenderung der Arbeitsorganisation',
288
+ legal_basis: 'VUV Art. 8; EKAS Richtlinie 6508; ArGV 3 Art. 26',
289
+ },
290
+ {
291
+ activity_type: 'Siloarbeiten',
292
+ requirement: 'Risikobeurteilung Silo (Gase, Absturz, Einschluss)',
293
+ content: 'Gefahrenermittlung: Silogas (NO2, CO2, H2S), Absturz in Hochsilo, Einschluss durch Silomaterial. Bewertung: Lebensgefahr bei Gasvergiftung, schwere Verletzungen bei Absturz. Massnahmen: 3-Wochen-Sperrfrist, Belueftung, Gaswarngeraet, Einstiegserlaubnis (Permit), Rettungskonzept mit Sicherungsposten, Absturzsicherung bei Hochsilos.',
294
+ update_trigger: 'Jaehrlich, bei neuen Silobauten, nach Beinahe-Unfaellen',
295
+ legal_basis: 'VUV Art. 3-5; EKAS Richtlinie 6508; BUL Merkblatt Silogas',
296
+ },
297
+ {
298
+ activity_type: 'Holzerei / Waldarbeit',
299
+ requirement: 'Risikobeurteilung Holzerei gemaess EKAS 2134',
300
+ content: 'Gefahren: Baumsturz, Rueckschlag Motorsaege, Schnittverletzungen, Absturz am Hang, herabfallende Aeste. Massnahmen: Ausbildung (Motorsaegekurs mind. 5 Tage), vollstaendige PSA (Schnittschutzhose, Helm, Gehoerschutz, Sicherheitsschuhe), Sturzbereich absichern, Alleinarbeit verboten, Rettungskette organisieren.',
301
+ update_trigger: 'Vor jedem Holzschlag, nach Unfaellen, bei neuen Mitarbeitern',
302
+ legal_basis: 'VUV Art. 3-5; EKAS Richtlinie 2134; WaG Art. 21',
303
+ },
304
+ {
305
+ activity_type: 'Tierhaltung',
306
+ requirement: 'Risikobeurteilung Tierhaltung (Grossvieh)',
307
+ content: 'Gefahren: Tritte, Schlaege, Quetschen an Stallwand, Ueberrannt werden (Mutterkuehe). Bewertung: Schwere bis toedliche Verletzungen moeglich, v.a. bei Mutterkuehen und Stieren. Massnahmen: Fluchtmoeglichkeiten in jedem Abteil, Fixiereinrichtungen (Fressgitter, Behandlungsstand), Stierenhaltung mit Nasenring, Schutzwand bei Muttertierhaltung, korrekte Tierbeobachtung, Kinder fernhalten.',
308
+ update_trigger: 'Bei Herdenaenderungen, nach Tierkontakt-Unfaellen, bei Stallumbauten',
309
+ legal_basis: 'VUV Art. 3-5; TSchV; BUL Merkblaetter Tiere',
310
+ },
311
+ {
312
+ activity_type: 'Arbeiten in der Hoehe',
313
+ requirement: 'Risikobeurteilung Absturz (Daecher, Heubuehnen, Silos)',
314
+ content: 'Gefahren: Absturz von Dach, Heubuehne, Silo, Leiter, Boeschung. Ab 2 m Absturzhoehe sind Schutzmassnahmen Pflicht. Massnahmen: kollektiver Schutz zuerst (Gelaender, Auffangnetze), individuell (Anseilschutz mit Auffanggurt, nur auf gewarteten Anschlagpunkten), Leiterkontrolle, Oeffnungen sichern, Beleuchtung verbessern.',
315
+ update_trigger: 'Vor Dacharbeiten, bei Umbauten, nach Sturzereignissen',
316
+ legal_basis: 'VUV Art. 3-5; BauAV Art. 15-29; BUL Merkblatt Absturz',
317
+ },
318
+ {
319
+ activity_type: 'Pflanzenschutzmittel-Anwendung',
320
+ requirement: 'Risikobeurteilung PSM-Anwenderschutz',
321
+ content: 'Gefahren: Hautresorption, Augenveraetzung, Einatmen von Aerosolen/Daempfen, Umweltkontamination. Bewertung: Abhaengig von Gefahrenstoffklassierung (GHS) des Produkts. Massnahmen: SDB lesen, PSA gemaess Produktetikett (Handschuhe, Schutzbrille, Atemschutz, Overall), Fachbewilligung erforderlich, Spritzen-Wartung, befestigter Fuellplatz, Notdusche.',
322
+ update_trigger: 'Bei neuen Produkten, jaehrlich vor Saison, nach Zwischenfaellen',
323
+ legal_basis: 'VUV Art. 3-5; PSMV Art. 5; ChemRRV Anhang 2.5',
324
+ },
325
+ {
326
+ activity_type: 'Elektrische Anlagen',
327
+ requirement: 'Risikobeurteilung Elektrizitaet auf dem Landwirtschaftsbetrieb',
328
+ content: 'Gefahren: Elektroschock, Lichtbogen, Brand durch Kurzschluss. Feuchte Umgebung (Stall, Melkstand, Waschplatz) erhoeht Risiko. Massnahmen: FI-Schutzschalter (30 mA) in allen Stall- und Nassraeumen, regelmaessige Kontrolle der elektrischen Installationen (alle 20 Jahre, Empfehlung alle 5 Jahre in Staellen), keine provisorischen Installationen, Meldung an Netzbetreiber bei Freileitungskontakt.',
329
+ update_trigger: 'Alle 5 Jahre, nach Umbauten, nach Blitzeinschlag',
330
+ legal_basis: 'VUV Art. 3-5; NIV Art. 5; ESTI Weisung 403',
331
+ },
332
+ ];
333
+
334
+ const insertRiskAssessment = db.instance.prepare(
335
+ 'INSERT INTO risk_assessments (activity_type, requirement, content, update_trigger, legal_basis, jurisdiction) VALUES (?, ?, ?, ?, ?, ?)'
336
+ );
337
+
338
+ for (const r of riskAssessments) {
339
+ insertRiskAssessment.run(r.activity_type, r.requirement, r.content, r.update_trigger, r.legal_basis, 'CH');
340
+ }
341
+ console.log(`Inserted ${riskAssessments.length} risk assessments`);
342
+
343
+ // ---------------------------------------------------------------------------
344
+ // 3. Machinery Safety — Traktor, Maehdrescher, Motorsaege, etc.
345
+ // ---------------------------------------------------------------------------
346
+
347
+ interface MachinerySafety {
348
+ machine_type: string;
349
+ requirement: string;
350
+ certification: string;
351
+ notes: string;
352
+ }
353
+
354
+ const machinerySafety: MachinerySafety[] = [
355
+ {
356
+ machine_type: 'Traktor',
357
+ requirement: 'ROPS (Ueberrollschutzvorrichtung) obligatorisch, Sicherheitsgurt tragen, Kabine oder Buegel aufgestellt',
358
+ certification: 'Typengepruefter ROPS nach OECD Code 4/6; MFK (Motorfahrzeugkontrolle) alle 3 Jahre',
359
+ notes: 'Aeltere Traktoren (vor 1970) muessen nachgeruestet werden. ROPS-Nachruest-Programme der BUL. Buegel darf nur fuer Durchfahrt unter niedrigen Hindernissen kurzzeitig umgelegt werden.',
360
+ },
361
+ {
362
+ machine_type: 'Traktor',
363
+ requirement: 'Gurtpflicht bei ROPS-ausgeruestetem Traktor',
364
+ certification: 'SVG Art. 57a; kantonale Strassenverkehrsaemter',
365
+ notes: 'Sicherheitsgurt haelt den Fahrer im Schutzbereich des ROPS. Ohne Gurt wird der Fahrer bei Umsturz hinausgeschleudert — der ROPS schuetzt dann nicht. Kabinentraktoren: Gurt empfohlen, bei offener Tuer obligatorisch.',
366
+ },
367
+ {
368
+ machine_type: 'Traktor',
369
+ requirement: 'Hoechstgeschwindigkeit 30 km/h (40 km/h mit Sonderbewilligung)',
370
+ certification: 'VTS Art. 150; kantonale Bewilligung fuer 40-km/h-Traktoren',
371
+ notes: '40-km/h-Bewilligung erfordert: Bremsen fuer 40 km/h geprueft, Beleuchtung komplett, Bereifung geeignet, MFK-Eintrag. Anhaenger muessen ebenfalls fuer 40 km/h zugelassen sein. Hangfahrten: Geschwindigkeit stark reduzieren.',
372
+ },
373
+ {
374
+ machine_type: 'Maehdrescher',
375
+ requirement: 'Reinigung und Wartung nur bei abgestelltem Motor und gesichertem Dreschwerk',
376
+ certification: 'Maschinenrichtlinie 2006/42/EG; CE-Kennzeichnung',
377
+ notes: 'Brandgefahr durch Staubablagerungen — taegliche Reinigung. Feuererloescher (6 kg ABC-Pulver) mitfuehren. Einzugsbereiche (Haspel, Einzugswalze, Haecksler) bei Verstopfung nur bei ausgeschaltetem Motor befreien.',
378
+ },
379
+ {
380
+ machine_type: 'Motorsaege',
381
+ requirement: 'Vollstaendige PSA (Schnittschutzhose, Helm, Gehoerschutz, Sicherheitsschuhe, Handschuhe), Motorsaege-Kurs obligatorisch',
382
+ certification: 'EN ISO 11681-1 (Motorsaegen); PSA nach EN 381 (Schnittschutz)',
383
+ notes: 'Grundkurs Motorsaege mind. 5 Tage (BUL/Forstbetrieb). Kettenbremse vor jedem Einsatz pruefen. Keine Arbeiten ueber Schulterhoehe. Saegekette regelmaessig schaerfen. Tankdeckel: abstellen vor Tanken, kein offenes Feuer.',
384
+ },
385
+ {
386
+ machine_type: 'Kreiselmaeher',
387
+ requirement: 'Steinschlagschutz montiert, Sicherheitsabstand 20 m zu Personen',
388
+ certification: 'Maschinenrichtlinie 2006/42/EG; EN ISO 4254-1',
389
+ notes: 'Maehwerke schleudern Steine mit bis zu 200 km/h. Schutzbleche und -ketten duerfen nicht entfernt werden. Vor Maehbeginn Flaeche kontrollieren (Steine, Draehte, Tiere). Maehen in der Naehe von Wegen: Absperrung oder Warnschilder.',
390
+ },
391
+ {
392
+ machine_type: 'Zapfwelle / Gelenkwelle',
393
+ requirement: 'Schutzrohr und Schutzglocke muessen vollstaendig und intakt sein',
394
+ certification: 'EN ISO 5674 (Gelenkwellenschutz); VUV Art. 28',
395
+ notes: 'Defekte Schutzrohre sofort ersetzen. Nie in die Naehe rotierender Gelenkwellen greifen. Locker sitzende Kleidung und Schals sind verboten. Keine Reparaturen bei laufender Zapfwelle. Absicherung: Zapfwelle auskuppeln und Motor abstellen.',
396
+ },
397
+ {
398
+ machine_type: 'Ladewagen',
399
+ requirement: 'Einzugsbereich gesichert, Pick-up nur bei abgestelltem Motor freimachen',
400
+ certification: 'Maschinenrichtlinie 2006/42/EG',
401
+ notes: 'Lebensgefaehrliche Einzugsbereiche an Pick-up, Foerderaggregat und Schneidwerk. Verstopfungen: Motor abstellen, Schluessel abziehen, Gerät gegen unbeabsichtigtes Einschalten sichern. Rueckwaertsfahren nur mit Einweiser.',
402
+ },
403
+ {
404
+ machine_type: 'Hoflader / Teleskoplader',
405
+ requirement: 'Ueberrollschutz, Gurt, Lastdiagramm beachten, Fahrerschutzdach',
406
+ certification: 'EN 474 (Erdbaumaschinen); Maschinenrichtlinie 2006/42/EG',
407
+ notes: 'Kipptgefahr bei Ueberladung und auf Hanglagen. Lastdiagramm beachten (reduzierte Tragkraft bei Auslegerhoehe). Nie unter angehobener Last stehen. Personentransport in der Schaufel verboten. Fahrweg absichern.',
408
+ },
409
+ {
410
+ machine_type: 'Seilwinde',
411
+ requirement: 'Seilzustand pruefen, Sperrbereich einrichten, Handzeichen verwenden',
412
+ certification: 'EN 14492-1 (Winden); Maschinenrichtlinie 2006/42/EG',
413
+ notes: 'Drahtseil regelmaessig auf Drahtbrueche, Korrosion und Verformung pruefen. Sperrbereich = doppelte Seillaenge seitlich. Handzeichen zwischen Windenfahrer und Holzer vereinbaren. Umlenk-Rollen korrekt dimensionieren. Nie in das Seil greifen.',
414
+ },
415
+ ];
416
+
417
+ const insertMachinerySafety = db.instance.prepare(
418
+ 'INSERT INTO machinery_safety (machine_type, requirement, certification, notes, jurisdiction) VALUES (?, ?, ?, ?, ?)'
419
+ );
420
+
421
+ for (const m of machinerySafety) {
422
+ insertMachinerySafety.run(m.machine_type, m.requirement, m.certification, m.notes, 'CH');
423
+ }
424
+ console.log(`Inserted ${machinerySafety.length} machinery safety entries`);
425
+
426
+ // ---------------------------------------------------------------------------
427
+ // 4. Chemical Safety — PSM, Silogas, Ammoniak, Diesel
428
+ // ---------------------------------------------------------------------------
429
+
430
+ interface ChemicalSafety {
431
+ substance_type: string;
432
+ exposure_limit: string;
433
+ ppe_required: string;
434
+ storage_rule: string;
435
+ }
436
+
437
+ const chemicalSafety: ChemicalSafety[] = [
438
+ {
439
+ substance_type: 'Pflanzenschutzmittel (PSM) — allgemein',
440
+ exposure_limit: 'Produktspezifisch gemaess Sicherheitsdatenblatt (SDB); MAK-Werte fuer Wirkstoffe bei Suva',
441
+ ppe_required: 'Chemikalienschutzhandschuhe (Nitrilkautschuk), Schutzbrille, Atemschutz (Halbmaske A1P2), Schutzanzug (Typ 4 mind.), geschlossene Schuhe',
442
+ storage_rule: 'Abschliessbares Lager, frostfrei, belueftet, Auffangwanne (10% Lagervolumen), kein Lebensmittelkontakt, Originalbehaelaer, Sonderabfall-Entsorgung',
443
+ },
444
+ {
445
+ substance_type: 'Silogas (Stickstoffdioxid NO2)',
446
+ exposure_limit: 'MAK 0.5 ppm (Suva Grenzwertliste); IDLH 20 ppm; ab 50 ppm lebensgefaehrlich',
447
+ ppe_required: 'Umluftunabhaengiger Atemschutz (Pressluftatmer) bei Betreten des Siloraums, Schutzanzug, Gaswarngeraet mit NO2-Sensor',
448
+ storage_rule: 'Entsteht natuerlich beim Silieren — kein Lagerproblem. 3-Wochen-Sperrfrist nach Befuellung. Tueren und Luken offen lassen fuer Ventilation.',
449
+ },
450
+ {
451
+ substance_type: 'Silogas (Kohlendioxid CO2)',
452
+ exposure_limit: 'MAK 5,000 ppm (0.5%); ab 3% Kopfschmerzen, ab 8% Bewusstlosigkeit, ab 10% Tod',
453
+ ppe_required: 'Umluftunabhaengiger Atemschutz bei Betreten geschlossener Raeum; CO2-Messgeraet',
454
+ storage_rule: 'CO2 ist schwerer als Luft und sammelt sich in Bodennaeehe und Gruben. Belueftung von unten nach oben erforderlich.',
455
+ },
456
+ {
457
+ substance_type: 'Schwefelwasserstoff (H2S) — Guellegas',
458
+ exposure_limit: 'MAK 5 ppm (Suva); ab 100 ppm Geruchswahrnehmung versagt; ab 300 ppm lebensgefaehrlich',
459
+ ppe_required: 'Umluftunabhaengiger Atemschutz (Pressluftatmer), Schutzbrille, Schutzanzug; Gaswarngeraet mit H2S-Sensor',
460
+ storage_rule: 'Guellegruben: Abdeckung, Gelaender an allen Oeffnungen, Warnschild. Beim Ruehren: alle Stalltueren oeffnen, Tiere wenn moeglich ausstallen, Personen fernhalten.',
461
+ },
462
+ {
463
+ substance_type: 'Ammoniak (NH3)',
464
+ exposure_limit: 'MAK 20 ppm (Suva); ab 300 ppm lebensgefaehrlich; stark aetzend fuer Augen und Atemwege',
465
+ ppe_required: 'Atemschutz (Halbmaske mit NH3-Filter K), Schutzbrille dicht schliessend, Schutzhandschuhe',
466
+ storage_rule: 'Ammoniakhaltige Duenger (Harnstoff, AHL): trockenes Lager, nicht mit Sauren mischen. Bei Kaelteanlagen: regelmaessige Dichtigkeitspruefung.',
467
+ },
468
+ {
469
+ substance_type: 'Dieselkraftstoff',
470
+ exposure_limit: 'MAK 100 mg/m3 (Suva Grenzwertliste); hautresorptiv',
471
+ ppe_required: 'Schutzhandschuhe (Nitril), Schutzbrille bei Umfuellen, kein offenes Feuer, Feuererloescher bereithalten',
472
+ storage_rule: 'Lagerung: max. 450 Liter ohne Baubewilligung, Auffangwanne (100% Volumen), keine Einleitung in Kanalisation, Lagerplaetze mit undurchlaessigem Boden, 20 m Abstand zu Gewaessern.',
473
+ },
474
+ {
475
+ substance_type: 'Saeuren und Laugen (Stallreiniger)',
476
+ exposure_limit: 'Produktspezifisch gemaess SDB; Veraetzungsgefahr',
477
+ ppe_required: 'Gesichtsschutz, Gummihandschuhe, Gummistiefel, Schutzanzug; Notdusche in Reichweite',
478
+ storage_rule: 'Getrennt von anderen Chemikalien lagern, Originalbehaelaer, nie mischen (Chlorgas-Gefahr bei Saeure + Chlorreiniger), Kindsicherung.',
479
+ },
480
+ ];
481
+
482
+ const insertChemicalSafety = db.instance.prepare(
483
+ 'INSERT INTO chemical_safety (substance_type, exposure_limit, ppe_required, storage_rule, jurisdiction) VALUES (?, ?, ?, ?, ?)'
484
+ );
485
+
486
+ for (const c of chemicalSafety) {
487
+ insertChemicalSafety.run(c.substance_type, c.exposure_limit, c.ppe_required, c.storage_rule, 'CH');
488
+ }
489
+ console.log(`Inserted ${chemicalSafety.length} chemical safety entries`);
490
+
491
+ // ---------------------------------------------------------------------------
492
+ // 5. Young Worker Rules — Jugendarbeitsschutz in der Landwirtschaft
493
+ // ---------------------------------------------------------------------------
494
+
495
+ interface YoungWorkerRule {
496
+ age_group: string;
497
+ restriction: string;
498
+ exception: string;
499
+ legal_basis: string;
500
+ }
501
+
502
+ const youngWorkerRules: YoungWorkerRule[] = [
503
+ {
504
+ age_group: 'unter-13',
505
+ restriction: 'Keine Beschaeftigung von Kindern unter 13 Jahren',
506
+ exception: 'Keine Ausnahmen in der Landwirtschaft. Schulpflichtige Kinder duerfen keine regulaere Arbeit leisten.',
507
+ legal_basis: 'ArG Art. 30; ArGV 5 Art. 1',
508
+ },
509
+ {
510
+ age_group: '13-15',
511
+ restriction: 'Nur leichte Arbeiten auf dem elterlichen Betrieb erlaubt',
512
+ exception: 'Auf dem elterlichen Betrieb duerfen Kinder ab 13 Jahren leichte, ungefaehrliche Arbeiten ausfuehren: Beeren pfluecken, leichte Gartenarbeit, Eier einsammeln, kleine Tiere fuettern. Keine gefaehrlichen Maschinen, keine schweren Lasten (max. 7 kg), keine Chemikalien.',
513
+ legal_basis: 'ArG Art. 30 Abs. 2; ArGV 5 Art. 8; Jugendarbeitsschutzverordnung',
514
+ },
515
+ {
516
+ age_group: '15-16',
517
+ restriction: 'Regulaere Beschaeftigung moeglich, gefaehrliche Arbeiten verboten',
518
+ exception: 'Ab 15 duerfen Jugendliche in der Landwirtschaft arbeiten (Lehre, Aushilfe). Verboten: Arbeiten mit Traktor auf oeffentlichen Strassen, Motorsaege, gefaehrliche Maschinen (Kreiselsaege, Holzspalter), gefaehrliche Tiere (Stiere, Mutterkuehe), Siloarbeiten, PSM-Anwendung, Arbeiten in der Hoehe > 3 m. Arbeitszeit max. 9 Std./Tag, keine Nachtarbeit (20-06 Uhr).',
519
+ legal_basis: 'ArG Art. 29-32; ArGV 5 Art. 4-6, Anhang (Liste gefaehrlicher Arbeiten)',
520
+ },
521
+ {
522
+ age_group: '16-18',
523
+ restriction: 'Erweiterter Zugang mit Ausbildung; bestimmte gefaehrliche Arbeiten mit Ausnahmebewilligung',
524
+ exception: 'Ab 16 in der Lehre (EFZ Landwirt/in) koennen bestimmte gefaehrliche Arbeiten unter Aufsicht erlernt werden — gemaess Bildungsverordnung (BiVO). Traktorfahren auf oeffentlichen Strassen ab 16 mit Lernfahrausweis Kat. G. Motorsaege erst ab 18 (Ausnahme: ueberbetriebliche Kurse mit Aufsicht). PSM-Anwendung ab 16 nur unter direkter Aufsicht einer Person mit Fachbewilligung.',
525
+ legal_basis: 'ArG Art. 29-32; ArGV 5 Art. 4; BiVO Landwirt/in EFZ; SVG Art. 10',
526
+ },
527
+ {
528
+ age_group: 'Lernende (EFZ Landwirt/in)',
529
+ restriction: 'Spezialregelungen fuer gefaehrliche Arbeiten in der beruflichen Grundbildung',
530
+ exception: 'Lernende duerfen gefaehrliche Arbeiten ausfuehren, wenn dies im Bildungsplan vorgesehen ist und die Begleitmassnahmen der BiVO eingehalten werden. Der Lehrbetrieb muss eine Risikobeurteilung erstellen. Ausbildner muss anwesend sein. Schrittweiser Aufbau der Kompetenzen. Ueberbetriebliche Kurse vermitteln Grundlagen.',
531
+ legal_basis: 'ArGV 5 Art. 4 Abs. 4; Bildungsverordnung Landwirt/in EFZ; SECO Wegleitung',
532
+ },
533
+ ];
534
+
535
+ const insertYoungWorkerRule = db.instance.prepare(
536
+ 'INSERT INTO young_worker_rules (age_group, restriction, exception, legal_basis, jurisdiction) VALUES (?, ?, ?, ?, ?)'
537
+ );
538
+
539
+ for (const y of youngWorkerRules) {
540
+ insertYoungWorkerRule.run(y.age_group, y.restriction, y.exception, y.legal_basis, 'CH');
541
+ }
542
+ console.log(`Inserted ${youngWorkerRules.length} young worker rules`);
543
+
544
+ // ---------------------------------------------------------------------------
545
+ // 6. Accident Reporting — Meldepflicht, Fristen, Versicherer
546
+ // ---------------------------------------------------------------------------
547
+
548
+ interface AccidentReport {
549
+ severity: string;
550
+ obligation: string;
551
+ deadline: string;
552
+ form: string;
553
+ insurer: string;
554
+ }
555
+
556
+ const accidentReporting: AccidentReport[] = [
557
+ {
558
+ severity: 'toedlich',
559
+ obligation: 'Sofortige Meldung an Polizei (117), Versicherer und Arbeitsinspektorat. Unfallstelle nicht veraendern bis Polizei eintrifft.',
560
+ deadline: 'Sofort (Polizei), innert 3 Arbeitstagen schriftlich an Versicherer',
561
+ form: 'Suva-Unfallmeldung (Angestellte) oder Schadensmeldung an private Unfallversicherung (Selbstaendige); SECO-Meldung (Arbeitsinspektorat)',
562
+ insurer: 'Angestellte: Suva (obligatorische Unfallversicherung gemaess UVG). Selbstaendige Landwirte: freiwillige Unfallversicherung (oft Agrisano, Emmental Versicherung) oder Krankenkasse KVG.',
563
+ },
564
+ {
565
+ severity: 'schwer',
566
+ obligation: 'Meldung an Versicherer innert 3 Arbeitstagen. Bei Hospitalisation oder bleibender Invaliditaet: auch an kantonales Arbeitsinspektorat melden.',
567
+ deadline: 'Innert 3 Arbeitstagen nach Unfall',
568
+ form: 'Suva-Unfallmeldung (online unter suva.ch oder Formular 6208) fuer Angestellte. Private Unfallversicherung: Schadensmeldung gemaess Versicherungsvertrag.',
569
+ insurer: 'Angestellte: Suva. Selbstaendige: private Unfallversicherung (freiwillig gemaess UVG Art. 4). Familienmitglieder ohne Arbeitsvertrag: Krankenkasse KVG.',
570
+ },
571
+ {
572
+ severity: 'leicht',
573
+ obligation: 'Meldung an Versicherer, wenn aerztliche Behandlung noetig oder Arbeitsunfaehigkeit > 3 Tage',
574
+ deadline: 'Innert 3 Arbeitstagen nach Unfall, wenn Arbeitsunfaehigkeit > 3 Tage',
575
+ form: 'Suva-Unfallmeldung fuer Angestellte. Private Schadensmeldung fuer Selbstaendige. Bagatellunfaelle (keine Arbeitsunfaehigkeit, keine aerztliche Behandlung): interne Dokumentation genuegt.',
576
+ insurer: 'Wie bei schweren Unfaellen. Suva zahlt ab 3. Tag Arbeitsunfaehigkeit (Taggeld 80% des versicherten Verdiensts).',
577
+ },
578
+ {
579
+ severity: 'Berufskrankheit',
580
+ obligation: 'Meldung an Versicherer bei Verdacht auf berufsbedingte Erkrankung. Arzt ist meldepflichtig.',
581
+ deadline: 'Unverzueglich nach Diagnose',
582
+ form: 'Suva: Aerztliche Berufskrankheits-Anzeige. Haeufig in der Landwirtschaft: Atemwegserkrankungen (Staub, Schimmel — Farmerlunge), Hautekzeme (PSM, Desinfektionsmittel), Gehoerschaeden (Laerm > 85 dB), Borreliose (Zeckenbiss), FSME.',
583
+ insurer: 'Suva (Angestellte) oder private UVG-Versicherung. Berufskrankheiten gemaess UVG Anhang 1 sind gleichgestellt mit Berufsunfaellen.',
584
+ },
585
+ {
586
+ severity: 'Beinahe-Unfall',
587
+ obligation: 'Keine obligatorische externe Meldung, aber interne Erfassung empfohlen (AgriTOP Branchenloesung)',
588
+ deadline: 'Zeitnah nach Ereignis',
589
+ form: 'Interne Dokumentation, z.B. im Rahmen der EKAS-Branchenloesung AgriTOP. BUL-Formular fuer Ereignisanalyse.',
590
+ insurer: 'Keine Versicherungsmeldung erforderlich. Dient der Praevention.',
591
+ },
592
+ ];
593
+
594
+ const insertAccidentReport = db.instance.prepare(
595
+ 'INSERT INTO accident_reporting (severity, obligation, deadline, form, insurer, jurisdiction) VALUES (?, ?, ?, ?, ?, ?)'
596
+ );
597
+
598
+ for (const a of accidentReporting) {
599
+ insertAccidentReport.run(a.severity, a.obligation, a.deadline, a.form, a.insurer, 'CH');
600
+ }
601
+ console.log(`Inserted ${accidentReporting.length} accident reporting entries`);
602
+
603
+ // ---------------------------------------------------------------------------
604
+ // 7. BUL Guidance — Merkblaetter, Kampagnen, Themenportale
605
+ // ---------------------------------------------------------------------------
606
+
607
+ interface BulGuidance {
608
+ topic: string;
609
+ title: string;
610
+ description: string;
611
+ url: string;
612
+ }
613
+
614
+ const bulGuidance: BulGuidance[] = [
615
+ {
616
+ topic: 'Kampagne',
617
+ title: 'Safe at Work — Landwirtschaft',
618
+ description: 'Nationale Praventionskampagne der BUL fuer mehr Sicherheit in der Landwirtschaft. Themenschwerpunkte: lebenswichtige Regeln, STOP-Prinzip (Stopp sagen bei Gefahr), Vorgesetzte und Mitarbeitende sensibilisieren.',
619
+ url: 'https://www.bul.ch/de/kampagnen/safe-at-work',
620
+ },
621
+ {
622
+ topic: 'Maschinen',
623
+ title: 'BUL Merkblatt — Traktor-Sicherheit',
624
+ description: 'ROPS, Gurtpflicht, MFK, Geschwindigkeit, Hangfahrten, Anhaengerbetrieb. Haeufigste Unfallursache: Traktorumsturz am Hang (ca. 12 Todesfaelle/Jahr).',
625
+ url: 'https://www.bul.ch/de/themen/maschinen/traktor',
626
+ },
627
+ {
628
+ topic: 'Tiere',
629
+ title: 'BUL Merkblatt — Umgang mit Mutterkuehen',
630
+ description: 'Verhaltensregeln beim Betreten von Mutterkuh-Weiden. Kein Hund in der Herde, Fluchtweg sichern, Kalb nicht anfassen. Mutterkuh-Unfaelle verursachen jaehrlich schwere und toedliche Verletzungen.',
631
+ url: 'https://www.bul.ch/de/themen/tiere/rindvieh/mutterkuehe',
632
+ },
633
+ {
634
+ topic: 'Tiere',
635
+ title: 'BUL Merkblatt — Stierenhaltung',
636
+ description: 'Sicherer Umgang mit Zucht- und Mastbullen. Nasenring, sichere Stallbau-Anforderungen, Fluchtmoeglichkeit, Handling-Einrichtungen.',
637
+ url: 'https://www.bul.ch/de/themen/tiere/rindvieh/stiere',
638
+ },
639
+ {
640
+ topic: 'Wald',
641
+ title: 'BUL Merkblatt — Holzerei auf dem Bauernhof',
642
+ description: 'Ausbildungsanforderungen, PSA, Faelltechnik, Aufarbeitung, Alleinarbeitsverbot. Bauernwald-Holzerei ist statistisch gefaehrlicher als professionelle Forstwirtschaft.',
643
+ url: 'https://www.bul.ch/de/themen/wald',
644
+ },
645
+ {
646
+ topic: 'Hoehe',
647
+ title: 'BUL Merkblatt — Absturzsicherung auf dem Bauernhof',
648
+ description: 'Dacharbeiten, Heubuehnen, Silo, Leitern. Ab 2 m: Gelaender, Netze oder Anseilschutz. Spezialfall: fragile Dacheindeckungen (Faserzement, Wellplatten).',
649
+ url: 'https://www.bul.ch/de/themen/absturz',
650
+ },
651
+ {
652
+ topic: 'Chemie',
653
+ title: 'BUL Merkblatt — PSM-Anwenderschutz',
654
+ description: 'Persoenliche Schutzausruestung bei Pflanzenschutzmittel-Anwendung. SDB lesen, korrekte PSA waehlen, Spritzenfuellplatz, Entsorgung, Fachbewilligung.',
655
+ url: 'https://www.bul.ch/de/themen/chemie/pflanzenschutzmittel',
656
+ },
657
+ {
658
+ topic: 'Silogas',
659
+ title: 'BUL Merkblatt — Silogas-Gefahr',
660
+ description: 'NO2 und CO2 beim Silieren. 3-Wochen-Sperrfrist, Belueftung, Gaswarngeraet, Rettungskonzept. Silogas ist unsichtbar und geruchlos bei toedlicher Konzentration.',
661
+ url: 'https://www.bul.ch/de/themen/silogas',
662
+ },
663
+ {
664
+ topic: 'Silogas',
665
+ title: 'Suva Merkblatt 11030 — Silogas in der Landwirtschaft',
666
+ description: 'Technisches Merkblatt der Suva: Entstehung von Silogas, Messung, Belueftungstechnik, Rettung, Sofortmassnahmen bei Vergiftungsverdacht.',
667
+ url: 'https://www.suva.ch/de-ch/material/factsheets/silogas-in-der-landwirtschaft-11030',
668
+ },
669
+ {
670
+ topic: 'Alleinarbeit',
671
+ title: 'BUL Merkblatt — Alleinarbeit in der Landwirtschaft',
672
+ description: 'Risikobeurteilung, Kommunikationsmittel, Totmannschaltung, Kontrollkontakte. Alleinarbeit ist in der Landwirtschaft haeufig — ueber 50% der Betriebe sind Familienbetriebe mit nur einer Arbeitskraft.',
673
+ url: 'https://www.bul.ch/de/themen/alleinarbeit',
674
+ },
675
+ {
676
+ topic: 'Erste Hilfe',
677
+ title: 'BUL Merkblatt — Erste Hilfe auf dem Bauernhof',
678
+ description: 'Hofapotheke (Inhalt, Standorte), Notfallplan, Notrufnummern (144/1414/117/118/145), Erste-Hilfe-Kurs Empfehlung, AED-Standorte.',
679
+ url: 'https://www.bul.ch/de/themen/erste-hilfe',
680
+ },
681
+ {
682
+ topic: 'Branchenloesung',
683
+ title: 'AgriTOP — EKAS-Branchenloesung Landwirtschaft',
684
+ description: 'Systematische Arbeitssicherheit fuer Landwirtschaftsbetriebe mit Angestellten. Gefahrenermittlung, Massnahmenplanung, Instruktion, Kontrolle. Ersetzt individuelles ASA-Konzept. Traeger: SBV/BUL.',
685
+ url: 'https://www.agritop.ch',
686
+ },
687
+ {
688
+ topic: 'Jugendliche',
689
+ title: 'SECO — Jugendarbeitsschutz in der Landwirtschaft',
690
+ description: 'Mindestalter, erlaubte und verbotene Arbeiten, Spezialregelung fuer Familienbetriebe (ab 13 leichte Arbeiten), EFZ-Lehre Sonderregeln, Arbeitszeiten.',
691
+ url: 'https://www.seco.admin.ch/seco/de/home/Arbeit/Arbeitsbedingungen/jugendarbeitsschutz.html',
692
+ },
693
+ {
694
+ topic: 'Statistik',
695
+ title: 'Agriss — Unfallstatistik Schweizer Landwirtschaft',
696
+ description: 'Jaehrliche Auswertung: toedliche und schwere Unfaelle, Ursachen (Traktor 30%, Sturz 20%, Tiere 15%), saisonale Verteilung (Spitze Juni-Oktober), langjaehrige Trends. Landwirtschaft = hoechste Berufstodesrate der Schweiz.',
697
+ url: 'https://www.bul.ch/de/themen/unfallstatistik',
698
+ },
699
+ {
700
+ topic: 'Guelle',
701
+ title: 'BUL Merkblatt — Sicherer Umgang mit Guelle',
702
+ description: 'Guellegrube: Abdeckung, Gelaender, Warnschild. Beim Ruehren: Stalltore oeffnen, Tiere ausstallen. Guellegas (H2S, CH4, CO2, NH3) lebensgefaehrlich. Nie in Grube einsteigen ohne Pressluftatmer und Sicherungsposten.',
703
+ url: 'https://www.bul.ch/de/themen/guelle',
704
+ },
705
+ ];
706
+
707
+ const insertBulGuidance = db.instance.prepare(
708
+ 'INSERT INTO bul_guidance (topic, title, description, url, jurisdiction) VALUES (?, ?, ?, ?, ?)'
709
+ );
710
+
711
+ for (const g of bulGuidance) {
712
+ insertBulGuidance.run(g.topic, g.title, g.description, g.url, 'CH');
713
+ }
714
+ console.log(`Inserted ${bulGuidance.length} BUL guidance entries`);
715
+
716
+ // ---------------------------------------------------------------------------
717
+ // 8. FTS5 Search Index — combine all tables into unified search
718
+ // ---------------------------------------------------------------------------
719
+
720
+ const insertFts = db.instance.prepare(
721
+ 'INSERT INTO search_index (title, body, area, jurisdiction) VALUES (?, ?, ?, ?)'
722
+ );
723
+
724
+ // Index safety rules
725
+ for (const r of safetyRules) {
726
+ insertFts.run(r.topic, `${r.rule}. ${r.description}`, r.area, 'CH');
727
+ }
728
+
729
+ // Index risk assessments
730
+ for (const r of riskAssessments) {
731
+ insertFts.run(
732
+ `Risikobeurteilung ${r.activity_type}`,
733
+ `${r.requirement}. ${r.content}`,
734
+ 'allgemein',
735
+ 'CH'
736
+ );
737
+ }
738
+
739
+ // Index machinery safety
740
+ for (const m of machinerySafety) {
741
+ insertFts.run(
742
+ `${m.machine_type} — Sicherheit`,
743
+ `${m.requirement}. ${m.notes}`,
744
+ 'maschinen',
745
+ 'CH'
746
+ );
747
+ }
748
+
749
+ // Index chemical safety
750
+ for (const c of chemicalSafety) {
751
+ insertFts.run(
752
+ `Chemische Sicherheit: ${c.substance_type}`,
753
+ `Grenzwert: ${c.exposure_limit}. PSA: ${c.ppe_required}. Lagerung: ${c.storage_rule}`,
754
+ 'chemie',
755
+ 'CH'
756
+ );
757
+ }
758
+
759
+ // Index young worker rules
760
+ for (const y of youngWorkerRules) {
761
+ insertFts.run(
762
+ `Jugendarbeitsschutz ${y.age_group}`,
763
+ `${y.restriction}. ${y.exception}`,
764
+ 'allgemein',
765
+ 'CH'
766
+ );
767
+ }
768
+
769
+ // Index accident reporting
770
+ for (const a of accidentReporting) {
771
+ insertFts.run(
772
+ `Unfallmeldung ${a.severity}`,
773
+ `${a.obligation}. Frist: ${a.deadline}. ${a.form}`,
774
+ 'allgemein',
775
+ 'CH'
776
+ );
777
+ }
778
+
779
+ // Index BUL guidance
780
+ for (const g of bulGuidance) {
781
+ insertFts.run(
782
+ g.title,
783
+ g.description,
784
+ g.topic.toLowerCase() === 'maschinen' ? 'maschinen' :
785
+ g.topic.toLowerCase() === 'tiere' ? 'tiere' :
786
+ g.topic.toLowerCase() === 'wald' ? 'wald' :
787
+ g.topic.toLowerCase() === 'hoehe' ? 'hoehe' :
788
+ g.topic.toLowerCase() === 'chemie' ? 'chemie' :
789
+ g.topic.toLowerCase() === 'silogas' ? 'silogas' :
790
+ 'allgemein',
791
+ 'CH'
792
+ );
793
+ }
794
+
795
+ console.log('FTS5 search index populated');
796
+
797
+ // ---------------------------------------------------------------------------
798
+ // 9. Metadata
799
+ // ---------------------------------------------------------------------------
800
+
801
+ db.run('INSERT OR REPLACE INTO db_metadata (key, value) VALUES (?, ?)', ['last_ingest', now]);
802
+ db.run('INSERT OR REPLACE INTO db_metadata (key, value) VALUES (?, ?)', ['build_date', now]);
803
+ db.run('INSERT OR REPLACE INTO db_metadata (key, value) VALUES (?, ?)', ['schema_version', '1.0']);
804
+ db.run('INSERT OR REPLACE INTO db_metadata (key, value) VALUES (?, ?)', ['mcp_name', 'Switzerland Farm Safety MCP']);
805
+ db.run('INSERT OR REPLACE INTO db_metadata (key, value) VALUES (?, ?)', ['jurisdiction', 'CH']);
806
+
807
+ // ---------------------------------------------------------------------------
808
+ // 10. Coverage JSON + Sources YAML
809
+ // ---------------------------------------------------------------------------
810
+
811
+ const coverage = {
812
+ server: 'ch-farm-safety-mcp',
813
+ jurisdiction: 'CH',
814
+ version: '0.1.0',
815
+ last_ingest: now,
816
+ data: {
817
+ safety_rules: safetyRules.length,
818
+ risk_assessments: riskAssessments.length,
819
+ machinery_safety: machinerySafety.length,
820
+ chemical_safety: chemicalSafety.length,
821
+ young_worker_rules: youngWorkerRules.length,
822
+ accident_reporting: accidentReporting.length,
823
+ bul_guidance: bulGuidance.length,
824
+ },
825
+ tools: 10,
826
+ sources: [
827
+ 'BUL/SPAA — Sicherheitsregeln, Merkblaetter',
828
+ 'Suva — Arbeitssicherheit Landwirtschaft',
829
+ 'EKAS — Branchenloesung Landwirtschaft',
830
+ 'Agriss — Unfallstatistik',
831
+ ],
832
+ };
833
+
834
+ writeFileSync('data/coverage.json', JSON.stringify(coverage, null, 2) + '\n');
835
+ console.log('Wrote data/coverage.json');
836
+
837
+ const sourcesYaml = `# Data sources for ch-farm-safety-mcp
838
+ sources:
839
+ - name: BUL/SPAA — Sicherheitsregeln und Merkblaetter
840
+ authority: Beratungsstelle fuer Unfallverhuetung in der Landwirtschaft (BUL)
841
+ url: https://www.bul.ch
842
+ license: Swiss public-sector information — free reuse
843
+ update_frequency: periodic (rules updated as needed)
844
+ last_retrieved: "${now}"
845
+
846
+ - name: Suva — Arbeitssicherheit Landwirtschaft
847
+ authority: Schweizerische Unfallversicherungsanstalt (Suva)
848
+ url: https://www.suva.ch/de-ch/praevention/nach-branche/landwirtschaft
849
+ license: Swiss public-sector information — free reuse
850
+ update_frequency: periodic
851
+ last_retrieved: "${now}"
852
+
853
+ - name: EKAS — Branchenloesung Landwirtschaft
854
+ authority: Eidgenoessische Koordinationskommission fuer Arbeitssicherheit (EKAS)
855
+ url: https://www.ekas.admin.ch
856
+ license: Swiss Federal Administration — free reuse
857
+ update_frequency: periodic
858
+ last_retrieved: "${now}"
859
+
860
+ - name: Agriss — Unfallstatistik Schweizer Landwirtschaft
861
+ authority: BUL / Agroscope
862
+ url: https://www.bul.ch/de/themen/unfallstatistik
863
+ license: Swiss public-sector information — free reuse
864
+ update_frequency: annual
865
+ last_retrieved: "${now}"
866
+
867
+ - name: SECO — Jugendarbeitsschutz
868
+ authority: Staatssekretariat fuer Wirtschaft (SECO)
869
+ url: https://www.seco.admin.ch/seco/de/home/Arbeit/Arbeitsbedingungen/jugendarbeitsschutz.html
870
+ license: Swiss Federal Administration — free reuse
871
+ update_frequency: periodic
872
+ last_retrieved: "${now}"
873
+ `;
874
+
875
+ writeFileSync('data/sources.yml', sourcesYaml);
876
+ console.log('Wrote data/sources.yml');
877
+
878
+ db.close();
879
+ console.log('Ingestion complete');