ED02 - Das KMU-Organisationsmodell: Tenants, Sphären, Rollen
Problem
Ein Unternehmer gründet eine Organisation - und steht vor der Frage: Wie strukturiere ich meine Organisation, dass Compliance-Pflichten sauber getrennt, nachvollziehbar und revisionssicher abgebildet werden?
Die heutige Praxis im KMU-Bereich kennt keine saubere Trennung:
- Alles in einem Topf - private und geschäftliche Unterlagen vermischen sich in einem Postfach, einem Laufwerk, einem Cloud-Account.
- Keine Tenant-Trennung - eine Holding mit mehreren Gesellschaften führt alle Bücher in einer Instanz, ohne dass klar ist, welche Aufzeichnung zu welcher Gesellschaft gehört.
- Keine Sphären-Trennung - bei Gemeinnützigkeit vermischen sich ideelle, vermögensverwaltende, zweckbetriebliche und wirtschaftliche Vorgänge in einem Konto, einem Ordner, einem Repo.
- Keine Rollen-Trennung - der Unternehmer macht alles selbst (GF, Buchhalter, Lohn, F&E), aber das Repo weiß nicht, in welcher Rolle er gerade handelt.
- Keine klare Identität - Aufzeichnungen haben keinen eindeutigen Identifikator, der sie einer Organisation, einer Sphäre, einer Rolle zuordnet.
Kernaussage
Eine Organisation als GitCover-Verbund zu strukturieren bedeutet: Tenant (Organisation), Sphäre (Tätigkeitsbereich bei Gemeinnützigkeit) und Rolle (Funktion des Akteurs) werden als Pflichtfelder jedes Artefakts definiert - nicht als optionale Metadaten. Git-Hooks prüfen bei jedem Commit, dass die Trennung vollständig ist. So entsteht Compliance by Design: Die Struktur der Organisation ist in der Struktur des Repos verankert.
Compliance by Design: Tenant, Sphäre und Rolle sind keine nachträglichen Etiketten - sie sind strukturelle Pflichtfelder, ohne die ein Artefakt nicht in das Repo aufgenommen wird.
Das Drei-Ebenen-Modell: Tenant, Sphäre, Rolle
(Beleg, Tagebucheintrag, Grundbuch-Eintrag)"] A --> T["Tenant
Welche Organisation?"] A --> S["Sphäre
Welcher Tätigkeitsbereich?
(nur gemeinnützig)"] A --> R["Rolle
In welcher Funktion handelt der Akteur?"] T --> T1["ORG-1 (KMU)"] T --> T2["ORG-1a (Tochter)"] T --> T3["ORG-1b (Tochter)"] S --> S1["ideell"] S --> S2["vermögensverwaltend"] S --> S3["zweckbetrieblich"] S --> S4["wirtschaftlich"] R --> R1["GF (Geschäftsführer)"] R --> R2["Buchhalter"] R --> R3["Lohnverantwortlicher"] R --> R4["F&E-Leiter"] R --> R5["Administrator"] style A fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style T fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style S fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style R fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style T1 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style T2 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style T3 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style S1 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style S2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style S3 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style S4 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style R1 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R3 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R4 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R5 fill:#FDBA74,stroke:#C2410C,color:#0F1B33
Ebene 1 - Tenant (Organisation)
Ein Tenant ist eine rechtlich selbständige Organisationseinheit, für die eigene Aufzeichnungspflichten bestehen. Im GitCover-Verbund wird jeder Tenant als eigene Organization (Git User) mit zugeordneten Git-Repos (oder eigener Branch-Namespace) geführt.
| Tenant-Typ | Beispiel (Platzhalter) | Eigene Pflichten |
|---|---|---|
| Einzelunternehmen | ORG-1 (KMU) |
GoBD, AO, E-Rechnung |
| Holding mit Töchtern | ORG-1 (Holding), ORG-1a/ORG-1b (Töchter) |
Je Gesellschaft eigene Buchführung, eigener Jahresabschluss |
| Gemeinnützige Organisation | ORG-1 (gemeinnützig) |
Zusätzlich: Sphären-Trennung, § 52 AO, VBG-Freistellung |
| Konsortium / Verbund | ORG-1, ORG-2, ORG-3 |
Je Organisation eigener Tenant, Querverweise über V7GUID |
Praxis-Beispiel: Ein Unternehmer (
E1) führt eine Holding (ORG-1) mit zwei Töchtern (ORG-1a,ORG-1b). Jede Tochter ist ein eigener Tenant mit eigenem Repo. Die Holding hat ein Meta-Repo, das die Töchter über V7GUID-Referenzen verknüpft - aber die Bücher der Töchter bleiben getrennt.
Ebene 2 - Sphäre (Tätigkeitsbereich, nur bei Gemeinnützigkeit)
Die Sphäre ist nur bei gemeinnützigen Organisationen relevant - aber dann zwingend. Das Steuerrecht (§ 51–68 AO) verlangt die Trennung der vier Sphären, um die Gemeinnützigkeit nicht zu gefährden.
| Sphäre | Bedeutung | Beispiel |
|---|---|---|
| ideell | Zweckbetrieb im Sinne der Satzung, steuerfrei | Workshop-Reihe, Bildungsangebot |
| vermögensverwaltend | Verwaltung des Stiftungsvermögens, steuerfrei | Zinsen aus Anlagen, Mieteinnahmen |
| zweckbetrieblich | Wirtschaftlicher Geschäftsbetrieb, der den Zweck erfüllt, steuerfrei (§ 65 AO) | Mitgliedsbeiträge, Aufnahmegebühren |
| wirtschaftlich | Wirtschaftlicher Geschäftsbetrieb, der nicht den Zweck erfüllt, steuerpflichtig | Merchandising, Werbeeinnahmen |
steuerfrei
§ 52 AO"] V --> VV["vermögensverwaltend
steuerfrei"] V --> Z["zweckbetrieblich
steuerfrei
§ 65 AO"] V --> W["wirtschaftlich
steuerpflichtig
§ 64 AO"] I --> F["Freibetrag
§ 3 Nr. 26/26a EStG"] Z --> F W --> ST["USt/KSt
pflichtig"] style V fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style I fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style VV fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style Z fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style W fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style F fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style ST fill:#FDBA74,stroke:#C2410C,color:#0F1B33
Risiko bei fehlender Sphären-Trennung: Vermögensmischung (§ 55 Abs. 1 Nr. 5 AO) ist ein Aberkennungsgrund für die Gemeinnützigkeit. Eine gemeinnützige Organisation, die wirtschaftliche und ideelle Vorgänge nicht trennt, riskiert die Aberkennung des gemeinnützigen Status - und damit Nachversteuerung der Rücklagen (bis zu 15(!) Jahre rückwirkend).
Ebene 3 - Rolle (Funktion des Akteurs)
Die Rolle dokumentiert, in welcher Funktion ein Akteur gehandelt hat. Das ist wichtig, weil in vielen Organisationen oft eine Person mehrere Rollen innehat (besonders bei KMU) - und weil die Rolle bestimmt, welche Pflichten greifen.
| Rolle | Funktion | Typische Pflichten |
|---|---|---|
| GF (Geschäftsführer) | Vertretung nach außen, Gesamtverantwortung | GoBD, AO, Fristen, Vertretungsmacht |
| Buchhalter | Buchführung, Belegarchiv | GoBD, E-Rechnung, Aufbewahrung |
| Lohnverantwortlicher | Lohnabrechnung, SV-Meldungen | SGB IV, DEÜV, LStDV |
| F&E-Leiter | Forschung, FZul-Stundennachweise | FZulG, BSFZ, F&E vs. Verwaltung |
| Administrator | Repo-Verwaltung, Hooks, Zugriffe | Git, GPG, Zugriffsrechte |
Praxis-Beispiel: Der Unternehmer
E1ist gleichzeitig GF, Buchhalter, Forscher, Entwickler und F&E-Leiter. Im Repo wird bei jedem Artefakt dokumentiert, in welcher Rolle er gehandelt hat - z. B.role: "GF"bei einem Beschluss,role: "F&E-Leiter"bei einem FZul-Stundennachweis. So bleibt nachvollziehbar, ob eine Aufzeichnung aus der GF-Perspektive (Verwaltung) oder der F&E-Perspektive (Forschung) entstand.
Rolle ist nicht Person: Die Rolle beschreibt die Funktion (und bei Erklärungen die vertretene Partei), nicht die Identität. Dieselbe Person kann an einem Dokument in mehreren Rollen handeln oder zeichnen; die technische Ausführungsidentität (Konto, Schlüssel) ist wieder eine eigene Ebene. Die fünf Ebenen Person · Funktion · vertretene Partei · Ausführungsidentität · Signaturhandlung sind in ED03 beschrieben.
Umsetzung im Git-Repo
Verzeichnisstruktur
ORG-1/ # Tenant: KMU
├── .gitcover/ # GitCover-Konfiguration
│ ├── LEGAL_ENTITY.gc.json # Tenant-Identität (V7GUID)
│ ├── dictionaries/ # Sphären, Rollen, Beleg-Typen
│ └── schemas/ # JSON-Schemata für Artefakte
├── diary/ # Tagebuch (SSoT)
│ ├── entries/ # Tages-Einträge
│ └── tenants/ # Tenant-Sichten (Symlinks)
├── registry/ # Behörden-Identifikatoren
├── sources/ # Belegarchiv (PDF, XML, EML)
├── sidecars/ # .gc.md Sidecars
├── checks/ # Fristen-Check, Sphären-Check
└── {weitere bei Bedarf}/
JSON-Artefakt mit Tenant, Sphäre, Rolle
Jedes Artefakt (Tagebucheintrag, Beleg, Grundbuch-Eintrag) enthält
Tenant, Sphäre und Rolle als Pflichtfelder. Zentrales Kernprinzip der
temporalen Nachvollziehbarkeit: Die Erfassungszeit ist kein separates
Feld, sondern in der uuidV7 selbst verankert - als 48-Bit-Zeitstempel
gemäß RFC 9562 §5.7. Die uuidV7 kann aus einer vorgegebenen Zeitmarke
(nicht nur now()) via GitCover Helper (gc-v7guid) generiert werden, der Rest mit
Zufall aufgefüllt. Damit ist die Erfassungszeit kryptographisch mit der
Identität des Artefakts verknüpft und nicht nachträglich änderbar.
Wichtig - Was im Git-Repo landet: Nur diese strukturierten Artefakte (JSON-Einträge, Sidecars, Belege) werden ins Git-Repo aufgenommen. Private Dokumente werden nie ins Repo aufgenommen, sofern sie nicht ausdrücklich als Artefakt eingeführt und klassifiziert wurden. Was einmal drin ist, ist drin.
{
"$schema": "https://gitcover.org/schemas/diary-entry-1.0.schema.json",
"V7GUID": "<V7GUID-Class-aus-Registry>",
"docUid": "<uuidV7-Object-mit-vorgegebener-Zeitmarke>",
"author": "E1",
"role": "GF",
"tenant": "ORG-1",
"sphere": "ideell",
"source": "E1",
"source_sha256": "<SHA-256-...>",
"tags": ["lohnabrechnung", "sv-meldung"]
}
Erläuterung Composite Key:
V7GUID(Class Identifier) klassifiziert das Dokument/die Action anhand der.gitcoverRegistry (was/welcher Typ).uuidV7(Object ID) ist der konkrete Objekt-Identifikator mit der vorgegebenen Zeitmarke (RFC 9562 §5.7, 48-Bit Unix-ms). Beide zusammen bilden den GCPN Sidecar Composite KeyV7GUID:uuidV7. Eine separatedatetime- oderdate-String-Darstellung ist redundant und wird nicht in den Fakten geführt - der 48-Bit-Zeitstempel steckt bereits in deruuidV7. String-Darstellungen für DTO/HTMX-Transfer sind Harness-Verantwortung, nicht Fakten-Ebene.
Git-Hooks prüfen die Trennung
vorhanden?"} P1 -->|nein| R1["Commit abgelehnt
Tenant fehlt"] P1 -->|ja| P2{"Sphäre
vorhanden?
(nur gemeinnützig)"} P2 -->|nein| R2["Commit abgelehnt
Sphäre fehlt"] P2 -->|ja| P3{"Rolle
vorhanden?"} P3 -->|nein| R3["Commit abgelehnt
Rolle fehlt"] P3 -->|ja| P4{"Sphäre
gültig?"} P4 -->|nein| R4["Commit abgelehnt
ungültige Sphäre"] P4 -->|ja| OK["Commit akzeptiert"] style C fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style H1 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P1 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P2 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P3 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P4 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style R1 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R3 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R4 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style OK fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
| Hook | Prüfung | Fehler bei |
|---|---|---|
| Pre-Commit | tenant-Feld vorhanden und gültig |
Fehlendes oder unbekanntes Tenant |
| Pre-Commit | sphere-Feld vorhanden (nur gemeinnützig) |
Fehlende Sphäre bei gemeinnützigem Tenant |
| Pre-Commit | sphere-Wert gültig (ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich) |
Ungültiger Sphären-Wert |
| Pre-Commit | role-Feld vorhanden und gültig |
Fehlende oder unbekannte Rolle |
| Post-Commit | Auto-Index-Generierung pro Tenant und Sphäre | - |
Tenant-Verbund: Mehrere Organisationen
Meta-Repo"] H --> R1["ORG-1a (Tochter 1)
eigenes Repo"] H --> R2["ORG-1b (Tochter 2)
eigenes Repo"] H --> R3["ORG-1c (Tochter 3)
eigenes Repo"] R1 --> V1["V7GUID-Referenz
auf ORG-1"] R2 --> V2["V7GUID-Referenz
auf ORG-1"] R3 --> V3["V7GUID-Referenz
auf ORG-1"] H --> M["Meta-Repo
Querverweise über V7GUID
keine Buchungen"] style H fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style R1 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style R2 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style R3 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style V1 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style V2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style V3 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style M fill:#10A987,stroke:#0A7F5C,color:#FBFAF7
Ein Tenant-Verbund (Holding mit Töchtern, Konsortium) wird über V7GUID-Referenzen verknüpft - nicht über gemeinsame Repos. Jeder Tenant behält seine eigene Buchführung, aber das Meta-Repo der Holding kann auf Belege und Einträge der Töchter verweisen, ohne sie zu kopieren.
Wichtig: Das Meta-Repo enthält keine Buchungen - nur Querverweise. Die Buchführung bleibt bei jedem Tenant. Das Meta-Repo ist eine Index-Ebene, keine Buchhaltungsebene.
Risiko-Leverage
| Heute (cheap) | Morgen (revisionssicher) | Risiko gemindert |
|---|---|---|
tenant-Feld pro Artefakt |
Klare Zuordnung bei Holding-Prüfung | Vermögensmischung zwischen Gesellschaften |
sphere-Feld pro Eintrag |
Gemeinnützigkeits-Status verteidigt | Aberkennung § 55 AO (Vermögensmischung) |
role-Feld pro Eintrag |
Nachvollziehbar, in welcher Funktion gehandelt wurde | Rollenkonflikt, unberechtigte Vertretung |
| Pre-Commit-Hook prüft Sphäre | Sphären-Trennung lückenlos | manuelle Sphären-Fehler |
| V7GUID-Referenz statt Kopie | Eindeutige Zuordnung ohne Duplikate | Inkonsistenz bei Kopien |
Harness-Anforderung (Vorschau)
Aus ED02 ableitbar:
| ID | Anforderung | Priorität |
|---|---|---|
| FA-1.4 | Tenant-Zuordnung (tenant: "ORG-1") pro Eintrag |
MUST |
| FA-3.1 | Sphären-Tags: ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich |
MUST (gemeinnützig) |
| FA-3.2 | Sphären-Tag Pflicht pro Grundbuch-Eintrag und Diary-Eintrag | MUST (gemeinnützig) |
| FA-3.3 | Pre-Commit-Hook prüft Sphären-Tag-Vollständigkeit | MUST (gemeinnützig) |
| TA-2.3 | Pre-Commit-Hook: Sphären-Tag-Prüfung (nur gemeinnützig) | MUST (gemeinnützig) |
| FA-1.3 | V7GUID pro Eintrag (Tenant-übergreifende Eindeutigkeit) | MUST |
Die vollständige Anforderungsliste in Harness-Anforderungen.md.
Quellen
- AO (§§ 51–68 - Gemeinnützigkeit, Sphären-Trennung, § 55 Abs. 1 Nr. 5 - Vermögensmischung)
- EStG (§ 3 Nr. 26/26a - Pauschalen, Sphären-Bezug)
- GoBD (BMF-Schreiben, Verfahrensdokumentation, Tenant-Trennung)
E1/agents/(anonymisiert) - SSoT-Konzept mit Tenant, Sphäre, Rolle
Quellen-Topologie und CDN-Referenz-Links
| Rolle | Ort | Zweck |
|---|---|---|
| Primary / SSoT | git.gitcover.org/GCC | Kanonische Ablage (GPG-signiert, versioniert) |
| Public OSS Mirror / CDN | codeberg.org/gitcover-commons | Read-only-Spiegel; FLOSS-Discovery |
| Community Hub | github.com/gitcover-commons | Issues & Discussions; Quell-Code-Referenz auf Codeberg |
Hinweis: Diese Zuordnung von Quellen, Mirror und Community-Hub spiegelt den aktuellen Stand wider und kann sich ändern. Bitte prüfen Sie die jeweilige kanonische Quelle auf gitcover.org für den aktuellen Zustand.