Rules as Code · GovTech EUPL-1.2 Open Source v1.2.0

Gesetz als Code —
lesbar für Fachexperten,
ausführbar für Systeme.

FinDSL ist eine domänenspezifische Sprache für die deutsche Finanzverwaltung. Steuerlogik wird mit deutschen Schlüsselwörtern und direktem Paragraphenbezug formuliert — lesbar für die Fachseite, nicht nur für die IT.

Jede Regel wird mit prüfe bit-genau gegen einen Referenz-Interpreter getestet: grün heißt, die Quelle ist mit dem Gesetz konsistent.

Aus genau dieser einen Quelle entstehen ausführbarer Code (Java, TypeScript, JavaScript) und vollständige Dokumentation (Markdown, HTML, PDF) — automatisch und ohne Drift zwischen Recht, Code und Dokumentation.

1 Gesetz EStG · § 32a Abs. 1
2 FinDSL · Quelle grundtarif.findsl
@Quelle("§ 32a Absatz 1 EStG")fn EstGrundtarif(zve: Euro): Euro = wähle { falls zve < 0 als Euro -> abbruch("§ 32a Absatz 1 EStG: zu versteuerndes Einkommen darf nicht negativ sein (zvE=${zve})") falls zve < GFB + 1 -> 0 falls zve < ZONE_2_OBERGRENZE + 1 -> { var y: Dezimal = (zve - GFB) / ZEHNTAUSEND var roh: Dezimal = (ZONE_2_PROGRESSION * y + ZONE_2_LINEAR) * y roh.abrunden() als Euro } falls zve < ZONE_3_OBERGRENZE + 1 -> { var z: Dezimal = (zve - ZONE_2_OBERGRENZE) / ZEHNTAUSEND var roh: Dezimal = (ZONE_3_PROGRESSION * z + ZONE_3_LINEAR) * z + ZONE_3_KONSTANTE roh.abrunden() als Euro } falls zve < ZONE_4_OBERGRENZE + 1 -> (ZONE_4_SATZ * zve - ZONE_4_ABZUG).abrunden() sonst -> (ZONE_5_SATZ * zve - ZONE_5_ABZUG).abrunden()}
3 Geprüft & generiert 4 / 4 bestanden
EstGrundtarif(12.348)= 0 €
EstGrundtarif(15.000)= 435 €
EstGrundtarif(50.000)= 10.548 €
EstGrundtarif(100.000)= 30.864 €
Java TypeScript JavaScript Markdown HTML PDF PAP
1Domain-spezifische Sprache
deutsche Schlüsselwörter, ein Quelltext
3Ziel-Targets (Code)
Java · TypeScript · JavaScript
4Dokumentationsformate
Markdown · HTML · PDF · PAP
100 %auditierbar
Quelle → Code → Dokumentation → Test
Das Problem

Steuerrecht wird heute mehrfach geschrieben — und schwer in Einklang gehalten.

Zwischen Paragraph, Programmcode und Bescheid liegen mehrere Übersetzungsschritte. Sie kosten Zeit, lassen die Quellen auseinanderdriften und erschweren die Nachvollziehbarkeit der Berechnung. Im laufenden Betrieb ist deshalb oft schwer zu belegen, dass das System dem aktuellen Rechtsstand entspricht.

Dokumentation driftet vom Code

Was im Gesetz steht, was im Code steht und was in der Dokumentation steht, läuft mit der Zeit auseinander. Welche Fassung verbindlich ist, lässt sich im Alltag schwer belegen.

Schwer lesbar für Fachexperten

Steuerliche Logik wird in eine Programmiersprache übersetzt — für Sachbearbeiter:innen ohne Code-Hintergrund kaum nachvollziehbar. Die fachliche Prüfung verschiebt sich in die IT.

Tests prüfen nicht das Gesetz

Unit-Tests prüfen den Code gegen erwartete Werte, nicht gegen die amtliche Berechnungsvorschrift. Abweichungen fallen oft erst auf, wenn sie im Bescheid landen.

Vendor-Lock-in & Kostenrisiko

Proprietäre Plattformen binden Verwaltungen langfristig. Migrationen werden zu eigenen Großprojekten und sind in der Praxis aufwendig.

Heutiger Workflow
📜  Gesetzestext  — manuelle Übersetzung →
👩‍💻  Code (eigenständig gepflegt)
↳ separat geschrieben
📑  Dokumentation (driftet)
↳ separat geschrieben
🧪  Tests (prüfen nicht das Gesetz)

Mit FinDSL
📜  Gesetzestext
↓ einmal in FinDSL geschrieben
✓  FinDSL-Quelle (lesbar, geprüft)
↓ automatisch generiert
 ⚙️ Code
 📑 Dokumentation
 🧪 Tests
 🔀 PAP
Die Idee · Rules as Code

Eine Quelle. Lesbar, prüfbar, ausführbar.

FinDSL ist eine Sprache, in der Steuerregeln so geschrieben werden, wie das Gesetz sie formuliert — und gleichzeitig direkt vom Computer ausgeführt werden können. Aus dieser einen Quelle entstehen automatisch Programmcode, Tests und Dokumentation. Was im Gesetz steht, was die Software ausführt und was am Ende im Bescheid landet, bleibt damit konsistent — nachvollziehbar für die Fachseite, prüfbar für die IT und auditierbar für die Revision.

„Gesetz als Code“ ist keine deutsche Erfindung — sondern eine international etablierte Bewegung, an die FinDSL anschließt.

OECD Cracking the Code — Rules as Code als Brücke zwischen Recht und Verwaltung.
NZ Gov Better Rules — maschinenlesbare Sozialgesetze in Neuseeland.
EU / FR OpenFisca — Frankreichs offene Steuer- und Sozialsimulation.
DE Digitaltauglichkeit, OZG, Registermodernisierung — derselbe rote Faden.
01

Lesbar wie Gesetz

Deutsche Schlüsselwörter, Paragraphenbezug, kein C-Style. Wer das Gesetz versteht, versteht die Quelle.

02

Prüfbar wie ein Test

prüfe-Blöcke laufen bit-genau gegen einen Referenz-Interpreter. Grün = mit dem Gesetz konsistent.

03

Ausführbar wie Software

Aus derselben Quelle: Java, TypeScript, JavaScript sowie Dokumentation als Markdown, HTML und PDF. Kein handgeschriebener Code mehr.

So funktioniert es

Schreiben. Prüfen. Generieren.

Drei Schritte im Code-Editor — die gleichen drei Schritte, die auch im Playground passieren. Jeder Schritt ist sichtbar, rückverfolgbar und an einen Paragraphen gekoppelt.

01 · Schreiben

Editor mit Gesetzesbezug

VS Code-Extension mit FinDSL-Syntax. Hover zeigt den passenden Paragraphen, Inlay-Hints den Geltungsbereich.

// est.findsl
fn EstGrundtarif(zve: Euro) = wähle {
falls zve < GFB + 1 -> 0
falls zve < ZONE_2_OBERGRENZE + 1 -> {
var y = (zve GFB) / ZEHNTAUSEND zve: Euro zu versteuerndes Einkommen § 32a Abs. 1 EStG
(ZONE_2_PROGRESSION · y + ZONE_2_LINEAR) · y
}
sonst ->
}
02 · Prüfen

Grüne Play-Pfeile

Jeder prüfe-Block ist ein klickbarer Testfall. Der Referenz-Interpreter rechnet bit-genau — grün = bestanden, rot = Abweichung mit Diff.

// prüfe-Block · testfall
testfall "Zone 1" EstGrundtarif(12.348) == 0
testfall "Zone 2" EstGrundtarif(15.000) == 435
testfall "Zone 3" EstGrundtarif(50.000) == 10.548
testfall "Zone 4" EstGrundtarif(100.000) == 30.864
✓ 4 / 4 bestanden · 8 ms
03 · Generieren

Eine Quelle, viele Artefakte

Code in Java, TypeScript und JavaScript sowie Dokumentation als Markdown, HTML und PDF — autonom erzeugt und versioniert. Kein Drift, kein Handcode.

// gen/ · auto-generiert
javaEstGrundtarif.java1.6 KB
tsEstGrundtarif.ts1.0 KB
jsEstGrundtarif.js0.9 KB
mdest-grundtarif.md3.2 KB
htmlest-grundtarif.html12 KB
pdfest-grundtarif.pdf86 KB
↻ synchron mit Quelle · vor 2 s
Schreiben mit KI Neu in 1.1.0

Sprich Steuerrecht.
Bekomme FinDSL.

Der findsl-author-Skill verwandelt eine formlose Beschreibung in Alltagssprache oder einen §-Auszug in ein vollständig getestetes FinDSL-Modul. Installiert in Claude Code, OpenCode oder Codex — verifiziert durch findsl parse und findsl test, nicht durch Versprechen.

Du · Pfad A

„Lohnsteuer ist 14 % vom Brutto, davor 10.000 € Freibetrag pro Jahr, mindestens 0, auf volle Euro abrunden."

Du · Pfad B

§ 11 Abs. 1 Satz 3 GewStG: „Der Gewerbeertrag ist auf volle 100 Euro nach unten abzurunden."

Mach mir eine kleine FinDSL-Funktion daraus.

findsl-author
--
# § 11 Abs. 1 Satz 3 GewStG — Gewerbeertrag abrunden.
--

-- Rundungsstufe nach § 11 Abs. 1 Satz 3 GewStG. --
@Quelle("§ 11 Absatz 1 Satz 3 GewStG")
konst RUNDUNGSSTUFE: Euro = 100

-- Rundet den Gewerbeertrag auf volle 100 € ab. --
@Quelle("§ 11 Absatz 1 Satz 3 GewStG")
fn RundeGewerbeertragAb(ertrag: Euro): Euro =
    ertrag.abrundenAuf(RUNDUNGSSTUFE)
findsl parse → keine Diagnosen

Bei fehlenden Angaben fragt der Skill gezielt zurück, statt eine Annahme zu verstecken — und dokumentiert jede getroffene Annahme sichtbar im Modul-Doc-Block.

In Visual Studio Code

Syntax-Highlighting. Inlay Hints. Live-Diagnose.

Die FinDSL-Erweiterung macht aus dem Editor eine echte Werkbank: Schlüsselwörter farbig, berechnete Zwischenwerte inline eingeblendet, Fehler sofort im Code markiert — Fachlogik schreibt sich wie Software.

Volle Editor-Unterstützung über die FinDSL-Erweiterung: Syntax-Highlighting, Inlay Hints mit Zwischenwerten, Diagnose direkt im Code.
Was FinDSL erzeugt

Eine Quelle. Sechs Artefakte. Immer synchron.

Jede Generierung ist deterministisch und versionsfest. Der Build-Output landet im Repo, ist diff-bar und unterschriftsfähig.

@Generated(value = "findsl.Generator")
class EstImpl implements Est {
public Euro estGrundtarif(Euro zve) {
if (zve.compareValue(GFB) <= 0) {
return Euro.von(FinDslNumber.ganzzahl("0"));
}
// … Zonen 2–5 (§ 32a Abs. 1)
}
}
.java

Java für die JVM

Interface + Impl für Bestandssysteme. Festkomma-Arithmetik (FinDslNumber/BigDecimal), JUnit-Tests aus den prüfe-Blöcken, Javadoc aus @Quelle.

// Generiert aus FinDSL — nicht editieren
import { Euro, FinDslNumber } from "./runtime/index.js";
 
export function estGrundtarif(zve: Euro): Euro {
if (zve.compareValue(GFB) <= 0) {
return Euro.von(FinDslNumber.ganzzahl("0"));
}
// … Zonen 2–5
}
.ts / .js

TypeScript & JavaScript

Typsichere Wrapper (Euro, Prozent) auf decimal.js-Basis — bit-genau wie Java. Läuft im Browser und in Node, ideal für Web-Rechner.

zvE zvE ≤ GFB 0 € Tarif ja nein
.pap

Programmablaufplan (PAP)

DIN-66001-naher Ablaufplan als Mermaid-Markdown oder self-contained HTML — eine Funktion ergibt ein Diagramm. Experimentell.

# Einkommensteuer-Grundtarif
 
> Quelle: § 32a Abs. 1 EStG
 
Die tarifliche ESt bemisst sich …
 
| zvE | ESt |
| --- | --- |
| ≤ 12.348 | 0 € |
.md

Markdown-Dokumentation

Aus den Doc-Kommentaren aggregierte Markdown-Dateien — versionierbar, diff-bar und Grundlage für die HTML- und PDF-Ausgabe.

FinDSL · Dokumentationsauszug
Einkommensteuer-Grundtarif
§ 32a Abs. 1 EStG
Die tarifliche ESt bemisst sich nach dem zu versteuernden Einkommen und beträgt:
EstGrundtarif(zvE) = 0   für zvE ≤ 12.348
EstGrundtarif(zvE) = (914,51·y+1.400)·y
mit y = (zvE−12.348) / 10.000
.pdf

PDF-Dokumentation mit Formeln

Editorial gesetzte Berechnungsvorschrift mit echten Formeln, Paragraphenbezug und prüfe-Verifikation.

<article class="findsl-doc">
<h1>Einkommensteuer-Grundtarif</h1>
<p class="quelle">§ 32a EStG</p>
<!-- Tarif-Tabelle -->
<table class="tarif"></table>
</article>
.html

HTML-Dokumentation

Bundessteuerblatt-ähnliches Layout aus den Markdown-Doc-Kommentaren — direkt im Web einbindbar, aus derselben Quelle wie das PDF.

Kommandozeile · CLI

Vom Quelltext zum Artefakt — ein Befehl.

Das findsl-CLI deckt den ganzen Weg ab: parsen und prüfen, Code in Java, TypeScript oder JavaScript erzeugen, Dokumentation in mehreren Formaten generieren. Reproduzierbar und skriptbar — ideal für die CI.

Code generieren

codegen

Deterministisch Java, TypeScript oder JavaScript aus einer Quelle — inklusive JUnit-Tests aus den prüfe-Blöcken.

$ findsl codegen examples/est --lang java
→ EstGrundtarif.java + JUnit-Tests
$ findsl codegen examples/est --lang ts

Dokumentation erzeugen

docgen

Bundessteuerblatt-nahe Dokumentation mit KaTeX-Formeln — als Markdown, HTML oder PDF, einzeln oder alle Formate auf einmal.

$ findsl docgen examples/est --format all
→ doc.md · doc.html · doc.pdf
$ findsl docgen examples --format pdf

Parsen & Tests

parse · test

Syntax und Typen prüfen, dann die prüfe-Blöcke bit-genau gegen den Referenz-Interpreter ausführen.

$ findsl parse examples/est/est.findsl
erfolgreich geparst, keine Diagnosen
$ findsl test examples/est
alle prüfe-Fälle bestanden

Programmablaufpläne

papgen experimentell

DIN-66001-nahe Ablaufpläne als Mermaid-Markdown oder self-contained HTML — eine fn ergibt ein Diagramm.

$ findsl papgen examples/est --format html
→ papgen.html · klickbare Links
$ findsl papgen examples --detail voll

Alle Befehle und Optionen in der Dokumentation.

Für wen?

Drei Perspektiven, eine Quelle.

FinDSL bedient die drei Personen, die ein Verwaltungsprojekt erfolgreich machen müssen — und ihre jeweiligen Sorgen sind unterschiedlich. Die Quelle bleibt für alle dieselbe.

Sb
Sachbearbeiter:in · Fachreferent:in
„Kann ich das lesen — und stimmt es mit dem Gesetz überein?“
  • Deutsche Schlüsselwörter — keine Programmiersprache lernen
  • Hover zeigt direkt den Paragraphen
  • prüfe-Block macht Konsistenz mit Gesetz sichtbar
  • Sie behalten die fachliche Kontrolle, nicht die IT
IT
IT / Projektleitung
„Wartbar, integrierbar, sicher, auditierbar — und kein Lock-in.“
  • Standard-Output: Java (JVM) sowie TypeScript & JavaScript — keine exotische Runtime
  • Dokumentation, Code und Tests aus derselben Quelle — kein Drift
  • Open Source (EUPL-1.2), läuft air-gapped, auditierbar
  • Generate sind deterministisch und reproduzierbar
BMF
Ministerium · Entscheider:in
„Schafft das Rechtssicherheit und passt zur Digitalstrategie?“
  • Rules-as-Code — internationaler Standard (OECD, NZ, FR)
  • Schließt die Lücke Paragraph ↔ Bescheid messbar
  • Geringeres Projektrisiko durch nachvollziehbare Generate
  • Anschluss an OZG, Digitaltauglichkeit, Registermodernisierung
Vertrauen & Offenheit

Harte Argumente fürs Vergaberecht.

Was eine deutsche Finanzverwaltung von einem System verlangt — und wie FinDSL es heute schon erfüllt.

Lizenz

EUPL-1.2 · Open Source

Europäische Public Licence — kompatibel mit nationalem Vergaberecht. Quellcode öffentlich auf GitHub.

Barrierefrei

BITV 2.0 · WCAG 2.1 AA

Volle Tastatur- und Screenreader-Bedienung.

Standards

Standard-JVM & Web, kein Lock-in

Generierter Java-Code läuft auf jedem OpenJDK; TypeScript und JavaScript im Browser und in Node. Keine proprietäre Runtime, kein Cloud-Zwang, kein Vendor.