Wie wir Spec-Coverage-Dokumente führen. Verbindlich für alle
docs/spec-coverage/<spec>.md-Files. Basis für jede neue Spec-Coverage-
Pflege.
Pro Spec gibt es zwei Dateien:
<spec-name>.md— die einzige Wahrheits-Quelle:- vollständig (alle normativen Items der PDF-Spec)
- faktisch (kein Storytelling, keine Phasen-Erklärungen)
- prüfbar (jeder Eintrag verlinkt auf konkretes File + Tests)
- alle Items inkl. derer mit Status
openundpartial
<spec-name>.open.md— Aggregat-Liste deropen-Items:- automatisch aus dem Hauptfile abgeleitet, kein neuer Inhalt
- jedes
open-Item mit Spec-Ref + Kurzbeschreibung + Plan-Hinweis - dient als Arbeits-Backlog
- Vor jedem Audit-Lauf gelöscht und neu generiert (kein Drift)
- Ausnahme: ist nach dem Audit nichts mehr offen/partial/rejected,
entfällt die
.open.mdganz — siehe „Leere.open.mdentfernen" am Ende.
# <Spec-Titel> — Spec-Coverage
**Quelle:** `docs/standards/cache/<vendor>/<spec>.pdf` (<Seiten>, <Datum>)
— oder bei ZeroDDS-Vendor-Specs: `documentation/specs/<spec>/main.tex`
## <§-Nummer> <Section-Titel>
### <Item-Titel>
**Spec:** §<§-Ref>, S. <Seite> (PDF) — wörtliches Zitat oder
exakte Paraphrase der normativen Anforderung.
**Repo:** <File-Pfad> (`<Symbol-Name>` / Funktion / Production-ID)
**Tests:** `<test-file>::<test-name>` (mehrere durch Komma getrennt)
**Status:** `done` | `partial` | `open` | `n/a (informative)` | `n/a (rejected)`
| Wert | Bedeutung |
|---|---|
done |
100% spec-konform implementiert; Repo + Tests vorhanden und decken die Anforderung ab. |
partial |
Teilweise umgesetzt. Beschreibe exakt was fehlt. Verbleibendes muss als eigenes Item mit Status open geführt werden, sonst nicht zulässig. |
open |
Nicht umgesetzt. Repo-Spalte = —. Tests-Spalte = —. |
n/a |
Nicht implementier-pflichtig. Zwei Klassen, siehe unten. |
Jeder n/a-Status MUSS mit Klasse-Suffix versehen werden:
| Klasse | Bedeutung | Pflicht in .open.md? |
|---|---|---|
n/a (informative) |
Spec-Section ist explizit informativ (Vorwort, Acknowledgments, Glossar, Editorial-History, Cross-Spec-References). Implementierung naturgemäß nicht nötig. | nein |
n/a (rejected) |
Spec-Section ist normativ und implementierbar, aber wir haben uns aus einer bewussten Design-Entscheidung gegen Implementierung entschieden. | ja, mit Decision-Record (siehe unten). |
Die Item-Notiz MUSS die Klasse begründen. Ein nacktes n/a
ohne Klasse ist nicht zulässig.
- Vorhandene
.open.mdlöschen (rm docs/spec-coverage/<spec>.open.md). - Spec-Quelle öffnen — bei OMG/IETF/OASIS-Specs die PDF (Read-Tool mit
pages-Parameter, max 20 Seiten/Aufruf) indocs/standards/cache/; bei ZeroDDS-Vendor-Specs die TeX-Quelle indocumentation/specs/. - Sequentiell §1 → §N durchgehen. Pro normativer Anforderung:
- Item nach obigem Schema schreiben
- Spec-Zitat oder exakte Paraphrase, mit Seitenzahl
- Repo-Pfad: per
grep/ Symbol-Suche im Code finden - Test-Pfad: per
grepim Test-Tree finden - Status setzen
- Workspace-Test laufen lassen, um sicher zu sein dass die referenzierten Tests existieren und grün sind.
- Commit:
docs(spec-coverage): <spec> Spec-Check N.0 verify.
| Spalte | Quelle (OMG / IETF / OASIS) | Quelle (ZeroDDS Vendor-Spec) | Verifikations-Befehl |
|---|---|---|---|
| Spec-Zitat | PDF-Spec direkt (Read-Tool, pages-Param) in docs/standards/cache/<vendor>/<spec>.pdf |
TeX-Quelle in documentation/specs/<spec>/main.tex |
— |
| Repo-Pfad | grep -nE "<symbol>" crates/ |
dito | cargo build muss compile-en |
| Tests | grep -nE "fn <test>" crates/**/tests/ |
dito | cargo test --workspace muss grün sein |
| Status | Logischer Schluss aus den drei oben | dito | bei done muss Test grün sein |
- Status-Drift: Item als
donemarkieren ohne Tests im Repo. - Phasen-Marker: "Phase-2", "deferred", "out-of-scope", "später"
sind keine Status-Werte. Wenn unklar →
openmit konkreter Beschreibung. - Sammel-Status: "alle Rules 133-183 done" ohne Item-für-Item- Auflistung. Jede Regel = ein Item.
- Vendor-Annotations als Hülle: Spec-Section nicht überspringen nur weil sie informativ wirkt — auch Tabellen-Inhalte (Keywords, reservierte Wörter) müssen aufgeführt werden.
- Code-Pfad ohne Verifizierung: jede Repo-Spalte muss tatsächlich
existieren. Vor Commit
cargo checklaufen lassen. - Test-Pfad ohne Verifizierung: Test-Funktion muss tatsächlich
existieren und grün sein.
cargo test --workspacevor Commit. n/aohne Klasse: jedern/a-Status MUSS alsn/a (informative)odern/a (rejected)markiert sein.n/a (rejected)ohne Decision-Record: jedes alsn/a (rejected)markierte Item MUSS in der.open.mdeinen Decision-Record-Eintrag mit allen drei Pflicht-Feldern (Begründung, Impl-Auswirkung, Impl-Vorteil) tragen — siehe nächste Sektion.
Die .open.md ist ein Aggregat. Ihr Inhalt MUSS automatisch
aus dem Hauptfile abgeleitet werden, vor jedem Audit-Lauf
gelöscht und neu generiert. Sie enthält zwei Abschnitte:
Jedes Item mit Status open oder partial aus dem Hauptfile
MUSS hier auftauchen. Format pro Eintrag:
## §<§-Ref> <Section-Titel>
**Status:** `open` | `partial` — <Kurzbeschreibung was fehlt + Plan-Hinweis>Jedes Item, das im Hauptfile als n/a (rejected) geführt wird,
MUSS hier mit einem Decision-Record erscheinen. Format:
## §<§-Ref> <Section-Titel> — `n/a (rejected)`
**Begründung:** <warum wir uns gegen die Implementierung
entschieden haben — sachlich, mit Verweis auf Architektur-
Entscheidung, Plattform-Constraint, oder Spec-Konflikt>.
**Impl-Auswirkung:** <was eine `done`-Implementierung am Code
verändern würde — konkret welche Crates, welcher Aufwand, welche
neuen Abhängigkeiten>.
**Impl-Vorteil:** <welcher konkrete Vorteil entstünde — Use-Case,
Cross-Vendor-Interop, Coverage-Gewinn — falls man die Decision
revidiert>.n/a (informative)-Items tauchen in der .open.md nicht auf;
sie erscheinen ausschließlich in der Schluss-Aggregation des
Hauptfiles.
Jedes <spec>.md-Hauptfile MUSS mit einer Abschluss-
Bemerkung enden. Form ist verbindlich nüchtern (keine Storytelling-
Absätze, keine Datums-Erzählung, keine Phasen-Verweise):
---
## Audit-Status
<N> done / <M> partial / <O> open / <P> n/a (informative) / <Q> n/a (rejected).
Test-Lauf: `<test-command>` — <X> Tests grün, 0 failed.Optional zusätzlich (eine Zeile, sachlich, nur wenn nicht trivial):
ein Verweis auf <spec>.open.md für die offenen Punkte und
Decision-Records.
Verboten in der Abschluss-Bemerkung:
- Datumsangaben ("abgeschlossen 2026-MM-TT")
- Phasen-/Cluster-Narrative ("K3 abgeschlossen, K4 kann beginnen")
- Erzählungen über die Audit-Geschichte
- Begründungs-Absätze für einzelne Items (gehören in Item-Notiz oder Decision-Record)
- Marketing-Aussagen ("byte-identisch zu Cyclone DDS", "100% Coverage")
Die Aggregations-Zahlen <N>/<M>/<O>/<P>/<Q> MÜSSEN mit der
tatsächlichen Item-Zählung im Hauptfile und mit der .open.md
übereinstimmen. Drift ist Audit-Fail.
### §7.4.1.3 Rule (61) — Native-Type Declaration
**Spec:** §7.4.1.3 (61), S. 24 (PDF) —
"<native_dcl> ::= 'native' <simple_declarator>"
**Repo:** `crates/idl/src/grammar/idl42.rs` (`PROD_NATIVE_DCL`,
ID 121); Top-Level-Aktivierung in `PROD_TYPE_DCL` Alt 3.
**Tests:** `crates/idl/src/grammar/idl42.rs::tests`:
`parses_native_dcl_top_level`, `parses_native_dcl_in_module`,
`parses_native_dcl_in_interface`. Feature-Gate-Test:
`crates/idl/src/features/gate.rs::tests::dds_basic_rejects_native`.
**Status:** doneDieses Schema ist identisch anwendbar auf alle Spec-Coverage- Files. Aktueller Bestand:
zerodds-dcps-1.4.mdddsi-rtps-2.5.mddds-xtypes-1.3.mdzerodds-rpc-1.0.mdzerodds-xrce-1.0.mdzerodds-security-1.2.mdzerodds-xml-1.0.mddds-psm-cxx-1.0.mdzerodds-java-psm-1.0.md
idl-4.2.mdidl4-cpp-1.0.mdidl4-csharp-1.0.mdidl4-java-1.0.md
dds-tsn-1.0.mdzerodds-web-1.0.mddds-opcua-1.0.mddds4ccm-1.1.mddlrl-1.2.md(DLRL aus DDS 1.2 §8 + Annex B; nicht Teil von DDS 1.4 oder neuer)omg-time-1.1.mdomg-ami4ccm-1.1.mdomg-ccm-4.0.mdomg-rtc-1.0.mdcorba-3.3.md(WP CORBA-Coexistence; Migrations-Pfad für Bestands-Anwendungen, drop-in gegen GIOP/IIOP/POA/CSIv2)cos-event-service-1.4.md(WP COS-EventService; Voraussetzung für TimerEventService ausomg-time-1.1.md§2.2-§2.4)
coap-rfc-7252.mdwebsocket-rfc-6455.mdmqtt-5.0.mdmqtt-3.1.1.md(MQTT 3.1.1 — version-aware Codec-Pfad neben 5.0; Repo:crates/mqtt-bridge/ProtocolVersion::V311)amqp-1.0.mdamqp-0-9-1.md(AMQP 0.9.1 — eigenständiges Protokoll: connection/ channel/exchange/queue/basic/confirm/tx; Repo:crates/amqp-0-9-1/)grpc-protocol.mdros2-rmw.md
Quelle: die OPC-UA-Core-Parts in docs/standards/cache/opcfoundation/
(per OPC-Account beschafft; aus IP-/Copyright-Gründen gitignored — nur zum
Zitieren, nie committen). PDF-Offset Part 14 = +20.
opcua-pubsub-1.05.md(Part 14 — PubSub/UADP; Cross-Spec Part 6 §5 Binär- Codec / Part 4 / Part 3; Repo:crates/opcua-pubsub/)opcua-client-server-1.05.md(Part 4 — Services + Part 6 §7.1 UACP / §6.7 OPC UA Secure Conversation; Repo:crates/opcua-uacp/+crates/opcua-server/). Nicht zu verwechseln mitdds-opcua-1.0.md, das die OMG-DDS-OPC-UA-Gateway-Spec abdeckt.
Quelle: entweder documentation/specs/<spec>/main.tex oder
docs/specs/<spec>.md (Markdown-Vendor-Specs ohne TeX). Audit-
File-Konvention identisch zu OMG-Specs; Repo-Pfade zeigen auf
crates/<spec-impl>/.
dds-amqp-1.0.mddds-ts-1.0.md(ersetzt das frühereidl4-ts-1.0.md, Quelle:documentation/specs/dds-ts-1.0/main.tex)zerodds-py-1.0.md(Python-Binding, Quelle:docs/specs/zerodds-py-1.0.md; Repo:crates/py/)zerodds-monitor-1.1.md(Observability-Substrat, Quelle:docs/specs/zerodds-monitor-1.1.md; Repo:crates/monitor/+ Hook-Points incrates/{transport,rtps,discovery,dcps,security}/; 10 done / 0 open, löst die 1.0-Coverage ab)zerodds-listener-callbacks-1.1.md(C-FFI cross-language Listener-Layer, Quelle:docs/specs/zerodds-listener-callbacks-1.1.md; Repo:crates/zerodds-c-api/Listener-FFI + Status-/Inconsistent-Topic-Counter incrates/{dcps,discovery}/; 26 done / 0 open / 1 n/a (informative))zerodds-observability-otlp-1.0.md(OTLP/HTTP/JSON-Exporter, Quelle:docs/specs/zerodds-observability-otlp-1.0.md; Repo:crates/observability-otlp/)zddsrec-1.0.md(Recording-Format.zddsrec, Quelle:docs/specs/zddsrec-1.0.md; Repo:crates/recorder/)
cross-vendor-validation.md ist ein Test-Inventar, kein
PROCESS-konformes Audit-File. Es folgt dem gleichen Item-Format
zur einfachen Lesbarkeit, ist aber explizit nicht auf eine
einzelne Spec-PDF normalisiert.
Pro Spec gilt: zugehörige .open.md vor Audit löschen, kompletter
Re-Sync gegen die Quelle (PDF oder TeX), Item-für-Item. Nach
Re-Sync: Abschluss-Bemerkung im Hauptfile aktualisieren,
Decision-Records in .open.md neu generieren.
Wenn nach dem vollständigen, sauberen Item-für-Item-Durchgang kein
einziges Item mehr den Status open, partial oder n/a (rejected)
trägt — und auch keine verkappten Aufschiebe-Marker wie „deferred",
„later", „Phase X", „out-of-scope", „TODO" mehr im Hauptfile stehen
(diese sind ohnehin keine zulässigen Status, siehe Anti-Patterns) —
dann gibt es nichts zu aggregieren. In diesem Fall:
- Die
.open.md(und ggf..open.en.md) löschen statt ein inhaltsleeres Aggregat zu pflegen. - Im Hauptfile den
.open.md-Querverweis entfernen (Intro und Abschluss-Bemerkung) und durch „Offene Punkte: keine. Decision- Records: keine." ersetzen. - Gerenderte
*.open.htmlmitlöschen und Coverage-HTML neu rendern, damit die Sidebars die entfernte Seite nicht mehr verlinken (keine toten Links).
Die Aggregat-Zahl in der Abschluss-Bemerkung muss dann
<N> done / 0 partial / 0 open / <P> n/a (informative) / 0 n/a (rejected)
lauten (nur done und optional n/a (informative)). Sobald ein späterer
Re-Audit wieder ein open/partial/rejected-Item findet, wird die
.open.md nach dem normalen Workflow neu erzeugt.