From d85f5e2ab9ef188efe26cf43d1cd4ea45e583d65 Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Tue, 6 Jan 2026 17:47:06 +0100 Subject: [PATCH 1/5] Add Architecture Decision Records (ADR) documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created ADR documentation structure following MADR format: - ADR-001: Semantic tags for temporal data (selex: attributes) - ADR-002: Import from Regeringskansliet instead of PDF crawling Documents key architectural decisions regarding temporal metadata handling and data sources for the SFS processor project. đŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- docs/adr/001-semantiska-temporal-taggar.md | 163 ++++++++++++++++++ docs/adr/002-import-fran-regeringskansliet.md | 142 +++++++++++++++ docs/adr/README.md | 33 ++++ 3 files changed, 338 insertions(+) create mode 100644 docs/adr/001-semantiska-temporal-taggar.md create mode 100644 docs/adr/002-import-fran-regeringskansliet.md create mode 100644 docs/adr/README.md diff --git a/docs/adr/001-semantiska-temporal-taggar.md b/docs/adr/001-semantiska-temporal-taggar.md new file mode 100644 index 0000000..ef1b769 --- /dev/null +++ b/docs/adr/001-semantiska-temporal-taggar.md @@ -0,0 +1,163 @@ +# ADR-001: Semantiskt val av taggar för temporal data + +## Status + +Accepterad + +## Kontext och problembeskrivning + +Författningar i SFS förĂ€ndras över tid - paragrafer trĂ€der i kraft vid olika datum, upphĂ€vs, eller Ă€ndras. För att korrekt kunna: + +- Visa hur en lag sĂ„g ut vid ett specifikt datum +- Filtrera bort upphĂ€vda bestĂ€mmelser +- Hantera ikrafttrĂ€danderegler +- Skapa historiska versioner i Git +- Generera semantiska vektorembeddings för endast gĂ€llande regelverk + +...behövde vi ett semantiskt system för att mĂ€rka upp temporal information i Markdown-filerna. + +Utmaningarna var: + +1. **Bevara temporal metadata** genom hela processing-kedjan (JSON → Markdown → HTML/Git/Vector) +2. **Standardkompatibilitet**: Markdown ska vara lĂ€sbart bĂ„de för mĂ€nniskor och maskiner +3. **Filtreringslogik**: Enkelt att identifiera och filtrera baserat pĂ„ datum +4. **Namnrymd**: Undvika kollisioner med standard HTML-attribut +5. **Juridisk precision**: FĂ„nga skillnaden mellan "upphĂ€vd", "Ă€nnu ej ikrafttrĂ€dd", och "gĂ€llande" + +## Beslut + +Vi anvĂ€nder **custom HTML-attribut med `selex:`-prefix** för temporal metadata i Markdown-filer. + +### Attributschema + +```html +
+#### 1 § +... +
+ +
+### UpphÀvda bestÀmmelser +... +
+ +
+#### 5 § +... +
+``` + +### Attributdefinitioner + +| Attribut | Typ | Beskrivning | Exempel | +|----------|-----|-------------|---------| +| `selex:status` | Enum | Juridisk status: `ikraft`, `upphavd`, `upphord` | `selex:status="ikraft"` | +| `selex:ikraft_datum` | Date (ISO 8601) | Datum dĂ„ sektionen trĂ€der i kraft | `selex:ikraft_datum="2025-01-01"` | +| `selex:upphor_datum` | Date (ISO 8601) | Datum dĂ„ sektionen upphör att gĂ€lla | `selex:upphor_datum="2023-12-31"` | +| `selex:ikraft_villkor` | String | Villkor för ikrafttrĂ€dande (vid avsaknad av exakt datum) | `selex:ikraft_villkor="den dag regeringen bestĂ€mmer"` | + +### Filtreringslogik + +`temporal/apply_temporal.py` implementerar följande regler för ett givet `target_date`: + +1. Sektioner med `selex:status="upphavd"` eller `"upphord"` → **tas bort helt** +2. Sektioner med `selex:upphor_datum <= target_date` → **tas bort helt** +3. Sektioner med `selex:ikraft_datum > target_date` → **tas bort helt** (ej ikrafttrĂ€tt Ă€nnu) +4. Sektioner med `selex:ikraft_datum <= target_date` → **behĂ„lls, temporal attribut tas bort** +5. Nestlade sektioner: Om överordnad sektion tas bort → alla underordnade tas ocksĂ„ bort + +## Konsekvenser + +### Positiva + +- **Bevarad semantik**: Temporal metadata följer med genom hela kedjan +- **Enkel parsing**: Standard regex kan extrahera `selex:*` attribut +- **Markdown-kompatibilitet**: Filerna Ă€r fortfarande lĂ€sbara Markdown (HTML i Markdown Ă€r standard) +- **Namnrymdsseparation**: `selex:`-prefix undviker kollisioner med andra attribut +- **Precision**: Distinkt hantering av olika temporala tillstĂ„nd +- **Testbarhet**: LĂ€tt att verifiera filtreringslogik med unit tests +- **ISO 8601-datum**: Standardiserat datumformat (`YYYY-MM-DD`) som Ă€r sorterbara och internationellt vedertagna + +### Negativa + +- **Custom schema**: Inte en etablerad standard som TEI eller Akoma Ntoso + - Mitigering: Dokumenterat schema, möjligt att konvertera till andra format senare +- **Markdown rendering**: Vissa Markdown-renderare visar attributen synligt + - Mitigering: I `md`-format rensas attributen bort, `md-markers` Ă€r för vidare bearbetning +- **Manuell synk**: Attributen mĂ„ste hĂ„llas konsistenta med kĂ€lldata (JSON frĂ„n Regeringskansliet) + - Mitigering: Automatisk generering frĂ„n JSON i `formatters/format_sfs_text.py` + +### Teknisk skuld + +- **Framtida standardisering**: Om juridisk XML-standard blir vedertagen (TEI, Akoma Ntoso) kan migration behövas +- **Valideringsschema**: Inget formellt XML-schema för `selex:`-attributen Ă€nnu + - ÅtgĂ€rd: ÖvervĂ€g JSON Schema eller XML Schema för validering i framtiden + +## Alternativ som övervĂ€gdes + +### 1. YAML frontmatter per sektion + +```markdown +--- +status: ikraft +ikraft_datum: 2025-01-01 +--- +#### 1 § +... +``` + +**Varför inte valt**: + +- Frontmatter Ă€r per-fil, inte per-sektion +- SvĂ„rare att parsa med regex +- Bryter Markdown-flödet + +### 2. Kommentarbaserad metadata + +```markdown + +#### 1 § +... +``` + +**Varför inte valt**: + +- Osynlig i vissa renderare (svĂ„rare att debugga) +- Ingen semantisk koppling mellan kommentar och innehĂ„ll +- SvĂ„rare att matcha sektion till metadata + +### 3. Standard HTML data-attribut + +```html +
+``` + +**Varför inte valt**: + +- `data-*` attribut Àr för custom application data, inte domain-specifik semantik +- Vi ville tydligt signalera att detta Àr Selex-specifik metadata + +### 4. TEI (Text Encoding Initiative) XML + +```xml +
+``` + +**Varför inte valt**: + +- Mycket tungt för vĂ„rt anvĂ€ndningsfall +- KrĂ€ver komplett XML-struktur, inte kompatibelt med Markdown +- Högre inlĂ€rningströskel + +## Relaterade beslut + +- [ADR-002](002-import-fran-regeringskansliet.md) - KĂ€lldata för temporal information + +## Noteringar + +- Implementationen finns i: + - `temporal/apply_temporal.py` - Filtreringslogik + - `formatters/format_sfs_text.py` - Generering av attribut frĂ„n JSON + - `temporal/title_temporal.py` - Temporal bearbetning av titlar +- Testad med 100+ författningar frĂ„n SFS +- Datumsystemet hanterar bĂ„de absoluta datum (ISO 8601) och villkor (text) diff --git a/docs/adr/002-import-fran-regeringskansliet.md b/docs/adr/002-import-fran-regeringskansliet.md new file mode 100644 index 0000000..4cce7a3 --- /dev/null +++ b/docs/adr/002-import-fran-regeringskansliet.md @@ -0,0 +1,142 @@ +# ADR-002: Import frĂ„n Regeringskansliet istĂ€llet för PDF-crawling + +## Status + +Accepterad + +## Kontext och problembeskrivning + +För att konvertera SFS-författningar till olika format behövde vi en kĂ€lldatakĂ€lla. Det finns tvĂ„ huvudsakliga alternativ för att fĂ„ tillgĂ„ng till författningstexter: + +1. **PDF-crawling**: Ladda ner publicerade PDF:er frĂ„n olika kĂ€llor och extrahera text +2. **Strukturerad data-import**: AnvĂ€nda API:er som tillhandahĂ„ller strukturerad data (JSON/XML) + +Utmaningarna med PDF-crawling: + +- Text extraction frĂ„n PDF Ă€r opĂ„litlig (tabeller, fotnoter, formatering gĂ„r förlorad) +- Ingen semantisk struktur (kapitel, paragrafer, rubriker mĂ„ste detekteras heuristiskt) +- Temporal metadata (ikrafttrĂ€dandedatum, upphĂ€vanden) finns inte i PDF:en +- OCR-fel vid scannade dokument +- Layout-beroende parsing (nĂ€r PDF-layouten Ă€ndras, bryts parsern) + +Alternativen för strukturerad data: + +- **Riksdagens API** (`data.riksdagen.se`) - XML-format, fokus pĂ„ riksdagsarbete +- **Regeringskansliets rĂ€ttsdatabas** (`beta.rkrattsbaser.gov.se`) - JSON via Elasticsearch API + +## Beslut + +Vi anvĂ€nder **Regeringskansliets Elasticsearch API** (`beta.rkrattsbaser.gov.se`) som primĂ€r kĂ€lldatakĂ€lla för SFS-författningar. + +### API-detaljer + +- **Endpoint**: `https://beta.rkrattsbaser.gov.se/elasticsearch/SearchEsByRawJson` +- **Format**: JSON via Elasticsearch queries +- **InnehĂ„ll**: FullstĂ€ndig författningstext med strukturerad metadata +- **Metadataexempel**: + - Beteckning (`2024:100`) + - Departement + - IkrafttrĂ€dandedatum + - Ändringshistorik + - Rubrikstruktur (avdelningar, kapitel, paragrafer) + +## Konsekvenser + +### Positiva + +- **Strukturerad data**: JSON med tydlig hierarki (avdelningar → kapitel → paragrafer) +- **Rik metadata**: Departement, datum, Ă€ndringshistorik inkluderad +- **Tillförlitlighet**: Officiell kĂ€lla frĂ„n Regeringskansliet +- **Automatisering**: Enkel att hĂ€mta via HTTP POST requests +- **Versionshantering**: Ändringsförfattningar och ursprungsdokument finns +- **Undviker PDF-problem**: Ingen text extraction, ingen OCR, ingen layout-parsing +- **Temporal data**: IkrafttrĂ€dande och upphĂ€vanden finns i metadata +- **Konsistent format**: Alla författningar i samma JSON-schema + +### Negativa + +- **Beta-status**: API:et Ă€r markerat som "beta", kan förĂ€ndras + - Mitigering: Versionshantering av downloader-skript, tester för att upptĂ€cka breaking changes +- **Ingen SLA**: Inget officiellt servicenivĂ„avtal eller versionsstöd + - Mitigering: Lokalt cachning av nedladdad JSON i `data/sfs_json/` +- **ProprietĂ€rt API**: Regeringskansliets eget format, inte en öppen standard + - Mitigering: Abstraktionslager i `downloaders/` gör byte av kĂ€lla möjligt +- **NĂ€tverksberoende**: KrĂ€ver internetanslutning för initial hĂ€mtning + - Mitigering: Offline-körning möjlig med lokalt cachad data + +### Tekniska konsekvenser + +- **Downloader-arkitektur**: Implementationen i `downloaders/rkrattsbaser_api.py` abstraherar API-anrop +- **Fallback**: `downloaders/riksdagen_api.py` finns som backup-kĂ€lla vid behov +- **Caching-strategi**: JSON sparas lokalt för att undvika upprepade API-anrop +- **Rate limiting**: Implementerad delay mellan requests för att respektera servern + +## Alternativ som övervĂ€gdes + +### 1. PDF-crawling frĂ„n Regeringskansliets webbplats + +**Varför inte valt**: + +- OpĂ„litlig text extraction +- Ingen strukturerad metadata +- KrĂ€ver komplex layout-parsing +- Temporal information mĂ„ste extraheras heuristiskt frĂ„n text +- Högre underhĂ„llskostnad nĂ€r PDF-format Ă€ndras + +### 2. Riksdagens API (data.riksdagen.se) + +```xml + + 2024:100 + ... + +``` + +**Fördelar**: + +- Officiellt API med stabil uptime +- XML-format + +**Varför inte valt**: + +- Fokus pĂ„ riksdagsarbete, inte konsoliderade författningar +- Mindre detaljerad metadata för författningar +- XML-parsing mer komplext Ă€n JSON +- Regeringskansliets data Ă€r mer författningsfokuserad + +**Notering**: Vi behĂ„ller `riksdagen_api.py` som fallback-kĂ€lla + +### 3. Scraping frĂ„n [svenskforfattningssamling.se](https://svenskforfattningssamling.se/) + +**Varför inte valt**: + +- Lagrummet.se aggregerar data frĂ„n andra kĂ€llor (sekundĂ€rkĂ€lla) +- Inget officiellt API +- Scraping kan bryta nĂ€r webbplatsen uppdateras + +## Relaterade beslut + +- [ADR-001](001-semantiska-temporal-taggar.md) - Temporal metadata kommer frĂ„n Regeringskansliets API + +## Noteringar + +- **Implementationer**: + - `downloaders/rkrattsbaser_api.py` - PrimĂ€r implementation + - `downloaders/riksdagen_api.py` - Backup-kĂ€lla + - `downloaders/download_sfs_docs.py` - CLI för att hĂ€mta författningar + +- **AnvĂ€ndning**: + + ```bash + # HĂ€mta specifik författning + python downloaders/download_sfs_docs.py --ids "2024:100" --source rkrattsbaser + + # HĂ€mta alla författningar + python downloaders/download_sfs_docs.py --ids all --source rkrattsbaser + ``` + +- **Caching**: Nedladdad JSON sparas i `data/sfs_json/` för offline-anvĂ€ndning + +- **Rate limiting**: Implementerad 1-sekunds delay mellan requests för att respektera servern + +- **Framtidsutsikter**: Om API:et tas bort eller Ă€ndras drastiskt kan vi falla tillbaka pĂ„ Riksdagens API eller implementera en hybrid-lösning diff --git a/docs/adr/README.md b/docs/adr/README.md new file mode 100644 index 0000000..b9ad491 --- /dev/null +++ b/docs/adr/README.md @@ -0,0 +1,33 @@ +# Architecture Decision Records (ADR) + +Denna katalog innehĂ„ller Architecture Decision Records (ADR) för sfs-processor projektet. + +## Vad Ă€r ADR? + +Architecture Decision Records Ă€r dokument som fĂ„ngar viktiga arkitektoniska beslut som fattats under projektets utveckling, tillsammans med kontexten och konsekvenserna av dessa beslut. + +## Format + +Vi anvĂ€nder [MADR](https://adr.github.io/madr/) (Markdown Any Decision Records) som mall för vĂ„ra ADR:er. Varje ADR följer denna struktur: + +- **Titel**: Kort beskrivning av beslutet +- **Status**: Föreslagen, Accepterad, Avvisad, eller FörĂ„ldrad +- **Kontext**: Bakgrund och problemstĂ€llning +- **Beslut**: Vad har vi bestĂ€mt +- **Konsekvenser**: Positiva och negativa effekter av beslutet + +## Index över ADR:er + +| ADR | Titel | Status | +|-----|-------|--------| +| [ADR-001](001-semantiska-temporal-taggar.md) | Semantiskt val av taggar för temporal data | Accepterad | +| [ADR-002](002-import-fran-regeringskansliet.md) | Import frĂ„n Regeringskansliet istĂ€llet för PDF-crawling | Accepterad | + +## Skapa en ny ADR + +NĂ€r du fattar ett nytt viktigt arkitektoniskt beslut: + +1. Skapa en ny fil med nĂ€sta nummer: `XXX-kort-beskrivning.md` +2. AnvĂ€nd MADR-mallen +3. Uppdatera index-tabellen ovan +4. Commit gĂ€rna filen tillsammans med koden som implementerar beslutet From 65cc655c2e0dfc94373c1118e283be661526792e Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Tue, 6 Jan 2026 17:54:31 +0100 Subject: [PATCH 2/5] Add ADR-003: Document Git commits with historical dates for version history --- docs/adr/003-git-commits-historiska-datum.md | 220 +++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 docs/adr/003-git-commits-historiska-datum.md diff --git a/docs/adr/003-git-commits-historiska-datum.md b/docs/adr/003-git-commits-historiska-datum.md new file mode 100644 index 0000000..6a792ad --- /dev/null +++ b/docs/adr/003-git-commits-historiska-datum.md @@ -0,0 +1,220 @@ +# ADR-003: Git-commits med historiska datum för versionshistorik + +## Status + +Accepterad + +## Kontext och problembeskrivning + +Lagstiftning har en inneboende temporal dimension - lagar stiftas, Ă€ndras och upphĂ€vs vid specifika datum. För att göra denna historik tillgĂ€nglig och navigerbar behövde vi ett sĂ€tt att representera hur en lag sĂ„g ut vid olika tidpunkter genom historien. + +Utmaningarna var: + +1. **Historisk representation**: Hur visar vi hur en lag sĂ„g ut 2010 vs 2024? +2. **Navigerbarhet**: AnvĂ€ndare ska kunna "scrolla" bakĂ„t i tiden +3. **Versionshantering**: Varje Ă€ndring ska vara spĂ„rbar med exakt datum +4. **Teknisk enkelhet**: Systemet ska vara lĂ€tt att förstĂ„ och anvĂ€nda +5. **Standardverktyg**: Helst undvika custom databaser eller proprietĂ€ra system + +Alternativen inkluderade: + +- Separata filer per version med datum i filnamn +- Databas med temporal data (PostgreSQL temporal tables) +- Custom versionshanteringssystem +- Git med manipulerade commit-datum + +## Beslut + +Vi anvĂ€nder **Git med backdated commits** dĂ€r varje författning och Ă€ndring fĂ„r en commit med det faktiska historiska datumet dĂ„ den trĂ€dde i kraft eller utfĂ€rdades. + +### Teknisk implementation + +**Miljövariabler för datum**: +```python +env = { + 'GIT_AUTHOR_DATE': '2010-01-01 12:00:00 +0100', + 'GIT_COMMITTER_DATE': '2010-01-01 12:00:00 +0100' +} +subprocess.run(['git', 'commit', '-m', message], env=env) +``` + +**Commit-strategi**: + +1. **Initial commit**: Skapas med `utfardadDateTime` (utfĂ€rdandedatum) + - InnehĂ„ller ursprungsversionen av författningen + - Temporal filtrering appliceras upp till utfĂ€rdandedatumet + +2. **Ändrings-commits**: Skapas med respektive `ikraft_datum` + - Varje Ă€ndring fĂ„r en separat commit + - Commiten visar hur lagen ser ut efter Ă€ndringen trĂ€tt i kraft + +3. **UpphĂ€vande-commits**: Skapas nĂ€r en författning upphĂ€vs + - Markerar nĂ€r en lag slutar gĂ€lla + +**Branch-struktur**: +- Commits skapas pĂ„ en dedikerad branch (t.ex. `git-export-YYYYMMDD`) +- Branch kan pushas till separat repository (`se-lex/sfs`) + +### Exempel pĂ„ commit-historik + +``` +2024-07-01 ✏ Ändra Lag (2010:100) - SFS 2024:500 +2023-01-01 ✏ Ändra Lag (2010:100) - SFS 2023:50 +2010-01-15 📜 Lag (2010:100) om exempel +``` + +NĂ€r man gör `git checkout ` fĂ„r man exakt hur lagen sĂ„g ut vid det datumet. + +## Konsekvenser + +### Positiva + +- **Git som tidsmaskin**: `git log --since="2015-01-01" --until="2016-01-01"` visar alla Ă€ndringar under ett Ă„r +- **Diff mellan versioner**: `git diff ` visar exakt vad som Ă€ndrats +- **Standardverktyg**: Alla Git-klienter fungerar (GitHub, GitLab, gitk, SourceTree, etc.) +- **Gratis hosting**: GitHub/GitLab tillhandahĂ„ller gratis hosting och webb-UI +- **Blame-funktion**: `git blame` visar exakt nĂ€r varje rad Ă€ndrades +- **Decentraliserat**: Varje klon innehĂ„ller hela historiken +- **Visuell representation**: GitHub/GitLab visar automatiskt commit-graf och tidslinje +- **API-tillgĂ„ng**: Git-hostar erbjuder REST API:er för att hĂ€mta historiska versioner + +### Negativa + +- **Okonventionell anvĂ€ndning**: Git Ă€r inte designat för backdated commits + - Mitigering: Tydlig dokumentation, separata branches för Git-export + +- **Commit-ordning**: Git sorterar efter commit-datum, inte nĂ€r commiten skapades + - Mitigering: Detta Ă€r faktiskt önskat beteende - vi vill ha kronologisk ordning + +- **Merge-komplexitet**: SvĂ„rt att merge:a historiska branches + - Mitigering: Git-export Ă€r en one-way operation, inget merging behövs + +- **Repository-storlek**: MĂ„nga commits kan göra repositoryt stort + - Mitigering: SFS har ~50 000 författningar, hanteras fint av Git + +- **Author vs Committer**: BĂ„da datum sĂ€tts till historiskt datum + - Mitigering: Konsekvent beteende, men metadata om faktiskt skapandedatum gĂ„r förlorad + +- **Duplicate-hantering**: Risk för dubbla commits med samma meddelande + - Mitigering: Implementerad check i `check_duplicate_commit_message()` + +### Tekniska konsekvenser + +- **Temporal processing**: Varje commit-punkt krĂ€ver temporal filtrering upp till det datumet +- **Branch-isolation**: Git-commits mĂ„ste ske pĂ„ dedikerad branch +- **Clean state**: Branchen rensas innan ny export (`remove_all_commits_on_branch`) +- **Performance**: Sekventiell processning av alla författningar tar tid + - Optimering: Batch-processing i `temporal_commits_batch_processor.py` + +## Alternativ som övervĂ€gdes + +### 1. Separata filer med datum i namn + +``` +2010-100/2010-01-15.md +2010-100/2023-01-01.md +2010-100/2024-07-01.md +``` + +**Varför inte valt**: + +- Ingen inbyggd diff-funktionalitet +- SvĂ„rt att navigera mellan versioner +- Ingen standardiserad tooling +- MĂ„ste bygga custom UI för att visa Ă€ndringar + +### 2. PostgreSQL temporal tables + +```sql +CREATE TABLE laws ( + id INT, + content TEXT, + valid_from DATE, + valid_to DATE +); +``` + +**Varför inte valt**: + +- KrĂ€ver databas-infrastruktur +- Mindre tillgĂ€ngligt för anvĂ€ndare (krĂ€ver SQL-kunskap) +- Ingen visuell representation utan custom UI +- SvĂ„rare att hosta och dela publikt + +### 3. Custom versionshanteringssystem + +**Varför inte valt**: + +- Reinventing the wheel +- MĂ„ste bygga all tooling frĂ„n grunden +- Ingen befintlig community eller ekosystem +- Högre underhĂ„llskostnad + +### 4. Git tags istĂ€llet för commits + +``` +git tag "2010-100-v1" +git tag "2010-100-v2" +``` + +**Varför inte valt**: + +- Tags visar inte temporal progression lika tydligt +- Inget naturligt sĂ€tt att se alla Ă€ndringar kronologiskt +- `git log` blir mindre anvĂ€ndbart +- Tags Ă€r metadata, inte innehĂ„ll + +### 5. Separata branches per författning + +``` +branches: 2010-100, 2010-101, 2010-102, ... +``` + +**Varför inte valt**: + +- 50 000+ branches blir ohanterbart +- SvĂ„rt att se alla lagĂ€ndringar kronologiskt +- Branch-explosion överbelastar Git-UI:s + +## Relaterade beslut + +- [ADR-001](001-semantiska-temporal-taggar.md) - Temporal metadata som driver commit-genereringen +- [ADR-002](002-import-fran-regeringskansliet.md) - KĂ€lldata för utfĂ€rdande- och ikrafttrĂ€dandedatum + +## Noteringar + +- **Implementationer**: + - `exporters/git/generate_commits.py` - Skapar initial och Ă€ndrings-commits + - `exporters/git/git_utils.py` - Git-operationer med `GIT_AUTHOR_DATE` och `GIT_COMMITTER_DATE` + - `exporters/git/temporal_commits_batch_processor.py` - Batch-processing för prestanda + +- **AnvĂ€ndning**: + + ```bash + # Exportera till Git med historiska commits + python sfs_processor.py --formats git --filter 2024 + + # Efter export, navigera i historiken + cd + git log --oneline --since="2020-01-01" + git show + git diff + ``` + +- **Output-repository**: https://github.com/se-lex/sfs + - InnehĂ„ller all SFS-lagstiftning med historiska commits + - Publikt tillgĂ€nglig för utvecklare och jurister + - API-Ă„tkomst via GitHub REST API + +- **Commit-meddelanden**: AnvĂ€nder emojis för att indikera typ av Ă€ndring + - 📜 Initial författning + - ✏ Ändring av författning + - đŸ—‘ïž UpphĂ€vande + +- **Performance**: ~50 000 författningar tar flera timmar att processa + - Optimering: Batch-processing, parallellisering övervĂ€gs + +- **Framtida förbĂ€ttringar**: + - Metadata-fil per commit för att bevara faktiskt skapandedatum + - Signerade commits för autenticitet + - Incremental updates istĂ€llet för full rebuild From 0815f9fb76fc01ab8e81662c161ca8e86bd332fe Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Tue, 6 Jan 2026 17:57:13 +0100 Subject: [PATCH 3/5] Add ADR-004: Markdown as intermediate format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documents the architectural decision to use Markdown as an intermediate format between JSON source data and all output formats (HTML, Git, Vector). Key points: - Single source of truth for parsing logic - Human-readable for code review and debugging - Standard tooling and ecosystem - Flexible for adding new output formats Also updates README.md to include both ADR-003 and ADR-004 in the index. đŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- docs/adr/004-markdown-som-mellanformat.md | 227 ++++++++++++++++++++++ docs/adr/README.md | 2 + 2 files changed, 229 insertions(+) create mode 100644 docs/adr/004-markdown-som-mellanformat.md diff --git a/docs/adr/004-markdown-som-mellanformat.md b/docs/adr/004-markdown-som-mellanformat.md new file mode 100644 index 0000000..06751a1 --- /dev/null +++ b/docs/adr/004-markdown-som-mellanformat.md @@ -0,0 +1,227 @@ +# ADR-004: Markdown som mellanformat + +## Status + +Accepterad + +## Kontext och problembeskrivning + +För att konvertera SFS-författningar frĂ„n kĂ€lldata (JSON) till olika output-format (HTML, Git, vektorembeddings) behövde vi vĂ€lja en arkitektur för dataflödet. + +Huvudalternativen var: + +1. **Direkt konvertering**: JSON → HTML, JSON → Git, JSON → Vector (separata pipelines) +2. **Mellanformat**: JSON → [Mellanformat] → (HTML/Git/Vector/etc) + +Utmaningarna var: + +- **Code duplication**: Varje exporter skulle behöva implementera samma parsing-logik +- **Konsistens**: Hur garantera att HTML-versionen och Git-versionen Ă€r identiska? +- **MĂ€nsklig lĂ€sbarhet**: Utvecklare och bidragsgivare mĂ„ste kunna granska output +- **Versionskontroll**: Ska mellan-representationen kunna versionshanteras? +- **Temporal processing**: Var i kedjan ska temporal filtrering appliceras? +- **UnderhĂ„llbarhet**: Ändringar i parsing-logik ska inte krĂ€va uppdateringar i alla exporters + +## Beslut + +Vi anvĂ€nder **Markdown med HTML-taggar** som mellanformat mellan JSON-kĂ€lldata och alla output-format. + +### Arkitektur + +``` +JSON (Regeringskansliet) + ↓ +[format_sfs_text_as_markdown] + ↓ +Markdown med
-taggar och selex:-attribut + ↓ +├─→ [apply_temporal] → Markdown (rent) → HTML +├─→ [apply_temporal] → Markdown (rent) → Git commits +├─→ [apply_temporal] → Markdown (rent) → Vector embeddings +└─→ Markdown (med taggar) → Publiceras som md-markers +``` + +### Varför Markdown? + +**MĂ€nsklig lĂ€sbarhet**: +```markdown +## 1 kap. Inledande bestĂ€mmelser + +### 1 § +Denna lag gĂ€ller för... +``` + +**Semantisk struktur** (behĂ„lls via HTML i Markdown): +```html +
+## 1 kap. Inledande bestÀmmelser +... +
+``` + +**Versionskontroll**: +- Markdown Ă€r text-baserat → perfekt för Git diff +- Granskare kan lĂ€sa Ă€ndringar direkt pĂ„ GitHub +- Merge conflicts Ă€r lĂ€sbara och lösbara + +### Implementation + +**Steg 1: JSON → Markdown** (`formatters/format_sfs_text.py`) +- Konverterar JSON-strukturen till Markdown-rubriker +- LĂ€gger till `
`-taggar med CSS-klasser +- Extraherar och annoterar temporal metadata som `selex:`-attribut + +**Steg 2: Markdown → Output-format** +- **HTML**: `markdown.markdown()` + custom extensions → HTML +- **Git**: Temporal filtrering + commit med markdown-filer +- **Vector**: Temporal filtrering + chunking + embedding +- **md-markers**: Ingen transformation (publiceras som Ă€r) + +## Konsekvenser + +### Positiva + +- **Single source of truth**: All parsing-logik finns pĂ„ ett stĂ€lle (`format_sfs_text.py`) +- **Konsistens**: Alla output-format utgĂ„r frĂ„n samma Markdown-representation +- **Granskning**: Pull requests visar Markdown-diff som Ă€r lĂ€sbar för mĂ€nniskor +- **Flexibilitet**: LĂ€tt att lĂ€gga till nya output-format + - Vill du ha PDF? Konvertera Markdown → PDF med pandoc + - Vill du ha EPUB? Markdown → EPUB med tooling +- **Standard tooling**: Markdown har enormt ekosystem (parsers, linters, previewers) +- **Hybrid format**: HTML-i-Markdown ger bĂ„de lĂ€sbarhet och semantik +- **Debug-vĂ€nligt**: Kan inspektera Markdown-filer manuellt vid problem +- **Cacheable**: Markdown-filer kan sparas och Ă„teranvĂ€ndas +- **Testbarhet**: Enkelt att skriva tester mot Markdown-output + +### Negativa + +- **Extra konverteringssteg**: JSON → Markdown → HTML tar mer tid Ă€n direkt JSON → HTML + - Mitigering: Prestandan Ă€r acceptabel, och flexibiliteten vĂ€ger tyngre + +- **HTML-i-Markdown komplexitet**: Inte alla Markdown-renderare hanterar HTML perfekt + - Mitigering: Vi anvĂ€nder beprövade bibliotek (`markdown` för Python) + +- **Temporal metadata i HTML-attribut**: Okonventionellt för Markdown + - Mitigering: Dokumenterat i ADR-001, fungerar i praktiken + +- **TvĂ„ Markdown-varianter**: `md-markers` (med taggar) vs `md` (rent) + - Mitigering: Tydlig separation, olika anvĂ€ndningsfall + +### Tekniska konsekvenser + +- **Format-specificering**: `--formats md-markers` vs `--formats md` + - `md-markers`: Bevarar all metadata, för vidare processing + - `md`: Rendad version efter temporal filtrering + +- **Temporal processing**: Sker EFTER Markdown-generering + - Markdown → `apply_temporal(target_date)` → Rendad Markdown + +- **Lazy evaluation**: Temporal filtrering kan postponas till senare + - `md-markers` sparar alla möjligheter öppna + +## Alternativ som övervĂ€gdes + +### 1. Direkt JSON → HTML/Git/Vector + +**Fördelar**: +- Snabbare (fĂ€rre steg) +- Enklare arkitektur + +**Varför inte valt**: +- Code duplication: Varje exporter mĂ„ste parsa JSON +- Konsistensproblem: Olika exporters kan tolka JSON olika +- Ingen human-readable mellanrepresentation +- SvĂ„rt att granska output (JSON Ă€r inte lĂ€sbart som Markdown) + +### 2. XML som mellanformat (TEI eller custom) + +```xml + + + Inledande bestĂ€mmelser + + Denna lag gĂ€ller... + + + +``` + +**Fördelar**: +- Strikt struktur med validering +- Etablerad standard (TEI) inom juridisk text + +**Varför inte valt**: +- Mindre lĂ€sbart för mĂ€nniskor +- Högre inlĂ€rningströskel +- Mindre ekosystem Ă€n Markdown +- SvĂ„rare att granska i pull requests +- Overkill för vĂ„rt anvĂ€ndningsfall + +### 3. JSON som mellanformat (normaliserad struktur) + +**Varför inte valt**: +- Inte mĂ€nskligt lĂ€sbart +- SvĂ„rt att versionskontrollera (JSON diff Ă€r svĂ„rlĂ€st) +- Inget naturligt sĂ€tt att representera flytande text med rubriker + +### 4. AST (Abstract Syntax Tree) + +```python +{ + "type": "document", + "children": [ + {"type": "chapter", "number": "1", "heading": "..."}, + {"type": "paragraph", "number": "1", "content": "..."} + ] +} +``` + +**Varför inte valt**: +- Rent programmatiskt format, inte lĂ€sbart +- MĂ„ste serialiseras för att inspekteras +- Ingen standard representation +- Kan inte versionskontrolleras meningsfullt + +## Relaterade beslut + +- [ADR-001](001-semantiska-temporal-taggar.md) - Selex-attribut i Markdown +- [ADR-003](003-git-commits-historiska-datum.md) - Markdown-filer committas till Git + +## Noteringar + +- **Implementationer**: + - `formatters/format_sfs_text.py` - JSON → Markdown konvertering + - `formatters/frontmatter_manager.py` - YAML frontmatter i Markdown + - `temporal/apply_temporal.py` - Temporal filtrering av Markdown + - `exporters/html/html_export.py` - Markdown → HTML med `markdown.markdown()` + - `exporters/vector/chunking.py` - Markdown → Chunks för embeddings + +- **Markdown flavor**: CommonMark-kompatibel med HTML-extension + - Rubriker: Standard Markdown (`##`, `###`, `####`) + - Paragrafer: Standard Markdown (dubbla radbrytningar) + - Semantik: HTML `
` och `
` taggar + - Links: Standard Markdown-lĂ€nkar + auto-linking + +- **Frontmatter**: YAML frontmatter för metadata + ```yaml + --- + beteckning: "2024:100" + rubrik: "Lag om exempel" + ikraft_datum: "2025-01-01" + --- + ``` + +- **Fördelar med tvĂ„ varianter**: + - **md-markers**: För vidare processing, AI-analys, temporal queries + - **md**: För publicering, lĂ€sning, GitHub Pages + +- **Future-proof**: Om nya output-format behövs (PDF, DOCX, LaTeX): + - AnvĂ€nd befintlig Markdown → Konvertera med standard tooling + - Ingen Ă€ndring i core parsing-logik behövs + +- **Exempel pĂ„ Markdown-ekosystem som vi drar nytta av**: + - `python-markdown`: Markdown → HTML konvertering + - GitHub/GitLab: Automatisk rendering av `.md` filer + - Markdown linters: Kvalitetskontroll av output + - Markdown previewers: Live-förhandsvisning under utveckling + - Pandoc: Potentiell framtida konvertering till andra format diff --git a/docs/adr/README.md b/docs/adr/README.md index b9ad491..5ce99fd 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -22,6 +22,8 @@ Vi anvĂ€nder [MADR](https://adr.github.io/madr/) (Markdown Any Decision Records) |-----|-------|--------| | [ADR-001](001-semantiska-temporal-taggar.md) | Semantiskt val av taggar för temporal data | Accepterad | | [ADR-002](002-import-fran-regeringskansliet.md) | Import frĂ„n Regeringskansliet istĂ€llet för PDF-crawling | Accepterad | +| [ADR-003](003-git-commits-historiska-datum.md) | Git-commits med historiska datum för versionshistorik | Accepterad | +| [ADR-004](004-markdown-som-mellanformat.md) | Markdown som mellanformat | Accepterad | ## Skapa en ny ADR From 54e4afe869d88a4649fd425ab3e0808923982e37 Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Wed, 7 Jan 2026 10:16:23 +0100 Subject: [PATCH 4/5] Renumber ADRs: Swap ADR-001 and ADR-004 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move "Markdown som mellanformat" to ADR-001 (from ADR-004) and "Semantiskt val av taggar för temporal data" to ADR-004 (from ADR-001). Markdown as intermediate format is a more foundational architectural decision that other decisions build upon, so it makes sense to have it as ADR-001. All cross-references in ADR-002, ADR-003, and within the documents have been updated accordingly. đŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- ...som-mellanformat.md => 001-markdown-som-mellanformat.md} | 6 +++--- docs/adr/002-import-fran-regeringskansliet.md | 2 +- docs/adr/003-git-commits-historiska-datum.md | 2 +- ...temporal-taggar.md => 004-semantiska-temporal-taggar.md} | 2 +- docs/adr/README.md | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename docs/adr/{004-markdown-som-mellanformat.md => 001-markdown-som-mellanformat.md} (97%) rename docs/adr/{001-semantiska-temporal-taggar.md => 004-semantiska-temporal-taggar.md} (99%) diff --git a/docs/adr/004-markdown-som-mellanformat.md b/docs/adr/001-markdown-som-mellanformat.md similarity index 97% rename from docs/adr/004-markdown-som-mellanformat.md rename to docs/adr/001-markdown-som-mellanformat.md index 06751a1..580c9ac 100644 --- a/docs/adr/004-markdown-som-mellanformat.md +++ b/docs/adr/001-markdown-som-mellanformat.md @@ -1,4 +1,4 @@ -# ADR-004: Markdown som mellanformat +# ADR-001: Markdown som mellanformat ## Status @@ -102,7 +102,7 @@ Denna lag gĂ€ller för... - Mitigering: Vi anvĂ€nder beprövade bibliotek (`markdown` för Python) - **Temporal metadata i HTML-attribut**: Okonventionellt för Markdown - - Mitigering: Dokumenterat i ADR-001, fungerar i praktiken + - Mitigering: Dokumenterat i ADR-004, fungerar i praktiken - **TvĂ„ Markdown-varianter**: `md-markers` (med taggar) vs `md` (rent) - Mitigering: Tydlig separation, olika anvĂ€ndningsfall @@ -184,7 +184,7 @@ Denna lag gĂ€ller för... ## Relaterade beslut -- [ADR-001](001-semantiska-temporal-taggar.md) - Selex-attribut i Markdown +- [ADR-004](004-semantiska-temporal-taggar.md) - Selex-attribut i Markdown - [ADR-003](003-git-commits-historiska-datum.md) - Markdown-filer committas till Git ## Noteringar diff --git a/docs/adr/002-import-fran-regeringskansliet.md b/docs/adr/002-import-fran-regeringskansliet.md index 4cce7a3..ef1e469 100644 --- a/docs/adr/002-import-fran-regeringskansliet.md +++ b/docs/adr/002-import-fran-regeringskansliet.md @@ -116,7 +116,7 @@ Vi anvĂ€nder **Regeringskansliets Elasticsearch API** (`beta.rkrattsbaser.gov.se ## Relaterade beslut -- [ADR-001](001-semantiska-temporal-taggar.md) - Temporal metadata kommer frĂ„n Regeringskansliets API +- [ADR-004](004-semantiska-temporal-taggar.md) - Temporal metadata kommer frĂ„n Regeringskansliets API ## Noteringar diff --git a/docs/adr/003-git-commits-historiska-datum.md b/docs/adr/003-git-commits-historiska-datum.md index 6a792ad..d2c37cb 100644 --- a/docs/adr/003-git-commits-historiska-datum.md +++ b/docs/adr/003-git-commits-historiska-datum.md @@ -178,7 +178,7 @@ branches: 2010-100, 2010-101, 2010-102, ... ## Relaterade beslut -- [ADR-001](001-semantiska-temporal-taggar.md) - Temporal metadata som driver commit-genereringen +- [ADR-004](004-semantiska-temporal-taggar.md) - Temporal metadata som driver commit-genereringen - [ADR-002](002-import-fran-regeringskansliet.md) - KĂ€lldata för utfĂ€rdande- och ikrafttrĂ€dandedatum ## Noteringar diff --git a/docs/adr/001-semantiska-temporal-taggar.md b/docs/adr/004-semantiska-temporal-taggar.md similarity index 99% rename from docs/adr/001-semantiska-temporal-taggar.md rename to docs/adr/004-semantiska-temporal-taggar.md index ef1b769..d275c1f 100644 --- a/docs/adr/001-semantiska-temporal-taggar.md +++ b/docs/adr/004-semantiska-temporal-taggar.md @@ -1,4 +1,4 @@ -# ADR-001: Semantiskt val av taggar för temporal data +# ADR-004: Semantiskt val av taggar för temporal data ## Status diff --git a/docs/adr/README.md b/docs/adr/README.md index 5ce99fd..48af0ad 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -20,10 +20,10 @@ Vi anvĂ€nder [MADR](https://adr.github.io/madr/) (Markdown Any Decision Records) | ADR | Titel | Status | |-----|-------|--------| -| [ADR-001](001-semantiska-temporal-taggar.md) | Semantiskt val av taggar för temporal data | Accepterad | +| [ADR-001](001-markdown-som-mellanformat.md) | Markdown som mellanformat | Accepterad | | [ADR-002](002-import-fran-regeringskansliet.md) | Import frĂ„n Regeringskansliet istĂ€llet för PDF-crawling | Accepterad | | [ADR-003](003-git-commits-historiska-datum.md) | Git-commits med historiska datum för versionshistorik | Accepterad | -| [ADR-004](004-markdown-som-mellanformat.md) | Markdown som mellanformat | Accepterad | +| [ADR-004](004-semantiska-temporal-taggar.md) | Semantiskt val av taggar för temporal data | Accepterad | ## Skapa en ny ADR From 3d864766de92a2be05ddd77a1c2c1a96c9e5c42e Mon Sep 17 00:00:00 2001 From: Martin Carlsson Date: Wed, 7 Jan 2026 10:20:41 +0100 Subject: [PATCH 5/5] =?UTF-8?q?Replace=20'lag/lagar'=20with=20'f=C3=B6rfat?= =?UTF-8?q?tning/f=C3=B6rfattningar'=20in=20ADR=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update terminology throughout ADR documentation to consistently use 'författning/författningar' instead of 'lag/lagar'. This is more technically accurate as SFS (Svensk författningssamling) contains various types of legal instruments, not just laws. Changes: - ADR-001: Updated examples in Markdown and XML code blocks - ADR-003: Updated all references to legal instruments and examples - ADR-004: Updated description of temporal functionality đŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- docs/adr/001-markdown-som-mellanformat.md | 6 +++--- docs/adr/002-import-fran-regeringskansliet.md | 1 - docs/adr/003-git-commits-historiska-datum.md | 16 ++++++++-------- docs/adr/004-semantiska-temporal-taggar.md | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/docs/adr/001-markdown-som-mellanformat.md b/docs/adr/001-markdown-som-mellanformat.md index 580c9ac..a66b297 100644 --- a/docs/adr/001-markdown-som-mellanformat.md +++ b/docs/adr/001-markdown-som-mellanformat.md @@ -48,7 +48,7 @@ Markdown med
-taggar och selex:-attribut ## 1 kap. Inledande bestĂ€mmelser ### 1 § -Denna lag gĂ€ller för... +Denna författning gĂ€ller för... ``` **Semantisk struktur** (behĂ„lls via HTML i Markdown): @@ -140,7 +140,7 @@ Denna lag gĂ€ller för... Inledande bestĂ€mmelser - Denna lag gĂ€ller... + Denna författning gĂ€ller... @@ -206,7 +206,7 @@ Denna lag gĂ€ller för... ```yaml --- beteckning: "2024:100" - rubrik: "Lag om exempel" + rubrik: "Författning om exempel" ikraft_datum: "2025-01-01" --- ``` diff --git a/docs/adr/002-import-fran-regeringskansliet.md b/docs/adr/002-import-fran-regeringskansliet.md index ef1e469..7392289 100644 --- a/docs/adr/002-import-fran-regeringskansliet.md +++ b/docs/adr/002-import-fran-regeringskansliet.md @@ -110,7 +110,6 @@ Vi anvĂ€nder **Regeringskansliets Elasticsearch API** (`beta.rkrattsbaser.gov.se **Varför inte valt**: -- Lagrummet.se aggregerar data frĂ„n andra kĂ€llor (sekundĂ€rkĂ€lla) - Inget officiellt API - Scraping kan bryta nĂ€r webbplatsen uppdateras diff --git a/docs/adr/003-git-commits-historiska-datum.md b/docs/adr/003-git-commits-historiska-datum.md index d2c37cb..0a73aa8 100644 --- a/docs/adr/003-git-commits-historiska-datum.md +++ b/docs/adr/003-git-commits-historiska-datum.md @@ -6,11 +6,11 @@ Accepterad ## Kontext och problembeskrivning -Lagstiftning har en inneboende temporal dimension - lagar stiftas, Ă€ndras och upphĂ€vs vid specifika datum. För att göra denna historik tillgĂ€nglig och navigerbar behövde vi ett sĂ€tt att representera hur en lag sĂ„g ut vid olika tidpunkter genom historien. +Lagstiftning har en inneboende temporal dimension - författningar stiftas, Ă€ndras och upphĂ€vs vid specifika datum. För att göra denna historik tillgĂ€nglig och navigerbar behövde vi ett sĂ€tt att representera hur en författning sĂ„g ut vid olika tidpunkter genom historien. Utmaningarna var: -1. **Historisk representation**: Hur visar vi hur en lag sĂ„g ut 2010 vs 2024? +1. **Historisk representation**: Hur visar vi hur en författning sĂ„g ut 2010 vs 2024? 2. **Navigerbarhet**: AnvĂ€ndare ska kunna "scrolla" bakĂ„t i tiden 3. **Versionshantering**: Varje Ă€ndring ska vara spĂ„rbar med exakt datum 4. **Teknisk enkelhet**: Systemet ska vara lĂ€tt att förstĂ„ och anvĂ€nda @@ -46,10 +46,10 @@ subprocess.run(['git', 'commit', '-m', message], env=env) 2. **Ändrings-commits**: Skapas med respektive `ikraft_datum` - Varje Ă€ndring fĂ„r en separat commit - - Commiten visar hur lagen ser ut efter Ă€ndringen trĂ€tt i kraft + - Commiten visar hur författningen ser ut efter Ă€ndringen trĂ€tt i kraft 3. **UpphĂ€vande-commits**: Skapas nĂ€r en författning upphĂ€vs - - Markerar nĂ€r en lag slutar gĂ€lla + - Markerar nĂ€r en författning slutar gĂ€lla **Branch-struktur**: - Commits skapas pĂ„ en dedikerad branch (t.ex. `git-export-YYYYMMDD`) @@ -58,12 +58,12 @@ subprocess.run(['git', 'commit', '-m', message], env=env) ### Exempel pĂ„ commit-historik ``` -2024-07-01 ✏ Ändra Lag (2010:100) - SFS 2024:500 -2023-01-01 ✏ Ändra Lag (2010:100) - SFS 2023:50 -2010-01-15 📜 Lag (2010:100) om exempel +2024-07-01 ✏ Ändra SFS 2010:100 - SFS 2024:500 +2023-01-01 ✏ Ändra SFS 2010:100 - SFS 2023:50 +2010-01-15 📜 SFS 2010:100 om exempel ``` -NĂ€r man gör `git checkout ` fĂ„r man exakt hur lagen sĂ„g ut vid det datumet. +NĂ€r man gör `git checkout ` fĂ„r man exakt hur författningen sĂ„g ut vid det datumet. ## Konsekvenser diff --git a/docs/adr/004-semantiska-temporal-taggar.md b/docs/adr/004-semantiska-temporal-taggar.md index d275c1f..b6a816a 100644 --- a/docs/adr/004-semantiska-temporal-taggar.md +++ b/docs/adr/004-semantiska-temporal-taggar.md @@ -8,7 +8,7 @@ Accepterad Författningar i SFS förĂ€ndras över tid - paragrafer trĂ€der i kraft vid olika datum, upphĂ€vs, eller Ă€ndras. För att korrekt kunna: -- Visa hur en lag sĂ„g ut vid ett specifikt datum +- Visa hur en författning sĂ„g ut vid ett specifikt datum - Filtrera bort upphĂ€vda bestĂ€mmelser - Hantera ikrafttrĂ€danderegler - Skapa historiska versioner i Git