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 eigenes Git-Repo (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.
Umsetzung im Git-Repo
Verzeichnisstruktur
ORG-1/ # Tenant: KMU
├── .gitcover/ # GitCover-Konfiguration
│ ├── LEGAL_ENTITY.v7g.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/ # .v7g.md Sidecars
└── checks/ # Fristen-Check, Sphären-Check
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 wird aus einer vorgegebenen Zeitmarke
(nicht now()) via GitCover Helper (UuidV7Gen) generiert, 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.
{
"$schema": "https://gitcover.org/schemas/diary-entry-1.0.schema.json",
"V7GUID": "<V7GUID-Class-aus-Registry>",
"uuidV7": "<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)
AFJD/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.