From d5cfec9e428a0845b1164f10fbe68687ab514403 Mon Sep 17 00:00:00 2001 From: Stefan Lohmaier Date: Tue, 12 May 2026 03:42:35 -0700 Subject: [PATCH] feat(i18n): dev-process repo in English - README.md: full English rewrite - All 13 vorlagen MD templates hand-translated: PID, PM-Plan, QA-Plan, SWE-Plan, Test-Plan, SA, SWA, Review-Protokoll, Non-Conformity, MISRA-Deviation-Permit, MISRA-Deviation-Record, Traceability-Matrix, angebot (quotation) - Master Word template (slohmaier-doc-template.docx) regenerated in English: cover page, document control, TOC headers, classification banner all English - All derived Word vorlagen regenerated from English MD sources Still to translate: toolstack.md, gitea-aspice-setup.md --- README.md | 176 ++++++++--------- tools/build_word_template.py | 132 ++++++------- .../MISRA-Deviation-Permit-vorlage.docx | Bin 26845 -> 26737 bytes .../MISRA-Deviation-Record-vorlage.docx | Bin 26568 -> 26462 bytes vorlagen-word/Non-Conformity-vorlage.docx | Bin 26668 -> 26572 bytes vorlagen-word/PID-vorlage.docx | Bin 27282 -> 27279 bytes vorlagen-word/PM-Plan-vorlage.docx | Bin 27468 -> 27026 bytes vorlagen-word/QA-Plan-vorlage.docx | Bin 27948 -> 26891 bytes vorlagen-word/Review-Protokoll-vorlage.docx | Bin 26824 -> 26744 bytes vorlagen-word/SWE-Plan-vorlage.docx | Bin 28506 -> 28347 bytes vorlagen-word/Test-Plan-vorlage.docx | Bin 28008 -> 26872 bytes vorlagen-word/angebot-vorlage.docx | Bin 26267 -> 26208 bytes vorlagen-word/slohmaier-doc-template.docx | Bin 41538 -> 41432 bytes vorlagen/MISRA-Deviation-Permit-vorlage.md | 84 ++++----- vorlagen/MISRA-Deviation-Record-vorlage.md | 84 ++++----- vorlagen/Non-Conformity-vorlage.md | 100 +++++----- vorlagen/PM-Plan-vorlage.md | 114 +++++------ vorlagen/QA-Plan-vorlage.md | 134 +++++-------- vorlagen/Review-Protokoll-vorlage.md | 92 ++++----- vorlagen/SA-vorlage.md | 110 +++++------ vorlagen/SWA-vorlage.md | 143 +++++++------- vorlagen/SWE-Plan-vorlage.md | 178 +++++++++--------- vorlagen/Test-Plan-vorlage.md | 146 +++++--------- vorlagen/Traceability-Matrix-vorlage.md | 88 ++++----- vorlagen/angebot-vorlage.md | 68 +++---- 25 files changed, 774 insertions(+), 875 deletions(-) diff --git a/README.md b/README.md index 51108c2..bac9222 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,41 @@ # slohmaier Dev Process -Ein praxisnaher Entwicklungsprozess angelehnt an ASPICE 4.0 / ISO 26262, umgesetzt mit Gitea, Doorstop, MS Word und VS Code. Ausgelegt für Freelance-Projekte und kleine Teams. +A practical development process aligned with ASPICE 4.0 / ISO 26262, implemented with Gitea, Doorstop, MS Word, and VS Code. Designed for freelance projects and small teams. -**Demo-Projekt:** [slohmaier/demo-epb](https://gitea.slohmaier.com/slohmaier/demo-epb) — Elektrische Parkbremse, wendet diesen Prozess vollständig an. +**Demo project:** [slohmaier/demo-epb](https://gitea.slohmaier.com/slohmaier/demo-epb) — Electric Parking Brake, applies this process end-to-end. -## Grundprinzip +## Core principle -Alles lebt in einem **Monorepo**. Anforderungen, Dokumente, Code und Tests sind zusammen in einem Git-Repository. Alle Änderungen gehen über Pull Requests mit Approval — das ist der formale Review-Nachweis. +Everything lives in a **monorepo**. Requirements, documents, code, and tests sit together in one Git repository. All changes go through pull requests with approval — that's the formal review record. -## Format-Strategie: Hybrid +## Format strategy: hybrid -Die zwei Welten — ISO-9001-Audit und tägliches Engineering — haben unterschiedliche Anforderungen. Wir trennen sauber: +The two worlds — ISO-9001 audits vs day-to-day engineering — have different needs. We split cleanly: -| Artefakt | Format | Begründung | -|----------|--------|------------| -| PID, PM-Plan, QA-Plan, SWE-Plan, Test-Plan | **Word** (signiert) | Formell freigegeben, an Kunden geliefert | -| Reviews, Non-Conformities, Audit-Protokolle | **Word** | Audit-Artefakte | -| MISRA Permits / Records | **Word** | Audit-Artefakte | -| Angebote, Verträge | **Word** | klar | -| Requirements (SYS, SWE) | **Markdown** (Doorstop) | Diff, Traceability, lebt täglich | -| Architektur (SA, SWA, SWD) | **Markdown** (Doorstop) | Mapping per `links:` | -| Code, Tests, CI | Code | klar | -| Liefer-PDFs an Kunden | **PDF via pandoc** aus MD | formelle Übergabe der Engineering-Artefakte | +| Artifact | Format | Rationale | +|----------|--------|-----------| +| PID, PM Plan, QA Plan, SWE Plan, Test Plan | **Word** (signed) | Formally released, delivered to customers | +| Reviews, non-conformities, audit minutes | **Word** | Audit artifacts | +| MISRA permits / records | **Word** | Audit artifacts | +| Quotations, contracts | **Word** | obvious | +| Requirements (SYS, SWE) | **Markdown** (Doorstop) | Diff, traceability, lives daily | +| Architecture (SA, SWA, SWD) | **Markdown** (Doorstop) | Mapping via `links:` | +| Code, tests, CI | source | obvious | +| Customer-facing PDFs | **PDF via pandoc** from MD | formal handover of engineering artifacts | -**Markdown-Vorlagen sind Source of Truth**, Word wird daraus per pandoc gebaut (`tools/generate_word_vorlagen.sh`). +**Markdown templates are the source of truth**; Word is built from them via pandoc (`tools/generate_word_vorlagen.sh`). -## Monorepo-Struktur +## Monorepo structure ``` -projekt-name/ +project-name/ reqs/ sys/ SYS-001.md, SYS-002.md swe/ SWE-001.md, SWE-002.md arch/ sys/ SA-001.md, SA-002.md (ASPICE SYS.3) swe/ SWA-001.md, SWA-002.md (ASPICE SWE.2) - swd/ SWD-001.md (ASPICE SWE.3, ab ASIL-C) + swd/ SWD-001.md (ASPICE SWE.3, ASIL-C+) docs/ PID.md PM-Plan.md @@ -44,7 +44,7 @@ projekt-name/ Test-Plan.md reviews/ non-conformities/ - traceability/ (generiert von Doorstop) + traceability/ (generated by Doorstop) src/ tests/ unit/ @@ -59,9 +59,9 @@ projekt-name/ .doorstop.yml ``` -## Anforderungen mit Doorstop (Markdown-Modus) +## Requirements with Doorstop (markdown mode) -Requirements sind `.md`-Dateien mit YAML-Frontmatter. PlantUML-Diagramme direkt einbettbar. +Requirements are `.md` files with YAML frontmatter. PlantUML diagrams embed directly. ```markdown --- @@ -71,9 +71,9 @@ links: - SYS-001: abc123 --- -# SWE-001: CAN Bus Initialisierung +# SWE-001: CAN Bus Initialization -Der CAN-Treiber muss den Bus mit konfigurierbarer Baudrate initialisieren. +The CAN driver must initialize the bus with configurable baud rate. ```plantuml @startuml @@ -84,22 +84,22 @@ Hardware --> CANDriver: ok ``` ``` -Gitea rendert das direkt. VS Code mit PlantUML-Extension zeigt die Preview beim Editieren. +Gitea renders this natively. VS Code with the PlantUML extension shows a live preview. -Doorstop prüft: -- Alle Links valide -- Alle Requirements haben Tests -- Keine Lücken in der Traceability +Doorstop verifies: +- All links resolve +- All requirements have tests +- No gaps in traceability -## Architektur-Design (ASPICE SYS.3 / SWE.2) +## Architecture design (ASPICE SYS.3 / SWE.2) -Architektur-Elemente liegen in `arch/` und sind ebenfalls Doorstop-Dokumente. Gleiche Mechanik wie Anforderungen: Markdown + YAML-Frontmatter + eingebettetes PlantUML. +Architecture elements live in `arch/` and are also Doorstop documents. Same mechanism as requirements: Markdown + YAML frontmatter + embedded PlantUML. -- `arch/sys/SA-XXX.md` — System-Architektur, Mapping auf SYS-Anforderungen -- `arch/swe/SWA-XXX.md` — Software-Architektur, Mapping auf SWE-Anforderungen -- `arch/swd/SWD-XXX.md` — Software Detailed Design (nur ab ASIL-C) +- `arch/sys/SA-XXX.md` — system architecture, mapping to SYS requirements +- `arch/swe/SWA-XXX.md` — software architecture, mapping to SWE requirements +- `arch/swd/SWD-XXX.md` — software detailed design (ASIL-C+ only) -**Mapping** geschieht über `links:` im Frontmatter: +**Mapping** via `links:` in frontmatter: ```markdown --- @@ -113,12 +113,12 @@ links: # SWA-003: CAN Driver Component ``` -`doorstop check` verifiziert in beide Richtungen: -- Jede SWE-Anforderung wird von mindestens einem SWA-Element abgedeckt -- Jedes SWA-Element verweist auf mindestens eine SWE-Anforderung -- `doorstop publish all docs/traceability/` erzeugt die Traceability-Matrix +`doorstop check` verifies bidirectionally: +- Every SWE requirement is covered by at least one SWA element +- Every SWA element points to at least one SWE requirement +- `doorstop publish all docs/traceability/` produces the traceability matrix -**Code → Architektur** per Header-Kommentar im Modul: +**Code → architecture** via header comment: ```c /** @@ -128,82 +128,82 @@ links: */ ``` -Vorlagen: `vorlagen/SA-vorlage.md`, `vorlagen/SWA-vorlage.md`. +Templates: `vorlagen/SA-vorlage.md`, `vorlagen/SWA-vorlage.md`. ## Reviews -Jede Änderung — an Code, Requirements, Dokumenten oder Plänen — geht über einen Pull Request. +Every change — to code, requirements, documents, or plans — goes through a pull request. -| Was | Approver | -|-----|----------| -| Requirement neu/ändern | mind. 1 Reviewer | -| Architektur-Element (SA/SWA/SWD) | mind. 2 Technical Reviewer | -| Dokument (Plan, Protokoll) | mind. 1 Reviewer | -| Code-Änderung | mind. 1 Reviewer | -| MISRA Permit | Technical Lead | +| Item | Approver | +|------|----------| +| New / changed requirement | ≥ 1 reviewer | +| Architecture element (SA/SWA/SWD) | ≥ 2 technical reviewers | +| Document (plan, minutes) | ≥ 1 reviewer | +| Code change | ≥ 1 reviewer | +| MISRA permit | technical lead | -Merge = formale Freigabe. Git-History ist der Audit-Trail. +Merge = formal release. Git history is the audit trail. ## Traceability -Vier Ebenen werden verknüpft: +Four levels are linked: -1. **Doorstop-Links** in `.md`-Dateien: `links: [SYS-001: abc123]` -2. **Architektur-Mapping** (Arch-Element → Anforderung) ebenfalls per Doorstop -3. **Commit-Messages**: `feat(SWE-001): implement CAN init` oder `feat(SWA-003): ...` -4. **Issue-Referenzen** in PRs: `Refs #42` +1. **Doorstop links** in `.md` files: `links: [SYS-001: abc123]` +2. **Architecture mapping** (arch element → requirement) also via Doorstop +3. **Commit messages**: `feat(SWE-001): implement CAN init` or `feat(SWA-003): ...` +4. **Issue references** in PRs: `Refs #42` -Chain: `SYS-XXX → SA-XXX → SWE-XXX → SWA-XXX → Code → Test` +Chain: `SYS-XXX → SA-XXX → SWE-XXX → SWA-XXX → code → test` -Doorstop erzeugt automatisch einen Traceability-Report: +Doorstop generates the matrix automatically: ```bash doorstop publish all docs/traceability/ ``` -## CI-Pipeline +## CI pipeline -Läuft bei jedem Push und PR automatisch: +Runs on every push and PR: -1. `doorstop check` — Requirements-Links valide -2. `cppcheck --addon=misra` — MISRA-Compliance -3. `make test` — Unit Tests -4. `make coverage` — Coverage-Report -5. `doorstop publish` — Traceability-Report aktualisieren +1. `doorstop check` — requirement links valid +2. `cppcheck --addon=misra` — MISRA compliance +3. `make test` — unit tests +4. `make coverage` — coverage report +5. `doorstop publish` — refresh traceability report -## Dateien in diesem Repo +## Files in this repo -| Pfad | Inhalt | -|------|--------| -| `toolstack/toolstack.md` | Vollständiger Tool-Stack | -| `gitea-aspice-setup.md` | Gitea einrichten für ASPICE | -| `dev-process-schaubild.html` | V-Modell Infografik | -| `vorlagen/` | Markdown-Vorlagen (Source of Truth) | -| `vorlagen-word/` | Generierte Word-Vorlagen + Master-Template `slohmaier-doc-template.docx` | -| `tools/build_word_template.py` | Erzeugt das neutrale Master-Word-Template mit Formatvorlagen, Deckblatt, Document Control | -| `tools/generate_word_vorlagen.sh` | Erzeugt aus den `.md`-Vorlagen die `.docx`-Versionen via pandoc | +| Path | Content | +|------|---------| +| `toolstack/toolstack.md` | Complete tool stack | +| `gitea-aspice-setup.md` | Setting up Gitea for ASPICE | +| `dev-process-schaubild.html` | V-model infographic | +| `vorlagen/` | Markdown templates (source of truth) | +| `vorlagen-word/` | Generated Word templates + master template `slohmaier-doc-template.docx` | +| `tools/build_word_template.py` | Builds the neutral Word master template with styles, cover page, document control | +| `tools/generate_word_vorlagen.sh` | Builds the `.docx` versions from the `.md` templates via pandoc | -## Word-Vorlagen neu generieren +## Regenerate Word templates ```bash -# Master-Template + alle abgeleiteten Word-Vorlagen neu bauen +# Rebuild master template + all derived Word templates python3 tools/build_word_template.py bash tools/generate_word_vorlagen.sh ``` -Das Master-Template enthält ISO-9001-konform: -- Deckblatt mit Projekt, Dokument-ID, Version, Klassifikation -- Document Control (Freigaben, Änderungshistorie, Verteiler) -- Auto-Verzeichnisse (Inhalt, Abbildungen, Tabellen) -- Formatvorlagen für H1–H4, Body, Code, Note, Warning, Requirement -- Header/Footer mit Projekt, Dokument-ID, Klassifikation, Seitennummer +The master template is ISO-9001-compliant and includes: +- Cover page with project, document ID, version, classification +- Document control (approvals, revision history, distribution) +- Auto-tables of contents, figures, and tables +- Styles for H1–H4, Body, Code, Note, Warning, Requirement +- Header/footer with project, document ID, classification, page number -## Einsatz in eigenen Projekten +## Using this process in your own projects -Drei Wege, diesen Prozess zu nutzen: +Three options: -1. **Git-Submodule** in dein Projekt: +1. **Git submodule** in your project: ```bash git submodule add https://gitea.slohmaier.com/slohmaier/dev-process .dev-process ``` -2. **Vorlagen kopieren** und im Projekt einchecken (statischer Snapshot). -3. **Fork / Clone** und als Basis für eigene Anpassungen verwenden. +2. **Copy templates** into the project and commit (static snapshot). +3. **Fork / clone** and use as the base for your own customisations. diff --git a/tools/build_word_template.py b/tools/build_word_template.py index 726c620..8771a06 100644 --- a/tools/build_word_template.py +++ b/tools/build_word_template.py @@ -223,7 +223,7 @@ def setup_page(doc): section.footer_distance = Cm(1.25) -def build_header_footer(doc, doc_id_placeholder="", classification="VERTRAULICH"): +def build_header_footer(doc, doc_id_placeholder="", classification="CONFIDENTIAL"): section = doc.sections[0] section.different_first_page_header_footer = True @@ -234,11 +234,11 @@ def build_header_footer(doc, doc_id_placeholder="", classification="VERT tabs = header_para.paragraph_format.tab_stops tabs.add_tab_stop(Cm(8), WD_ALIGN_PARAGRAPH.CENTER) tabs.add_tab_stop(Cm(16), WD_ALIGN_PARAGRAPH.RIGHT) - r1 = header_para.add_run("") + r1 = header_para.add_run("") r1.font.size = Pt(9) r1.font.color.rgb = RGBColor(0x59, 0x59, 0x59) header_para.add_run("\t") - r2 = header_para.add_run("") + r2 = header_para.add_run("") r2.font.size = Pt(9) r2.font.color.rgb = RGBColor(0x59, 0x59, 0x59) r2.bold = True @@ -263,7 +263,7 @@ def build_header_footer(doc, doc_id_placeholder="", classification="VERT fr2.font.color.rgb = RGBColor(0x59, 0x59, 0x59) fr2.bold = True footer_para.add_run("\t") - fr3 = footer_para.add_run("Seite ") + fr3 = footer_para.add_run("Page ") fr3.font.size = Pt(9) fr3.font.color.rgb = RGBColor(0x59, 0x59, 0x59) add_field(footer_para, "PAGE", "1") @@ -298,7 +298,7 @@ def add_cover_page(doc): # Classification banner cls_p = doc.add_paragraph() cls_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - cls_r = cls_p.add_run("VERTRAULICH") + cls_r = cls_p.add_run("CONFIDENTIAL") cls_r.font.size = Pt(11) cls_r.font.bold = True cls_r.font.color.rgb = RGBColor(0xC5, 0x5A, 0x11) @@ -306,12 +306,12 @@ def add_cover_page(doc): # Title title_p = doc.add_paragraph(style="Title") title_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - title_p.add_run("") + title_p.add_run("") # Subtitle sub_p = doc.add_paragraph(style="Subtitle") sub_p.alignment = WD_ALIGN_PARAGRAPH.CENTER - sub_p.add_run("") + sub_p.add_run("") for _ in range(4): doc.add_paragraph() @@ -323,12 +323,12 @@ def add_cover_page(doc): meta_tbl.columns[0].width = Cm(4.5) meta_tbl.columns[1].width = Cm(8.5) meta_data = [ - ("Projekt", ""), - ("Dokument-ID", ""), + ("Project", ""), + ("Document ID", ""), ("Version", "1.0"), - ("Datum", "YYYY-MM-DD"), - ("Status", "Entwurf"), - ("Klassifikation", "Vertraulich"), + ("Date", "YYYY-MM-DD"), + ("Status", "Draft"), + ("Classification", "Confidential"), ] for i, (k, v) in enumerate(meta_data): c1 = meta_tbl.cell(i, 0) @@ -354,49 +354,49 @@ def add_cover_page(doc): def add_document_control(doc): - doc.add_heading("Dokumentenlenkung", level=1) + doc.add_heading("Document Control", level=1) doc.add_paragraph( - "Diese Seite dokumentiert die formale Lenkung dieses Dokuments gemaess " - "ISO 9001. Aenderungen werden nur ueber den Freigabeprozess wirksam." + "This page documents the formal control of this document per ISO 9001. " + "Changes only take effect after the release process." ) - doc.add_heading("Freigaben", level=2) + doc.add_heading("Approvals", level=2) appr_tbl = doc.add_table(rows=4, cols=4) appr_tbl.style = "Light Grid Accent 1" hdr = appr_tbl.rows[0].cells - for i, h in enumerate(["Rolle", "Name", "Unterschrift / Datum", "Bemerkung"]): + for i, h in enumerate(["Role", "Name", "Signature / Date", "Notes"]): hdr[i].text = "" r = hdr[i].paragraphs[0].add_run(h) r.bold = True set_cell_shading(hdr[i], LIGHT_GREY) - roles = ["Erstellt von", "Geprueft von", "Freigegeben von"] + roles = ["Author", "Reviewer", "Approver"] for i, role in enumerate(roles, start=1): appr_tbl.rows[i].cells[0].text = role for j in (1, 2, 3): appr_tbl.rows[i].cells[j].text = "" - doc.add_heading("Aenderungshistorie", level=2) + doc.add_heading("Revision History", level=2) rev_tbl = doc.add_table(rows=3, cols=4) rev_tbl.style = "Light Grid Accent 1" rev_hdr = rev_tbl.rows[0].cells - for i, h in enumerate(["Version", "Datum", "Aenderung", "Autor"]): + for i, h in enumerate(["Version", "Date", "Change", "Author"]): rev_hdr[i].text = "" r = rev_hdr[i].paragraphs[0].add_run(h) r.bold = True set_cell_shading(rev_hdr[i], LIGHT_GREY) rev_data = [ - ("0.1", "YYYY-MM-DD", "Initialer Entwurf", ""), - ("1.0", "YYYY-MM-DD", "Erstfreigabe", ""), + ("0.1", "YYYY-MM-DD", "Initial draft", ""), + ("1.0", "YYYY-MM-DD", "First release", ""), ] for i, row in enumerate(rev_data, start=1): for j, v in enumerate(row): rev_tbl.rows[i].cells[j].text = v - doc.add_heading("Verteilerkreis", level=2) + doc.add_heading("Distribution List", level=2) dist_tbl = doc.add_table(rows=3, cols=3) dist_tbl.style = "Light Grid Accent 1" dist_hdr = dist_tbl.rows[0].cells - for i, h in enumerate(["Empfaenger", "Rolle", "Organisation"]): + for i, h in enumerate(["Recipient", "Role", "Organisation"]): dist_hdr[i].text = "" r = dist_hdr[i].paragraphs[0].add_run(h) r.bold = True @@ -409,40 +409,40 @@ def add_document_control(doc): def add_toc_pages(doc): - doc.add_heading("Inhaltsverzeichnis", level=1) + doc.add_heading("Table of Contents", level=1) p = doc.add_paragraph() add_field( p, 'TOC \\o "1-3" \\h \\z \\u', - "Inhaltsverzeichnis aktualisieren: F9 (rechte Maustaste auf TOC > Felder aktualisieren)", + "Update TOC: F9 (right-click on TOC > Update Field)", ) doc.add_page_break() - doc.add_heading("Abbildungsverzeichnis", level=1) + doc.add_heading("List of Figures", level=1) p = doc.add_paragraph() add_field( p, - 'TOC \\h \\z \\c "Abbildung"', - "Abbildungsverzeichnis aktualisieren: F9", + 'TOC \\h \\z \\c "Figure"', + "Update list of figures: F9", ) doc.add_page_break() - doc.add_heading("Tabellenverzeichnis", level=1) + doc.add_heading("List of Tables", level=1) p = doc.add_paragraph() add_field( p, - 'TOC \\h \\z \\c "Tabelle"', - "Tabellenverzeichnis aktualisieren: F9", + 'TOC \\h \\z \\c "Table"', + "Update list of tables: F9", ) doc.add_page_break() def add_abbreviations(doc): - doc.add_heading("Abkuerzungsverzeichnis", level=1) + doc.add_heading("Abbreviations", level=1) tbl = doc.add_table(rows=4, cols=2) tbl.style = "Light Grid Accent 1" hdr = tbl.rows[0].cells - for i, h in enumerate(["Abkuerzung", "Bedeutung"]): + for i, h in enumerate(["Abbreviation", "Meaning"]): hdr[i].text = "" r = hdr[i].paragraphs[0].add_run(h) r.bold = True @@ -460,23 +460,23 @@ def add_abbreviations(doc): def add_main_content(doc): # Section 1 - doc.add_heading("1. Einleitung", level=1) - doc.add_heading("1.1 Zweck", level=2) + doc.add_heading("1. Introduction", level=1) + doc.add_heading("1.1 Purpose", level=2) doc.add_paragraph( - "" + "" ) - doc.add_heading("1.2 Geltungsbereich", level=2) - doc.add_paragraph("") - doc.add_heading("1.3 Definitionen", level=2) + doc.add_heading("1.2 Scope", level=2) + doc.add_paragraph("") + doc.add_heading("1.3 Definitions", level=2) doc.add_paragraph( - "" + "" ) - doc.add_heading("1.4 Referenzen", level=2) + doc.add_heading("1.4 References", level=2) ref_tbl = doc.add_table(rows=3, cols=3) ref_tbl.style = "Light Grid Accent 1" ref_hdr = ref_tbl.rows[0].cells - for i, h in enumerate(["ID", "Titel", "Version / Ort"]): + for i, h in enumerate(["ID", "Title", "Version / Location"]): ref_hdr[i].text = "" r = ref_hdr[i].paragraphs[0].add_run(h) r.bold = True @@ -486,60 +486,60 @@ def add_main_content(doc): ref_tbl.rows[i].cells[j].text = "" # Section 2 - doc.add_heading("2. Hauptinhalt", level=1) + doc.add_heading("2. Main Content", level=1) doc.add_paragraph( - "" + "" ) # Demonstrate styles - doc.add_heading("2.1 Beispiel: Formatvorlagen", level=2) + doc.add_heading("2.1 Example: Styles", level=2) doc.add_paragraph( - "Body-Text in der Vorlage. Schriftart Calibri 11 mit 1,15-fachem Zeilenabstand." + "Body text in the template. Calibri 11 with 1.15 line spacing." ) code_p = doc.add_paragraph(style="Code") code_p.add_run( - "// Beispiel-Code im Code-Stil (Consolas 10)\n" + "// Example code in code style (Consolas 10)\n" "Status epb_apply(uint8_t force_percent);" ) set_paragraph_shading(code_p, LIGHT_GREY) note_p = doc.add_paragraph(style="Note") - note_p.add_run("HINWEIS: ").bold = True - note_p.add_run("Hinweis-Stil fuer ergaenzende Informationen.") + note_p.add_run("NOTE: ").bold = True + note_p.add_run("Note style for supplementary information.") set_paragraph_border(note_p, NOTE_BORDER, size=18, side="left") set_paragraph_shading(note_p, NOTE_BG) warn_p = doc.add_paragraph(style="Warning") - warn_p.add_run("ACHTUNG: ").bold = True - warn_p.add_run("Warn-Stil fuer sicherheitsrelevante Hinweise.") + warn_p.add_run("WARNING: ").bold = True + warn_p.add_run("Warning style for safety-relevant information.") set_paragraph_border(warn_p, WARN_BORDER, size=18, side="left") set_paragraph_shading(warn_p, WARN_BG) req_p = doc.add_paragraph(style="Requirement") req_p.add_run("REQ-001: ").bold = True req_p.add_run( - "Requirement-Stil fuer in-line Anforderungen " - "(meist in Markdown via Doorstop, in Word fuer formelle Berichte)." + "Requirement style for inline requirements " + "(usually in Markdown via Doorstop, but in Word for formal reports)." ) set_paragraph_border(req_p, REQ_BORDER, size=18, side="left") set_paragraph_shading(req_p, REQ_BG) - doc.add_heading("2.2 Beispiel-Tabelle", level=2) + doc.add_heading("2.2 Example Table", level=2) tbl = doc.add_table(rows=4, cols=3) tbl.style = "Light Grid Accent 1" hdr = tbl.rows[0].cells - for i, h in enumerate(["ID", "Beschreibung", "ASIL"]): + for i, h in enumerate(["ID", "Description", "ASIL"]): hdr[i].text = "" r = hdr[i].paragraphs[0].add_run(h) r.bold = True set_cell_shading(hdr[i], LIGHT_GREY) rows = [ - ("F-01", "Apply bei Fahrer-Anforderung", "D"), - ("F-05", "Release bei Fahrer-Anforderung", "B"), - ("F-10", "HMI: LED-Steuerung", "QM"), + ("F-01", "Apply on driver request", "D"), + ("F-05", "Release on driver request", "B"), + ("F-10", "HMI: LED control", "QM"), ] for i, row in enumerate(rows, start=1): for j, v in enumerate(row): @@ -547,12 +547,12 @@ def add_main_content(doc): # Caption demo cap_p = doc.add_paragraph(style="Caption") - cap_p.add_run("Tabelle 1: Beispiel-Anforderungen mit ASIL-Klassifikation") + cap_p.add_run("Table 1: Example requirements with ASIL classification") - # Section 3 — Anhang - doc.add_heading("3. Anhang", level=1) + # Section 3 — Appendix + doc.add_heading("3. Appendix", level=1) doc.add_paragraph( - "" + "" ) diff --git a/vorlagen-word/MISRA-Deviation-Permit-vorlage.docx b/vorlagen-word/MISRA-Deviation-Permit-vorlage.docx index f6612ff892972aa82cf44b20f408b093cb855658..ad4262caf8b2771a9c9638d9f0fb45d7a9454532 100644 GIT binary patch delta 4368 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�s8V$~A)dABX=uzpezS?z7i&GuPxL^=)Ig069I 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 KIn4gI-hTo6UZoxY delta 4201 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 t=r}jFYu*0)E!Vlx0iU5ixUm!dS^*`>3u{Hnz delta 4296 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 Rv|vXd$AN>08ucgF{{R(S0aO40 diff --git a/vorlagen-word/PID-vorlage.docx b/vorlagen-word/PID-vorlage.docx index c4126d4285884d399532a300b5428198779b9e68..a643603d33f40e318bfc3a88afe127267eb0946b 100644 GIT binary patch delta 1848 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 diff --git a/vorlagen-word/PM-Plan-vorlage.docx b/vorlagen-word/PM-Plan-vorlage.docx index 5732b85e532c120f04d4e087e632e8945be7e4e0..b8cfe6ec34b0b92093fc2adc778cf19ba97e340a 100644 GIT binary patch delta 5726 zcmZu#1yodB*Pa==28J$a1OX{gLO^L4x*H{j?ydo(q?sY5LrOXZq(gFOK|o57E+qw2 z_?369|NXvy{dcXi?%w&BER3C%B5iUnST6{ED5KaGUbYf#)W7_8U;L$UdWDv5xsER4_r-QiXrfIx z!ANgxjA;W`bU4_w zt$i3I#pV^KeN9f=R`x;sfGxiQ=p{nt$np+MAchTfR|*(Koo8SLe|B~@CJw2}NW17J zrpZJf2Vw-U?ui3IX9$58V7Lo|1aP2rC!nOh@Uh+KQvW6$<}+WC>UN=YV3&~nlWvoh z1o(t_M_;GhSM>Y^1&VyeW|-Zgfswg6v?ta%&36j$y`ZQkzVm7= zK(xejs19z&i%qmtxu2}{Iy_P12V~^!7DEENHY?66`>H)S2Ka%bHt$A~R8H0BOA)_% zE<5Y=D>st+>=nUPOjcbtG*L$1Y_oAr zQFEcHRJbN5u>NhAQ2X>3!;IFr@W#L{zY?3`;Ep3?=D&MZ_ZEbY7z@| z4jhoAK{19w$(-KxweD$!mItJydU3@@t89Ift{!^5Oa03?!EQLEkSHBnoL`#U{$C;4 zjSifTMGXV9=8nhaYi8XEI@xmF>HQKB_aWd?%X;}<0r>hT$2zqX`xA5A7^brF0tO01 zU@Shy7hI zmgwk@;|#a>%CsWw)tK+;lViBGou(h+Q=@yXx@tglM?JBm0Z6B!NJ$V&3d`qL9+c&F z?}D<)(D0E~7_|s*`q=$5Za3wl_8cSc+;5+34G-Jh+nk!*(OG(rnwLPrsM62Hxfj6A2+N zC+2UpI4^2NX1J~&fZL#~X??5uBdfl;H~O1=S@07$+1#e@R(wvbpT}nAJIqcxI+zci znqNbtJYIr6T)Zc5KT+5S_I_B0PW)srMR;6&eB{WSSez%uv(DEXPd%elu7H6Q^3xbQ zxO=tZ=DnS_${8(0jeyM)g{(41J*^?*Zc~YJyseFn~+hJmei+MC0{{ zydDcSN?-i8^(h*!r#C4bB@E)g}$&zUi+#x&A}0 zL^j{kscq_?D=e?2X**fdqDjsJavp0n`#kq^LR#Uxpd+Y!U}>NM@+x-oL%7xEWbBoy z=P^i)3Lxl9@Z4rEem`|>=HDZLxGXmELcZ0|DCig6xad-djJk4?Jtn=UQOuPnBMW~l z$1kpClQJq*<2q0!j?LH`0Wa4%g3ByN7K>qj-TFuphxJA?u0)6Bb?J^GNm%Ps;_$7E z=1*#;-UtB~9^7^QW6ukl&uZO`)(|I#35Rh?Tak&01(XrgT~u_DtWEb~snUp5dYx)h zww-U>r|nbh%N-u*+K}@La`48IwgJ4bSVaD-FaGW7CBB?y1QtG?n=+zW(4Cf$z;bZ1 zvUU(x0RjVH9$Dx=RHOgcyXA&?f!yr=YGfX$#WKU>_d1_I;<*nJG z?AhsOuyJgYv89-Kx{ktkE`t|q^Gg!@rXM_?<~(Y5I-YL%&3Es{@!J`P+M}EBgh+%s z%|Sm>1WTPo?u49ioyKm3J@d+Lb9G{_z?4D*{c$^kbsM=zDN|CM$Mj5Bz<0m zI(W4Fj3oR*+m?AUQSlzR{1+OWs1=@h0_7Ud>fW;TPLUXP=!zg#t{}X?hY7pG;Z)i> zQNR_}4f<7P#^{-RUHIV^3)U8dd77&dQqr+oF>Kzl*RSPj)MFfPu~xtu)r0W?Jh)Tx zjMgl3nKx{3rqunoMHTTehw_l8LCK=HO*p_?Psa4sdOl<-MGrTOW$~~d25v=(qkpPUOdG}rjrqHwp)az8OxUyq-tyePR5H-^_p;_z$K@i6&Badmed zp(e8CQX6f%bqi)upU0eyM8ecs8yD;s4`YBOJ$_P~K-t(bFh>39qBI0%|(rpK>3k7&X3?2Q4(DrEW+c$e&oKqSoSX zMrJdVhC#N|_0~;PP9*R2cOPq))XgN)B4|eI$2rK}?+wjj8c2klCQDjPiH%ZeWO1(8 zeWj~lOO>QinHw?LDzl1`R+JIUpAMaRy!b8`x*b?}E&=9$^dx&{0f3v8eV z!|rGxGLrZ${4Wc%5N=QM#smP?*#Q7j007|Q;%>#~?B!%(?QZ7`hYh3nY3}cx8BQFJx36&@{nJT{}?6%F%tcZ(@^JJNSk>?yH(&h&PkBv@jpD zchIJL&}Iex+Q)Q8=A#3qSO_~S#!{9%4kCmXVhB%+gXeDh{30G;lN#*0=$#8r!H(vD= z>Gi?SC#?jw)K_>$OmPURg8lr++;Tk4Zd(=oVTmYfZ&x{~o76su;KU)RL1!yR8X6n? zBQP9)+AE4)bSXlFszkTGhTAHgzDH-dpJ^+rgl#3CbG%9Svr)YVe5@j1Bn?sojI&g8 ziS~Gdzj_er*B_}Zfz|sy0YUzO3bW)=uRgom2*0JD1HaJWqSNZ8vvJo_U*!b{LA-rd zg@!M~P1BibVEyS=>18AJ<-9oOB5Atmj~8&oPO4T52~%~tXX^?N2qP06q%*s^#l?K% zytLHfge0zFMa+Yf0v985irNM@hxj9KUr!+>4gGWb@tx-Fu?~I zjhIdqAn(gGA(a=&%bD-aR;B08>TUDHK348D%f93pek*l<;NyE3IwKpSK_)LH~2U@V!vqEQ@(nHA>_QqCj? z&TfB5c3lS&sXb?m5DHO5L@teN=Z-ZA5a9<1;y=u>f=vvZ?mA9WM{JkwNvSBi=TP>mZneURrRung z=06Q*Yx8GKl#bZb{lQ-x|NdC3pSbcEx1(W*BzrDVE99Ww^SD&m8`(6$T{5vuD9{IV23vkyX`+Y514Np2m2;ie300n;rHhCA znNW^=I0pI}%F*qxDmeH41aoHm+jdun^;O690&414uvdQ-a!q#+Ml$!V#DDe`N<*T! zEqC&vOp;e;PmtX{N73$$I+lZ2fpfw2`Dqs=G<;JE$Vsaee7l)ddg+E^~? za%L?i|4n6FkR^ZX*Ci*LCpY5qB=JpkV7gg#VtZ)AhDb9$4DHszwY2c=7__ak=I?IO zg}*)G=1oz}H)yCUqAr+#q1zHl57S!%d@I+QQ;|GHwE{#?94sZ9emzeu(-1eK#lUMMrb$JF}xNy1;SpGdeNq{A!OBtrZ_ zc&}MVgwZP{dS4kA2<%oFgzdDs&IiW!Gk=Raw3!`w<^2jF9(fZf0F?J3pS>E@La{bSwxOu`^VW91$Vb7Ch|K6DEygNV^HrwO_Cv3vB``_|DT zx?XQ=Pr_6zNS|y5`)e8dyO`o4f+{7^% zgfmDd6yQ3VeQH%mnVhd<|2pdA@CjT5<`07uRT{mQ95P}Az*&OvPar0b-dj3OyE<7- zgZ!U9*A)g@*F%;#-Zi^t;U9jX*y>0`Yk*_*rYTj7)dN26=T5kjFs?P~+}|fpACy2t zF~K-)5{uk^qte{3pTuZ56l`Pu$eD6dzzgz;Ax`Q#DOhbrjDMQ>LK+G79UZBc-$*}W zTsQxjx8WML3CCUpr{_iew3#vT5%Okm;(Z~OCXslq^OC3r!89zMKJtY<>L^5ysKOLH z_}zT^e0OT554q@0n=*`jD)dXuO-dJ4JbZI=LZaUFhAD~(?eRku2DUij( z>+WMZ=OpOu`#scb*?v>mQ*U{uyZd+nsg#g|>Lp1vSa+d~fULvv?1@*H0z4&xhSU%${pYRUs5pJt)O)COvq1`4c_TBFFpe zpHM$dn~v^}c9)liDWrJZ3u^g{{W^^@Iuk!;a=ei;be}6b8C1?p6%Ow)>a`9PS{j+z zR6)&ASZ!+*j2&&eVM1!5#r4z2#t9m7#BK1u<@1I zk3i?3Z@8t#ykE`S+)UsPxgjEF9sa2FlZ<#hQfATnP^k%u8Bh6JG1R0_=_TOm5#xG$ z&KatN)X97&bnt-3S=L7RmZ{V67D=y0!kxV5w!7%+gK&{mN3Y6fH4NsyT^TU4QS8>_ za^+X2Nw-xkc$%+UwfArl5||+y^gjK(cIGLx(n*7b_Vc6h$H{P%ag}YO-XShJ>{V6l zRB5u4g#dk9hXI+#ZqRWXb!KU1we(W%4~#5bC~3ods~ztcy~oH~ynCj4UH3Du?Q*Zb z>a9RM&wi%A<(&B9Nn%LxPHidNGmw8>GGJzJ?r7mP$0}9B)tPtQo7F&xhr6P?6=rxT z&#BF-l4K!W^YuY%;XWBiM)Na!E6OdScc zV_^CVtSM3~Ed$s9KpPhTK=JRO03pC0P2^iU*1H(=pO{ty=>GvNLm a&$VRhEHcTS5;SgsWOHD__O<$(?SB9wI-Gm} delta 6281 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 YwfSqKWJ7`c)*NALLx;|7`CH@v03DQ+&Hw-a diff --git a/vorlagen-word/QA-Plan-vorlage.docx b/vorlagen-word/QA-Plan-vorlage.docx index 1326ccd0f3f30b450490e45496c6e737c52463bc..890efd52190a9111fe01a09c45540cc57844d5a6 100644 GIT binary patch delta 5557 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 N;7o&bX7xAQ{{aOqSzZ7D delta 6680 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 z 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 b{I$N3XoJJl?T8TVY+##qbf^S&f5ZMCF-BqE diff --git a/vorlagen-word/Review-Protokoll-vorlage.docx b/vorlagen-word/Review-Protokoll-vorlage.docx index 1fa8e59380ec744ac329f07ad5713c56fc6c3076..5ddbe6cb81c37d9a207ed83c55ecdc86d3f379c2 100644 GIT binary patch delta 4533 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 NF>vB0t+2ZQ{VxK2KOq1B diff --git a/vorlagen-word/SWE-Plan-vorlage.docx b/vorlagen-word/SWE-Plan-vorlage.docx index ca5351c5b2435362636f53d664ecfc3ae3f6c975..942ca862f2267869195e0b121a188f4740afe60e 100644 GIT binary patch delta 5876 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 delta 5927 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 delta 7045 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 diff --git a/vorlagen-word/slohmaier-doc-template.docx b/vorlagen-word/slohmaier-doc-template.docx index 4e737a3033a32820258dde405e2469e4765b63d5..de45bff1afca362662dc539cfdf10f96941bdaa1 100644 GIT binary patch delta 4654 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 delta 4592 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 1 Woche | Projektverantwortlicher | 1 Arbeitstag | -| 3 | Scope-Aenderung oder Safety-Concern | Management Auftraggeber | sofort | +## 5. Communication -## 5. Aenderungsmanagement +| Channel | Use | Frequency | +|-----------------|--------------------------------------|-------------| +| Gitea Issues | Tickets, bugs, change requests | as needed | +| Gitea PRs | Reviews, approval, audit trail | per change | +| Status report | Project status update | weekly | +| Standup | Quick alignment | daily | +| Review meeting | Architecture / design / code reviews | per CR | -Aenderungen an Anforderungen, Scope oder Zeitplan werden als Change Request behandelt: +## 6. Risk management -1. Change Request als GitLab Issue erfassen (Label: `change-request`) -2. Auswirkungsanalyse: betroffene Anforderungen, Code, Tests, Zeitplan -3. Bewertung und Freigabe durch Auftraggeber -4. Bei Freigabe: betroffene Work Products aktualisieren, Traceability nachfuehren -5. Dokumentation der Aenderung im Issue (Begruendung, Auswirkung, Entscheidung) +See `RM Plan` (separate document). Top-level summary here: -Keine Aenderung ohne dokumentierte Freigabe. +| ID | Risk | Status | +|------|----------------------------------|-------------| +| R-01 | [Top risk] | [Mitigated] | +| R-02 | [Top risk] | [Open] | -## 6. Risikomanagement +## 7. Reporting -### Vorgehen +- **Weekly status:** email to client with progress + open items +- **Audit report:** at project closure, PDF from Doorstop + Word plans +- **CI artefacts:** updated on every push (coverage, MISRA, traceability) -- Initiale Risiken im PID erfasst -- Risikoliste wird pro Meilenstein-Review aktualisiert -- Neue Risiken werden als GitLab Issues erfasst (Label: `risk`) -- Jedes Risiko hat: Beschreibung, Wahrscheinlichkeit, Auswirkung, Massnahme, Verantwortlicher +## 8. Closure -### Risiko-Bewertung - -| Wahrscheinlichkeit / Auswirkung | Niedrig | Mittel | Hoch | -|----------------------------------|---------|---------|---------| -| Hoch | Mittel | Hoch | Kritisch| -| Mittel | Niedrig | Mittel | Hoch | -| Niedrig | Niedrig | Niedrig | Mittel | - -Kritische Risiken werden sofort eskaliert (siehe Eskalationspfad Stufe 3). +The project is considered closed when: +- All success criteria from the PID are met +- A `v1.0.0` git tag is set +- The release package has been delivered to the client and accepted --- -*Aenderungen an diesem Plan werden im GitLab-Wiki versioniert.* +*Changes to this plan are versioned in the Gitea wiki.* diff --git a/vorlagen/QA-Plan-vorlage.md b/vorlagen/QA-Plan-vorlage.md index df883e4..6d1daaa 100644 --- a/vorlagen/QA-Plan-vorlage.md +++ b/vorlagen/QA-Plan-vorlage.md @@ -1,106 +1,68 @@ -# Quality Assurance Plan (QA-Plan) +# Quality Assurance Plan (QA Plan) -| Feld | Wert | -|-----------------|-------------------------------| -| Projekt | [Projektname] | -| Datum | [YYYY-MM-DD] | -| Version | [1.0] | -| Status | [Entwurf / Freigegeben] | -| ASIL | [QM / A / B / C / D] | +| Field | Value | +|-----------------|--------------------------------| +| Project | [Project name] | +| Date | [YYYY-MM-DD] | +| Version | [1.0] | +| Status | [Draft / Released] | --- -## 1. QA-Aktivitaeten pro Phase +## 1. Quality goals -| Phase | QA-Aktivitaet | Verantwortlich | -|------------------------|--------------------------------------------------------|----------------| -| Anforderungsanalyse | Review der Anforderungen (Vollstaendigkeit, Konsistenz, Testbarkeit) | QA / Reviewer | -| Architektur | Architektur-Review (Modularitaet, Safety-Konzept) | QA / Reviewer | -| Implementierung | Code-Review (MR-Approval), MISRA-Pruefung (CI) | Reviewer / CI | -| Integration & Test | Test-Review, Coverage-Pruefung, Traceability-Check | QA / CI | -| Verifikation | Gesamtpruefung: alle Kriterien erfuellt? | QA | -| Release | Release-Audit: alle Work Products vollstaendig? | QA | +- [Goal 1, e.g. "100% MISRA Required compliance"] +- [Goal 2, e.g. "Statement coverage ≥ 90% for ASIL-D"] +- [Goal 3, e.g. "Zero critical static-analysis findings on release"] -## 2. Zu pruefende Work Products +## 2. Quality measures -| Work Product | Review-Art | Pruefkriterien | -|----------------------------------|------------------|---------------------------------------------| -| PID | Peer Review | Vollstaendig, konsistent mit Vertrag | -| PM-Plan | Peer Review | Realistisch, Risiken adressiert | -| Software Requirements | Technical Review | Eindeutig, testbar, ASIL zugeordnet | -| Architektur-Dokumentation | Technical Review | Modular, Schnittstellen definiert, Safety-Konzept | -| Quellcode | Peer Review (MR) | MISRA-konform, getestet, lesbar | -| Unit Tests | Peer Review | Abdeckung, Randfaelle, Traceability | -| Testberichte | Peer Review | Pass/Fail dokumentiert, Coverage erreicht | -| MISRA Compliance Report | Peer Review | Abweichungen dokumentiert und genehmigt | -| Traceability-Matrix | QA-Pruefung | Keine Luecken, bidirektional | +| Measure | Tool / Method | Frequency | Owner | +|--------------------------|------------------------------|------------------|----------| +| Traceability check | `doorstop check` | every push | dev | +| MISRA check | Cppcheck + MISRA addon | every push | dev | +| Static analysis | Cppcheck, clang-tidy | every push | dev | +| Unit tests | CppUTest | every push | dev | +| Coverage | gcov / lcov | every push | dev | +| Peer review | Gitea PRs | every change | reviewer | +| Architecture review | Technical review | on changes | TL | -## 3. Review-Arten +## 3. Review obligations -| Review-Art | Teilnehmer | Formalitaet | Wann | -|---------------------|-------------------------------|-------------|----------------------------------| -| Peer Review | 1 Reviewer | Niedrig | Jeder MR, Dokument-Aenderungen | -| Technical Review | 2+ Reviewer, inkl. Tech Lead | Mittel | Architektur, Safety-Code, Plaene | -| Inspektion | Moderator + 2+ Reviewer | Hoch | Safety-kritische Artefakte (ASIL C/D) | +| Artefact | Review type | Min. approvers | +|--------------------------------|---------------------|-----------------| +| Requirements | Technical review | 1 | +| Architecture element | Technical review | 2 | +| Code (QM / ASIL-A/B) | Peer review | 1 | +| Code (ASIL-C/D) | Technical review | 2 | +| Plans and reports | Peer review | 1 | +| MISRA deviation permit | Technical lead | 1 | -Peer Reviews laufen ueber GitLab MR-Approvals. Technical Reviews und Inspektionen werden zusaetzlich mit Review-Protokoll dokumentiert. +## 4. Non-conformity management -## 4. Entry/Exit-Kriterien +Deviations from plans or requirements are documented as a non-conformity (NC): -### Entry-Kriterien (Beginn einer Phase) +- Path: `docs/non-conformities/NC-XXX.docx` +- Severity: Critical / Major / Minor +- Corrective action and verification tracked +- Closure criterion: corrective action verified -| Phase | Entry-Kriterien | -|----------------------|--------------------------------------------------------| -| Architektur | Requirements reviewed und freigegeben | -| Implementierung | Architektur reviewed und freigegeben | -| Integration & Test | Code-Reviews abgeschlossen, Unit Tests gruen | -| Verifikation | Alle Tests durchgefuehrt, Coverage gemessen | -| Release | Alle Exit-Kriterien der Verifikation erfuellt | +## 5. Audit preparation -### Exit-Kriterien (Abschluss einer Phase) +Audit readiness is maintained continuously: -| Phase | Exit-Kriterien | -|----------------------|--------------------------------------------------------| -| Anforderungen | Alle Requirements reviewed, ASIL zugeordnet, testbar | -| Architektur | Architektur reviewed, Schnittstellen definiert | -| Implementierung | MISRA-konform, Unit Tests gruen, Coverage-Ziel erreicht | -| Integration & Test | Integrationstests gruen, keine offenen Critical Findings | -| Verifikation | Traceability vollstaendig, alle Findings geschlossen oder bewertet | -| Release | Alle Work Products vollstaendig, QA-Freigabe erteilt | +- Git history is the audit trail (no direct push to `main`) +- Documents are versioned in the repo +- Traceability matrices are generated on every CI run +- MISRA records and deviation permits are stored under `misra/` +- Test and coverage reports are stored as CI artefacts -## 5. Non-Conformity-Prozess +## 6. Improvement measures -1. Abweichung wird erkannt (Review, Audit, Test) -2. Non-Conformity Report erstellen (GitLab Issue, Label: `non-conformity`) -3. Schweregrad zuweisen: Critical / Major / Minor -4. Ursachenanalyse durchfuehren -5. Korrekturmassnahme definieren und umsetzen -6. Wirksamkeitspruefung nach Umsetzung -7. Issue schliessen mit Verweis auf Korrekturnachweis - -**Eskalation:** Critical Non-Conformities werden sofort an den Auftraggeber gemeldet. - -## 6. Reporting an Management - -| Report | Haeufigkeit | Inhalt | -|---------------------------|------------------|-------------------------------------------| -| QA-Status-Report | Pro Meilenstein | Offene Findings, NC-Status, Coverage-Stand | -| Meilenstein-Bewertung | Pro Phase-Ende | Entry/Exit-Kriterien geprueft | -| Release-Bewertung | Vor Release | Gesamtbewertung aller QA-Kriterien | - -## 7. QA-Metriken - -| Metrik | Ziel | Messung | -|---------------------------------|-------------------------|----------------------------------| -| Requirement Coverage | 100% | Anforderungen mit verlinktem Test | -| Code Coverage (Statement) | >= [X]% | gcov/lcov in CI | -| Code Coverage (Branch) | >= [X]% | gcov/lcov in CI | -| MC/DC Coverage (falls ASIL C/D) | >= [X]% | MCDC-Star / kommerziell | -| MISRA Violations | 0 (oder alle genehmigt)| Cppcheck MISRA-Addon in CI | -| Offene Findings (Critical) | 0 vor Release | GitLab Issues | -| Offene Non-Conformities | 0 Critical/Major | GitLab Issues | -| Review-Abdeckung | 100% MRs reviewed | GitLab MR-Approvals | +- Lessons-learned note at each sprint closure under `docs/lessons-learned/` +- Quarterly retrospective with the team +- Updates to this plan are versioned and reviewed --- -*Aenderungen an diesem Plan werden im GitLab-Wiki versioniert.* +*Changes to this plan are versioned in the Gitea wiki.* diff --git a/vorlagen/Review-Protokoll-vorlage.md b/vorlagen/Review-Protokoll-vorlage.md index dcc7625..89bea7a 100644 --- a/vorlagen/Review-Protokoll-vorlage.md +++ b/vorlagen/Review-Protokoll-vorlage.md @@ -1,74 +1,74 @@ -# Review-Protokoll +# Review Minutes -| Feld | Wert | -|-------------------------|-----------------------------------------| -| Datum | [YYYY-MM-DD] | -| Review-Art | [Peer Review / Technical Review / Inspektion] | -| Moderator | [Name] | -| Protokollfuehrer | [Name] | +| Field | Value | +|-------------------------|------------------------------------------| +| Date | [YYYY-MM-DD] | +| Review type | [Peer review / Technical review / Inspection] | +| Moderator | [Name] | +| Minute keeper | [Name] | --- -## 1. Teilnehmer +## 1. Participants -| Name | Rolle | Anwesend | +| Name | Role | Present | |---------------------|--------------------------|----------| -| [Name] | Moderator | Ja / Nein | -| [Name] | Autor | Ja / Nein | -| [Name] | Reviewer | Ja / Nein | -| [Name] | Reviewer | Ja / Nein | +| [Name] | Moderator | Yes / No | +| [Name] | Author | Yes / No | +| [Name] | Reviewer | Yes / No | +| [Name] | Reviewer | Yes / No | -## 2. Reviewtes Work Product +## 2. Reviewed work product -| Feld | Wert | -|-------------------|-------------------------------------------| -| Work Product | [z.B. Architektur-Dokumentation, Modul XY, Anforderungen SWR-040 bis SWR-060] | -| Version / Commit | [Version oder Git-Commit-Hash] | -| GitLab-Referenz | [MR-Link / Wiki-Seite / Issue-Nummern] | +| Field | Value | +|-------------------|--------------------------------------------| +| Work product | [e.g. architecture documentation, module XY, requirements SWR-040 to SWR-060] | +| Version / commit | [Version or git commit hash] | +| Gitea reference | [PR link / wiki page / issue numbers] | -## 3. Review-Vorbereitung +## 3. Review preparation -| Reviewer | Vorbereitungszeit (h) | Vorbereitung abgeschlossen | +| Reviewer | Preparation time (h) | Preparation complete | |-------------------|-----------------------|----------------------------| -| [Name] | [X] | Ja / Nein | -| [Name] | [X] | Ja / Nein | +| [Name] | [X] | Yes / No | +| [Name] | [X] | Yes / No | ## 4. Findings -| ID | Beschreibung | Schwere | Verantwortlich | Fälligkeit | Status | +| ID | Description | Severity | Responsible | Due | Status | |------|---------------------------------|-------------------|----------------|-------------|-------------| -| F-01 | [Beschreibung des Findings] | Critical / Major / Minor | [Name] | [Datum] | Offen | -| F-02 | [Beschreibung des Findings] | Critical / Major / Minor | [Name] | [Datum] | Offen | -| F-03 | [Beschreibung des Findings] | Critical / Major / Minor | [Name] | [Datum] | Offen | +| F-01 | [Finding description] | Critical / Major / Minor | [Name] | [Date] | Open | +| F-02 | [Finding description] | Critical / Major / Minor | [Name] | [Date] | Open | +| F-03 | [Finding description] | Critical / Major / Minor | [Name] | [Date] | Open | -### Schweregrade +### Severities -- **Critical:** Sicherheitsrelevant oder funktional falsch. Muss vor Freigabe behoben werden. -- **Major:** Signifikanter Fehler oder Luecke. Muss behoben werden, kann aber terminiert werden. -- **Minor:** Verbesserungsvorschlag, Stil, Lesbarkeit. Behebung empfohlen. +- **Critical:** Safety-relevant or functionally wrong. Must be fixed before release. +- **Major:** Significant defect or gap. Must be fixed but may be scheduled. +- **Minor:** Improvement suggestion, style, readability. Fix recommended. -## 5. Entscheidung +## 5. Decision -| Entscheidung | +| Decision | |-----------------------------------------------------------| -| [ ] Freigegeben | -| [ ] Bedingt freigegeben (nach Behebung der Critical/Major Findings) | -| [ ] Nicht freigegeben (erneutes Review erforderlich) | +| [ ] Approved | +| [ ] Conditionally approved (after fixing Critical/Major findings) | +| [ ] Not approved (re-review required) | -**Bedingungen fuer bedingte Freigabe:** -[Falls zutreffend: welche Findings muessen behoben werden, wer prueft die Behebung] +**Conditions for conditional approval:** +[If applicable: which findings must be fixed, who verifies the fix] -## 6. Unterschriften / Nachweis +## 6. Signatures / evidence -| Rolle | Name | Datum | Nachweis | +| Role | Name | Date | Evidence | |----------------------|---------------------|-------------|------------------------------| -| Moderator | [Name] | [Datum] | [Unterschrift / GitLab-MR-Approval] | -| Reviewer 1 | [Name] | [Datum] | [Unterschrift / GitLab-MR-Approval] | -| Reviewer 2 | [Name] | [Datum] | [Unterschrift / GitLab-MR-Approval] | -| Autor | [Name] | [Datum] | | +| Moderator | [Name] | [Date] | [Signature / Gitea PR approval] | +| Reviewer 1 | [Name] | [Date] | [Signature / Gitea PR approval] | +| Reviewer 2 | [Name] | [Date] | [Signature / Gitea PR approval] | +| Author | [Name] | [Date] | | -**GitLab-MR-Link:** [URL zum Merge Request, falls zutreffend] +**Gitea PR link:** [URL to the pull request, if applicable] --- -*Dieses Protokoll wird im GitLab-Wiki unter Review-Protokolle/ abgelegt.* +*These minutes are kept in the Gitea wiki under review-minutes/.* diff --git a/vorlagen/SA-vorlage.md b/vorlagen/SA-vorlage.md index 92f30e3..e0f7a6d 100644 --- a/vorlagen/SA-vorlage.md +++ b/vorlagen/SA-vorlage.md @@ -5,100 +5,100 @@ links: - SYS-XXX: [hash] --- -# SA-XXX: [Element-Name] +# SA-XXX: [Element name] > **System Architectural Design Element (ASPICE SYS.3).** -> Beschreibt ein Element der System-Architektur und sein Mapping auf System-Anforderungen. +> Describes a system architecture element and its mapping to system requirements. -| Feld | Wert | -|----------|-------------------------------| -| Projekt | [Projektname] | -| Datum | [YYYY-MM-DD] | -| Version | [1.0] | -| Status | [Entwurf / Freigegeben] | -| ASIL | [QM / A / B / C / D] | -| Autor | [Name] | +| Field | Value | +|----------|--------------------------------| +| Project | [Project name] | +| Date | [YYYY-MM-DD] | +| Version | [1.0] | +| Status | [Draft / Released] | +| ASIL | [QM / A / B / C / D] | +| Author | [Name] | --- -## 1. Verantwortung +## 1. Responsibility -[Was tut dieses Element? Ein bis zwei Saetze. Welcher Zweck im Gesamtsystem.] +[What does this element do? One or two sentences. Its purpose in the overall system.] -## 2. System-Kontext +## 2. System context -[PlantUML-Diagramm: dieses Element im Verhaeltnis zu Nachbarsystemen / Umgebung.] +[PlantUML diagram: this element in relation to neighbouring systems / environment.] ```plantuml @startuml !define COMPONENT(x) component "x" as x COMPONENT([Element]) -[Element] --> [Nachbarsystem A] : Schnittstelle X -[Nachbarsystem B] --> [Element] : Schnittstelle Y +[Element] --> [Neighbour A] : interface X +[Neighbour B] --> [Element] : interface Y @enduml ``` -## 3. Allokation +## 3. Allocation -| Anforderung | Allokation auf | Bemerkung | -|---------------|----------------|---------------------------| -| SYS-XXX | dieses Element | [vollstaendig / teilweise] | -| SYS-YYY | dieses Element | [Begruendung] | +| Requirement | Allocated to | Notes | +|---------------|------------------|------------------------------| +| SYS-XXX | this element | [full / partial] | +| SYS-YYY | this element | [Rationale] | -Allokations-Regel: jede verlinkte System-Anforderung muss eindeutig auf HW, SW oder Mechanik abgebildet werden. +Allocation rule: every linked system requirement must be unambiguously mapped to HW, SW, or mechanics. -## 4. Schnittstellen zur Umgebung +## 4. External interfaces -| Schnittstelle | Richtung | Typ | Bemerkung | -|---------------|---------------|----------------------|--------------------------| -| [Name] | in / out / io | [CAN / SPI / GPIO / ...] | [Protokoll-Verweis] | +| Interface | Direction | Type | Notes | +|---------------|---------------|-----------------------|-------------------------| +| [Name] | in / out / io | [CAN / SPI / GPIO / ...] | [Protocol reference] | -## 5. Subkomponenten / Aufteilung +## 5. Subcomponents / breakdown -[Falls dieses System-Element aus mehreren Subkomponenten besteht: kurze Auflistung mit Verweis auf weitere SA- oder SWA-Elemente.] +[If this system element consists of subcomponents: short list with references to other SA or SWA elements.] -| Subkomponente | Realisierung | Verweis | +| Subcomponent | Realisation | Reference | |---------------|--------------------|-------------------| -| [Name] | [HW / SW / Mechanik] | SWA-XXX / SA-YYY | +| [Name] | [HW / SW / mechanics] | SWA-XXX / SA-YYY | -## 6. Dynamisches Verhalten +## 6. Dynamic behaviour -[PlantUML-Sequenz oder State-Diagramm fuer kritische Ablaeufe.] +[PlantUML sequence or state diagram for critical flows.] ```plantuml @startuml -actor Nutzer -Nutzer -> [Element]: Anforderung -[Element] -> [Nachbar]: weiterleiten -[Nachbar] --> [Element]: Antwort -[Element] --> Nutzer: Ergebnis +actor User +User -> [Element]: request +[Element] -> [Neighbour]: forward +[Neighbour] --> [Element]: response +[Element] --> User: result @enduml ``` -## 7. Nichtfunktionale Eigenschaften +## 7. Non-functional properties -| Aspekt | Anforderung / Zielwert | -|---------------------|-----------------------------| -| Worst-Case Timing | [z.B. < 10 ms Reaktionszeit]| -| Speicherbedarf | [z.B. < 64 KB Flash] | -| Stromaufnahme | [z.B. < 200 mA bei 12 V] | -| Umgebungsbedingungen | [Temperatur, EMV] | -| Sicherheitsziel | [Verweis auf SG-XXX, falls vorhanden] | +| Aspect | Requirement / target value | +|---------------------|------------------------------| +| Worst-case timing | [e.g. < 10 ms reaction time] | +| Memory footprint | [e.g. < 64 KB flash] | +| Power draw | [e.g. < 200 mA at 12 V] | +| Environment | [Temperature, EMC] | +| Safety goal | [Reference to SG-XXX, if any] | -## 8. Designentscheidungen +## 8. Design decisions -| Entscheidung | Alternativen | Begruendung | -|--------------|--------------|-------------| -| [Was] | [Was sonst noch erwogen wurde] | [Warum diese Wahl] | +| Decision | Alternatives | Rationale | +|--------------|--------------|-----------| +| [What] | [What else was considered] | [Why this choice] | -## 9. Verifikation +## 9. Verification -| Anforderung | Verifikations-Methode | Test-ID | -|-------------|------------------------|-------------------| -| SYS-XXX | [Review / Test / Analyse] | TST-SYS-XXX | +| Requirement | Verification method | Test ID | +|-------------|---------------------------|-------------------| +| SYS-XXX | [Review / test / analysis] | TST-SYS-XXX | -Jede in den `links` referenzierte System-Anforderung muss mindestens eine Verifikations-Methode haben. +Every system requirement listed in `links` must have at least one verification method. --- -*Aenderungen an diesem Architektur-Element gehen per PR mit mind. 2 Technical-Review-Approvals (siehe SWE-Plan).* +*Changes to this architecture element go through a PR with at least 2 technical-review approvals (see SWE Plan).* diff --git a/vorlagen/SWA-vorlage.md b/vorlagen/SWA-vorlage.md index 6c03e7d..7f2789b 100644 --- a/vorlagen/SWA-vorlage.md +++ b/vorlagen/SWA-vorlage.md @@ -5,83 +5,83 @@ links: - SWE-XXX: [hash] --- -# SWA-XXX: [Komponenten-Name] +# SWA-XXX: [Component name] > **Software Architectural Design Element (ASPICE SWE.2).** -> Beschreibt eine Software-Komponente und ihr Mapping auf Software-Anforderungen. +> Describes a software component and its mapping to software requirements. -| Feld | Wert | -|----------|-------------------------------| -| Projekt | [Projektname] | -| Datum | [YYYY-MM-DD] | -| Version | [1.0] | -| Status | [Entwurf / Freigegeben] | -| ASIL | [QM / A / B / C / D] | -| Autor | [Name] | -| Parent | [SA-XXX, falls vorhanden] | +| Field | Value | +|----------|--------------------------------| +| Project | [Project name] | +| Date | [YYYY-MM-DD] | +| Version | [1.0] | +| Status | [Draft / Released] | +| ASIL | [QM / A / B / C / D] | +| Author | [Name] | +| Parent | [SA-XXX, if applicable] | --- -## 1. Verantwortung +## 1. Responsibility -[Ein bis zwei Saetze: Was tut diese Komponente? Wo ist die Abgrenzung zu Nachbar-Komponenten?] +[One or two sentences: what does this component do? Where is the boundary to neighbouring components?] -## 2. Statische Sicht +## 2. Static view -### 2.1 Komponentendiagramm +### 2.1 Component diagram ```plantuml @startuml -package "[Komponenten-Name]" { - [Submodul A] - [Submodul B] +package "[Component name]" { + [Submodule A] + [Submodule B] } -[Submodul A] --> [Submodul B] -[Komponenten-Name] ..> [Nachbar-Komponente] : nutzt +[Submodule A] --> [Submodule B] +[Component name] ..> [Neighbour component] : uses @enduml ``` -### 2.2 Eingebettete / verwendete Komponenten +### 2.2 Embedded / used components -| Komponente | Verweis | Verwendung | -|---------------|----------|--------------------------| -| [Name] | SWA-YYY | [wofuer] | +| Component | Reference | Use | +|---------------|-----------|---------------------------| +| [Name] | SWA-YYY | [for what] | -## 3. Schnittstellen +## 3. Interfaces -### 3.1 Bereitgestellte Schnittstelle (Provided) +### 3.1 Provided interface ```c /** - * @brief [Kurzbeschreibung] - * @param [name] [Bedeutung, Wertebereich] - * @return [Status / Wert] - * @pre [Vorbedingung] - * @post [Nachbedingung] + * @brief [Short description] + * @param [name] [Meaning, value range] + * @return [Status / value] + * @pre [Precondition] + * @post [Postcondition] */ Status component_init(const Config* cfg); ``` -| Funktion | Zweck | Pre-Condition | Post-Condition | -|------------------|----------------------|-----------------------|------------------------| -| component_init | Initialisierung | cfg != NULL | Komponente betriebsbereit | -| component_send | Daten senden | initialisiert | Daten in TX-Buffer | +| Function | Purpose | Pre-condition | Post-condition | +|------------------|--------------------|-----------------------|------------------------| +| component_init | Initialisation | cfg != NULL | Component ready | +| component_send | Send data | initialised | Data in TX buffer | -### 3.2 Benoetigte Schnittstelle (Required) +### 3.2 Required interface -| Schnittstelle | Bereitgestellt von | Zweck | -|-------------------|--------------------|-----------------------| -| ILogger::log() | LoggerComponent | Diagnose / Tracing | -| IClock::now() | ClockComponent | Zeitstempel | +| Interface | Provided by | Purpose | +|-------------------|--------------------|---------------------| +| ILogger::log() | LoggerComponent | Diagnostics / tracing | +| IClock::now() | ClockComponent | Timestamps | -## 4. Dynamisches Verhalten +## 4. Dynamic behaviour -### 4.1 Sequenzdiagramm (kritischer Ablauf) +### 4.1 Sequence diagram (critical flow) ```plantuml @startuml participant App -participant "[Komponente]" as C +participant "[Component]" as C participant HW App -> C: init(cfg) C -> HW: configure @@ -90,7 +90,7 @@ C --> App: STATUS_OK @enduml ``` -### 4.2 Zustandsdiagramm (falls zutreffend) +### 4.2 State diagram (if applicable) ```plantuml @startuml @@ -103,46 +103,45 @@ Error --> Ready : reset() @enduml ``` -## 5. Ressourcen-Bedarf +## 5. Resource demand -| Ressource | Worst-Case | Methode der Bestimmung | -|-------------------|--------------|-----------------------------| -| Stack | [z.B. 256 B] | [Messung / statische Analyse] | -| Heap | [z.B. 0 B] | [keine Heap-Nutzung] | -| Flash | [z.B. 4 KB] | [Map-File des Linkers] | -| RAM (statisch) | [z.B. 128 B] | [Map-File des Linkers] | -| CPU-Last | [z.B. < 1 %] | [Messung auf Zielsystem] | -| Worst-Case Timing | [z.B. 200 us / Aufruf init()] | [Messung HiL] | +| Resource | Worst case | Method of determination | +|-------------------|--------------|------------------------------| +| Stack | [e.g. 256 B] | [Measurement / static analysis] | +| Heap | [e.g. 0 B] | [No heap use] | +| Flash | [e.g. 4 KB] | [Linker map file] | +| RAM (static) | [e.g. 128 B] | [Linker map file] | +| CPU load | [e.g. < 1%] | [Measurement on target] | +| Worst-case timing | [e.g. 200 us / call init()] | [HiL measurement] | -## 6. Fehlerverhalten +## 6. Failure behaviour -| Fehlerfall | Erkennung | Reaktion | +| Failure case | Detection | Reaction | |-----------------------|-------------------|---------------------------| -| Ungueltige Konfig | Parameter-Check | Status STATUS_EINVAL | -| HW-Timeout | Timer | Retry, dann STATUS_TIMEOUT | -| Buffer voll | Check vor Schreiben | STATUS_NOSPACE | +| Invalid config | Parameter check | Status STATUS_EINVAL | +| HW timeout | Timer | Retry, then STATUS_TIMEOUT | +| Buffer full | Pre-write check | STATUS_NOSPACE | -## 7. Designentscheidungen +## 7. Design decisions -| Entscheidung | Alternative(n) | Begruendung | -|------------------------|------------------|--------------------------| -| [z.B. statische Allokation] | [Heap] | [deterministisch, MISRA] | -| [Lock-Strategie] | [Mutex / lock-free] | [Begruendung] | +| Decision | Alternative(s) | Rationale | +|------------------------|------------------|----------------------------| +| [e.g. static allocation] | [Heap] | [Deterministic, MISRA] | +| [Locking strategy] | [Mutex / lock-free] | [Rationale] | -## 8. Mapping auf Anforderungen +## 8. Mapping to requirements -| Anforderung | Wie abgedeckt | Verifikations-Test | -|---------------|----------------------------------------------|----------------------------| -| SWE-XXX | [welcher Teil dieser Komponente erfuellt es] | TST-UNIT-XXX, TST-INT-YYY | +| Requirement | How covered | Verification test | +|---------------|-----------------------------------------------|----------------------------| +| SWE-XXX | [which part of this component fulfils it] | TST-UNIT-XXX, TST-INT-YYY | | SWE-YYY | [...] | TST-UNIT-YYY | -Jede in den `links` referenzierte SWE-Anforderung muss in dieser Tabelle einen Eintrag haben. +Every SWE requirement listed in `links` must have an entry in this table. -## 9. Detail-Design +## 9. Detailed design -Detail-Design (ASPICE SWE.3) wird ab ASIL-C separat in `arch/swd/SWD-XXX.md` gefuehrt. -Fuer ASIL-A/B und QM ist Code + Header-Kommentare ausreichend. +Detailed design (ASPICE SWE.3) is maintained separately under `arch/swd/SWD-XXX.md` from ASIL-C upwards. For ASIL-A/B and QM, code plus header comments are sufficient. --- -*Aenderungen an diesem Architektur-Element gehen per PR mit mind. 2 Technical-Review-Approvals (siehe SWE-Plan).* +*Changes to this architecture element go through a PR with at least 2 technical-review approvals (see SWE Plan).* diff --git a/vorlagen/SWE-Plan-vorlage.md b/vorlagen/SWE-Plan-vorlage.md index 78c9036..02aafb1 100644 --- a/vorlagen/SWE-Plan-vorlage.md +++ b/vorlagen/SWE-Plan-vorlage.md @@ -1,132 +1,132 @@ -# Software Development Plan (SWE-Plan) +# Software Development Plan (SWE Plan) -| Feld | Wert | -|-----------------|-------------------------------| -| Projekt | [Projektname] | -| Datum | [YYYY-MM-DD] | -| Version | [1.0] | -| Status | [Entwurf / Freigegeben] | -| ASIL | [QM / A / B / C / D] | +| Field | Value | +|------------------|--------------------------------| +| Project | [Project name] | +| Date | [YYYY-MM-DD] | +| Version | [1.0] | +| Status | [Draft / Released] | +| ASIL | [QM / A / B / C / D] | --- -## 1. Entwicklungsmethode +## 1. Development method -[Beschreibung der Vorgehensweise: iterativ, V-Modell-angelehnt, oder hybrid.] +[Describe the approach: iterative, V-model aligned, or hybrid.] -Grundstruktur folgt dem V-Modell (ISO 26262 Part 6): -- Linke Seite: Anforderungen → Architektur → Detailentwurf → Implementierung -- Rechte Seite: Unit Test → Integrations-Test → System-Test -- Iterationen innerhalb der Phasen moeglich +The base structure follows the V-model (ISO 26262 Part 6): +- Left side: requirements → architecture → detailed design → implementation +- Right side: unit test → integration test → system test +- Iterations within phases are possible -Aenderungen werden ueber Change Requests gesteuert (siehe PM-Plan). +Changes are managed via change requests (see PM Plan). -## 2. Programmiersprache und Standards +## 2. Programming language and standards -| Aspekt | Festlegung | +| Aspect | Decision | |---------------------|-----------------------------------------------------| -| Sprache | [C (C99/C11) / C++ (C++14/17) / Rust] | -| Coding Standard | [MISRA C:2012 / MISRA C:2023 / MISRA C++:2023] | -| Projekt-Guidelines | [Verweis auf Coding-Guidelines im Wiki] | -| Namenskonvention | [z.B. snake_case fuer Funktionen, UPPER_CASE fuer Makros] | +| Language | [C (C99/C11) / C++ (C++14/17) / Rust] | +| Coding standard | [MISRA C:2012 / MISRA C:2023 / MISRA C++:2023] | +| Project guidelines | [Reference to coding guidelines in the wiki] | +| Naming convention | [e.g. snake_case for functions, UPPER_CASE for macros] | -### MISRA-Handhabung +### MISRA handling -- Alle Required- und Mandatory-Regeln werden eingehalten -- Advisory-Regeln: Liste der angewendeten Regeln im Wiki dokumentiert -- Abweichungen werden per MISRA Deviation Record dokumentiert -- Projektweite Abweichungen per MISRA Deviation Permit genehmigt -- MISRA-Pruefung laeuft automatisch in der CI-Pipeline +- All Required and Mandatory rules are observed +- Advisory rules: list of applied rules documented in the wiki +- Deviations are documented per MISRA deviation record +- Project-wide deviations are approved via MISRA deviation permit +- MISRA check runs automatically in the CI pipeline -## 3. Build-Umgebung +## 3. Build environment -| Komponente | Tool / Version | +| Component | Tool / Version | |--------------------|-----------------------------------------------------| -| Build-System | [CMake X.Y / SCons X.Y / Make] | +| Build system | [CMake X.Y / SCons X.Y / Make] | | Compiler | [GCC ARM X.Y / Clang X.Y] | -| Zielplattform | [z.B. ARM Cortex-R5, Cortex-M4] | -| Host-Plattform | [Linux x86_64 / macOS ARM64] | -| CI-Runner | [GitLab Runner, Docker Image: ...] | +| Target platform | [e.g. ARM Cortex-R5, Cortex-M4] | +| Host platform | [Linux x86_64 / macOS ARM64] | +| CI runner | [Gitea Runner, Docker image: ...] | -Build-Umgebung ist reproduzierbar: entweder per Docker-Image oder per dokumentierter Toolchain-Installation. +The build environment is reproducible: either via a Docker image or via a documented toolchain installation. -## 4. Branching-Strategie +## 4. Branching strategy ``` -main — Stabiler, freigegebener Stand -develop — Aktueller Entwicklungsstand -feature/SWR-XXX — Feature-Branch pro Anforderung -bugfix/BUG-XXX — Bugfix-Branch -release/vX.Y — Release-Vorbereitung -hotfix/vX.Y.Z — Kritische Fixes nach Release +main — stable, released state +develop — current development state +feature/SWE-XXX — feature branch per requirement +bugfix/BUG-XXX — bug-fix branch +release/vX.Y — release preparation +hotfix/vX.Y.Z — critical fixes after release ``` -- Feature-Branches von `develop` abzweigen -- Merge nach `develop` nur per MR mit Approval -- `main` und `release/*` sind geschuetzt (kein direkter Push) -- Branch-Name enthaelt Issue-Nummer +- Feature branches are taken off `develop` +- Merge to `develop` only via PR with approval +- `main` and `release/*` are protected (no direct push) +- Branch name includes the issue number -Details: siehe `gitlab-aspice-setup.md`. +Details: see `gitea-aspice-setup.md`. -## 5. Review-Verpflichtungen +## 5. Review obligations -| Artefakt | Review-Art | Mindest-Approvals | -|-----------------------------|-------------------|--------------------| -| Quellcode (MR) | Peer Review | 1 | -| Safety-relevanter Code | Technical Review | 2 | -| Architektur-Dokument | Technical Review | 2 | -| Anforderungen | Technical Review | 1 | -| Testfaelle | Peer Review | 1 | +| Artefact | Review type | Min. approvals | +|-----------------------------|--------------------|-----------------| +| Source code (PR) | Peer review | 1 | +| Safety-relevant code | Technical review | 2 | +| Architecture document | Technical review | 2 | +| Requirements | Technical review | 1 | +| Test cases | Peer review | 1 | -Jeder MR muss vor dem Merge reviewed und approved sein. Self-Merges sind nicht erlaubt (Ausnahme: 1-Person-Projekt mit dokumentiertem Self-Review). +Every PR must be reviewed and approved before merge. Self-merges are not permitted (exception: 1-person project with documented self-review). ## 6. Definition of Done -Ein Feature / eine Anforderung gilt als "Done" wenn: +A feature / requirement is "Done" when: -- [ ] Code ist implementiert und kompiliert fehlerfrei -- [ ] MISRA-Check in CI ist gruen (keine neuen Violations) -- [ ] Static Analysis (Cppcheck, clang-tidy) hat keine neuen Findings -- [ ] Unit Tests sind geschrieben und gruen -- [ ] Coverage-Ziel ist erreicht (siehe Abschnitt 8) -- [ ] MR ist reviewed und approved -- [ ] Anforderung ist mit Test verlinkt (Traceability) -- [ ] Dokumentation ist aktualisiert (falls betroffen) +- [ ] Code is implemented and compiles without errors +- [ ] MISRA check in CI is green (no new violations) +- [ ] Static analysis (Cppcheck, clang-tidy) has no new findings +- [ ] Unit tests are written and green +- [ ] Coverage target is reached (see section 8) +- [ ] PR is reviewed and approved +- [ ] Requirement is linked to a test (traceability) +- [ ] Documentation is updated (if affected) -## 7. Integration und Test-Strategie +## 7. Integration and test strategy -| Teststufe | Verantwortlich | Umgebung | Automatisierung | -|---------------------|----------------|----------------|-----------------| -| Unit Test | Entwickler | Host (x86) | CI-Pipeline | -| Integrations-Test | Entwickler | Host / SiL | CI / manuell | -| System-Test | Test / QA | SiL / HiL | teilweise | -| Abnahme-Test | Auftraggeber | HiL / Fahrzeug | manuell | +| Test level | Owner | Environment | Automation | +|--------------------|----------------|---------------|------------------| +| Unit test | Developer | host (x86) | CI pipeline | +| Integration test | Developer | host / SiL | CI / manual | +| System test | Test / QA | SiL / HiL | partial | +| Acceptance test | Client | HiL / vehicle | manual | -- Unit Tests laufen auf Host-Plattform (Cross-Compilation fuer Tests auf x86) -- Integrationstests pruefen Zusammenspiel der Module -- System-Tests pruefen gegen System-Anforderungen -- HiL-Tests werden vom Auftraggeber bereitgestellt oder gemeinsam definiert +- Unit tests run on the host platform (cross-compilation for x86 testing) +- Integration tests verify module interaction +- System tests verify against system requirements +- HiL tests are provided by the client or jointly defined -## 8. Coverage-Ziele +## 8. Coverage targets -| ASIL | Statement Coverage | Branch Coverage | MC/DC | +| ASIL | Statement coverage | Branch coverage | MC/DC | |------|--------------------|-----------------|----------| -| QM | >= 80% empfohlen | — | — | -| A | >= 80% | empfohlen | — | -| B | >= 80% | >= 80% | — | -| C | >= 90% | >= 80% | empfohlen| -| D | >= 90% | >= 90% | >= 80% | +| QM | ≥ 80% recommended | — | — | +| A | ≥ 80% | recommended | — | +| B | ≥ 80% | ≥ 80% | — | +| C | ≥ 90% | ≥ 80% | recommended | +| D | ≥ 90% | ≥ 90% | ≥ 80% | -Konkrete Zielwerte fuer dieses Projekt: +Concrete target values for this project: -| Metrik | Zielwert | +| Metric | Target | |---------------------|------------| -| Statement Coverage | >= [X]% | -| Branch Coverage | >= [X]% | -| MC/DC | >= [X]% (falls anwendbar) | +| Statement coverage | ≥ [X]% | +| Branch coverage | ≥ [X]% | +| MC/DC | ≥ [X]% (where applicable) | -Coverage wird in der CI gemessen und als Artefakt archiviert. Abweichungen vom Ziel werden begruendet und im QA-Report dokumentiert. +Coverage is measured in CI and archived as an artefact. Deviations from the target are justified and documented in the QA report. --- -*Aenderungen an diesem Plan werden im GitLab-Wiki versioniert.* +*Changes to this plan are versioned in the Gitea wiki.* diff --git a/vorlagen/Test-Plan-vorlage.md b/vorlagen/Test-Plan-vorlage.md index 5f745df..adbfb2b 100644 --- a/vorlagen/Test-Plan-vorlage.md +++ b/vorlagen/Test-Plan-vorlage.md @@ -1,121 +1,69 @@ -# Testplan +# Test Plan -| Feld | Wert | -|-----------------|-------------------------------| -| Projekt | [Projektname] | -| Datum | [YYYY-MM-DD] | -| Version | [1.0] | -| Status | [Entwurf / Freigegeben] | -| ASIL | [QM / A / B / C / D] | -| Bezug | SWE-Plan Version [X.Y] | +| Field | Value | +|-----------------|--------------------------------| +| Project | [Project name] | +| Date | [YYYY-MM-DD] | +| Version | [1.0] | +| Status | [Draft / Released] | --- -## 1. Testziele +## 1. Test strategy -- Nachweis, dass die Software die spezifizierten Anforderungen erfuellt -- Nachweis der strukturellen Code-Abdeckung gemaess ASIL-Vorgaben -- Nachweis der Robustheit gegenueber Fehlbedienung und Grenzwerten -- Identifikation von Defekten vor der Integration / Auslieferung +[Describe the approach: e.g. test-first, requirement-based, risk-based.] -## 2. Teststrategie +Each requirement has at least one test (`@reqs` tag in the test). Coverage targets as in the SWE Plan section 8. -| Teststufe | Testziel | Methode | Automatisierung | -|---------------------|---------------------------------------------|------------------|-----------------| -| Unit Test | Einzelne Funktionen / Module korrekt | White-Box | CI (automatisch)| -| Integrations-Test | Zusammenspiel der Module | Grey-Box | CI / SiL | -| System-Test | Erfuellung der System-Anforderungen | Black-Box | SiL / HiL | -| Regressionstest | Keine Seiteneffekte durch Aenderungen | Automatisiert | CI | +## 2. Test levels -### Unit Tests +| Level | Scope | Tool | Environment | Status | +|---------------|----------------------|------------|-------------|---------------| +| Unit | Functions / modules | [CppUTest] | host x86 | [planned] | +| Integration | Module interaction | [CppUTest] | host / SiL | [planned] | +| System | End-to-end | [manual] | SiL / HiL | [planned] | +| Acceptance | Client acceptance | [manual] | HiL / vehicle | [planned] | -- Framework: [CppUTest / Google Test / Unity+CMock] -- Laufen auf Host-Plattform (x86) -- Jede Anforderung hat mindestens einen zugehoerigen Testfall -- Negative Tests und Grenzwerte sind Pflicht +## 3. Test management -### Integrationstests +- Tests live in `tests/unit/`, `tests/integration/`, ... +- Each test file carries `@reqs` tags pointing to the covered requirements +- Tests run automatically in CI on every push +- Coverage report is published as a CI artefact -- Pruefen Schnittstellen zwischen Modulen -- Laufen auf Host oder SiL-Umgebung -- Kommunikationsschnittstellen (CAN, SPI, UART) werden per Mock oder Simulator getestet +## 4. Test selection per component -### System-Tests +| Component | ASIL | Test file | Method | +|--------------------|------|----------------------------------|---------------------------------| +| [Component A] | [D] | tests/unit/test_componentA.c | Equivalence classes + boundary + MC/DC | +| [Component B] | [B] | tests/unit/test_componentB.c | Equivalence classes + boundary | +| [Component C] | [QM] | tests/unit/test_componentC.c | Equivalence classes | -- Pruefen gegen System-Anforderungen -- Laufen auf SiL oder HiL -- Testfaelle werden aus System-Requirements abgeleitet +## 5. Entry and exit criteria -## 3. Coverage-Ziele +**Entry to test execution:** +- Code compiles +- Doorstop check is green +- Static analysis has no critical findings -| Metrik | Zielwert | Messung | -|---------------------|----------------|------------------| -| Statement Coverage | >= [X]% | gcov/lcov | -| Branch Coverage | >= [X]% | gcov/lcov | -| MC/DC | >= [X]% (falls anwendbar) | MCDC-Star / kommerziell | +**Exit:** +- All tests green +- Coverage target reached +- Test report archived -Referenz: ISO 26262 Part 6, Table 9. +## 6. Defect handling -| ASIL | Statement | Branch | MC/DC | -|------|-----------|---------|--------------| -| QM | empfohlen | — | — | -| A | Pflicht | empfohlen | — | -| B | Pflicht | Pflicht | — | -| C | Pflicht | Pflicht | empfohlen | -| D | Pflicht | Pflicht | Pflicht | +- Test failure = blocking issue +- Issue raised via Gitea Issues, referenced in the PR +- Severity classification per QA Plan section 4 -## 4. Testumgebung +## 7. Reporting -| Komponente | Beschreibung | -|---------------------|----------------------------------------------------| -| Host-Plattform | [Linux x86_64 / macOS ARM64] | -| Cross-Compiler | [GCC ARM X.Y] | -| Test-Framework | [CppUTest / Google Test / Unity] | -| SiL-Framework | [Python + pytest, Kommunikation: UART/CAN/TCP] | -| HiL-System | [dSPACE Scalexio / vom Kunden gestellt / entfaellt] | -| CI-Runner | [GitLab Runner, Docker Image: ...] | - -## 5. Testdaten - -- Testdaten werden im Repository unter `tests/data/` versioniert -- Grenzwerte aus Anforderungen ableiten -- Ungueltige Eingaben explizit testen -- Testdaten fuer Regressionen aus Bug-Reports ableiten - -## 6. Pass/Fail-Kriterien - -### Einzelner Testfall - -- **Pass:** Erwartetes Ergebnis stimmt mit tatsaechlichem ueberein -- **Fail:** Abweichung vom erwarteten Ergebnis - -### Teststufe gesamt - -| Kriterium | Bedingung fuer Pass | -|----------------------------------------|----------------------------------------| -| Alle Testfaelle ausgefuehrt | Ja | -| Alle Testfaelle bestanden | Ja (oder Fails bewertet und genehmigt) | -| Coverage-Ziel erreicht | Ja | -| Keine offenen Critical Findings | Ja | -| Traceability vollstaendig | Jede Anforderung hat mindestens einen Test | - -Fehlgeschlagene Tests, die nicht behoben werden, muessen per Non-Conformity oder Change Request dokumentiert und bewertet werden. - -## 7. Traceability - -Jeder Testfall muss auf mindestens eine Anforderung rueckfuehrbar sein. - -``` -Anforderung (GitLab Issue, Label: req::software) - → Testfall (GitLab Issue, Label: test::unit / test::integration / test::system) - → Testergebnis (CI-Artefakt / JUnit-XML) -``` - -Umsetzung: -- Testfall-Issue verlinkt auf Anforderungs-Issue ("relates to" oder "verified by") -- Im Testcode: Kommentar mit Anforderungs-ID (`// Verifies: SWR-042`) -- Traceability-Report wird per Skript aus GitLab API generiert +Test reports are generated automatically: +- Console output of the test framework (TAP / JUnit XML) +- Coverage HTML from lcov +- Both as CI artefacts under `tests/results/` --- -*Aenderungen an diesem Plan werden im GitLab-Wiki versioniert.* +*Changes to this plan are versioned in the Gitea wiki.* diff --git a/vorlagen/Traceability-Matrix-vorlage.md b/vorlagen/Traceability-Matrix-vorlage.md index be6a99a..c11f0be 100644 --- a/vorlagen/Traceability-Matrix-vorlage.md +++ b/vorlagen/Traceability-Matrix-vorlage.md @@ -1,67 +1,67 @@ -# Traceability-Matrix +# Traceability Matrix -## Prinzip +## Principle -Die Traceability-Matrix stellt die Rueckverfolgbarkeit von der Anforderung bis zum Test sicher: +The traceability matrix ensures end-to-end traceability from requirement to test: ``` -System-Anforderung → Software-Anforderung → Architektur-Element → Implementierung (MR/Datei) → Testfall → Testergebnis +System requirement → Software requirement → Architecture element → Implementation (PR/file) → Test case → Test result ``` -Jede Ebene muss bidirektional verfolgbar sein: -- **Vorwaerts:** Anforderung → wurde sie implementiert und getestet? -- **Rueckwaerts:** Testfall → welche Anforderung verifiziert er? +Each level must be traceable in both directions: +- **Forward:** requirement → has it been implemented and tested? +- **Backward:** test case → which requirement does it verify? -## Tabellenstruktur +## Table structure -| Sys-Req | SW-Req | ASIL | Arch-Element | Implementierung | Testfall | Test-Ergebnis | Status | -|---------|---------|------|--------------|----------------------|----------|---------------|--------------| -| SYR-001 | SWR-010 | B | MOD-Timer | MR !23, timer.c | TC-010 | Pass (v1.2) | Vollstaendig | -| SYR-001 | SWR-011 | B | MOD-Timer | MR !23, timer.c | TC-011 | Pass (v1.2) | Vollstaendig | -| SYR-002 | SWR-020 | A | MOD-CAN | MR !31, can_driver.c | TC-020 | Pass (v1.2) | Vollstaendig | -| SYR-003 | SWR-030 | B | MOD-Watchdog | — | — | — | Offen | -| — | SWR-040 | QM | MOD-Diag | MR !35, diag.c | TC-040 | Fail (v1.1) | Finding offen| +| Sys-Req | SW-Req | ASIL | Arch element | Implementation | Test case | Test result | Status | +|---------|---------|------|--------------|----------------------|-----------|---------------|--------------| +| SYR-001 | SWR-010 | B | MOD-Timer | PR !23, timer.c | TC-010 | Pass (v1.2) | Complete | +| SYR-001 | SWR-011 | B | MOD-Timer | PR !23, timer.c | TC-011 | Pass (v1.2) | Complete | +| SYR-002 | SWR-020 | A | MOD-CAN | PR !31, can_driver.c | TC-020 | Pass (v1.2) | Complete | +| SYR-003 | SWR-030 | B | MOD-Watchdog | — | — | — | Open | +| — | SWR-040 | QM | MOD-Diag | PR !35, diag.c | TC-040 | Fail (v1.1) | Finding open | -## Spalten-Erklaerung +## Column explanation -| Spalte | Beschreibung | +| Column | Description | |------------------|----------------------------------------------------------------| -| Sys-Req | System-Anforderungs-ID (GitLab Issue mit Label `req::system`) | -| SW-Req | Software-Anforderungs-ID (GitLab Issue mit Label `req::software`) | -| ASIL | Zugewiesener ASIL-Level | -| Arch-Element | Architektur-Modul oder -Komponente | -| Implementierung | Merge Request und/oder Datei | -| Testfall | Testfall-ID (GitLab Issue mit Label `test::*`) | -| Test-Ergebnis | Pass/Fail mit Version/Datum | -| Status | Vollstaendig / Offen / Finding offen | +| Sys-Req | System requirement ID (Gitea issue with label `req::system`) | +| SW-Req | Software requirement ID (Gitea issue with label `req::software`) | +| ASIL | Assigned ASIL level | +| Arch element | Architecture module or component | +| Implementation | Pull request and/or file | +| Test case | Test case ID (Gitea issue with label `test::*`) | +| Test result | Pass/Fail with version/date | +| Status | Complete / Open / Finding open | -## Lueckenanalyse +## Gap analysis -Die Matrix macht Luecken sichtbar: +The matrix makes gaps visible: -- **Anforderung ohne Test:** Zeile ohne Testfall-Eintrag → Test fehlt -- **Anforderung ohne Implementierung:** Zeile ohne MR → nicht implementiert -- **Test ohne Anforderung:** Testfall der keiner Anforderung zugeordnet ist → ueberpruefen -- **Fail ohne Finding:** Fehlgeschlagener Test ohne dokumentiertes Finding → nacharbeiten +- **Requirement without test:** row without test-case entry → test missing +- **Requirement without implementation:** row without PR → not implemented +- **Test without requirement:** test case not assigned to any requirement → verify +- **Fail without finding:** failed test without a documented finding → rework -## Automatische Generierung aus GitLab +## Automatic generation from Gitea -Diese Matrix kann aus GitLab-Issues automatisch generiert werden: +The matrix can be generated automatically from Gitea issues: -1. Python-Skript liest ueber GitLab API alle Issues mit `req::*`-Labels -2. Folgt Issue-Links zu Architektur-Issues, MRs und Test-Issues -3. Liest CI-Pipeline-Ergebnisse (JUnit-XML) fuer Testergebnisse -4. Erzeugt die Matrix als Markdown-Tabelle oder CSV +1. A Python script reads all issues with `req::*` labels via the Gitea API +2. It follows issue links to architecture issues, PRs, and test issues +3. It reads CI-pipeline results (JUnit XML) for test outcomes +4. It produces the matrix as a Markdown table or CSV -**Voraussetzung:** Issues sind korrekt verlinkt und gelabelt (siehe `gitlab-aspice-setup.md`). +**Precondition:** issues are correctly linked and labelled (see `gitea-aspice-setup.md`). -**Ausgabe-Formate:** -- Markdown (fuer Wiki / Dokumentation) -- CSV (fuer Import in Kundensysteme) -- HTML (fuer Reporting) +**Output formats:** +- Markdown (for wiki / documentation) +- CSV (for import into customer systems) +- HTML (for reporting) -Ein Beispiel-Skript liegt unter `tools/traceability-report.py` im Projekt-Repository. +An example script lives at `tools/traceability-report.py` in the project repository. --- -*Die aktuelle Traceability-Matrix wird bei jedem Release aktualisiert und im Wiki abgelegt.* +*The current traceability matrix is updated on every release and stored in the wiki.* diff --git a/vorlagen/angebot-vorlage.md b/vorlagen/angebot-vorlage.md index 8e6ff18..39677a5 100644 --- a/vorlagen/angebot-vorlage.md +++ b/vorlagen/angebot-vorlage.md @@ -1,7 +1,7 @@ - - + + - +