Przejdź do treści

Jak czytać prawo jako git

Każda ustawa w korpusie to jeden plik Markdown. Cała jej historia legislacyjna jest zapisana w historii git tego pliku. Korpus liczy dziś 131 ustaw, 18 224 commity — w tym 1 393 scalenia (merge), każde w dniu wejścia w życie nowelizacji — i 904 gałęzie.

Pełna historia nowelizacji

git log -p pliku ustawy to jej kompletna historia zmian — każdy diff to dokładna zmiana w brzmieniu przepisu. Sama oś czasu obowiązywania — jeden wpis na nowelizację (lub jej etap wejścia w życie), każdy z datą wejścia w życie — to git log --first-parent, bo każda nowelizacja jest osobnym merge'em na main:

git clone https://git.sedzia.ai/sejm/prawostanowienie.git
cd prawostanowienie
git log --first-parent --oneline ustawy/2018/0305-*.md   # kiedy co weszło w życie
git log -p ustawy/2018/0305-*.md                         # co dokładnie się zmieniło

W przeglądarce ten sam widok znajdziesz, otwierając plik ustawy w korpusie i wybierając History / Blame na forge (serwisie git.sedzia.ai).

Co przepis stanowił danego dnia

Każdy commit nosi datę historyczną zdarzenia (a nie datę wygenerowania). Dlatego, żeby zobaczyć, co ustawa stanowiła 15 czerwca 2023 r., wystarczy cofnąć jej oś czasu do tamtego dnia:

f=$(git ls-files 'ustawy/2018/0305-*.md')
sha=$(git rev-list -1 --first-parent --before='2023-06-15 23:59' main -- "$f")

git show "$sha:$f"        # pełny tekst ustawy w brzmieniu z 15 czerwca 2023 r.
git blame "$sha" -- "$f"  # która nowelizacja nadała każdej linii to brzmienie i kiedy

Dwie rzeczy warto wiedzieć. --first-parent -- "$f" jest konieczne: main zawiera po kolei historie wszystkich ustaw, więc bez zawężenia do pliku dostaniesz commit innej ustawy. A 23:59 — bo commity noszą godzinę 12:00 UTC, a samą datę bez godziny git uzupełnia bieżącą godziną zegara, więc wynik zależałby od pory dnia i strefy czasowej, w której uruchamiasz polecenie.

Akty wchodzące w życie etapami

Wszystkie etapy jednej nowelizacji („część wchodząca w życie…”) są scalone obok siebie, w kolejności aktów, nie dat. Dla daty przypadającej między etapami tekst może więc już zawierać etap późniejszy. Korpus jest w tym miejscu wierny grafowi, nie kalendarzowi — o tym, dlaczego nie da się tego do końca naprawić, opowiada esej.

Model gałęzi

Gałąź Znaczenie Dziś
main tekst obowiązujący (skonsolidowany) — z wierzchołkiem (tip) w przyszłości, bo scalenia noszą datę wejścia w życie także wtedy, gdy ta dopiero nadejdzie 1
nowelizacja/DU-RRRR-NNNN[-k] nowelizacja, która weszła (lub wejdzie) w życie: merge --no-ff w dniu wejścia w życie; -k numeruje etapy aktu wchodzącego w życie w kilku terminach 818
w-toku/termN-drukM projekt procedowany w Sejmie w dniu wygenerowania korpusu (2 września 2026 r.); nie jest aktualizowany na bieżąco 29
odrzucone/*, wycofane/*, niezakonczone/* projekty, które nie weszły w życie: odrzucone w głosowaniu, wycofane przez wnioskodawcę albo takie, które przepadły z końcem kadencji (zasada dyskontynuacji) 2 odrzucone, 5 wycofanych, 49 niezakończonych

Los projektu silnik wywodzi z etapów procesu w API Sejmu. Etap „Wycofano” bez formalnej decyzji nie jest jeszcze rozpoznawany, więc część projektów wycofanych figuruje na razie jako w toku albo niezakończone — sprawdzaj opis ostatniego commita.

Najdalsza data wejścia w życie w korpusie to 10 stycznia 2030 r. Korpus wie więc nie tylko, co obowiązuje, ale i co już zostało uchwalone, a jeszcze nie obowiązuje; strony korpusu pokazują brzmienie na dziś i wskazują najbliższą zaplanowaną zmianę.

Głosowania

Commity III czytania niosą wynik głosowania wprost w opisie — numer głosowania, liczby i temat:

III czytanie na posiedzeniu Sejmu — uchwalono

Posiedzenie Sejmu nr 54
Głosowanie #51: za 257, przeciw 0, wstrzym. 174, nieob. 29 (głosowało 431)
  temat: głosowanie nad całością projektu.

Silnik potrafi zapisać także imienne głosy posłów — jako trailery w commicie scalenia (wejścia w życie), z trwałą tożsamością każdego posła (tryb --rollcall). Opisuje to esej „Głosowanie w git”. W bieżącej generacji korpusu tej warstwy nie ma (miała ją poprzednia, zachowana pod tagami archiwum/gen-2026-07-27/*).