Axis 4: Techniques

OSCAL - Open Security Controls Assessment Language

OSCAL transforms compliance documentation from Word/Excel into machine-readable JSON/YAML formats with four layers:

  1. Catalogs - Control definitions (NIST 800-53, ISO 27001, BSI IT-Grundschutz)
  2. Profiles - organization-specific baselines
  3. Implementation Layer - System Security Plans, Component Definitions
  4. Assessment Layer - Assessment Results, POA&M

BSI officially documents: "OSCAL is compatible with international standards". The GCBoK defines German compliance taxonomies (GoBD, BSI, GDPR) as OSCAL catalogs - this does not yet exist on the market.

OSCAL catalogs and OPA rules are part of the machine-readable semantics layer of the GitCover ontology: they describe, in the same language as the L1–L6 dictionaries, which requirements apply and how they are checked (see Concepts: Business hierarchy as ontology and Glossary: Ontology).

The GCPN events/flags (signature and process lifecycle) are derived from these OSCAL catalogs (ao-buchfuehrung, gobd, ustg-rechnung, bmf-erechnung). The immutable collection GCPN-EVENTS-FLAGS carries the governance anchoring (AO §146, GoBD Rz. 146/147) and is referenced in the GCPN via events.enum_ref.

OPA / Rego - Policy as Code

Open Policy Agent with the Rego language. Compliance rules are implemented as code that is automatically checked against the Git state.

VPRM - Verifiable Process Reward Model

In the GCBoK context, OPA/Rego acts as VPRM: guardrails for AI agents are created by deterministic rule sets, not by prompt engineering. This means AI agents are not secured by prompt constraints, but by code validation.

GPG Signing

Every compliance-relevant Git commit is GPG-signed. The signature binds:

Starting from .gc.md metadata, GPG fingerprints are bound to V7GUIDs - identities remain forgery-proof even if an AI agent manipulates the semantic structure.

GCSIG — Signature as a versioned artifact

Git history alone is not sufficient as signature evidence: a force-push can rewrite it. Therefore, every relevant Git code/commit signature (GPG, signed commit, PR) is additionally stored as an immutable artifact {name}.gcsig.md (schema gcsig-1.4). It binds:

This makes the commit signature Git-versioned and history-rewrite-proof; a subsequent GCPN references the GCSIG via parents[]/children[] (GCSIG:{docUid}). Creation: gc-docsign gcsig <repo> --commit <sha>.

GPG keyring architecture for forensic traceability

So that GPG signatures remain verifiable in the long term — even years after creation, after key expiry or revocation, and when reconstructed from git bundle/ZIP archives — the public keys must be part of the repository. For this purpose, the GCBoK defines a keyring-in-repo pattern:

Structure: .gitcover/keys/

.gitcover/
├── keys/
│   ├── team-lead.asc          # Öffentliche Schlüssel von Team-Leads
│   ├── service-accounts/      # CI/CD, Bots, Automation
│   └── identities/            # Personenbezogene Schlüssel (nur PII-Repos)
│       ├── person-a.asc
│       └── person-a_governikus.pdf  # Identitätsnachweis pgp.governikus.de
├── trusted-keys.gpg           # Gesammelter Keyring (optional, für Verifier)
└── compliance/                # GoBD/DSGVO-Dokumente

Two-level model: TOP repo vs. PII repo

Level Repository Content GDPR relevance
Organizational TOP repo (Tenant Organizational Platform) Team lead keys, service accounts, CI/CD bots, trust anchor trusted-keys.gpg No personal data — GDPR-compliant
Personal PII repo (Personal Identifiable Information) Developer keys, identity proofs (Governikus confirmations), personal GPG fingerprints PII — access only via org-unit claims (see below)

This separation reflects the two levels of responsibility for PII:

  1. Legal — tenant level (legal entity, e.g. GCC, GCD, GCP)
  2. Organizational — PMO/divisions/departments/locations (≈ AD Organizational Unit)

Verification isolated from the local keyring

A verifier (or auditor 10 years later) verifies without dependency on the local GPG keyring:

# Nur Repository-Schlüssel nutzen, lokalen Keyring ignorieren
gpg --no-default-keyring --keyring .gitcover/keys/team-lead.asc \
    --verify-commit <commit-hash>

Temporal validity and key lifecycle

The question "Was the signature valid at the time of the commit?" is answered by the repository integration:

Relevance for GoBD process documentation and NIS2

See also: The article series "GoBD process instructions for Git" in the GCBoK (Module 3: Cryptographic integrity, Module 4: Signatures & authenticity) explores these topics in greater depth. The research project GitCover.IdP (BSFZ 288-335-338/2026-1) investigates the IdP integration.

uuidV7 - UUID Version 7

RFC 4122-compatible UUID version 7: time-based, sortable, collision-resistant. The GitCover-specific extension with a 14-bit class identifier turns UUIDs into V7GUIDs (see Concepts).

Time epoch model (real · tenant · person)

Standard division: The RFC standards for temporally sortable GUIDs (RFC 9562/4122) describe exclusively the structural design — bit layout, length and position of the timestamp field, version and variant. The semantics — what the timestamp means, in particular the time epoch as reference quantity and the classification in the suffix — are standardized by GCBoK (V7GUID specification, OSS schema v7guid-epoch-mode-1.0). A mode such as person therefore does not violate the RFC structure; it is a GCBoK semantics on an RFC-conformant structure.

The 48-bit timestamp (unix_ts_ms, RFC 9562) is unsigned and sortable; in GitCover its reference epoch is a defined mode (union/enum, OSS schema v7guid-epoch-mode-1.0):

Mode Epoch Purpose
real Unix 1970-01-01Z RFC standard; actual (system) time
tenant tenant epoch (e.g. founding date) deterministic class/tenant ID derivation
person person epoch (default 1900-01-01Z) birth/historical PII times before 1970 can be represented positively

The RFC prefix (timestamp + version + variant) remains the interface from the normative root to customizing ("interface inheritance"); the suffix (rest of the 128 bits) carries the GitCover classification (L1–L6, categories/bit patterns, registry/keyword search). Time values before the chosen epoch are a defined error (no sign wrap): .NET arithmetic is signed (DateTimeOffset returns negative long for pre-1970), and only non-negative values are recorded — this keeps sorting and RFC format intact while historical data (e.g. birth dates, PII) remain orderable.

Instance JSON naming rule (`

The base data record (instance JSON) of an object is stored in the Git repo path — and thus in the working directory — as {docType}.{classId}.json (docType = class abbreviation, classId = V7GUID class identifier; e.g. PII_PERSON.01a12f72-4c75-74f1-8626-dd1ae65b6062.json). This is a natural index: OS-adjacent tooling finds instance data by {docType} and/or {classId} without knowing a fixed file name. Applies to all data artifacts (including PII persons/<uuidv7>/, registry entries, evidence schemas).

Temporal & flag basis (GitCover.Core)

Git as IdP - Identity Provider

Gitea-based Git repositories as Single Source of Truth (SSoT) for an integrated Identity and Access Management system (IAM). The BSFZ-recognized research project investigates whether Git organizations/teams can represent OAuth2 clients and permissions and can manage >1,000 users with good performance.

Personal data (PII) in the GitCover stack is subject to a dual responsibility that is reflected in the repository architecture and the OIDC claims:

Level Scope Repository type OIDC claim Example
1. Legal Tenant (legal entity) TOP repo + PII repo tenant_id (V7GUID-based) GCC, GCD, GCP, ADA
2. Organizational PMO / division / department / location PII repo (fine-grained) org_unit_id (≈ AD Organizational Unit) GCC-Portfolio, GCD-IT, GCP-Sales

Person-to-role assignment (PII bridge) — work needed

Person-to-role assignment (PII bridge) — work needed

The GCPN signature containers reference participants (attendees) as actors (role in the tenant, function in the company) and carry persons only pseudonymized (persons.mappings with PII reference). The canonical assignment person → roles → org units lies in the PII circle (gitignored) — for a consistent model, the following relationships still need to be worked out in detail in the GCBoK:

Relationship GCBoK status Work needed
User → Role approach (Git repo = IdP; signature doc as claim carrier) role definition per tenant (GF, GS administrator, auditor) as normative vocabulary — analogous to kinds.json/status_flags.json in the OSS normative root
Role → Group Gitea teams (org → team → member) mapping Gitea team ↔ role; team slug convention + others.json binding (allowed_repos)
Group → Org Unit L2 department as org-unit anchor (02-konzepte) populate departments.json per tenant (currently AFJD master: entries empty); org_unit_id plaintext convention (GCC-Portfolio etc.)
Org Unit → Tenant two-level claim (tenant_id legal, org_unit_id organizational) populate others.json per TOP repo (currently empty); document claim mapping in the inlet pipeline
Person (PII) → User PII repo (gitignored) PII schema for person↔role mapping (GDPR: minimization, pseudonymized reference as in GCPN persons.mappings)

Linkage: gcpn-container-2.7 → attendees (roles in the process) → persons.mappings (pseudonymized PII reference) → PII repo (canonical assignment). Until this is worked out, the pseudonymized references documented here apply as an interim solution.

Claim hierarchy in the inlet pipeline

The inlet pipeline (see Procedures: Tenant isolation reads the others.json depending on the user claim and injects the permitted paths:

{
  "tenant_id": "0197a3b2-f3c0-7b00-8001-000000000042",
  "org_unit_id": "ORG-1-Portfolio",
  "allowed_repos": [
    "TOP",
    "PII/ORG-1-Portfolio"
  ]
}

Thus a user with org_unit_id = ORG-1-Portfolio gains access to the portfolio's PII repo, but not to PII/ORG-2-IT — even with the same tenant_id.

See also: The research project on GitCover.IdP is described in research projects. The keyring architecture (TOP vs. PII) is described above under "GPG keyring architecture".