ED06 - GoBD Procedure Documentation: Mandatory Fields, Versioning, Release
Problem
GoBD Rz. 64-91 requires a procedure documentation - but in the SME sector it is the great exception:
- "What is a procedure documentation?" - most entrepreneurs do not know the term, let alone the content
- "The tax advisor does that" - many believe the StB creates the procedure documentation - but he can only guide, the entrepreneur must create and maintain it himself
- Word document in the desk - if a procedure documentation exists, it is a static Word document that is not updated when systems change - GoBD violation
- No versioning - changes to the procedure documentation are not documented traceably - but GoBD Rz. 83 requires currency and traceability
- No release - the procedure documentation is never "released" - but GoBD requires the state at the time of audit to be clear
- System change not documented - when migrating to new software the procedure documentation is not continued - GoBD Rz. 146-150 requires this explicitly
Core Statement
A GoBD-compliant procedure documentation in the Git repo means:
- The procedure documentation is a versioned Git artifact - not a Word document, but Markdown + JSON in the repo
- Every change is traceable -
git logshows Who, When, What, Why (commit author,uuidV7timestamp, diff, commit message) - Release via tags - a Git tag marks the released
state of the procedure documentation (e.g.
vd-v1.0-2026) - System changes are continued - on migration a new commit with justification is created, the old version remains traceable
- The repo itself is part of the procedure documentation -
git logshows the procedure,.gitcover/schemas/shows the data structures, Git hooks show the controls
Compliance by Design: The procedure documentation is not retroactive - it emerges through the use of Git. Anyone working with Git repositories documents their procedure automatically through commits, diffs and tags. The formal procedure documentation complements this with the human-readable description.
What is a procedure documentation?
(GoBD Rz. 64–91)"] VD --> V["Verfahren
(Wie wird gebucht?)"] VD --> S["Systemumgebung
(Welche Software/Hardware?)"] VD --> O["Organisation
(Wer macht was?)"] VD --> K["Kontrollen
(Wie wird geprüft?)"] VD --> D["Daten
(Welche Formate/Strukturen?)"] V --> G["Git-Repo
(Commits, Hooks)"] S --> G O --> G K --> G D --> G style VD fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style V fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style S fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style O fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style K fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style D fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style G fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
| GoBD requirement | Content | How Git fulfills it |
|---|---|---|
| Procedure (Rz. 64-71) | Description of the accounting procedure | git log shows every step; commit messages document justification |
| System environment (Rz. 72-76) | Software, hardware, versions | .gitcover/ with schemas, dictionaries; git config shows settings |
| Organization (Rz. 77-80) | Responsibilities, roles, permissions | role field per artifact; git log --author shows responsibility |
| Controls (Rz. 81-85) | Internal controls, plausibility checks | Pre-commit hooks (schema, spheres, obsolescence); post-commit hooks (index) |
| Data (Rz. 86-91) | Data structures, formats, interfaces | JSON schemas in .gitcover/schemas/; sidecars with v7g_taxonomy |
Mandatory fields of the procedure documentation
Structure in the Git repo
ORG-1/
├── .gitcover/
│ ├── schemas/ # Data structures (Rz. 86-91)
│ │ ├── diary-entry-1.0.schema.json
│ │ ├── v7g-sidecar-1.0.schema.json
│ │ └── timesheet-1.0.schema.json
│ ├── dictionaries/ # Classifications (Rz. 86-91)
│ │ ├── spheres.json
│ │ ├── roles.json
│ │ └── beleg-types.json
│ └── LEGAL_ENTITY.v7g.json # Tenant identity
├── docs/
│ └── verfahrensdokumentation/
│ ├── README.md # Entry + overview
│ ├── 01-verfahren.md # Accounting procedure (Rz. 64-71)
│ ├── 02-systemumgebung.md # Software/hardware (Rz. 72-76)
│ ├── 03-organisation.md # Responsibilities (Rz. 77-80)
│ ├── 04-kontrollen.md # Internal controls (Rz. 81-85)
│ └── 05-daten.md # Data structures (Rz. 86-91)
└── .githooks/
├── pre-commit # Controls (Rz. 81-85)
└── post-commit # Index generation
Procedure documentation as JSON artifact
The procedure documentation itself is a versioned artifact with
V7GUID (Class) and uuidV7 (Object ID as DocID):
{
"$schema": "https://gitcover.org/schemas/verfahrensdoku-1.0.schema.json",
"V7GUID": "<V7GUID-Class-aus-Registry>",
"uuidV7": "<uuidV7-Object-mit-vorgegebener-Zeitmarke>",
"author": "E1",
"role": "GF",
"tenant": "ORG-1",
"sphere": "wirtschaftlich",
"source": "E1",
"version": "1.0",
"status": "released",
"sections": ["01-verfahren", "02-systemumgebung", "03-organisation", "04-kontrollen", "05-daten"]
}
Note: The
uuidV7is the DocID of the procedure documentation. The composite keyV7GUID:uuidV7serves the storage organization and DB query. No separatedatetime/datefield - the time is contained in theuuidV7.
Versioning and release
Commit 1"] E --> R["Review
Commit 2 (Änderungen)"] R --> F["Freigabe
Tag: vd-v1.0-2026"] F --> P["Produktiv
Stand v1.0"] P --> A["Änderung nötig
(z. B. Systemwechsel)"] A --> E2["Entwurf v2.0
Commit 3"] E2 --> R2["Review v2.0"] R2 --> F2["Freigabe
Tag: vd-v2.0-2027"] F2 --> P2["Produktiv
Stand v2.0"] F -.-> OBS["obsolescence:
v1.0 → superseded by v2.0"] style E fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style F fill:#10A987,stroke:#0A7F5C,color:#FBFAF7 style P fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style A fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style E2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style F2 fill:#10A987,stroke:#0A7F5C,color:#FBFAF7 style P2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style OBS fill:#E5E7EB,stroke:#6B7280,color:#0F1B33
| Phase | Git operation | GoBD reference |
|---|---|---|
| Draft | Commit on main (or feature branch) |
Rz. 83 (currency) |
| Review | Further commits with changes | Rz. 83 (traceability) |
| Release | git tag vd-v1.0-2026 |
Rz. 83 (binding state) |
| Productive | Tag is immutable (protected) | Rz. 146 (immutability) |
| Change | New commits + new tag | Rz. 146-150 (system change) |
| Obsolescence | Old version obsolescence: superseded_by |
Rz. 146 (traceability) |
Important - tags as release markers: A Git tag is immutable
- it marks an exact commit state that cannot be changed retroactively. This corresponds to GoBD Rz. 146 (immutability). The auditor can reconstruct the exact state of the procedure documentation at the time of audit with
git show vd-v1.0-2026.
System change and migration (GoBD Rz. 146-150)
(z. B. Cloud-Lohn)"] A --> M["Migration
Commit mit Begründung"] M --> N["Neues System
(z. B. Git-Cover)"] A --> DA["Daten alt
git bundle
(self-contained)"] N --> DN["Daten neu
Git-Repo
(fortgeführt)"] M --> VD["Verfahrensdoku
fortgeschrieben
+ Commit-Message
mit Begründung"] style A fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style M fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style N fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style DA fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style DN fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style VD fill:#10A987,stroke:#0A7F5C,color:#FBFAF7
GoBD Rz. 146-150 requires on system change:
- Keep data of the old system available -
git bundleas self-contained archive (no cloud account needed, see ED04 Z3) - Continue procedure documentation - new commit with justification: "Migration from cloud payroll to GitCover, date, role"
- Document transition period - which data was migrated how, which checks were performed
- Mark old version as obsolete -
obsolescence: superseded_byin the old procedure documentation artifact
Practical example: The entrepreneur (
E1) migrates from a cloud payroll software to GitCover. He creates agit bundleof the old data, continues the procedure documentation (new commit with commit message "Migration to GitCover, 260815, role: GF"), marks the old version assupersededand tags the new version asvd-v2.0-2027. The auditor can trace both versions.
The repo itself as procedure documentation
Verfahren (Rz. 64–71)"] R --> GC["git config
Systemumgebung (Rz. 72–76)"] R --> GA["git log --author
Organisation (Rz. 77–80)"] R --> GH["Git-Hooks
Kontrollen (Rz. 81–85)"] R --> SC["Schemata + Sidecars
Daten (Rz. 86–91)"] GL --> VD["Verfahrensdokumentation
entsteht automatisch"] GC --> VD GA --> VD GH --> VD SC --> VD style R fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style GL fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style GC fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style GA fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style GH fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style SC fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style VD fill:#10A987,stroke:#0A7F5C,color:#FBFAF7
The central insight: A Git repo is itself a procedure documentation -
git logshows the procedure,git configshows the system environment, Git hooks show the controls, schemas show the data structures. The formal procedure documentation (Markdown indocs/verfahrensdokumentation/) complements this with the human-readable description - but the authoritative source is the repo itself.
Risk-Leverage
| Today (cheap) | Tomorrow (audit-proof) | Risk mitigated |
|---|---|---|
| Procedure documentation as Git artifact | GoBD Rz. 64-91 fulfilled by design | Estimation § 162 AO (no procedure documentation) |
git log as procedure evidence |
Traceability within a reasonable time | Dispute of the procedure documentation |
| Tags as release markers | Immutable state at time of audit | Dispute of the state |
| System change as commit + bundle | GoBD Rz. 146-150 compliant | GoBD violation through undocumented change |
| Obsolescence marking | Old versions traceable | Hidden changes |
| Repo itself as procedure documentation | Automatic documentation through use | Procedure documentation outdated |
Harness requirement (preview)
Derivable from ED06:
| ID | Requirement | Priority |
|---|---|---|
| FA-6.1 | Procedure documentation as versioned Git artifact | MUST |
| FA-6.3 | SKR04 chart of accounts management (incl. payroll accounts) | SHOULD |
| FA-6.6 | Immutability after release (tags, protected branches) | MUST |
| FA-6.7 | Static web generator for period closing (Z3+) | SHOULD |
| TA-2.1 | Pre-commit: JSON schema validation | MUST |
| TA-2.4 | Pre-commit: obsolescence status check | SHOULD |
| TA-2.6 | Post-commit: auto-index generation | SHOULD |
The complete requirement list in Harness-Anforderungen.md.
Sources
- GoBD (BMF letter, Rz. 64-91 - procedure documentation, Rz. 146-150 - system change, Rz. 83 - currency)
- AO (§ 146 - ordering regulations, § 147 - retention)
AFJD/agents/(anonymized) - SSoT concept with procedure documentation as Git artifact
Source topology and CDN reference links
| Role | Location | Purpose |
|---|---|---|
| Primary / SSoT | git.gitcover.org/GCC | Canonical storage (GPG-signed, versioned) |
| Public OSS Mirror / CDN | codeberg.org/gitcover-commons | Read-only mirror; FLOSS discovery |
| Community Hub | github.com/gitcover-commons | Issues & discussions; source code reference on Codeberg |
Note: This assignment of sources, mirror and community hub reflects the current state and may change. Please check the respective canonical source on gitcover.org for the current state.