Tag 1 abgeschlossen

This commit is contained in:
Christoph Schwörer
2026-08-26 08:19:33 +02:00
parent f045b99a25
commit 7df384f6d2
77 changed files with 7456 additions and 3311 deletions
+137 -16
View File
@@ -2,7 +2,7 @@
name: run-experiment name: run-experiment
description: Führt einen Versuchs-Prompt aus einer Prompt-Datei als messbaren Headless-Lauf aus (claude -p) und schreibt ein Messprotokoll mit Start-/Endzeit, Modell, Tokenverbrauch und weiteren Metriken. Verwenden bei "/run-experiment <Pfad-zur-Prompt-Datei>" oder wenn der User einen Versuch/ein Experiment ausführen und tracken will. description: Führt einen Versuchs-Prompt aus einer Prompt-Datei als messbaren Headless-Lauf aus (claude -p) und schreibt ein Messprotokoll mit Start-/Endzeit, Modell, Tokenverbrauch und weiteren Metriken. Verwenden bei "/run-experiment <Pfad-zur-Prompt-Datei>" oder wenn der User einen Versuch/ein Experiment ausführen und tracken will.
argument-hint: <Pfad zur Prompt-Datei> <Root-Verzeichnis> argument-hint: <Pfad zur Prompt-Datei> <Root-Verzeichnis>
version: 3.10.0 version: 4.0.0
--- ---
# RunExperiment – Versuchslauf mit Messprotokoll # RunExperiment – Versuchslauf mit Messprotokoll
@@ -72,7 +72,22 @@ gilt das Protokoll.
für parallele Läufe (siehe „Parallele Läufe") und archiviert nebenbei den exakt gesendeten für parallele Läufe (siehe „Parallele Läufe") und archiviert nebenbei den exakt gesendeten
Prompt je Lauf. `Ergebnisse\` enthält ausschließlich die vom Prompt geforderten Artefakte. Prompt je Lauf. `Ergebnisse\` enthält ausschließlich die vom Prompt geforderten Artefakte.
## Ablauf ## Aufbau dieses Skills
Der Skill ist zweigeteilt:
- **`## Prozess`** beschreibt werkzeugneutral, **was** je Lauf zu tun und zu erheben ist. Dieser
Teil gilt unabhängig davon, mit welchem LLM oder welcher CLI gearbeitet wird.
- **`## Werkzeugadapter`** beschreibt **wie** das mit einem konkreten Werkzeug umgesetzt wird.
Derzeit ist nur der Adapter für Claude Code ausgearbeitet.
**Arbeitsteilung mit der Prompt-Datei:** Der Prompt enthält ausschließlich die *Analyseanweisung*
und ist damit von jedem LLM verwendbar. Alles Werkzeug- und Ablaufbezogene – verfügbare
Werkzeuge, Ausgabeverzeichnis, Messgrößen – steuert dieser Skill bei und dokumentiert es im
Protokoll. Die Prompt-Datei wird dabei **nie verändert**; ergänzende Blöcke werden nur an den
per stdin übergebenen Text angehängt (siehe Schritt „Prompt zusammenstellen").
## Prozess
### 1. Vorbereitung ### 1. Vorbereitung
@@ -177,7 +192,7 @@ Prompt je Lauf. `Ergebnisse\` enthält ausschließlich die vom Prompt geforderte
```powershell ```powershell
# Bedingungen werden Ordnerebenen, nicht Namensbestandteile # Bedingungen werden Ordnerebenen, nicht Namensbestandteile
$zelle = Join-Path (Join-Path $modell $modus) $effort $zelle = Join-Path (Join-Path $modell $modus) $effort
$skillVer = 'v3.10.0' # entspricht version: im Frontmatter dieses Skills $skillVer = 'v4.0.0' # entspricht version: im Frontmatter dieses Skills
do { do {
$id4 = '{0:x4}' -f (Get-Random -Maximum 65536) $id4 = '{0:x4}' -f (Get-Random -Maximum 65536)
$lauf = Join-Path "<promptverzeichnis>\$zelle" "<NN>_Lauf_$(Get-Date -Format 'yyyy-MM-dd_HHmmss')_${skillVer}-$id4" $lauf = Join-Path "<promptverzeichnis>\$zelle" "<NN>_Lauf_$(Get-Date -Format 'yyyy-MM-dd_HHmmss')_${skillVer}-$id4"
@@ -232,11 +247,34 @@ committet und im Protokoll dokumentiert.
**Das Remote ist entkoppelt.** Im Codebasis-Repo wird niemals gepusht, gefetcht oder ein Remote **Das Remote ist entkoppelt.** Im Codebasis-Repo wird niemals gepusht, gefetcht oder ein Remote
hinzugefügt. Der Snapshot bleibt eingefroren. hinzugefügt. Der Snapshot bleibt eingefroren.
### 2. Ausführung (Headless-Lauf) ### 2. Prompt zusammenstellen
Dem Prompt eine Ausgabe-Anweisung anhängen, damit die Ergebnisse im Laufverzeichnis landen Dem Prompttext werden **zwei** Blöcke angehängt. Die Prompt-Datei selbst bleibt unverändert –
und nicht im Root. Dazu den Prompttext um einen Abschnitt ergänzen (Prompt-Datei selbst ergänzt wird nur der per stdin übergebene Text, und dieser wird als `_meta\combined_prompt.md`
NICHT verändern – nur den per stdin übergebenen Text): archiviert.
**Block 1 – Werkzeugkontext.** Der Prompt trifft bewusst keine Annahme darüber, welche Werkzeuge
zur Verfügung stehen. Diese Bedingung stellt der Versuchsaufbau bei; sie ist die untersuchte
unabhängige Variable und gehört deshalb hierher, nicht in die Analyseanweisung:
```
### Werkzeugkontext (vom Versuchsaufbau vorgegeben)
Für diesen Lauf stehen zur Verfügung: <Auflistung>.
Nicht verfügbar sind: <Auflistung>.
Triff keine Annahmen über weitere Werkzeuge und versuche nicht, nicht verfügbare
Werkzeuge zu ersetzen.
```
Der Inhalt richtet sich nach dem Agentenmodus:
| Modus | „Zur Verfügung" | „Nicht verfügbar" |
|---|---|---|
| `solo` | Lesen, Suchen und Ausführen von Kommandozeilenbefehlen im Arbeitsverzeichnis | Subagenten, spezialisierte Agentenrollen, externe Werkzeugserver |
| `builtin` | zusätzlich die werkzeugeigenen Subagenten | spezialisierte Agentenrollen aus Konfigurationsdateien, externe Werkzeugserver |
| `custom` | zusätzlich die beigestellten Agentenrollen (namentlich nennen) | externe Werkzeugserver, sofern nicht Teil des Versuchs |
**Block 2 – Ausgabeverzeichnis.** Damit die Ergebnisse im Laufverzeichnis landen und nicht in
der Codebasis:
``` ```
### Ausgabeverzeichnis (überschreibt anderslautende Pfadangaben oben) ### Ausgabeverzeichnis (überschreibt anderslautende Pfadangaben oben)
@@ -245,6 +283,8 @@ Schreibe ALLE zu erzeugenden Ergebnisdateien in das Verzeichnis
Verändere keine Dateien im Arbeitsverzeichnis (der analysierten Codebasis). Verändere keine Dateien im Arbeitsverzeichnis (der analysierten Codebasis).
``` ```
### 3. Ausführung (Headless-Lauf)
Dann den kombinierten Prompt per stdin an `claude -p` übergeben. `--add-dir` gibt dem Dann den kombinierten Prompt per stdin an `claude -p` übergeben. `--add-dir` gibt dem
Headless-Lauf Schreibrecht auf das Laufverzeichnis außerhalb seines Arbeitsverzeichnisses. Headless-Lauf Schreibrecht auf das Laufverzeichnis außerhalb seines Arbeitsverzeichnisses.
Versuchsläufe können lange dauern – **immer als Background-Task starten** (`run_in_background`), Versuchsläufe können lange dauern – **immer als Background-Task starten** (`run_in_background`),
@@ -347,7 +387,7 @@ Regeln:
der Tokenverbrauch. Anhaltspunkt: Der bisher aufwendigste Lauf verbrauchte 55.167.397 Tokens. der Tokenverbrauch. Anhaltspunkt: Der bisher aufwendigste Lauf verbrauchte 55.167.397 Tokens.
- Nach Abschluss des Background-Tasks: Endzeit mit `Get-Date -Format o` erfassen. - Nach Abschluss des Background-Tasks: Endzeit mit `Get-Date -Format o` erfassen.
### 3. Ergebnis auswerten ### 4. Ergebnis auswerten
`RawResult.json` im Laufverzeichnis lesen und defensiv parsen (Feldnamen können je nach Claude-Code-Version `RawResult.json` im Laufverzeichnis lesen und defensiv parsen (Feldnamen können je nach Claude-Code-Version
leicht abweichen). Relevante Felder: leicht abweichen). Relevante Felder:
@@ -472,6 +512,16 @@ aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` und schreibt `_metanforderung
Abrechnung, Berechtigungen brauchen `PRIMÄR` **oder** `[HYPOTHESE]`), Verifizierbarkeit Abrechnung, Berechtigungen brauchen `PRIMÄR` **oder** `[HYPOTHESE]`), Verifizierbarkeit
(Prüfidee vorhanden), Traceability (Tracelinks gesetzt) (Prüfidee vorhanden), Traceability (Tracelinks gesetzt)
**Zuordnung zum Evaluationsrahmen (Kap. 4.3).** Die erhobenen Kenngrößen decken die
**maschinell prüfbare** Hälfte der drei Qualitätsdimensionen ab; die Expertenbewertung nach
Likert-Skala bleibt davon unberührt und tritt daneben:
| Dimension (Kap. 4.3) | Maschinell erhoben | Bleibt der Expertenbewertung |
|---|---|---|
| **Statement-Qualität** | Belegqualität, Primärbelegquote, Anteil mit Prüfidee, Hypothesenanteil, Übernahmewürdigkeit | Eindeutigkeit der Formulierung, sachliche Korrektheit, Verständlichkeit |
| **Set-Qualität** | Verteilung über die Ebenen, Konsolidierungskandidaten, doppelte IDs, Anforderungen ohne Beleg | Vollständigkeit der Prozessabdeckung, Redundanzfreiheit im fachlichen Sinn |
| **Traceability-Qualität** | Anteil mit Tracelinks, Belegklassifikation, Tracelinks auf nicht existierende IDs | Auffindbarkeit des Belegs, Nachvollziehbarkeit der Ableitung |
**Warum das erhoben wird:** Die Anforderungsanzahl allein ist als Qualitätsmaß wertlos – sie **Warum das erhoben wird:** Die Anforderungsanzahl allein ist als Qualitätsmaß wertlos – sie
streute über Läufe gleicher Bedingung um Faktor 5,9. Belegdichte, Primärbelegquote und streute über Läufe gleicher Bedingung um Faktor 5,9. Belegdichte, Primärbelegquote und
Regelverstöße sind dagegen inhaltliche Größen und machen Läufe vergleichbar, deren Mengengerüst Regelverstöße sind dagegen inhaltliche Größen und machen Läufe vergleichbar, deren Mengengerüst
@@ -488,7 +538,7 @@ ins Protokoll. Beim Vergleich Zeilenenden
normalisieren (`before.txt` entsteht je nach Werkzeug mit CRLF, der Nachher-Stand mit LF), normalisieren (`before.txt` entsteht je nach Werkzeug mit CRLF, der Nachher-Stand mit LF),
sonst meldet ein naiver `diff` alle Zeilen als geändert. sonst meldet ein naiver `diff` alle Zeilen als geändert.
### 4. Messprotokoll schreiben ### 5. Messprotokoll schreiben
Als `Protokoll.md` ins Laufverzeichnis, neben `RawResult.json` und `Stderr.log`. Als `Protokoll.md` ins Laufverzeichnis, neben `RawResult.json` und `Stderr.log`.
@@ -522,6 +572,10 @@ Vorlage:
- **Parallele Läufe:** <nein | ja: welche Laufverzeichnisse liefen zeitgleich> - **Parallele Läufe:** <nein | ja: welche Laufverzeichnisse liefen zeitgleich>
- **Agentenmodus:** <solo (V1) | builtin (V1b) | custom (V2)>; bei `custom` zusätzlich - **Agentenmodus:** <solo (V1) | builtin (V1b) | custom (V2)>; bei `custom` zusätzlich
Pfad und SHA-256 der Agentendefinitionen Pfad und SHA-256 der Agentendefinitionen
- **Kontextfenster:** <Tokens, z. B. aus `modelUsage.contextWindow`>
- **Sampling-Parameter:** <Temperatur u. a. | nicht steuerbar>
- **Nur bei lokalem Modellbetrieb:** Inferenz-Runtime samt Version, Quantisierungsstufe des
Modell-Builds
- **Permission-Mode:** <acceptEdits | ...> - **Permission-Mode:** <acceptEdits | ...>
- **Toolfreigabe:** `--allowedTools <wörtlich>` / `--disallowedTools <wörtlich>` - **Toolfreigabe:** `--allowedTools <wörtlich>` / `--disallowedTools <wörtlich>`
- **Isolationsmechanismus:** <--safe-mode, --strict-mcp-config, ggf. --setting-sources> - **Isolationsmechanismus:** <--safe-mode, --strict-mcp-config, ggf. --setting-sources>
@@ -531,6 +585,16 @@ Vorlage:
Bei `max_depth` > 1 ausdrücklich vermerken – die Tokens der tieferen Ebenen sind in Bei `max_depth` > 1 ausdrücklich vermerken – die Tokens der tieferen Ebenen sind in
„Tokens gesamt" enthalten, ihre Prompts jedoch **nicht** in `_meta\subagenten.md` „Tokens gesamt" enthalten, ihre Prompts jedoch **nicht** in `_meta\subagenten.md`
## Validierungsstichprobe
- **Größe:** <vor Versuchsbeginn festgelegte Anzahl Anforderungen>
- **Ziehungsverfahren:** <Zufallsstichprobe über alle Ebenen | ...>
- **Validatoren:** <Anzahl und fachlicher Zuschnitt>
- **Stand:** <noch nicht gezogen | gezogen am <Datum> | ausgewertet>
Kapitel 4.3 verlangt, die Stichprobengröße **vor** Versuchsbeginn festzulegen und im
Versuchsprotokoll zu dokumentieren. Ist für den Lauf keine Validierung vorgesehen, hier
`entfällt` eintragen – das Feld darf nicht fehlen.
## Verbrauch ## Verbrauch
### Hauptagent (`usage`) ### Hauptagent (`usage`)
@@ -576,12 +640,59 @@ Status, Regelkonformität>
- **Anmerkungen/Auffälligkeiten:** <Beobachtungen, Abbrüche, manuelle Eingriffe> - **Anmerkungen/Auffälligkeiten:** <Beobachtungen, Abbrüche, manuelle Eingriffe>
``` ```
### 5. Abschlussbericht an den User ### 6. Abschlussbericht an den User
Kurz zusammenfassen: Status, Dauer, Tokenverbrauch (inkl. Cache), Modell, Pfad des Kurz zusammenfassen: Status, Dauer, Tokenverbrauch (inkl. Cache), Modell, Pfad des
Laufverzeichnisses und welche Dateien der Lauf erzeugt hat. Bei `is_error` oder leerem Laufverzeichnisses und welche Dateien der Lauf erzeugt hat. Bei `is_error` oder leerem
Ergebnis: `Stderr.log` und `RawResult.json` zitieren, nicht spekulieren. Ergebnis: `Stderr.log` und `RawResult.json` zitieren, nicht spekulieren.
## Werkzeugadapter
Der Prozess oben ist werkzeugneutral. Dieser Abschnitt hält fest, wie er mit einem konkreten
Werkzeug umgesetzt wird und welche Messgrößen dieses Werkzeug liefert.
### Adapter: Claude Code
Der einzige derzeit ausgearbeitete Adapter. Alle konkreten Aufrufe, Flags und Feldnamen im
Prozessteil beziehen sich auf ihn; er wurde gegen **CLI 2.1.245** entwickelt und verifiziert.
**Gelieferte Messgrößen** – vollständig aus `RawResult.json`:
| Messgröße | Feld |
|---|---|
| Abbruchstatus | `is_error`, `subtype`, `stop_reason`, `terminal_reason` |
| Dauer | `duration_ms`, `duration_api_ms` (Wanduhr wird selbst gemessen) |
| Tokens Hauptagent | `usage.*` inkl. `output_tokens_details.thinking_tokens` |
| Tokens gesamt inkl. aller Subagenten-Ebenen | `modelUsage` je Modell-ID |
| Tatsächlich eingesetzte Modelle | Schlüssel von `modelUsage` |
| Verweigerte Werkzeugaufrufe | `permission_denials` |
| Subagenten | `subagent_stats` inkl. `spawned_by_subagents`, `max_depth`, `failed` |
| Sitzungskennung für Transcript-Analyse | `session_id` |
**Nicht erfasst:** Sampling-Parameter wie Temperatur sind über die CLI nicht steuerbar und
werden nicht ausgewiesen; der Effort steht **nicht** in `RawResult.json` und ist nur über das
Session-Transkript belegbar (siehe Schritt 6 der Vorbereitung).
### Weitere Adapter (für Versuch 4 nachzurüsten)
Kapitel 4 der Arbeit sieht einen LLM-Querschnitt über Codex CLI, Qwen Code CLI über LM Studio
und DeepSeek über die Cloud-API vor. Diese Adapter sind noch nicht ausgearbeitet. Damit ein
Lauf als Messpunkt taugt, muss ein Adapter mindestens liefern:
| Pflichtangabe | Zweck |
|---|---|
| Modell-ID und Kontextfenster | Bedingung dokumentieren |
| Input- und Output-Tokens | Aufwandsvergleich |
| Dauer | Aufwandsvergleich |
| Abbruchstatus | Gültigkeit des Laufs |
| Erzeugte Artefakte | Ertrag |
| Sampling-Parameter, soweit steuerbar | Reproduzierbarkeit (Kap. 4.3) |
| Bei lokalem Betrieb: Runtime samt Version, Quantisierungsstufe | Reproduzierbarkeit (Kap. 4.3) |
Was ein Adapter nicht liefern kann, wird im Protokoll ausdrücklich als `nicht erfasst`
ausgewiesen – niemals geschätzt. Fehlen mehrere Pflichtangaben, ist der Lauf nur eingeschränkt
mit Claude-Code-Läufen vergleichbar; das gehört in die Anmerkungen des Protokolls.
## Randbedingungen ## Randbedingungen
- Niemals Messwerte schätzen oder erfinden – fehlt ein Feld im JSON, im Protokoll als - Niemals Messwerte schätzen oder erfinden – fehlt ein Feld im JSON, im Protokoll als
@@ -638,6 +749,7 @@ der Historie unten – im selben Arbeitsschritt.
| **3.8.0** | **Pflichtprüfung der tatsächlich eingesetzten Modelle.** `modelUsage` ist nach jedem Lauf gegen das angeforderte Modell abzugleichen; neue Protokollfelder „Modell (angefordert)", „Modelle (tatsächlich eingesetzt)" und „Kontrolle Modell". | `--model` steuert nur den Hauptagenten. Im Lauf `fable5_builtin_ehigh_v3.7.0-15db` liefen die 13 Subagenten auf `claude-opus-5[1m]` statt auf Fable – 91 % des Verbrauchs entfielen auf ein nicht angefordertes Modell, und der Lauf wurde mit 150,3 Mio. Tokens der teuerste der Reihe. Ohne diese Prüfung bleibt die Bedingungsverletzung unbemerkt. | ab sofort; Gegenprüfung der 23 Vorläufe ergab keine weiteren Fälle | | **3.8.0** | **Pflichtprüfung der tatsächlich eingesetzten Modelle.** `modelUsage` ist nach jedem Lauf gegen das angeforderte Modell abzugleichen; neue Protokollfelder „Modell (angefordert)", „Modelle (tatsächlich eingesetzt)" und „Kontrolle Modell". | `--model` steuert nur den Hauptagenten. Im Lauf `fable5_builtin_ehigh_v3.7.0-15db` liefen die 13 Subagenten auf `claude-opus-5[1m]` statt auf Fable – 91 % des Verbrauchs entfielen auf ein nicht angefordertes Modell, und der Lauf wurde mit 150,3 Mio. Tokens der teuerste der Reihe. Ohne diese Prüfung bleibt die Bedingungsverletzung unbemerkt. | ab sofort; Gegenprüfung der 23 Vorläufe ergab keine weiteren Fälle |
| **3.9.0** | **Pflichtabschnitt „Gefundene Anforderungen" im Protokoll.** Neues Skript `analyse-anforderungen.py` wertet die erzeugten Anforderungen aus: Verteilung, Typen, Belegqualität (`PRIMÄR`/`SEKUNDÄR`/`KONTEXT`), Status, Konsolidierungskandidaten und **Regelkonformität gegen die Vorgaben des Prompts**. | Die Protokolle maßen bis dahin nur den Aufwand, nicht den Ertrag. Die reine Anforderungsanzahl taugt nicht als Qualitätsmaß (Streuung Faktor 5,9 bei gleicher Bedingung); Belegdichte und Regelverstöße sind inhaltliche Größen. Erste Anwendung deckte sofort Verstöße gegen die risikobasierte Priorisierung auf. | rückwirkend auf alle 24 Protokolle angewandt | | **3.9.0** | **Pflichtabschnitt „Gefundene Anforderungen" im Protokoll.** Neues Skript `analyse-anforderungen.py` wertet die erzeugten Anforderungen aus: Verteilung, Typen, Belegqualität (`PRIMÄR`/`SEKUNDÄR`/`KONTEXT`), Status, Konsolidierungskandidaten und **Regelkonformität gegen die Vorgaben des Prompts**. | Die Protokolle maßen bis dahin nur den Aufwand, nicht den Ertrag. Die reine Anforderungsanzahl taugt nicht als Qualitätsmaß (Streuung Faktor 5,9 bei gleicher Bedingung); Belegdichte und Regelverstöße sind inhaltliche Größen. Erste Anwendung deckte sofort Verstöße gegen die risikobasierte Priorisierung auf. | rückwirkend auf alle 24 Protokolle angewandt |
| **3.10.0** | **Bedingungen als Ordnerstruktur statt im Dateinamen.** Ablage unter `<ModellID>\<Agentenmodus>\<Effort>\`; der Verzeichnisname lautet wieder `<NN>_Lauf_<yyyy-MM-dd_HHmmss>_v<skillversion>-<id4>`. Neues Protokollfeld „Ablage". | Der Name wuchs mit jeder unabhängigen Variable und war mit fünf Bestandteilen kaum lesbar. Als Ordnerebenen sind die Bedingungen navigierbar, je Zelle unmittelbar abzählbar und um weitere Variablen erweiterbar, ohne bestehende Namen zu brechen. | rückwirkend auf alle 24 Läufe angewandt | | **3.10.0** | **Bedingungen als Ordnerstruktur statt im Dateinamen.** Ablage unter `<ModellID>\<Agentenmodus>\<Effort>\`; der Verzeichnisname lautet wieder `<NN>_Lauf_<yyyy-MM-dd_HHmmss>_v<skillversion>-<id4>`. Neues Protokollfeld „Ablage". | Der Name wuchs mit jeder unabhängigen Variable und war mit fünf Bestandteilen kaum lesbar. Als Ordnerebenen sind die Bedingungen navigierbar, je Zelle unmittelbar abzählbar und um weitere Variablen erweiterbar, ohne bestehende Namen zu brechen. | rückwirkend auf alle 24 Läufe angewandt |
| **4.0.0** | **Ausrichtung auf Kapitel 4 der Arbeit.** Skill zweigeteilt in `## Prozess` (werkzeugneutral) und `## Werkzeugadapter` (konkrete Aufrufe, derzeit nur Claude Code). Der Prompt trägt nur noch die Analyseanweisung; Werkzeugkontext und Ausgabeverzeichnis werden zur Laufzeit angehängt. Versuchszuordnung korrigiert: **V1 = `solo`, V1b = `builtin`**. Neue Protokollfelder: Kontextfenster, Sampling-Parameter, lokale Runtime-Angaben, Abschnitt Validierungsstichprobe. Abschnitt „Gefundene Anforderungen" den drei Qualitätsdimensionen zugeordnet. | Prompt und Skill waren über 24 Läufe organisch gewachsen und stellenweise nicht mehr deckungsgleich mit Kap. 4. Der Prompt enthielt Aussagen zur Werkzeugkonfiguration, die dort nicht hingehören und ihn an Claude Code banden; der Skill verankerte weder den Evaluationsrahmen noch die von Kap. 4.3 geforderten Reproduzierbarkeitsangaben. MAJOR, weil sich die Zuordnung der Versuchsbedingungen ändert. | ab sofort |
## Parallele Läufe ## Parallele Läufe
@@ -671,13 +783,22 @@ verwenden.
## Zuordnung Versuch ↔ Agentenmodus ## Zuordnung Versuch ↔ Agentenmodus
Nach Kapitel 4 der Arbeit (Versuchsdesign):
| Versuch | Modus | Bedeutung | | Versuch | Modus | Bedeutung |
|---|---|---| |---|---|---|
| **V1** – Baseline (Prompt-only) | `solo` | Ein Thread, ein Kontext; keine Subagenten | | **V1** – Baseline (Prompt-only) | `solo` | Ein Thread, ein Kontext; keine Subagenten |
| **V1b** – Baseline mit internen Agenten | `builtin` | Eingebaute Subagenten (`Explore`, `general-purpose`) | | **V1b** – Baseline mit werkzeugeigenen Agenten | `builtin` | Eingebaute Subagenten des Werkzeugs zugelassen |
| **V2** – Agentengestützt | `custom` | Nur vordefinierte, geprompte Agenten aus `--agents` | | **V2** – Agentengestützt | `custom` | Rollenspezialisierte Agentendateien: Stakeholder, System, Software, ISO-29148-Orchestrator |
| **V3** – Werkzeugzugriff | `custom` + MCP | Wie V2, zusätzlich externe Werkzeugserver |
**Einordnung der bisherigen Läufe:** Die Läufe 1–6 in `Versuche/Versuch_01/` liefen sämtlich mit **Abgrenzung V1 gegen V1b.** Die Arbeit unterscheidet zwischen *Agentendateien* (V2) und den
eingebauten Subagenten und gehören damit fachlich zu **V1b**, nicht zu V1. Sie belegen weiterhin *werkzeugeigenen* Subagenten, die eine CLI von sich aus mitbringt. Letztere sind keine
die Laufvarianz unter `builtin`, sind aber keine Baseline-Messung im Sinne der neuen Definition. Konfigurationsartefakte und damit nach dem Wortlaut von V1 nicht ausgeschlossen – ihr Einsatz
Bei der Auswertung entsprechend zuordnen. verändert die Ergebnisse jedoch erheblich. V1b trennt beide Fälle, sodass der Effekt der
werkzeugeigenen Delegation getrennt vom Effekt der rollenspezialisierten Agentendateien
messbar wird.
**Bisherige Läufe.** Die 24 Läufe in `Versuche/Versuch_01/` verteilen sich auf V1 (`solo`) und
V1b (`builtin`). Die Ordnerstruktur macht die Zuordnung unmittelbar sichtbar; die Zellen sind
über `ls <ModellID>/<Modus>/<Effort> | wc -l` abzählbar.
@@ -54,6 +54,7 @@ def analysiere(lauf):
konsolidierung=feld(b, 'Konsolidierung'), konsolidierung=feld(b, 'Konsolidierung'),
pruefidee=feld(b, 'Prüfidee') or feld(b, 'Pruefidee'), pruefidee=feld(b, 'Prüfidee') or feld(b, 'Pruefidee'),
qm=feld(b, 'Qualitätsmerkmal'), qm=feld(b, 'Qualitätsmerkmal'),
uebernahme=feld(b, 'Übernahmewürdigkeit') or feld(b, 'Uebernahmewuerdigkeit'),
)) ))
return anf return anf
@@ -88,6 +89,20 @@ def abschnitt(anf):
kons = [a for a in anf if a['konsolidierung'] and a['konsolidierung'].lower() != 'nein'] kons = [a for a in anf if a['konsolidierung'] and a['konsolidierung'].lower() != 'nein']
mit_qm = [a for a in anf if a['qm']] mit_qm = [a for a in anf if a['qm']]
# Uebernahmewuerdigkeit: erst ab Prompt-Fassung 2026-08-26; aeltere Laeufe kennen das Feld nicht
uebern = collections.Counter()
for a in anf:
v = a['uebernahme'].lower()
if not v:
continue
for schl in ('übernehmen', 'workaround', 'sonderfall', 'veraltet'):
if schl in v:
uebern[schl] += 1
break
else:
uebern['(sonstige Angabe)'] += 1
mit_uebern = sum(uebern.values())
risiko = [a for a in anf if RISIKO.search(a['typ'] + ' ' + a['titel'])] risiko = [a for a in anf if RISIKO.search(a['typ'] + ' ' + a['titel'])]
risiko_ungedeckt = [a for a in risiko if 'PRIMÄR' not in a['belege'] and not a['hypothese']] risiko_ungedeckt = [a for a in risiko if 'PRIMÄR' not in a['belege'] and not a['hypothese']]
@@ -97,6 +112,11 @@ def abschnitt(anf):
z = ['## Gefundene Anforderungen', '', z = ['## Gefundene Anforderungen', '',
'Maschinell aus `Ergebnisse\\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet ' 'Maschinell aus `Ergebnisse\\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet '
'(Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.', '', '(Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.', '',
'Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus '
'Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, '
'Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und '
'Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach '
'Likert-Skala tritt daneben und wird hier nicht ersetzt.', '',
'### Verteilung über die Ebenen', '', '### Verteilung über die Ebenen', '',
'| Ebene | Anzahl | Anteil |', '|---|---:|---:|'] '| Ebene | Anzahl | Anteil |', '|---|---:|---:|']
for eb in EBENEN: for eb in EBENEN:
@@ -122,6 +142,20 @@ def abschnitt(anf):
pct(sum(1 for a in anf if 'PRIMÄR' in a['belege']), n)), pct(sum(1 for a in anf if 'PRIMÄR' in a['belege']), n)),
''] '']
z += ['### Übernahmewürdigkeit', '']
if not mit_uebern:
z += ['**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der '
'Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. '
'Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.', '']
else:
z += ['| Einstufung | Anzahl | Anteil |', '|---|---:|---:|']
for k in ('übernehmen', 'workaround', 'sonderfall', 'veraltet', '(sonstige Angabe)'):
if uebern.get(k):
z.append('| %s | %d | %s |' % (k, uebern[k], pct(uebern[k], n)))
if n - mit_uebern:
z.append('| **ohne Angabe** | %d | %s |' % (n - mit_uebern, pct(n - mit_uebern, n)))
z.append('')
z += ['### Status', '', '| Kategorie | Anzahl | Anteil |', '|---|---:|---:|', z += ['### Status', '', '| Kategorie | Anzahl | Anteil |', '|---|---:|---:|',
'| belegt | %d | %s |' % (n - len(hyp), pct(n - len(hyp), n)), '| belegt | %d | %s |' % (n - len(hyp), pct(n - len(hyp), n)),
'| als `HYPOTHESE` gekennzeichnet | %d | %s |' % (len(hyp), pct(len(hyp), n)), '| als `HYPOTHESE` gekennzeichnet | %d | %s |' % (len(hyp), pct(len(hyp), n)),
@@ -145,6 +179,10 @@ def abschnitt(anf):
z.append('| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | %s |' z.append('| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | %s |'
% ('**erfüllt**' if not ohne_pruef % ('**erfüllt**' if not ohne_pruef
else '**verletzt** – %d ohne Prüfidee' % len(ohne_pruef))) else '**verletzt** – %d ohne Prüfidee' % len(ohne_pruef)))
z.append('| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | %s |'
% ('*nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26)' if not mit_uebern
else ('**erfüllt** (alle %d Anforderungen eingestuft)' % n if mit_uebern == n
else '**verletzt** – %d von %d ohne Angabe' % (n - mit_uebern, n))))
z.append('| **Traceability** – Verknüpfung zwischen den Ebenen | %d von %d mit Tracelinks (%s) |' z.append('| **Traceability** – Verknüpfung zwischen den Ebenen | %d von %d mit Tracelinks (%s) |'
% (n - len(ohne_trace), n, pct(n - len(ohne_trace), n))) % (n - len(ohne_trace), n, pct(n - len(ohne_trace), n)))
z.append('') z.append('')
@@ -31,6 +31,8 @@ Der Versuchsaufbau folgt einer schrittweise aufbauenden Vergleichslogik. Versuch
/ Versuch 1 (Baseline, Prompt-only): Reine Prompt-Steuerung ohne Agentendateien und ohne externe Tools. Die Hypothese lautet, dass eine formal strukturierte Anforderungsmenge bereits ohne Spezialisierung erreichbar ist, allerdings mit begrenzter Discovery-Breite und ohne dynamische Code- oder Datenbeobachtung. / Versuch 1 (Baseline, Prompt-only): Reine Prompt-Steuerung ohne Agentendateien und ohne externe Tools. Die Hypothese lautet, dass eine formal strukturierte Anforderungsmenge bereits ohne Spezialisierung erreichbar ist, allerdings mit begrenzter Discovery-Breite und ohne dynamische Code- oder Datenbeobachtung.
/ Versuch 1b (Baseline mit werkzeugeigenen Agenten): Wie Versuch 1, jedoch mit den Subagenten, die das eingesetzte Werkzeug von sich aus mitbringt. Diese Subagenten sind keine Agentendateien im Sinne von Versuch 2, sondern eine Funktion der CLI. Der Versuch trennt damit den Effekt werkzeugeigener Delegation vom Effekt rollenspezialisierter Agentendateien. Die Hypothese lautet, dass die Delegation die Discovery-Breite erhöht, zugleich aber die Streuung zwischen Läufen deutlich vergrößert, weil das Werkzeug die Zerlegung der Analyse selbst wählt.
/ Versuch 2 (Spezialisierung über Agenten): Wie Versuch 1, ergänzt um rollenspezialisierte Agentendateien für Stakeholder-Analyse, System-Requirements, Software-Requirements und einen ISO-29148-Orchestrator. Die Hypothese lautet, dass Spezialisierung die Strukturierungstiefe und die Normkonformität erhöht, ohne die Discovery-Breite signifikant zu verschlechtern. / Versuch 2 (Spezialisierung über Agenten): Wie Versuch 1, ergänzt um rollenspezialisierte Agentendateien für Stakeholder-Analyse, System-Requirements, Software-Requirements und einen ISO-29148-Orchestrator. Die Hypothese lautet, dass Spezialisierung die Strukturierungstiefe und die Normkonformität erhöht, ohne die Discovery-Breite signifikant zu verschlechtern.
/ Versuch 3 (Toolzugriff über MCP-Server): Wie Versuch 2, ergänzt um strukturierten Tool-Zugriff über MCP. Vorgesehen sind drei Server für Symbol-Navigation auf Code-Ebene, für Datenbank-Inspektion auf Schema- und Datensatzebene sowie optional für GUI-Beobachtung. Die Hypothese lautet, dass strukturierter Tool-Zugriff die Discovery-Breite vergrößert und zuvor undokumentierte Use Cases sichtbar macht, allerdings zu Lasten erhöhter Steuerungskomplexität. / Versuch 3 (Toolzugriff über MCP-Server): Wie Versuch 2, ergänzt um strukturierten Tool-Zugriff über MCP. Vorgesehen sind drei Server für Symbol-Navigation auf Code-Ebene, für Datenbank-Inspektion auf Schema- und Datensatzebene sowie optional für GUI-Beobachtung. Die Hypothese lautet, dass strukturierter Tool-Zugriff die Discovery-Breite vergrößert und zuvor undokumentierte Use Cases sichtbar macht, allerdings zu Lasten erhöhter Steuerungskomplexität.
@@ -53,9 +55,19 @@ Der Versuchsaufbau folgt einer schrittweise aufbauenden Vergleichslogik. Versuch
- Formal strukturierte Spezifikation erreichbar - Formal strukturierte Spezifikation erreichbar
- Discovery-Breite begrenzt - Discovery-Breite begrenzt
], ],
[V2 Agenten], [V1b Werkzeug-Agenten],
[ [
- Wie V1 - Wie V1
- werkzeugeigene Subagenten zugelassen
- keine Agentendateien
],
[
- Höhere Discovery-Breite
- Deutlich größere Streuung zwischen Läufen
],
[V2 Agenten],
[
- Wie V1b
- rollenspezialisierte Agentendateien - rollenspezialisierte Agentendateien
], ],
[ [
@@ -172,4 +184,6 @@ Jede Prompt-Version wird im Versuchsordner mit Zeitstempel und kurzer Notiz zum
caption: [Zustandsgraph des Versuchsablaufs. Die Versuche bauen schrittweise aufeinander auf, V4 ist optional. Der finale Prompt eines Versuchs wird zu Beginn des Folgeversuchs an die neu hinzukommende Werkzeugkomponente angepasst und dient dann als Startprompt. Innerhalb jedes Versuchs verfeinert ein Iterations-Loop den Prompt: Lauf → Begutachtung durch den Autor → bei „nein" Prompt-Anpassung, bei „ja" Übergang zum nächsten Versuch.], caption: [Zustandsgraph des Versuchsablaufs. Die Versuche bauen schrittweise aufeinander auf, V4 ist optional. Der finale Prompt eines Versuchs wird zu Beginn des Folgeversuchs an die neu hinzukommende Werkzeugkomponente angepasst und dient dann als Startprompt. Innerhalb jedes Versuchs verfeinert ein Iterations-Loop den Prompt: Lauf → Begutachtung durch den Autor → bei „nein" Prompt-Anpassung, bei „ja" Übergang zum nächsten Versuch.],
) <abb_versuchsablauf> ) <abb_versuchsablauf>
Abweichend von dieser Aufteilung wurde ein Teil des Modellvergleichs bereits innerhalb von Versuch 1 durchgeführt. Nachdem sich in den Wiederholungsläufen eine unerwartet große Streuung zeigte, wurde derselbe Prompt unter sonst identischer Bedingung zusätzlich mit zwei weiteren Modellen ausgeführt, um zu prüfen, ob diese Streuung modellabhängig ist. Diese Läufe liegen deshalb im Versuchsordner von Versuch 1 und nicht in Versuch 4. Sie ersetzen den dort geplanten LLM-Querschnitt nicht, da sie nur die Baseline-Konfiguration abdecken und nicht die in Versuch 1 bis 3 wirksamste Konfiguration. Ihr Zweck ist die Absicherung der Varianzaussage, nicht der Werkzeugvergleich.
Konstanten und Variablen sind in jedem Versuch klar dokumentiert. In Versuch 1 bis 3 umfassen die Konstanten Codebasis, Iterations-Vorgehen, Modellfamilie, Validierungsstichprobe und Bewertungskriterien. Variabel sind die Werkzeugkonfiguration und der Startprompt jedes Versuchs. Versuch 1 startet mit einem zu Versuchsbeginn neu formulierten Prompt. Versuch 2 und Versuch 3 übernehmen jeweils den finalen Prompt des vorhergehenden Versuchs und passen ihn zu Beginn an die neu hinzukommende Werkzeugkomponente an (Agentendateien in Versuch 2, MCP-Server in Versuch 3). Erst dieser angepasste Prompt bildet den Ausgangspunkt für den Iterations-Loop des Folgeversuchs. In Versuch 4 wird die Logik umgekehrt. Die Werkzeugkonfiguration ist die Konstante, das Modell die Variable. Damit lassen sich Unterschiede in Versuch 1 bis 3 ursächlich der Werkzeugvariation und in Versuch 4 ursächlich der Modellwahl zuordnen. Konstanten und Variablen sind in jedem Versuch klar dokumentiert. In Versuch 1 bis 3 umfassen die Konstanten Codebasis, Iterations-Vorgehen, Modellfamilie, Validierungsstichprobe und Bewertungskriterien. Variabel sind die Werkzeugkonfiguration und der Startprompt jedes Versuchs. Versuch 1 startet mit einem zu Versuchsbeginn neu formulierten Prompt. Versuch 2 und Versuch 3 übernehmen jeweils den finalen Prompt des vorhergehenden Versuchs und passen ihn zu Beginn an die neu hinzukommende Werkzeugkomponente an (Agentendateien in Versuch 2, MCP-Server in Versuch 3). Erst dieser angepasste Prompt bildet den Ausgangspunkt für den Iterations-Loop des Folgeversuchs. In Versuch 4 wird die Logik umgekehrt. Die Werkzeugkonfiguration ist die Konstante, das Modell die Variable. Damit lassen sich Unterschiede in Versuch 1 bis 3 ursächlich der Werkzeugvariation und in Versuch 4 ursächlich der Modellwahl zuordnen.
+342
View File
@@ -0,0 +1,342 @@
# Ablaufprotokoll der Versuchsdurchführung
**Zeitraum:** 25.–26. August 2026
**Untersuchungsgegenstand:** c-entron ERP-Suite, eingefrorener Snapshot `79c1142`
**Zweck dieses Dokuments:** Grundlage für den Ergebnisteil der Arbeit (Kapitel 5 und 6).
Festgehalten wird, wie Prompt und Versuchsaufbau schrittweise entstanden sind, welche Läufe
durchgeführt wurden und welche Erkenntnisse sich daraus ergeben haben. Der methodisch
wesentliche Punkt: **Der Versuchsaufbau ist nicht vorab fertig gewesen, sondern an den Läufen
gewachsen.** Jede Änderung geht auf eine konkrete Beobachtung zurück. Diese Kopplung ist hier
dokumentiert, damit im Ergebnisteil nachvollziehbar bleibt, welche Messung unter welchen
Bedingungen entstand.
---
## 1. Ausgangslage
Zu Beginn lagen vor:
- ein Initial-Prompt (`Versuche/Versuch_01/01_Prompt.md`) mit der Analyseanweisung nach
ISO/IEC/IEEE 29148, abgestimmt auf die RRE-Methodenkette aus Kapitel 4
- ein Skill `run-experiment` (Version 1.0.0), der den Prompt als Headless-Lauf ausführt und ein
Messprotokoll schreibt
- die Codebasis als eigenständiges Git-Repository mit aktivem GitHub-Remote
Nicht vorhanden waren: eine belastbare Isolationsstrategie, eine Definition der zu erhebenden
Messgrößen über Tokens und Dauer hinaus, und jede Vorstellung davon, wie stark Läufe unter
gleichen Bedingungen streuen.
---
## 2. Chronologie in fünf Phasen
### Phase 1 – Erster Lauf und die Entdeckung der Werkzeugkonfiguration (12:29–13:00)
Der erste Lauf offenbarte sofort ein Grundproblem: Das Codebasis-Verzeichnis enthielt genau die
Dinge, die die Versuchsbedingung „keine Agentendateien, keine MCP-Server" ausschließt – eine
`CLAUDE.md` mit 201 Zeilen Projektkontext, `AGENTS.md`, drei projektspezifische Subagenten,
34 Skill-Definitionen, sechs Slash-Commands, elf Serena-Memories und einen aktiven MCP-Server.
Diese Dateien wurden vor dem Lauf gelöscht und danach per `git restore` zurückgesetzt.
**Ergebnis:** 96 Anforderungen, 13,1 Mio. Tokens, **36 Permission-Denials** (32 × Bash,
4 × PowerShell). Der Lauf war unter `--permission-mode acceptEdits` gestartet – dieser Modus
erlaubt Dateibearbeitungen, aber keine Shell-Ausführung. Der Agent wich auf Read, Grep und Glob
aus; Verzeichnisinventuren und Dateizählungen standen ihm nicht zur Verfügung. Von rund 85
Business-Logic-Modulen blieben 55 bis 60 unanalysiert.
**Auslöser für die erste große Skill-Änderung.**
### Phase 2 – Werkzeugfreigabe, Isolation und der eingefrorene Snapshot (13:49–15:00)
Zwei Entscheidungen fielen zusammen:
**Shell-Zugriff wird Standard.** `--allowedTools "Bash" "PowerShell"` mit einer Denylist von 33
Einträgen für schreibende und bauende Kommandos. Die Read-only-Eigenschaft der Codebasis wird
weiterhin über den Vorher/Nachher-Vergleich per `git status` nachgewiesen; die Denylist senkt das
Risiko, ersetzt die Verifikation aber nicht.
**Isolation über `--safe-mode` – und die Erkenntnis, dass das nicht reicht.** Ein Kontrolltest
belegte: `--safe-mode` unterdrückt zuverlässig das *Vorladen* von `CLAUDE.md` als
Systemanweisung – ohne das Flag zitiert der Agent deren Inhalt, mit dem Flag antwortet er
„NICHTS VORGELADEN". Es verhindert jedoch **nicht**, dass der Agent diese Dateien mit
Shell-Zugriff selbst *liest*. Im Smoke-Test tat er genau das.
Konsequenz: Die KI-Konfigurationen wurden **dauerhaft aus der Codebasis entfernt** (Commit
`79c1142`, 92 Dateien), das GitHub-Remote entkoppelt und der Stand als Versuchssnapshot
eingefroren. Damit ist die Bedingung „keine Agentendateien" eine Eigenschaft des Untersuchungs-
gegenstands und muss nicht pro Lauf hergestellt werden.
**Lauf 2 brach nach 24 Minuten mit einem API-Transportfehler ab** („The response stopped
arriving"), nachdem vier von sieben Artefakten geschrieben waren. Kein Konfigurationsproblem –
`permission_denials` war 0.
**Lauf 3** lief vollständig durch: 106 Anforderungen, 11,5 Mio. Tokens, **0 Denials**,
23:40 statt 31:31. Schneller, sparsamer und ergiebiger als Lauf 1 – die Werkzeugfreigabe schien
sich in jeder Dimension auszuzahlen.
### Phase 3 – Der Varianzbefund (15:05–19:31)
**Lauf 4** unter identischer Konfiguration lieferte **55 Anforderungen** – knapp die Hälfte von
Lauf 3 – bei *höheren* Kosten. Der Agent hatte diesmal **keinen einzigen Subagenten** gestartet
und stattdessen 147 eigene Turns absolviert.
Das war der Wendepunkt der Reihe. Die naheliegende Erklärung – die Subagentenzahl bestimmt den
Ertrag – hielt der nächsten Messung nicht stand: **Lauf 5** startete 14 Subagenten und lieferte
**325 Anforderungen** bei 52,7 Mio. Tokens; **Lauf 6** startete ebenfalls 7 wie Lauf 3, lieferte
aber **189 statt 106** Anforderungen bei dreifachem Verbrauch.
Nicht die *Anzahl* der Subagenten erklärt die Streuung, sondern die *Freiheit*, die Analyse
überhaupt selbst zu zerlegen.
Um das zu prüfen, wurde der Modus `solo` eingeführt: `Task`, `Agent` und `Workflow` gesperrt,
sodass keine Delegation möglich ist. Ein Verifikationstest bestätigte die Sperre (`spawned: 0`,
Antwort „KEINE SUBAGENTEN MOEGLICH") und deckte dabei auf, dass der Agent nach der Sperre von
`Task`/`Agent` auf `Workflow` auswich – dieses Werkzeug orchestriert ebenfalls Subagenten und
musste ergänzt werden.
**Fünf Solo-Läufe** (42, 82, 60, 73, 67 Anforderungen) gegen **neun Builtin-Läufe** ergaben:
| | V1 (`solo`) | V1b (`builtin`) |
|---|---|---|
| Anforderungen | 42 – 82 (Faktor 2,0) | 55 – 325 (Faktor 5,9) |
| Tokens | 4,4 – 12,6 Mio. (Faktor 2,9) | 11,5 – 52,7 Mio. (Faktor 4,6) |
| Median Tokens | 5,1 Mio. | 30,1 Mio. |
**Zentraler Befund der Reihe.** Die selbstgewählte Zerlegung in Subagenten ist die dominierende
Störgröße. Wird sie unterbunden, halbiert sich die Streuung mehr als, und der Verbrauch sinkt um
Faktor 6.
### Phase 4 – Modellvergleich und die Grenzen der Steuerbarkeit (19:59–23:10)
Um zu prüfen, ob die Streuung modellabhängig ist, wurde dieselbe Bedingung mit zwei weiteren
Modellen wiederholt.
**Opus 5, solo, fünf Läufe:** 71 – 182 Anforderungen (Median 114), 13,6 – 24,9 Mio. Tokens
(Median 22,8). Gegenüber Sonnet: 1,7-mal mehr Anforderungen bei 4,5-fachem Verbrauch, also rund
das 2,7-fache an Tokens je Anforderung. **Die Streuung blieb im selben Rahmen** – der
Modellwechsel verschiebt das Niveau, nicht die Stabilität.
**Fable 5, solo, Effort `max`, zwei Läufe:** 207 und 148 Anforderungen bei 24,2 und 31,1 Mio.
Tokens – der höchste Solo-Verbrauch der Reihe, vom nominell sparsamsten Modell. Die
Thinking-Tokens (35.220 und 39.609) übertreffen jeden der 21 Vorläufe deutlich; der bisherige
Höchstwert lag bei 24.179. Das spricht für den Effort als Treiber, ist aber **nicht beweisbar**,
weil Modell und Effort gleichzeitig gewechselt wurden.
**Fable 5, builtin – ein Fehlschlag mit Erkenntniswert.** `--model claude-fable-5` steuerte nur
den Hauptagenten. Die 13 Subagenten liefen auf **`claude-opus-5[1m]`**, dem Standardmodell aus
den Sitzungseinstellungen. Auf sie entfielen 136,7 von 150,3 Mio. Tokens – **91 %**. Eine
Gegenprüfung über alle 24 Läufe grenzte den Fall eindeutig ein: Sonnet und Opus werden an
Subagenten durchgereicht, Fable nicht.
**Konsequenz:** Bei Modus `builtin` ist das Modell nicht allein durch das Flag festgelegt. Der
Abgleich der tatsächlich eingesetzten Modelle wurde zur Pflichtprüfung.
### Phase 5 – Nachbereitung und Ausrichtung auf die Arbeit (26.08.)
Nach Abschluss der Läufe wurden Struktur und Dokumentation konsolidiert: Umstellung der
Kostenangabe auf Tokenverbrauch, Ordnerstruktur nach Bedingungen, maschinelle Auswertung der
erzeugten Anforderungen, Sicherung des Untersuchungsgegenstands im Arbeitsrepository sowie die
Trennung von Analyseanweisung (Prompt) und Prozessvorgabe (Skill).
---
## 3. Entwicklung des Prompts
Der Prompt blieb inhaltlich über alle 24 Läufe **unverändert** – der SHA-256
`1B0DB06B…3C02FF` ist in jedem Protokoll dokumentiert. Alle 24 Läufe sind damit
Wiederholungsmessungen desselben Prompts, keine Iterationen im Sinne von Kapitel 4.
Erst nach Abschluss der Läufe wurde er überarbeitet (2026-08-26):
| Änderung | Grund |
|---|---|
| Metadaten `Werkzeugkonfiguration` und `Modell` entfernt | Beschreiben den Lauf, nicht die Analyse; gehören ins Messprotokoll |
| Satz „Es stehen weder spezialisierte Agenten noch MCP-Server zur Verfügung" entfernt | Bindet den Prompt an eine Werkzeugkonfiguration; wird zur Laufzeit als Werkzeugkontext beigestellt |
| Feld `Übernahmewürdigkeit` ergänzt (`übernehmen`/`Workaround`/`Sonderfall`/`veraltet`) | Der Evaluationsrahmen (Kap. 4.3) bewertet diese Dimension; bislang steckte sie halb im Feld `Status` und war nicht auswertbar |
| Pflichteigenschaft `Redundanzfreiheit` ergänzt | Ergänzt das vorhandene Feld `Konsolidierung` um die ausdrückliche Abgrenzungsprüfung |
| Konsistenzcheck erweitert | Prüft nun auch fehlende Übernahmewürdigkeit und nicht markierte Doubletten |
**Damit ist der Prompt werkzeug- und modellneutral** und von jedem LLM verwendbar – eine
Voraussetzung für den in Kapitel 4 geplanten LLM-Querschnitt.
---
## 4. Entwicklung des Versuchsaufbaus (Skill)
17 Versionen in zwei Tagen. Jede geht auf eine konkrete Beobachtung zurück:
| Version | Änderung | Auslöser |
|---|---|---|
| 1.0.0 | Ausgangsfassung | – |
| 2.0.0 | Shell-Zugriff + Denylist; Isolation über eingefrorenen Snapshot | 36 Denials in Lauf 1; `--safe-mode` allein unzureichend |
| 2.0.1 | `before.txt` leerwertsicher schreiben | Bei sauberem Root schrieb PowerShell die Datei nicht und ließ alten Inhalt stehen – der Vergleich meldete eine Abweichung, die es nicht gab |
| 2.1.0 | Modell wird vor jedem Lauf erfragt | Das Modell wurde bis dahin ad hoc gewählt |
| 2.1.1 | Warnung zur Snapshot-Prüfung | Ein verkürzter Regex sprach auf echte Produktdateien an (`ClaudeCodeChatModelClient.cs`) |
| 3.0.0 | Agentenmodus als Pflichtparameter (`solo`/`builtin`/`custom`) | Subagenten-Einsatz schwankte zwischen 0 und 14 und war die dominierende Störgröße |
| 3.1.0 | Parallelfähigkeit; Steuerdateien nach `_meta` im Laufverzeichnis | Geteilte Scratchpad-Dateien hätten sich zwischen parallelen Läufen überschrieben |
| 3.2.0 | Modell und Version im Verzeichnisnamen; `Workflow` mitgesperrt | Im Verifikationstest wich der Agent auf `Workflow` aus |
| 3.3.0 | Subagenten-Prompts werden protokolliert | Die selbstgewählte Zerlegung war nur als Zahl sichtbar, nicht inhaltlich |
| 3.4.0 | Effort als dritter Pflichtparameter | Der Denkaufwand wurde nur aus der Sitzung geerbt und nirgends dokumentiert |
| 3.5.0 | Berichtete Aufwandsgröße ist der Tokenverbrauch statt USD | USD-Beträge hängen an Preisliste und Modellwahl und veralten |
| 3.6.0 | Verschachtelte Subagenten verifiziert und dokumentiert | Unbelegt, ob tiefere Ebenen in die Tokensumme einfließen – Kontrolltest belegte es |
| 3.7.0 | Effort im Verzeichnisnamen | Erster `max`-Block; gleichnamige Verzeichnisse hätten verschiedene Bedingungen bezeichnet |
| 3.8.0 | Pflichtprüfung der tatsächlich eingesetzten Modelle | Fable-Lauf: 91 % des Verbrauchs auf einem nicht angeforderten Modell |
| 3.9.0 | Pflichtabschnitt „Gefundene Anforderungen" | Protokolle maßen nur Aufwand, nicht Ertrag |
| 3.10.0 | Bedingungen als Ordnerstruktur statt im Dateinamen | Der Name wuchs mit jeder Variable und war kaum noch lesbar |
| 4.0.0 | Zweiteilung Prozess/Werkzeugadapter; V1 = `solo`, V1b = `builtin`; Evaluationsrahmen verankert | Ausrichtung auf Kapitel 4 der Arbeit |
**Beobachtung für die Diskussion:** Zehn der sechzehn Änderungen gehen auf Messfehler oder
Fehlannahmen zurück, die erst im Betrieb sichtbar wurden – nicht auf Planungslücken im
klassischen Sinn. Ein Versuchsaufbau für agentische LLM-Werkzeuge lässt sich offenbar nicht
vollständig vorab spezifizieren.
---
## 5. Durchgeführte Läufe
24 Läufe, 745,2 Mio. Tokens, 3.287 erzeugte Anforderungen. Ein Lauf schlug fehl (Nr. 2,
API-Transportfehler).
| # | Zeit | Modell | Modus | Effort | Subagenten | Denials | Turns | Tokens | Anforderungen |
|---:|---|---|---|---|---:|---:|---:|---:|---:|
| 1 | 12:29 | sonnet-5 | builtin | high | 8 | **36** | 43 | 13.052.010 | 96 |
| 2 | 13:49 | sonnet-5 | builtin | high | 6 | 0 | 8 | 16.655.125 | 89 *(Abbruch)* |
| 3 | 14:29 | sonnet-5 | builtin | high | 7 | 0 | 69 | 11.516.200 | 106 |
| 4 | 15:05 | sonnet-5 | builtin | high | 0 | 0 | 147 | 27.562.244 | 55 |
| 5 | 15:35 | sonnet-5 | builtin | high | 14 | 1 | 31 | 52.713.542 | 325 |
| 6 | 16:35 | sonnet-5 | builtin | high | 7 | 0 | 29 | 32.568.122 | 189 |
| 7 | 17:31 | sonnet-5 | solo | high | 0 | 0 | 68 | 4.357.855 | 42 |
| 8 | 17:31 | sonnet-5 | solo | high | 0 | 0 | 107 | 12.598.503 | 82 |
| 9 | 18:04 | sonnet-5 | solo | high | 0 | 0 | 72 | 5.659.692 | 60 |
| 10 | 18:04 | sonnet-5 | solo | high | 0 | 0 | 77 | 4.591.733 | 73 |
| 11 | 18:04 | sonnet-5 | solo | high | 0 | 0 | 67 | 5.050.595 | 67 |
| 12 | 18:29 | sonnet-5 | builtin | high | 19 *(9 versch.)* | 2 | 94 | 55.167.397 | 246 |
| 13 | 18:29 | sonnet-5 | builtin | high | 8 | 1 | 84 | 42.204.257 | 238 |
| 14 | 18:29 | sonnet-5 | builtin | high | 20 *(6)* | 0 | 23 | 40.787.325 | 113 |
| 15 | 18:29 | sonnet-5 | builtin | high | 21 *(3)* | 0 | 15 | 44.713.674 | 145 |
| 16 | 18:29 | sonnet-5 | builtin | high | 18 *(6)* | 0 | 33 | 65.101.243 | 239 |
| 17 | 19:59 | opus-5 | solo | high | 0 | 0 | 116 | 13.560.381 | 71 |
| 18 | 19:59 | opus-5 | solo | high | 0 | 1 | 195 | 22.759.401 | 119 |
| 19 | 19:59 | opus-5 | solo | high | 0 | 1 | 177 | 24.860.083 | 114 |
| 20 | 20:00 | opus-5 | solo | high | 0 | 0 | 145 | 24.280.282 | 182 |
| 21 | 20:00 | opus-5 | solo | high | 0 | 0 | 131 | 19.751.531 | 109 |
| 22 | 21:09 | fable-5 | solo | **max** | 0 | 1 | 152 | 24.225.555 | 207 |
| 23 | 21:09 | fable-5 | solo | **max** | 0 | 0 | 162 | 31.073.793 | 148 |
| 24 | 22:07 | fable-5 | builtin | high | 13 | 0 | 28 | **150.340.866** | 172 |
Die Läufe 7–8, 9–11, 12–16, 17–21 und 22–23 liefen jeweils parallel. Wanduhrzeiten dieser Läufe
sind dadurch verzerrt und nicht für Laufzeitvergleiche verwendbar; Tokenverbrauch,
Anforderungsanzahl und Denials bleiben unverzerrt.
---
## 6. Befunde
### 6.1 Die Anforderungsanzahl ist kein Qualitätsmaß
Vier Läufe unter identischer Bedingung (Nr. 3, 4, 5, 6) ergaben 106, 55, 325 und 189
Anforderungen – Faktor 5,9. Der Unterschied zwischen Lauf 1 (ohne Shell, 96) und Lauf 3 (mit
Shell, 106) liegt vollständig innerhalb dieser Streuung. **Jede Aussage der Form „Konfiguration
X liefert mehr Anforderungen" ist ohne Wiederholungsläufe wertlos.**
### 6.2 Die einzige robuste Wirkung der Werkzeugkonfiguration ist die Denial-Zahl
36 Denials ohne Shell-Zugriff, 0 mit. Das ist eine direkte Eigenschaft der Konfiguration und
keine Zufallsgröße. Alle anderen Kennzahlen streuen zu stark.
### 6.3 Die selbstgewählte Zerlegung dominiert alles
`solo` gegen `builtin`: Streuung Faktor 2,0 gegen 5,9 bei den Anforderungen, Medianverbrauch
5,1 gegen 30,1 Mio. Tokens. Der Effekt gilt modellunabhängig – die Opus-Reihe zeigt dieselbe
Stabilität im Solo-Modus.
Bemerkenswert ist die Gegenläufigkeit von Turns und Delegation: Lauf 15 delegierte am stärksten
(21 Subagenten) und brauchte die wenigsten eigenen Turns (15); Lauf 4 delegierte gar nicht und
brauchte 147. **`num_turns` zählt nur den Hauptagenten und ist deshalb kein Aufwandsmaß.**
### 6.4 Verschachtelte Delegation ist der Normalfall, nicht die Ausnahme
In vier von fünf Läufen des Blocks 12–16 erreichte die Delegation Tiefe 2, mit 3 bis 9 von
Subagenten gestarteten Subagenten. Ein Kontrolltest belegte, dass deren Tokens vollständig in
`modelUsage` einfließen – ihre **Prompts** dagegen liegen in nicht persistierten Transkripten
und sind nicht rekonstruierbar. Die Prompt-Erfassung ist in diesen Läufen systematisch
unvollständig, die Verbrauchsmessung nicht.
### 6.5 Modellstärke und Ertrag
| Reihe | Anforderungen (Median) | Tokens (Median) | Tokens je Anforderung |
|---|---:|---:|---:|
| Sonnet 5, solo, high | 67 | 5,1 Mio. | ~76.000 |
| Opus 5, solo, high | 114 | 22,8 Mio. | ~200.000 |
| Fable 5, solo, max | 178 | 27,6 Mio. | ~155.000 |
Der Mehrertrag stärkerer Modelle wird mit überproportionalem Verbrauch erkauft. Die
Anforderungsanzahl misst allerdings nur Menge; die Belegqualität ist davon unabhängig zu
betrachten.
### 6.6 Regelkonformität – der Agent verfehlt teilweise die eigenen Vorgaben
Die maschinelle Auswertung prüft die Artefakte gegen die Vorgaben des Prompts. Zwei Beispiele:
- **Lauf 11** (Sonnet, solo): 5 von 31 risikorelevanten Anforderungen tragen weder einen
`PRIMÄR`-Beleg noch die Kennzeichnung `[HYPOTHESE]`, obwohl der Prompt das für Sicherheits-,
Abrechnungs- und Berechtigungsthemen ausdrücklich verlangt. Primärbelegquote 62,7 %.
- **Lauf 24** (Fable/Opus, builtin): alle 58 risikorelevanten Anforderungen gedeckt,
Primärbelegquote 100 %, Median 2 Belege je Anforderung.
Diese Prüfung wäre von Hand nicht leistbar und liefert eine inhaltliche Vergleichsgröße, die
unabhängig vom Mengengerüst ist.
### 6.7 Werkzeugtechnische Befunde
| Befund | Beleg |
|---|---|
| `--safe-mode` unterdrückt das *Vorladen* von Projektanweisungen, nicht das *Lesen* | Kontrolltest: ohne Flag zitiert der Agent `CLAUDE.md`, mit Flag „NICHTS VORGELADEN"; mit Shell liest er sie dennoch |
| Gesperrte Werkzeuge erzeugen keine Denials | In allen 12 Solo-Läufen 0 Denials auf `Task`/`Agent`/`Workflow` – das Modell plant von vornherein ohne sie |
| `--model` steuert nur den Hauptagenten | Lauf 24: 91 % des Verbrauchs auf nicht angefordertem Modell |
| Der Effort steht nicht im Ergebnisobjekt | Nur über das Session-Transkript belegbar |
| `duration_ms` ist bei starker Nebenläufigkeit unbrauchbar | Lauf 5: 09:37 gemeldet, 43:01 tatsächlich |
| Ein Lauf schrieb außerhalb von Codebasis und Laufverzeichnis | Lauf 13 legte drei Arbeitsdateien in `C:\DEV\` an; nur weil die Denylist das Aufräumen blockierte, wurde es sichtbar |
Der letzte Punkt ist methodisch der unangenehmste: Die etablierte Prüfung „Root unverändert"
deckt ausschließlich die Codebasis ab. Schreibvorgänge in andere Verzeichnisse bleiben unbemerkt.
---
## 7. Grenzen und offene Punkte
**Nicht geklärt:** Ob der Verbrauchssprung im Fable-Block vom Modell oder vom Effort kommt –
beide Variablen wechselten gleichzeitig. Ein Fable-Block auf `high` oder ein Sonnet-Block auf
`max` würde die Frage entscheiden.
**Nicht durchgeführt:** Die Stakeholder-Validierung nach Kapitel 4.3. Alle Aussagen dieses
Protokolls beruhen auf maschinell erhebbaren Größen. Ob die erzeugten Anforderungen sachlich
korrekt sind, ist damit ausdrücklich **nicht** gezeigt.
**Nicht abgedeckt:** Versuch 2 (Agentendateien) und Versuch 3 (MCP-Server). Der Skill ist darauf
vorbereitet (Modus `custom`), die Agentendefinitionen existieren aber noch nicht.
**Offene Aufräumarbeiten:** Drei Streudateien in `C:\DEV\` aus Lauf 13; die Erweiterung der
Nachlaufprüfung um Streudateien außerhalb des Laufverzeichnisses.
**Einschränkung der Zeitmessung:** 18 der 24 Läufe liefen parallel. Für belastbare
Laufzeitvergleiche wären serielle Wiederholungen nötig. Eine Teilauswertung zeigt bei den
Solo-Läufen einen messbaren Kontentionseffekt: bei zwei gleichzeitigen Läufen 114–176 Sekunden
je Million Tokens, bei drei gleichzeitigen 185–233 – nicht überlappende Bereiche trotz kleiner
Stichprobe.
---
## 8. Verweise
- Messprotokolle je Lauf: `Versuche/Versuch_01/<ModellID>/<Modus>/<Effort>/<Laufverzeichnis>/Protokoll.md`
- Rohdaten: `RawResult.json` je Lauf, unverändert erhalten
- Exakt gesendeter Prompt je Lauf: `_meta/combined_prompt.md`
- Subagenten-Prompts: `_meta/subagenten.md`
- Maschinelle Anforderungsauswertung: `_meta/anforderungen.md` und `.json`
- Prozessvorgabe: `.claude/skills/run-experiment/SKILL.md` (Version 4.0.0, mit Änderungshistorie)
- Nachweis des Untersuchungsgegenstands: `Versuche/Versuch_01/_Codebasis-Nachweis.md`
- Struktur- und Umbenennungshistorie: `Versuche/Versuch_01/_Umbenennung_*.md`,
`_Umstrukturierung_2026-08-26.md`
+14 -7
View File
@@ -3,17 +3,19 @@
## Metadaten ## Metadaten
- **Versuch:** V1 Baseline (Prompt-only) - **Versuch:** V1 Baseline (Prompt-only)
- **Iteration:** 01 (Initial-Prompt, zu Versuchsbeginn neu formuliert) - **Iteration:** 01 (Initial-Prompt, zu Versuchsbeginn neu formuliert)
- **Werkzeugkonfiguration:** Claude Code, keine Agentendateien, keine MCP-Server
- **Codebasis:** c-entron ERP-Suite (Windows, C#/XAML, MSSQL) - **Codebasis:** c-entron ERP-Suite (Windows, C#/XAML, MSSQL)
- **Modell:** Claude (Claude Code)
- **Zeitstempel:** 2026-08-25 - **Zeitstempel:** 2026-08-25
- **Änderungsgrund:** Initial-Prompt für V1 Baseline (kein Vorgänger). Vor Erstlauf überarbeitet: Abgleich mit Kap. 4 (RRE-Methodenkette, Evaluationsrahmen) und Kap. 2 (Prozesskontrollen); mit der Vorfassung fand kein Lauf statt. - **Änderungsgrund:** Initial-Prompt für V1 Baseline (kein Vorgänger). Vor Erstlauf überarbeitet: Abgleich mit Kap. 4 (RRE-Methodenkette, Evaluationsrahmen) und Kap. 2 (Prozesskontrollen); mit der Vorfassung fand kein Lauf statt. Am 2026-08-26 werkzeugneutral gefasst: Aussagen zu Werkzeugkonfiguration, Modell und Ausgabeverzeichnis entfernt (sie werden vom Versuchsaufbau zur Laufzeit beigestellt und im Messprotokoll dokumentiert); Feld `Übernahmewürdigkeit` aus dem Evaluationsrahmen (Kap. 4.3) ergänzt.
> Dieser Prompt enthält ausschließlich die **Analyseanweisung** und ist damit unabhängig von einem
> bestimmten Werkzeug oder Modell einsetzbar. Welche Werkzeuge im jeweiligen Lauf zur Verfügung
> stehen und wohin die Ergebnisse geschrieben werden, stellt der Versuchsaufbau beim Start bei.
--- ---
## Prompt ## Prompt
Du bist ein Requirements Engineer im Reverse Requirements Engineering eines Legacy-ERP-Systems. Erzeuge aus der vorliegenden Codebasis eine Anforderungsspezifikation nach **ISO/IEC/IEEE 29148:2018**. Arbeite ausschließlich auf den im Arbeitsverzeichnis liegenden Artefakten (Quellcode, Konfiguration, UI-Ressourcen, ggf. DB-Skripte). Es stehen weder spezialisierte Agenten noch MCP-Server zur Verfügung; nutze nur, was als Datei lesbar ist. Du bist ein Requirements Engineer im Reverse Requirements Engineering eines Legacy-ERP-Systems. Erzeuge aus der vorliegenden Codebasis eine Anforderungsspezifikation nach **ISO/IEC/IEEE 29148:2018**. Arbeite ausschließlich auf den im Arbeitsverzeichnis liegenden Artefakten (Quellcode, Konfiguration, UI-Ressourcen, ggf. DB-Skripte). Nutze nur Informationen, die du aus diesen Artefakten gewinnen kannst.
### Auftrag ### Auftrag
@@ -51,6 +53,8 @@ Bearbeite die Schritte 2-6 der RRE-Methodenkette (Schritt 1 Scope ist oben vorge
- **Hypothesenmarkierung:** Aussagen, die sich nicht eindeutig aus Artefakten ableiten lassen, kennzeichnest du explizit mit `[HYPOTHESE]` und einer kurzen Begründung, welche Information zur Bestätigung fehlt. - **Hypothesenmarkierung:** Aussagen, die sich nicht eindeutig aus Artefakten ableiten lassen, kennzeichnest du explizit mit `[HYPOTHESE]` und einer kurzen Begründung, welche Information zur Bestätigung fehlt.
- **Verifizierbarkeit:** Jede Anforderung enthält mindestens eine Prüfidee oder ein Akzeptanzkriterium. - **Verifizierbarkeit:** Jede Anforderung enthält mindestens eine Prüfidee oder ein Akzeptanzkriterium.
- **Eindeutigkeit:** Vermeide vage Begriffe ("schnell", "benutzerfreundlich"); definiere domänenspezifische Begriffe beim ersten Auftreten. - **Eindeutigkeit:** Vermeide vage Begriffe ("schnell", "benutzerfreundlich"); definiere domänenspezifische Begriffe beim ersten Auftreten.
- **Übernahmewürdigkeit:** Beurteile für jede Anforderung, ob ihre Funktion im Zielsystem erhalten bleiben soll. Unterscheide `übernehmen` (fachlich weiterhin erforderlich), `Workaround` (historisch gewachsene Behelfslösung), `Sonderfall` (Ausnahme für einen einzelnen Kunden, Mandanten oder Altbestand) und `veraltet` (durch neuere Logik abgelöst oder fachlich überholt). Begründe die Einstufung in einem Halbsatz. Diese Angabe steuert die spätere fachliche Priorisierung; eine Fehleinschätzung ist unkritisch, eine fehlende Angabe nicht.
- **Redundanzfreiheit:** Formuliere jede Anforderung so, dass sie von den übrigen klar abgegrenzt ist. Beschreiben zwei Anforderungen dieselbe fachliche Funktion aus unterschiedlicher Perspektive, führe sie zusammen oder grenze sie im Titel und in der Aussage ausdrücklich gegeneinander ab.
### Formatvorgabe pro Anforderung ### Formatvorgabe pro Anforderung
@@ -71,6 +75,7 @@ Belege:
Prüfidee: <Akzeptanzkriterium oder Testidee> Prüfidee: <Akzeptanzkriterium oder Testidee>
Tracelinks: <verwandte StRS-/SyRS-/SwRS-IDs> Tracelinks: <verwandte StRS-/SyRS-/SwRS-IDs>
Konsolidierung: <nein | Kandidat: <IDs oder Stellen, die dieselbe fachliche Funktion abbilden>> Konsolidierung: <nein | Kandidat: <IDs oder Stellen, die dieselbe fachliche Funktion abbilden>>
Übernahmewürdigkeit: <übernehmen | Workaround | Sonderfall | veraltet> - <kurze Begründung>
Status: <belegt | HYPOTHESE> Status: <belegt | HYPOTHESE>
``` ```
@@ -103,14 +108,14 @@ Ergebnisse/
Analysebericht.md (Modul-/Komponentenübersicht, abgedeckte Bereiche, bekannte Lücken) Analysebericht.md (Modul-/Komponentenübersicht, abgedeckte Bereiche, bekannte Lücken)
``` ```
Das Ausgabeverzeichnis wird beim Start des Laufs benannt. Die analysierte Codebasis wird ausschließlich gelesen und nicht verändert. Das Ausgabeverzeichnis wird beim Start des Laufs beigestellt. Die analysierte Codebasis wird ausschließlich gelesen und nicht verändert.
### Randbedingungen ### Randbedingungen
- **Keine Halluzinationen.** Wenn ein Artefakt nicht gelesen oder eine Aussage nicht belegt werden kann, ist das offen zu legen, nicht zu erfinden. - **Keine Halluzinationen.** Wenn ein Artefakt nicht gelesen oder eine Aussage nicht belegt werden kann, ist das offen zu legen, nicht zu erfinden.
- **Keine Generierung von Code.** Es sollen ausschließlich Spezifikationsartefakte entstehen. - **Keine Generierung von Code.** Es sollen ausschließlich Spezifikationsartefakte entstehen.
- **Keine Annahme nicht vorhandener Tools.** Stehen für eine Aussage nur indirekte Belege zur Verfügung, ist die Aussage als `[HYPOTHESE]` zu kennzeichnen. - **Keine Annahme über nicht beigestellte Hilfsmittel.** Arbeite mit dem, was dir in diesem Lauf zur Verfügung steht. Setze keine zusätzlichen Analysewerkzeuge, Datenbankzugriffe oder laufende Systeme voraus. Stehen für eine Aussage nur indirekte Belege zur Verfügung, ist sie als `[HYPOTHESE]` zu kennzeichnen.
- **Migrationsperspektive berücksichtigen.** Wenn eine Implementierung erkennbar ein historischer Workaround oder Sonderfall ist, vermerke das im Feld `Status` (`belegt; Workaround`), damit es in der späteren Validierung priorisiert geprüft werden kann. - **Migrationsperspektive berücksichtigen.** Erkennbare Workarounds, Sonderfälle und überholte Logik gehören in das Feld `Übernahmewürdigkeit`, nicht in das Feld `Status`. `Status` beschreibt ausschließlich die Belegsituation (`belegt` oder `HYPOTHESE`), `Übernahmewürdigkeit` die fachliche Zukunft der Anforderung. Beide Angaben sind unabhängig voneinander: Eine gut belegte Anforderung kann ein Workaround sein, eine Hypothese kann übernahmewürdig sein.
- **Sprache:** Deutsch für Anforderungsaussagen, technische Bezeichner (Klassen, Methoden, Spalten) bleiben in ihrer Originalsprache. - **Sprache:** Deutsch für Anforderungsaussagen, technische Bezeichner (Klassen, Methoden, Spalten) bleiben in ihrer Originalsprache.
### Abschluss ### Abschluss
@@ -118,7 +123,9 @@ Das Ausgabeverzeichnis wird beim Start des Laufs benannt. Die analysierte Codeba
Führe vor Abgabe einen **Konsistenzcheck über das gesamte Anforderungs-Set** durch und dokumentiere das Ergebnis im `Analysebericht.md`: Führe vor Abgabe einen **Konsistenzcheck über das gesamte Anforderungs-Set** durch und dokumentiere das Ergebnis im `Analysebericht.md`:
- Doppelte oder mehrfach vergebene IDs - Doppelte oder mehrfach vergebene IDs
- Anforderungen ohne Beleg - Anforderungen ohne Beleg
- Anforderungen ohne Angabe zur `Übernahmewürdigkeit`
- Tracelinks auf nicht existierende IDs - Tracelinks auf nicht existierende IDs
- Inhaltlich deckungsgleiche Anforderungen, die nicht als Konsolidierungskandidat markiert sind
Beende den Lauf mit einer kurzen Selbstbewertung im `Analysebericht.md`: Beende den Lauf mit einer kurzen Selbstbewertung im `Analysebericht.md`:
- Welche Module wurden vollständig analysiert, welche nur stichprobenhaft, welche gar nicht? - Welche Module wurden vollständig analysiert, welche nur stichprobenhaft, welche gar nicht?
@@ -102,6 +102,8 @@ Ursache ist ausschließlich das Fremdmodell in den Subagenten.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -138,6 +140,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2,0 | | Belege je Anforderung (Median) | 2,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 172 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 172 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -155,6 +161,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (58 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (58 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 172 von 172 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 172 von 172 mit Tracelinks (100,0 %) |
## Anmerkungen/Auffälligkeiten ## Anmerkungen/Auffälligkeiten
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2,0 | | Belege je Anforderung (Median) | 2,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 172 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 172 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (58 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (58 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 172 von 172 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 172 von 172 mit Tracelinks (100,0 %) |
@@ -95,6 +95,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-fable-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 207 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 207 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (68 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (68 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 207 von 207 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 207 von 207 mit Tracelinks (100,0 %) |
## Fable-Block (P, Q) ## Fable-Block (P, Q)
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 207 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 207 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (68 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (68 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 207 von 207 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 207 von 207 mit Tracelinks (100,0 %) |
@@ -95,6 +95,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-fable-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2,0 | | Belege je Anforderung (Median) | 2,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 148 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 148 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (42 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (42 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 148 von 148 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 148 von 148 mit Tracelinks (100,0 %) |
## Fable-Block (P, Q) ## Fable-Block (P, Q)
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2,0 | | Belege je Anforderung (Median) | 2,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 148 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 148 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (42 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (42 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 148 von 148 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 148 von 148 mit Tracelinks (100,0 %) |
@@ -95,6 +95,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-opus-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 4 | | Belege je Anforderung (Median) | 4 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (35 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (35 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 71 von 71 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 71 von 71 mit Tracelinks (100,0 %) |
## Opus-Solo-Block (K–O), fünf Messpunkte ## Opus-Solo-Block (K–O), fünf Messpunkte
@@ -16,7 +16,8 @@
"tracelinks": "SyRS-001, SyRS-002, SyRS-003", "tracelinks": "SyRS-001, SyRS-002, SyRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede der sieben Kundenbelegarten kann ein Beleg angelegt werden; eine Rechnung lässt sich", "pruefidee": "Für jede der sieben Kundenbelegarten kann ein Beleg angelegt werden; eine Rechnung lässt sich",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-002", "id": "StRS-002",
@@ -35,7 +36,8 @@
"tracelinks": "SyRS-004, SyRS-005", "tracelinks": "SyRS-004, SyRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Anlage einer zweiten Filiale existieren für diese eigene Nummernkreiseinträge; ein Beleg", "pruefidee": "Nach Anlage einer zweiten Filiale existieren für diese eigene Nummernkreiseinträge; ein Beleg",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-003", "id": "StRS-003",
@@ -54,7 +56,8 @@
"tracelinks": "SyRS-006, SyRS-007, SyRS-008", "tracelinks": "SyRS-006, SyRS-007, SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Benutzer ohne Gruppenzugehörigkeit erhält aus `CheckRightsFromUser` eine leere Rechteliste;", "pruefidee": "Ein Benutzer ohne Gruppenzugehörigkeit erhält aus `CheckRightsFromUser` eine leere Rechteliste;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-004", "id": "StRS-004",
@@ -73,7 +76,8 @@
"tracelinks": "SyRS-014, SyRS-015", "tracelinks": "SyRS-014, SyRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine Anmeldung mit einer Anwendung, deren Lizenz-GUID nicht in der Lizenzdatei enthalten ist,", "pruefidee": "Eine Anmeldung mit einer Anwendung, deren Lizenz-GUID nicht in der Lizenzdatei enthalten ist,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-005", "id": "StRS-005",
@@ -92,7 +96,8 @@
"tracelinks": "SyRS-017", "tracelinks": "SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Ticket kann angelegt, einem Bearbeiter zugewiesen, kategorisiert und abgeschlossen werden;", "pruefidee": "Ein Ticket kann angelegt, einem Bearbeiter zugewiesen, kategorisiert und abgeschlossen werden;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-006", "id": "StRS-006",
@@ -111,7 +116,8 @@
"tracelinks": "SyRS-018", "tracelinks": "SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine Zeit, die einer Rechnungsposition zugeordnet ist, kann nicht gelöscht werden; der Versuch,", "pruefidee": "Eine Zeit, die einer Rechnungsposition zugeordnet ist, kann nicht gelöscht werden; der Versuch,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-007", "id": "StRS-007",
@@ -130,7 +136,8 @@
"tracelinks": "SyRS-019", "tracelinks": "SyRS-019",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Vertrag mit `BillingIntervalKind = Quarterly` und `BillingIntervalDuration = 1` erzeugt", "pruefidee": "Ein Vertrag mit `BillingIntervalKind = Quarterly` und `BillingIntervalDuration = 1` erzeugt",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-008", "id": "StRS-008",
@@ -149,7 +156,8 @@
"tracelinks": "SyRS-020", "tracelinks": "SyRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine Rechnung in Stufe 3 wird durch einen weiteren Mahnlauf nicht weiter erhöht; nach", "pruefidee": "Eine Rechnung in Stufe 3 wird durch einen weiteren Mahnlauf nicht weiter erhöht; nach",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-009", "id": "StRS-009",
@@ -168,7 +176,8 @@
"tracelinks": "SyRS-021, SyRS-022", "tracelinks": "SyRS-021, SyRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für einen konfigurierten Lieferanten wird ein OpenTrans-2.1-Auftragsbestätigungsdokument", "pruefidee": "Für einen konfigurierten Lieferanten wird ein OpenTrans-2.1-Auftragsbestätigungsdokument",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-010", "id": "StRS-010",
@@ -187,7 +196,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Web-Account kann sich anmelden, ein freigegebenes Angebot einsehen und annehmen; der", "pruefidee": "Ein Web-Account kann sich anmelden, ein freigegebenes Angebot einsehen und annehmen; der",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-011", "id": "StRS-011",
@@ -206,7 +216,8 @@
"tracelinks": "SyRS-024", "tracelinks": "SyRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bei aktivierter Einstellung enthält das erzeugte Rechnungs-PDF ein eingebettetes XML, das die", "pruefidee": "Bei aktivierter Einstellung enthält das erzeugte Rechnungs-PDF ein eingebettetes XML, das die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-012", "id": "StRS-012",
@@ -225,7 +236,8 @@
"tracelinks": "SyRS-025", "tracelinks": "SyRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Benutzer ohne `ACCESS_CLEANUP_DATABASE` erhält bei Aufruf der Bereinigung die Meldung", "pruefidee": "Ein Benutzer ohne `ACCESS_CLEANUP_DATABASE` erhält bei Aufruf der Bereinigung die Meldung",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-013", "id": "StRS-013",
@@ -244,7 +256,8 @@
"tracelinks": "SyRS-008, SyRS-026, SyRS-030", "tracelinks": "SyRS-008, SyRS-026, SyRS-030",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Änderung eines Belegs sind `ChangedByI3D`, `ChangedAt` und", "pruefidee": "Nach Änderung eines Belegs sind `ChangedByI3D`, `ChangedAt` und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-014", "id": "StRS-014",
@@ -263,7 +276,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "Kandidat: Die Lokalisierung ist auf vier voneinander unabhängige Ressourcensätze verteilt", "konsolidierung": "Kandidat: Die Lokalisierung ist auf vier voneinander unabhängige Ressourcensätze verteilt",
"pruefidee": "Für jeden Schlüssel in `LocalizedStrings.resx` existiert ein Eintrag in", "pruefidee": "Für jeden Schlüssel in `LocalizedStrings.resx` existiert ein Eintrag in",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-015", "id": "StRS-015",
@@ -282,7 +296,8 @@
"tracelinks": "SyRS-031, SyRS-032", "tracelinks": "SyRS-031, SyRS-032",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Der Nexus-Host startet aus dem Container-Image und beantwortet Anfragen unter der in", "pruefidee": "Der Nexus-Host startet aus dem Container-Image und beantwortet Anfragen unter der in",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-001", "id": "SyRS-001",
@@ -301,7 +316,8 @@
"tracelinks": "StRS-001 | SwRS-008", "tracelinks": "StRS-001 | SwRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Die numerischen Werte bestehender Enum-Einträge ändern sich zwischen zwei Releases nicht;", "pruefidee": "Die numerischen Werte bestehender Enum-Einträge ändern sich zwischen zwei Releases nicht;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-002", "id": "SyRS-002",
@@ -321,7 +337,8 @@
"tracelinks": "StRS-001, StRS-013 | SwRS-015, SwRS-016", "tracelinks": "StRS-001, StRS-013 | SwRS-015, SwRS-016",
"konsolidierung": "Kandidat: Die Übergänge nach `Completed` sind an mindestens vier verschiedenen Stellen in", "konsolidierung": "Kandidat: Die Übergänge nach `Completed` sind an mindestens vier verschiedenen Stellen in",
"pruefidee": "Ein neu angelegter Beleg hat `State = Active` und `Version = 1`; ein stornierter Beleg lässt", "pruefidee": "Ein neu angelegter Beleg hat `State = Active` und `Version = 1`; ein stornierter Beleg lässt",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-003", "id": "SyRS-003",
@@ -340,7 +357,8 @@
"tracelinks": "StRS-001 | SwRS-015", "tracelinks": "StRS-001 | SwRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Der Versuch, eine Rechnung in einen Auftrag weiterzuführen, wird abgelehnt; eine Barrechnung", "pruefidee": "Der Versuch, eine Rechnung in einen Auftrag weiterzuführen, wird abgelehnt; eine Barrechnung",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-004", "id": "SyRS-004",
@@ -359,7 +377,8 @@
"tracelinks": "StRS-001, StRS-002 | SwRS-014", "tracelinks": "StRS-001, StRS-002 | SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei parallele Anlagevorgänge im selben Nummernkreis erhalten unterschiedliche Nummern; eine", "pruefidee": "Zwei parallele Anlagevorgänge im selben Nummernkreis erhalten unterschiedliche Nummern; eine",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-005", "id": "SyRS-005",
@@ -378,7 +397,8 @@
"tracelinks": "StRS-002, StRS-003 | SwRS-016", "tracelinks": "StRS-002, StRS-003 | SwRS-016",
"konsolidierung": "Kandidat: Die Filialprüfung ist getrennt für Anlage (`CanUserCreateReceiptsInBranch`, eigene", "konsolidierung": "Kandidat: Die Filialprüfung ist getrennt für Anlage (`CanUserCreateReceiptsInBranch`, eigene",
"pruefidee": "Ein Benutzer der Filiale A mit dem Recht \"Rechnungen anzeigen - nur eigene Filiale\" kann eine", "pruefidee": "Ein Benutzer der Filiale A mit dem Recht \"Rechnungen anzeigen - nur eigene Filiale\" kann eine",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-006", "id": "SyRS-006",
@@ -397,7 +417,8 @@
"tracelinks": "StRS-003 | SwRS-016, SwRS-017, SwRS-023", "tracelinks": "StRS-003 | SwRS-016, SwRS-017, SwRS-023",
"konsolidierung": "Kandidat: Es existieren mindestens vier parallele Prüfwege - `AppUser.HasUserRight(...)`", "konsolidierung": "Kandidat: Es existieren mindestens vier parallele Prüfwege - `AppUser.HasUserRight(...)`",
"pruefidee": "Ein direkter API-Aufruf (unter Umgehung der Oberfläche) einer rechtegeschützten Methode ohne", "pruefidee": "Ein direkter API-Aufruf (unter Umgehung der Oberfläche) einer rechtegeschützten Methode ohne",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-007", "id": "SyRS-007",
@@ -416,7 +437,8 @@
"tracelinks": "StRS-003 | SwRS-016", "tracelinks": "StRS-003 | SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Der Löschversuch der Gruppe \"Administratoren\" wird abgelehnt; das Anlegen einer zweiten Gruppe", "pruefidee": "Der Löschversuch der Gruppe \"Administratoren\" wird abgelehnt; das Anlegen einer zweiten Gruppe",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-008", "id": "SyRS-008",
@@ -434,7 +456,8 @@
"tracelinks": "StRS-003, StRS-013 | SwRS-007", "tracelinks": "StRS-003, StRS-013 | SwRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Zuweisung eines Rechts an eine Gruppe existiert genau ein `AppRightLog` vom Typ", "pruefidee": "Nach Zuweisung eines Rechts an eine Gruppe existiert genau ein `AppRightLog` vom Typ",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-009", "id": "SyRS-009",
@@ -453,7 +476,8 @@
"tracelinks": "StRS-003, StRS-004 | SwRS-023, SwRS-010", "tracelinks": "StRS-003, StRS-004 | SwRS-023, SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Aufruf ohne `Ticket` liefert Status `InvalidTicket`; ein Aufruf mit einem Ticket einer", "pruefidee": "Ein Aufruf ohne `Ticket` liefert Status `InvalidTicket`; ein Aufruf mit einem Ticket einer",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-010", "id": "SyRS-010",
@@ -472,7 +496,8 @@
"tracelinks": "StRS-003, StRS-004 | SwRS-009", "tracelinks": "StRS-003, StRS-004 | SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bei `SystemAuthenticationMethod.ActiveDirectory` und deaktivierter AD-Konfiguration liefert", "pruefidee": "Bei `SystemAuthenticationMethod.ActiveDirectory` und deaktivierter AD-Konfiguration liefert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-011", "id": "SyRS-011",
@@ -491,7 +516,8 @@
"tracelinks": "StRS-003 | SwRS-009", "tracelinks": "StRS-003 | SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bei aktiviertem 2FA und `TwoFactorValidDurationInDays = 0` wird bei jeder Anmeldung ein", "pruefidee": "Bei aktiviertem 2FA und `TwoFactorValidDurationInDays = 0` wird bei jeder Anmeldung ein",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-012", "id": "SyRS-012",
@@ -510,7 +536,8 @@
"tracelinks": "StRS-003 | SwRS-009", "tracelinks": "StRS-003 | SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Benutzer mit `AccountDisabledFromDate` = gestern und leerem `AccountDisabledToDate` kann", "pruefidee": "Ein Benutzer mit `AccountDisabledFromDate` = gestern und leerem `AccountDisabledToDate` kann",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-013", "id": "SyRS-013",
@@ -529,7 +556,8 @@
"tracelinks": "StRS-003, StRS-004, StRS-013 | SwRS-011, SwRS-023", "tracelinks": "StRS-003, StRS-004, StRS-013 | SwRS-011, SwRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein deaktiviertes Token liefert \"Token ist deaktiviert.\" und erzeugt einen", "pruefidee": "Ein deaktiviertes Token liefert \"Token ist deaktiviert.\" und erzeugt einen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-014", "id": "SyRS-014",
@@ -548,7 +576,8 @@
"tracelinks": "StRS-004 | SwRS-010", "tracelinks": "StRS-004 | SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine Anmeldung mit einer unbekannten Lizenz-GUID liefert den Fehlercode", "pruefidee": "Eine Anmeldung mit einer unbekannten Lizenz-GUID liefert den Fehlercode",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-015", "id": "SyRS-015",
@@ -567,7 +596,8 @@
"tracelinks": "StRS-004 | SwRS-010", "tracelinks": "StRS-004 | SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bei einer Lizenz mit Anzahl 1 kann sich ein zweiter Benutzer nicht anmelden; derselbe Benutzer", "pruefidee": "Bei einer Lizenz mit Anzahl 1 kann sich ein zweiter Benutzer nicht anmelden; derselbe Benutzer",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-016", "id": "SyRS-016",
@@ -586,7 +616,8 @@
"tracelinks": "StRS-004 | SwRS-010", "tracelinks": "StRS-004 | SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Ticket der Standardart ist 30 Minuten nach dem letzten Aufruf ungültig; die Einstellung", "pruefidee": "Ein Ticket der Standardart ist 30 Minuten nach dem letzten Aufruf ungültig; die Einstellung",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-017", "id": "SyRS-017",
@@ -606,7 +637,8 @@
"tracelinks": "StRS-005 | SwRS-015", "tracelinks": "StRS-005 | SwRS-015",
"konsolidierung": "Kandidat: `UpdateHelpdeskBL.CanHelpdeskClose`, `HelpdeskWebServiceBL.CanHelpdeskClose` und", "konsolidierung": "Kandidat: `UpdateHelpdeskBL.CanHelpdeskClose`, `HelpdeskWebServiceBL.CanHelpdeskClose` und",
"pruefidee": "Ein Ticket mit einer aktiven Checkliste, deren Kennzeichen `CanCloseHelpdesk` = 0 ist und die", "pruefidee": "Ein Ticket mit einer aktiven Checkliste, deren Kennzeichen `CanCloseHelpdesk` = 0 ist und die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-018", "id": "SyRS-018",
@@ -625,7 +657,8 @@
"tracelinks": "StRS-006, StRS-013 | SwRS-016", "tracelinks": "StRS-006, StRS-013 | SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine einem Beleg zugeordnete Zeit kann auch mit dem Löschrecht nicht gelöscht werden; nach", "pruefidee": "Eine einem Beleg zugeordnete Zeit kann auch mit dem Löschrecht nicht gelöscht werden; nach",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-019", "id": "SyRS-019",
@@ -644,7 +677,8 @@
"tracelinks": "StRS-007 | SwRS-022, SwRS-012", "tracelinks": "StRS-007 | SwRS-022, SwRS-012",
"konsolidierung": "Kandidat: Die Umrechnung Intervallart → Monate ist dreifach implementiert", "konsolidierung": "Kandidat: Die Umrechnung Intervallart → Monate ist dreifach implementiert",
"pruefidee": "Ein Vertrag mit Quartalsintervall und Faktor 1, dessen Abrechnung am 15. eines Monats", "pruefidee": "Ein Vertrag mit Quartalsintervall und Faktor 1, dessen Abrechnung am 15. eines Monats",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-020", "id": "SyRS-020",
@@ -663,7 +697,8 @@
"tracelinks": "StRS-008, StRS-013 | SwRS-015", "tracelinks": "StRS-008, StRS-013 | SwRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Mahnlauf über eine Rechnung in Stufe 1 setzt diese auf Stufe 2 mit aktuellem Datum;", "pruefidee": "Ein Mahnlauf über eine Rechnung in Stufe 1 setzt diese auf Stufe 2 mit aktuellem Datum;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-021", "id": "SyRS-021",
@@ -682,7 +717,8 @@
"tracelinks": "StRS-009 | SwRS-015", "tracelinks": "StRS-009 | SwRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für einen Lieferanten mit `EdiDataType.OpenTrans21` und", "pruefidee": "Für einen Lieferanten mit `EdiDataType.OpenTrans21` und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-022", "id": "SyRS-022",
@@ -701,7 +737,8 @@
"tracelinks": "StRS-009, StRS-013 | SwRS-002", "tracelinks": "StRS-009, StRS-013 | SwRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein fehlgeschlagener Produktivlauf erzeugt einen Protokolleintrag mit Zustand `Exception`,", "pruefidee": "Ein fehlgeschlagener Produktivlauf erzeugt einen Protokolleintrag mit Zustand `Exception`,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-023", "id": "SyRS-023",
@@ -720,7 +757,8 @@
"tracelinks": "StRS-010, StRS-003 | SwRS-009, SwRS-017", "tracelinks": "StRS-010, StRS-003 | SwRS-009, SwRS-017",
"konsolidierung": "Kandidat: Es existieren zwei vollständig getrennte Rechtemodelle (`Sichtrus`/`Sichmemb` für", "konsolidierung": "Kandidat: Es existieren zwei vollständig getrennte Rechtemodelle (`Sichtrus`/`Sichmemb` für",
"pruefidee": "Ein Web-Account, dessen Kunde gesperrt ist, kann sich nicht anmelden; ein angemeldetes", "pruefidee": "Ein Web-Account, dessen Kunde gesperrt ist, kann sich nicht anmelden; ein angemeldetes",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-024", "id": "SyRS-024",
@@ -739,7 +777,8 @@
"tracelinks": "StRS-011 | SwRS-013", "tracelinks": "StRS-011 | SwRS-013",
"konsolidierung": "Kandidat: Die Aktivierung ist doppelt steuerbar (global über `IsZugferdEnabled()`,", "konsolidierung": "Kandidat: Die Aktivierung ist doppelt steuerbar (global über `IsZugferdEnabled()`,",
"pruefidee": "Eine gespeicherte, nicht stornierte Rechnung erzeugt bei aktivierter Einstellung ein PDF mit", "pruefidee": "Eine gespeicherte, nicht stornierte Rechnung erzeugt bei aktivierter Einstellung ein PDF mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-025", "id": "SyRS-025",
@@ -758,7 +797,8 @@
"tracelinks": "StRS-012 | SwRS-016", "tracelinks": "StRS-012 | SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Benutzer ohne `ACCESS_CLEANUP_DATABASE` erhält \"Insufficient rights!\"; ein berechtigter", "pruefidee": "Ein Benutzer ohne `ACCESS_CLEANUP_DATABASE` erhält \"Insufficient rights!\"; ein berechtigter",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-026", "id": "SyRS-026",
@@ -777,7 +817,8 @@
"tracelinks": "StRS-013, StRS-001 | SwRS-005, SwRS-003", "tracelinks": "StRS-013, StRS-001 | SwRS-005, SwRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach einer Belegänderung existiert in der zugehörigen Versionstabelle ein Datensatz mit", "pruefidee": "Nach einer Belegänderung existiert in der zugehörigen Versionstabelle ein Datensatz mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-027", "id": "SyRS-027",
@@ -796,7 +837,8 @@
"tracelinks": "StRS-013 | SwRS-024", "tracelinks": "StRS-013 | SwRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Client A und Client B laden denselben Beleg; nach dem Speichern durch A erhält B beim", "pruefidee": "Client A und Client B laden denselben Beleg; nach dem Speichern durch A erhält B beim",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-028", "id": "SyRS-028",
@@ -815,7 +857,8 @@
"tracelinks": "StRS-014 | SwRS-021", "tracelinks": "StRS-014 | SwRS-021",
"konsolidierung": "Kandidat: vier voneinander unabhängige Ressourcensätze mit teils redundanten Schlüsseln.", "konsolidierung": "Kandidat: vier voneinander unabhängige Ressourcensätze mit teils redundanten Schlüsseln.",
"pruefidee": "Bei Umschaltung auf Englisch erscheinen in einer Stichprobe von Masken und Fehlermeldungen", "pruefidee": "Bei Umschaltung auf Englisch erscheinen in einer Stichprobe von Masken und Fehlermeldungen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-029", "id": "SyRS-029",
@@ -834,7 +877,8 @@
"tracelinks": "StRS-015, StRS-004 | SwRS-020", "tracelinks": "StRS-015, StRS-004 | SwRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Installation einer neueren Version enthält `DBUpdate` Einträge für alle Skripte, deren", "pruefidee": "Nach Installation einer neueren Version enthält `DBUpdate` Einträge für alle Skripte, deren",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-030", "id": "SyRS-030",
@@ -853,7 +897,8 @@
"tracelinks": "StRS-013, StRS-015 | SwRS-002", "tracelinks": "StRS-013, StRS-015 | SwRS-002",
"konsolidierung": "Kandidat: Vier getrennte NLog-Konfigurationen (WPF-Client, Konsolen-Host, Windows-Dienst,", "konsolidierung": "Kandidat: Vier getrennte NLog-Konfigurationen (WPF-Client, Konsolen-Host, Windows-Dienst,",
"pruefidee": "Ein fehlgeschlagener Anmeldeversuch erzeugt einen `WARN`-Eintrag mit Benutzernamen,", "pruefidee": "Ein fehlgeschlagener Anmeldeversuch erzeugt einen `WARN`-Eintrag mit Benutzernamen,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-031", "id": "SyRS-031",
@@ -872,7 +917,8 @@
"tracelinks": "StRS-015 | SwRS-020", "tracelinks": "StRS-015 | SwRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein aus `main` gebautes Artefakt trägt die aus `version.json` abgeleitete Version und im", "pruefidee": "Ein aus `main` gebautes Artefakt trägt die aus `version.json` abgeleitete Version und im",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-032", "id": "SyRS-032",
@@ -890,7 +936,8 @@
"tracelinks": "StRS-015 | SwRS-001", "tracelinks": "StRS-015 | SwRS-001",
"konsolidierung": "Kandidat: Die doppelte Implementierung jeder Modulschnittstelle verdoppelt den", "konsolidierung": "Kandidat: Die doppelte Implementierung jeder Modulschnittstelle verdoppelt den",
"pruefidee": "Ein Modul, das nur `CentronConnectionType.CentronWebServices` deklariert, wird bei", "pruefidee": "Ein Modul, das nur `CentronConnectionType.CentronWebServices` deklariert, wird bei",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-001", "id": "SwRS-001",
@@ -909,7 +956,8 @@
"tracelinks": "SyRS-032 | StRS-015", "tracelinks": "SyRS-032 | StRS-015",
"konsolidierung": "Kandidat: Die durchgängige Doppelimplementierung ist die größte strukturelle Redundanz der", "konsolidierung": "Kandidat: Die durchgängige Doppelimplementierung ist die größte strukturelle Redundanz der",
"pruefidee": "Für eine Stichprobe von `I*Logic`-Schnittstellen existieren jeweils eine `BL*Logic`- und eine", "pruefidee": "Für eine Stichprobe von `I*Logic`-Schnittstellen existieren jeweils eine `BL*Logic`- und eine",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-002", "id": "SwRS-002",
@@ -928,7 +976,8 @@
"tracelinks": "SyRS-006, SyRS-022, SyRS-030 | StRS-013", "tracelinks": "SyRS-006, SyRS-022, SyRS-030 | StRS-013",
"konsolidierung": "Kandidat: Neben `Result`/`Result<T>` existiert im Web-Service-Host ein zweites Modell", "konsolidierung": "Kandidat: Neben `Result`/`Result<T>` existiert im Web-Service-Host ein zweites Modell",
"pruefidee": "Ein Aufruf ohne erforderliches Recht liefert `Status = Error` und `MessageCode = 10000`;", "pruefidee": "Ein Aufruf ohne erforderliches Recht liefert `Status = Error` und `MessageCode = 10000`;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-003", "id": "SwRS-003",
@@ -947,7 +996,8 @@
"tracelinks": "SyRS-026, SyRS-001 | StRS-001", "tracelinks": "SyRS-026, SyRS-001 | StRS-001",
"konsolidierung": "Kandidat: Modernes Entitäts-/View-Mapping und Legacy-Save-Repository bilden dasselbe", "konsolidierung": "Kandidat: Modernes Entitäts-/View-Mapping und Legacy-Save-Repository bilden dasselbe",
"pruefidee": "Ein neu eingeführtes Belegfeld wird gespeichert und nach erneutem Laden unverändert", "pruefidee": "Ein neu eingeführtes Belegfeld wird gespeichert und nach erneutem Laden unverändert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-004", "id": "SwRS-004",
@@ -966,7 +1016,8 @@
"tracelinks": "SyRS-001, SyRS-026 | StRS-001", "tracelinks": "SyRS-001, SyRS-026 | StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede Belegart existieren Tabelle und View; eine Abfrage über die View liefert dieselben", "pruefidee": "Für jede Belegart existieren Tabelle und View; eine Abfrage über die View liefert dieselben",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-005", "id": "SwRS-005",
@@ -984,7 +1035,8 @@
"tracelinks": "SyRS-026 | StRS-013", "tracelinks": "SyRS-026 | StRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Vergleich der Spaltenlisten von `RechKopf` und `RechKopfVersions` ergibt bis auf `I3D`", "pruefidee": "Ein Vergleich der Spaltenlisten von `RechKopf` und `RechKopfVersions` ergibt bis auf `I3D`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-006", "id": "SwRS-006",
@@ -1003,7 +1055,8 @@
"tracelinks": "SyRS-001 | StRS-001", "tracelinks": "SyRS-001 | StRS-001",
"konsolidierung": "Kandidat: Es existieren zwei Namensvarianten für Fremdschlüssel (`…I3D` und historisch", "konsolidierung": "Kandidat: Es existieren zwei Namensvarianten für Fremdschlüssel (`…I3D` und historisch",
"pruefidee": "Eine Schemaprüfung ergibt für alle Tabellen einen Primärschlüssel `I3D` vom Typ", "pruefidee": "Eine Schemaprüfung ergibt für alle Tabellen einen Primärschlüssel `I3D` vom Typ",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-007", "id": "SwRS-007",
@@ -1022,7 +1075,8 @@
"tracelinks": "SyRS-008, SyRS-026 | StRS-013", "tracelinks": "SyRS-008, SyRS-026 | StRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Anlage eines Datensatzes sind `CreatedByI3D` und `CreatedDate` gesetzt; nach einer", "pruefidee": "Nach Anlage eines Datensatzes sind `CreatedByI3D` und `CreatedDate` gesetzt; nach einer",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-008", "id": "SwRS-008",
@@ -1039,7 +1093,8 @@
"tracelinks": "SyRS-001, SyRS-021 | StRS-001", "tracelinks": "SyRS-001, SyRS-021 | StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Vergleich der Enum-Werte zweier aufeinanderfolgender Releases ergibt keine geänderten", "pruefidee": "Ein Vergleich der Enum-Werte zweier aufeinanderfolgender Releases ergibt keine geänderten",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-009", "id": "SwRS-009",
@@ -1058,7 +1113,8 @@
"tracelinks": "SyRS-010, SyRS-011, SyRS-012, SyRS-023 | StRS-003", "tracelinks": "SyRS-010, SyRS-011, SyRS-012, SyRS-023 | StRS-003",
"konsolidierung": "Kandidat: Drei verschiedene Hashverfahren im selben System (ungesalzenes SHA-1 für", "konsolidierung": "Kandidat: Drei verschiedene Hashverfahren im selben System (ungesalzenes SHA-1 für",
"pruefidee": "Zwei Benutzer mit identischem Kennwort besitzen in der Datenbank denselben Hashwert", "pruefidee": "Zwei Benutzer mit identischem Kennwort besitzen in der Datenbank denselben Hashwert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-010", "id": "SwRS-010",
@@ -1077,7 +1133,8 @@
"tracelinks": "SyRS-009, SyRS-015, SyRS-016 | StRS-004", "tracelinks": "SyRS-009, SyRS-015, SyRS-016 | StRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei aufeinanderfolgende Ticketerzeugungen für dasselbe Gerät liefern unterschiedliche", "pruefidee": "Zwei aufeinanderfolgende Ticketerzeugungen für dasselbe Gerät liefern unterschiedliche",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-011", "id": "SwRS-011",
@@ -1095,7 +1152,8 @@
"tracelinks": "SyRS-013 | StRS-003, StRS-013", "tracelinks": "SyRS-013 | StRS-003, StRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "In der Tabelle `AccessToken` steht ausschließlich ein 64 Zeichen langer Hexwert; ein", "pruefidee": "In der Tabelle `AccessToken` steht ausschließlich ein 64 Zeichen langer Hexwert; ein",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-012", "id": "SwRS-012",
@@ -1114,7 +1172,8 @@
"tracelinks": "SyRS-019, SyRS-024 | StRS-007, StRS-011", "tracelinks": "SyRS-019, SyRS-024 | StRS-007, StRS-011",
"konsolidierung": "Kandidat: `double`- und `decimal`-Überladungen derselben Formeln existieren parallel und", "konsolidierung": "Kandidat: `double`- und `decimal`-Überladungen derselben Formeln existieren parallel und",
"pruefidee": "Für Basispreis 10,005, Währungsfaktor 1, Rabatt 0, Genauigkeit 2 liefert `CalculateNetPrice`", "pruefidee": "Für Basispreis 10,005, Währungsfaktor 1, Rabatt 0, Genauigkeit 2 liefert `CalculateNetPrice`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-013", "id": "SwRS-013",
@@ -1133,7 +1192,8 @@
"tracelinks": "SyRS-024, SyRS-003 | StRS-011, StRS-001", "tracelinks": "SyRS-024, SyRS-003 | StRS-011, StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für einen Nettobetrag von 100,00 und einen Steuersatz von 19 % liefert", "pruefidee": "Für einen Nettobetrag von 100,00 und einen Steuersatz von 19 % liefert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-014", "id": "SwRS-014",
@@ -1151,7 +1211,8 @@
"tracelinks": "SyRS-004 | StRS-001", "tracelinks": "SyRS-004 | StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bei zwei gleichzeitigen Aufrufen mit `updateDatabase = true` liefert genau ein Aufruf die", "pruefidee": "Bei zwei gleichzeitigen Aufrufen mit `updateDatabase = true` liefert genau ein Aufruf die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-015", "id": "SwRS-015",
@@ -1170,7 +1231,8 @@
"tracelinks": "SyRS-002, SyRS-003, SyRS-017, SyRS-020, SyRS-021 | StRS-001", "tracelinks": "SyRS-002, SyRS-003, SyRS-017, SyRS-020, SyRS-021 | StRS-001",
"konsolidierung": "Kandidat: Die Schnittstelle umfasst ca. 100 Methoden, von denen jede Implementierung", "konsolidierung": "Kandidat: Die Schnittstelle umfasst ca. 100 Methoden, von denen jede Implementierung",
"pruefidee": "Für jede Belegart existiert genau eine `IReceiptSpecificLogic`-Implementierung mit", "pruefidee": "Für jede Belegart existiert genau eine `IReceiptSpecificLogic`-Implementierung mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-016", "id": "SwRS-016",
@@ -1189,7 +1251,8 @@
"tracelinks": "SyRS-005, SyRS-006, SyRS-007, SyRS-018, SyRS-025 | StRS-003", "tracelinks": "SyRS-005, SyRS-006, SyRS-007, SyRS-018, SyRS-025 | StRS-003",
"konsolidierung": "Kandidat: vier Prüfmechanismen für dieselbe fachliche Funktion (siehe SyRS-006).", "konsolidierung": "Kandidat: vier Prüfmechanismen für dieselbe fachliche Funktion (siehe SyRS-006).",
"pruefidee": "Alle vier Prüfwege liefern für denselben Benutzer und dasselbe Recht dasselbe Ergebnis;", "pruefidee": "Alle vier Prüfwege liefern für denselben Benutzer und dasselbe Recht dasselbe Ergebnis;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-017", "id": "SwRS-017",
@@ -1207,7 +1270,8 @@
"tracelinks": "SyRS-006, SyRS-023 | StRS-003", "tracelinks": "SyRS-006, SyRS-023 | StRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zehn aufeinanderfolgende `HasUserRight`-Aufrufe innerhalb einer Sitzung erzeugen genau eine", "pruefidee": "Zehn aufeinanderfolgende `HasUserRight`-Aufrufe innerhalb einer Sitzung erzeugen genau eine",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-018", "id": "SwRS-018",
@@ -1226,7 +1290,8 @@
"tracelinks": "SyRS-006, SyRS-014, SyRS-032 | StRS-003, StRS-004", "tracelinks": "SyRS-006, SyRS-014, SyRS-032 | StRS-003, StRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Benutzer ohne das Modulrecht sieht das Modul nicht im Menü; bei fehlender Modullizenz", "pruefidee": "Ein Benutzer ohne das Modulrecht sieht das Modul nicht im Menü; bei fehlender Modullizenz",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-019", "id": "SwRS-019",
@@ -1245,7 +1310,8 @@
"tracelinks": "SyRS-024, SyRS-016, SyRS-002 | StRS-011", "tracelinks": "SyRS-024, SyRS-016, SyRS-002 | StRS-011",
"konsolidierung": "Kandidat: zwei Einstellungstabellen mit zwei Schlüsselenums für dieselbe Aufgabe; im", "konsolidierung": "Kandidat: zwei Einstellungstabellen mit zwei Schlüsselenums für dieselbe Aufgabe; im",
"pruefidee": "Zu jedem Wert in `ApplicationSettingID` existiert ein `case` in", "pruefidee": "Zu jedem Wert in `ApplicationSettingID` existiert ein `case` in",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-020", "id": "SwRS-020",
@@ -1264,7 +1330,8 @@
"tracelinks": "SyRS-029, SyRS-031 | StRS-015", "tracelinks": "SyRS-029, SyRS-031 | StRS-015",
"konsolidierung": "Kandidat: zwei Migrationsmechanismen (C#-Skriptklassen und XAML-Skriptsammlungen)", "konsolidierung": "Kandidat: zwei Migrationsmechanismen (C#-Skriptklassen und XAML-Skriptsammlungen)",
"pruefidee": "Ein zweiter Start nach erfolgreicher Migration führt kein Skript erneut aus; ein Skript, das", "pruefidee": "Ein zweiter Start nach erfolgreicher Migration führt kein Skript erneut aus; ein Skript, das",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-021", "id": "SwRS-021",
@@ -1283,7 +1350,8 @@
"tracelinks": "SyRS-028 | StRS-014", "tracelinks": "SyRS-028 | StRS-014",
"konsolidierung": "Kandidat: siehe SyRS-028 - vier getrennte Ressourcensätze.", "konsolidierung": "Kandidat: siehe SyRS-028 - vier getrennte Ressourcensätze.",
"pruefidee": "Eine Codeanalyse findet in anwendersichtbaren Pfaden keine hartkodierten deutschen Literale;", "pruefidee": "Eine Codeanalyse findet in anwendersichtbaren Pfaden keine hartkodierten deutschen Literale;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-022", "id": "SwRS-022",
@@ -1302,7 +1370,8 @@
"tracelinks": "SyRS-019 | StRS-007", "tracelinks": "SyRS-019 | StRS-007",
"konsolidierung": "Kandidat: drei Implementierungen derselben fachlichen Umrechnung mit abweichender", "konsolidierung": "Kandidat: drei Implementierungen derselben fachlichen Umrechnung mit abweichender",
"pruefidee": "Für einen Vertrag mit `BillingIntervalKind = Daily` und Faktor 30 liefern Abrechnung und", "pruefidee": "Für einen Vertrag mit `BillingIntervalKind = Daily` und Faktor 30 liefern Abrechnung und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-023", "id": "SwRS-023",
@@ -1321,7 +1390,8 @@
"tracelinks": "SyRS-009, SyRS-013, SyRS-006 | StRS-003", "tracelinks": "SyRS-009, SyRS-013, SyRS-006 | StRS-003",
"konsolidierung": "Kandidat: Zwei parallele Schnittstellenstile (WCF-Bridge mit Interceptoren und", "konsolidierung": "Kandidat: Zwei parallele Schnittstellenstile (WCF-Bridge mit Interceptoren und",
"pruefidee": "Eine neu hinzugefügte, mit `[Authenticate]` markierte Dienstmethode ist ohne weitere", "pruefidee": "Eine neu hinzugefügte, mit `[Authenticate]` markierte Dienstmethode ist ohne weitere",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-024", "id": "SwRS-024",
@@ -1339,6 +1409,7 @@
"tracelinks": "SyRS-027 | StRS-013", "tracelinks": "SyRS-027 | StRS-013",
"konsolidierung": "Kandidat: Pessimistische Sperre (`AssetLockBL`) und optimistische Sperre", "konsolidierung": "Kandidat: Pessimistische Sperre (`AssetLockBL`) und optimistische Sperre",
"pruefidee": "Benutzer A öffnet einen Beleg; Benutzer B erhält beim Öffnen eine Sperrmeldung und kann die", "pruefidee": "Benutzer A öffnet einen Beleg; Benutzer B erhält beim Öffnen eine Sperrmeldung und kann die",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 4 | | Belege je Anforderung (Median) | 4 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (35 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (35 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 71 von 71 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 71 von 71 mit Tracelinks (100,0 %) |
@@ -95,6 +95,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-opus-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 3 | | Belege je Anforderung (Median) | 3 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 119 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 119 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (54 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (54 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 119 von 119 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 119 von 119 mit Tracelinks (100,0 %) |
## Opus-Solo-Block (K–O), fünf Messpunkte ## Opus-Solo-Block (K–O), fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 3 | | Belege je Anforderung (Median) | 3 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 119 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 119 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (54 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (54 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 119 von 119 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 119 von 119 mit Tracelinks (100,0 %) |
@@ -95,6 +95,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-opus-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 4,0 | | Belege je Anforderung (Median) | 4,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 114 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 114 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (50 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (50 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 114 von 114 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 114 von 114 mit Tracelinks (100,0 %) |
## Opus-Solo-Block (K–O), fünf Messpunkte ## Opus-Solo-Block (K–O), fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 4,0 | | Belege je Anforderung (Median) | 4,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 114 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 114 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (50 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (50 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 114 von 114 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 114 von 114 mit Tracelinks (100,0 %) |
@@ -95,6 +95,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-opus-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 3,0 | | Belege je Anforderung (Median) | 3,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 182 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 182 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (51 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (51 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 182 von 182 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 182 von 182 mit Tracelinks (100,0 %) |
## Opus-Solo-Block (K–O), fünf Messpunkte ## Opus-Solo-Block (K–O), fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 3,0 | | Belege je Anforderung (Median) | 3,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 182 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 182 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (51 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (51 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 182 von 182 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 182 von 182 mit Tracelinks (100,0 %) |
@@ -95,6 +95,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-opus-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 4 | | Belege je Anforderung (Median) | 4 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 108 (99,1 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 108 (99,1 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (46 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (46 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 109 von 109 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 109 von 109 mit Tracelinks (100,0 %) |
## Opus-Solo-Block (K–O), fünf Messpunkte ## Opus-Solo-Block (K–O), fünf Messpunkte
@@ -16,7 +16,8 @@
"tracelinks": "SyRS-14, SyRS-21, SwRS-14", "tracelinks": "SyRS-14, SyRS-21, SwRS-14",
"konsolidierung": "Kandidat: StRS-02 (Filialbeschränkung ist zugleich ein Berechtigungskonzept; im Zielsystem sollte", "konsolidierung": "Kandidat: StRS-02 (Filialbeschränkung ist zugleich ein Berechtigungskonzept; im Zielsystem sollte",
"pruefidee": "Zwei Filialen anlegen, in jeder eine Rechnung erzeugen; die vergebenen Rechnungsnummern müssen", "pruefidee": "Zwei Filialen anlegen, in jeder eine Rechnung erzeugen; die vergebenen Rechnungsnummern müssen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-02", "id": "StRS-02",
@@ -35,7 +36,8 @@
"tracelinks": "SyRS-09, SyRS-10, SyRS-20, SwRS-09", "tracelinks": "SyRS-09, SyRS-10, SyRS-20, SwRS-09",
"konsolidierung": "Kandidat: StRS-03 (Rechte und Lizenzen wirken in `ModuleRegistration.cs` als UND-Verknüpfung auf", "konsolidierung": "Kandidat: StRS-03 (Rechte und Lizenzen wirken in `ModuleRegistration.cs` als UND-Verknüpfung auf",
"pruefidee": "Einem Benutzer das Recht `ADD_NEW_HELPDESK` entziehen; ein Anlageversuch über UI *und* über die", "pruefidee": "Einem Benutzer das Recht `ADD_NEW_HELPDESK` entziehen; ein Anlageversuch über UI *und* über die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-03", "id": "StRS-03",
@@ -54,7 +56,8 @@
"tracelinks": "SyRS-07, SyRS-09, SwRS-11", "tracelinks": "SyRS-07, SyRS-09, SwRS-11",
"konsolidierung": "Kandidat: StRS-02 (siehe dort).", "konsolidierung": "Kandidat: StRS-02 (siehe dort).",
"pruefidee": "Lizenzanzahl für `ServiceBoard` auf 1 setzen; ein zweiter gleichzeitiger Login eines anderen", "pruefidee": "Lizenzanzahl für `ServiceBoard` auf 1 setzen; ein zweiter gleichzeitiger Login eines anderen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-04", "id": "StRS-04",
@@ -73,7 +76,8 @@
"tracelinks": "SyRS-11, SyRS-15, SyRS-16, SwRS-16, SwRS-17", "tracelinks": "SyRS-11, SyRS-15, SyRS-16, SwRS-16, SwRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Angebot anlegen → in Auftrag überführen → Lieferschein → Rechnung; anschließend am Auftrag die", "pruefidee": "Angebot anlegen → in Auftrag überführen → Lieferschein → Rechnung; anschließend am Auftrag die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-05", "id": "StRS-05",
@@ -91,7 +95,8 @@
"tracelinks": "SyRS-12, SwRS-16", "tracelinks": "SyRS-12, SwRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung stornieren, anschließend \"als bezahlt markieren\" aufrufen; der Aufruf muss mit der oben", "pruefidee": "Rechnung stornieren, anschließend \"als bezahlt markieren\" aufrufen; der Aufruf muss mit der oben",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-06", "id": "StRS-06",
@@ -110,7 +115,8 @@
"tracelinks": "SyRS-32, SyRS-33, SwRS-21", "tracelinks": "SyRS-32, SyRS-33, SwRS-21",
"konsolidierung": "Kandidat: StRS-10 (Vertragsabrechnung, Pauschalabrechnung und vereinfachte Ticketabrechnung erzeugen", "konsolidierung": "Kandidat: StRS-10 (Vertragsabrechnung, Pauschalabrechnung und vereinfachte Ticketabrechnung erzeugen",
"pruefidee": "Vertrag mit Intervall \"Quartal(e)\", Dauer 1, vorschüssig anlegen; die automatische Abrechnung muss", "pruefidee": "Vertrag mit Intervall \"Quartal(e)\", Dauer 1, vorschüssig anlegen; die automatische Abrechnung muss",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-07", "id": "StRS-07",
@@ -129,7 +135,8 @@
"tracelinks": "SyRS-32, SwRS-21", "tracelinks": "SyRS-32, SwRS-21",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit Monatskontingent 10 Stunden, `RestTake = true`, Verbrauch 6 Stunden in Periode 1:", "pruefidee": "Vertrag mit Monatskontingent 10 Stunden, `RestTake = true`, Verbrauch 6 Stunden in Periode 1:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-08", "id": "StRS-08",
@@ -148,7 +155,8 @@
"tracelinks": "SyRS-27, SyRS-28, SyRS-29, SyRS-30, SwRS-19", "tracelinks": "SyRS-27, SyRS-28, SyRS-29, SyRS-30, SwRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket anlegen, Status ändern, weiterleiten, schließen; die Ticket-Historie muss für jede dieser", "pruefidee": "Ticket anlegen, Status ändern, weiterleiten, schließen; die Ticket-Historie muss für jede dieser",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-09", "id": "StRS-09",
@@ -167,7 +175,8 @@
"tracelinks": "SyRS-31, SwRS-20", "tracelinks": "SyRS-31, SwRS-20",
"konsolidierung": "Kandidat: StRS-10", "konsolidierung": "Kandidat: StRS-10",
"pruefidee": "Zeit erfassen, in eine Rechnung überführen, anschließend die Zeit löschen wollen — der Löschversuch", "pruefidee": "Zeit erfassen, in eine Rechnung überführen, anschließend die Zeit löschen wollen — der Löschversuch",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-10", "id": "StRS-10",
@@ -185,7 +194,8 @@
"tracelinks": "SyRS-32, SyRS-33, SwRS-21", "tracelinks": "SyRS-32, SyRS-33, SwRS-21",
"konsolidierung": "Kandidat: StRS-06, StRS-09 — die fünf Abrechnungsmodule bilden dieselbe fachliche Grundfunktion", "konsolidierung": "Kandidat: StRS-06, StRS-09 — die fünf Abrechnungsmodule bilden dieselbe fachliche Grundfunktion",
"pruefidee": "Denselben Kunden über Vertragsabrechnung und über vereinfachte Ticketabrechnung abrechnen; beide", "pruefidee": "Denselben Kunden über Vertragsabrechnung und über vereinfachte Ticketabrechnung abrechnen; beide",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-11", "id": "StRS-11",
@@ -204,7 +214,8 @@
"tracelinks": "SyRS-01, SyRS-20, SyRS-35, SwRS-10, SwRS-24", "tracelinks": "SyRS-01, SyRS-20, SyRS-35, SwRS-10, SwRS-24",
"konsolidierung": "Kandidat: StRS-02 — es existieren zwei getrennte Rechtekataloge (`UserRightsConst` für Mitarbeiter,", "konsolidierung": "Kandidat: StRS-02 — es existieren zwei getrennte Rechtekataloge (`UserRightsConst` für Mitarbeiter,",
"pruefidee": "Mit einem Web-Account anmelden, der nur `WEBRIGHT_EDITONLYOWNREQUESTS` besitzt: Der Zugriff auf ein", "pruefidee": "Mit einem Web-Account anmelden, der nur `WEBRIGHT_EDITONLYOWNREQUESTS` besitzt: Der Zugriff auf ein",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-12", "id": "StRS-12",
@@ -223,7 +234,8 @@
"tracelinks": "SyRS-34, SwRS-18", "tracelinks": "SyRS-34, SwRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Warenkorb im Zustand `Created` direkt freigeben wollen (ohne `ReadyForCheck`): Der Aufruf muss mit", "pruefidee": "Warenkorb im Zustand `Created` direkt freigeben wollen (ohne `ReadyForCheck`): Der Aufruf muss mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-13", "id": "StRS-13",
@@ -242,7 +254,8 @@
"tracelinks": "SyRS-26, SwRS-22", "tracelinks": "SyRS-26, SwRS-22",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde mit `ExportZUGFeRDDocument = true` und gepflegter Leitweg-ID: Der Rechnungsversand muss ein", "pruefidee": "Kunde mit `ExportZUGFeRDDocument = true` und gepflegter Leitweg-ID: Der Rechnungsversand muss ein",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-14", "id": "StRS-14",
@@ -261,7 +274,8 @@
"tracelinks": "SyRS-26, SwRS-22", "tracelinks": "SyRS-26, SwRS-22",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung exportieren, Export wiederholen: Der zweite Lauf darf die Rechnung nicht erneut in die", "pruefidee": "Rechnung exportieren, Export wiederholen: Der zweite Lauf darf die Rechnung nicht erneut in die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-15", "id": "StRS-15",
@@ -280,7 +294,8 @@
"tracelinks": "SyRS-22, SwRS-15", "tracelinks": "SyRS-22, SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde auf Mahnstufe 3 setzen, Sperrschwelle auf 2 konfigurieren; ein neuer Auftrag für diesen", "pruefidee": "Kunde auf Mahnstufe 3 setzen, Sperrschwelle auf 2 konfigurieren; ein neuer Auftrag für diesen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-16", "id": "StRS-16",
@@ -299,7 +314,8 @@
"tracelinks": "SyRS-11, SwRS-05", "tracelinks": "SyRS-11, SwRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lieferschein mit Menge 5 buchen; der Lagerbestand des Artikels muss anschließend um genau 5", "pruefidee": "Lieferschein mit Menge 5 buchen; der Lagerbestand des Artikels muss anschließend um genau 5",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-17", "id": "StRS-17",
@@ -318,7 +334,8 @@
"tracelinks": "SyRS-11, SyRS-20, SwRS-17", "tracelinks": "SyRS-11, SyRS-20, SwRS-17",
"konsolidierung": "Kandidat: StRS-04 — Kunden- und Lieferantenbelege teilen die Basisklasse `ReceiptBase`, sind aber in", "konsolidierung": "Kandidat: StRS-04 — Kunden- und Lieferantenbelege teilen die Basisklasse `ReceiptBase`, sind aber in",
"pruefidee": "Zwei Lieferantenrechnungen mit identischer externer Rechnungsnummer desselben Lieferanten erfassen;", "pruefidee": "Zwei Lieferantenrechnungen mit identischer externer Rechnungsnummer desselben Lieferanten erfassen;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-18", "id": "StRS-18",
@@ -336,7 +353,8 @@
"tracelinks": "SyRS-20, SwRS-15", "tracelinks": "SyRS-20, SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`InvoiceAutoProvisionIsActive = true`, Prozentsatz 3, Mitarbeiter X; eine neue Rechnung über 1.000 €", "pruefidee": "`InvoiceAutoProvisionIsActive = true`, Prozentsatz 3, Mitarbeiter X; eine neue Rechnung über 1.000 €",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-19", "id": "StRS-19",
@@ -355,7 +373,8 @@
"tracelinks": "SyRS-10, SwRS-09", "tracelinks": "SyRS-10, SwRS-09",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit `RIGHT_MITARBEITERAUSLASTUNGNUREIGENEFILIALE` öffnet die Mitarbeiterauslastung; es", "pruefidee": "Benutzer mit `RIGHT_MITARBEITERAUSLASTUNGNUREIGENEFILIALE` öffnet die Mitarbeiterauslastung; es",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-20", "id": "StRS-20",
@@ -374,7 +393,8 @@
"tracelinks": "SyRS-45, SwRS-07", "tracelinks": "SyRS-45, SwRS-07",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Löschanfrage für einen Ansprechpartner ausführen; danach müssen Name und Kontaktdaten durch den", "pruefidee": "Löschanfrage für einen Ansprechpartner ausführen; danach müssen Name und Kontaktdaten durch den",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-21", "id": "StRS-21",
@@ -393,7 +413,8 @@
"tracelinks": "SyRS-29, SyRS-37, SwRS-07", "tracelinks": "SyRS-29, SyRS-37, SwRS-07",
"konsolidierung": "Kandidat: die vier parallelen Historienmechanismen (`ChangeLog`, `ReceiptLog`,", "konsolidierung": "Kandidat: die vier parallelen Historienmechanismen (`ChangeLog`, `ReceiptLog`,",
"pruefidee": "Fälligkeitsdatum eines Tickets ändern; die Ticket-Historie muss einen Eintrag \"Fälligkeitsdatum", "pruefidee": "Fälligkeitsdatum eines Tickets ändern; die Ticket-Historie muss einen Eintrag \"Fälligkeitsdatum",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-22", "id": "StRS-22",
@@ -412,7 +433,8 @@
"tracelinks": "SyRS-46, SwRS-24", "tracelinks": "SyRS-46, SwRS-24",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Angebot per C-Sign versenden; nach kundenseitiger Unterzeichnung muss der Web-Beleg-Status auf", "pruefidee": "Angebot per C-Sign versenden; nach kundenseitiger Unterzeichnung muss der Web-Beleg-Status auf",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-23", "id": "StRS-23",
@@ -431,7 +453,8 @@
"tracelinks": "SyRS-47, SwRS-27", "tracelinks": "SyRS-47, SwRS-27",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "ITscope-API-Key hinterlegen und `IsITscopeArticleSearchActive` aktivieren; die Artikelsuche im", "pruefidee": "ITscope-API-Key hinterlegen und `IsITscopeArticleSearchActive` aktivieren; die Artikelsuche im",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-24", "id": "StRS-24",
@@ -450,7 +473,8 @@
"tracelinks": "SyRS-01, SyRS-02, SyRS-04, SwRS-12, SwRS-13", "tracelinks": "SyRS-01, SyRS-02, SyRS-04, SwRS-12, SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`SystemAuthenticationMethod = OpenIdConnect` setzen und für einen Benutzer keine verknüpfte", "pruefidee": "`SystemAuthenticationMethod = OpenIdConnect` setzen und für einen Benutzer keine verknüpfte",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-25", "id": "StRS-25",
@@ -469,7 +493,8 @@
"tracelinks": "SyRS-38, SwRS-29", "tracelinks": "SyRS-38, SwRS-29",
"konsolidierung": "Kandidat: Es existieren mindestens zwei getrennte Ressourcenkataloge (WPF-Client und Nexus) mit", "konsolidierung": "Kandidat: Es existieren mindestens zwei getrennte Ressourcenkataloge (WPF-Client und Nexus) mit",
"pruefidee": "Anwendung mit englischer Kultur starten; alle in `LocalizedStrings.en.resx` gepflegten Texte müssen", "pruefidee": "Anwendung mit englischer Kultur starten; alle in `LocalizedStrings.en.resx` gepflegten Texte müssen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-26", "id": "StRS-26",
@@ -488,7 +513,8 @@
"tracelinks": "SyRS-13, SyRS-15, SwRS-14", "tracelinks": "SyRS-13, SyRS-15, SwRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMA-Vorgang anlegen: Es müssen drei getrennte Nummern (Reparatureingang, RMA, Rückversand) aus den", "pruefidee": "RMA-Vorgang anlegen: Es müssen drei getrennte Nummern (Reparatureingang, RMA, Rückversand) aus den",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-01", "id": "SyRS-01",
@@ -506,7 +532,8 @@
"tracelinks": "StRS-24 → SyRS-01 → SwRS-12, SwRS-13", "tracelinks": "StRS-24 → SyRS-01 → SwRS-12, SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anmeldung mit korrektem Benutzernamen und falschem Passwort sowie mit unbekanntem Benutzernamen:", "pruefidee": "Anmeldung mit korrektem Benutzernamen und falschem Passwort sowie mit unbekanntem Benutzernamen:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-02", "id": "SyRS-02",
@@ -525,7 +552,8 @@
"tracelinks": "StRS-24 → SyRS-02 → SwRS-12", "tracelinks": "StRS-24 → SyRS-02 → SwRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`SystemAuthenticationMethod = ActiveDirectory` setzen, AD in der Web-Service-Konfiguration", "pruefidee": "`SystemAuthenticationMethod = ActiveDirectory` setzen, AD in der Web-Service-Konfiguration",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-03", "id": "SyRS-03",
@@ -543,7 +571,8 @@
"tracelinks": "StRS-24 → SyRS-03 → SwRS-13", "tracelinks": "StRS-24 → SyRS-03 → SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für ein Konto `AccountDisabledFromDate = gestern` ohne `ToDate` setzen; die Anmeldung muss mit", "pruefidee": "Für ein Konto `AccountDisabledFromDate = gestern` ohne `ToDate` setzen; die Anmeldung muss mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-04", "id": "SyRS-04",
@@ -561,7 +590,8 @@
"tracelinks": "StRS-24 → SyRS-04 → SwRS-12", "tracelinks": "StRS-24 → SyRS-04 → SwRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit aktivem E-Mail-Zweitfaktor anmelden und den Code nicht bestätigen: Es darf kein", "pruefidee": "Benutzer mit aktivem E-Mail-Zweitfaktor anmelden und den Code nicht bestätigen: Es darf kein",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-05", "id": "SyRS-05",
@@ -579,7 +609,8 @@
"tracelinks": "StRS-24 → SyRS-05 → SwRS-13", "tracelinks": "StRS-24 → SyRS-05 → SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket einer `Default`-Anwendung erzeugen, Systemzeit um 31 Minuten vorstellen, geschützte Methode", "pruefidee": "Ticket einer `Default`-Anwendung erzeugen, Systemzeit um 31 Minuten vorstellen, geschützte Methode",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-06", "id": "SyRS-06",
@@ -596,7 +627,8 @@
"tracelinks": "StRS-24 → SyRS-06 → SwRS-13", "tracelinks": "StRS-24 → SyRS-06 → SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Aufrufe im Abstand von 4 Minuten absetzen; das gespeicherte `ExpiryDate` darf sich nach dem", "pruefidee": "Zwei Aufrufe im Abstand von 4 Minuten absetzen; das gespeicherte `ExpiryDate` darf sich nach dem",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-07", "id": "SyRS-07",
@@ -615,7 +647,8 @@
"tracelinks": "StRS-03 → SyRS-07 → SwRS-11", "tracelinks": "StRS-03 → SyRS-07 → SwRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lizenzanzahl auf 1 setzen und von zwei verschiedenen Maschinen mit demselben Benutzer anmelden:", "pruefidee": "Lizenzanzahl auf 1 setzen und von zwei verschiedenen Maschinen mit demselben Benutzer anmelden:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-08", "id": "SyRS-08",
@@ -632,7 +665,8 @@
"tracelinks": "StRS-02, StRS-03 → SyRS-08 → SwRS-11", "tracelinks": "StRS-02, StRS-03 → SyRS-08 → SwRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit `RIGHT_DISALLOW_SERVICEBOARD_LOGIN` versucht die Anmeldung am ServiceBoard: Sie muss", "pruefidee": "Benutzer mit `RIGHT_DISALLOW_SERVICEBOARD_LOGIN` versucht die Anmeldung am ServiceBoard: Sie muss",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-09", "id": "SyRS-09",
@@ -651,7 +685,8 @@
"tracelinks": "StRS-02, StRS-03 → SyRS-09 → SwRS-30, SwRS-31", "tracelinks": "StRS-02, StRS-03 → SyRS-09 → SwRS-30, SwRS-31",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Recht für \"Rechteverwaltung\" entziehen: Das Modul darf nach Neustart nicht mehr registriert sein;", "pruefidee": "Recht für \"Rechteverwaltung\" entziehen: Das Modul darf nach Neustart nicht mehr registriert sein;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-10", "id": "SyRS-10",
@@ -670,7 +705,8 @@
"tracelinks": "StRS-01, StRS-02, StRS-19 → SyRS-10 → SwRS-09", "tracelinks": "StRS-01, StRS-02, StRS-19 → SyRS-10 → SwRS-09",
"konsolidierung": "Kandidat: SyRS-21 — Filialbeschränkung ist in Helpdesk, Belegwesen und Auswertungen jeweils", "konsolidierung": "Kandidat: SyRS-21 — Filialbeschränkung ist in Helpdesk, Belegwesen und Auswertungen jeweils",
"pruefidee": "Benutzer mit `SHOW_HELPDESK_ONLY_OWN_BRANCH` ruft ein Ticket einer fremden Filiale direkt über die", "pruefidee": "Benutzer mit `SHOW_HELPDESK_ONLY_OWN_BRANCH` ruft ein Ticket einer fremden Filiale direkt über die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-11", "id": "SyRS-11",
@@ -689,7 +725,8 @@
"tracelinks": "StRS-04, StRS-16, StRS-17 → SyRS-11 → SwRS-17", "tracelinks": "StRS-04, StRS-16, StRS-17 → SyRS-11 → SwRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Dokument an ein Ticket und an eine Rechnung hängen; beide Zuordnungen müssen in derselben", "pruefidee": "Ein Dokument an ein Ticket und an eine Rechnung hängen; beide Zuordnungen müssen in derselben",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-12", "id": "SyRS-12",
@@ -707,7 +744,8 @@
"tracelinks": "StRS-05 → SyRS-12 → SwRS-16", "tracelinks": "StRS-05 → SyRS-12 → SwRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Wie StRS-05.", "pruefidee": "Wie StRS-05.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-13", "id": "SyRS-13",
@@ -725,7 +763,8 @@
"tracelinks": "StRS-04, StRS-26 → SyRS-13 → SwRS-14", "tracelinks": "StRS-04, StRS-26 → SyRS-13 → SwRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei parallele Anlagen desselben Belegtyps auslösen; beide müssen unterschiedliche, aufeinander", "pruefidee": "Zwei parallele Anlagen desselben Belegtyps auslösen; beide müssen unterschiedliche, aufeinander",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-14", "id": "SyRS-14",
@@ -743,7 +782,8 @@
"tracelinks": "StRS-01 → SyRS-14 → SwRS-14", "tracelinks": "StRS-01 → SyRS-14 → SwRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Filialen mit disjunkten Nummernbereichen konfigurieren; je ein Ticket pro Filiale anlegen und", "pruefidee": "Zwei Filialen mit disjunkten Nummernbereichen konfigurieren; je ein Ticket pro Filiale anlegen und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-15", "id": "SyRS-15",
@@ -761,7 +801,8 @@
"tracelinks": "StRS-04, StRS-26 → SyRS-15 → SwRS-17", "tracelinks": "StRS-04, StRS-26 → SyRS-15 → SwRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Auftrag mit 10 Stück in zwei Teillieferscheine à 5 Stück überführen; ein dritter Lieferschein darf", "pruefidee": "Auftrag mit 10 Stück in zwei Teillieferscheine à 5 Stück überführen; ein dritter Lieferschein darf",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-16", "id": "SyRS-16",
@@ -779,7 +820,8 @@
"tracelinks": "StRS-04 → SyRS-16 → SwRS-17", "tracelinks": "StRS-04 → SyRS-16 → SwRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anzahlungsrechnung zu einem Auftrag erzeugen und anschließend die Belegprogression des Auftrags", "pruefidee": "Anzahlungsrechnung zu einem Auftrag erzeugen und anschließend die Belegprogression des Auftrags",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-17", "id": "SyRS-17",
@@ -796,7 +838,8 @@
"tracelinks": "StRS-04, StRS-21 → SyRS-17 → SwRS-16", "tracelinks": "StRS-04, StRS-21 → SyRS-17 → SwRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Angebot in Version 3 bringen, in einen Auftrag überführen, anschließend eine neue Version aus", "pruefidee": "Angebot in Version 3 bringen, in einen Auftrag überführen, anschließend eine neue Version aus",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-18", "id": "SyRS-18",
@@ -814,7 +857,8 @@
"tracelinks": "StRS-04, StRS-21 → SyRS-18 → SwRS-16", "tracelinks": "StRS-04, StRS-21 → SyRS-18 → SwRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg in zwei Sitzungen laden, in Sitzung A speichern, danach in Sitzung B speichern: Der zweite", "pruefidee": "Beleg in zwei Sitzungen laden, in Sitzung A speichern, danach in Sitzung B speichern: Der zweite",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-19", "id": "SyRS-19",
@@ -832,7 +876,8 @@
"tracelinks": "StRS-04 → SyRS-19 → SwRS-16", "tracelinks": "StRS-04 → SyRS-19 → SwRS-16",
"konsolidierung": "Kandidat: SyRS-18 — es existieren zwei parallele Nebenläufigkeitsmechanismen (Sperre und", "konsolidierung": "Kandidat: SyRS-18 — es existieren zwei parallele Nebenläufigkeitsmechanismen (Sperre und",
"pruefidee": "Beleg in Sitzung A zur Bearbeitung öffnen; Sitzung B muss beim Öffnen die Sperrmeldung erhalten und", "pruefidee": "Beleg in Sitzung A zur Bearbeitung öffnen; Sitzung B muss beim Öffnen die Sperrmeldung erhalten und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-20", "id": "SyRS-20",
@@ -851,7 +896,8 @@
"tracelinks": "StRS-02, StRS-11, StRS-17, StRS-18 → SyRS-20 → SwRS-15", "tracelinks": "StRS-02, StRS-11, StRS-17, StRS-18 → SyRS-20 → SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit `SHOW_INVOICES`, aber ohne `EDIT_INVOICE`: Anzeige muss gelingen, jede Änderung mit", "pruefidee": "Benutzer mit `SHOW_INVOICES`, aber ohne `EDIT_INVOICE`: Anzeige muss gelingen, jede Änderung mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-21", "id": "SyRS-21",
@@ -869,7 +915,8 @@
"tracelinks": "StRS-01, StRS-02 → SyRS-21 → SwRS-15", "tracelinks": "StRS-01, StRS-02 → SyRS-21 → SwRS-15",
"konsolidierung": "Kandidat: SyRS-10", "konsolidierung": "Kandidat: SyRS-10",
"pruefidee": "Benutzer der Filiale 2 mit `EDIT_INVOICE_ONLY_OWN_BRANCH` bearbeitet eine Rechnung der Filiale 1:", "pruefidee": "Benutzer der Filiale 2 mit `EDIT_INVOICE_ONLY_OWN_BRANCH` bearbeitet eine Rechnung der Filiale 1:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-22", "id": "SyRS-22",
@@ -887,7 +934,8 @@
"tracelinks": "StRS-15 → SyRS-22 → SwRS-15", "tracelinks": "StRS-15 → SyRS-22 → SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Sperrschwelle für \"Auftrag\" auf 2 setzen, Kunde auf Mahnstufe 2: Auftragsanlage muss scheitern,", "pruefidee": "Sperrschwelle für \"Auftrag\" auf 2 setzen, Kunde auf Mahnstufe 2: Auftragsanlage muss scheitern,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-23", "id": "SyRS-23",
@@ -905,7 +953,8 @@
"tracelinks": "StRS-04 → SyRS-23 → SwRS-08, SwRS-15", "tracelinks": "StRS-04 → SyRS-23 → SwRS-08, SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`ReceiptUserStateRequiredInInvoices = true` setzen und eine Rechnung ohne Belegstatus speichern:", "pruefidee": "`ReceiptUserStateRequiredInInvoices = true` setzen und eine Rechnung ohne Belegstatus speichern:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-24", "id": "SyRS-24",
@@ -923,7 +972,8 @@
"tracelinks": "StRS-04, StRS-13 → SyRS-24 → SwRS-15", "tracelinks": "StRS-04, StRS-13 → SyRS-24 → SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde ohne Steuernummer und ohne USt-IdNr.; die Erstellung eines Belegs der prüfpflichtigen Art", "pruefidee": "Kunde ohne Steuernummer und ohne USt-IdNr.; die Erstellung eines Belegs der prüfpflichtigen Art",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-25", "id": "SyRS-25",
@@ -941,7 +991,8 @@
"tracelinks": "StRS-04, StRS-13 → SyRS-25 → SwRS-22", "tracelinks": "StRS-04, StRS-13 → SyRS-25 → SwRS-22",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Standardreport der Reportgruppe \"Rechnung\" entfernen und eine Rechnung drucken wollen: Der Aufruf", "pruefidee": "Standardreport der Reportgruppe \"Rechnung\" entfernen und eine Rechnung drucken wollen: Der Aufruf",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-26", "id": "SyRS-26",
@@ -960,7 +1011,8 @@
"tracelinks": "StRS-13, StRS-14 → SyRS-26 → SwRS-22", "tracelinks": "StRS-13, StRS-14 → SyRS-26 → SwRS-22",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde einer Firmengruppe zuordnen, Leitweg-ID nur an der Firmengruppe pflegen: Die Rechnung muss", "pruefidee": "Kunde einer Firmengruppe zuordnen, Leitweg-ID nur an der Firmengruppe pflegen: Die Rechnung muss",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-27", "id": "SyRS-27",
@@ -979,7 +1031,8 @@
"tracelinks": "StRS-08 → SyRS-27 → SwRS-19", "tracelinks": "StRS-08 → SyRS-27 → SwRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neuen Ticketstatus anlegen und als \"geschlossen\"-Status konfigurieren; das Schließen eines Tickets", "pruefidee": "Neuen Ticketstatus anlegen und als \"geschlossen\"-Status konfigurieren; das Schließen eines Tickets",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-28", "id": "SyRS-28",
@@ -998,7 +1051,8 @@
"tracelinks": "StRS-08, StRS-21 → SyRS-28 → SwRS-19", "tracelinks": "StRS-08, StRS-21 → SyRS-28 → SwRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne `CLOSE_REQUEST` setzt den Abschlussstatus: Der Speichervorgang muss mit", "pruefidee": "Benutzer ohne `CLOSE_REQUEST` setzt den Abschlussstatus: Der Speichervorgang muss mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-29", "id": "SyRS-29",
@@ -1015,7 +1069,8 @@
"tracelinks": "StRS-08, StRS-21 → SyRS-29 → SwRS-19", "tracelinks": "StRS-08, StRS-21 → SyRS-29 → SwRS-19",
"konsolidierung": "Kandidat: SyRS-37 — die Ticket-Historie ist ein eigener Mechanismus neben `ChangeLog`.", "konsolidierung": "Kandidat: SyRS-37 — die Ticket-Historie ist ein eigener Mechanismus neben `ChangeLog`.",
"pruefidee": "Ticketstatus ändern und speichern; anschließend muss genau ein neuer Historieneintrag mit altem und", "pruefidee": "Ticketstatus ändern und speichern; anschließend muss genau ein neuer Historieneintrag mit altem und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-30", "id": "SyRS-30",
@@ -1034,7 +1089,8 @@
"tracelinks": "StRS-08 → SyRS-30 → SwRS-19", "tracelinks": "StRS-08 → SyRS-30 → SwRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket auf Eskalationsstufe 2 bringen, Fälligkeitsdatum um eine Woche verschieben: `EscalationLevel`", "pruefidee": "Ticket auf Eskalationsstufe 2 bringen, Fälligkeitsdatum um eine Woche verschieben: `EscalationLevel`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-31", "id": "SyRS-31",
@@ -1052,7 +1108,8 @@
"tracelinks": "StRS-09 → SyRS-31 → SwRS-20", "tracelinks": "StRS-09 → SyRS-31 → SwRS-20",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zeit erfassen, in einen Auftrag übernehmen, Zeit löschen wollen: Der Versuch muss mit der", "pruefidee": "Zeit erfassen, in einen Auftrag übernehmen, Zeit löschen wollen: Der Versuch muss mit der",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-32", "id": "SyRS-32",
@@ -1071,7 +1128,8 @@
"tracelinks": "StRS-06, StRS-07, StRS-10 → SyRS-32 → SwRS-21", "tracelinks": "StRS-06, StRS-07, StRS-10 → SyRS-32 → SwRS-21",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit Jahresintervall (Dauer 1) und Monatskontingent (`DifferContingentIntervalDuration = 1`):", "pruefidee": "Vertrag mit Jahresintervall (Dauer 1) und Monatskontingent (`DifferContingentIntervalDuration = 1`):",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-33", "id": "SyRS-33",
@@ -1088,7 +1146,8 @@
"tracelinks": "StRS-06, StRS-10 → SyRS-33 → SwRS-21", "tracelinks": "StRS-06, StRS-10 → SyRS-33 → SwRS-21",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei sonst identische Verträge, einer vorschüssig, einer nachschüssig: Die am selben Stichtag", "pruefidee": "Zwei sonst identische Verträge, einer vorschüssig, einer nachschüssig: Die am selben Stichtag",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-34", "id": "SyRS-34",
@@ -1107,7 +1166,8 @@
"tracelinks": "StRS-12 → SyRS-34 → SwRS-18", "tracelinks": "StRS-12 → SyRS-34 → SwRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Warenkorb `ReadyForCheck` durch einen Web-Account ohne `WEBRIGHT_WEBCART2_CHECK_CART` freigeben", "pruefidee": "Warenkorb `ReadyForCheck` durch einen Web-Account ohne `WEBRIGHT_WEBCART2_CHECK_CART` freigeben",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-35", "id": "SyRS-35",
@@ -1126,7 +1186,8 @@
"tracelinks": "StRS-11, StRS-24 → SyRS-35 → SwRS-24", "tracelinks": "StRS-11, StRS-24 → SyRS-35 → SwRS-24",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kundenportal auf Port 8443 konfigurieren; eine interne ServiceBoard-Seite über Port 8443 aufrufen:", "pruefidee": "Kundenportal auf Port 8443 konfigurieren; eine interne ServiceBoard-Seite über Port 8443 aufrufen:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-36", "id": "SyRS-36",
@@ -1144,7 +1205,8 @@
"tracelinks": "StRS-11 → SyRS-36 → SwRS-24", "tracelinks": "StRS-11 → SyRS-36 → SwRS-24",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Datei mit 30 MB über das Kundenportal hochladen: Der Upload muss abgewiesen werden; dieselbe Datei", "pruefidee": "Datei mit 30 MB über das Kundenportal hochladen: Der Upload muss abgewiesen werden; dieselbe Datei",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-37", "id": "SyRS-37",
@@ -1162,7 +1224,8 @@
"tracelinks": "StRS-21 → SyRS-37 → SwRS-07", "tracelinks": "StRS-21 → SyRS-37 → SwRS-07",
"konsolidierung": "Kandidat: SyRS-29 und die Mechanismen `ReceiptLog` / `ReceiptHistoryEntry` bilden dieselbe", "konsolidierung": "Kandidat: SyRS-29 und die Mechanismen `ReceiptLog` / `ReceiptHistoryEntry` bilden dieselbe",
"pruefidee": "Ein protokolliertes Feld auf einen Wert mit mehr als 255 Zeichen setzen: Das Protokoll darf keinen", "pruefidee": "Ein protokolliertes Feld auf einen Wert mit mehr als 255 Zeichen setzen: Das Protokoll darf keinen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-38", "id": "SyRS-38",
@@ -1181,7 +1244,8 @@
"tracelinks": "StRS-25 → SyRS-38 → SwRS-29", "tracelinks": "StRS-25 → SyRS-38 → SwRS-29",
"konsolidierung": "Kandidat: getrennte Ressourcenbestände in WPF-Client und Nexus.", "konsolidierung": "Kandidat: getrennte Ressourcenbestände in WPF-Client und Nexus.",
"pruefidee": "Anwendung mit `en-US` starten; Stichprobe von 20 Dialogtexten muss vollständig englisch sein.", "pruefidee": "Anwendung mit `en-US` starten; Stichprobe von 20 Dialogtexten muss vollständig englisch sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-39", "id": "SyRS-39",
@@ -1200,7 +1264,8 @@
"tracelinks": "StRS-02 → SyRS-39 → SwRS-23", "tracelinks": "StRS-02 → SyRS-39 → SwRS-23",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Update zweimal hintereinander auf derselben Datenbank ausführen: Der zweite Lauf darf keine", "pruefidee": "Update zweimal hintereinander auf derselben Datenbank ausführen: Der zweite Lauf darf keine",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-40", "id": "SyRS-40",
@@ -1218,7 +1283,8 @@
"tracelinks": "StRS-21 → SyRS-40 → SwRS-26", "tracelinks": "StRS-21 → SyRS-40 → SwRS-26",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine Einzelaufgabe des Dienstes künstlich fehlschlagen lassen: Der Dienst muss den Fehler mit", "pruefidee": "Eine Einzelaufgabe des Dienstes künstlich fehlschlagen lassen: Der Dienst muss den Fehler mit",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-41", "id": "SyRS-41",
@@ -1236,7 +1302,8 @@
"tracelinks": "StRS-21 → SyRS-41 → SwRS-26", "tracelinks": "StRS-21 → SyRS-41 → SwRS-26",
"konsolidierung": "Kandidat: zwei getrennte Protokollkonfigurationen mit abweichenden Stufen und Aufbewahrungsfristen.", "konsolidierung": "Kandidat: zwei getrennte Protokollkonfigurationen mit abweichenden Stufen und Aufbewahrungsfristen.",
"pruefidee": "Über 15 Tage hinweg täglich Warnungen erzeugen: Es dürfen nie mehr als 15 Archivdateien im", "pruefidee": "Über 15 Tage hinweg täglich Warnungen erzeugen: Es dürfen nie mehr als 15 Archivdateien im",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-42", "id": "SyRS-42",
@@ -1255,7 +1322,8 @@
"tracelinks": "StRS-11, StRS-25 → SyRS-42 → SwRS-28", "tracelinks": "StRS-11, StRS-25 → SyRS-42 → SwRS-28",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Container starten und einen Beleg-PDF-Report erzeugen: Umlaute und deutsche Datumsformate müssen", "pruefidee": "Container starten und einen Beleg-PDF-Report erzeugen: Umlaute und deutsche Datumsformate müssen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-43", "id": "SyRS-43",
@@ -1274,7 +1342,8 @@
"tracelinks": "StRS-02 → SyRS-43 → SwRS-33", "tracelinks": "StRS-02 → SyRS-43 → SwRS-33",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einen Test absichtlich fehlschlagen lassen: Die Build-Pipeline muss abbrechen und keine Artefakte", "pruefidee": "Einen Test absichtlich fehlschlagen lassen: Die Build-Pipeline muss abbrechen und keine Artefakte",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-44", "id": "SyRS-44",
@@ -1292,7 +1361,8 @@
"tracelinks": "StRS-24 → SyRS-44 → SwRS-13", "tracelinks": "StRS-24 → SyRS-44 → SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Benutzer mit identischem Passwort anlegen; die gespeicherten Werte in `Sichbenu.Password`", "pruefidee": "Zwei Benutzer mit identischem Passwort anlegen; die gespeicherten Werte in `Sichbenu.Password`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-45", "id": "SyRS-45",
@@ -1311,7 +1381,8 @@
"tracelinks": "StRS-20 → SyRS-45 → SwRS-07", "tracelinks": "StRS-20 → SyRS-45 → SwRS-07",
"konsolidierung": "Kandidat: Der Code enthält mehrere auskommentierte Löschpfade (`DoDeleteCustomer`,", "konsolidierung": "Kandidat: Der Code enthält mehrere auskommentierte Löschpfade (`DoDeleteCustomer`,",
"pruefidee": "Löschanfrage für einen Ansprechpartner ausführen, der auf einem Ticket und einer Rechnung", "pruefidee": "Löschanfrage für einen Ansprechpartner ausführen, der auf einem Ticket und einer Rechnung",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-46", "id": "SyRS-46",
@@ -1331,7 +1402,8 @@
"tracelinks": "StRS-22 → SyRS-46 → SwRS-24", "tracelinks": "StRS-22 → SyRS-46 → SwRS-24",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Angebot per C-Sign versenden, kundenseitig \"mit Änderungswunsch annehmen\": Der Belegzustand muss", "pruefidee": "Angebot per C-Sign versenden, kundenseitig \"mit Änderungswunsch annehmen\": Der Belegzustand muss",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-47", "id": "SyRS-47",
@@ -1349,7 +1421,8 @@
"tracelinks": "StRS-23 → SyRS-47 → SwRS-27", "tracelinks": "StRS-23 → SyRS-47 → SwRS-27",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lizenz für eine Anbindung entfernen: Die zugehörige Einstellungsseite darf nach Neustart nicht", "pruefidee": "Lizenz für eine Anbindung entfernen: Die zugehörige Einstellungsseite darf nach Neustart nicht",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-01", "id": "SwRS-01",
@@ -1368,7 +1441,8 @@
"tracelinks": "SyRS-11 → SwRS-01", "tracelinks": "SyRS-11 → SwRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Prüfung: Kein Typ aus `Centron.Data.Entities.*` darf in `Centron.WPF.UI` oder", "pruefidee": "Statische Prüfung: Kein Typ aus `Centron.Data.Entities.*` darf in `Centron.WPF.UI` oder",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-02", "id": "SwRS-02",
@@ -1387,7 +1461,8 @@
"tracelinks": "SyRS-09 → SwRS-02", "tracelinks": "SyRS-09 → SwRS-02",
"konsolidierung": "Kandidat: Für ein Web-/SaaS-Zielsystem entfällt der Zweck der Dualität; die BL-Variante ist dann", "konsolidierung": "Kandidat: Für ein Web-/SaaS-Zielsystem entfällt der Zweck der Dualität; die BL-Variante ist dann",
"pruefidee": "Zu jeder `I*Logic`-Schnittstelle in `Services/Logics` muss je genau eine `BL*Logic`- und eine", "pruefidee": "Zu jeder `I*Logic`-Schnittstelle in `Services/Logics` muss je genau eine `BL*Logic`- und eine",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-03", "id": "SwRS-03",
@@ -1406,7 +1481,8 @@
"tracelinks": "SyRS-20, SyRS-23 → SwRS-03", "tracelinks": "SyRS-20, SyRS-23 → SwRS-03",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Jede öffentliche Methode einer `*BL`-Klasse, die fehlschlagen kann, muss `Result` bzw. `Result<T>`", "pruefidee": "Jede öffentliche Methode einer `*BL`-Klasse, die fehlschlagen kann, muss `Result` bzw. `Result<T>`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-04", "id": "SwRS-04",
@@ -1424,7 +1500,8 @@
"tracelinks": "SyRS-20, SyRS-23 → SwRS-04", "tracelinks": "SyRS-20, SyRS-23 → SwRS-04",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine hypothetische neue Belegart hinzufügen: Es darf keine Änderung an `ReceiptBL` erforderlich", "pruefidee": "Eine hypothetische neue Belegart hinzufügen: Es darf keine Änderung an `ReceiptBL` erforderlich",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-05", "id": "SwRS-05",
@@ -1442,7 +1519,8 @@
"tracelinks": "SyRS-11, SyRS-37 → SwRS-05", "tracelinks": "SyRS-11, SyRS-37 → SwRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zu jeder Klasse unter `Centron.Entities/Entities` muss genau eine Mappingklasse unter", "pruefidee": "Zu jeder Klasse unter `Centron.Entities/Entities` muss genau eine Mappingklasse unter",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-06", "id": "SwRS-06",
@@ -1461,7 +1539,8 @@
"tracelinks": "SyRS-11 → SwRS-06", "tracelinks": "SyRS-11 → SwRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Schemaprüfung: Jede Tabelle in `dbo` besitzt genau einen gruppierten Primärschlüssel auf `I3D`;", "pruefidee": "Schemaprüfung: Jede Tabelle in `dbo` besitzt genau einen gruppierten Primärschlüssel auf `I3D`;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-07", "id": "SwRS-07",
@@ -1480,7 +1559,8 @@
"tracelinks": "SyRS-37 → SwRS-07", "tracelinks": "SyRS-37 → SwRS-07",
"konsolidierung": "Kandidat: `DBEntity.State` (nullable int) und `IsDeleted` (bit) kodieren beide Aktiv-/Inaktiv-", "konsolidierung": "Kandidat: `DBEntity.State` (nullable int) und `IsDeleted` (bit) kodieren beide Aktiv-/Inaktiv-",
"pruefidee": "Datensatz löschen und anschließend über die Datenbank prüfen: Die Zeile muss noch existieren und", "pruefidee": "Datensatz löschen und anschließend über die Datenbank prüfen: Die Zeile muss noch existieren und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-08", "id": "SwRS-08",
@@ -1499,7 +1579,8 @@
"tracelinks": "SyRS-23 → SwRS-08", "tracelinks": "SyRS-23 → SwRS-08",
"konsolidierung": "Kandidat: `Stammdat` (`AppSettingsConst`) und `ApplicationSettings` (`ApplicationSettingID`)", "konsolidierung": "Kandidat: `Stammdat` (`AppSettingsConst`) und `ApplicationSettings` (`ApplicationSettingID`)",
"pruefidee": "Zu jedem Wert von `ApplicationSettingID` muss `GetApplicationSettingDescription` einen von `null`", "pruefidee": "Zu jedem Wert von `ApplicationSettingID` muss `GetApplicationSettingDescription` einen von `null`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-09", "id": "SwRS-09",
@@ -1518,7 +1599,8 @@
"tracelinks": "SyRS-10, SyRS-20 → SwRS-09", "tracelinks": "SyRS-10, SyRS-20 → SwRS-09",
"konsolidierung": "Kandidat: SwRS-10 — zwei getrennte Rechtekataloge für Mitarbeiter und Web-Accounts.", "konsolidierung": "Kandidat: SwRS-10 — zwei getrennte Rechtekataloge für Mitarbeiter und Web-Accounts.",
"pruefidee": "Statische Prüfung: In `Centron.BL`, `Centron.WPF.UI` und `CentronNexus` darf kein Rechtevergleich", "pruefidee": "Statische Prüfung: In `Centron.BL`, `Centron.WPF.UI` und `CentronNexus` darf kein Rechtevergleich",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-10", "id": "SwRS-10",
@@ -1536,7 +1618,8 @@
"tracelinks": "SyRS-20, SyRS-34, SyRS-35 → SwRS-10", "tracelinks": "SyRS-20, SyRS-34, SyRS-35 → SwRS-10",
"konsolidierung": "Kandidat: SwRS-09 — im Zielsystem als ein Rechtemodell mit Nutzerklassen abzubilden.", "konsolidierung": "Kandidat: SwRS-09 — im Zielsystem als ein Rechtemodell mit Nutzerklassen abzubilden.",
"pruefidee": "Web-Account mit `WEBRIGHT_EDITALLREQUESTS` versucht eine Belegbearbeitung: Der Zugriff muss über", "pruefidee": "Web-Account mit `WEBRIGHT_EDITALLREQUESTS` versucht eine Belegbearbeitung: Der Zugriff muss über",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-11", "id": "SwRS-11",
@@ -1554,7 +1637,8 @@
"tracelinks": "SyRS-07, SyRS-08 → SwRS-11", "tracelinks": "SyRS-07, SyRS-08 → SwRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Anwendung in `ApplicationKind` ergänzen und ohne weitere Änderung anmelden: Die Anmeldung muss", "pruefidee": "Neue Anwendung in `ApplicationKind` ergänzen und ohne weitere Änderung anmelden: Die Anmeldung muss",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-12", "id": "SwRS-12",
@@ -1573,7 +1657,8 @@
"tracelinks": "SyRS-01, SyRS-02, SyRS-04 → SwRS-12", "tracelinks": "SyRS-01, SyRS-02, SyRS-04 → SwRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden `AuthObject`-Untertyp muss `AuthenticatorFactory.GetMainAuthenticator` einen", "pruefidee": "Für jeden `AuthObject`-Untertyp muss `AuthenticatorFactory.GetMainAuthenticator` einen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-13", "id": "SwRS-13",
@@ -1592,7 +1677,8 @@
"tracelinks": "SyRS-05, SyRS-44 → SwRS-13", "tracelinks": "SyRS-05, SyRS-44 → SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Tickets für dasselbe Gerät und denselben Benutzer nacheinander erzeugen (nach Löschen des", "pruefidee": "Zwei Tickets für dasselbe Gerät und denselben Benutzer nacheinander erzeugen (nach Löschen des",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-14", "id": "SwRS-14",
@@ -1610,7 +1696,8 @@
"tracelinks": "SyRS-13, SyRS-14 → SwRS-14", "tracelinks": "SyRS-13, SyRS-14 → SwRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden Wert von `NumberGroupEnum` müssen `GetTableName()` und `GetFieldName()` nichtleere Werte", "pruefidee": "Für jeden Wert von `NumberGroupEnum` müssen `GetTableName()` und `GetFieldName()` nichtleere Werte",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-15", "id": "SwRS-15",
@@ -1628,7 +1715,8 @@
"tracelinks": "SyRS-20, SyRS-21, SyRS-22, SyRS-23, SyRS-24 → SwRS-15", "tracelinks": "SyRS-20, SyRS-21, SyRS-22, SyRS-23, SyRS-24 → SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg mit zwei fehlenden Pflichtfeldern speichern: Das Ergebnis muss beide Felder benennen, nicht", "pruefidee": "Beleg mit zwei fehlenden Pflichtfeldern speichern: Das Ergebnis muss beide Felder benennen, nicht",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-16", "id": "SwRS-16",
@@ -1647,7 +1735,8 @@
"tracelinks": "SyRS-12, SyRS-17, SyRS-18, SyRS-19 → SwRS-16", "tracelinks": "SyRS-12, SyRS-17, SyRS-18, SyRS-19 → SwRS-16",
"konsolidierung": "Kandidat: Die Kodierung von Vorlagen über negative Nummern ist eine implizite Konvention; im", "konsolidierung": "Kandidat: Die Kodierung von Vorlagen über negative Nummern ist eine implizite Konvention; im",
"pruefidee": "Beleg mit `Number = -1` anlegen: `IsTemplate` muss `true` liefern und der Beleg darf nicht in", "pruefidee": "Beleg mit `Number = -1` anlegen: `IsTemplate` muss `true` liefern und der Beleg darf nicht in",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-17", "id": "SwRS-17",
@@ -1666,7 +1755,8 @@
"tracelinks": "SyRS-11, SyRS-15, SyRS-16 → SwRS-17", "tracelinks": "SyRS-11, SyRS-15, SyRS-16 → SwRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Belegprogression für jede unterstützte Objektart aufrufen: Es darf in keinem Fall ein", "pruefidee": "Belegprogression für jede unterstützte Objektart aufrufen: Es darf in keinem Fall ein",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-18", "id": "SwRS-18",
@@ -1685,7 +1775,8 @@
"tracelinks": "SyRS-34 → SwRS-18", "tracelinks": "SyRS-34 → SwRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden der sechs Übergänge prüfen, dass bei fehlendem Recht weder `AngKopf.CartState` geändert", "pruefidee": "Für jeden der sechs Übergänge prüfen, dass bei fehlendem Recht weder `AngKopf.CartState` geändert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-19", "id": "SwRS-19",
@@ -1704,7 +1795,8 @@
"tracelinks": "SyRS-27, SyRS-28, SyRS-29, SyRS-30 → SwRS-19", "tracelinks": "SyRS-27, SyRS-28, SyRS-29, SyRS-30 → SwRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket über das Kundenportal bei aktivierter Kundenfreigabe anlegen: Der Status muss `null`", "pruefidee": "Ticket über das Kundenportal bei aktivierter Kundenfreigabe anlegen: Der Status muss `null`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-20", "id": "SwRS-20",
@@ -1723,7 +1815,8 @@
"tracelinks": "SyRS-31 → SwRS-20", "tracelinks": "SyRS-31 → SwRS-20",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zeit einem Auftrag zuordnen: `IsAssignedToOrder` und `IsAssignedToAsset` müssen `true` liefern,", "pruefidee": "Zeit einem Auftrag zuordnen: `IsAssignedToOrder` und `IsAssignedToAsset` müssen `true` liefern,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-21", "id": "SwRS-21",
@@ -1742,7 +1835,8 @@
"tracelinks": "SyRS-32, SyRS-33 → SwRS-21", "tracelinks": "SyRS-32, SyRS-33 → SwRS-21",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede Kombination aus `BillingIntervalKinds` und `DifferContingentInterval` einen Testfall", "pruefidee": "Für jede Kombination aus `BillingIntervalKinds` und `DifferContingentInterval` einen Testfall",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-22", "id": "SwRS-22",
@@ -1762,7 +1856,8 @@
"tracelinks": "SyRS-25, SyRS-26 → SwRS-22", "tracelinks": "SyRS-25, SyRS-26 → SwRS-22",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Erzeugte XML-Datei mit dem KOSIT-Validierungswerkzeug gegen das XRechnung-Schema prüfen: Es dürfen", "pruefidee": "Erzeugte XML-Datei mit dem KOSIT-Validierungswerkzeug gegen das XRechnung-Schema prüfen: Es dürfen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-23", "id": "SwRS-23",
@@ -1781,7 +1876,8 @@
"tracelinks": "SyRS-39 → SwRS-23", "tracelinks": "SyRS-39 → SwRS-23",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Alle Skriptklassen laden und prüfen, dass jede Nummer genau einmal vorkommt und die", "pruefidee": "Alle Skriptklassen laden und prüfen, dass jede Nummer genau einmal vorkommt und die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-24", "id": "SwRS-24",
@@ -1800,7 +1896,8 @@
"tracelinks": "SyRS-35, SyRS-36 → SwRS-24", "tracelinks": "SyRS-35, SyRS-36 → SwRS-24",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neues Recht in `UserRightsConst` ergänzen und im Portal per `AuthorizeCombinedAttribute`", "pruefidee": "Neues Recht in `UserRightsConst` ergänzen und im Portal per `AuthorizeCombinedAttribute`",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-25", "id": "SwRS-25",
@@ -1819,7 +1916,8 @@
"tracelinks": "SyRS-05, SyRS-08 → SwRS-25", "tracelinks": "SyRS-05, SyRS-08 → SwRS-25",
"konsolidierung": "Kandidat: Die 1279 Altmethoden und die v1-Controller decken teils dieselbe Fachfunktion ab", "konsolidierung": "Kandidat: Die 1279 Altmethoden und die v1-Controller decken teils dieselbe Fachfunktion ab",
"pruefidee": "Jede Methode in `ICentronRestService` muss `[Authenticate]` tragen; Methoden ohne dieses Attribut", "pruefidee": "Jede Methode in `ICentronRestService` muss `[Authenticate]` tragen; Methoden ohne dieses Attribut",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-26", "id": "SwRS-26",
@@ -1838,7 +1936,8 @@
"tracelinks": "SyRS-40, SyRS-41 → SwRS-26", "tracelinks": "SyRS-40, SyRS-41 → SwRS-26",
"konsolidierung": "Kandidat: NLog (Backend/WPF) und `Microsoft.Extensions.Logging` (Controller) bestehen parallel.", "konsolidierung": "Kandidat: NLog (Backend/WPF) und `Microsoft.Extensions.Logging` (Controller) bestehen parallel.",
"pruefidee": "Stichprobe von 20 `*BL`-Klassen: Jede muss einen klassenbezogenen Logger deklarieren; keine", "pruefidee": "Stichprobe von 20 `*BL`-Klassen: Jede muss einen klassenbezogenen Logger deklarieren; keine",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-27", "id": "SwRS-27",
@@ -1856,7 +1955,8 @@
"tracelinks": "SyRS-26 → SwRS-27", "tracelinks": "SyRS-26 → SwRS-27",
"konsolidierung": "Kandidat: Konnektoren liegen teils unter `src/apis/`, teils in `Centron.BL/DataExchange`; im", "konsolidierung": "Kandidat: Konnektoren liegen teils unter `src/apis/`, teils in `Centron.BL/DataExchange`; im",
"pruefidee": "Abhängigkeitsprüfung: Kein Projekt unter `src/apis/` darf `Centron.BL` referenzieren (nur die", "pruefidee": "Abhängigkeitsprüfung: Kein Projekt unter `src/apis/` darf `Centron.BL` referenzieren (nur die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-28", "id": "SwRS-28",
@@ -1876,7 +1976,8 @@
"tracelinks": "SyRS-42, SyRS-43 → SwRS-28", "tracelinks": "SyRS-42, SyRS-43 → SwRS-28",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`dotnet build Centron.sln` mit dem in `global.json` fixierten SDK muss ohne Warnungen", "pruefidee": "`dotnet build Centron.sln` mit dem in `global.json` fixierten SDK muss ohne Warnungen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-29", "id": "SwRS-29",
@@ -1895,7 +1996,8 @@
"tracelinks": "SyRS-38 → SwRS-29", "tracelinks": "SyRS-38 → SwRS-29",
"konsolidierung": "Kandidat: getrennte Ressourcenbestände in Backend, WPF-Client und Nexus.", "konsolidierung": "Kandidat: getrennte Ressourcenbestände in Backend, WPF-Client und Nexus.",
"pruefidee": "Statische Prüfung: Deutschsprachige Zeichenkettenliterale in `Centron.BL` sind zu listen; sie", "pruefidee": "Statische Prüfung: Deutschsprachige Zeichenkettenliterale in `Centron.BL` sind zu listen; sie",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-30", "id": "SwRS-30",
@@ -1914,7 +2016,8 @@
"tracelinks": "SyRS-09 → SwRS-30", "tracelinks": "SyRS-09 → SwRS-30",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`GetRightsForModule` für jedes registrierte Modul aufrufen: Die zurückgegebene Rechteliste muss", "pruefidee": "`GetRightsForModule` für jedes registrierte Modul aufrufen: Die zurückgegebene Rechteliste muss",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-31", "id": "SwRS-31",
@@ -1932,7 +2035,8 @@
"tracelinks": "SyRS-09 → SwRS-31", "tracelinks": "SyRS-09 → SwRS-31",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden Moduleintrag `GetRights()` aufrufen und mit einer manuellen Auswertung des", "pruefidee": "Für jeden Moduleintrag `GetRights()` aufrufen und mit einer manuellen Auswertung des",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-32", "id": "SwRS-32",
@@ -1951,7 +2055,8 @@
"tracelinks": "SyRS-11 → SwRS-32", "tracelinks": "SyRS-11 → SwRS-32",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Mapperkonfiguration validieren (`AssertConfigurationIsValid`-Äquivalent): Alle Zielfelder müssen", "pruefidee": "Mapperkonfiguration validieren (`AssertConfigurationIsValid`-Äquivalent): Alle Zielfelder müssen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-33", "id": "SwRS-33",
@@ -1971,7 +2076,8 @@
"tracelinks": "SyRS-43 → SwRS-33", "tracelinks": "SyRS-43 → SwRS-33",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`dotnet test Centron.sln` gegen das Referenzdatenbankabbild ausführen: Alle Tests müssen ohne", "pruefidee": "`dotnet test Centron.sln` gegen das Referenzdatenbankabbild ausführen: Alle Tests müssen ohne",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-34", "id": "SwRS-34",
@@ -1988,7 +2094,8 @@
"tracelinks": "SyRS-28, SyRS-43 → SwRS-34", "tracelinks": "SyRS-28, SyRS-43 → SwRS-34",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "DEBUG-Build starten und eine Ticketabschlussmail an eine externe Adresse auslösen: Der tatsächliche", "pruefidee": "DEBUG-Build starten und eine Ticketabschlussmail an eine externe Adresse auslösen: Der tatsächliche",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-35", "id": "SwRS-35",
@@ -2007,7 +2114,8 @@
"tracelinks": "SyRS-38 → SwRS-35", "tracelinks": "SyRS-38 → SwRS-35",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Alle `.cs`- und `.xaml`-Dateien auf BOM prüfen; Abweichungen sind zu listen.", "pruefidee": "Alle `.cs`- und `.xaml`-Dateien auf BOM prüfen; Abweichungen sind zu listen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-36", "id": "SwRS-36",
@@ -2026,6 +2134,7 @@
"tracelinks": "SyRS-13, SyRS-15 → SwRS-36", "tracelinks": "SyRS-13, SyRS-15 → SwRS-36",
"konsolidierung": "Kandidat: Vier parallele Datenzugriffswege (LINQ, generische DAO, benannte Abfragen, Rohzugriff)", "konsolidierung": "Kandidat: Vier parallele Datenzugriffswege (LINQ, generische DAO, benannte Abfragen, Rohzugriff)",
"pruefidee": "Statische Prüfung: In `ExecuteQuery`/`ExecuteScalar…`-Aufrufen dürfen keine benutzergesteuerten", "pruefidee": "Statische Prüfung: In `ExecuteQuery`/`ExecuteScalar…`-Aufrufen dürfen keine benutzergesteuerten",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 4 | | Belege je Anforderung (Median) | 4 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 108 (99,1 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 108 (99,1 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (46 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (46 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 109 von 109 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 109 von 109 mit Tracelinks (100,0 %) |
@@ -101,6 +101,8 @@ zurückgenommen; zum weiteren Weg der Codebasis siehe Anmerkung 9.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -131,6 +133,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 96 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 96 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -148,6 +154,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (49 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (49 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 96 von 96 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 96 von 96 mit Tracelinks (100,0 %) |
## Anmerkungen/Auffälligkeiten ## Anmerkungen/Auffälligkeiten
@@ -15,7 +15,8 @@
"tracelinks": "SyRS-001, SyRS-002", "tracelinks": "SyRS-001, SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Angebot mit n Positionen wird zu einem Auftrag weitergeführt; Kunde und Positionsdaten müssen identisch übernommen werden (Stichprobe über UI oder Integrationstest).", "pruefidee": "Ein Angebot mit n Positionen wird zu einem Auftrag weitergeführt; Kunde und Positionsdaten müssen identisch übernommen werden (Stichprobe über UI oder Integrationstest).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-002", "id": "StRS-002",
@@ -33,7 +34,8 @@
"tracelinks": "SyRS-003, SyRS-004", "tracelinks": "SyRS-003, SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Signaturprozess mit gültigem Token durchlaufen; danach Prüfen, dass `WebReceiptState` gesetzt ist und ein erneuter Aufruf desselben Tokens als \"bereits signiert\" abgelehnt wird.", "pruefidee": "Signaturprozess mit gültigem Token durchlaufen; danach Prüfen, dass `WebReceiptState` gesetzt ist und ein erneuter Aufruf desselben Tokens als \"bereits signiert\" abgelehnt wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-003", "id": "StRS-003",
@@ -51,7 +53,8 @@
"tracelinks": "SyRS-005", "tracelinks": "SyRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung festschreiben, danach Änderungsversuch an Position/Kopf durchführen → muss abgelehnt werden; erneutes Festschreiben → muss abgelehnt werden (\"Die Rechnung ist festgeschrieben...\").", "pruefidee": "Rechnung festschreiben, danach Änderungsversuch an Position/Kopf durchführen → muss abgelehnt werden; erneutes Festschreiben → muss abgelehnt werden (\"Die Rechnung ist festgeschrieben...\").",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-004", "id": "StRS-004",
@@ -68,7 +71,8 @@
"tracelinks": "SyRS-006", "tracelinks": "SyRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für Netto=100, Steuersatz=19 → Steuerbetrag=19.00, Brutto=119.00 (kaufmännisch gerundet); Test mit Rabatt und Fremdwährungsfaktor.", "pruefidee": "Für Netto=100, Steuersatz=19 → Steuerbetrag=19.00, Brutto=119.00 (kaufmännisch gerundet); Test mit Rabatt und Fremdwährungsfaktor.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-005", "id": "StRS-005",
@@ -85,7 +89,8 @@
"tracelinks": "SyRS-001, SyRS-002", "tracelinks": "SyRS-001, SyRS-002",
"konsolidierung": "Kandidat: StRS-001 (Teil derselben Belegketten-Logik)", "konsolidierung": "Kandidat: StRS-001 (Teil derselben Belegketten-Logik)",
"pruefidee": "Beleg mit 2 Positionen anlegen, eine Position vollständig weiterverarbeiten (Beleg bleibt Active), zweite Position vollständig weiterverarbeiten (Beleg wechselt zu Completed).", "pruefidee": "Beleg mit 2 Positionen anlegen, eine Position vollständig weiterverarbeiten (Beleg bleibt Active), zweite Position vollständig weiterverarbeiten (Beleg wechselt zu Completed).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-006", "id": "StRS-006",
@@ -102,7 +107,8 @@
"tracelinks": "SyRS-007, SyRS-008", "tracelinks": "SyRS-007, SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket ohne Pflichtfeld anlegen → muss abgelehnt werden; Ticket mit allen Pflichtfeldern anlegen → muss erfolgreich sein und Historieneintrag erzeugen.", "pruefidee": "Ticket ohne Pflichtfeld anlegen → muss abgelehnt werden; Ticket mit allen Pflichtfeldern anlegen → muss erfolgreich sein und Historieneintrag erzeugen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-007", "id": "StRS-007",
@@ -119,7 +125,8 @@
"tracelinks": "SyRS-008", "tracelinks": "SyRS-008",
"konsolidierung": "Kandidat: StRS-018 (allgemeines Rechtesystem, hier domänenspezifische Ausprägung)", "konsolidierung": "Kandidat: StRS-018 (allgemeines Rechtesystem, hier domänenspezifische Ausprägung)",
"pruefidee": "Benutzer mit `SHOW_HELPDESK_ONLY_OWN_BRANCH` darf Ticket anderer Filiale nicht in der Liste sehen (Integrationstest mit zwei Filialen).", "pruefidee": "Benutzer mit `SHOW_HELPDESK_ONLY_OWN_BRANCH` darf Ticket anderer Filiale nicht in der Liste sehen (Integrationstest mit zwei Filialen).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-008", "id": "StRS-008",
@@ -135,7 +142,8 @@
"tracelinks": "SyRS-009", "tracelinks": "SyRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMA ohne HelpdeskI3D anlegen → muss mit DependencyCheckFailed-Fehler abgelehnt werden.", "pruefidee": "RMA ohne HelpdeskI3D anlegen → muss mit DependencyCheckFailed-Fehler abgelehnt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-009", "id": "StRS-009",
@@ -152,7 +160,8 @@
"tracelinks": "SyRS-007, SyRS-010", "tracelinks": "SyRS-007, SyRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei parallele Ausführungsversuche derselben fälligen Aufgabe → nur ein Ticket darf entstehen.", "pruefidee": "Zwei parallele Ausführungsversuche derselben fälligen Aufgabe → nur ein Ticket darf entstehen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-010", "id": "StRS-010",
@@ -168,7 +177,8 @@
"tracelinks": "SyRS-011", "tracelinks": "SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne `CHANGE_ARTICLE_PRICE` versucht Preisänderung zu speichern → Preis bleibt auf altem DB-Wert.", "pruefidee": "Benutzer ohne `CHANGE_ARTICLE_PRICE` versucht Preisänderung zu speichern → Preis bleibt auf altem DB-Wert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-011", "id": "StRS-011",
@@ -185,7 +195,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Inventurposition mit abweichender Zählmenge anlegen → `CloseState` muss \"Risk\" oder \"problem\" ergeben, nicht \"Ok\".", "pruefidee": "Inventurposition mit abweichender Zählmenge anlegen → `CloseState` muss \"Risk\" oder \"problem\" ergeben, nicht \"Ok\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-012", "id": "StRS-012",
@@ -202,7 +213,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne `CREATE_PARTIAL_COMMISSION_FOR_ORDER` versucht Teilkommission anzulegen → Ablehnung.", "pruefidee": "Benutzer ohne `CREATE_PARTIAL_COMMISSION_FOR_ORDER` versucht Teilkommission anzulegen → Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-013", "id": "StRS-013",
@@ -218,7 +230,8 @@
"tracelinks": "SyRS-014", "tracelinks": "SyRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel mit Mindestbestand 10, aktuellem Bestand 3, offenem Auftragsbedarf 5 → Vorschlagsmenge muss ≥ 12 ergeben (rechnerische Nachvollziehung, exakte Formel im Quellcode zu verifizieren).", "pruefidee": "Artikel mit Mindestbestand 10, aktuellem Bestand 3, offenem Auftragsbedarf 5 → Vorschlagsmenge muss ≥ 12 ergeben (rechnerische Nachvollziehung, exakte Formel im Quellcode zu verifizieren).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-014", "id": "StRS-014",
@@ -235,7 +248,8 @@
"tracelinks": "SyRS-015", "tracelinks": "SyRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "EDI-Konfiguration mit Distributor \"EGIS\" → erzeugtes Dokument muss dem EGIS-spezifischen Format entsprechen (Format-Validierung).", "pruefidee": "EDI-Konfiguration mit Distributor \"EGIS\" → erzeugtes Dokument muss dem EGIS-spezifischen Format entsprechen (Format-Validierung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-015", "id": "StRS-015",
@@ -251,7 +265,8 @@
"tracelinks": "SyRS-016, SyRS-017", "tracelinks": "SyRS-016, SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei identische Transaktionsimporte (gleiche IBAN/Datum/Betrag/Beschreibung) → zweiter Import muss als Duplikat markiert werden, nicht doppelt verbucht werden.", "pruefidee": "Zwei identische Transaktionsimporte (gleiche IBAN/Datum/Betrag/Beschreibung) → zweiter Import muss als Duplikat markiert werden, nicht doppelt verbucht werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-016", "id": "StRS-016",
@@ -267,7 +282,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "Kandidat: StRS-015 (beide betreffen Zahlungsbuchung auf Rechnungen)", "konsolidierung": "Kandidat: StRS-015 (beide betreffen Zahlungsbuchung auf Rechnungen)",
"pruefidee": "Benutzer ohne Recht versucht Zahlung zu löschen → Ablehnung mit definierter Fehlermeldung; Rechnungsbetrag bleibt unverändert.", "pruefidee": "Benutzer ohne Recht versucht Zahlung zu löschen → Ablehnung mit definierter Fehlermeldung; Rechnungsbetrag bleibt unverändert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-017", "id": "StRS-017",
@@ -284,7 +300,8 @@
"tracelinks": "SyRS-018", "tracelinks": "SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne `CAN_CHANGE_DATE`-Recht öffnet Timer-Billing-Einstellungen → Datumsfeld ist deaktiviert; direkter Web-Service-Aufruf mit geänderten Datum ohne Recht muss serverseitig abgelehnt werden (nicht nur UI-Test!).", "pruefidee": "Benutzer ohne `CAN_CHANGE_DATE`-Recht öffnet Timer-Billing-Einstellungen → Datumsfeld ist deaktiviert; direkter Web-Service-Aufruf mit geänderten Datum ohne Recht muss serverseitig abgelehnt werden (nicht nur UI-Test!).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-018", "id": "StRS-018",
@@ -301,7 +318,8 @@
"tracelinks": "SyRS-019, SyRS-020", "tracelinks": "SyRS-019, SyRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für eine Stichprobe von 10 unterschiedlichen Modulaktionen: Benutzer ohne jeweiliges Recht → serverseitige Ablehnung (nicht nur UI-Ausblendung).", "pruefidee": "Für eine Stichprobe von 10 unterschiedlichen Modulaktionen: Benutzer ohne jeweiliges Recht → serverseitige Ablehnung (nicht nur UI-Ausblendung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-019", "id": "StRS-019",
@@ -318,7 +336,8 @@
"tracelinks": "SyRS-021, SyRS-022", "tracelinks": "SyRS-021, SyRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anmeldung über jedes der vier Verfahren mit gültigen Testdaten → gültiges Ticket wird ausgestellt; ungültige Zugangsdaten → Ablehnung.", "pruefidee": "Anmeldung über jedes der vier Verfahren mit gültigen Testdaten → gültiges Ticket wird ausgestellt; ungültige Zugangsdaten → Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-020", "id": "StRS-020",
@@ -334,7 +353,8 @@
"tracelinks": "SyRS-021", "tracelinks": "SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anmeldung mit korrektem ersten Faktor, aber ohne/mit falschem zweiten Faktor → Anmeldung muss abgelehnt werden.", "pruefidee": "Anmeldung mit korrektem ersten Faktor, aber ohne/mit falschem zweiten Faktor → Anmeldung muss abgelehnt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-021", "id": "StRS-021",
@@ -350,7 +370,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gespeichertes Passwort einsehen → Protokolleintrag mit ActionType \"Zugriff\" muss entstehen.", "pruefidee": "Gespeichertes Passwort einsehen → Protokolleintrag mit ActionType \"Zugriff\" muss entstehen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-022", "id": "StRS-022",
@@ -367,7 +388,8 @@
"tracelinks": "SyRS-024, SyRS-021", "tracelinks": "SyRS-024, SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde A meldet sich an und darf keine Tickets von Kunde B sehen (Mandanten-/Kundentrennungstest).", "pruefidee": "Kunde A meldet sich an und darf keine Tickets von Kunde B sehen (Mandanten-/Kundentrennungstest).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-023", "id": "StRS-023",
@@ -384,7 +406,8 @@
"tracelinks": "SyRS-024, SyRS-025", "tracelinks": "SyRS-024, SyRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Account ohne WebCart2-Lizenz ruft `/webcart/shop` auf → Zugriff muss verweigert werden.", "pruefidee": "Web-Account ohne WebCart2-Lizenz ruft `/webcart/shop` auf → Zugriff muss verweigert werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-024", "id": "StRS-024",
@@ -401,7 +424,8 @@
"tracelinks": "SyRS-026, SyRS-027", "tracelinks": "SyRS-026, SyRS-027",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "CI-Pipeline-Lauf erzeugt alle drei signierten Artefakte (MSI ×2, Container-Image) ohne manuellen Eingriff.", "pruefidee": "CI-Pipeline-Lauf erzeugt alle drei signierten Artefakte (MSI ×2, Container-Image) ohne manuellen Eingriff.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-025", "id": "StRS-025",
@@ -418,7 +442,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "Kandidat: strukturell ähnliches Client-Pattern wie StRS-026 (Versanddienstleister)", "konsolidierung": "Kandidat: strukturell ähnliches Client-Pattern wie StRS-026 (Versanddienstleister)",
"pruefidee": "Ein Dienst liefert HTTP 401 → nur dieser Dienst wird als fehlgeschlagen markiert, übrige Anreicherungsquellen bleiben nutzbar.", "pruefidee": "Ein Dienst liefert HTTP 401 → nur dieser Dienst wird als fehlgeschlagen markiert, übrige Anreicherungsquellen bleiben nutzbar.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-026", "id": "StRS-026",
@@ -435,7 +460,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "Kandidat: GLS und Shipcloud bilden dieselbe fachliche Funktion \"Versandauftrag erstellen\" redundant ab.", "konsolidierung": "Kandidat: GLS und Shipcloud bilden dieselbe fachliche Funktion \"Versandauftrag erstellen\" redundant ab.",
"pruefidee": "Versandauftrag mit gültigen Empfängerdaten auslösen → Tracking-ID und Label müssen im System hinterlegt sein.", "pruefidee": "Versandauftrag mit gültigen Empfängerdaten auslösen → Tracking-ID und Label müssen im System hinterlegt sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-027", "id": "StRS-027",
@@ -452,7 +478,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "ebInterface-Export einer Testrechnung gegen offizielles XSD-Schema validieren.", "pruefidee": "ebInterface-Export einer Testrechnung gegen offizielles XSD-Schema validieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-028", "id": "StRS-028",
@@ -469,7 +496,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Abruf von `GetDeviceCounters` für ein Testgerät liefert plausible Zählerwerte zurück.", "pruefidee": "Abruf von `GetDeviceCounters` für ein Testgerät liefert plausible Zählerwerte zurück.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-001", "id": "SyRS-001",
@@ -486,7 +514,8 @@
"tracelinks": "StRS-001; SwRS-001, SwRS-002", "tracelinks": "StRS-001; SwRS-001, SwRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Code-Review: Suche nach belegartspezifischer if/else- oder switch-Verzweigung innerhalb `ReceiptBL` außerhalb der `IReceiptSpecificLogic`-Aufrufe (sollte nicht signifikant vorkommen).", "pruefidee": "Code-Review: Suche nach belegartspezifischer if/else- oder switch-Verzweigung innerhalb `ReceiptBL` außerhalb der `IReceiptSpecificLogic`-Aufrufe (sollte nicht signifikant vorkommen).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-002", "id": "SyRS-002",
@@ -503,7 +532,8 @@
"tracelinks": "StRS-001, StRS-005; SwRS-003", "tracelinks": "StRS-001, StRS-005; SwRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Datenbankabfrage über alle Belegtabellen mit `ReceiptState`-Spalte liefert konsistente Wertemenge {1,2,3}.", "pruefidee": "Datenbankabfrage über alle Belegtabellen mit `ReceiptState`-Spalte liefert konsistente Wertemenge {1,2,3}.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-003", "id": "SyRS-003",
@@ -519,7 +549,8 @@
"tracelinks": "StRS-002; SwRS-004", "tracelinks": "StRS-002; SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zweiten Signiervorgang für denselben Beleg anstoßen, während erster aktiv ist → Ablehnung mit definierter Fehlermeldung.", "pruefidee": "Zweiten Signiervorgang für denselben Beleg anstoßen, während erster aktiv ist → Ablehnung mit definierter Fehlermeldung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-004", "id": "SyRS-004",
@@ -535,7 +566,8 @@
"tracelinks": "StRS-002; SwRS-005, SwRS-006", "tracelinks": "StRS-002; SwRS-005, SwRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Abgelaufenen Token direkt per HTTP-Request aufrufen (ohne UI) → Server muss ablehnen.", "pruefidee": "Abgelaufenen Token direkt per HTTP-Request aufrufen (ohne UI) → Server muss ablehnen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-005", "id": "SyRS-005",
@@ -551,7 +583,8 @@
"tracelinks": "StRS-003; SwRS-007, SwRS-008", "tracelinks": "StRS-003; SwRS-007, SwRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter INSERT ohne Angabe von `IsFixed` gegen Testdatenbank → DB muss Default 0 setzen, NULL darf nicht möglich sein.", "pruefidee": "Direkter INSERT ohne Angabe von `IsFixed` gegen Testdatenbank → DB muss Default 0 setzen, NULL darf nicht möglich sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-006", "id": "SyRS-006",
@@ -567,7 +600,8 @@
"tracelinks": "StRS-004; SwRS-009, SwRS-010", "tracelinks": "StRS-004; SwRS-009, SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gleiche Testwerte über WPF-Client und Nexus-Web-Client eingeben → identisches Ergebnis.", "pruefidee": "Gleiche Testwerte über WPF-Client und Nexus-Web-Client eingeben → identisches Ergebnis.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-007", "id": "SyRS-007",
@@ -583,7 +617,8 @@
"tracelinks": "StRS-006, StRS-009; SwRS-011, SwRS-012", "tracelinks": "StRS-006, StRS-009; SwRS-011, SwRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter API-Aufruf zum Schließen eines Tickets ohne `CLOSE_REQUEST`-Recht → serverseitige Ablehnung.", "pruefidee": "Direkter API-Aufruf zum Schließen eines Tickets ohne `CLOSE_REQUEST`-Recht → serverseitige Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-008", "id": "SyRS-008",
@@ -599,7 +634,8 @@
"tracelinks": "StRS-006, StRS-007; SwRS-013", "tracelinks": "StRS-006, StRS-007; SwRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Netzwerk-Mitschnitt einer Listenabfrage eines eingeschränkten Benutzers → Antwortdaten dürfen keine unzulässigen Datensätze enthalten (nicht nur UI-Ausblendung).", "pruefidee": "Netzwerk-Mitschnitt einer Listenabfrage eines eingeschränkten Benutzers → Antwortdaten dürfen keine unzulässigen Datensätze enthalten (nicht nur UI-Ausblendung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-009", "id": "SyRS-009",
@@ -615,7 +651,8 @@
"tracelinks": "StRS-008; SwRS-014, SwRS-015", "tracelinks": "StRS-008; SwRS-014, SwRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Speicherversuch eines RMA mit `HelpdeskI3D = 0` → `ResultException` mit Code `DependencyCheckFailed`.", "pruefidee": "Speicherversuch eines RMA mit `HelpdeskI3D = 0` → `ResultException` mit Code `DependencyCheckFailed`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-010", "id": "SyRS-010",
@@ -631,7 +668,8 @@
"tracelinks": "StRS-009; SwRS-016, SwRS-017", "tracelinks": "StRS-009; SwRS-016, SwRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Simultane Ausführung derselben Aufgabe aus zwei Prozessen → nur eine Ausführung erfolgreich, zweite erhält Lock-Timeout.", "pruefidee": "Simultane Ausführung derselben Aufgabe aus zwei Prozessen → nur eine Ausführung erfolgreich, zweite erhält Lock-Timeout.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-011", "id": "SyRS-011",
@@ -647,7 +685,8 @@
"tracelinks": "StRS-010; SwRS-018", "tracelinks": "StRS-010; SwRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit Recht \"Artikel bearbeiten\", aber ohne `CHANGE_ARTICLE_PRICE`, ändert Preis und Beschreibung gleichzeitig → Beschreibung wird gespeichert, Preis bleibt unverändert.", "pruefidee": "Benutzer mit Recht \"Artikel bearbeiten\", aber ohne `CHANGE_ARTICLE_PRICE`, ändert Preis und Beschreibung gleichzeitig → Beschreibung wird gespeichert, Preis bleibt unverändert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-012", "id": "SyRS-012",
@@ -664,7 +703,8 @@
"tracelinks": "StRS-011; SwRS-019, SwRS-020", "tracelinks": "StRS-011; SwRS-019, SwRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Position mit Zählmenge ≠ Sollmenge und ohne Barcode-Konflikt → `CloseState = Risk`, keine Freigabe als \"Ok\".", "pruefidee": "Position mit Zählmenge ≠ Sollmenge und ohne Barcode-Konflikt → `CloseState = Risk`, keine Freigabe als \"Ok\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-013", "id": "SyRS-013",
@@ -680,7 +720,8 @@
"tracelinks": "StRS-012; SwRS-021", "tracelinks": "StRS-012; SwRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit nur Anlage-Recht versucht Löschung → Ablehnung.", "pruefidee": "Benutzer mit nur Anlage-Recht versucht Löschung → Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-014", "id": "SyRS-014",
@@ -696,7 +737,8 @@
"tracelinks": "StRS-013; SwRS-022", "tracelinks": "StRS-013; SwRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lasttest: Bestellvorschlagsberechnung während gleichzeitiger Bestandsbuchung → Ergebnis muss nachvollziehbar einem Zeitpunkt zuordenbar sein (Konsistenzprüfung, ggf. [HYPOTHESE] bzgl. Transaktionsisolationsstufe, siehe Hypothesen.md).", "pruefidee": "Lasttest: Bestellvorschlagsberechnung während gleichzeitiger Bestandsbuchung → Ergebnis muss nachvollziehbar einem Zeitpunkt zuordenbar sein (Konsistenzprüfung, ggf. [HYPOTHESE] bzgl. Transaktionsisolationsstufe, siehe Hypothesen.md).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-015", "id": "SyRS-015",
@@ -712,7 +754,8 @@
"tracelinks": "StRS-014; SwRS-023", "tracelinks": "StRS-014; SwRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Konfiguration auf \"ITScope\" umstellen → erzeugtes Dokument muss ITScope-spezifisches Format aufweisen, ohne Codeänderung.", "pruefidee": "Konfiguration auf \"ITScope\" umstellen → erzeugtes Dokument muss ITScope-spezifisches Format aufweisen, ohne Codeänderung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-016", "id": "SyRS-016",
@@ -729,7 +772,8 @@
"tracelinks": "StRS-015, StRS-016; SwRS-024, SwRS-025, SwRS-026", "tracelinks": "StRS-015, StRS-016; SwRS-024, SwRS-025, SwRS-026",
"konsolidierung": "Kandidat: SyRS-017 (beide betreffen Zahlungsverbuchung)", "konsolidierung": "Kandidat: SyRS-017 (beide betreffen Zahlungsverbuchung)",
"pruefidee": "Duplikat-Importtest sowie Lösch-Test ohne Recht (siehe StRS-015/016 für Details).", "pruefidee": "Duplikat-Importtest sowie Lösch-Test ohne Recht (siehe StRS-015/016 für Details).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-017", "id": "SyRS-017",
@@ -745,7 +789,8 @@
"tracelinks": "StRS-015; SwRS-025", "tracelinks": "StRS-015; SwRS-025",
"konsolidierung": "Kandidat: SyRS-016", "konsolidierung": "Kandidat: SyRS-016",
"pruefidee": "Zahlung mit Differenz 0,05 zur Forderung → Rechnung wird als bezahlt markiert; Differenz 0,20 → nicht.", "pruefidee": "Zahlung mit Differenz 0,05 zur Forderung → Rechnung wird als bezahlt markiert; Differenz 0,20 → nicht.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-018", "id": "SyRS-018",
@@ -761,7 +806,8 @@
"tracelinks": "StRS-017; SwRS-027", "tracelinks": "StRS-017; SwRS-027",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter Web-Service-Aufruf zur Datumsänderung ohne Recht (unter Umgehung der UI) → muss serverseitig abgelehnt werden. [HYPOTHESE]: Ob der eigentliche Schreibpfad (nicht nur die Anzeige-Flags) diese Prüfung ebenfalls erzwingt, wurde im Rahmen dieser Iteration nicht bis zur konkreten Save-Methode zurückverfolgt — siehe Hypothesen.md.", "pruefidee": "Direkter Web-Service-Aufruf zur Datumsänderung ohne Recht (unter Umgehung der UI) → muss serverseitig abgelehnt werden. [HYPOTHESE]: Ob der eigentliche Schreibpfad (nicht nur die Anzeige-Flags) diese Prüfung ebenfalls erzwingt, wurde im Rahmen dieser Iteration nicht bis zur konkreten Save-Methode zurückverfolgt — siehe Hypothesen.md.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-019", "id": "SyRS-019",
@@ -778,7 +824,8 @@
"tracelinks": "StRS-018; SwRS-028", "tracelinks": "StRS-018; SwRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechteprüfung während simuliertem DB-Verbindungsfehler auslösen → Ergebnis muss `false` (verweigert) sein, nicht Exception nach oben durchreichen oder `true` liefern.", "pruefidee": "Rechteprüfung während simuliertem DB-Verbindungsfehler auslösen → Ergebnis muss `false` (verweigert) sein, nicht Exception nach oben durchreichen oder `true` liefern.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-020", "id": "SyRS-020",
@@ -794,7 +841,8 @@
"tracelinks": "StRS-018; SwRS-029", "tracelinks": "StRS-018; SwRS-029",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Code-Review-Test: zwei parallele Branches fügen ein neues Recht mit dem \"nächsten\" ID-Wert hinzu → Merge-Konflikt wird nicht automatisch, sondern nur durch Textgleichheit des Kommentars erkannt (Risiko einer stillen ID-Kollision, falls nicht rechtzeitig bemerkt).", "pruefidee": "Code-Review-Test: zwei parallele Branches fügen ein neues Recht mit dem \"nächsten\" ID-Wert hinzu → Merge-Konflikt wird nicht automatisch, sondern nur durch Textgleichheit des Kommentars erkannt (Risiko einer stillen ID-Kollision, falls nicht rechtzeitig bemerkt).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-021", "id": "SyRS-021",
@@ -810,7 +858,8 @@
"tracelinks": "StRS-019, StRS-020, StRS-022; SwRS-030, SwRS-031, SwRS-032, SwRS-033", "tracelinks": "StRS-019, StRS-020, StRS-022; SwRS-030, SwRS-031, SwRS-032, SwRS-033",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anmeldung über Basic-Auth und über OIDC vergleichen → resultierendes Ticket hat identische Struktur/Felder.", "pruefidee": "Anmeldung über Basic-Auth und über OIDC vergleichen → resultierendes Ticket hat identische Struktur/Felder.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-022", "id": "SyRS-022",
@@ -826,7 +875,8 @@
"tracelinks": "StRS-019; SwRS-032", "tracelinks": "StRS-019; SwRS-032",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket erzeugen, künstlich Systemzeit über Ablaufgrenze vorstellen (Testsystem) → Ticket wird abgelehnt.", "pruefidee": "Ticket erzeugen, künstlich Systemzeit über Ablaufgrenze vorstellen (Testsystem) → Ticket wird abgelehnt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-023", "id": "SyRS-023",
@@ -842,7 +892,8 @@
"tracelinks": "StRS-021; SwRS-034", "tracelinks": "StRS-021; SwRS-034",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zugriff auf gespeichertes Passwort → Protokolleintrag muss unmittelbar entstehen, unabhängig vom Ergebnis des Zugriffs.", "pruefidee": "Zugriff auf gespeichertes Passwort → Protokolleintrag muss unmittelbar entstehen, unabhängig vom Ergebnis des Zugriffs.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-024", "id": "SyRS-024",
@@ -859,7 +910,8 @@
"tracelinks": "StRS-022, StRS-023; SwRS-035", "tracelinks": "StRS-022, StRS-023; SwRS-035",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Als Web-Account-Kunde angemeldet, direkten API-Aufruf auf einen internen/administrativen Endpunkt oder auf Daten eines anderen Kunden versuchen → muss abgelehnt werden. [HYPOTHESE]: Die konkrete serverseitige Scoping-Prüfung pro Kundenportal-Endpunkt wurde nicht für jeden einzelnen Controller einzeln verifiziert — siehe Hypothesen.md.", "pruefidee": "Als Web-Account-Kunde angemeldet, direkten API-Aufruf auf einen internen/administrativen Endpunkt oder auf Daten eines anderen Kunden versuchen → muss abgelehnt werden. [HYPOTHESE]: Die konkrete serverseitige Scoping-Prüfung pro Kundenportal-Endpunkt wurde nicht für jeden einzelnen Controller einzeln verifiziert — siehe Hypothesen.md.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-025", "id": "SyRS-025",
@@ -875,7 +927,8 @@
"tracelinks": "StRS-023; SwRS-036", "tracelinks": "StRS-023; SwRS-036",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Account ohne Lizenz ruft `/webcart/shop` direkt per URL auf → Zugriff wird verweigert. [HYPOTHESE]: Das genaue Verhalten des `AuthorizeLicense`-Attributs (Redirect vs. Fehlerseite vs. Exception) wurde nicht im Detail nachvollzogen — siehe Hypothesen.md.", "pruefidee": "Web-Account ohne Lizenz ruft `/webcart/shop` direkt per URL auf → Zugriff wird verweigert. [HYPOTHESE]: Das genaue Verhalten des `AuthorizeLicense`-Attributs (Redirect vs. Fehlerseite vs. Exception) wurde nicht im Detail nachvollzogen — siehe Hypothesen.md.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-026", "id": "SyRS-026",
@@ -891,7 +944,8 @@
"tracelinks": "StRS-024; SwRS-038", "tracelinks": "StRS-024; SwRS-038",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "CI-Lauf beobachten: alle drei Artefakte müssen mit gültiger Authenticode-Signatur vorliegen, Pipeline darf bei Signaturfehler nicht grün werden.", "pruefidee": "CI-Lauf beobachten: alle drei Artefakte müssen mit gültiger Authenticode-Signatur vorliegen, Pipeline darf bei Signaturfehler nicht grün werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-027", "id": "SyRS-027",
@@ -908,7 +962,8 @@
"tracelinks": "StRS-024; SwRS-038", "tracelinks": "StRS-024; SwRS-038",
"konsolidierung": "Kandidat: SyRS-026 (beide betreffen Auslieferung/Deployment)", "konsolidierung": "Kandidat: SyRS-026 (beide betreffen Auslieferung/Deployment)",
"pruefidee": "Dasselbe Image mit zwei unterschiedlichen `appsettings`-Overrides starten → unterschiedliches Zielsystem wird angesprochen, ohne Image-Neubau.", "pruefidee": "Dasselbe Image mit zwei unterschiedlichen `appsettings`-Overrides starten → unterschiedliches Zielsystem wird angesprochen, ohne Image-Neubau.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-028", "id": "SyRS-028",
@@ -925,7 +980,8 @@
"tracelinks": "StRS-025, StRS-026, StRS-027, StRS-028; SwRS-039, SwRS-040", "tracelinks": "StRS-025, StRS-026, StRS-027, StRS-028; SwRS-039, SwRS-040",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Simulierter Ausfall eines externen Dienstes (z. B. Timeout) → übrige Integrationen und Kernfunktionen bleiben funktionsfähig; Antwortzeitverhalten bei Ausfall ist [HYPOTHESE] (kein Timeout-Override gefunden, Default-`HttpClient`-Timeout vermutlich wirksam — siehe Hypothesen.md).", "pruefidee": "Simulierter Ausfall eines externen Dienstes (z. B. Timeout) → übrige Integrationen und Kernfunktionen bleiben funktionsfähig; Antwortzeitverhalten bei Ausfall ist [HYPOTHESE] (kein Timeout-Override gefunden, Default-`HttpClient`-Timeout vermutlich wirksam — siehe Hypothesen.md).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-001", "id": "SwRS-001",
@@ -942,7 +998,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Codeanalyse: keine belegartspezifische Fallunterscheidung außerhalb der `*SpecificLogic`-Klassen in `ReceiptBL`.", "pruefidee": "Statische Codeanalyse: keine belegartspezifische Fallunterscheidung außerhalb der `*SpecificLogic`-Klassen in `ReceiptBL`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-002", "id": "SwRS-002",
@@ -959,7 +1016,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Reflection-Test: alle Belegart-Entitäten erben von derselben Basisklasse.", "pruefidee": "Reflection-Test: alle Belegart-Entitäten erben von derselben Basisklasse.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-003", "id": "SwRS-003",
@@ -975,7 +1033,8 @@
"tracelinks": "SyRS-002", "tracelinks": "SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Letzte offene Position eines Belegs vollständig verarbeiten → `ReceiptState` wechselt automatisch zu `Completed`.", "pruefidee": "Letzte offene Position eines Belegs vollständig verarbeiten → `ReceiptState` wechselt automatisch zu `Completed`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-004", "id": "SwRS-004",
@@ -991,7 +1050,8 @@
"tracelinks": "SyRS-003", "tracelinks": "SyRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zweiten `GenerateTokenForDocument`-Aufruf für denselben `receiptI3D` bei aktivem Vorgang → `Result.AsError`.", "pruefidee": "Zweiten `GenerateTokenForDocument`-Aufruf für denselben `receiptI3D` bei aktivem Vorgang → `Result.AsError`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-005", "id": "SwRS-005",
@@ -1007,7 +1067,8 @@
"tracelinks": "SyRS-004", "tracelinks": "SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Abgelaufenen Token per direktem Methodenaufruf/HTTP-Request verwenden → definierter Fehlercode, keine Nutzdaten.", "pruefidee": "Abgelaufenen Token per direktem Methodenaufruf/HTTP-Request verwenden → definierter Fehlercode, keine Nutzdaten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-006", "id": "SwRS-006",
@@ -1024,7 +1085,8 @@
"tracelinks": "SyRS-004", "tracelinks": "SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Annahme mit Signatur → `WebOfferSign`; Annahme ohne Signatur → `WebOfferSignedWithoutSignature`.", "pruefidee": "Annahme mit Signatur → `WebOfferSign`; Annahme ohne Signatur → `WebOfferSignedWithoutSignature`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-007", "id": "SwRS-007",
@@ -1040,7 +1102,8 @@
"tracelinks": "SyRS-005", "tracelinks": "SyRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bereits fixierte Rechnung erneut festschreiben → Ablehnung mit definierter Meldung.", "pruefidee": "Bereits fixierte Rechnung erneut festschreiben → Ablehnung mit definierter Meldung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-008", "id": "SwRS-008",
@@ -1057,7 +1120,8 @@
"tracelinks": "SyRS-005", "tracelinks": "SyRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "INSERT ohne explizite Angabe von `IsFixed` → DB setzt automatisch 0, NULL wird von der DB abgelehnt.", "pruefidee": "INSERT ohne explizite Angabe von `IsFixed` → DB setzt automatisch 0, NULL wird von der DB abgelehnt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-009", "id": "SwRS-009",
@@ -1073,7 +1137,8 @@
"tracelinks": "SyRS-006", "tracelinks": "SyRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Netto=100,005, Steuersatz=19 → erwarteter, kaufmännisch gerundeter Wert (Unit-Test mit Grenzwerten wie x,xx5).", "pruefidee": "Netto=100,005, Steuersatz=19 → erwarteter, kaufmännisch gerundeter Wert (Unit-Test mit Grenzwerten wie x,xx5).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-010", "id": "SwRS-010",
@@ -1089,7 +1154,8 @@
"tracelinks": "SyRS-006", "tracelinks": "SyRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Auftrag mit Steuersatz X zu Rechnung mit späterem Datum (nach Steuersatzänderung) weiterführen → Ergebnis muss mit `TakeoverVatMode.Yes`-Regel übereinstimmen (Übernahme statt Neuberechnung).", "pruefidee": "Auftrag mit Steuersatz X zu Rechnung mit späterem Datum (nach Steuersatzänderung) weiterführen → Ergebnis muss mit `TakeoverVatMode.Yes`-Regel übereinstimmen (Übernahme statt Neuberechnung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-011", "id": "SwRS-011",
@@ -1105,7 +1171,8 @@
"tracelinks": "SyRS-007", "tracelinks": "SyRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket ohne Pflichtfeld \"Kunde\" speichern → Ablehnung vor Persistierung.", "pruefidee": "Ticket ohne Pflichtfeld \"Kunde\" speichern → Ablehnung vor Persistierung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-012", "id": "SwRS-012",
@@ -1121,7 +1188,8 @@
"tracelinks": "SyRS-007", "tracelinks": "SyRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit `EDIT_HELPDESK` ohne `CLOSE_REQUEST` versucht `ClosedAt` zu setzen → Feld wird serverseitig zurückgesetzt.", "pruefidee": "Benutzer mit `EDIT_HELPDESK` ohne `CLOSE_REQUEST` versucht `ClosedAt` zu setzen → Feld wird serverseitig zurückgesetzt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-013", "id": "SwRS-013",
@@ -1138,7 +1206,8 @@
"tracelinks": "SyRS-008", "tracelinks": "SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "SQL-Profiling der Abfrage eines eingeschränkten Benutzers → WHERE-Klausel enthält bereits die Scope-Bedingung.", "pruefidee": "SQL-Profiling der Abfrage eines eingeschränkten Benutzers → WHERE-Klausel enthält bereits die Scope-Bedingung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-014", "id": "SwRS-014",
@@ -1154,7 +1223,8 @@
"tracelinks": "SyRS-009", "tracelinks": "SyRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMA mit `HelpdeskI3D = 0` speichern → `ResultException` vor jeder Nebenwirkung, keine Teilverarbeitung.", "pruefidee": "RMA mit `HelpdeskI3D = 0` speichern → `ResultException` vor jeder Nebenwirkung, keine Teilverarbeitung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-015", "id": "SwRS-015",
@@ -1170,7 +1240,8 @@
"tracelinks": "SyRS-009", "tracelinks": "SyRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel von `SendForth` zu `Invoice` überführen → Historieneintrag mit korrektem Alt-/Neu-Zustand entsteht.", "pruefidee": "Artikel von `SendForth` zu `Invoice` überführen → Historieneintrag mit korrektem Alt-/Neu-Zustand entsteht.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-016", "id": "SwRS-016",
@@ -1186,7 +1257,8 @@
"tracelinks": "SyRS-010", "tracelinks": "SyRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei parallele Prozessaufrufe für dieselbe Aufgaben-ID → nur ein Prozess erhält das Lock (LockTimeout=0 lässt zweiten sofort fehlschlagen).", "pruefidee": "Zwei parallele Prozessaufrufe für dieselbe Aufgaben-ID → nur ein Prozess erhält das Lock (LockTimeout=0 lässt zweiten sofort fehlschlagen).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-017", "id": "SwRS-017",
@@ -1202,7 +1274,8 @@
"tracelinks": "SyRS-010", "tracelinks": "SyRS-010",
"konsolidierung": "Kandidat: SwRS-012 (gleiche zugrundeliegende Rechteklasse ADD_NEW_HELPDESK)", "konsolidierung": "Kandidat: SwRS-012 (gleiche zugrundeliegende Rechteklasse ADD_NEW_HELPDESK)",
"pruefidee": "Aufgabe mit Ausführungskontext ohne `ADD_NEW_HELPDESK`-Recht fällig werden lassen → Ticketerstellung schlägt fehl statt das Recht zu ignorieren.", "pruefidee": "Aufgabe mit Ausführungskontext ohne `ADD_NEW_HELPDESK`-Recht fällig werden lassen → Ticketerstellung schlägt fehl statt das Recht zu ignorieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-018", "id": "SwRS-018",
@@ -1218,7 +1291,8 @@
"tracelinks": "SyRS-011", "tracelinks": "SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Speichervorgang mit geänderter Warengruppe (ohne Recht) und geändertem Namen (mit Recht) → Name wird gespeichert, Warengruppe bleibt auf DB-Wert.", "pruefidee": "Speichervorgang mit geänderter Warengruppe (ohne Recht) und geändertem Namen (mit Recht) → Name wird gespeichert, Warengruppe bleibt auf DB-Wert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-019", "id": "SwRS-019",
@@ -1234,7 +1308,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zählmenge = Sollmenge, kein Barcode-Konflikt → `CloseState = Ok`; Zählmenge ≠ Sollmenge → `Risk`/`problem`.", "pruefidee": "Zählmenge = Sollmenge, kein Barcode-Konflikt → `CloseState = Ok`; Zählmenge ≠ Sollmenge → `Risk`/`problem`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-020", "id": "SwRS-020",
@@ -1250,7 +1325,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Recht versucht gelöschte Inventur wiederherzustellen → Ablehnung.", "pruefidee": "Benutzer ohne Recht versucht gelöschte Inventur wiederherzustellen → Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-021", "id": "SwRS-021",
@@ -1266,7 +1342,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit nur Anlage-Recht versucht Löschung → Ablehnung; umgekehrter Test analog.", "pruefidee": "Benutzer mit nur Anlage-Recht versucht Löschung → Ablehnung; umgekehrter Test analog.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-022", "id": "SwRS-022",
@@ -1282,7 +1359,8 @@
"tracelinks": "SyRS-014", "tracelinks": "SyRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vergleich der berechneten Vorschlagsmenge gegen manuell nachgerechneten Erwartungswert für einen Testartikel.", "pruefidee": "Vergleich der berechneten Vorschlagsmenge gegen manuell nachgerechneten Erwartungswert für einen Testartikel.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-023", "id": "SwRS-023",
@@ -1298,7 +1376,8 @@
"tracelinks": "SyRS-015", "tracelinks": "SyRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Konfigurationswechsel auf anderen Distributor → anderer Dokumentersteller wird aufgerufen (Unit-Test mit Mock).", "pruefidee": "Konfigurationswechsel auf anderen Distributor → anderer Dokumentersteller wird aufgerufen (Unit-Test mit Mock).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-024", "id": "SwRS-024",
@@ -1314,7 +1393,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Identischen Transaktionsdatensatz zweimal importieren → zweiter Import löst Warnung aus; [HYPOTHESE]: ob der Anwender den Doppelimport trotzdem bestätigen kann, wurde nicht bis zur UI-Ebene zurückverfolgt — siehe Hypothesen.md.", "pruefidee": "Identischen Transaktionsdatensatz zweimal importieren → zweiter Import löst Warnung aus; [HYPOTHESE]: ob der Anwender den Doppelimport trotzdem bestätigen kann, wurde nicht bis zur UI-Ebene zurückverfolgt — siehe Hypothesen.md.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-025", "id": "SwRS-025",
@@ -1330,7 +1410,8 @@
"tracelinks": "SyRS-016, SyRS-017", "tracelinks": "SyRS-016, SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Verbuchungsversuch auf eine bereits `Canceled`-Rechnung mit positivem Betrag → muss abgelehnt werden.", "pruefidee": "Verbuchungsversuch auf eine bereits `Canceled`-Rechnung mit positivem Betrag → muss abgelehnt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-026", "id": "SwRS-026",
@@ -1346,7 +1427,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Recht versucht Löschung → Rechnung/`PaidFC` bleibt exakt unverändert (nicht nur Fehlermeldung prüfen, sondern Datenzustand).", "pruefidee": "Benutzer ohne Recht versucht Löschung → Rechnung/`PaidFC` bleibt exakt unverändert (nicht nur Fehlermeldung prüfen, sondern Datenzustand).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-027", "id": "SwRS-027",
@@ -1362,7 +1444,8 @@
"tracelinks": "SyRS-018", "tracelinks": "SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vergleich der von zwei unterschiedlich berechtigten Testbenutzern gelieferten Flag-Werte.", "pruefidee": "Vergleich der von zwei unterschiedlich berechtigten Testbenutzern gelieferten Flag-Werte.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-028", "id": "SwRS-028",
@@ -1379,7 +1462,8 @@
"tracelinks": "SyRS-019", "tracelinks": "SyRS-019",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechteprüfung mit simuliertem DB-Fehler → Rückgabewert `false`.", "pruefidee": "Rechteprüfung mit simuliertem DB-Fehler → Rückgabewert `false`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-029", "id": "SwRS-029",
@@ -1395,7 +1479,8 @@
"tracelinks": "SyRS-020", "tracelinks": "SyRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Code-Review-Historie prüfen: gab es je einen ID-Kollisionsfall bei parallelen Pull-Requests? (retrospektive Prüfidee)", "pruefidee": "Code-Review-Historie prüfen: gab es je einen ID-Kollisionsfall bei parallelen Pull-Requests? (retrospektive Prüfidee)",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-030", "id": "SwRS-030",
@@ -1411,7 +1496,8 @@
"tracelinks": "SyRS-021", "tracelinks": "SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Konfigurationswechsel AD → OIDC → Verhalten der Factory ändert sich entsprechend (Unit-Test).", "pruefidee": "Konfigurationswechsel AD → OIDC → Verhalten der Factory ändert sich entsprechend (Unit-Test).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-031", "id": "SwRS-031",
@@ -1429,7 +1515,8 @@
"tracelinks": "SyRS-021", "tracelinks": "SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Sicherheitsreview/Penetrationstest: identische Testpasswörter zweier Benutzer erzeugen identischen gespeicherten Hash (Nachweis fehlenden Salts).", "pruefidee": "Sicherheitsreview/Penetrationstest: identische Testpasswörter zweier Benutzer erzeugen identischen gespeicherten Hash (Nachweis fehlenden Salts).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-032", "id": "SwRS-032",
@@ -1445,7 +1532,8 @@
"tracelinks": "SyRS-021, SyRS-022", "tracelinks": "SyRS-021, SyRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket auf simuliertem Fremdgerät verwenden → Ablehnung; Ticket nach Ablaufzeit verwenden → Ablehnung.", "pruefidee": "Ticket auf simuliertem Fremdgerät verwenden → Ablehnung; Ticket nach Ablaufzeit verwenden → Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-033", "id": "SwRS-033",
@@ -1461,7 +1549,8 @@
"tracelinks": "SyRS-021", "tracelinks": "SyRS-021",
"konsolidierung": "Kandidat: Verhältnis zu separatem Modul `TwoFactorAuthenticator\\TwoFactorAuthenticationBL.cs` ungeklärt — siehe Hypothesen.md.", "konsolidierung": "Kandidat: Verhältnis zu separatem Modul `TwoFactorAuthenticator\\TwoFactorAuthenticationBL.cs` ungeklärt — siehe Hypothesen.md.",
"pruefidee": "2FA aktiv, korrekter erster Faktor, falscher zweiter Faktor → Anmeldung wird verweigert.", "pruefidee": "2FA aktiv, korrekter erster Faktor, falscher zweiter Faktor → Anmeldung wird verweigert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-034", "id": "SwRS-034",
@@ -1477,7 +1566,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zugriff auf Testpasswort → Protokolleintrag mit korrektem `EmployeeI3D` und aktuellem Zeitstempel.", "pruefidee": "Zugriff auf Testpasswort → Protokolleintrag mit korrektem `EmployeeI3D` und aktuellem Zeitstempel.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-035", "id": "SwRS-035",
@@ -1494,7 +1584,8 @@
"tracelinks": "SyRS-024", "tracelinks": "SyRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Versuch, sich als Kunde über den internen Login-Pfad anzumelden → muss fehlschlagen bzw. ist technisch nicht vorgesehen.", "pruefidee": "Versuch, sich als Kunde über den internen Login-Pfad anzumelden → muss fehlschlagen bzw. ist technisch nicht vorgesehen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-036", "id": "SwRS-036",
@@ -1510,7 +1601,8 @@
"tracelinks": "SyRS-025", "tracelinks": "SyRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter URL-Aufruf `/webcart/shop` ohne Lizenz → keine Artikel-/Preisdaten werden übertragen (Netzwerk-Mitschnitt).", "pruefidee": "Direkter URL-Aufruf `/webcart/shop` ohne Lizenz → keine Artikel-/Preisdaten werden übertragen (Netzwerk-Mitschnitt).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-037", "id": "SwRS-037",
@@ -1526,7 +1618,8 @@
"tracelinks": "SyRS-025", "tracelinks": "SyRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Erster Aufruf ohne bestehenden Warenkorb → neuer Warenkorb wird automatisch angelegt und zurückgegeben.", "pruefidee": "Erster Aufruf ohne bestehenden Warenkorb → neuer Warenkorb wird automatisch angelegt und zurückgegeben.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-038", "id": "SwRS-038",
@@ -1543,7 +1636,8 @@
"tracelinks": "SyRS-026, SyRS-027", "tracelinks": "SyRS-026, SyRS-027",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Pipeline-Lauf beobachten: Signaturverifikation muss für alle drei Artefakte grün sein, sonst Pipeline-Abbruch.", "pruefidee": "Pipeline-Lauf beobachten: Signaturverifikation muss für alle drei Artefakte grün sein, sonst Pipeline-Abbruch.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-039", "id": "SwRS-039",
@@ -1559,7 +1653,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Simulierter 401-Response → `ITscopeException` mit definierter Meldung; simulierter 404 → leere Liste statt Exception.", "pruefidee": "Simulierter 401-Response → `ITscopeException` mit definierter Meldung; simulierter 404 → leere Liste statt Exception.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-040", "id": "SwRS-040",
@@ -1575,6 +1670,7 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Abruf mit abgelaufenem Token → automatische Erneuerung vor erneutem Versuch (bzw. [HYPOTHESE], falls kein automatischer Retry gefunden — siehe Hypothesen.md).", "pruefidee": "Abruf mit abgelaufenem Token → automatische Erneuerung vor erneutem Versuch (bzw. [HYPOTHESE], falls kein automatischer Retry gefunden — siehe Hypothesen.md).",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -32,6 +34,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 96 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 96 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -49,5 +55,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (49 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (49 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 96 von 96 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 96 von 96 mit Tracelinks (100,0 %) |
@@ -101,6 +101,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -137,6 +139,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -154,6 +160,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (34 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (34 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 89 von 89 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 89 von 89 mit Tracelinks (100,0 %) |
## Anmerkungen/Auffälligkeiten ## Anmerkungen/Auffälligkeiten
@@ -15,7 +15,8 @@
"tracelinks": "SyRS-001, SyRS-002", "tracelinks": "SyRS-001, SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden der sieben Belegtypen erzeugen, in jeden der drei Zustände überführen und prüfen, dass kein vierter Zustand erreichbar ist.", "pruefidee": "Für jeden der sieben Belegtypen erzeugen, in jeden der drei Zustände überführen und prüfen, dass kein vierter Zustand erreichbar ist.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-002", "id": "StRS-002",
@@ -33,7 +34,8 @@
"tracelinks": "SyRS-003", "tracelinks": "SyRS-003",
"konsolidierung": "Kandidat: Zwei parallele Implementierungen (Legacy \"Asset\"-System `Sales/CustomerAssets/*` und modernes \"Receipt\"-System `Sales/Receipts/*`) bilden denselben Belegzyklus und dieselbe Weiterleitungslogik redundant ab (siehe SwRS-Abschnitt \"Datenmodell\").", "konsolidierung": "Kandidat: Zwei parallele Implementierungen (Legacy \"Asset\"-System `Sales/CustomerAssets/*` und modernes \"Receipt\"-System `Sales/Receipts/*`) bilden denselben Belegzyklus und dieselbe Weiterleitungslogik redundant ab (siehe SwRS-Abschnitt \"Datenmodell\").",
"pruefidee": "Versuch, einen Lieferschein direkt in ein Angebot umzuwandeln, muss vom System zurückgewiesen werden; Angebot→Auftrag muss gelingen.", "pruefidee": "Versuch, einen Lieferschein direkt in ein Angebot umzuwandeln, muss vom System zurückgewiesen werden; Angebot→Auftrag muss gelingen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-003", "id": "StRS-003",
@@ -51,7 +53,8 @@
"tracelinks": "SyRS-004, SyRS-005", "tracelinks": "SyRS-004, SyRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung stornieren und prüfen, dass eine neue Version erzeugt wird und die ursprünglichen Werte in der Versionstabelle erhalten bleiben.", "pruefidee": "Rechnung stornieren und prüfen, dass eine neue Version erzeugt wird und die ursprünglichen Werte in der Versionstabelle erhalten bleiben.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-004", "id": "StRS-004",
@@ -69,7 +72,8 @@
"tracelinks": "SyRS-006", "tracelinks": "SyRS-006",
"konsolidierung": "Kandidat: Zwei redundante Mechanismen (pessimistische Sperre + optimistisches Concurrency-Guid) lösen dieselbe fachliche Anforderung; im Zielsystem auf einen Mechanismus konsolidieren.", "konsolidierung": "Kandidat: Zwei redundante Mechanismen (pessimistische Sperre + optimistisches Concurrency-Guid) lösen dieselbe fachliche Anforderung; im Zielsystem auf einen Mechanismus konsolidieren.",
"pruefidee": "Beleg durch Benutzer A öffnen (sperren), Speicherversuch durch Benutzer B muss abgelehnt bzw. mit Hinweis versehen werden.", "pruefidee": "Beleg durch Benutzer A öffnen (sperren), Speicherversuch durch Benutzer B muss abgelehnt bzw. mit Hinweis versehen werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-005", "id": "StRS-005",
@@ -87,7 +91,8 @@
"tracelinks": "SyRS-007, SyRS-008", "tracelinks": "SyRS-007, SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit monatlichem Intervall und fälligem Abrechnungsdatum anlegen, Abrechnungslauf ausführen, Rechnung sowie fortgeschriebenes `LastSubsequentBillingDate` prüfen.", "pruefidee": "Vertrag mit monatlichem Intervall und fälligem Abrechnungsdatum anlegen, Abrechnungslauf ausführen, Rechnung sowie fortgeschriebenes `LastSubsequentBillingDate` prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-006", "id": "StRS-006",
@@ -104,7 +109,8 @@
"tracelinks": "SyRS-009", "tracelinks": "SyRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnungslauf für einen RMM-Vertrag bei simuliert nicht erreichbarem RMM-Dienst ausführen; erwartetes Ergebnis: Abbruch mit definierter Fehlermeldung, keine Rechnung erzeugt.", "pruefidee": "Rechnungslauf für einen RMM-Vertrag bei simuliert nicht erreichbarem RMM-Dienst ausführen; erwartetes Ergebnis: Abbruch mit definierter Fehlermeldung, keine Rechnung erzeugt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-007", "id": "StRS-007",
@@ -121,7 +127,8 @@
"tracelinks": "SyRS-008", "tracelinks": "SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit Stundenkontingent anlegen, Verbrauch über das Kontingent hinaus buchen, Monitoring-Warnung/Restbestand prüfen.", "pruefidee": "Vertrag mit Stundenkontingent anlegen, Verbrauch über das Kontingent hinaus buchen, Monitoring-Warnung/Restbestand prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-008", "id": "StRS-008",
@@ -139,7 +146,8 @@
"tracelinks": "SyRS-010, SyRS-011", "tracelinks": "SyRS-010, SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Angebot über den Web-Kanal versenden, interne Freigabe erteilen, Kundenannahme simulieren, resultierenden Auftrag und Statuskette prüfen.", "pruefidee": "Angebot über den Web-Kanal versenden, interne Freigabe erteilen, Kundenannahme simulieren, resultierenden Auftrag und Statuskette prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-009", "id": "StRS-009",
@@ -155,7 +163,8 @@
"tracelinks": "SyRS-011", "tracelinks": "SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Dokument mit gültigem Zertifikat signieren und die Signatur mit einem PDF-Prüfwerkzeug verifizieren.", "pruefidee": "Dokument mit gültigem Zertifikat signieren und die Signatur mit einem PDF-Prüfwerkzeug verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-010", "id": "StRS-010",
@@ -172,7 +181,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde mit Kreditlimit 1.000 € anlegen, offene Aufträge über 1.000 € erfassen, weiteren Auftrag anlegen und Bestätigungsdialog verifizieren.", "pruefidee": "Kunde mit Kreditlimit 1.000 € anlegen, offene Aufträge über 1.000 € erfassen, weiteren Auftrag anlegen und Bestätigungsdialog verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-011", "id": "StRS-011",
@@ -190,7 +200,8 @@
"tracelinks": "SyRS-013, SyRS-014", "tracelinks": "SyRS-013, SyRS-014",
"konsolidierung": "Kandidat: `ProductMatrix`-Mechanismus (kundenindividuelle Katalogkategorien/Produkte) deckt fachlich ähnliches Ziel ab (Steuerung der für einen Kunden sichtbaren Artikel) — Verhältnis zu Sonderpreisen ungeklärt, siehe Hypothesen.md.", "konsolidierung": "Kandidat: `ProductMatrix`-Mechanismus (kundenindividuelle Katalogkategorien/Produkte) deckt fachlich ähnliches Ziel ab (Steuerung der für einen Kunden sichtbaren Artikel) — Verhältnis zu Sonderpreisen ungeklärt, siehe Hypothesen.md.",
"pruefidee": "Kunde mit Sonderpreisen für Artikel X anlegen, per Web-Account im WebCart einloggen, Sichtbarkeit von Artikel X prüfen.", "pruefidee": "Kunde mit Sonderpreisen für Artikel X anlegen, per Web-Account im WebCart einloggen, Sichtbarkeit von Artikel X prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-012", "id": "StRS-012",
@@ -206,7 +217,8 @@
"tracelinks": "SwRS (siehe SwRS-Abschnitt Datenmodell)", "tracelinks": "SwRS (siehe SwRS-Abschnitt Datenmodell)",
"konsolidierung": "Kandidat: Es existiert daneben ein neuerer Begriff \"Account\" (`Centron.BL/Accounts/*`) als mögliche Nachfolgeabstraktion zu `Customer` — Verhältnis ungeklärt, [HYPOTHESE] siehe Hypothesen.md H-02.", "konsolidierung": "Kandidat: Es existiert daneben ein neuerer Begriff \"Account\" (`Centron.BL/Accounts/*`) als mögliche Nachfolgeabstraktion zu `Customer` — Verhältnis ungeklärt, [HYPOTHESE] siehe Hypothesen.md H-02.",
"pruefidee": "Adressobjekt für einen Lieferanten anlegen und prüfen, dass dieselbe Tabellenstruktur wie bei Kundenadressen verwendet wird.", "pruefidee": "Adressobjekt für einen Lieferanten anlegen und prüfen, dass dieselbe Tabellenstruktur wie bei Kundenadressen verwendet wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-013", "id": "StRS-013",
@@ -223,7 +235,8 @@
"tracelinks": "SyRS-015", "tracelinks": "SyRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vorlage anlegen, als Standard markieren, neues Ticket-Erstellungsformular öffnen und automatisches Vorbefüllen mit Standardvorlage prüfen; Löschversuch der Standardvorlage muss abgelehnt werden.", "pruefidee": "Vorlage anlegen, als Standard markieren, neues Ticket-Erstellungsformular öffnen und automatisches Vorbefüllen mit Standardvorlage prüfen; Löschversuch der Standardvorlage muss abgelehnt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-014", "id": "StRS-014",
@@ -239,7 +252,8 @@
"tracelinks": "SyRS-015", "tracelinks": "SyRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket mit offenem RMA-Vorgang schließen und prüfen, ob (aktuell) keine Blockade erfolgt — Regressionsbasis für spätere Vervollständigung der Prüfung.", "pruefidee": "Ticket mit offenem RMA-Vorgang schließen und prüfen, ob (aktuell) keine Blockade erfolgt — Regressionsbasis für spätere Vervollständigung der Prüfung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-015", "id": "StRS-015",
@@ -257,7 +271,8 @@
"tracelinks": "SyRS-016, SyRS-017", "tracelinks": "SyRS-016, SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer aus allen Rechtegruppen entfernen und prüfen, dass sämtliche geschützten Funktionen gesperrt sind; nach Gruppenzuordnung Freischaltung prüfen.", "pruefidee": "Benutzer aus allen Rechtegruppen entfernen und prüfen, dass sämtliche geschützten Funktionen gesperrt sind; nach Gruppenzuordnung Freischaltung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-016", "id": "StRS-016",
@@ -276,7 +291,8 @@
"tracelinks": "SyRS-017", "tracelinks": "SyRS-017",
"konsolidierung": "Kandidat: identisches Muster ist in mind. 4 Fachmodulen (Helpdesk, Kalender, Mitarbeiterauslastung, Rechteverwaltung) separat implementiert statt zentral wiederverwendet.", "konsolidierung": "Kandidat: identisches Muster ist in mind. 4 Fachmodulen (Helpdesk, Kalender, Mitarbeiterauslastung, Rechteverwaltung) separat implementiert statt zentral wiederverwendet.",
"pruefidee": "Benutzer mit Grundrecht + \"nur eigene Filiale\" anlegen, Datensätze anderer Filialen anlegen, Sichtbarkeit/Zugriff verifizieren.", "pruefidee": "Benutzer mit Grundrecht + \"nur eigene Filiale\" anlegen, Datensätze anderer Filialen anlegen, Sichtbarkeit/Zugriff verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-017", "id": "StRS-017",
@@ -293,7 +309,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Account-Recht vergeben/entziehen und prüfen, dass dies keine Auswirkung auf interne `UserRightsConst`-Prüfungen hat.", "pruefidee": "Web-Account-Recht vergeben/entziehen und prüfen, dass dies keine Auswirkung auf interne `UserRightsConst`-Prüfungen hat.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-018", "id": "StRS-018",
@@ -309,7 +326,8 @@
"tracelinks": "SyRS-017", "tracelinks": "SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Recht einer Gruppe hinzufügen und Vorhandensein eines Protokolleintrags mit Benutzer/Zeitstempel prüfen.", "pruefidee": "Recht einer Gruppe hinzufügen und Vorhandensein eines Protokolleintrags mit Benutzer/Zeitstempel prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-019", "id": "StRS-019",
@@ -326,7 +344,8 @@
"tracelinks": "SyRS-018, SyRS-019", "tracelinks": "SyRS-018, SyRS-019",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anmeldung über jede der drei Methoden in einer Testumgebung durchführen und erfolgreichen Login sowie Ticket-Erstellung prüfen.", "pruefidee": "Anmeldung über jede der drei Methoden in einer Testumgebung durchführen und erfolgreichen Login sowie Ticket-Erstellung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-020", "id": "StRS-020",
@@ -343,7 +362,8 @@
"tracelinks": "SyRS-020", "tracelinks": "SyRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket erzeugen, 31 Minuten warten (bzw. Ablaufzeit simulieren), nachfolgenden API-Aufruf auf Ablehnung prüfen.", "pruefidee": "Ticket erzeugen, 31 Minuten warten (bzw. Ablaufzeit simulieren), nachfolgenden API-Aufruf auf Ablehnung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-021", "id": "StRS-021",
@@ -360,7 +380,8 @@
"tracelinks": "SyRS-018", "tracelinks": "SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "2FA für einen Benutzer aktivieren, Login ohne bzw. mit korrektem/falschem TOTP-Code testen.", "pruefidee": "2FA für einen Benutzer aktivieren, Login ohne bzw. mit korrektem/falschem TOTP-Code testen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-022", "id": "StRS-022",
@@ -377,7 +398,8 @@
"tracelinks": "SyRS-021", "tracelinks": "SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Feature ohne zugehörige Lizenz aufrufen und Sperrung/Ausblendung prüfen; Mengenlizenz mit `count=3` testen (4. Nutzung muss abgelehnt werden).", "pruefidee": "Feature ohne zugehörige Lizenz aufrufen und Sperrung/Ausblendung prüfen; Mengenlizenz mit `count=3` testen (4. Nutzung muss abgelehnt werden).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-023", "id": "StRS-023",
@@ -394,7 +416,8 @@
"tracelinks": "SyRS-022", "tracelinks": "SyRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei gleichzeitige Rechnungserstellungen (parallelisiert) simulieren und prüfen, dass keine doppelte Nummer vergeben wird.", "pruefidee": "Zwei gleichzeitige Rechnungserstellungen (parallelisiert) simulieren und prüfen, dass keine doppelte Nummer vergeben wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-024", "id": "StRS-024",
@@ -410,7 +433,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung festschreiben, Änderungsversuch durchführen und Ablehnung mit definierter Fehlermeldung prüfen.", "pruefidee": "Rechnung festschreiben, Änderungsversuch durchführen und Ablehnung mit definierter Fehlermeldung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-025", "id": "StRS-025",
@@ -426,7 +450,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stornierung einer bereits exportierten Rechnung versuchen (muss abgelehnt werden); Stornierung einer offenen, nicht exportierten Rechnung durchführen (muss gelingen und neue Version erzeugen).", "pruefidee": "Stornierung einer bereits exportierten Rechnung versuchen (muss abgelehnt werden); Stornierung einer offenen, nicht exportierten Rechnung durchführen (muss gelingen und neue Version erzeugen).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-026", "id": "StRS-026",
@@ -442,7 +467,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zahlung erfassen (Beleg wird \"bezahlt\"), Zahlung löschen und Rückkehr des Belegs in den unbezahlten Zustand inkl. korrekten Betrags prüfen.", "pruefidee": "Zahlung erfassen (Beleg wird \"bezahlt\"), Zahlung löschen und Rückkehr des Belegs in den unbezahlten Zustand inkl. korrekten Betrags prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-027", "id": "StRS-027",
@@ -458,7 +484,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bankverbindung löschen, die von einem aktiven Vertrag mit SEPA-Mandat referenziert wird; Ablehnung mit Belegliste prüfen.", "pruefidee": "Bankverbindung löschen, die von einem aktiven Vertrag mit SEPA-Mandat referenziert wird; Ablehnung mit Belegliste prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-028", "id": "StRS-028",
@@ -476,7 +503,8 @@
"tracelinks": "SyRS-024", "tracelinks": "SyRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit aktivierter ZUGFeRD-Einstellung erzeugen und die PDF-eingebettete XML mit einem Validator (z. B. KOSIT-Tool) prüfen.", "pruefidee": "Rechnung mit aktivierter ZUGFeRD-Einstellung erzeugen und die PDF-eingebettete XML mit einem Validator (z. B. KOSIT-Tool) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-029", "id": "StRS-029",
@@ -494,7 +522,8 @@
"tracelinks": "SyRS-025, SyRS-026", "tracelinks": "SyRS-025, SyRS-026",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testbestellung an einen konfigurierten EDI-Distributor senden und Empfang/Verarbeitung einer simulierten Auftragsbestätigung prüfen.", "pruefidee": "Testbestellung an einen konfigurierten EDI-Distributor senden und Empfang/Verarbeitung einer simulierten Auftragsbestätigung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-030", "id": "StRS-030",
@@ -510,7 +539,8 @@
"tracelinks": "SyRS-027", "tracelinks": "SyRS-027",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel unter Mindestbestand setzen und Erscheinen in der Bestellvorschlagsliste mit korrekter Menge prüfen.", "pruefidee": "Artikel unter Mindestbestand setzen und Erscheinen in der Bestellvorschlagsliste mit korrekter Menge prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-031", "id": "StRS-031",
@@ -526,7 +556,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bestellung mit 100 Stück anlegen, zwei Teillieferungen von je 40 und 60 Stück buchen, kumulierten Status nach jeder Teillieferung prüfen.", "pruefidee": "Bestellung mit 100 Stück anlegen, zwei Teillieferungen von je 40 und 60 Stück buchen, kumulierten Status nach jeder Teillieferung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-032", "id": "StRS-032",
@@ -543,7 +574,8 @@
"tracelinks": "SyRS-029", "tracelinks": "SyRS-029",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Warenausgang ohne Negativbuchungsrecht über den verfügbaren Bestand hinaus buchen; Ablehnung und Kollegen-Anmeldedialog prüfen.", "pruefidee": "Warenausgang ohne Negativbuchungsrecht über den verfügbaren Bestand hinaus buchen; Ablehnung und Kollegen-Anmeldedialog prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-033", "id": "StRS-033",
@@ -560,7 +592,8 @@
"tracelinks": "SyRS-029", "tracelinks": "SyRS-029",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bestandsänderung durchführen und Vorhandensein eines zugehörigen Protokolleintrags mit Benutzer/Zeitstempel/Mengenänderung prüfen.", "pruefidee": "Bestandsänderung durchführen und Vorhandensein eines zugehörigen Protokolleintrags mit Benutzer/Zeitstempel/Mengenänderung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-034", "id": "StRS-034",
@@ -578,7 +611,8 @@
"tracelinks": "SyRS-030", "tracelinks": "SyRS-030",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel mit hinterlegtem Aktionspreis und aktivierten externen Quellen öffnen; alle Quellen müssen parallel mit Anbieterkennzeichnung angezeigt werden.", "pruefidee": "Artikel mit hinterlegtem Aktionspreis und aktivierten externen Quellen öffnen; alle Quellen müssen parallel mit Anbieterkennzeichnung angezeigt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-035", "id": "StRS-035",
@@ -595,7 +629,8 @@
"tracelinks": "SyRS-013, SyRS-031", "tracelinks": "SyRS-013, SyRS-031",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Als Web-Account anmelden, Artikel im Shop auswählen, Bestellung auslösen, im Belegverlauf wiederfinden.", "pruefidee": "Als Web-Account anmelden, Artikel im Shop auswählen, Bestellung auslösen, im Belegverlauf wiederfinden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-036", "id": "StRS-036",
@@ -612,7 +647,8 @@
"tracelinks": "SyRS-032", "tracelinks": "SyRS-032",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "TradePool-Zugang für einen Testkunden einrichten, Artikelsuche über mehrere importierte Distributoren durchführen.", "pruefidee": "TradePool-Zugang für einen Testkunden einrichten, Artikelsuche über mehrere importierte Distributoren durchführen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-037", "id": "StRS-037",
@@ -630,7 +666,8 @@
"tracelinks": "SyRS-033, SyRS-034", "tracelinks": "SyRS-033, SyRS-034",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Service-Container unter Linux gemäß Dokumentation starten und Basisfunktionalität (Login, einfacher API-Aufruf) verifizieren.", "pruefidee": "Web-Service-Container unter Linux gemäß Dokumentation starten und Basisfunktionalität (Login, einfacher API-Aufruf) verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-038", "id": "StRS-038",
@@ -646,7 +683,8 @@
"tracelinks": "SyRS-035", "tracelinks": "SyRS-035",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Pull Request mit \"Ticket 12345\" im Titel mergen und automatischen Eintrag der Versionsnummer im Ticketsystem prüfen.", "pruefidee": "Pull Request mit \"Ticket 12345\" im Titel mergen und automatischen Eintrag der Versionsnummer im Ticketsystem prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-039", "id": "StRS-039",
@@ -662,7 +700,8 @@
"tracelinks": "SyRS-041", "tracelinks": "SyRS-041",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Denselben Anwendungsfall (z. B. Kundenanlage) einmal über Direktverbindung und einmal über Web-Service ausführen; identisches fachliches Ergebnis prüfen.", "pruefidee": "Denselben Anwendungsfall (z. B. Kundenanlage) einmal über Direktverbindung und einmal über Web-Service ausführen; identisches fachliches Ergebnis prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-040", "id": "StRS-040",
@@ -679,7 +718,8 @@
"tracelinks": "SyRS-042", "tracelinks": "SyRS-042",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anzeigesprache auf Englisch umstellen und Vorhandensein englischer Übersetzung für eine Stichprobe von UI-Elementen prüfen.", "pruefidee": "Anzeigesprache auf Englisch umstellen und Vorhandensein englischer Übersetzung für eine Stichprobe von UI-Elementen prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-041", "id": "StRS-041",
@@ -695,7 +735,8 @@
"tracelinks": "SyRS-036", "tracelinks": "SyRS-036",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bekannte Dateninkonsistenz (z. B. fehlende AccountI3D in einem Todo) erzeugen und nach einem Ausführungszyklus die automatische Korrektur prüfen.", "pruefidee": "Bekannte Dateninkonsistenz (z. B. fehlende AccountI3D in einem Todo) erzeugen und nach einem Ausführungszyklus die automatische Korrektur prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-042", "id": "StRS-042",
@@ -713,7 +754,8 @@
"tracelinks": "SyRS-037, SyRS-038", "tracelinks": "SyRS-037, SyRS-038",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "API-Aufruf ohne gültiges Recht (403), ohne gültige Authentifizierung (401) und mit beidem (Erfolg) gegen einen v1-Endpunkt prüfen.", "pruefidee": "API-Aufruf ohne gültiges Recht (403), ohne gültige Authentifizierung (401) und mit beidem (Erfolg) gegen einen v1-Endpunkt prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-043", "id": "StRS-043",
@@ -729,7 +771,8 @@
"tracelinks": "SyRS-039", "tracelinks": "SyRS-039",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "API-Aufruf durchführen und Vorhandensein eines entsprechenden Telemetrie-Eintrags nach dem nächsten Bucket-Zyklus prüfen.", "pruefidee": "API-Aufruf durchführen und Vorhandensein eines entsprechenden Telemetrie-Eintrags nach dem nächsten Bucket-Zyklus prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-044", "id": "StRS-044",
@@ -746,7 +789,8 @@
"tracelinks": "SyRS-040", "tracelinks": "SyRS-040",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Filialen unter einem Mandanten anlegen, Auftrag je Filiale erfassen und filialbezogene Auswertung/Berechtigungsfilterung prüfen.", "pruefidee": "Zwei Filialen unter einem Mandanten anlegen, Auftrag je Filiale erfassen und filialbezogene Auswertung/Berechtigungsfilterung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-045", "id": "StRS-045",
@@ -762,7 +806,8 @@
"tracelinks": "SyRS-044", "tracelinks": "SyRS-044",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Benutzer mit identischem Passwort anlegen und prüfen, ob die gespeicherten Hash-Werte identisch sind (Indiz für fehlendes Salt); Ergebnis mit Sicherheitsverantwortlichen bewerten.", "pruefidee": "Zwei Benutzer mit identischem Passwort anlegen und prüfen, ob die gespeicherten Hash-Werte identisch sind (Indiz für fehlendes Salt); Ergebnis mit Sicherheitsverantwortlichen bewerten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-001", "id": "SyRS-001",
@@ -778,7 +823,8 @@
"tracelinks": "StRS-001; SwRS-001", "tracelinks": "StRS-001; SwRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Versuch, einen ungültigen Integer-Wert außerhalb {1,2,3} in `State` zu schreiben, muss durch Typsystem/DB verhindert werden.", "pruefidee": "Versuch, einen ungültigen Integer-Wert außerhalb {1,2,3} in `State` zu schreiben, muss durch Typsystem/DB verhindert werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-002", "id": "SyRS-002",
@@ -795,7 +841,8 @@
"tracelinks": "StRS-001; SwRS-002", "tracelinks": "StRS-001; SwRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Struktur eines neu hinzugefügten Belegtyps (z. B. anhand der Dokumentation) gegen die Basisklassen validieren.", "pruefidee": "Struktur eines neu hinzugefügten Belegtyps (z. B. anhand der Dokumentation) gegen die Basisklassen validieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-003", "id": "SyRS-003",
@@ -811,7 +858,8 @@
"tracelinks": "StRS-002; SwRS-003", "tracelinks": "StRS-002; SwRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter API-/BL-Aufruf zur Weiterleitung eines nicht erlaubten Übergangs muss mit definiertem Fehler abgelehnt werden (nicht nur UI-seitig ausgeblendet).", "pruefidee": "Direkter API-/BL-Aufruf zur Weiterleitung eines nicht erlaubten Übergangs muss mit definiertem Fehler abgelehnt werden (nicht nur UI-seitig ausgeblendet).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-004", "id": "SyRS-004",
@@ -827,7 +875,8 @@
"tracelinks": "StRS-003; SwRS-004", "tracelinks": "StRS-003; SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Spalte nur an der Basistabelle ergänzen (Versionstabelle bewusst auslassen) und Auftreten des dokumentierten Laufzeitfehlers bei Versionierung verifizieren.", "pruefidee": "Neue Spalte nur an der Basistabelle ergänzen (Versionstabelle bewusst auslassen) und Auftreten des dokumentierten Laufzeitfehlers bei Versionierung verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-005", "id": "SyRS-005",
@@ -843,7 +892,8 @@
"tracelinks": "StRS-003; SwRS-004", "tracelinks": "StRS-003; SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ereignis für zwei unterschiedliche Belegtypen auslösen und Vorhandensein je eines `AnlageLog`-Eintrags mit korrektem `AnlageArt` prüfen.", "pruefidee": "Ereignis für zwei unterschiedliche Belegtypen auslösen und Vorhandensein je eines `AnlageLog`-Eintrags mit korrektem `AnlageArt` prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-006", "id": "SyRS-006",
@@ -860,7 +910,8 @@
"tracelinks": "StRS-004; SwRS-005", "tracelinks": "StRS-004; SwRS-005",
"konsolidierung": "Kandidat: siehe StRS-004 (zwei parallele Mechanismen).", "konsolidierung": "Kandidat: siehe StRS-004 (zwei parallele Mechanismen).",
"pruefidee": "Siehe StRS-004.", "pruefidee": "Siehe StRS-004.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-007", "id": "SyRS-007",
@@ -876,7 +927,8 @@
"tracelinks": "StRS-005; SwRS-006", "tracelinks": "StRS-005; SwRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit Quartalsintervall (Monthly×3) anlegen und Fälligkeitsberechnung über mehrere Zyklen prüfen.", "pruefidee": "Vertrag mit Quartalsintervall (Monthly×3) anlegen und Fälligkeitsberechnung über mehrere Zyklen prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-008", "id": "SyRS-008",
@@ -892,7 +944,8 @@
"tracelinks": "StRS-005, StRS-007; SwRS-006", "tracelinks": "StRS-005, StRS-007; SwRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kontingent bis knapp unter, dann über die Überwachungsschwelle buchen und Statusänderung prüfen.", "pruefidee": "Kontingent bis knapp unter, dann über die Überwachungsschwelle buchen und Statusänderung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-009", "id": "SyRS-009",
@@ -908,7 +961,8 @@
"tracelinks": "StRS-006; SwRS-007", "tracelinks": "StRS-006; SwRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMM-Dienst-Endpunkt für einen Testlauf deaktivieren und Abbruch der Rechnungserstellung mit definierter Fehlermeldung prüfen.", "pruefidee": "RMM-Dienst-Endpunkt für einen Testlauf deaktivieren und Abbruch der Rechnungserstellung mit definierter Fehlermeldung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-010", "id": "SyRS-010",
@@ -925,7 +979,8 @@
"tracelinks": "StRS-008; SwRS-008", "tracelinks": "StRS-008; SwRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Angebot durch alle Hauptpfade (Annahme ohne Signatur / mit Signatur / Ablehnung / Änderungswunsch) führen und Zustandsfolge protokollieren.", "pruefidee": "Web-Angebot durch alle Hauptpfade (Annahme ohne Signatur / mit Signatur / Ablehnung / Änderungswunsch) führen und Zustandsfolge protokollieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-011", "id": "SyRS-011",
@@ -942,7 +997,8 @@
"tracelinks": "StRS-008, StRS-009; SwRS-008", "tracelinks": "StRS-008, StRS-009; SwRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Dokument ohne interne Freigabe darf nicht an den Kunden-Signaturlink gelangen; nach Freigabe muss der Versand erfolgen.", "pruefidee": "Dokument ohne interne Freigabe darf nicht an den Kunden-Signaturlink gelangen; nach Freigabe muss der Versand erfolgen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-012", "id": "SyRS-012",
@@ -958,7 +1014,8 @@
"tracelinks": "StRS-010; SwRS-009", "tracelinks": "StRS-010; SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-010.", "pruefidee": "Siehe StRS-010.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-013", "id": "SyRS-013",
@@ -974,7 +1031,8 @@
"tracelinks": "StRS-011, StRS-035; SwRS-010", "tracelinks": "StRS-011, StRS-035; SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Endpunkt für einen Testkunden mit Sonderpreisen aufrufen und korrekte Artikelliste inkl. Preis prüfen.", "pruefidee": "Endpunkt für einen Testkunden mit Sonderpreisen aufrufen und korrekte Artikelliste inkl. Preis prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-014", "id": "SyRS-014",
@@ -990,7 +1048,8 @@
"tracelinks": "StRS-011; SwRS-010", "tracelinks": "StRS-011; SwRS-010",
"konsolidierung": "Kandidat: Verhältnis zu Sonderpreis-Mechanismus (SyRS-013) ungeklärt — möglicherweise zwei Mechanismen für dasselbe fachliche Ziel \"Artikelsichtbarkeit je Kunde steuern\" (siehe Hypothesen.md).", "konsolidierung": "Kandidat: Verhältnis zu Sonderpreis-Mechanismus (SyRS-013) ungeklärt — möglicherweise zwei Mechanismen für dasselbe fachliche Ziel \"Artikelsichtbarkeit je Kunde steuern\" (siehe Hypothesen.md).",
"pruefidee": "Kundenindividuelle Produktmatrix konfigurieren und Filterwirkung im Katalog/WebCart prüfen.", "pruefidee": "Kundenindividuelle Produktmatrix konfigurieren und Filterwirkung im Katalog/WebCart prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-015", "id": "SyRS-015",
@@ -1006,7 +1065,8 @@
"tracelinks": "StRS-013, StRS-014; SwRS-011", "tracelinks": "StRS-013, StRS-014; SwRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zweite Vorlage als Standard setzen und Aberkennung des Standard-Flags der ersten Vorlage prüfen; Löschversuch der aktuellen Standardvorlage muss scheitern.", "pruefidee": "Zweite Vorlage als Standard setzen und Aberkennung des Standard-Flags der ersten Vorlage prüfen; Löschversuch der aktuellen Standardvorlage muss scheitern.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-016", "id": "SyRS-016",
@@ -1022,7 +1082,8 @@
"tracelinks": "StRS-015, StRS-017; SwRS-012", "tracelinks": "StRS-015, StRS-017; SwRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Mehrere Rechteprüfungen innerhalb derselben Sitzung ausführen und (via Profiling) genau einen SQL-Zugriff für die Rechteliste nachweisen.", "pruefidee": "Mehrere Rechteprüfungen innerhalb derselben Sitzung ausführen und (via Profiling) genau einen SQL-Zugriff für die Rechteliste nachweisen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-017", "id": "SyRS-017",
@@ -1038,7 +1099,8 @@
"tracelinks": "StRS-015, StRS-016, StRS-018; SwRS-012, SwRS-013", "tracelinks": "StRS-015, StRS-016, StRS-018; SwRS-012, SwRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Versuch, einem Benutzer ohne Gruppenzuordnung ein Einzelrecht zuzuweisen — es muss kein entsprechender Mechanismus im System existieren.", "pruefidee": "Versuch, einem Benutzer ohne Gruppenzuordnung ein Einzelrecht zuzuweisen — es muss kein entsprechender Mechanismus im System existieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-018", "id": "SyRS-018",
@@ -1054,7 +1116,8 @@
"tracelinks": "StRS-019, StRS-021; SwRS-014", "tracelinks": "StRS-019, StRS-021; SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Systemeinstellung zwischen den drei Methoden umschalten und erfolgreichen Login je Methode prüfen.", "pruefidee": "Systemeinstellung zwischen den drei Methoden umschalten und erfolgreichen Login je Methode prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-019", "id": "SyRS-019",
@@ -1071,7 +1134,8 @@
"tracelinks": "StRS-019; SwRS-014", "tracelinks": "StRS-019; SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Manipuliertes/abgelaufenes Token gegen `jwt/login` senden und Ablehnung (401) prüfen.", "pruefidee": "Manipuliertes/abgelaufenes Token gegen `jwt/login` senden und Ablehnung (401) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-020", "id": "SyRS-020",
@@ -1088,7 +1152,8 @@
"tracelinks": "StRS-020; SwRS-015", "tracelinks": "StRS-020; SwRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket serverseitig invalidieren und Zeit bis zur client-seitigen Erkennung (Abmeldung/Hinweis) messen; muss innerhalb des konfigurierten Revalidierungsintervalls liegen.", "pruefidee": "Ticket serverseitig invalidieren und Zeit bis zur client-seitigen Erkennung (Abmeldung/Hinweis) messen; muss innerhalb des konfigurierten Revalidierungsintervalls liegen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-021", "id": "SyRS-021",
@@ -1104,7 +1169,8 @@
"tracelinks": "StRS-022, StRS-042; SwRS-016", "tracelinks": "StRS-022, StRS-042; SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lizenz `CentronInternal` deaktivieren und Zugriff auf entsprechend geschützten Endpunkt trotz gültiger Benutzerrechte prüfen (muss abgelehnt werden).", "pruefidee": "Lizenz `CentronInternal` deaktivieren und Zugriff auf entsprechend geschützten Endpunkt trotz gültiger Benutzerrechte prüfen (muss abgelehnt werden).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-022", "id": "SyRS-022",
@@ -1120,7 +1186,8 @@
"tracelinks": "StRS-023; SwRS-017", "tracelinks": "StRS-023; SwRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lasttest mit ≥10 parallelen Rechnungserstellungen gegen denselben Nummernkreis; Eindeutigkeit aller vergebenen Nummern prüfen.", "pruefidee": "Lasttest mit ≥10 parallelen Rechnungserstellungen gegen denselben Nummernkreis; Eindeutigkeit aller vergebenen Nummern prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-023", "id": "SyRS-023",
@@ -1138,7 +1205,8 @@
"tracelinks": "StRS-024, StRS-025, StRS-026, StRS-027; SwRS-018", "tracelinks": "StRS-024, StRS-025, StRS-026, StRS-027; SwRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Je Guard einen gezielten Verletzungsversuch durchführen und Ablehnung mit spezifischer Fehlermeldung prüfen.", "pruefidee": "Je Guard einen gezielten Verletzungsversuch durchführen und Ablehnung mit spezifischer Fehlermeldung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-024", "id": "SyRS-024",
@@ -1155,7 +1223,8 @@
"tracelinks": "StRS-028; SwRS-019", "tracelinks": "StRS-028; SwRS-019",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einstellung aktivieren, Rechnung finalisieren, PDF auf eingebettete ZUGFeRD-XML prüfen (z. B. mit KOSIT-Validator).", "pruefidee": "Einstellung aktivieren, Rechnung finalisieren, PDF auf eingebettete ZUGFeRD-XML prüfen (z. B. mit KOSIT-Validator).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-025", "id": "SyRS-025",
@@ -1171,7 +1240,8 @@
"tracelinks": "StRS-029; SwRS-020", "tracelinks": "StRS-029; SwRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bestellung an einen nicht speziell konfigurierten Distributor auslösen und Erzeugung eines validen openTRANS-2.1-Dokuments prüfen.", "pruefidee": "Bestellung an einen nicht speziell konfigurierten Distributor auslösen und Erzeugung eines validen openTRANS-2.1-Dokuments prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-026", "id": "SyRS-026",
@@ -1188,7 +1258,8 @@
"tracelinks": "StRS-029; SwRS-020", "tracelinks": "StRS-029; SwRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testdatei je unterstütztem Format einspielen und korrekte Delegation an die jeweilige Partial-Class (per Log/Trace) prüfen.", "pruefidee": "Testdatei je unterstütztem Format einspielen und korrekte Delegation an die jeweilige Partial-Class (per Log/Trace) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-027", "id": "SyRS-027",
@@ -1204,7 +1275,8 @@
"tracelinks": "StRS-030; SwRS-021", "tracelinks": "StRS-030; SwRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel mit offenem Zulauf und Unterschreitung des Mindestbestands prüfen; Bestellvorschlagsmenge muss den Zulauf berücksichtigen.", "pruefidee": "Artikel mit offenem Zulauf und Unterschreitung des Mindestbestands prüfen; Bestellvorschlagsmenge muss den Zulauf berücksichtigen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-028", "id": "SyRS-028",
@@ -1220,7 +1292,8 @@
"tracelinks": "StRS-031; SwRS-022", "tracelinks": "StRS-031; SwRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-031.", "pruefidee": "Siehe StRS-031.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-029", "id": "SyRS-029",
@@ -1237,7 +1310,8 @@
"tracelinks": "StRS-032, StRS-033; SwRS-023", "tracelinks": "StRS-032, StRS-033; SwRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-032/033.", "pruefidee": "Siehe StRS-032/033.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-030", "id": "SyRS-030",
@@ -1253,7 +1327,8 @@
"tracelinks": "StRS-034; SwRS-024", "tracelinks": "StRS-034; SwRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aktionspreis außerhalb des Gültigkeitszeitraums anlegen und Nichterscheinen in der Preismatrix prüfen; Preismatrix-Ladezeit mit und ohne Cache messen.", "pruefidee": "Aktionspreis außerhalb des Gültigkeitszeitraums anlegen und Nichterscheinen in der Preismatrix prüfen; Preismatrix-Ladezeit mit und ohne Cache messen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-031", "id": "SyRS-031",
@@ -1269,7 +1344,8 @@
"tracelinks": "StRS-035; SwRS-025", "tracelinks": "StRS-035; SwRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Login über Nexus durchführen, Cookie-Setzung prüfen, Ticket serverseitig invalidieren und erzwungene Abmeldung gemäß SyRS-020 prüfen.", "pruefidee": "Login über Nexus durchführen, Cookie-Setzung prüfen, Ticket serverseitig invalidieren und erzwungene Abmeldung gemäß SyRS-020 prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-032", "id": "SyRS-032",
@@ -1285,7 +1361,8 @@
"tracelinks": "StRS-036; SwRS-025", "tracelinks": "StRS-036; SwRS-025",
"konsolidierung": "Kandidat: dritter, unabhängiger Authentifizierungsmechanismus neben Haupt-Auth (SyRS-018) und Web-Account-Rechten (StRS-017) — Konsolidierungspotenzial für Zielsystem.", "konsolidierung": "Kandidat: dritter, unabhängiger Authentifizierungsmechanismus neben Haupt-Auth (SyRS-018) und Web-Account-Rechten (StRS-017) — Konsolidierungspotenzial für Zielsystem.",
"pruefidee": "TradePool-Login mit korrektem/falschem Passwort testen; Nichtverfügbarkeit einer TradePool-Sitzung für reguläre c-entron-Endpunkte prüfen.", "pruefidee": "TradePool-Login mit korrektem/falschem Passwort testen; Nichtverfügbarkeit einer TradePool-Sitzung für reguläre c-entron-Endpunkte prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-033", "id": "SyRS-033",
@@ -1302,7 +1379,8 @@
"tracelinks": "StRS-037; SwRS-026", "tracelinks": "StRS-037; SwRS-026",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`docker compose up` gemäß Konfiguration ausführen und Erreichbarkeit aller vier Dienste prüfen.", "pruefidee": "`docker compose up` gemäß Konfiguration ausführen und Erreichbarkeit aller vier Dienste prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-034", "id": "SyRS-034",
@@ -1318,7 +1396,8 @@
"tracelinks": "StRS-037; SwRS-026", "tracelinks": "StRS-037; SwRS-026",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Linux-Installation gemäß Dokumentation aufsetzen und Nichtverfügbarkeit der Sub-Web-Services sowie Klartext-Zertifikatspasswort in der Konfigurationsdatei verifizieren.", "pruefidee": "Linux-Installation gemäß Dokumentation aufsetzen und Nichtverfügbarkeit der Sub-Web-Services sowie Klartext-Zertifikatspasswort in der Konfigurationsdatei verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-035", "id": "SyRS-035",
@@ -1334,7 +1413,8 @@
"tracelinks": "StRS-038; SwRS-026", "tracelinks": "StRS-038; SwRS-026",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Test-Pull-Request mit Ticketreferenz mergen, Build auslösen und automatischen Ticket-Eintrag verifizieren.", "pruefidee": "Test-Pull-Request mit Ticketreferenz mergen, Build auslösen und automatischen Ticket-Eintrag verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-036", "id": "SyRS-036",
@@ -1350,7 +1430,8 @@
"tracelinks": "StRS-041; SwRS-027", "tracelinks": "StRS-041; SwRS-027",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine Wartungsaufgabe gezielt zum Fehlschlagen bringen (z. B. durch inkonsistente Testdaten) und Fortsetzung der übrigen Aufgaben im selben Zyklus prüfen.", "pruefidee": "Eine Wartungsaufgabe gezielt zum Fehlschlagen bringen (z. B. durch inkonsistente Testdaten) und Fortsetzung der übrigen Aufgaben im selben Zyklus prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-037", "id": "SyRS-037",
@@ -1367,7 +1448,8 @@
"tracelinks": "StRS-042; SwRS-028", "tracelinks": "StRS-042; SwRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neuen Controller im Namensraum `Controllers.v2.*` anlegen und automatische Zuordnung zur API-Version 2 ohne weitere Konfiguration prüfen.", "pruefidee": "Neuen Controller im Namensraum `Controllers.v2.*` anlegen und automatische Zuordnung zur API-Version 2 ohne weitere Konfiguration prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-038", "id": "SyRS-038",
@@ -1383,7 +1465,8 @@
"tracelinks": "StRS-042; SwRS-028", "tracelinks": "StRS-042; SwRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Cross-Origin-Testanfrage von einer nicht autorisierten Domain senden und erfolgreiche CORS-Freigabe (statt Ablehnung) verifizieren; im Rahmen der Validierung mit Sicherheitsverantwortlichen klären, ob dies beabsichtigt ist.", "pruefidee": "Cross-Origin-Testanfrage von einer nicht autorisierten Domain senden und erfolgreiche CORS-Freigabe (statt Ablehnung) verifizieren; im Rahmen der Validierung mit Sicherheitsverantwortlichen klären, ob dies beabsichtigt ist.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-039", "id": "SyRS-039",
@@ -1399,7 +1482,8 @@
"tracelinks": "StRS-043; SwRS-029", "tracelinks": "StRS-043; SwRS-029",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Parallele API-Aufrufe (≥20 gleichzeitig) simulieren und korrekte, verlustfreie Bucket-Aggregation prüfen.", "pruefidee": "Parallele API-Aufrufe (≥20 gleichzeitig) simulieren und korrekte, verlustfreie Bucket-Aggregation prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-040", "id": "SyRS-040",
@@ -1416,7 +1500,8 @@
"tracelinks": "StRS-044; SwRS-030", "tracelinks": "StRS-044; SwRS-030",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-044.", "pruefidee": "Siehe StRS-044.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-041", "id": "SyRS-041",
@@ -1432,7 +1517,8 @@
"tracelinks": "StRS-039; SwRS-031", "tracelinks": "StRS-039; SwRS-031",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neues Modul ohne eine der beiden Implementierungen registrieren und Fehlverhalten/Registrierungsfehler beim Start prüfen.", "pruefidee": "Neues Modul ohne eine der beiden Implementierungen registrieren und Fehlverhalten/Registrierungsfehler beim Start prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-042", "id": "SyRS-042",
@@ -1448,7 +1534,8 @@
"tracelinks": "StRS-040; SwRS-032", "tracelinks": "StRS-040; SwRS-032",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Service-Aufruf mit `Accept-Language: en-US` senden und englische statt deutsche Fehlermeldung prüfen.", "pruefidee": "Web-Service-Aufruf mit `Accept-Language: en-US` senden und englische statt deutsche Fehlermeldung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-043", "id": "SyRS-043",
@@ -1465,7 +1552,8 @@
"tracelinks": "StRS-042; SwRS-033", "tracelinks": "StRS-042; SwRS-033",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lasttest mit sehr vielen parallelen/wiederholten Anfragen eines einzelnen Clients durchführen und Verhalten (Drosselung ja/nein) beobachten.", "pruefidee": "Lasttest mit sehr vielen parallelen/wiederholten Anfragen eines einzelnen Clients durchführen und Verhalten (Drosselung ja/nein) beobachten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-044", "id": "SyRS-044",
@@ -1481,6 +1569,7 @@
"tracelinks": "StRS-045; SwRS-034", "tracelinks": "StRS-045; SwRS-034",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-045.", "pruefidee": "Siehe StRS-045.",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (34 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (34 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 89 von 89 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 89 von 89 mit Tracelinks (100,0 %) |
@@ -97,6 +97,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -133,6 +135,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (84,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (84,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -150,6 +156,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 43 ungedeckt: SyRS-035 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 43 ungedeckt: SyRS-035 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 97 von 106 mit Tracelinks (91,5 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 97 von 106 mit Tracelinks (91,5 %) |
## Vergleich der drei Läufe (identischer Prompt) ## Vergleich der drei Läufe (identischer Prompt)
@@ -14,7 +14,8 @@
"tracelinks": "SyRS-013, SyRS-014, SwRS-001, SwRS-002, SwRS-003, SwRS-004", "tracelinks": "SyRS-013, SyRS-014, SwRS-001, SwRS-002, SwRS-003, SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "End-to-End-Test: Angebot anlegen → in Auftrag wandeln → in Rechnung wandeln; prüfen, dass Kundendaten, Positionen und Preise unverändert übernommen werden.", "pruefidee": "End-to-End-Test: Angebot anlegen → in Auftrag wandeln → in Rechnung wandeln; prüfen, dass Kundendaten, Positionen und Preise unverändert übernommen werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-002", "id": "StRS-002",
@@ -31,7 +32,8 @@
"tracelinks": "SyRS-001, SyRS-003", "tracelinks": "SyRS-001, SyRS-003",
"konsolidierung": "Kandidat: CRM-Kundendaten (`Kunden`-Tabelle) und Webaccount-Kundenportalzugang (StRS-018) könnten im Zielsystem als ein Identitätsmodell konsolidiert werden.", "konsolidierung": "Kandidat: CRM-Kundendaten (`Kunden`-Tabelle) und Webaccount-Kundenportalzugang (StRS-018) könnten im Zielsystem als ein Identitätsmodell konsolidiert werden.",
"pruefidee": "Neuen Kunden anlegen, Adresse/Kontaktperson hinzufügen, anschließend in einem Angebot referenzieren und Übernahme der Stammdaten prüfen.", "pruefidee": "Neuen Kunden anlegen, Adresse/Kontaktperson hinzufügen, anschließend in einem Angebot referenzieren und Übernahme der Stammdaten prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-003", "id": "StRS-003",
@@ -48,7 +50,8 @@
"tracelinks": "SyRS-013, SwRS-001, SwRS-009", "tracelinks": "SyRS-013, SwRS-001, SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit monatlichem Abrechnungsintervall anlegen, automatisierte Abrechnung aktivieren, Fälligkeitsdatum erreichen lassen (Testlauf) und Rechnungserzeugung prüfen.", "pruefidee": "Vertrag mit monatlichem Abrechnungsintervall anlegen, automatisierte Abrechnung aktivieren, Fälligkeitsdatum erreichen lassen (Testlauf) und Rechnungserzeugung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-004", "id": "StRS-004",
@@ -64,7 +67,8 @@
"tracelinks": "SyRS-013, SwRS-009, SwRS-010, SwRS-011", "tracelinks": "SyRS-013, SwRS-009, SwRS-010, SwRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMM-Dienst simuliert nicht erreichbar → Rechnungserstellung für RMM-Vertrag muss mit Fehlermeldung abbrechen, keine Teil-Rechnung darf erzeugt werden.", "pruefidee": "RMM-Dienst simuliert nicht erreichbar → Rechnungserstellung für RMM-Vertrag muss mit Fehlermeldung abbrechen, keine Teil-Rechnung darf erzeugt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-005", "id": "StRS-005",
@@ -81,7 +85,8 @@
"tracelinks": "SyRS-013, SyRS-014, SwRS-002", "tracelinks": "SyRS-013, SyRS-014, SwRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bestellvorschlag erzeugen, in Lieferantenbestellung wandeln, Lieferschein und Lieferantenrechnung erfassen; Mengen-/Preisübernahme prüfen.", "pruefidee": "Bestellvorschlag erzeugen, in Lieferantenbestellung wandeln, Lieferschein und Lieferantenrechnung erfassen; Mengen-/Preisübernahme prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-006", "id": "StRS-006",
@@ -98,7 +103,8 @@
"tracelinks": "SyRS-021, SyRS-022, SyRS-026, SwRS-026, SwRS-027, SwRS-028", "tracelinks": "SyRS-021, SyRS-022, SyRS-026, SwRS-026, SwRS-027, SwRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "EDI-Testdatei eines unterstützten Lieferantenformats bereitstellen, Download-Zyklus abwarten, Übernahme in c-entron-Beleg prüfen.", "pruefidee": "EDI-Testdatei eines unterstützten Lieferantenformats bereitstellen, Download-Zyklus abwarten, Übernahme in c-entron-Beleg prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-007", "id": "StRS-007",
@@ -115,7 +121,8 @@
"tracelinks": "SyRS-013, SwRS-001", "tracelinks": "SyRS-013, SwRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel anlegen, Lieferschein mit diesem Artikel buchen, Bestandsfortschreibung im Lagerbestand prüfen.", "pruefidee": "Artikel anlegen, Lieferschein mit diesem Artikel buchen, Bestandsfortschreibung im Lagerbestand prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-008", "id": "StRS-008",
@@ -132,7 +139,8 @@
"tracelinks": "SyRS-013, SwRS-007", "tracelinks": "SyRS-013, SwRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel mit gültigem Aktionspreis und externem API-Preis öffnen; Preismatrix muss beide Quellen gleichzeitig mit korrekter Kennzeichnung anzeigen.", "pruefidee": "Artikel mit gültigem Aktionspreis und externem API-Preis öffnen; Preismatrix muss beide Quellen gleichzeitig mit korrekter Kennzeichnung anzeigen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-009", "id": "StRS-009",
@@ -149,7 +157,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMA-Fall für retournierten Artikel anlegen, Status bis Abschluss verfolgen.", "pruefidee": "RMA-Fall für retournierten Artikel anlegen, Status bis Abschluss verfolgen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-010", "id": "StRS-010",
@@ -167,7 +176,8 @@
"tracelinks": "SyRS-003, SyRS-037, SwRS-034", "tracelinks": "SyRS-003, SyRS-037, SwRS-034",
"konsolidierung": "Kandidat: WPF-Helpdesk-Modul und Nexus-ServiceBoard bilden zwei parallele UI-Implementierungen derselben fachlichen Funktion – im Zielsystem konsolidierungsbedürftig.", "konsolidierung": "Kandidat: WPF-Helpdesk-Modul und Nexus-ServiceBoard bilden zwei parallele UI-Implementierungen derselben fachlichen Funktion – im Zielsystem konsolidierungsbedürftig.",
"pruefidee": "Ticket im WPF-Client anlegen, im Webportal auffindbar und bearbeitbar prüfen, Status bis \"geschlossen\" verfolgen.", "pruefidee": "Ticket im WPF-Client anlegen, im Webportal auffindbar und bearbeitbar prüfen, Status bis \"geschlossen\" verfolgen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-011", "id": "StRS-011",
@@ -183,7 +193,8 @@
"tracelinks": "SyRS-013, SwRS-034", "tracelinks": "SyRS-013, SwRS-034",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vorlage mit Modus \"Group\" anlegen, als Standard setzen, aus Auftrag Tickets erzeugen lassen; genau ein Sammelticket mit Vorlagenwerten muss entstehen.", "pruefidee": "Vorlage mit Modus \"Group\" anlegen, als Standard setzen, aus Auftrag Tickets erzeugen lassen; genau ein Sammelticket mit Vorlagenwerten muss entstehen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-012", "id": "StRS-012",
@@ -200,7 +211,8 @@
"tracelinks": "SyRS-011, SwRS-014", "tracelinks": "SyRS-011, SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne das entsprechende Recht öffnet Timer-Billing-Einstellungen; Datumseingabe für Rechnungs-/Lieferscheindatum muss gesperrt sein und ein Hinweisfeld anzeigen.", "pruefidee": "Benutzer ohne das entsprechende Recht öffnet Timer-Billing-Einstellungen; Datumseingabe für Rechnungs-/Lieferscheindatum muss gesperrt sein und ein Hinweisfeld anzeigen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-013", "id": "StRS-013",
@@ -217,7 +229,8 @@
"tracelinks": "SyRS-011, SwRS-012, SwRS-013, SwRS-014", "tracelinks": "SyRS-011, SwRS-012, SwRS-013, SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Mahnlauf mit Benutzer ohne Mahnungsrecht auslösen → Abbruch mit Fehlermeldung; mit berechtigtem Benutzer → korrekte Mahnstufenzuordnung je Kunde.", "pruefidee": "Mahnlauf mit Benutzer ohne Mahnungsrecht auslösen → Abbruch mit Fehlermeldung; mit berechtigtem Benutzer → korrekte Mahnstufenzuordnung je Kunde.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-014", "id": "StRS-014",
@@ -233,7 +246,8 @@
"tracelinks": "SyRS-011, SwRS-013, SwRS-014", "tracelinks": "SyRS-011, SwRS-013, SwRS-014",
"konsolidierung": "Kandidat: OPOS und Mahnwesen (StRS-013) teilen dieselbe Rechteschutz-Idiom (`ThrowIfUserHasInsufficentRights`) und denselben fachlichen Kontext (Zahlungsüberwachung) – ggf. im Zielsystem als ein \"Forderungsmanagement\"-Baustein konsolidierbar.", "konsolidierung": "Kandidat: OPOS und Mahnwesen (StRS-013) teilen dieselbe Rechteschutz-Idiom (`ThrowIfUserHasInsufficentRights`) und denselben fachlichen Kontext (Zahlungsüberwachung) – ggf. im Zielsystem als ein \"Forderungsmanagement\"-Baustein konsolidierbar.",
"pruefidee": "OPOS-Lauf durch nicht berechtigten Benutzer auslösen → Abbruch; Saldenkontrolle einer Testrechnung mit Teilzahlung.", "pruefidee": "OPOS-Lauf durch nicht berechtigten Benutzer auslösen → Abbruch; Saldenkontrolle einer Testrechnung mit Teilzahlung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-015", "id": "StRS-015",
@@ -250,7 +264,8 @@
"tracelinks": "SyRS-023, SyRS-024, SwRS-029, SwRS-030", "tracelinks": "SyRS-023, SyRS-024, SwRS-029, SwRS-030",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit mehreren Steuersätzen erzeugen, ZUGFeRD-Export prüfen (KOSIT-Validator), Summenabgleich innerhalb der Toleranz verifizieren.", "pruefidee": "Rechnung mit mehreren Steuersätzen erzeugen, ZUGFeRD-Export prüfen (KOSIT-Validator), Summenabgleich innerhalb der Toleranz verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-016", "id": "StRS-016",
@@ -267,7 +282,8 @@
"tracelinks": "SyRS-011, SyRS-012, SwRS-014, SwRS-015, SwRS-016", "tracelinks": "SyRS-011, SyRS-012, SwRS-014, SwRS-015, SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Recht \"Kunde anlegen\" versucht, einen Kunden anzulegen → UI-Funktion ist deaktiviert und BL-Aufruf liefert Fehlermeldung \"Fehlende Rechte...\".", "pruefidee": "Benutzer ohne Recht \"Kunde anlegen\" versucht, einen Kunden anzulegen → UI-Funktion ist deaktiviert und BL-Aufruf liefert Fehlermeldung \"Fehlende Rechte...\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-017", "id": "StRS-017",
@@ -284,7 +300,8 @@
"tracelinks": "SyRS-018, SwRS-021", "tracelinks": "SyRS-018, SwRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde ohne Lizenz für Modul X öffnet c-entron → Modul ist nicht im Modul-Menü sichtbar (`ModuleRegistration.IsModuleAvailable`).", "pruefidee": "Kunde ohne Lizenz für Modul X öffnet c-entron → Modul ist nicht im Modul-Menü sichtbar (`ModuleRegistration.IsModuleAvailable`).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-018", "id": "StRS-018",
@@ -301,7 +318,8 @@
"tracelinks": "SyRS-003, SyRS-037, SwRS-001", "tracelinks": "SyRS-003, SyRS-037, SwRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Als Webaccount-Nutzer Artikel in Warenkorb legen, Freigabe anfordern, als Freigebender genehmigen, Status \"bestellbereit\" prüfen.", "pruefidee": "Als Webaccount-Nutzer Artikel in Warenkorb legen, Freigabe anfordern, als Freigebender genehmigen, Status \"bestellbereit\" prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-019", "id": "StRS-019",
@@ -317,7 +335,8 @@
"tracelinks": "SyRS-011, SyRS-012", "tracelinks": "SyRS-011, SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Webaccount-Nutzer desselben Kunden mit unterschiedlicher Ticket-Sichtbarkeitskonfiguration anlegen; prüfen, dass jeder nur die für ihn freigegebenen Tickets sieht.", "pruefidee": "Zwei Webaccount-Nutzer desselben Kunden mit unterschiedlicher Ticket-Sichtbarkeitskonfiguration anlegen; prüfen, dass jeder nur die für ihn freigegebenen Tickets sieht.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-020", "id": "StRS-020",
@@ -333,7 +352,8 @@
"tracelinks": "SyRS-038", "tracelinks": "SyRS-038",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "E-Mail in Outlook öffnen, Add-in nutzen, um ein neues Ticket zu erstellen; Ticket muss im c-entron-System mit E-Mail-Bezug erscheinen.", "pruefidee": "E-Mail in Outlook öffnen, Add-in nutzen, um ein neues Ticket zu erstellen; Ticket muss im c-entron-System mit E-Mail-Bezug erscheinen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-021", "id": "StRS-021",
@@ -349,7 +369,8 @@
"tracelinks": "SyRS-027, SwRS-031, SwRS-032", "tracelinks": "SyRS-027, SwRS-031, SwRS-032",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Helpdesk-Zeit in c-entron anlegen (Datum X), Sync abwarten, Termin in Outlook manuell auf Datum Y ändern, erneut synchronisieren → c-entron-Datensatz muss weiterhin Datum X zeigen.", "pruefidee": "Helpdesk-Zeit in c-entron anlegen (Datum X), Sync abwarten, Termin in Outlook manuell auf Datum Y ändern, erneut synchronisieren → c-entron-Datensatz muss weiterhin Datum X zeigen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-022", "id": "StRS-022",
@@ -366,7 +387,8 @@
"tracelinks": "SyRS-003", "tracelinks": "SyRS-003",
"konsolidierung": "Kandidat: GLS-Direktanbindung und Shipcloud-Aggregator decken teils überlappende Funktionalität ab – im Zielsystem auf einen Versand-Abstraktionsdienst konsolidierbar.", "konsolidierung": "Kandidat: GLS-Direktanbindung und Shipcloud-Aggregator decken teils überlappende Funktionalität ab – im Zielsystem auf einen Versand-Abstraktionsdienst konsolidierbar.",
"pruefidee": "Lieferschein abschließen, Versandlabel über GLS/Shipcloud erzeugen, Tracking-Nummer im Beleg prüfen.", "pruefidee": "Lieferschein abschließen, Versandlabel über GLS/Shipcloud erzeugen, Tracking-Nummer im Beleg prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-023", "id": "StRS-023",
@@ -382,7 +404,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Artikel mit bekanntem Herstellercode über Icecat-Abgleich anreichern lassen, Ergebnis (Beschreibung/Bild) im Artikelstamm prüfen.", "pruefidee": "Artikel mit bekanntem Herstellercode über Icecat-Abgleich anreichern lassen, Ergebnis (Beschreibung/Bild) im Artikelstamm prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-024", "id": "StRS-024",
@@ -399,7 +422,8 @@
"tracelinks": "SyRS-013, StRS-014", "tracelinks": "SyRS-013, StRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testkonto über finAPI-Sandbox verbinden, Transaktionsimport auslösen, Zuordnung zu offener Rechnung prüfen.", "pruefidee": "Testkonto über finAPI-Sandbox verbinden, Transaktionsimport auslösen, Zuordnung zu offener Rechnung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-025", "id": "StRS-025",
@@ -415,7 +439,8 @@
"tracelinks": "SyRS-013, StRS-004", "tracelinks": "SyRS-013, StRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gerät mit docuFORM verknüpfen, Zählerstand-Abfrage auslösen, Übernahme in Vertragskontingent-Verbrauch (StRS-004) prüfen.", "pruefidee": "Gerät mit docuFORM verknüpfen, Zählerstand-Abfrage auslösen, Übernahme in Vertragskontingent-Verbrauch (StRS-004) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-026", "id": "StRS-026",
@@ -431,7 +456,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Verkaufsstatistik für definierten Zeitraum abrufen und Summenkontrolle gegen manuell aggregierte Belegdaten durchführen.", "pruefidee": "Verkaufsstatistik für definierten Zeitraum abrufen und Summenkontrolle gegen manuell aggregierte Belegdaten durchführen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-027", "id": "StRS-027",
@@ -448,7 +474,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit \"nur eigene Filiale\"-Recht sucht Belege → nur Belege der eigenen Filiale werden zurückgegeben.", "pruefidee": "Benutzer mit \"nur eigene Filiale\"-Recht sucht Belege → nur Belege der eigenen Filiale werden zurückgegeben.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-028", "id": "StRS-028",
@@ -464,7 +491,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Modul öffnen und konkrete Funktionen (Auskunft/Löschung/Anonymisierung) inventarisieren; mit Datenschutzbeauftragtem abgleichen.", "pruefidee": "Modul öffnen und konkrete Funktionen (Auskunft/Löschung/Anonymisierung) inventarisieren; mit Datenschutzbeauftragtem abgleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-029", "id": "StRS-029",
@@ -481,7 +509,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Chat-Assistenten mit Testanfrage aufrufen, Antwortverhalten und Rechteschutz (Mandanten-/Filial-/Mitarbeiterebene) prüfen.", "pruefidee": "Chat-Assistenten mit Testanfrage aufrufen, Antwortverhalten und Rechteschutz (Mandanten-/Filial-/Mitarbeiterebene) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-030", "id": "StRS-030",
@@ -497,7 +526,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gleiche fachliche Aktion (z. B. Kunde anlegen) einmal über Direktverbindung, einmal über Webservice-Verbindung ausführen; Ergebnis muss identisch sein.", "pruefidee": "Gleiche fachliche Aktion (z. B. Kunde anlegen) einmal über Direktverbindung, einmal über Webservice-Verbindung ausführen; Ergebnis muss identisch sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-001", "id": "SyRS-001",
@@ -513,7 +543,8 @@
"tracelinks": "StRS-030", "tracelinks": "StRS-030",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Codeprüfung: Für ein Stichprobenmodul existieren `I*Logic`, `BL*Logic`, `WS*Logic` mit identischer Methodensignatur.", "pruefidee": "Statische Codeprüfung: Für ein Stichprobenmodul existieren `I*Logic`, `BL*Logic`, `WS*Logic` mit identischer Methodensignatur.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-002", "id": "SyRS-002",
@@ -529,7 +560,8 @@
"tracelinks": "StRS-030", "tracelinks": "StRS-030",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "BL-Methode mit provoziertem Fehler aufrufen; Response muss `StatusCode.Failed` mit aussagekräftiger `Message` liefern, kein unbehandelter Exception-Durchschlag zum Client.", "pruefidee": "BL-Methode mit provoziertem Fehler aufrufen; Response muss `StatusCode.Failed` mit aussagekräftiger `Message` liefern, kein unbehandelter Exception-Durchschlag zum Client.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-003", "id": "SyRS-003",
@@ -545,7 +577,8 @@
"tracelinks": "StRS-002, StRS-010, StRS-018, StRS-022", "tracelinks": "StRS-002, StRS-010, StRS-018, StRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gleichen Endpunkt von WPF-Client und einer unabhängigen HTTP-Anfrage (z. B. curl) mit gültigem Ticket aufrufen; identisches Ergebnis erwarten.", "pruefidee": "Gleichen Endpunkt von WPF-Client und einer unabhängigen HTTP-Anfrage (z. B. curl) mit gültigem Ticket aufrufen; identisches Ergebnis erwarten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-004", "id": "SyRS-004",
@@ -561,7 +594,8 @@
"tracelinks": "SyRS-003", "tracelinks": "SyRS-003",
"konsolidierung": "Kandidat: Legacy-WCF-Bridge (SyRS-004) und moderne v1-Controller (SyRS-005) bilden zwei parallele API-Generationen für teils gleiche fachliche Funktionen (z. B. Kunden/Aufträge existieren in beiden) – zentraler Konsolidierungskandidat für die Web-/SaaS-Neuimplementierung.", "konsolidierung": "Kandidat: Legacy-WCF-Bridge (SyRS-004) und moderne v1-Controller (SyRS-005) bilden zwei parallele API-Generationen für teils gleiche fachliche Funktionen (z. B. Kunden/Aufträge existieren in beiden) – zentraler Konsolidierungskandidat für die Web-/SaaS-Neuimplementierung.",
"pruefidee": "Bestandsmethode aus `ICentronRestService` über `/REST/<Name>` aufrufen und Antwortformat/-inhalt gegen Erwartung prüfen.", "pruefidee": "Bestandsmethode aus `ICentronRestService` über `/REST/<Name>` aufrufen und Antwortformat/-inhalt gegen Erwartung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-005", "id": "SyRS-005",
@@ -577,7 +611,8 @@
"tracelinks": "SyRS-004", "tracelinks": "SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`GET v1/customers/{id}` mit gültigem Token aufrufen und Response-Schema gegen DTO-Definition prüfen.", "pruefidee": "`GET v1/customers/{id}` mit gültigem Token aufrufen und Response-Schema gegen DTO-Definition prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-006", "id": "SyRS-006",
@@ -593,7 +628,8 @@
"tracelinks": "StRS-010", "tracelinks": "StRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Clients verbinden, Chat-Nachricht von Client A senden, Zustellzeit/-inhalt bei Client B prüfen.", "pruefidee": "Zwei Clients verbinden, Chat-Nachricht von Client A senden, Zustellzeit/-inhalt bei Client B prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-007", "id": "SyRS-007",
@@ -610,7 +646,8 @@
"tracelinks": "StRS-016", "tracelinks": "StRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Mit abgelaufenem Ticket einen geschützten Endpunkt aufrufen → Antwort 401.", "pruefidee": "Mit abgelaufenem Ticket einen geschützten Endpunkt aufrufen → Antwort 401.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-008", "id": "SyRS-008",
@@ -626,7 +663,8 @@
"tracelinks": "StRS-016", "tracelinks": "StRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anmeldung mit verknüpftem Microsoft-Testkonto durchführen, gültiges Ticket erhalten; Anmeldung mit nicht verknüpftem Konto → Fehler.", "pruefidee": "Anmeldung mit verknüpftem Microsoft-Testkonto durchführen, gültiges Ticket erhalten; Anmeldung mit nicht verknüpftem Konto → Fehler.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-009", "id": "SyRS-009",
@@ -642,7 +680,8 @@
"tracelinks": "StRS-016", "tracelinks": "StRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Access Token erstellen, damit Aufruf durchführen (Erfolg), Token deaktivieren, gleichen Aufruf wiederholen (Ablehnung).", "pruefidee": "Access Token erstellen, damit Aufruf durchführen (Erfolg), Token deaktivieren, gleichen Aufruf wiederholen (Ablehnung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-010", "id": "SyRS-010",
@@ -659,7 +698,8 @@
"tracelinks": "StRS-016", "tracelinks": "StRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "2FA aktivieren, Anmeldung ohne zweiten Faktor → Ablehnung; mit korrektem RADIUS-Code → Erfolg.", "pruefidee": "2FA aktivieren, Anmeldung ohne zweiten Faktor → Ablehnung; mit korrektem RADIUS-Code → Erfolg.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-011", "id": "SyRS-011",
@@ -676,7 +716,8 @@
"tracelinks": "StRS-016, StRS-013, StRS-014", "tracelinks": "StRS-016, StRS-013, StRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Endpunkt mit `[AuthorizeUserRight(X)]` durch Benutzer ohne Recht X aufrufen → 401/403; mit Recht X → Erfolg.", "pruefidee": "Endpunkt mit `[AuthorizeUserRight(X)]` durch Benutzer ohne Recht X aufrufen → 401/403; mit Recht X → Erfolg.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-012", "id": "SyRS-012",
@@ -692,7 +733,8 @@
"tracelinks": "StRS-027, SyRS-011", "tracelinks": "StRS-027, SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Filialbeschränkter Benutzer sucht Belege anderer Filialen über direkten API-Aufruf (nicht UI) → Ergebnis darf keine fremden Filialbelege enthalten.", "pruefidee": "Filialbeschränkter Benutzer sucht Belege anderer Filialen über direkten API-Aufruf (nicht UI) → Ergebnis darf keine fremden Filialbelege enthalten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-013", "id": "SyRS-013",
@@ -709,7 +751,8 @@
"tracelinks": "StRS-001, StRS-003, StRS-005, StRS-007, StRS-008, StRS-010, StRS-011, StRS-018, StRS-023, StRS-024, StRS-025, StRS-026, StRS-029, SwRS-004", "tracelinks": "StRS-001, StRS-003, StRS-005, StRS-007, StRS-008, StRS-010, StRS-011, StRS-018, StRS-023, StRS-024, StRS-025, StRS-026, StRS-029, SwRS-004",
"konsolidierung": "Kandidat: Die Legacy-Spiegeltabellen (`Entities/DbEntities/AufKopf.cs` u. a.) führen ein rein numerisches `Status`-Feld (kein Enum) parallel zum modernen `ReceiptState`-Enum – im Zielsystem auf ein einziges Statusmodell konsolidierungsbedürftig.", "konsolidierung": "Kandidat: Die Legacy-Spiegeltabellen (`Entities/DbEntities/AufKopf.cs` u. a.) führen ein rein numerisches `Status`-Feld (kein Enum) parallel zum modernen `ReceiptState`-Enum – im Zielsystem auf ein einziges Statusmodell konsolidierungsbedürftig.",
"pruefidee": "Beleg stornieren, danach Versuch, ihn in einen Folgebeleg zu wandeln → muss vom System verhindert werden.", "pruefidee": "Beleg stornieren, danach Versuch, ihn in einen Folgebeleg zu wandeln → muss vom System verhindert werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-014", "id": "SyRS-014",
@@ -725,7 +768,8 @@
"tracelinks": "StRS-001, StRS-005, SwRS-002, SwRS-003", "tracelinks": "StRS-001, StRS-005, SwRS-002, SwRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testweise inkonsistente `CanBeForwardedFrom`/`CanBeForwardedInto`-Konfiguration einspielen → Systemstart muss mit `ApplicationException` fehlschlagen.", "pruefidee": "Testweise inkonsistente `CanBeForwardedFrom`/`CanBeForwardedInto`-Konfiguration einspielen → Systemstart muss mit `ApplicationException` fehlschlagen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-015", "id": "SyRS-015",
@@ -741,7 +785,8 @@
"tracelinks": "StRS-001, SwRS-005", "tracelinks": "StRS-001, SwRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg mehrfach ändern und speichern; Anzahl und Inhalt der Einträge in `<Typ>KopfVersions` gegen die Änderungshistorie prüfen.", "pruefidee": "Beleg mehrfach ändern und speichern; Anzahl und Inhalt der Einträge in `<Typ>KopfVersions` gegen die Änderungshistorie prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-016", "id": "SyRS-016",
@@ -758,7 +803,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stichprobenprüfung mehrerer neuerer Tabellen (z. B. `HelpdeskCreationTemplate`) auf Einhaltung aller Konventionspunkte.", "pruefidee": "Stichprobenprüfung mehrerer neuerer Tabellen (z. B. `HelpdeskCreationTemplate`) auf Einhaltung aller Konventionspunkte.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-017", "id": "SyRS-017",
@@ -775,7 +821,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anwendung mit älterer DB-Version starten und Ausführung aller ausstehenden Skripte in der Konsolenausgabe verifizieren (vgl. Testvorgehen in `docs/guides/database/create-scripts.md`).", "pruefidee": "Anwendung mit älterer DB-Version starten und Ausführung aller ausstehenden Skripte in der Konsolenausgabe verifizieren (vgl. Testvorgehen in `docs/guides/database/create-scripts.md`).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-018", "id": "SyRS-018",
@@ -791,7 +838,8 @@
"tracelinks": "StRS-017", "tracelinks": "StRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lizenz mit `count=0` bzw. abgelaufenem Datum simulieren → betroffene Funktion muss verweigert werden.", "pruefidee": "Lizenz mit `count=0` bzw. abgelaufenem Datum simulieren → betroffene Funktion muss verweigert werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-019", "id": "SyRS-019",
@@ -807,7 +855,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "UI-Kultur auf Englisch umstellen, Stichprobe von Dialogen auf vollständige Übersetzung prüfen.", "pruefidee": "UI-Kultur auf Englisch umstellen, Stichprobe von Dialogen auf vollständige Übersetzung prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-020", "id": "SyRS-020",
@@ -823,7 +872,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stichprobenprüfung der Byte-Order-Mark in neu committeten `.cs`-Dateien.", "pruefidee": "Stichprobenprüfung der Byte-Order-Mark in neu committeten `.cs`-Dateien.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-021", "id": "SyRS-021",
@@ -839,7 +889,8 @@
"tracelinks": "StRS-006", "tracelinks": "StRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testdatei auf konfiguriertem SFTP-Server ablegen, 30-Minuten-Zyklus abwarten, Verarbeitung im `EDIManagementLog` prüfen.", "pruefidee": "Testdatei auf konfiguriertem SFTP-Server ablegen, 30-Minuten-Zyklus abwarten, Verarbeitung im `EDIManagementLog` prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-022", "id": "SyRS-022",
@@ -855,7 +906,8 @@
"tracelinks": "StRS-006, SyRS-021", "tracelinks": "StRS-006, SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Datei erzeugen, die 4-mal hintereinander einen Parsing-Fehler auslöst; fünfter Verarbeitungsversuch darf nicht mehr erfolgen.", "pruefidee": "Datei erzeugen, die 4-mal hintereinander einen Parsing-Fehler auslöst; fünfter Verarbeitungsversuch darf nicht mehr erfolgen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-023", "id": "SyRS-023",
@@ -871,7 +923,8 @@
"tracelinks": "StRS-015", "tracelinks": "StRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit Reverse-Charge-Position erzeugen; generierte XML muss Tax-Category \"AE\" und den vorgeschriebenen Befreiungstext enthalten.", "pruefidee": "Rechnung mit Reverse-Charge-Position erzeugen; generierte XML muss Tax-Category \"AE\" und den vorgeschriebenen Befreiungstext enthalten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-024", "id": "SyRS-024",
@@ -887,7 +940,8 @@
"tracelinks": "StRS-015, SyRS-023", "tracelinks": "StRS-015, SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testrechnung mit künstlicher Summenabweichung von 5,00 erzeugen → ZUGFeRD-Export muss mit Fehler abbrechen.", "pruefidee": "Testrechnung mit künstlicher Summenabweichung von 5,00 erzeugen → ZUGFeRD-Export muss mit Fehler abbrechen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-025", "id": "SyRS-025",
@@ -903,7 +957,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine Wartungsaufgabe künstlich zum Fehlschlagen bringen; nachfolgende Aufgaben im selben Zyklus müssen dennoch ausgeführt werden (Log-Analyse).", "pruefidee": "Eine Wartungsaufgabe künstlich zum Fehlschlagen bringen; nachfolgende Aufgaben im selben Zyklus müssen dennoch ausgeführt werden (Log-Analyse).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-026", "id": "SyRS-026",
@@ -919,7 +974,8 @@
"tracelinks": "StRS-006, SyRS-021", "tracelinks": "StRS-006, SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Webservice ohne verbundenen WPF-Client betreiben; EDI-Abruf muss dennoch planmäßig laufen (Log-Zeitstempel prüfen).", "pruefidee": "Webservice ohne verbundenen WPF-Client betreiben; EDI-Abruf muss dennoch planmäßig laufen (Log-Zeitstempel prüfen).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-027", "id": "SyRS-027",
@@ -935,7 +991,8 @@
"tracelinks": "StRS-021", "tracelinks": "StRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Termin in Outlook (Exchange Online) ändern, 60s abwarten, Änderung in Nexus/c-entron prüfen; gleichen Test für On-Premise-Exchange wiederholen und Einschränkungen verifizieren.", "pruefidee": "Termin in Outlook (Exchange Online) ändern, 60s abwarten, Änderung in Nexus/c-entron prüfen; gleichen Test für On-Premise-Exchange wiederholen und Einschränkungen verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-028", "id": "SyRS-028",
@@ -951,7 +1008,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "In DEBUG-Build Mailversand an externe Testadresse auslösen → tatsächlicher Empfänger muss `test@nexoware.com` sein.", "pruefidee": "In DEBUG-Build Mailversand an externe Testadresse auslösen → tatsächlicher Empfänger muss `test@nexoware.com` sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-029", "id": "SyRS-029",
@@ -968,7 +1026,8 @@
"tracelinks": "SyRS-003", "tracelinks": "SyRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lasttest mit hoher Anfragefrequenz gegen einen ungeschützten Webservice-Endpunkt durchführen und Systemverhalten (Verfügbarkeit, Ressourcenverbrauch) beobachten.", "pruefidee": "Lasttest mit hoher Anfragefrequenz gegen einen ungeschützten Webservice-Endpunkt durchführen und Systemverhalten (Verfügbarkeit, Ressourcenverbrauch) beobachten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-030", "id": "SyRS-030",
@@ -984,7 +1043,8 @@
"tracelinks": "SyRS-003", "tracelinks": "SyRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Cross-Origin-Testanfrage von einer Fremd-Domain mit gültigem Ticket absetzen und Antwortverhalten (CORS-Header) prüfen.", "pruefidee": "Cross-Origin-Testanfrage von einer Fremd-Domain mit gültigem Ticket absetzen und Antwortverhalten (CORS-Header) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-031", "id": "SyRS-031",
@@ -1002,7 +1062,8 @@
"tracelinks": "SyRS-033", "tracelinks": "SyRS-033",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Repository-Historie auf enthaltene Zugangsdaten scannen (z. B. mit Secret-Scanning-Tool); Empfehlung: Rotation aller im Repository sichtbaren Geheimnisse.", "pruefidee": "Repository-Historie auf enthaltene Zugangsdaten scannen (z. B. mit Secret-Scanning-Tool); Empfehlung: Rotation aller im Repository sichtbaren Geheimnisse.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-032", "id": "SyRS-032",
@@ -1018,7 +1079,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vollständige Neuinstallation aller drei Komponenten in einer sauberen Testumgebung durchführen und Aufwand/Abhängigkeiten dokumentieren.", "pruefidee": "Vollständige Neuinstallation aller drei Komponenten in einer sauberen Testumgebung durchführen und Aufwand/Abhängigkeiten dokumentieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-033", "id": "SyRS-033",
@@ -1035,7 +1097,8 @@
"tracelinks": "SyRS-031, SyRS-032", "tracelinks": "SyRS-031, SyRS-032",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Service unter Ubuntu/Debian gemäß Anleitung installieren und Funktionsumfang gegen Windows-Betrieb vergleichen (insbesondere Sub-Web-Services).", "pruefidee": "Web-Service unter Ubuntu/Debian gemäß Anleitung installieren und Funktionsumfang gegen Windows-Betrieb vergleichen (insbesondere Sub-Web-Services).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-034", "id": "SyRS-034",
@@ -1052,7 +1115,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "Kandidat: Parallel gepflegte Azure-DevOps-Pipelines (`azure/*`, `azure-blazor/*`) und neuere GitHub-Actions-Workflows decken teils dieselben Build-/Test-Schritte ab – Konsolidierungskandidat.", "konsolidierung": "Kandidat: Parallel gepflegte Azure-DevOps-Pipelines (`azure/*`, `azure-blazor/*`) und neuere GitHub-Actions-Workflows decken teils dieselben Build-/Test-Schritte ab – Konsolidierungskandidat.",
"pruefidee": "Pull Request mit Ticketreferenz mergen; Build-Version muss automatisch im referenzierten Ticket hinterlegt werden.", "pruefidee": "Pull Request mit Ticketreferenz mergen; Build-Version muss automatisch im referenzierten Ticket hinterlegt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-035", "id": "SyRS-035",
@@ -1068,7 +1132,8 @@
"tracelinks": "SyRS-034", "tracelinks": "SyRS-034",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bekannte, absichtlich eingefügte Testschwachstelle in einem Feature-Branch committen und CodeQL-Erkennung im nächsten Lauf prüfen.", "pruefidee": "Bekannte, absichtlich eingefügte Testschwachstelle in einem Feature-Branch committen und CodeQL-Erkennung im nächsten Lauf prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-036", "id": "SyRS-036",
@@ -1085,7 +1150,8 @@
"tracelinks": "SyRS-034", "tracelinks": "SyRS-034",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Denselben EndToEnd-Test zweimal hintereinander ausführen und Ergebnisidentität prüfen.", "pruefidee": "Denselben EndToEnd-Test zweimal hintereinander ausführen und Ergebnisidentität prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-037", "id": "SyRS-037",
@@ -1102,7 +1168,8 @@
"tracelinks": "StRS-010, StRS-018, StRS-019, StRS-020, StRS-021", "tracelinks": "StRS-010, StRS-018, StRS-019, StRS-020, StRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nexus ohne installierten WPF-Client betreiben und vollständigen Kundenportal-Workflow (StRS-018) end-to-end durchführen.", "pruefidee": "Nexus ohne installierten WPF-Client betreiben und vollständigen Kundenportal-Workflow (StRS-018) end-to-end durchführen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-038", "id": "SyRS-038",
@@ -1118,7 +1185,8 @@
"tracelinks": "StRS-020", "tracelinks": "StRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Add-in gemäß Manifest in Outlook (Desktop und Web) installieren und Grundfunktion (Ticket aus E-Mail erstellen) prüfen.", "pruefidee": "Add-in gemäß Manifest in Outlook (Desktop und Web) installieren und Grundfunktion (Ticket aus E-Mail erstellen) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-001", "id": "SwRS-001",
@@ -1134,7 +1202,8 @@
"tracelinks": "SyRS-013, SyRS-015", "tracelinks": "SyRS-013, SyRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neues gemeinsames Kopf-Feld in `ReceiptBase` hinzufügen und Sichtbarkeit in allen sieben abgeleiteten Belegtypen ohne Zusatzaufwand prüfen.", "pruefidee": "Neues gemeinsames Kopf-Feld in `ReceiptBase` hinzufügen und Sichtbarkeit in allen sieben abgeleiteten Belegtypen ohne Zusatzaufwand prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-002", "id": "SwRS-002",
@@ -1150,7 +1219,8 @@
"tracelinks": "SyRS-013, SyRS-014, SwRS-001", "tracelinks": "SyRS-013, SyRS-014, SwRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für Belegtyp \"Rechnung\" prüfen, dass `CanBeForwardedInto` ausschließlich `CreditVoucherClass` erlaubt; Versuch, eine Rechnung in einen Auftrag zu wandeln, muss abgelehnt werden.", "pruefidee": "Für Belegtyp \"Rechnung\" prüfen, dass `CanBeForwardedInto` ausschließlich `CreditVoucherClass` erlaubt; Versuch, eine Rechnung in einen Auftrag zu wandeln, muss abgelehnt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-003", "id": "SwRS-003",
@@ -1166,7 +1236,8 @@
"tracelinks": "SyRS-014, SwRS-002", "tracelinks": "SyRS-014, SwRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-Test: `ValidateConsistency()` mit absichtlich asymmetrischer Testkonfiguration aufrufen → `ApplicationException` erwarten.", "pruefidee": "Unit-Test: `ValidateConsistency()` mit absichtlich asymmetrischer Testkonfiguration aufrufen → `ApplicationException` erwarten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-004", "id": "SwRS-004",
@@ -1183,7 +1254,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "Kandidat: Konsolidierung von `ReceiptState`-Enum und Legacy-`Status`/`FreigabeStatus`-Feldern zu einem einzigen Statusmodell im Zielsystem.", "konsolidierung": "Kandidat: Konsolidierung von `ReceiptState`-Enum und Legacy-`Status`/`FreigabeStatus`-Feldern zu einem einzigen Statusmodell im Zielsystem.",
"pruefidee": "Beleg-Statuswechsel auslösen und beide Felder (`ReceiptState` auf modernem Entity, `Status` in Legacy-Tabelle `AufKopf`) per SQL-Abfrage vergleichen.", "pruefidee": "Beleg-Statuswechsel auslösen und beide Felder (`ReceiptState` auf modernem Entity, `Status` in Legacy-Tabelle `AufKopf`) per SQL-Abfrage vergleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-005", "id": "SwRS-005",
@@ -1199,7 +1271,8 @@
"tracelinks": "SyRS-015, SyRS-016", "tracelinks": "SyRS-015, SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Spalte nur in Basistabelle und modernem Entity hinzufügen (bewusst unvollständig) → Speichern über `SaveReceipt*Repository` muss den Wert NICHT persistieren (Nachweis des dokumentierten Fehlerbilds).", "pruefidee": "Neue Spalte nur in Basistabelle und modernem Entity hinzufügen (bewusst unvollständig) → Speichern über `SaveReceipt*Repository` muss den Wert NICHT persistieren (Nachweis des dokumentierten Fehlerbilds).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-006", "id": "SwRS-006",
@@ -1215,7 +1288,8 @@
"tracelinks": "SyRS-015, SwRS-005", "tracelinks": "SyRS-015, SwRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "End-to-End-Test gemäß Empfehlung der Dokumentation: Feld setzen, speichern, Beleg neu laden, Rohwert in Legacy-Tabelle per SQL prüfen.", "pruefidee": "End-to-End-Test gemäß Empfehlung der Dokumentation: Feld setzen, speichern, Beleg neu laden, Rohwert in Legacy-Tabelle per SQL prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-007", "id": "SwRS-007",
@@ -1231,7 +1305,8 @@
"tracelinks": "StRS-008, SyRS-013", "tracelinks": "StRS-008, SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg mit gemischten Steuersätzen (7 %/19 %) anlegen; Summenberechnung je Steuersatzgruppe manuell nachrechnen und mit Systemergebnis vergleichen.", "pruefidee": "Beleg mit gemischten Steuersätzen (7 %/19 %) anlegen; Summenberechnung je Steuersatzgruppe manuell nachrechnen und mit Systemergebnis vergleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-008", "id": "SwRS-008",
@@ -1247,7 +1322,8 @@
"tracelinks": "StRS-008, SyRS-013, SwRS-007", "tracelinks": "StRS-008, SyRS-013, SwRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Steuersatzänderung zu einem Stichtag anlegen; Beleg mit Datum vor und nach dem Stichtag erzeugen und jeweils angewandten Steuersatz prüfen.", "pruefidee": "Steuersatzänderung zu einem Stichtag anlegen; Beleg mit Datum vor und nach dem Stichtag erzeugen und jeweils angewandten Steuersatz prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-009", "id": "SwRS-009",
@@ -1263,7 +1339,8 @@
"tracelinks": "StRS-003, StRS-004", "tracelinks": "StRS-003, StRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit Kontingent 10h anlegen, 4h verbrauchen, Position nachträglich auf 6h Verbrauch ändern; Kontingentsaldo muss korrekt auf 4h Rest aktualisiert werden.", "pruefidee": "Vertrag mit Kontingent 10h anlegen, 4h verbrauchen, Position nachträglich auf 6h Verbrauch ändern; Kontingentsaldo muss korrekt auf 4h Rest aktualisiert werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-010", "id": "SwRS-010",
@@ -1279,7 +1356,8 @@
"tracelinks": "StRS-004, SwRS-011", "tracelinks": "StRS-004, SwRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung für RMM-Vertrag mit Platzhalter `@@RMMArtikel@@` im Textbaustein erzeugen; RMM-Position muss exakt an der Platzhalterstelle erscheinen und der Platzhaltertext entfernt sein.", "pruefidee": "Rechnung für RMM-Vertrag mit Platzhalter `@@RMMArtikel@@` im Textbaustein erzeugen; RMM-Position muss exakt an der Platzhalterstelle erscheinen und der Platzhaltertext entfernt sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-011", "id": "SwRS-011",
@@ -1295,7 +1373,8 @@
"tracelinks": "StRS-004, SwRS-010", "tracelinks": "StRS-004, SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMM-Dienst in Testumgebung deaktivieren, Rechnungserstellung für Vertrag mit RMM-Artikelreferenz auslösen → Erstellung muss mit definierter Fehlermeldung abbrechen, keine Rechnung darf im System entstehen.", "pruefidee": "RMM-Dienst in Testumgebung deaktivieren, Rechnungserstellung für Vertrag mit RMM-Artikelreferenz auslösen → Erstellung muss mit definierter Fehlermeldung abbrechen, keine Rechnung darf im System entstehen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-012", "id": "SwRS-012",
@@ -1311,7 +1390,8 @@
"tracelinks": "StRS-013, SwRS-014", "tracelinks": "StRS-013, SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde mit Rechnungen unterschiedlicher Überfälligkeit anlegen, Mahnlauf ausführen, korrekte Mahnstufenzuordnung und Textvariablen prüfen.", "pruefidee": "Kunde mit Rechnungen unterschiedlicher Überfälligkeit anlegen, Mahnlauf ausführen, korrekte Mahnstufenzuordnung und Textvariablen prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-013", "id": "SwRS-013",
@@ -1327,7 +1407,8 @@
"tracelinks": "StRS-013, StRS-014, SyRS-011", "tracelinks": "StRS-013, StRS-014, SyRS-011",
"konsolidierung": "Kandidat: identisches Rechteschutz-Idiom in Dunning und Opos – im Zielsystem als gemeinsamer Decorator/Cross-Cutting-Concern (z. B. Attribut) statt Code-Duplikation umsetzbar.", "konsolidierung": "Kandidat: identisches Rechteschutz-Idiom in Dunning und Opos – im Zielsystem als gemeinsamer Decorator/Cross-Cutting-Concern (z. B. Attribut) statt Code-Duplikation umsetzbar.",
"pruefidee": "BL-Methode `RunDunning`/`RunOpos` direkt (unter Umgehung der UI) mit einem Benutzer ohne Recht aufrufen → Exception muss geworfen werden, kein Lauf darf erzeugt werden.", "pruefidee": "BL-Methode `RunDunning`/`RunOpos` direkt (unter Umgehung der UI) mit einem Benutzer ohne Recht aufrufen → Exception muss geworfen werden, kein Lauf darf erzeugt werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-014", "id": "SwRS-014",
@@ -1344,7 +1425,8 @@
"tracelinks": "StRS-016, SyRS-011", "tracelinks": "StRS-016, SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Codeprüfung: Keine direkte numerische Rechte-ID (Literal) in einem `HasUserRight`-Aufruf ohne `UserRightsConst`-Referenz.", "pruefidee": "Statische Codeprüfung: Keine direkte numerische Rechte-ID (Literal) in einem `HasUserRight`-Aufruf ohne `UserRightsConst`-Referenz.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-015", "id": "SwRS-015",
@@ -1360,7 +1442,8 @@
"tracelinks": "StRS-016, SwRS-014, SwRS-016", "tracelinks": "StRS-016, SwRS-014, SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer zwei Gruppen mit unterschiedlichen Rechten zuordnen; `GetRightsFromCurrentUser` muss die Vereinigungsmenge beider Gruppenrechte liefern.", "pruefidee": "Benutzer zwei Gruppen mit unterschiedlichen Rechten zuordnen; `GetRightsFromCurrentUser` muss die Vereinigungsmenge beider Gruppenrechte liefern.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-016", "id": "SwRS-016",
@@ -1376,7 +1459,8 @@
"tracelinks": "StRS-016, SwRS-015, SyRS-017", "tracelinks": "StRS-016, SwRS-015, SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neues Recht per `AddRightIfNotExists` unterhalb eines bestehenden Elternrechts anlegen; `NumChildren` des Elternrechts muss automatisch um 1 erhöht sein.", "pruefidee": "Neues Recht per `AddRightIfNotExists` unterhalb eines bestehenden Elternrechts anlegen; `NumChildren` des Elternrechts muss automatisch um 1 erhöht sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-017", "id": "SwRS-017",
@@ -1392,7 +1476,8 @@
"tracelinks": "SyRS-007", "tracelinks": "SyRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anfrage mit manipuliertem/gefälschtem Ticket senden → 401; erfolgreiche Anfrage im Audit-Log mit korrekter IP/Methode wiederfinden.", "pruefidee": "Anfrage mit manipuliertem/gefälschtem Ticket senden → 401; erfolgreiche Anfrage im Audit-Log mit korrekter IP/Methode wiederfinden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-018", "id": "SwRS-018",
@@ -1408,7 +1493,8 @@
"tracelinks": "SyRS-008", "tracelinks": "SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "E-Mail-Adresse des verknüpften Microsoft-Kontos ändern; Anmeldung muss weiterhin denselben c-entron-Benutzer zuordnen.", "pruefidee": "E-Mail-Adresse des verknüpften Microsoft-Kontos ändern; Anmeldung muss weiterhin denselben c-entron-Benutzer zuordnen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-019", "id": "SwRS-019",
@@ -1424,7 +1510,8 @@
"tracelinks": "SyRS-008", "tracelinks": "SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Manipuliertes JWT (falsche Signatur, abgelaufen, wiederverwendet) gegen `POST /jwt/login` senden → Ablehnung in allen drei Fällen, mit Log-Eintrag.", "pruefidee": "Manipuliertes JWT (falsche Signatur, abgelaufen, wiederverwendet) gegen `POST /jwt/login` senden → Ablehnung in allen drei Fällen, mit Log-Eintrag.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-020", "id": "SwRS-020",
@@ -1440,7 +1527,8 @@
"tracelinks": "SyRS-009", "tracelinks": "SyRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Access Token erstellen, erfolgreichen API-Aufruf durchführen, Token per `PUT {id}/deactivate` deaktivieren, identischen Aufruf wiederholen → Ablehnung.", "pruefidee": "Access Token erstellen, erfolgreichen API-Aufruf durchführen, Token per `PUT {id}/deactivate` deaktivieren, identischen Aufruf wiederholen → Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-021", "id": "SwRS-021",
@@ -1456,7 +1544,8 @@
"tracelinks": "StRS-017, SyRS-018", "tracelinks": "StRS-017, SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lizenz-GUID, die nur in `LicenseGuids.cs`, nicht aber in `ApplicationKind.cs` gelistet ist, für einen Login-Versuch verwenden → Ablehnung.", "pruefidee": "Lizenz-GUID, die nur in `LicenseGuids.cs`, nicht aber in `ApplicationKind.cs` gelistet ist, für einen Login-Versuch verwenden → Ablehnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-022", "id": "SwRS-022",
@@ -1472,7 +1561,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "Kandidat: Doppelte Konfigurationsablage (`Stammdat` vs. `ApplicationSettings`) ist ein expliziter Migrationskandidat für das Zielsystem.", "konsolidierung": "Kandidat: Doppelte Konfigurationsablage (`Stammdat` vs. `ApplicationSettings`) ist ein expliziter Migrationskandidat für das Zielsystem.",
"pruefidee": "Neue Einstellung mit nächster freier ID gemäß Kommentar in `ApplicationSettingID.cs` anlegen, Lese-/Schreibzugriff über `AppSettingsBL` prüfen.", "pruefidee": "Neue Einstellung mit nächster freier ID gemäß Kommentar in `ApplicationSettingID.cs` anlegen, Lese-/Schreibzugriff über `AppSettingsBL` prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-023", "id": "SwRS-023",
@@ -1488,7 +1578,8 @@
"tracelinks": "SyRS-017", "tracelinks": "SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anwendung zweimal hintereinander gegen dieselbe (bereits migrierte) Datenbank starten; zweiter Start darf keine SQL-Fehler und keine erneuten Schemaänderungen erzeugen.", "pruefidee": "Anwendung zweimal hintereinander gegen dieselbe (bereits migrierte) Datenbank starten; zweiter Start darf keine SQL-Fehler und keine erneuten Schemaänderungen erzeugen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-024", "id": "SwRS-024",
@@ -1505,7 +1596,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Entität ohne explizite Längenangabe in einem Mapping anlegen und Abweichung vom tatsächlichen DB-Schema als Codereview-Fehler identifizieren.", "pruefidee": "Neue Entität ohne explizite Längenangabe in einem Mapping anlegen und Abweichung vom tatsächlichen DB-Schema als Codereview-Fehler identifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-025", "id": "SwRS-025",
@@ -1522,7 +1614,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Alle Verwendungsstellen von `RawSqlAccessDAO`/`GenericStoredProcedureDAO` auf konsequente Parametrisierung prüfen (keine Stringverkettung von Benutzereingaben).", "pruefidee": "Alle Verwendungsstellen von `RawSqlAccessDAO`/`GenericStoredProcedureDAO` auf konsequente Parametrisierung prüfen (keine Stringverkettung von Benutzereingaben).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-026", "id": "SwRS-026",
@@ -1538,7 +1631,8 @@
"tracelinks": "StRS-006, SyRS-021", "tracelinks": "StRS-006, SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "EDI-Datei im ALSO-CH-Format mit Swiss-ESR-Code verarbeiten und prüfen, dass andere Lieferantenformate (z. B. Herweck) unverändert funktionieren (Regressionstest).", "pruefidee": "EDI-Datei im ALSO-CH-Format mit Swiss-ESR-Code verarbeiten und prüfen, dass andere Lieferantenformate (z. B. Herweck) unverändert funktionieren (Regressionstest).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-027", "id": "SwRS-027",
@@ -1554,7 +1648,8 @@
"tracelinks": "SwRS-026", "tracelinks": "SwRS-026",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lieferantenkonfiguration mit zwei unterschiedlichen `EdiDataType`/`ObjectKind`-Kombinationen anlegen und getrennte, korrekte Verarbeitung beider Dokumentarten prüfen.", "pruefidee": "Lieferantenkonfiguration mit zwei unterschiedlichen `EdiDataType`/`ObjectKind`-Kombinationen anlegen und getrennte, korrekte Verarbeitung beider Dokumentarten prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-028", "id": "SwRS-028",
@@ -1570,7 +1665,8 @@
"tracelinks": "SyRS-022", "tracelinks": "SyRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testdatei erzeugen, die 4-mal hintereinander eine Exception auslöst; Datei darf beim 5. Downloadzyklus nicht mehr verarbeitet werden, bleibt aber im Log sichtbar.", "pruefidee": "Testdatei erzeugen, die 4-mal hintereinander eine Exception auslöst; Datei darf beim 5. Downloadzyklus nicht mehr verarbeitet werden, bleibt aber im Log sichtbar.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-029", "id": "SwRS-029",
@@ -1586,7 +1682,8 @@
"tracelinks": "StRS-015, SyRS-023, SyRS-024", "tracelinks": "StRS-015, SyRS-023, SyRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit Skonto-Zahlungsbedingung erzeugen; generierte XML muss BR-DE-18-konforme Skonto-Beschreibung inkl. korrekter Zeilenumbrüche (`&#xD;`) enthalten.", "pruefidee": "Rechnung mit Skonto-Zahlungsbedingung erzeugen; generierte XML muss BR-DE-18-konforme Skonto-Beschreibung inkl. korrekter Zeilenumbrüche (`&#xD;`) enthalten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-030", "id": "SwRS-030",
@@ -1602,7 +1699,8 @@
"tracelinks": "StRS-015", "tracelinks": "StRS-015",
"konsolidierung": "Kandidat: ZUGFeRD- (SwRS-029) und ebInterface-Export (SwRS-030) bilden zwei unabhängige Implementierungen für die fachlich verwandte Aufgabe \"elektronische Rechnung erzeugen\" – im Zielsystem auf eine gemeinsame E-Invoicing-Abstraktion mit länderspezifischen Profilen konsolidierbar.", "konsolidierung": "Kandidat: ZUGFeRD- (SwRS-029) und ebInterface-Export (SwRS-030) bilden zwei unabhängige Implementierungen für die fachlich verwandte Aufgabe \"elektronische Rechnung erzeugen\" – im Zielsystem auf eine gemeinsame E-Invoicing-Abstraktion mit länderspezifischen Profilen konsolidierbar.",
"pruefidee": "Rechnung exportieren und resultierende XML gegen das ebInterface-4.3-XSD-Schema validieren.", "pruefidee": "Rechnung exportieren und resultierende XML gegen das ebInterface-4.3-XSD-Schema validieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-031", "id": "SwRS-031",
@@ -1618,7 +1716,8 @@
"tracelinks": "StRS-021, SyRS-027", "tracelinks": "StRS-021, SyRS-027",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einzelnen Termin in Outlook ändern und Netzwerkverkehr/Log des nächsten Sync-Zyklus prüfen: nur der geänderte Termin darf übertragen werden, nicht der gesamte Kalender.", "pruefidee": "Einzelnen Termin in Outlook ändern und Netzwerkverkehr/Log des nächsten Sync-Zyklus prüfen: nur der geänderte Termin darf übertragen werden, nicht der gesamte Kalender.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-032", "id": "SwRS-032",
@@ -1634,7 +1733,8 @@
"tracelinks": "StRS-021, SwRS-031", "tracelinks": "StRS-021, SwRS-031",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Helpdesk-Zeittermin in c-entron anlegen, Sync abwarten, Termin in Outlook manuell auf anderes Datum ändern, erneut synchronisieren → c-entron-Datensatz muss unverändert bleiben (siehe StRS-021 Prüfidee).", "pruefidee": "Helpdesk-Zeittermin in c-entron anlegen, Sync abwarten, Termin in Outlook manuell auf anderes Datum ändern, erneut synchronisieren → c-entron-Datensatz muss unverändert bleiben (siehe StRS-021 Prüfidee).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-033", "id": "SwRS-033",
@@ -1650,7 +1750,8 @@
"tracelinks": "SyRS-025", "tracelinks": "SyRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Fehlende `AccountI3D`-Zuordnung in einem Todo-Eintrag künstlich erzeugen; nach einem Ausführungszyklus muss `ToDoBL.DataQualityFillAccountI3D()` den Wert korrigiert haben.", "pruefidee": "Fehlende `AccountI3D`-Zuordnung in einem Todo-Eintrag künstlich erzeugen; nach einem Ausführungszyklus muss `ToDoBL.DataQualityFillAccountI3D()` den Wert korrigiert haben.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-034", "id": "SwRS-034",
@@ -1666,7 +1767,8 @@
"tracelinks": "StRS-016, StRS-017, SyRS-011, SwRS-021", "tracelinks": "StRS-016, StRS-017, SyRS-011, SwRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Modul mit Recht X und Lizenz Y konfigurieren; Benutzer mit Recht, aber ohne Lizenz → Modul nicht sichtbar; Benutzer mit Lizenz, aber ohne Recht → Modul nicht sichtbar.", "pruefidee": "Modul mit Recht X und Lizenz Y konfigurieren; Benutzer mit Recht, aber ohne Lizenz → Modul nicht sichtbar; Benutzer mit Lizenz, aber ohne Recht → Modul nicht sichtbar.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-035", "id": "SwRS-035",
@@ -1682,7 +1784,8 @@
"tracelinks": "SyRS-028", "tracelinks": "SyRS-028",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "In DEBUG-Konfiguration Mailversand an fiktive externe Adresse `kunde@fremdefirma.de` auslösen; tatsächlicher SMTP-Empfänger muss `test@nexoware.com` sein.", "pruefidee": "In DEBUG-Konfiguration Mailversand an fiktive externe Adresse `kunde@fremdefirma.de` auslösen; tatsächlicher SMTP-Empfänger muss `test@nexoware.com` sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-036", "id": "SwRS-036",
@@ -1698,7 +1801,8 @@
"tracelinks": "SyRS-004", "tracelinks": "SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Testmethode mit `[WebInvoke(UriTemplate=\"TestPing\")]` hinzufügen, Neustart des Hosts, Aufruf von `/REST/TestPing` ohne weitere Codeänderung muss funktionieren.", "pruefidee": "Neue Testmethode mit `[WebInvoke(UriTemplate=\"TestPing\")]` hinzufügen, Neustart des Hosts, Aufruf von `/REST/TestPing` ohne weitere Codeänderung muss funktionieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-037", "id": "SwRS-037",
@@ -1714,7 +1818,8 @@
"tracelinks": "SyRS-002", "tracelinks": "SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Endpunkt mit provozierter NullReferenceException aufrufen (Produktionsmodus) → Antwort darf keinen Stacktrace enthalten, Fehler muss im Log erscheinen.", "pruefidee": "Endpunkt mit provozierter NullReferenceException aufrufen (Produktionsmodus) → Antwort darf keinen Stacktrace enthalten, Fehler muss im Log erscheinen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-038", "id": "SwRS-038",
@@ -1730,6 +1835,7 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "Kandidat: Doppelte Soft-Delete-Modellierung – generisches `DBEntity.State` (StateEnum, ältere Entitäten) versus das in `docs/guides/database/database-conventions.md` beschriebene, neuere `IsDeleted`/`DeletedByI3D`/`DeletedDate`-Spaltenmuster (neue Tabellen). Im Zielsystem auf ein einheitliches Muster konsolidierbar.", "konsolidierung": "Kandidat: Doppelte Soft-Delete-Modellierung – generisches `DBEntity.State` (StateEnum, ältere Entitäten) versus das in `docs/guides/database/database-conventions.md` beschriebene, neuere `IsDeleted`/`DeletedByI3D`/`DeletedDate`-Spaltenmuster (neue Tabellen). Im Zielsystem auf ein einheitliches Muster konsolidierbar.",
"pruefidee": "Entität löschen (Soft Delete), per SQL prüfen, dass der Datensatz weiterhin existiert mit `State=1`; reguläre fachliche Abfrage darf den Datensatz nicht mehr zurückliefern.", "pruefidee": "Entität löschen (Soft Delete), per SQL prüfen, dass der Datensatz weiterhin existiert mit `State=1`; reguläre fachliche Abfrage darf den Datensatz nicht mehr zurückliefern.",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (84,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 89 (84,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 43 ungedeckt: SyRS-035 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 43 ungedeckt: SyRS-035 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 97 von 106 mit Tracelinks (91,5 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 97 von 106 mit Tracelinks (91,5 %) |
@@ -94,6 +94,8 @@ in allen Vorläufen klafften sie deutlich auseinander.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -126,6 +128,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 54 (98,2 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 54 (98,2 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -143,6 +149,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (37 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (37 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 55 von 55 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 55 von 55 mit Tracelinks (100,0 %) |
## Vergleich aller Läufe (identischer Prompt) ## Vergleich aller Läufe (identischer Prompt)
@@ -14,7 +14,8 @@
"tracelinks": "SyRS-1, SyRS-4, SwRS-1, SwRS-2", "tracelinks": "SyRS-1, SyRS-4, SwRS-1, SwRS-2",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einem Benutzer wird ein Recht ausschließlich über Gruppenmitgliedschaft zugewiesen; Entfernen", "pruefidee": "Einem Benutzer wird ein Recht ausschließlich über Gruppenmitgliedschaft zugewiesen; Entfernen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-2", "id": "StRS-2",
@@ -30,7 +31,8 @@
"tracelinks": "SyRS-1, SwRS-3", "tracelinks": "SyRS-1, SwRS-3",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit MANAGE_RIGHTS_ONLY_OWN_BRANCH versucht Gruppe einer fremden Filiale zu löschen;", "pruefidee": "Benutzer mit MANAGE_RIGHTS_ONLY_OWN_BRANCH versucht Gruppe einer fremden Filiale zu löschen;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-3", "id": "StRS-3",
@@ -46,7 +48,8 @@
"tracelinks": "SyRS-4, SwRS-3", "tracelinks": "SyRS-4, SwRS-3",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach AddRightToRightGroup existiert ein neuer AppRightLog-Eintrag mit Kind=AddRightToGroup.", "pruefidee": "Nach AddRightToRightGroup existiert ein neuer AppRightLog-Eintrag mit Kind=AddRightToGroup.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-4", "id": "StRS-4",
@@ -62,7 +65,8 @@
"tracelinks": "SyRS-2, SwRS-6", "tracelinks": "SyRS-2, SwRS-6",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde ohne Lizenz für Modul X: LicenseManager.HasLicense(X) liefert false, UI blendet Modul X aus.", "pruefidee": "Kunde ohne Lizenz für Modul X: LicenseManager.HasLicense(X) liefert false, UI blendet Modul X aus.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-5", "id": "StRS-5",
@@ -79,7 +83,8 @@
"tracelinks": "SyRS-7, SyRS-8, SwRS-8", "tracelinks": "SyRS-7, SyRS-8, SwRS-8",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden der sieben Belegtypen existiert eine Entity-Klasse, die von ReceiptBase erbt und", "pruefidee": "Für jeden der sieben Belegtypen existiert eine Entity-Klasse, die von ReceiptBase erbt und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-6", "id": "StRS-6",
@@ -96,7 +101,8 @@
"tracelinks": "SyRS-10, SwRS-11, SwRS-12", "tracelinks": "SyRS-10, SwRS-11, SwRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg wird zweimal gespeichert (Version 1 → 2); GetReceiptVersionByI3D(..., version:1) liefert", "pruefidee": "Beleg wird zweimal gespeichert (Version 1 → 2); GetReceiptVersionByI3D(..., version:1) liefert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-7", "id": "StRS-7",
@@ -112,7 +118,8 @@
"tracelinks": "SyRS-8, SwRS-9", "tracelinks": "SyRS-8, SwRS-9",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer A lädt Beleg (Guid=X), Benutzer B speichert denselben Beleg zuerst (Guid ändert", "pruefidee": "Benutzer A lädt Beleg (Guid=X), Benutzer B speichert denselben Beleg zuerst (Guid ändert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-8", "id": "StRS-8",
@@ -128,7 +135,8 @@
"tracelinks": "SyRS-9, SyRS-11, SwRS-8, SwRS-10", "tracelinks": "SyRS-9, SyRS-11, SwRS-8, SwRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Setzen von isPaid=true auf einem aktiven Beleg ändert dessen State auf Completed; erneutes", "pruefidee": "Setzen von isPaid=true auf einem aktiven Beleg ändert dessen State auf Completed; erneutes",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-9", "id": "StRS-9",
@@ -145,7 +153,8 @@
"tracelinks": "SyRS-12, SyRS-13, SwRS-13, SwRS-14", "tracelinks": "SyRS-12, SyRS-13, SwRS-13, SwRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit CalculationKind=Auto, State=aktiv, fälligem Intervall und mind. einer abrechenbaren", "pruefidee": "Vertrag mit CalculationKind=Auto, State=aktiv, fälligem Intervall und mind. einer abrechenbaren",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-10", "id": "StRS-10",
@@ -161,7 +170,8 @@
"tracelinks": "SyRS-12, SwRS-13", "tracelinks": "SyRS-12, SwRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei sonst identische Verträge mit CalculationKind=Auto bzw. =Need: nur der Auto-Vertrag wird", "pruefidee": "Zwei sonst identische Verträge mit CalculationKind=Auto bzw. =Need: nur der Auto-Vertrag wird",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-11", "id": "StRS-11",
@@ -177,7 +187,8 @@
"tracelinks": "SyRS-14, SwRS-15", "tracelinks": "SyRS-14, SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit DunningLevel=Level1 und Restbetrag > 0 erscheint in", "pruefidee": "Rechnung mit DunningLevel=Level1 und Restbetrag > 0 erscheint in",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-12", "id": "StRS-12",
@@ -193,7 +204,8 @@
"tracelinks": "SyRS-15, SwRS-16", "tracelinks": "SyRS-15, SwRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Belegposition mit Belegdatum vor einer historischen Steuersatzänderung liefert den alten", "pruefidee": "Belegposition mit Belegdatum vor einer historischen Steuersatzänderung liefert den alten",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-13", "id": "StRS-13",
@@ -209,7 +221,8 @@
"tracelinks": "SyRS-16, SwRS-17", "tracelinks": "SyRS-16, SwRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Account-Datensatz mit gesetzter CustomerNumber UND SupplierNumber lässt sich anlegen und", "pruefidee": "Ein Account-Datensatz mit gesetzter CustomerNumber UND SupplierNumber lässt sich anlegen und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-14", "id": "StRS-14",
@@ -226,7 +239,8 @@
"tracelinks": "SyRS-17, SwRS-18", "tracelinks": "SyRS-17, SwRS-18",
"konsolidierung": "Kandidat: StRS-1 (gleiches zugrundeliegendes Rechtesystem, hier auf ein einzelnes Feld", "konsolidierung": "Kandidat: StRS-1 (gleiches zugrundeliegendes Rechtesystem, hier auf ein einzelnes Feld",
"pruefidee": "Benutzer ohne CAN_CHANGE_DATE-Recht öffnet Timer-Billing-Einstellungen: Datumsfeld ist", "pruefidee": "Benutzer ohne CAN_CHANGE_DATE-Recht öffnet Timer-Billing-Einstellungen: Datumsfeld ist",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-15", "id": "StRS-15",
@@ -242,7 +256,8 @@
"tracelinks": "SyRS-18, SwRS-19", "tracelinks": "SyRS-18, SwRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anlegen eines neuen HelpdeskState-Datensatzes mit IsInternalCompanyBillingActive=false; Tickets", "pruefidee": "Anlegen eines neuen HelpdeskState-Datensatzes mit IsInternalCompanyBillingActive=false; Tickets",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-16", "id": "StRS-16",
@@ -258,7 +273,8 @@
"tracelinks": "SyRS-19, SwRS-20", "tracelinks": "SyRS-19, SwRS-20",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`docker compose up` im Verzeichnis docker/compose startet alle vier Dienste; der Webservice", "pruefidee": "`docker compose up` im Verzeichnis docker/compose startet alle vier Dienste; der Webservice",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-1", "id": "SyRS-1",
@@ -275,7 +291,8 @@
"tracelinks": "StRS-1, SwRS-1, SwRS-2", "tracelinks": "StRS-1, SwRS-1, SwRS-2",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter (simulierter) Aufruf einer BL-Methode ohne vorherige UI-Prüfung mit einem Benutzer", "pruefidee": "Direkter (simulierter) Aufruf einer BL-Methode ohne vorherige UI-Prüfung mit einem Benutzer",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-2", "id": "SyRS-2",
@@ -291,7 +308,8 @@
"tracelinks": "StRS-1, SwRS-1", "tracelinks": "StRS-1, SwRS-1",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Account mit Recht X, aber ohne entsprechendes internes Sichtrus-Recht, wird bei HasWebAccountRight(X)", "pruefidee": "Web-Account mit Recht X, aber ohne entsprechendes internes Sichtrus-Recht, wird bei HasWebAccountRight(X)",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-3", "id": "SyRS-3",
@@ -307,7 +325,8 @@
"tracelinks": "StRS-2, SwRS-3", "tracelinks": "StRS-2, SwRS-3",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Löschversuch der Gruppe I3D=6 liefert Result.Error \"Die Adminstratoren Gruppe darf nicht", "pruefidee": "Löschversuch der Gruppe I3D=6 liefert Result.Error \"Die Adminstratoren Gruppe darf nicht",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-4", "id": "SyRS-4",
@@ -323,7 +342,8 @@
"tracelinks": "StRS-3, SwRS-3", "tracelinks": "StRS-3, SwRS-3",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede der acht Schreibmethoden existiert im Code ein zugehöriger, unbedingter WriteXxxLog-Aufruf", "pruefidee": "Für jede der acht Schreibmethoden existiert im Code ein zugehöriger, unbedingter WriteXxxLog-Aufruf",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-5", "id": "SyRS-5",
@@ -339,7 +359,8 @@
"tracelinks": "StRS-4, SwRS-6", "tracelinks": "StRS-4, SwRS-6",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Login mit abgelaufener Lizenzversion liefert Result.Error; Login, der die maximale", "pruefidee": "Login mit abgelaufener Lizenzversion liefert Result.Error; Login, der die maximale",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-6", "id": "SyRS-6",
@@ -356,7 +377,8 @@
"tracelinks": "StRS-4, SwRS-6", "tracelinks": "StRS-4, SwRS-6",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Webservice-Start ohne gültige Centron-Lizenz: Startvorgang bricht ab, bevor Migrationsskripte", "pruefidee": "Webservice-Start ohne gültige Centron-Lizenz: Startvorgang bricht ab, bevor Migrationsskripte",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-7", "id": "SyRS-7",
@@ -372,7 +394,8 @@
"tracelinks": "StRS-5, StRS-7, SwRS-9", "tracelinks": "StRS-5, StRS-7, SwRS-9",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Bearbeitungsrecht für Rechnungen versucht, eine Rechnung zu speichern; Result", "pruefidee": "Benutzer ohne Bearbeitungsrecht für Rechnungen versucht, eine Rechnung zu speichern; Result",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-8", "id": "SyRS-8",
@@ -388,7 +411,8 @@
"tracelinks": "StRS-7, SwRS-9", "tracelinks": "StRS-7, SwRS-9",
"konsolidierung": "Kandidat: SyRS-9 (verwandter Zustands-Schutzmechanismus)", "konsolidierung": "Kandidat: SyRS-9 (verwandter Zustands-Schutzmechanismus)",
"pruefidee": "Zwei parallele Ladevorgänge desselben Belegs, sequentielle Speicherversuche: der zweite", "pruefidee": "Zwei parallele Ladevorgänge desselben Belegs, sequentielle Speicherversuche: der zweite",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-9", "id": "SyRS-9",
@@ -404,7 +428,8 @@
"tracelinks": "StRS-5, SwRS-8, SwRS-10", "tracelinks": "StRS-5, SwRS-8, SwRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "UpdateReceiptIsPaid auf einem Beleg mit State=Canceled liefert Result.Error unabhängig vom", "pruefidee": "UpdateReceiptIsPaid auf einem Beleg mit State=Canceled liefert Result.Error unabhängig vom",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-10", "id": "SyRS-10",
@@ -420,7 +445,8 @@
"tracelinks": "StRS-6, SwRS-11, SwRS-12", "tracelinks": "StRS-6, SwRS-11, SwRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden der sieben Belegtypen: Speichern einer Änderung erzeugt einen neuen Versionsdatensatz", "pruefidee": "Für jeden der sieben Belegtypen: Speichern einer Änderung erzeugt einen neuen Versionsdatensatz",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-11", "id": "SyRS-11",
@@ -436,7 +462,8 @@
"tracelinks": "StRS-8", "tracelinks": "StRS-8",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS (kein allgemeines Bearbeitungsrecht):", "pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS (kein allgemeines Bearbeitungsrecht):",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-12", "id": "SyRS-12",
@@ -452,7 +479,8 @@
"tracelinks": "StRS-9, SwRS-13, SwRS-14", "tracelinks": "StRS-9, SwRS-13, SwRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aktiver Vertrag ohne Vertragspositionen wird trotz fälligem Intervall NICHT in die finale", "pruefidee": "Aktiver Vertrag ohne Vertragspositionen wird trotz fälligem Intervall NICHT in die finale",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-13", "id": "SyRS-13",
@@ -468,7 +496,8 @@
"tracelinks": "StRS-9, StRS-10", "tracelinks": "StRS-9, StRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Dynamischer Bedarfsvertrag ohne Sonderartikel-Stichtag im Abrechnungszeitraum wird aus der", "pruefidee": "Dynamischer Bedarfsvertrag ohne Sonderartikel-Stichtag im Abrechnungszeitraum wird aus der",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-14", "id": "SyRS-14",
@@ -484,7 +513,8 @@
"tracelinks": "StRS-11, SwRS-15", "tracelinks": "StRS-11, SwRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Setzen einer Mahnsperre mit dunningStopEnd in der Zukunft: das Objekt wird im nächsten", "pruefidee": "Setzen einer Mahnsperre mit dunningStopEnd in der Zukunft: das Objekt wird im nächsten",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-15", "id": "SyRS-15",
@@ -500,7 +530,8 @@
"tracelinks": "StRS-12, SwRS-16", "tracelinks": "StRS-12, SwRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kette mit Steuersatz A (gültig bis 30.06.), Nachfolger B (ab 01.07.): receiptDate=15.06.", "pruefidee": "Kette mit Steuersatz A (gültig bis 30.06.), Nachfolger B (ab 01.07.): receiptDate=15.06.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-16", "id": "SyRS-16",
@@ -517,7 +548,8 @@
"tracelinks": "StRS-13, SwRS-17", "tracelinks": "StRS-13, SwRS-17",
"konsolidierung": "Kandidat: SyRS-1 (gleiches zugrundeliegendes Rechteprüfungsmuster CheckRightsFromUser,", "konsolidierung": "Kandidat: SyRS-1 (gleiches zugrundeliegendes Rechteprüfungsmuster CheckRightsFromUser,",
"pruefidee": "Benutzer mit ausschließlich EDIT_CUSTOMER: Bearbeiten eines bestehenden Kunden gelingt,", "pruefidee": "Benutzer mit ausschließlich EDIT_CUSTOMER: Bearbeiten eines bestehenden Kunden gelingt,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-17", "id": "SyRS-17",
@@ -533,7 +565,8 @@
"tracelinks": "StRS-14, SwRS-18", "tracelinks": "StRS-14, SwRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit DeliveryList.CAN_CHANGE_DATE, aber ohne Invoice.CAN_CHANGE_DATE:", "pruefidee": "Benutzer mit DeliveryList.CAN_CHANGE_DATE, aber ohne Invoice.CAN_CHANGE_DATE:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-18", "id": "SyRS-18",
@@ -549,7 +582,8 @@
"tracelinks": "StRS-15, SwRS-19", "tracelinks": "StRS-15, SwRS-19",
"konsolidierung": "Kandidat: SwRS-8 (gegensätzliches Muster: Belegstatus fest vs. Ticketstatus konfigurierbar –", "konsolidierung": "Kandidat: SwRS-8 (gegensätzliches Muster: Belegstatus fest vs. Ticketstatus konfigurierbar –",
"pruefidee": "Ein neuer HelpdeskState-Datensatz ist über die Rechteverwaltungs-/Admin-UI anlegbar und", "pruefidee": "Ein neuer HelpdeskState-Datensatz ist über die Rechteverwaltungs-/Admin-UI anlegbar und",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-19", "id": "SyRS-19",
@@ -566,7 +600,8 @@
"tracelinks": "StRS-16, SwRS-20", "tracelinks": "StRS-16, SwRS-20",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Webservice-Container basierend auf einem Linux-Basisimage startet erfolgreich und beantwortet", "pruefidee": "Webservice-Container basierend auf einem Linux-Basisimage startet erfolgreich und beantwortet",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-1", "id": "SwRS-1",
@@ -582,7 +617,8 @@
"tracelinks": "SyRS-1", "tracelinks": "SyRS-1",
"konsolidierung": "Kandidat: SwRS-2 (ähnlicher Cache-Mechanismus für Web-Account-Rechte, HasWebAccountRight)", "konsolidierung": "Kandidat: SwRS-2 (ähnlicher Cache-Mechanismus für Web-Account-Rechte, HasWebAccountRight)",
"pruefidee": "Zwei aufeinanderfolgende HasUserRight-Aufrufe für denselben Benutzer in derselben Session:", "pruefidee": "Zwei aufeinanderfolgende HasUserRight-Aufrufe für denselben Benutzer in derselben Session:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-2", "id": "SwRS-2",
@@ -599,7 +635,8 @@
"tracelinks": "SyRS-1", "tracelinks": "SyRS-1",
"konsolidierung": "Kandidat: SwRS-1", "konsolidierung": "Kandidat: SwRS-1",
"pruefidee": "Aufruf mit 5 Recht-IDs, von denen der Benutzer 3 besitzt, liefert eine Liste mit genau", "pruefidee": "Aufruf mit 5 Recht-IDs, von denen der Benutzer 3 besitzt, liefert eine Liste mit genau",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-3", "id": "SwRS-3",
@@ -615,7 +652,8 @@
"tracelinks": "SyRS-3, SyRS-4", "tracelinks": "SyRS-3, SyRS-4",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zuweisungsversuch eines Rechts mit I3D, das nicht in der Liste enthalten ist, an die", "pruefidee": "Zuweisungsversuch eines Rechts mit I3D, das nicht in der Liste enthalten ist, an die",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-4", "id": "SwRS-4",
@@ -632,7 +670,8 @@
"tracelinks": "SyRS-1", "tracelinks": "SyRS-1",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ausführen eines Migrationsskripts mit AddRightIfNotExists erzeugt einen neuen Sichrech-Datensatz", "pruefidee": "Ausführen eines Migrationsskripts mit AddRightIfNotExists erzeugt einen neuen Sichrech-Datensatz",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-5", "id": "SwRS-5",
@@ -648,7 +687,8 @@
"tracelinks": "(kein direkter StRS/SyRS-Bezug – reine Entwicklungssicherheitsmaßnahme, kein Fachprozess)", "tracelinks": "(kein direkter StRS/SyRS-Bezug – reine Entwicklungssicherheitsmaßnahme, kein Fachprozess)",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Debug-Build, Versand an \"kunde@fremdefirma.de\": tatsächlicher SMTP-Empfänger ist", "pruefidee": "Debug-Build, Versand an \"kunde@fremdefirma.de\": tatsächlicher SMTP-Empfänger ist",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-6", "id": "SwRS-6",
@@ -664,7 +704,8 @@
"tracelinks": "SyRS-5, SyRS-6", "tracelinks": "SyRS-5, SyRS-6",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zweiter Aufruf von Initialize() in derselben Prozessinstanz löst eine Exception aus;", "pruefidee": "Zweiter Aufruf von Initialize() in derselben Prozessinstanz löst eine Exception aus;",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-7", "id": "SwRS-7",
@@ -680,7 +721,8 @@
"tracelinks": "SyRS-5", "tracelinks": "SyRS-5",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Login mit Version \"9.3.40.2\" und Centron-Lizenz-GUID wird nicht wegen Versionsüberschreitung", "pruefidee": "Login mit Version \"9.3.40.2\" und Centron-Lizenz-GUID wird nicht wegen Versionsüberschreitung",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-8", "id": "SwRS-8",
@@ -696,7 +738,8 @@
"tracelinks": "StRS-5, SyRS-9", "tracelinks": "StRS-5, SyRS-9",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kompilierzeitprüfung/Reflection: ReceiptState besitzt genau die drei genannten Werte.", "pruefidee": "Kompilierzeitprüfung/Reflection: ReceiptState besitzt genau die drei genannten Werte.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-9", "id": "SwRS-9",
@@ -712,7 +755,8 @@
"tracelinks": "SyRS-7, StRS-7", "tracelinks": "SyRS-7, StRS-7",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für zwei verschiedene Belegtypen mit unterschiedlichen HasRightToEditReceipt-Implementierungen", "pruefidee": "Für zwei verschiedene Belegtypen mit unterschiedlichen HasRightToEditReceipt-Implementierungen",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-10", "id": "SwRS-10",
@@ -728,7 +772,8 @@
"tracelinks": "StRS-8, SyRS-9", "tracelinks": "StRS-8, SyRS-9",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "isPaid=true auf einem Active-Beleg: State wird Completed; isPaid=false auf einem", "pruefidee": "isPaid=true auf einem Active-Beleg: State wird Completed; isPaid=false auf einem",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-11", "id": "SwRS-11",
@@ -744,7 +789,8 @@
"tracelinks": "StRS-6, SyRS-10", "tracelinks": "StRS-6, SyRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Versuch, aus einer historischen Version mit aktiven Barcodes eine neue Version zu erzeugen,", "pruefidee": "Versuch, aus einer historischen Version mit aktiven Barcodes eine neue Version zu erzeugen,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-12", "id": "SwRS-12",
@@ -761,7 +807,8 @@
"tracelinks": "StRS-6, SyRS-10", "tracelinks": "StRS-6, SyRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neues Feld wird nur der modernen Entity/Mapping hinzugefügt, nicht dem Repository: Wert wird", "pruefidee": "Neues Feld wird nur der modernen Entity/Mapping hinzugefügt, nicht dem Repository: Wert wird",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-13", "id": "SwRS-13",
@@ -777,7 +824,8 @@
"tracelinks": "SyRS-12, StRS-10", "tracelinks": "SyRS-12, StRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit LastPaidDate >= ContractEnd und CalculationKind=Auto wird NICHT selektiert", "pruefidee": "Vertrag mit LastPaidDate >= ContractEnd und CalculationKind=Auto wird NICHT selektiert",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-14", "id": "SwRS-14",
@@ -793,7 +841,8 @@
"tracelinks": "SyRS-12", "tracelinks": "SyRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Abrechnungslauf mit > 2000 abrechnungsfähigen Verträgen schlägt nicht mit einem", "pruefidee": "Abrechnungslauf mit > 2000 abrechnungsfähigen Verträgen schlägt nicht mit einem",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-15", "id": "SwRS-15",
@@ -809,7 +858,8 @@
"tracelinks": "StRS-11, SyRS-14", "tracelinks": "StRS-11, SyRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit GrossPriceComplete=1000, PayedGrossAmount=300, CreditVoucherGrossAmount=100:", "pruefidee": "Rechnung mit GrossPriceComplete=1000, PayedGrossAmount=300, CreditVoucherGrossAmount=100:",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-16", "id": "SwRS-16",
@@ -825,7 +875,8 @@
"tracelinks": "StRS-12, SyRS-15", "tracelinks": "StRS-12, SyRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf mit einer nicht existierenden taxRateI3D liefert nicht null, sondern den", "pruefidee": "Aufruf mit einer nicht existierenden taxRateI3D liefert nicht null, sondern den",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-17", "id": "SwRS-17",
@@ -841,7 +892,8 @@
"tracelinks": "StRS-13, SyRS-16", "tracelinks": "StRS-13, SyRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Mit aktivierter Einstellung: neu angelegter Kunde mit Nummer 4711 erhält BookKeepingNumber", "pruefidee": "Mit aktivierter Einstellung: neu angelegter Kunde mit Nummer 4711 erhält BookKeepingNumber",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-18", "id": "SwRS-18",
@@ -857,7 +909,8 @@
"tracelinks": "StRS-14, SyRS-17", "tracelinks": "StRS-14, SyRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "ReceiptKind=InvoiceClass, CanChangeDateInInvoices=false: BillingDateIsEnabled=false,", "pruefidee": "ReceiptKind=InvoiceClass, CanChangeDateInInvoices=false: BillingDateIsEnabled=false,",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-19", "id": "SwRS-19",
@@ -873,7 +926,8 @@
"tracelinks": "StRS-15, SyRS-18", "tracelinks": "StRS-15, SyRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei HelpdeskState-Datensätze mit unterschiedlichem ServiceBoardWebColor erscheinen im", "pruefidee": "Zwei HelpdeskState-Datensätze mit unterschiedlichem ServiceBoardWebColor erscheinen im",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-20", "id": "SwRS-20",
@@ -889,6 +943,7 @@
"tracelinks": "StRS-16, SyRS-19", "tracelinks": "StRS-16, SyRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Manuelles Beenden des webservice-Containers: Compose startet ihn automatisch neu, ohne dass", "pruefidee": "Manuelles Beenden des webservice-Containers: Compose startet ihn automatisch neu, ohne dass",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -34,6 +36,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 54 (98,2 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 54 (98,2 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -51,5 +57,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (37 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (37 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 55 von 55 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 55 von 55 mit Tracelinks (100,0 %) |
@@ -102,6 +102,8 @@ Faktor 21,6 die größte aller Läufe – nahezu die gesamte Arbeit fand in den
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -138,6 +140,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 311 (95,7 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 311 (95,7 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -155,6 +161,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (100 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (100 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 325 von 325 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 325 von 325 mit Tracelinks (100,0 %) |
## Vergleich aller Läufe (identischer Prompt, SHA-256 unverändert) ## Vergleich aller Läufe (identischer Prompt, SHA-256 unverändert)
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 311 (95,7 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 311 (95,7 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (100 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (100 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 325 von 325 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 325 von 325 mit Tracelinks (100,0 %) |
@@ -93,6 +93,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -129,6 +131,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 175 (92,6 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 175 (92,6 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -146,6 +152,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (62 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (62 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 189 von 189 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 189 von 189 mit Tracelinks (100,0 %) |
## Vergleich aller Läufe (identischer Prompt, SHA-256 unverändert) ## Vergleich aller Läufe (identischer Prompt, SHA-256 unverändert)
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 175 (92,6 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 175 (92,6 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (62 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (62 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 189 von 189 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 189 von 189 mit Tracelinks (100,0 %) |
@@ -97,6 +97,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -127,6 +129,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2,0 | | Belege je Anforderung (Median) | 2,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 234 (95,1 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 234 (95,1 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -144,6 +150,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 85 ungedeckt: SyRS-SYS-02 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 85 ungedeckt: SyRS-SYS-02 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 246 von 246 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 246 von 246 mit Tracelinks (100,0 %) |
## V1b-Block F–J, fünf Messpunkte ## V1b-Block F–J, fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -32,6 +34,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2,0 | | Belege je Anforderung (Median) | 2,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 234 (95,1 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 234 (95,1 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -49,5 +55,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 85 ungedeckt: SyRS-SYS-02 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 85 ungedeckt: SyRS-SYS-02 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 246 von 246 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 246 von 246 mit Tracelinks (100,0 %) |
@@ -97,6 +97,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -127,6 +129,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 215 (90,3 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 215 (90,3 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -144,6 +150,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (112 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (112 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 238 von 238 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 238 von 238 mit Tracelinks (100,0 %) |
## V1b-Block F–J, fünf Messpunkte ## V1b-Block F–J, fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -32,6 +34,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 215 (90,3 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 215 (90,3 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -49,5 +55,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (112 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (112 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 238 von 238 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 238 von 238 mit Tracelinks (100,0 %) |
@@ -97,6 +97,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -133,6 +135,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2 | | Belege je Anforderung (Median) | 2 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 109 (96,5 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 109 (96,5 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -150,6 +156,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (43 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (43 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 110 von 113 mit Tracelinks (97,3 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 110 von 113 mit Tracelinks (97,3 %) |
## V1b-Block F–J, fünf Messpunkte ## V1b-Block F–J, fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2 | | Belege je Anforderung (Median) | 2 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 109 (96,5 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 109 (96,5 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (43 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (43 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 110 von 113 mit Tracelinks (97,3 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 110 von 113 mit Tracelinks (97,3 %) |
@@ -97,6 +97,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -133,6 +135,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2 | | Belege je Anforderung (Median) | 2 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 145 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 145 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -150,6 +156,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (73 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (73 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 145 von 145 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 145 von 145 mit Tracelinks (100,0 %) |
## V1b-Block F–J, fünf Messpunkte ## V1b-Block F–J, fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 2 | | Belege je Anforderung (Median) | 2 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 145 (100,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 145 (100,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (73 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (73 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 145 von 145 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 145 von 145 mit Tracelinks (100,0 %) |
@@ -97,6 +97,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -127,6 +129,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 238 (99,6 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 238 (99,6 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -144,6 +150,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **verletzt** – 1 ohne Beleg: SwRS-012 | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **verletzt** – 1 ohne Beleg: SwRS-012 |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (84 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (84 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 239 von 239 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 239 von 239 mit Tracelinks (100,0 %) |
## V1b-Block F–J, fünf Messpunkte ## V1b-Block F–J, fünf Messpunkte
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -32,6 +34,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 238 (99,6 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 238 (99,6 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -49,5 +55,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **verletzt** – 1 ohne Beleg: SwRS-012 | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **verletzt** – 1 ohne Beleg: SwRS-012 |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (84 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (84 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 239 von 239 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 239 von 239 mit Tracelinks (100,0 %) |
@@ -96,6 +96,8 @@ allen V1b-Laeufen, wo sie um bis zu Faktor 21,6 auseinanderlagen.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -130,6 +132,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 38 (90,5 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 38 (90,5 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -147,6 +153,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (20 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (20 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 42 von 42 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 42 von 42 mit Tracelinks (100,0 %) |
## Vergleich V1 (solo) gegen V1b (builtin) ## Vergleich V1 (solo) gegen V1b (builtin)
@@ -15,7 +15,8 @@
"tracelinks": "SyRS-001, SwRS-001, SwRS-002", "tracelinks": "SyRS-001, SwRS-001, SwRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einem Testbenutzer wird eine Gruppe ohne ein bestimmtes Recht zugewiesen; die zugehörige Funktion darf im Client nicht sichtbar/ausführbar sein.", "pruefidee": "Einem Testbenutzer wird eine Gruppe ohne ein bestimmtes Recht zugewiesen; die zugehörige Funktion darf im Client nicht sichtbar/ausführbar sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-002", "id": "StRS-002",
@@ -32,7 +33,8 @@
"tracelinks": "SyRS-002, SwRS-003", "tracelinks": "SyRS-002, SwRS-003",
"konsolidierung": "Kandidat: Gleiches Muster wiederkehrend bei Kalender (RIGHT_KALENDERANZEIGENEIGENE) und Mitarbeiterauslastung (RIGHT_MITARBEITERAUSLASTUNGNUREIGENEFILIALE) — im Zielsystem als generisches \"Sichtbarkeits-Scoping\" konsolidierbar.", "konsolidierung": "Kandidat: Gleiches Muster wiederkehrend bei Kalender (RIGHT_KALENDERANZEIGENEIGENE) und Mitarbeiterauslastung (RIGHT_MITARBEITERAUSLASTUNGNUREIGENEFILIALE) — im Zielsystem als generisches \"Sichtbarkeits-Scoping\" konsolidierbar.",
"pruefidee": "Zwei Testbenutzer unterschiedlicher Filialen mit \"nur eigene Filiale\"-Recht dürfen jeweils nur Tickets ihrer eigenen Filiale in der Liste sehen.", "pruefidee": "Zwei Testbenutzer unterschiedlicher Filialen mit \"nur eigene Filiale\"-Recht dürfen jeweils nur Tickets ihrer eigenen Filiale in der Liste sehen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-003", "id": "StRS-003",
@@ -49,7 +51,8 @@
"tracelinks": "SyRS-003, SyRS-004, SwRS-004, SwRS-005", "tracelinks": "SyRS-003, SyRS-004, SwRS-004, SwRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aus einem Auftrag wird ein Lieferschein und daraus eine Rechnung erzeugt; `GetRelatedItemsForObject` für die Rechnung muss Auftrag und Lieferschein als Ursprungsbelege zurückliefern.", "pruefidee": "Aus einem Auftrag wird ein Lieferschein und daraus eine Rechnung erzeugt; `GetRelatedItemsForObject` für die Rechnung muss Auftrag und Lieferschein als Ursprungsbelege zurückliefern.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-004", "id": "StRS-004",
@@ -65,7 +68,8 @@
"tracelinks": "SyRS-004, SwRS-005", "tracelinks": "SyRS-004, SwRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für einen Auftrag mit einer Anzahlungsrechnung liefert `GetRelatedItemsForObject(Auftrag)` die Anzahlungsrechnung als verknüpftes Objekt.", "pruefidee": "Für einen Auftrag mit einer Anzahlungsrechnung liefert `GetRelatedItemsForObject(Auftrag)` die Anzahlungsrechnung als verknüpftes Objekt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-005", "id": "StRS-005",
@@ -81,7 +85,8 @@
"tracelinks": "SyRS-005, SwRS-006", "tracelinks": "SyRS-005, SwRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein neu angelegter Beleg hat Status \"offen\"; nach Stornierung liefert eine Statusabfrage \"storniert\".", "pruefidee": "Ein neu angelegter Beleg hat Status \"offen\"; nach Stornierung liefert eine Statusabfrage \"storniert\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-006", "id": "StRS-006",
@@ -97,7 +102,8 @@
"tracelinks": "SyRS-006, SwRS-007", "tracelinks": "SyRS-006, SwRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei parallele Aufrufe von `GetNextNumber(updateDatabase:true)` für denselben Nummernkreis dürfen keine identische Nummer liefern (Lasttest mit paralleler Ausführung).", "pruefidee": "Zwei parallele Aufrufe von `GetNextNumber(updateDatabase:true)` für denselben Nummernkreis dürfen keine identische Nummer liefern (Lasttest mit paralleler Ausführung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-007", "id": "StRS-007",
@@ -114,7 +120,8 @@
"tracelinks": "SyRS-007, SyRS-008, SwRS-008, SwRS-009", "tracelinks": "SyRS-007, SyRS-008, SwRS-008, SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Ticket wird angelegt, bearbeitet, Zeit erfasst und abgeschlossen; jeder Schritt ist im Änderungsprotokoll nachvollziehbar.", "pruefidee": "Ein Ticket wird angelegt, bearbeitet, Zeit erfasst und abgeschlossen; jeder Schritt ist im Änderungsprotokoll nachvollziehbar.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-008", "id": "StRS-008",
@@ -130,7 +137,8 @@
"tracelinks": "SyRS-002, SwRS-009", "tracelinks": "SyRS-002, SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Testbenutzer mit EDIT_HELPDESK aber ohne CLOSE_REQUEST versucht, Status auf \"geschlossen\" zu setzen → erwartet: Fehler-Result, kein Speichern.", "pruefidee": "Testbenutzer mit EDIT_HELPDESK aber ohne CLOSE_REQUEST versucht, Status auf \"geschlossen\" zu setzen → erwartet: Fehler-Result, kein Speichern.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-009", "id": "StRS-009",
@@ -146,7 +154,8 @@
"tracelinks": "SyRS-009, SwRS-010", "tracelinks": "SyRS-009, SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Wareneingang über einen Lieferschein erhöht den Bestand des betroffenen Artikels am betroffenen Lagerort um die Liefermenge.", "pruefidee": "Wareneingang über einen Lieferschein erhöht den Bestand des betroffenen Artikels am betroffenen Lagerort um die Liefermenge.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-010", "id": "StRS-010",
@@ -164,7 +173,8 @@
"tracelinks": "SyRS-010", "tracelinks": "SyRS-010",
"konsolidierung": "Kandidat: Partnerspezifische EDI-Module folgen strukturell ähnlichem Muster (Import/Connector-Klassen) — im Zielsystem als generisches EDI-Adapter-Framework konsolidierbar. [HYPOTHESE: nicht im Detail verglichen, ob die Partner-Implementierungen tatsächlich strukturell identisch sind — Bestätigung erfordert Tiefenanalyse je Partnermodul.]", "konsolidierung": "Kandidat: Partnerspezifische EDI-Module folgen strukturell ähnlichem Muster (Import/Connector-Klassen) — im Zielsystem als generisches EDI-Adapter-Framework konsolidierbar. [HYPOTHESE: nicht im Detail verglichen, ob die Partner-Implementierungen tatsächlich strukturell identisch sind — Bestätigung erfordert Tiefenanalyse je Partnermodul.]",
"pruefidee": "Eine Testdatei im jeweiligen Partnerformat wird importiert; Ergebnis ist ein systemseitig referenzierbarer Beleg/Belegstatus.", "pruefidee": "Eine Testdatei im jeweiligen Partnerformat wird importiert; Ergebnis ist ein systemseitig referenzierbarer Beleg/Belegstatus.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-011", "id": "StRS-011",
@@ -181,7 +191,8 @@
"tracelinks": "SyRS-011, SyRS-002", "tracelinks": "SyRS-011, SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Web-Account meldet sich in CentronNexus an und sieht ausschließlich für ihn freigegebene Artikel (Sonderpreise) im WebCart.", "pruefidee": "Ein Web-Account meldet sich in CentronNexus an und sieht ausschließlich für ihn freigegebene Artikel (Sonderpreise) im WebCart.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-012", "id": "StRS-012",
@@ -197,7 +208,8 @@
"tracelinks": "SyRS-012, SwRS-011", "tracelinks": "SyRS-012, SwRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für ein beliebiges Modul existieren sowohl eine `BL{Modul}Logic`- als auch eine `WS{Modul}Logic`-Klasse, die dasselbe `I{Modul}Logic`-Interface implementieren.", "pruefidee": "Für ein beliebiges Modul existieren sowohl eine `BL{Modul}Logic`- als auch eine `WS{Modul}Logic`-Klasse, die dasselbe `I{Modul}Logic`-Interface implementieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-013", "id": "StRS-013",
@@ -214,7 +226,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stichprobe von 20 zufälligen benutzersichtbaren Strings im WPF-Client: alle sind auf Deutsch vorhanden (Basis-resx).", "pruefidee": "Stichprobe von 20 zufälligen benutzersichtbaren Strings im WPF-Client: alle sind auf Deutsch vorhanden (Basis-resx).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-014", "id": "StRS-014",
@@ -231,7 +244,8 @@
"tracelinks": "SyRS-007, SwRS-008", "tracelinks": "SyRS-007, SwRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Eine bereits abgerechnete Zeitbuchung eines Tickets kann über EDIT_TIME nicht mehr gelöscht werden (erwarteter Fehler).", "pruefidee": "Eine bereits abgerechnete Zeitbuchung eines Tickets kann über EDIT_TIME nicht mehr gelöscht werden (erwarteter Fehler).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-001", "id": "SyRS-001",
@@ -247,7 +261,8 @@
"tracelinks": "StRS-001; SwRS-001", "tracelinks": "StRS-001; SwRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter Aufruf von `CheckRightsFromUser` mit der I3D eines Rechts, das keiner Gruppe des Benutzers zugewiesen ist, liefert eine leere Liste.", "pruefidee": "Direkter Aufruf von `CheckRightsFromUser` mit der I3D eines Rechts, das keiner Gruppe des Benutzers zugewiesen ist, liefert eine leere Liste.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-002", "id": "SyRS-002",
@@ -263,7 +278,8 @@
"tracelinks": "StRS-002; SwRS-003", "tracelinks": "StRS-002; SwRS-003",
"konsolidierung": "Kandidat: identisches Scoping-Muster (All/OnlyOwn/OnlyOwnBranch) potenziell in weiteren Modulen (Kalender, Mitarbeiterauslastung) — nur für Helpdesk verifiziert, für andere Module [HYPOTHESE].", "konsolidierung": "Kandidat: identisches Scoping-Muster (All/OnlyOwn/OnlyOwnBranch) potenziell in weiteren Modulen (Kalender, Mitarbeiterauslastung) — nur für Helpdesk verifiziert, für andere Module [HYPOTHESE].",
"pruefidee": "Benutzer mit SHOW_HELPDESK_ONLY_OWN_BRANCH erhält bei Ticketsuche ausschließlich Tickets seiner Filiale, auch bei explizitem Filterversuch auf andere Filialen.", "pruefidee": "Benutzer mit SHOW_HELPDESK_ONLY_OWN_BRANCH erhält bei Ticketsuche ausschließlich Tickets seiner Filiale, auch bei explizitem Filterversuch auf andere Filialen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-003", "id": "SyRS-003",
@@ -279,7 +295,8 @@
"tracelinks": "StRS-003; SwRS-004", "tracelinks": "StRS-003; SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für einen Lieferschein mit bekanntem Ursprungsauftrag und bekannter Folgerechnung liefert `GetRelatedItemsForObject` genau diese zwei Objekte mit korrektem IsOrigin-Wert.", "pruefidee": "Für einen Lieferschein mit bekanntem Ursprungsauftrag und bekannter Folgerechnung liefert `GetRelatedItemsForObject` genau diese zwei Objekte mit korrektem IsOrigin-Wert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-004", "id": "SyRS-004",
@@ -295,7 +312,8 @@
"tracelinks": "StRS-003, StRS-004; SwRS-005", "tracelinks": "StRS-003, StRS-004; SwRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Datensatz in `ObjectExternalReferences` mit bekannter ExternalReferenceID liefert bei Abfrage den verknüpften internen Auftrag/Lieferschein.", "pruefidee": "Ein Datensatz in `ObjectExternalReferences` mit bekannter ExternalReferenceID liefert bei Abfrage den verknüpften internen Auftrag/Lieferschein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-005", "id": "SyRS-005",
@@ -311,7 +329,8 @@
"tracelinks": "StRS-005; SwRS-006", "tracelinks": "StRS-005; SwRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statischer Test: Serialisierung/Deserialisierung eines Belegs erlaubt keinen anderen Enum-Wert als die drei definierten.", "pruefidee": "Statischer Test: Serialisierung/Deserialisierung eines Belegs erlaubt keinen anderen Enum-Wert als die drei definierten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-006", "id": "SyRS-006",
@@ -327,7 +346,8 @@
"tracelinks": "StRS-006; SwRS-007", "tracelinks": "StRS-006; SwRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lasttest mit N parallelen Threads, die `GetNextNumber(updateDatabase:true)` für denselben Nummernkreis aufrufen: alle N Ergebnisse müssen paarweise verschieden sein.", "pruefidee": "Lasttest mit N parallelen Threads, die `GetNextNumber(updateDatabase:true)` für denselben Nummernkreis aufrufen: alle N Ergebnisse müssen paarweise verschieden sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-007", "id": "SyRS-007",
@@ -344,7 +364,8 @@
"tracelinks": "StRS-003; SwRS-004", "tracelinks": "StRS-003; SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Änderung eines Belegs existiert ein neuer `ReceiptLog`-Eintrag mit korrektem Employee- und Zeitstempel-Wert.", "pruefidee": "Nach Änderung eines Belegs existiert ein neuer `ReceiptLog`-Eintrag mit korrektem Employee- und Zeitstempel-Wert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-008", "id": "SyRS-008",
@@ -360,7 +381,8 @@
"tracelinks": "StRS-008; SwRS-009", "tracelinks": "StRS-008; SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statuswechsel eines Tickets vom konfigurierten Abschlussstatus zurück auf \"in Bearbeitung\" führt zu `ClosedAt == null` nach dem Speichern.", "pruefidee": "Statuswechsel eines Tickets vom konfigurierten Abschlussstatus zurück auf \"in Bearbeitung\" führt zu `ClosedAt == null` nach dem Speichern.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-009", "id": "SyRS-009",
@@ -376,7 +398,8 @@
"tracelinks": "StRS-009; SwRS-010", "tracelinks": "StRS-009; SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Buchung eines Lieferscheinpostens mit abweichendem Einkaufspreis führt zu aktualisiertem `SecondaryStockArticle`-Preis für den betroffenen Artikel/Lagerort.", "pruefidee": "Buchung eines Lieferscheinpostens mit abweichendem Einkaufspreis führt zu aktualisiertem `SecondaryStockArticle`-Preis für den betroffenen Artikel/Lagerort.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-010", "id": "SyRS-010",
@@ -392,7 +415,8 @@
"tracelinks": "StRS-010; SwRS-004", "tracelinks": "StRS-010; SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden Partnerordner existiert mindestens eine BL-Klasse mit Importmethode; Testnachricht des Partnerformats erzeugt einen validen internen Beleg.", "pruefidee": "Für jeden Partnerordner existiert mindestens eine BL-Klasse mit Importmethode; Testnachricht des Partnerformats erzeugt einen validen internen Beleg.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-011", "id": "SyRS-011",
@@ -408,7 +432,8 @@
"tracelinks": "StRS-011; SwRS-012", "tracelinks": "StRS-011; SwRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein WebAccount ohne explizite WebAccountsRights-Zuweisung erhält bei `CheckWebRightsFromUser` eine leere Ergebnisliste, selbst wenn ein gleichnamiges internes Recht existiert.", "pruefidee": "Ein WebAccount ohne explizite WebAccountsRights-Zuweisung erhält bei `CheckWebRightsFromUser` eine leere Ergebnisliste, selbst wenn ein gleichnamiges internes Recht existiert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-012", "id": "SyRS-012",
@@ -424,7 +449,8 @@
"tracelinks": "StRS-012; SwRS-011", "tracelinks": "StRS-012; SwRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Modul mit `SupportsConnectionTypes = [SqlServer, CentronWebServices]` liefert bei beiden Verbindungsarten dieselben Testdaten für dieselbe Anfrage.", "pruefidee": "Ein Modul mit `SupportsConnectionTypes = [SqlServer, CentronWebServices]` liefert bei beiden Verbindungsarten dieselben Testdaten für dieselbe Anfrage.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-013", "id": "SyRS-013",
@@ -440,7 +466,8 @@
"tracelinks": "StRS-013", "tracelinks": "StRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für eine resx-Datei ohne .en.resx-Pendant liefert die Lokalisierung zur Laufzeit den deutschen Text statt eines Fehlers/leeren Strings.", "pruefidee": "Für eine resx-Datei ohne .en.resx-Pendant liefert die Lokalisierung zur Laufzeit den deutschen Text statt eines Fehlers/leeren Strings.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-014", "id": "SyRS-014",
@@ -457,7 +484,8 @@
"tracelinks": "StRS-001; SwRS-013", "tracelinks": "StRS-001; SwRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Passwortänderung enthält die Datenbankspalte `Password` einen 40-stelligen Hex-String, kein Klartext.", "pruefidee": "Nach Passwortänderung enthält die Datenbankspalte `Password` einen 40-stelligen Hex-String, kein Klartext.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-015", "id": "SyRS-015",
@@ -473,7 +501,8 @@
"tracelinks": "SyRS-014; SwRS-013", "tracelinks": "SyRS-014; SwRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Setzen eines Passworts mit Länge < PasswordMinLength liefert Result mit Status Error und der genannten Fehlermeldung.", "pruefidee": "Setzen eines Passworts mit Länge < PasswordMinLength liefert Result mit Status Error und der genannten Fehlermeldung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-001", "id": "SwRS-001",
@@ -490,7 +519,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-Test ruft CheckRightsFromUser mit einer Mischung aus zugewiesenen/nicht zugewiesenen Recht-IDs auf; Ergebnisliste enthält exakt die zugewiesene Teilmenge.", "pruefidee": "Unit-Test ruft CheckRightsFromUser mit einer Mischung aus zugewiesenen/nicht zugewiesenen Recht-IDs auf; Ergebnisliste enthält exakt die zugewiesene Teilmenge.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-002", "id": "SwRS-002",
@@ -506,7 +536,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Simulation einer Exception innerhalb der Session-Erzeugung während `HasUserRight`-Aufruf: Rückgabewert ist `false`, keine Exception propagiert zum Aufrufer.", "pruefidee": "Simulation einer Exception innerhalb der Session-Erzeugung während `HasUserRight`-Aufruf: Rückgabewert ist `false`, keine Exception propagiert zum Aufrufer.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-003", "id": "SwRS-003",
@@ -522,7 +553,8 @@
"tracelinks": "SyRS-002", "tracelinks": "SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für alle 2^3 Kombinationen der drei Basisrechte liefert die Methode den in der Tabelle der Fallunterscheidung dokumentierten Modus.", "pruefidee": "Für alle 2^3 Kombinationen der drei Basisrechte liefert die Methode den in der Tabelle der Fallunterscheidung dokumentierten Modus.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-004", "id": "SwRS-004",
@@ -539,7 +571,8 @@
"tracelinks": "SyRS-003, SyRS-004, SyRS-010", "tracelinks": "SyRS-003, SyRS-004, SyRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden in ReceiptProgressionBL verwendeten numerischen Code existiert ein korrespondierender, namentlich passender Enum-Wert in `CentronObjectKindNumeric` (Konsistenzprüfung Enum vs. SQL-Literale).", "pruefidee": "Für jeden in ReceiptProgressionBL verwendeten numerischen Code existiert ein korrespondierender, namentlich passender Enum-Wert in `CentronObjectKindNumeric` (Konsistenzprüfung Enum vs. SQL-Literale).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-005", "id": "SwRS-005",
@@ -555,7 +588,8 @@
"tracelinks": "SyRS-003, SyRS-004", "tracelinks": "SyRS-003, SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit gesetztem `DownPaymentForOrderI3D` erscheint bei Abfrage der verknüpften Objekte des referenzierten Auftrags.", "pruefidee": "Rechnung mit gesetztem `DownPaymentForOrderI3D` erscheint bei Abfrage der verknüpften Objekte des referenzierten Auftrags.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-006", "id": "SwRS-006",
@@ -571,7 +605,8 @@
"tracelinks": "SyRS-005", "tracelinks": "SyRS-005",
"konsolidierung": "Kandidat: Zwei redundante Zuordnungen (Attribut + switch-Methode) für dieselbe Information — im Zielsystem auf eine einzige Quelle konsolidierbar.", "konsolidierung": "Kandidat: Zwei redundante Zuordnungen (Attribut + switch-Methode) für dieselbe Information — im Zielsystem auf eine einzige Quelle konsolidierbar.",
"pruefidee": "Für jeden Enum-Wert liefern sowohl das Description-Attribut als auch `GetReceiptStateString()` denselben deutschen Text (Konsistenzprüfung der doppelten Definition).", "pruefidee": "Für jeden Enum-Wert liefern sowohl das Description-Attribut als auch `GetReceiptStateString()` denselben deutschen Text (Konsistenzprüfung der doppelten Definition).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-007", "id": "SwRS-007",
@@ -588,7 +623,8 @@
"tracelinks": "SyRS-006", "tracelinks": "SyRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei parallele Transaktionen mit demselben Ausgangswert `Current`: nur eine darf erfolgreich committen, die andere muss die Schleife erneut durchlaufen und einen anderen Wert erhalten.", "pruefidee": "Zwei parallele Transaktionen mit demselben Ausgangswert `Current`: nur eine darf erfolgreich committen, die andere muss die Schleife erneut durchlaufen und einen anderen Wert erhalten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-008", "id": "SwRS-008",
@@ -604,7 +640,8 @@
"tracelinks": "StRS-014", "tracelinks": "StRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Suche nach der konkreten Prüfmethode (voraussichtlich in einer `HelpdeskTimer*BL`-Klasse) und Verifikation der Bedingung im Code als Folgeschritt.", "pruefidee": "Suche nach der konkreten Prüfmethode (voraussichtlich in einer `HelpdeskTimer*BL`-Klasse) und Verifikation der Bedingung im Code als Folgeschritt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-009", "id": "SwRS-009",
@@ -620,7 +657,8 @@
"tracelinks": "SyRS-008", "tracelinks": "SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket im Abschlussstatus mit gesetztem ClosedAt wird auf \"in Bearbeitung\" umgestellt → nach Speichern ist ClosedAt == null.", "pruefidee": "Ticket im Abschlussstatus mit gesetztem ClosedAt wird auf \"in Bearbeitung\" umgestellt → nach Speichern ist ClosedAt == null.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-010", "id": "SwRS-010",
@@ -636,7 +674,8 @@
"tracelinks": "SyRS-009", "tracelinks": "SyRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei aufeinanderfolgende Wareneingänge mit unterschiedlichem Einkaufspreis führen zu einem im Artikel/Lagerort konsistent nachvollziehbaren, aktualisierten Preis (z. B. gleitender Durchschnitt oder letzter Preis – exakte Bewertungsmethode nicht Teil dieses Belegs).", "pruefidee": "Zwei aufeinanderfolgende Wareneingänge mit unterschiedlichem Einkaufspreis führen zu einem im Artikel/Lagerort konsistent nachvollziehbaren, aktualisierten Preis (z. B. gleitender Durchschnitt oder letzter Preis – exakte Bewertungsmethode nicht Teil dieses Belegs).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-011", "id": "SwRS-011",
@@ -652,7 +691,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neues Test-Modul mit korrektem Namensschema wird ohne expliziten Registrierungsaufruf über `ClassContainer.Instance.WithInstance<I...Logic>()` auflösbar.", "pruefidee": "Neues Test-Modul mit korrektem Namensschema wird ohne expliziten Registrierungsaufruf über `ClassContainer.Instance.WithInstance<I...Logic>()` auflösbar.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-012", "id": "SwRS-012",
@@ -668,7 +708,8 @@
"tracelinks": "SyRS-011", "tracelinks": "SyRS-011",
"konsolidierung": "Kandidat: Zwei parallele, strukturell unterschiedliche Rechtemodelle (gruppenbasiert für AppUser, direkt für WebAccount) — im Zielsystem ggf. auf ein einheitliches RBAC-Modell konsolidierbar.", "konsolidierung": "Kandidat: Zwei parallele, strukturell unterschiedliche Rechtemodelle (gruppenbasiert für AppUser, direkt für WebAccount) — im Zielsystem ggf. auf ein einheitliches RBAC-Modell konsolidierbar.",
"pruefidee": "Datenmodellprüfung: `WebAccountsRights` besitzt keine Fremdschlüsselspalte auf eine Gruppentabelle (Strukturvergleich mit `Sichtrus`/`Sichmemb`).", "pruefidee": "Datenmodellprüfung: `WebAccountsRights` besitzt keine Fremdschlüsselspalte auf eine Gruppentabelle (Strukturvergleich mit `Sichtrus`/`Sichmemb`).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-013", "id": "SwRS-013",
@@ -684,6 +725,7 @@
"tracelinks": "SyRS-014", "tracelinks": "SyRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei AppUser-Datensätze mit demselben Testpasswort erzeugen identische Werte in der Spalte `Password`.", "pruefidee": "Zwei AppUser-Datensätze mit demselben Testpasswort erzeugen identische Werte in der Spalte `Password`.",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -36,6 +38,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 38 (90,5 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 38 (90,5 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -53,5 +59,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (20 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (20 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 42 von 42 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 42 von 42 mit Tracelinks (100,0 %) |
@@ -96,6 +96,8 @@ allen V1b-Laeufen, wo sie um bis zu Faktor 21,6 auseinanderlagen.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -132,6 +134,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 80 (97,6 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 80 (97,6 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -149,6 +155,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 82 von 82 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 82 von 82 mit Tracelinks (100,0 %) |
## Vergleich V1 (solo) gegen V1b (builtin) ## Vergleich V1 (solo) gegen V1b (builtin)
@@ -15,7 +15,8 @@
"tracelinks": "SyRS-001, SyRS-002, SyRS-026", "tracelinks": "SyRS-001, SyRS-002, SyRS-026",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne die entsprechende Gruppenmitgliedschaft ruft eine rechtegeschützte Aktion auf (API und WPF) → Zugriff wird verweigert (403 bzw. Result.AsError mit RightCheckFailed).", "pruefidee": "Benutzer ohne die entsprechende Gruppenmitgliedschaft ruft eine rechtegeschützte Aktion auf (API und WPF) → Zugriff wird verweigert (403 bzw. Result.AsError mit RightCheckFailed).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-002", "id": "StRS-002",
@@ -32,7 +33,8 @@
"tracelinks": "SyRS-003, StRS-001", "tracelinks": "SyRS-003, StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anmeldung als WebAccount und Aufruf einer internen Beleg-Ansichtsfunktion → Result.AsError mit RightCheckFailed und Text \"Web-Benutzer haben keine Berechtigung Belege einzusehen.\"", "pruefidee": "Anmeldung als WebAccount und Aufruf einer internen Beleg-Ansichtsfunktion → Result.AsError mit RightCheckFailed und Text \"Web-Benutzer haben keine Berechtigung Belege einzusehen.\"",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-003", "id": "StRS-003",
@@ -49,7 +51,8 @@
"tracelinks": "SyRS-004, StRS-001", "tracelinks": "SyRS-004, StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer der Filiale A mit \"nur eigene Filiale\"-Recht versucht, einen Beleg der Filiale B zu bearbeiten → Fehlermeldung \"...einer anderen Filiale zu bearbeiten.\"", "pruefidee": "Benutzer der Filiale A mit \"nur eigene Filiale\"-Recht versucht, einen Beleg der Filiale B zu bearbeiten → Fehlermeldung \"...einer anderen Filiale zu bearbeiten.\"",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-004", "id": "StRS-004",
@@ -65,7 +68,8 @@
"tracelinks": "SyRS-005, StRS-001", "tracelinks": "SyRS-005, StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Löschversuch der Gruppe \"Administratoren\" → Result.AsError; Versuch, ein nicht in der Whitelist enthaltenes Recht der Admin-Gruppe zu entziehen → Operation liefert false/keine Änderung.", "pruefidee": "Löschversuch der Gruppe \"Administratoren\" → Result.AsError; Versuch, ein nicht in der Whitelist enthaltenes Recht der Admin-Gruppe zu entziehen → Operation liefert false/keine Änderung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-005", "id": "StRS-005",
@@ -82,7 +86,8 @@
"tracelinks": "SyRS-006", "tracelinks": "SyRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Zuweisung eines Rechts an eine Gruppe erscheint ein neuer Eintrag in GetAllAppRightLogs mit korrektem Beschreibungstext und Benutzerreferenz.", "pruefidee": "Nach Zuweisung eines Rechts an eine Gruppe erscheint ein neuer Eintrag in GetAllAppRightLogs mit korrektem Beschreibungstext und Benutzerreferenz.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-006", "id": "StRS-006",
@@ -100,7 +105,8 @@
"tracelinks": "SyRS-007, SyRS-008", "tracelinks": "SyRS-007, SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Angebot wird in einen Auftrag übernommen; GetReceiptForwardedInto(Angebot) liefert den erzeugten Auftrag als Ziel.", "pruefidee": "Ein Angebot wird in einen Auftrag übernommen; GetReceiptForwardedInto(Angebot) liefert den erzeugten Auftrag als Ziel.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-007", "id": "StRS-007",
@@ -117,7 +123,8 @@
"tracelinks": "SyRS-009, StRS-006", "tracelinks": "SyRS-009, StRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein stornierter Beleg kann nicht mehr als bezahlt markiert werden (Fehlermeldung); ein neu angelegter Beleg mit passender Zahlungsbedingung wird automatisch auf \"abgeschlossen\" gesetzt.", "pruefidee": "Ein stornierter Beleg kann nicht mehr als bezahlt markiert werden (Fehlermeldung); ein neu angelegter Beleg mit passender Zahlungsbedingung wird automatisch auf \"abgeschlossen\" gesetzt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-008", "id": "StRS-008",
@@ -134,7 +141,8 @@
"tracelinks": "SyRS-010, SyRS-011, StRS-006", "tracelinks": "SyRS-010, SyRS-011, StRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei simultane Speichervorgänge im selben Nummernkreis führen zu zwei unterschiedlichen, gültigen Nummern (kein Duplikat in der Zieltabelle).", "pruefidee": "Zwei simultane Speichervorgänge im selben Nummernkreis führen zu zwei unterschiedlichen, gültigen Nummern (kein Duplikat in der Zieltabelle).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-009", "id": "StRS-009",
@@ -151,7 +159,8 @@
"tracelinks": "SyRS-012, StRS-006", "tracelinks": "SyRS-012, StRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer A speichert einen Beleg; Benutzer B versucht anschließend, denselben (veralteten) Beleg mit alter ConcurrencyControlGuid zu speichern → Fehler \"was changed in the meantime\".", "pruefidee": "Benutzer A speichert einen Beleg; Benutzer B versucht anschließend, denselben (veralteten) Beleg mit alter ConcurrencyControlGuid zu speichern → Fehler \"was changed in the meantime\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-010", "id": "StRS-010",
@@ -167,7 +176,8 @@
"tracelinks": "SyRS-013, StRS-007", "tracelinks": "SyRS-013, StRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS-Recht (ohne allgemeines Bearbeitungsrecht) kann einen Beleg als bezahlt markieren; derselbe Versuch an einem stornierten Beleg schlägt fehl.", "pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS-Recht (ohne allgemeines Bearbeitungsrecht) kann einen Beleg als bezahlt markieren; derselbe Versuch an einem stornierten Beleg schlägt fehl.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-011", "id": "StRS-011",
@@ -184,7 +194,8 @@
"tracelinks": "SyRS-014, StRS-007", "tracelinks": "SyRS-014, StRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit aktivierter ZUGFeRD-Einstellung erzeugen → resultierendes PDF enthält eingebettetes XML gemäß ZUGFeRD-Schema.", "pruefidee": "Rechnung mit aktivierter ZUGFeRD-Einstellung erzeugen → resultierendes PDF enthält eingebettetes XML gemäß ZUGFeRD-Schema.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-012", "id": "StRS-012",
@@ -202,7 +213,8 @@
"tracelinks": "SyRS-015, StRS-001", "tracelinks": "SyRS-015, StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Signatureinstellungen (Zertifikat/TSA) werden von einem Benutzer ohne Administration.SETTINGS-Recht abgelehnt gespeichert; ein signiertes PDF weist eine gültige, prüfbare Signatur auf.", "pruefidee": "Signatureinstellungen (Zertifikat/TSA) werden von einem Benutzer ohne Administration.SETTINGS-Recht abgelehnt gespeichert; ein signiertes PDF weist eine gültige, prüfbare Signatur auf.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-013", "id": "StRS-013",
@@ -219,7 +231,8 @@
"tracelinks": "SyRS-016, StRS-012, StRS-020", "tracelinks": "SyRS-016, StRS-012, StRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf der URL .../weboffer/{gültigesToken} ohne vorherige Anmeldung zeigt das zugehörige Angebot inklusive Mandantenbranding an; ein ungültiges/abgelaufenes Token verweigert den Zugriff (Detail-Mechanismus nicht verifiziert, siehe Hypothesen.md).", "pruefidee": "Aufruf der URL .../weboffer/{gültigesToken} ohne vorherige Anmeldung zeigt das zugehörige Angebot inklusive Mandantenbranding an; ein ungültiges/abgelaufenes Token verweigert den Zugriff (Detail-Mechanismus nicht verifiziert, siehe Hypothesen.md).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-014", "id": "StRS-014",
@@ -236,7 +249,8 @@
"tracelinks": "SyRS-017, SyRS-018", "tracelinks": "SyRS-017, SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf von DataSecurityExecuteCleanUp mit gültigen Rechten führt zu keiner beobachtbaren Datenänderung (Abgleich Datenbestand vor/nach Aufruf) → bestätigt Stub-Charakter.", "pruefidee": "Aufruf von DataSecurityExecuteCleanUp mit gültigen Rechten führt zu keiner beobachtbaren Datenänderung (Abgleich Datenbestand vor/nach Aufruf) → bestätigt Stub-Charakter.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-015", "id": "StRS-015",
@@ -253,7 +267,8 @@
"tracelinks": "SyRS-019, SyRS-020", "tracelinks": "SyRS-019, SyRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Ticket mit IsOnlyInternalVisible=true zeigt den betreffenden Inhalt im Kundenportal nicht an; ein gesperrtes Ticket (LockUserName gesetzt) kann von einem zweiten Bearbeiter nicht gleichzeitig verändert werden (UI-seitige Prüfung, Detailmechanismus nicht vollständig verifiziert).", "pruefidee": "Ein Ticket mit IsOnlyInternalVisible=true zeigt den betreffenden Inhalt im Kundenportal nicht an; ein gesperrtes Ticket (LockUserName gesetzt) kann von einem zweiten Bearbeiter nicht gleichzeitig verändert werden (UI-seitige Prüfung, Detailmechanismus nicht vollständig verifiziert).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-016", "id": "StRS-016",
@@ -270,7 +285,8 @@
"tracelinks": "SyRS-021, StRS-015", "tracelinks": "SyRS-021, StRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne CanChangeDateInInvoices-Einstellung öffnet die Timer-Fakturierungs-Einstellungen für eine Rechnung → BillingDate-Feld ist deaktiviert, Hinweistext \"Sie besitzen nicht das Recht ... Datum der Rechnung nach neuer Version / bei Neuanlage ändern\" wird angezeigt.", "pruefidee": "Benutzer ohne CanChangeDateInInvoices-Einstellung öffnet die Timer-Fakturierungs-Einstellungen für eine Rechnung → BillingDate-Feld ist deaktiviert, Hinweistext \"Sie besitzen nicht das Recht ... Datum der Rechnung nach neuer Version / bei Neuanlage ändern\" wird angezeigt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-017", "id": "StRS-017",
@@ -286,7 +302,8 @@
"tracelinks": "SyRS-022", "tracelinks": "SyRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei aufeinanderfolgende Wareneingangsbuchungen mit unterschiedlichem Preis auf denselben Artikel → RawEk2 entspricht nach der zweiten Buchung dem Preis der ersten Buchung.", "pruefidee": "Zwei aufeinanderfolgende Wareneingangsbuchungen mit unterschiedlichem Preis auf denselben Artikel → RawEk2 entspricht nach der zweiten Buchung dem Preis der ersten Buchung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-018", "id": "StRS-018",
@@ -303,7 +320,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Mandant ohne Lizenz \"CentronInternal\" erhält bei Aufruf eines mit der Policy \"CentronHosted\" geschützten Endpunkts keinen Zugriff, unabhängig von individuellen Benutzerrechten.", "pruefidee": "Ein Mandant ohne Lizenz \"CentronInternal\" erhält bei Aufruf eines mit der Policy \"CentronHosted\" geschützten Endpunkts keinen Zugriff, unabhängig von individuellen Benutzerrechten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-019", "id": "StRS-019",
@@ -319,7 +337,8 @@
"tracelinks": "SyRS-024, SyRS-025, StRS-001", "tracelinks": "SyRS-024, SyRS-025, StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf eines geschützten Endpunkts ohne jegliches Authentifizierungsmerkmal → HTTP 401; Aufruf mit abgelaufenem JWT → 401 (ValidateLifetime=true).", "pruefidee": "Aufruf eines geschützten Endpunkts ohne jegliches Authentifizierungsmerkmal → HTTP 401; Aufruf mit abgelaufenem JWT → 401 (ValidateLifetime=true).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-020", "id": "StRS-020",
@@ -335,7 +354,8 @@
"tracelinks": "SyRS-027, StRS-013", "tracelinks": "SyRS-027, StRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Mandanten mit unterschiedlich konfiguriertem Logo erzeugen sichtbar unterschiedliche Web-Angebots-Seiten.", "pruefidee": "Zwei Mandanten mit unterschiedlich konfiguriertem Logo erzeugen sichtbar unterschiedliche Web-Angebots-Seiten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-001", "id": "SyRS-001",
@@ -351,7 +371,8 @@
"tracelinks": "StRS-001; SwRS-001, SwRS-002", "tracelinks": "StRS-001; SwRS-001, SwRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-/Integrationstest: Benutzer mit Gruppenmitgliedschaft X, Gruppe X besitzt Recht Y → HasUserRight(User, Y)==true; Entzug des Rechts → false nach Cache-Invalidierung.", "pruefidee": "Unit-/Integrationstest: Benutzer mit Gruppenmitgliedschaft X, Gruppe X besitzt Recht Y → HasUserRight(User, Y)==true; Entzug des Rechts → false nach Cache-Invalidierung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-002", "id": "SyRS-002",
@@ -368,7 +389,8 @@
"tracelinks": "StRS-001; SwRS-003", "tracelinks": "StRS-001; SwRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Integrationstest: Aufruf eines annotierten Endpunkts ohne Login → 401; mit Login aber ohne Recht → 403; mit Recht → 200.", "pruefidee": "Integrationstest: Aufruf eines annotierten Endpunkts ohne Login → 401; mit Login aber ohne Recht → 403; mit Recht → 200.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-003", "id": "SyRS-003",
@@ -384,7 +406,8 @@
"tracelinks": "StRS-002; SwRS-004", "tracelinks": "StRS-002; SwRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "WebAccount-Login mit (fehlerhaft) hinterlegtem internen AppRight versucht Belegeinsicht → dennoch RightCheckFailed.", "pruefidee": "WebAccount-Login mit (fehlerhaft) hinterlegtem internen AppRight versucht Belegeinsicht → dennoch RightCheckFailed.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-004", "id": "SyRS-004",
@@ -400,7 +423,8 @@
"tracelinks": "StRS-003; SwRS-005", "tracelinks": "StRS-003; SwRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne jegliches Bearbeitungsrecht → Meldung \"nicht das Recht ... zu bearbeiten\"; Benutzer mit Recht, aber falscher Filiale → Meldung \"... einer anderen Filiale zu bearbeiten\".", "pruefidee": "Benutzer ohne jegliches Bearbeitungsrecht → Meldung \"nicht das Recht ... zu bearbeiten\"; Benutzer mit Recht, aber falscher Filiale → Meldung \"... einer anderen Filiale zu bearbeiten\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-005", "id": "SyRS-005",
@@ -416,7 +440,8 @@
"tracelinks": "StRS-004; SwRS-006", "tracelinks": "StRS-004; SwRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Versuch, ein nicht in der Whitelist enthaltenes Recht (z. B. Rechteverwaltung selbst) von der Administratorengruppe zu entziehen → RemoveAssignGroupToRight liefert false.", "pruefidee": "Versuch, ein nicht in der Whitelist enthaltenes Recht (z. B. Rechteverwaltung selbst) von der Administratorengruppe zu entziehen → RemoveAssignGroupToRight liefert false.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-006", "id": "SyRS-006",
@@ -432,7 +457,8 @@
"tracelinks": "StRS-005; SwRS-007", "tracelinks": "StRS-005; SwRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach AddRightToRightGroup existiert genau ein neuer AppRightLog-Eintrag mit Kind=AddRightToGroup und korrektem Beschreibungstext.", "pruefidee": "Nach AddRightToRightGroup existiert genau ein neuer AppRightLog-Eintrag mit Kind=AddRightToGroup und korrektem Beschreibungstext.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-007", "id": "SyRS-007",
@@ -448,7 +474,8 @@
"tracelinks": "StRS-006; SwRS-008", "tracelinks": "StRS-006; SwRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede Unterklasse von ReceiptBase existieren gültige Implementierungen der vier abstrakten Members (Compile-Time-Prüfung).", "pruefidee": "Für jede Unterklasse von ReceiptBase existieren gültige Implementierungen der vier abstrakten Members (Compile-Time-Prüfung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-008", "id": "SyRS-008",
@@ -464,7 +491,8 @@
"tracelinks": "StRS-006; SwRS-009", "tracelinks": "StRS-006; SwRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Position P eines Angebots wurde in einen aktiven Auftrag übernommen → Versuch, P aus dem Angebot zu entfernen, wird als \"removedPositionsThatCouldNotBeRemoved\" erkannt.", "pruefidee": "Position P eines Angebots wurde in einen aktiven Auftrag übernommen → Versuch, P aus dem Angebot zu entfernen, wird als \"removedPositionsThatCouldNotBeRemoved\" erkannt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-009", "id": "SyRS-009",
@@ -480,7 +508,8 @@
"tracelinks": "StRS-007; SwRS-010", "tracelinks": "StRS-007; SwRS-010",
"konsolidierung": "Kandidat: SyRS-013 (beide betreffen UpdateReceiptIsPaid, unterschiedliche Prüfaspekte derselben Methode – im Zielsystem ggf. als eine zusammengesetzte Regel modellieren)", "konsolidierung": "Kandidat: SyRS-013 (beide betreffen UpdateReceiptIsPaid, unterschiedliche Prüfaspekte derselben Methode – im Zielsystem ggf. als eine zusammengesetzte Regel modellieren)",
"pruefidee": "UpdateReceiptIsPaid auf einem Canceled-Beleg → Result.AsError, kein Datenbank-Write.", "pruefidee": "UpdateReceiptIsPaid auf einem Canceled-Beleg → Result.AsError, kein Datenbank-Write.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-010", "id": "SyRS-010",
@@ -496,7 +525,8 @@
"tracelinks": "StRS-008; SwRS-011, SwRS-012", "tracelinks": "StRS-008; SwRS-011, SwRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lasttest: N parallele Aufrufe von GetNextNumber(..., updateDatabase:true) auf demselben Nummernkreis liefern N paarweise verschiedene Nummern.", "pruefidee": "Lasttest: N parallele Aufrufe von GetNextNumber(..., updateDatabase:true) auf demselben Nummernkreis liefern N paarweise verschiedene Nummern.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-011", "id": "SyRS-011",
@@ -513,7 +543,8 @@
"tracelinks": "StRS-008; SwRS-013", "tracelinks": "StRS-008; SwRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Filialen desselben Mandanten erzeugen unabhängig voneinander Rechnung Nr. 1000 ohne Kollision (unterschiedliche NumberGroup-Objekte).", "pruefidee": "Zwei Filialen desselben Mandanten erzeugen unabhängig voneinander Rechnung Nr. 1000 ohne Kollision (unterschiedliche NumberGroup-Objekte).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-012", "id": "SyRS-012",
@@ -529,7 +560,8 @@
"tracelinks": "StRS-009; SwRS-014", "tracelinks": "StRS-009; SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Speichern mit veralteter ConcurrencyControlGuid → Fehler ChangedByOtherInstance; Speichern mit übersprungener Versionsnummer (z. B. v1→v3) → Fehler \"keine gültige Versionsnummer\".", "pruefidee": "Speichern mit veralteter ConcurrencyControlGuid → Fehler ChangedByOtherInstance; Speichern mit übersprungener Versionsnummer (z. B. v1→v3) → Fehler \"keine gültige Versionsnummer\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-013", "id": "SyRS-013",
@@ -545,7 +577,8 @@
"tracelinks": "StRS-010; SwRS-010", "tracelinks": "StRS-010; SwRS-010",
"konsolidierung": "Kandidat: SyRS-009 (siehe dort)", "konsolidierung": "Kandidat: SyRS-009 (siehe dort)",
"pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS-Recht kann UpdateReceiptIsPaid erfolgreich ausführen, obwohl CanUserEditReceipt für ihn fehlschlägt.", "pruefidee": "Benutzer mit ausschließlich INCOMING_PAYMENT_TRANSACTIONS-Recht kann UpdateReceiptIsPaid erfolgreich ausführen, obwohl CanUserEditReceipt für ihn fehlschlägt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-014", "id": "SyRS-014",
@@ -561,7 +594,8 @@
"tracelinks": "StRS-011; SwRS-015", "tracelinks": "StRS-011; SwRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stornierte Rechnung mit aktivierter ZUGFeRD-Einstellung wird gedruckt → resultierendes PDF enthält KEINE ZUGFeRD-Struktur.", "pruefidee": "Stornierte Rechnung mit aktivierter ZUGFeRD-Einstellung wird gedruckt → resultierendes PDF enthält KEINE ZUGFeRD-Struktur.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-015", "id": "SyRS-015",
@@ -577,7 +611,8 @@
"tracelinks": "StRS-012; SwRS-016", "tracelinks": "StRS-012; SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Auslesen der zugrunde liegenden ApplicationSettings-Datensätze außerhalb der BL zeigt Base64/verschlüsselten, nicht lesbaren Wert für Zertifikat und Passwort.", "pruefidee": "Auslesen der zugrunde liegenden ApplicationSettings-Datensätze außerhalb der BL zeigt Base64/verschlüsselten, nicht lesbaren Wert für Zertifikat und Passwort.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-016", "id": "SyRS-016",
@@ -593,7 +628,8 @@
"tracelinks": "StRS-013; SwRS-017", "tracelinks": "StRS-013; SwRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf der Route mit gültigem Token in einem Browser ohne bestehende Session zeigt den Beleg an.", "pruefidee": "Aufruf der Route mit gültigem Token in einem Browser ohne bestehende Session zeigt den Beleg an.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-017", "id": "SyRS-017",
@@ -609,7 +645,8 @@
"tracelinks": "StRS-014; SwRS-018", "tracelinks": "StRS-014; SwRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit Recht, aber deaktiviertem Feature-Flag → \"Insufficient rights!\"; Benutzer ohne Recht, aber aktiviertem Flag → ebenfalls \"Insufficient rights!\".", "pruefidee": "Benutzer mit Recht, aber deaktiviertem Feature-Flag → \"Insufficient rights!\"; Benutzer ohne Recht, aber aktiviertem Flag → ebenfalls \"Insufficient rights!\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-018", "id": "SyRS-018",
@@ -625,7 +662,8 @@
"tracelinks": "StRS-014; SwRS-018", "tracelinks": "StRS-014; SwRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vergleich des Datenbankinhalts (betroffene Tabellen) vor und nach Aufruf von DataSecurityExecuteCleanUp mit denselben Filterkriterien wie zuvor in GetDataSecurityCleanUpStats verwendet → keine Änderung erwartet (bestätigt Lücke).", "pruefidee": "Vergleich des Datenbankinhalts (betroffene Tabellen) vor und nach Aufruf von DataSecurityExecuteCleanUp mit denselben Filterkriterien wie zuvor in GetDataSecurityCleanUpStats verwendet → keine Änderung erwartet (bestätigt Lücke).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-019", "id": "SyRS-019",
@@ -641,7 +679,8 @@
"tracelinks": "StRS-015; SwRS-019", "tracelinks": "StRS-015; SwRS-019",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Anlage eines neuen HelpdeskStateBase-Datensatzes über die Stammdatenverwaltung; neuer Status steht danach für Tickets zur Auswahl (Detailmechanismus der UI-Anbindung nicht vollständig verifiziert).", "pruefidee": "Anlage eines neuen HelpdeskStateBase-Datensatzes über die Stammdatenverwaltung; neuer Status steht danach für Tickets zur Auswahl (Detailmechanismus der UI-Anbindung nicht vollständig verifiziert).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-020", "id": "SyRS-020",
@@ -657,7 +696,8 @@
"tracelinks": "StRS-015; SwRS-020", "tracelinks": "StRS-015; SwRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Bearbeiter öffnen dasselbe Ticket; zweiter Bearbeiter erhält Hinweis auf Sperre durch ersten (LockUserName gesetzt).", "pruefidee": "Zwei Bearbeiter öffnen dasselbe Ticket; zweiter Bearbeiter erhält Hinweis auf Sperre durch ersten (LockUserName gesetzt).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-021", "id": "SyRS-021",
@@ -673,7 +713,8 @@
"tracelinks": "StRS-016; SwRS-021", "tracelinks": "StRS-016; SwRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für ReceiptKind=InvoiceClass mit CanChangeDateInInvoices=false → BillingDateIsEnabled=false, Hinweistext enthält \"der Rechnung\"; für DeliveryListClass entsprechend \"des Lieferscheins\".", "pruefidee": "Für ReceiptKind=InvoiceClass mit CanChangeDateInInvoices=false → BillingDateIsEnabled=false, Hinweistext enthält \"der Rechnung\"; für DeliveryListClass entsprechend \"des Lieferscheins\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-022", "id": "SyRS-022",
@@ -689,7 +730,8 @@
"tracelinks": "StRS-017; SwRS-022", "tracelinks": "StRS-017; SwRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Wareneingang mit Preis A, danach Wareneingang mit Preis B auf denselben Artikel im Hauptlager → nach zweiter Buchung: RawEk1=B, RawEk2=A.", "pruefidee": "Wareneingang mit Preis A, danach Wareneingang mit Preis B auf denselben Artikel im Hauptlager → nach zweiter Buchung: RawEk1=B, RawEk2=A.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-023", "id": "SyRS-023",
@@ -706,7 +748,8 @@
"tracelinks": "StRS-018, StRS-019; SwRS-023", "tracelinks": "StRS-018, StRS-019; SwRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Mandant ohne Lizenz CentronInternal ruft geschützten Endpunkt mit gültigem JWT eines berechtigten Benutzers auf → Zugriff dennoch verweigert.", "pruefidee": "Mandant ohne Lizenz CentronInternal ruft geschützten Endpunkt mit gültigem JWT eines berechtigten Benutzers auf → Zugriff dennoch verweigert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-024", "id": "SyRS-024",
@@ -722,7 +765,8 @@
"tracelinks": "StRS-019; SwRS-024", "tracelinks": "StRS-019; SwRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Manuell abgelaufener JWT wird bei Aufruf eines geschützten Endpunkts mit 401 abgelehnt (ValidateLifetime).", "pruefidee": "Manuell abgelaufener JWT wird bei Aufruf eines geschützten Endpunkts mit 401 abgelehnt (ValidateLifetime).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-025", "id": "SyRS-025",
@@ -738,7 +782,8 @@
"tracelinks": "StRS-019; SwRS-025", "tracelinks": "StRS-019; SwRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein gültiger SecretKey ohne gültiges JWT erlaubt Zugriff auf ausschließlich SecretKey-geschützte Endpunkte, nicht auf JWT-geschützte Endpunkte (und umgekehrt).", "pruefidee": "Ein gültiger SecretKey ohne gültiges JWT erlaubt Zugriff auf ausschließlich SecretKey-geschützte Endpunkte, nicht auf JWT-geschützte Endpunkte (und umgekehrt).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-026", "id": "SyRS-026",
@@ -754,7 +799,8 @@
"tracelinks": "StRS-001", "tracelinks": "StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Controller mit [AuthorizeUserRight(SETTINGS)] und Action mit zusätzlichem [AuthorizeUserRight(ADVANCED_SETTINGS)]: Benutzer mit nur SETTINGS erhält 403 auf dieser Action.", "pruefidee": "Controller mit [AuthorizeUserRight(SETTINGS)] und Action mit zusätzlichem [AuthorizeUserRight(ADVANCED_SETTINGS)]: Benutzer mit nur SETTINGS erhält 403 auf dieser Action.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-027", "id": "SyRS-027",
@@ -770,7 +816,8 @@
"tracelinks": "StRS-020; SwRS-017", "tracelinks": "StRS-020; SwRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Wechsel der BrandingConfig für einen Mandanten führt ohne Neubau der Anwendung zu geändertem Logo auf der Web-Angebots-Seite.", "pruefidee": "Wechsel der BrandingConfig für einen Mandanten führt ohne Neubau der Anwendung zu geändertem Logo auf der Web-Angebots-Seite.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-028", "id": "SyRS-028",
@@ -786,7 +833,8 @@
"tracelinks": "StRS-020", "tracelinks": "StRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Deployment desselben Images für einen Mandanten in einer anderen Zeitzone → Serverzeit bleibt Europe/Berlin (durch Log-Zeitstempel im Container zu verifizieren).", "pruefidee": "Deployment desselben Images für einen Mandanten in einer anderen Zeitzone → Serverzeit bleibt Europe/Berlin (durch Log-Zeitstempel im Container zu verifizieren).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-029", "id": "SyRS-029",
@@ -802,7 +850,8 @@
"tracelinks": "StRS-001; SwRS-001", "tracelinks": "StRS-001; SwRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Performance-Test: N aufeinanderfolgende HasUserRight-Aufrufe für denselben Benutzer erzeugen genau einen SQL-Query (Query-Zähler-Messung).", "pruefidee": "Performance-Test: N aufeinanderfolgende HasUserRight-Aufrufe für denselben Benutzer erzeugen genau einen SQL-Query (Query-Zähler-Messung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-030", "id": "SyRS-030",
@@ -818,7 +867,8 @@
"tracelinks": "StRS-018", "tracelinks": "StRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Start des gebauten Images ohne vorinstallierte .NET-Runtime auf dem Host → Anwendung startet erfolgreich (self-contained-Nachweis).", "pruefidee": "Start des gebauten Images ohne vorinstallierte .NET-Runtime auf dem Host → Anwendung startet erfolgreich (self-contained-Nachweis).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-031", "id": "SyRS-031",
@@ -835,7 +885,8 @@
"tracelinks": "StRS-012", "tracelinks": "StRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Build ohne gültigen DevExpress-Lizenzschlüssel → Build- oder Laufzeitfehler in signatur-/reportbezogenen Funktionen (nicht im Rahmen dieser statischen Analyse ausführbar getestet).", "pruefidee": "Build ohne gültigen DevExpress-Lizenzschlüssel → Build- oder Laufzeitfehler in signatur-/reportbezogenen Funktionen (nicht im Rahmen dieser statischen Analyse ausführbar getestet).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-032", "id": "SyRS-032",
@@ -853,7 +904,8 @@
"tracelinks": "StRS-018", "tracelinks": "StRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Migration einer einzelnen BL-Klasse mit Raw-SQL auf eine andere Datenbank ohne Anpassung der SQL-Strings schlägt fehl (z. B. IIF ist keine Standard-SQL-Funktion in PostgreSQL).", "pruefidee": "Migration einer einzelnen BL-Klasse mit Raw-SQL auf eine andere Datenbank ohne Anpassung der SQL-Strings schlägt fehl (z. B. IIF ist keine Standard-SQL-Funktion in PostgreSQL).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-033", "id": "SyRS-033",
@@ -870,7 +922,8 @@
"tracelinks": "StRS-001, StRS-006 bis StRS-018", "tracelinks": "StRS-001, StRS-006 bis StRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Codeanalyse: Anteil von BL-Methoden mit Rückgabetyp Result/Result\\<T\\> an rechteprüfenden/validierenden Methoden (Stichprobe zeigt nahezu 100 % in den analysierten Klassen).", "pruefidee": "Statische Codeanalyse: Anteil von BL-Methoden mit Rückgabetyp Result/Result\\<T\\> an rechteprüfenden/validierenden Methoden (Stichprobe zeigt nahezu 100 % in den analysierten Klassen).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-034", "id": "SyRS-034",
@@ -887,7 +940,8 @@
"tracelinks": "StRS-018", "tracelinks": "StRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "n/a (dokumentierender Befund, keine funktionale Prüfidee) - relevanter Hinweis für Datenmigrationsplanung.", "pruefidee": "n/a (dokumentierender Befund, keine funktionale Prüfidee) - relevanter Hinweis für Datenmigrationsplanung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-001", "id": "SwRS-001",
@@ -903,7 +957,8 @@
"tracelinks": "SyRS-001, SyRS-029", "tracelinks": "SyRS-001, SyRS-029",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Codeanalyse: keine weiteren Vorkommen von direktem SQL-Zugriff auf Sichtrus/Sichmemb außerhalb AppRightsBL im Backend-Quellcode.", "pruefidee": "Codeanalyse: keine weiteren Vorkommen von direktem SQL-Zugriff auf Sichtrus/Sichmemb außerhalb AppRightsBL im Backend-Quellcode.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-002", "id": "SwRS-002",
@@ -919,7 +974,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer in zwei Gruppen mit überschneidenden Rechten → Ergebnisliste enthält jedes Recht nur gemäß SQL-JOIN-Semantik (Duplikate möglich, da kein DISTINCT im Statement).", "pruefidee": "Benutzer in zwei Gruppen mit überschneidenden Rechten → Ergebnisliste enthält jedes Recht nur gemäß SQL-JOIN-Semantik (Duplikate möglich, da kein DISTINCT im Statement).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-003", "id": "SwRS-003",
@@ -935,7 +991,8 @@
"tracelinks": "SyRS-002", "tracelinks": "SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-Test des Filters mit gemocktem HttpContext ohne User → context.Result ist UnauthorizedResult; mit User ohne Recht → ForbidResult.", "pruefidee": "Unit-Test des Filters mit gemocktem HttpContext ohne User → context.Result ist UnauthorizedResult; mit User ohne Recht → ForbidResult.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-004", "id": "SwRS-004",
@@ -951,7 +1008,8 @@
"tracelinks": "SyRS-003", "tracelinks": "SyRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statischer Codepfad-Test: bei IsWebAccountLogin==true wird _specificLogics.Execute nicht erreicht (Branch-Coverage).", "pruefidee": "Statischer Codepfad-Test: bei IsWebAccountLogin==true wird _specificLogics.Execute nicht erreicht (Branch-Coverage).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-005", "id": "SwRS-005",
@@ -967,7 +1025,8 @@
"tracelinks": "SyRS-004", "tracelinks": "SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Testimplementierung von HasRightToEditReceipt für eine fiktive Belegart wird korrekt von CanUserEditReceipt verwendet, ohne dass die Methode selbst angepasst werden muss.", "pruefidee": "Neue Testimplementierung von HasRightToEditReceipt für eine fiktive Belegart wird korrekt von CanUserEditReceipt verwendet, ohne dass die Methode selbst angepasst werden muss.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-006", "id": "SwRS-006",
@@ -983,7 +1042,8 @@
"tracelinks": "SyRS-005", "tracelinks": "SyRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf von RemoveAssignGroupToRight mit einer nicht in der Liste enthaltenen Recht-I3D und der Administratorengruppe → Rückgabewert false, keine Datenbankänderung.", "pruefidee": "Aufruf von RemoveAssignGroupToRight mit einer nicht in der Liste enthaltenen Recht-I3D und der Administratorengruppe → Rückgabewert false, keine Datenbankänderung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-007", "id": "SwRS-007",
@@ -999,7 +1059,8 @@
"tracelinks": "SyRS-006", "tracelinks": "SyRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede der sieben Operationen existiert ein Test, der nach Ausführung einen AppRightLog mit korrektem Kind-Wert erwartet.", "pruefidee": "Für jede der sieben Operationen existiert ein Test, der nach Ausführung einen AppRightLog mit korrektem Kind-Wert erwartet.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-008", "id": "SwRS-008",
@@ -1015,7 +1076,8 @@
"tracelinks": "SyRS-007", "tracelinks": "SyRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Compile-Test: jede konkrete Receipt-Unterklasse implementiert alle vier abstrakten Members (Compiler erzwingt dies bereits strukturell).", "pruefidee": "Compile-Test: jede konkrete Receipt-Unterklasse implementiert alle vier abstrakten Members (Compiler erzwingt dies bereits strukturell).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-009", "id": "SwRS-009",
@@ -1031,7 +1093,8 @@
"tracelinks": "SyRS-008", "tracelinks": "SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Position in storniertem Folgebeleg → Entfernung aus Ursprungsbeleg wird nicht blockiert; Position in aktivem Folgebeleg → wird blockiert.", "pruefidee": "Position in storniertem Folgebeleg → Entfernung aus Ursprungsbeleg wird nicht blockiert; Position in aktivem Folgebeleg → wird blockiert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-010", "id": "SwRS-010",
@@ -1047,7 +1110,8 @@
"tracelinks": "SyRS-009, SyRS-013", "tracelinks": "SyRS-009, SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vier getrennte Testfälle, je einer pro Prüfschritt, der isoliert zum Fehlschlagen der Methode führt.", "pruefidee": "Vier getrennte Testfälle, je einer pro Prüfschritt, der isoliert zum Fehlschlagen der Methode führt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-011", "id": "SwRS-011",
@@ -1063,7 +1127,8 @@
"tracelinks": "SyRS-010", "tracelinks": "SyRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Manuelles Vorbelegen der Zieltabelle mit der rechnerisch nächsten Nummer → FindNextNumber überspringt diese und liefert die übernächste.", "pruefidee": "Manuelles Vorbelegen der Zieltabelle mit der rechnerisch nächsten Nummer → FindNextNumber überspringt diese und liefert die übernächste.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-012", "id": "SwRS-012",
@@ -1079,7 +1144,8 @@
"tracelinks": "SyRS-010", "tracelinks": "SyRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei simulierte parallele Aufrufe (z. B. über zwei Threads/Sessions) auf dieselbe NumberGroup → beide terminieren erfolgreich mit unterschiedlichem Ergebnis; kein Deadlock, keine Endlosschleife bei realistischer Last.", "pruefidee": "Zwei simulierte parallele Aufrufe (z. B. über zwei Threads/Sessions) auf dieselbe NumberGroup → beide terminieren erfolgreich mit unterschiedlichem Ergebnis; kein Deadlock, keine Endlosschleife bei realistischer Last.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-013", "id": "SwRS-013",
@@ -1096,7 +1162,8 @@
"tracelinks": "SyRS-011", "tracelinks": "SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Speichern eines Belegs für den konfigurierten Vorlagen-Kunden → erzeugte Nummer stammt nachweislich nicht aus derselben Zählersequenz wie reguläre Belege desselben Typs.", "pruefidee": "Speichern eines Belegs für den konfigurierten Vorlagen-Kunden → erzeugte Nummer stammt nachweislich nicht aus derselben Zählersequenz wie reguläre Belege desselben Typs.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-014", "id": "SwRS-014",
@@ -1112,7 +1179,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Speichern eines Belegs mit Version=Vorgänger+2 → Fehlermeldung \"keine gültige Versionsnummer\"; Version=Vorgänger (Überschreiben) und Version=Vorgänger+1 → jeweils erfolgreich.", "pruefidee": "Speichern eines Belegs mit Version=Vorgänger+2 → Fehlermeldung \"keine gültige Versionsnummer\"; Version=Vorgänger (Überschreiben) und Version=Vorgänger+1 → jeweils erfolgreich.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-015", "id": "SwRS-015",
@@ -1128,7 +1196,8 @@
"tracelinks": "SyRS-014", "tracelinks": "SyRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit global deaktiviertem, aber lokal aktiviertem ZUGFeRD → PDF enthält ZUGFeRD-Struktur (bestätigt ODER-Semantik der Aktivierungsquelle).", "pruefidee": "Rechnung mit global deaktiviertem, aber lokal aktiviertem ZUGFeRD → PDF enthält ZUGFeRD-Struktur (bestätigt ODER-Semantik der Aktivierungsquelle).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-016", "id": "SwRS-016",
@@ -1144,7 +1213,8 @@
"tracelinks": "SyRS-015", "tracelinks": "SyRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direktes Auslesen der zugrunde liegenden ApplicationSettings-Zeile für PdfSigningCertificatePassword zeigt keinen erkennbaren Klartextwert.", "pruefidee": "Direktes Auslesen der zugrunde liegenden ApplicationSettings-Zeile für PdfSigningCertificatePassword zeigt keinen erkennbaren Klartextwert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-017", "id": "SwRS-017",
@@ -1160,7 +1230,8 @@
"tracelinks": "SyRS-016, SyRS-027", "tracelinks": "SyRS-016, SyRS-027",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf mit syntaktisch validem, aber nicht existierendem Token → definiertes Fehlverhalten (z. B. leere Seite/Fehlermeldung; exakter Mechanismus nicht verifiziert, siehe Hypothesen.md).", "pruefidee": "Aufruf mit syntaktisch validem, aber nicht existierendem Token → definiertes Fehlverhalten (z. B. leere Seite/Fehlermeldung; exakter Mechanismus nicht verifiziert, siehe Hypothesen.md).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-018", "id": "SwRS-018",
@@ -1176,7 +1247,8 @@
"tracelinks": "SyRS-017, SyRS-018", "tracelinks": "SyRS-017, SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf von DataSecurityExecuteCleanUp mit denselben Filterkriterien wie eine zuvor als \"zu bereinigen\" ausgewiesene Statistik → betroffene Datensätze bleiben unverändert (Regressionstest zur Schließung dieser Lücke empfohlen).", "pruefidee": "Aufruf von DataSecurityExecuteCleanUp mit denselben Filterkriterien wie eine zuvor als \"zu bereinigen\" ausgewiesene Statistik → betroffene Datensätze bleiben unverändert (Regressionstest zur Schließung dieser Lücke empfohlen).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-019", "id": "SwRS-019",
@@ -1192,7 +1264,8 @@
"tracelinks": "SyRS-019", "tracelinks": "SyRS-019",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Datenbankseitiges Anlegen eines neuen HelpdeskStateBase-Datensatzes wird von der Anwendung ohne Codeänderung akzeptiert (keine Enum-Validierung im Entitätscode erkennbar).", "pruefidee": "Datenbankseitiges Anlegen eines neuen HelpdeskStateBase-Datensatzes wird von der Anwendung ohne Codeänderung akzeptiert (keine Enum-Validierung im Entitätscode erkennbar).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-020", "id": "SwRS-020",
@@ -1208,7 +1281,8 @@
"tracelinks": "SyRS-020", "tracelinks": "SyRS-020",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Serialisierung/Deserialisierung eines Helpdesk-Datensatzes bewahrt alle genannten Feldwerte verlustfrei (Struktur-Test).", "pruefidee": "Serialisierung/Deserialisierung eines Helpdesk-Datensatzes bewahrt alle genannten Feldwerte verlustfrei (Struktur-Test).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-021", "id": "SwRS-021",
@@ -1224,7 +1298,8 @@
"tracelinks": "SyRS-021", "tracelinks": "SyRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Property-Change-Test: Setzen von ReceiptKind=InvoiceClass löst automatisch einen Aufruf von UpdateBillingDateIsEnabled aus (SetProperty-Callback, Z. 195-199 im Diff).", "pruefidee": "Property-Change-Test: Setzen von ReceiptKind=InvoiceClass löst automatisch einen Aufruf von UpdateBillingDateIsEnabled aus (SetProperty-Callback, Z. 195-199 im Diff).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-022", "id": "SwRS-022",
@@ -1240,7 +1315,8 @@
"tracelinks": "SyRS-022", "tracelinks": "SyRS-022",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Hauptlagerbuchungen mit identischem Preis → PurchasePrice bleibt unverändert, RawEk1/RawEk1Date werden dennoch aktualisiert (Else-Zweig Z. 3639-3651).", "pruefidee": "Zwei Hauptlagerbuchungen mit identischem Preis → PurchasePrice bleibt unverändert, RawEk1/RawEk1Date werden dennoch aktualisiert (Else-Zweig Z. 3639-3651).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-023", "id": "SwRS-023",
@@ -1256,7 +1332,8 @@
"tracelinks": "SyRS-023", "tracelinks": "SyRS-023",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-Test: HasLicense liefert false → context.HasSucceeded bleibt false nach Aufruf; HasLicense liefert true → context.HasSucceeded==true.", "pruefidee": "Unit-Test: HasLicense liefert false → context.HasSucceeded bleibt false nach Aufruf; HasLicense liefert true → context.HasSucceeded==true.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-024", "id": "SwRS-024",
@@ -1272,7 +1349,8 @@
"tracelinks": "SyRS-024", "tracelinks": "SyRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Token mit falscher Audience → Ablehnung (ValidateAudience); Token mit Claim \"sub\", DefaultMapInboundClaims=false → Claim bleibt \"sub\", nicht auf ClaimTypes.NameIdentifier gemappt.", "pruefidee": "Token mit falscher Audience → Ablehnung (ValidateAudience); Token mit Claim \"sub\", DefaultMapInboundClaims=false → Claim bleibt \"sub\", nicht auf ClaimTypes.NameIdentifier gemappt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-025", "id": "SwRS-025",
@@ -1289,7 +1367,8 @@
"tracelinks": "SyRS-025", "tracelinks": "SyRS-025",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Request mit korrektem SecretKey, aber ohne JWT/Ticket → Zugriff auf SecretKey-Policy-geschützte Endpunkte erfolgreich, auf JWT-geschützte Endpunkte weiterhin verweigert.", "pruefidee": "Request mit korrektem SecretKey, aber ohne JWT/Ticket → Zugriff auf SecretKey-Policy-geschützte Endpunkte erfolgreich, auf JWT-geschützte Endpunkte weiterhin verweigert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-026", "id": "SwRS-026",
@@ -1305,7 +1384,8 @@
"tracelinks": "SyRS-033", "tracelinks": "SyRS-033",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stichprobenartige Codeanalyse über weitere *BL-Klassen außerhalb der explizit gelesenen Stichprobe bestätigt dasselbe Muster (Konsistenzprüfung, im Rahmen dieser Iteration nicht flächendeckend durchgeführt).", "pruefidee": "Stichprobenartige Codeanalyse über weitere *BL-Klassen außerhalb der explizit gelesenen Stichprobe bestätigt dasselbe Muster (Konsistenzprüfung, im Rahmen dieser Iteration nicht flächendeckend durchgeführt).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-027", "id": "SwRS-027",
@@ -1322,7 +1402,8 @@
"tracelinks": "SyRS-033", "tracelinks": "SyRS-033",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Codeanalyse: Anteil öffentlicher BL-Methoden mit Rückgabetyp Result/Result\\<T\\> in den analysierten Klassen (Stichprobe: deutlich überwiegend, exakte Quote nicht vollständig erhoben).", "pruefidee": "Codeanalyse: Anteil öffentlicher BL-Methoden mit Rückgabetyp Result/Result\\<T\\> in den analysierten Klassen (Stichprobe: deutlich überwiegend, exakte Quote nicht vollständig erhoben).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-028", "id": "SwRS-028",
@@ -1338,6 +1419,7 @@
"tracelinks": "SyRS-007, SyRS-034", "tracelinks": "SyRS-007, SyRS-034",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Historische Konsistenzprüfung: keine doppelt vergebenen numerischen Werte in der Enum-Definition (Stichprobenprüfung während der Analyse ergab keine Duplikate, siehe Analysebericht Konsistenzcheck).", "pruefidee": "Historische Konsistenzprüfung: keine doppelt vergebenen numerischen Werte in der Enum-Definition (Stichprobenprüfung während der Analyse ergab keine Duplikate, siehe Analysebericht Konsistenzcheck).",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 80 (97,6 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 80 (97,6 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 82 von 82 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 82 von 82 mit Tracelinks (100,0 %) |
@@ -97,6 +97,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-sonnet-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -132,6 +134,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 45 (75,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 45 (75,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -149,6 +155,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 26 ungedeckt: SwRS-003 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 26 ungedeckt: SwRS-003 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 59 von 60 mit Tracelinks (98,3 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 59 von 60 mit Tracelinks (98,3 %) |
## V1-Reihe: fünf Messpunkte unter identischer Bedingung ## V1-Reihe: fünf Messpunkte unter identischer Bedingung
@@ -15,7 +15,8 @@
"tracelinks": "SyRS-001, SyRS-002", "tracelinks": "SyRS-001, SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einem Testbenutzer wird gezielt ein Einzelrecht (z. B. ADD_NEW_HELPDESK) entzogen; Ticketanlage muss verweigert werden, während andere Helpdesk-Funktionen weiter verfügbar bleiben.", "pruefidee": "Einem Testbenutzer wird gezielt ein Einzelrecht (z. B. ADD_NEW_HELPDESK) entzogen; Ticketanlage muss verweigert werden, während andere Helpdesk-Funktionen weiter verfügbar bleiben.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-002", "id": "StRS-002",
@@ -32,7 +33,8 @@
"tracelinks": "SyRS-001, SyRS-002", "tracelinks": "SyRS-001, SyRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Benutzer derselben Gruppe, einer zusätzlich mit SHOW_HELPDESK_ONLY_OWN: Ersterer sieht alle Tickets der Filiale, Zweiterer nur eigene.", "pruefidee": "Zwei Benutzer derselben Gruppe, einer zusätzlich mit SHOW_HELPDESK_ONLY_OWN: Ersterer sieht alle Tickets der Filiale, Zweiterer nur eigene.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-003", "id": "StRS-003",
@@ -49,7 +51,8 @@
"tracelinks": "SyRS-003, SyRS-004", "tracelinks": "SyRS-003, SyRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede Belegart existiert eine Entity-Klasse, die von ReceiptBase erbt und ReceiptKind/GetReceiptItems() implementiert (Code-Review/Reflektion).", "pruefidee": "Für jede Belegart existiert eine Entity-Klasse, die von ReceiptBase erbt und ReceiptKind/GetReceiptItems() implementiert (Code-Review/Reflektion).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-004", "id": "StRS-004",
@@ -66,7 +69,8 @@
"tracelinks": "SyRS-005, SwRS-005", "tracelinks": "SyRS-005, SwRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Änderung eines Rechnungsfeldes existiert ein neuer Datensatz in RechKopfVersions mit dem vorherigen Wert und OriginalI3D-Referenz auf den aktuellen Datensatz.", "pruefidee": "Nach Änderung eines Rechnungsfeldes existiert ein neuer Datensatz in RechKopfVersions mit dem vorherigen Wert und OriginalI3D-Referenz auf den aktuellen Datensatz.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-005", "id": "StRS-005",
@@ -83,7 +87,8 @@
"tracelinks": "SyRS-006, SyRS-007", "tracelinks": "SyRS-006, SyRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde ruft Link auf, ändert Menge einer Position, klickt „Annehmen“ → Zustand AcceptWebReceiptWithChangeRequests wird gesetzt, keine automatische Auftragsanlage ohne weiteren Schritt (siehe SyRS-006).", "pruefidee": "Kunde ruft Link auf, ändert Menge einer Position, klickt „Annehmen“ → Zustand AcceptWebReceiptWithChangeRequests wird gesetzt, keine automatische Auftragsanlage ohne weiteren Schritt (siehe SyRS-006).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-006", "id": "StRS-006",
@@ -100,7 +105,8 @@
"tracelinks": "SyRS-007, SyRS-008, SwRS-010", "tracelinks": "SyRS-007, SyRS-008, SwRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Bei AllowAcceptReceiptWithoutSignature=false darf ReceiptBL.AcceptWebReceipt keinen Auftrag erzeugen, bevor der Signaturvorgang abgeschlossen ist (Statuscheck WebReceiptState.WebOfferSign vor Abschluss).", "pruefidee": "Bei AllowAcceptReceiptWithoutSignature=false darf ReceiptBL.AcceptWebReceipt keinen Auftrag erzeugen, bevor der Signaturvorgang abgeschlossen ist (Statuscheck WebReceiptState.WebOfferSign vor Abschluss).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-007", "id": "StRS-007",
@@ -118,7 +124,8 @@
"tracelinks": "SyRS-007, SwRS-010", "tracelinks": "SyRS-007, SwRS-010",
"konsolidierung": "Kandidat: StRS-006 (gleiche fachliche Funktion „Auftragserteilung“, unterschiedliche Ausprägung der Signaturpflicht – im Zielsystem als ein konfigurierbarer Ablauf statt zwei Codepfade zu modellieren)", "konsolidierung": "Kandidat: StRS-006 (gleiche fachliche Funktion „Auftragserteilung“, unterschiedliche Ausprägung der Signaturpflicht – im Zielsystem als ein konfigurierbarer Ablauf statt zwei Codepfade zu modellieren)",
"pruefidee": "Beleg mit AllowAcceptReceiptWithoutSignature=true: Nach Klick „Annehmen“ entsteht sofort ein Auftrag, WebReceiptState wird nicht auf WebOfferSign gesetzt.", "pruefidee": "Beleg mit AllowAcceptReceiptWithoutSignature=true: Nach Klick „Annehmen“ entsteht sofort ein Auftrag, WebReceiptState wird nicht auf WebOfferSign gesetzt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-008", "id": "StRS-008",
@@ -136,7 +143,8 @@
"tracelinks": "SyRS-009, SyRS-010, SwRS-014", "tracelinks": "SyRS-009, SyRS-010, SwRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit AutomatedBilling=true und BillingIntervalKind=Monthly erzeugt nach Ablauf des Intervalls automatisch eine neue Rechnung mit korrektem Betrag.", "pruefidee": "Vertrag mit AutomatedBilling=true und BillingIntervalKind=Monthly erzeugt nach Ablauf des Intervalls automatisch eine neue Rechnung mit korrektem Betrag.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-009", "id": "StRS-009",
@@ -152,7 +160,8 @@
"tracelinks": "SyRS-010", "tracelinks": "SyRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit ContingentLimitValue=100h und Verbrauch von 105h löst laut Konfiguration eine Zusatzberechnung/Benachrichtigung aus.", "pruefidee": "Vertrag mit ContingentLimitValue=100h und Verbrauch von 105h löst laut Konfiguration eine Zusatzberechnung/Benachrichtigung aus.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-010", "id": "StRS-010",
@@ -169,7 +178,8 @@
"tracelinks": "SyRS-011, SwRS-015, SwRS-016", "tracelinks": "SyRS-011, SwRS-015, SwRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne das entsprechende Recht öffnet Timer-Billing-Assistent für Rechnungen: Feld „Belegdatum“ ist deaktiviert, Info-Icon mit Tooltip „Sie besitzen nicht das Recht ... ist sichtbar.", "pruefidee": "Benutzer ohne das entsprechende Recht öffnet Timer-Billing-Assistent für Rechnungen: Feld „Belegdatum“ ist deaktiviert, Info-Icon mit Tooltip „Sie besitzen nicht das Recht ... ist sichtbar.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-011", "id": "StRS-011",
@@ -185,7 +195,8 @@
"tracelinks": "SyRS-012", "tracelinks": "SyRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Administrator legt neuen Status „Wartet auf Kunde“ an, weist ihn keinem der beiden Sondersettings zu: Status erscheint wählbar, löst aber keine Sonderlogik (Schließen/Reopen-Default) aus.", "pruefidee": "Administrator legt neuen Status „Wartet auf Kunde“ an, weist ihn keinem der beiden Sondersettings zu: Status erscheint wählbar, löst aber keine Sonderlogik (Schließen/Reopen-Default) aus.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-012", "id": "StRS-012",
@@ -201,7 +212,8 @@
"tracelinks": "SyRS-012, SwRS-018", "tracelinks": "SyRS-012, SwRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Löschversuch eines Status, der auf 3 Tickets und 1 Task verwendet wird, liefert Fehlermeldung „... wird in 3 Tickets & 1 Task verwendet.“ und der Datensatz bleibt bestehen.", "pruefidee": "Löschversuch eines Status, der auf 3 Tickets und 1 Task verwendet wird, liefert Fehlermeldung „... wird in 3 Tickets & 1 Task verwendet.“ und der Datensatz bleibt bestehen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-013", "id": "StRS-013",
@@ -218,7 +230,8 @@
"tracelinks": "SyRS-013, SyRS-014", "tracelinks": "SyRS-013, SyRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Import einer ALSO-CH-Auftragsbestätigungsdatei führt zu aktualisiertem Auftragsstatus im referenzierten c-entron-Auftrag ohne manuellen Eingriff.", "pruefidee": "Import einer ALSO-CH-Auftragsbestätigungsdatei führt zu aktualisiertem Auftragsstatus im referenzierten c-entron-Auftrag ohne manuellen Eingriff.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-014", "id": "StRS-014",
@@ -234,7 +247,8 @@
"tracelinks": "SyRS-013", "tracelinks": "SyRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Code-Inspektion von SupplierEdiBL.Komsa.cs bestätigt Fehlen einer Invoice-Verarbeitungsmethode.", "pruefidee": "Code-Inspektion von SupplierEdiBL.Komsa.cs bestätigt Fehlen einer Invoice-Verarbeitungsmethode.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-015", "id": "StRS-015",
@@ -251,7 +265,8 @@
"tracelinks": "SyRS-015, SyRS-016, SwRS-020, SwRS-021", "tracelinks": "SyRS-015, SyRS-016, SwRS-020, SwRS-021",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Lizenz OpenIDConnectAuthentication erhält bei OIDC-Login-Versuch den Fehler „No license for OpenIDConnectAuthentication“, unabhängig von einem gültigen Microsoft-Token.", "pruefidee": "Benutzer ohne Lizenz OpenIDConnectAuthentication erhält bei OIDC-Login-Versuch den Fehler „No license for OpenIDConnectAuthentication“, unabhängig von einem gültigen Microsoft-Token.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-016", "id": "StRS-016",
@@ -268,7 +283,8 @@
"tracelinks": "SyRS-015, SyRS-017", "tracelinks": "SyRS-015, SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "LicenseManager.Instance.HasLicense(LicenseGuids.PasswordManager) liefert false für einen Kunden ohne diese Lizenz, UI-Modul „Passwort-Manager“ wird nicht angezeigt.", "pruefidee": "LicenseManager.Instance.HasLicense(LicenseGuids.PasswordManager) liefert false für einen Kunden ohne diese Lizenz, UI-Modul „Passwort-Manager“ wird nicht angezeigt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-017", "id": "StRS-017",
@@ -285,7 +301,8 @@
"tracelinks": "SyRS-018, SwRS-024", "tracelinks": "SyRS-018, SwRS-024",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ribbon minimieren, Modul wechseln: aktiver Tab zeigt sichtbare Unterstreichung/Hervorhebung ohne Ribbon-Expansion.", "pruefidee": "Ribbon minimieren, Modul wechseln: aktiver Tab zeigt sichtbare Unterstreichung/Hervorhebung ohne Ribbon-Expansion.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-001", "id": "SyRS-001",
@@ -302,7 +319,8 @@
"tracelinks": "StRS-001", "tracelinks": "StRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter Webservice-Aufruf (unter Umgehung der UI) einer rechtebehafteten Methode ohne das erforderliche Recht muss serverseitig abgelehnt werden, auch wenn die UI die Aktion nicht anbietet.", "pruefidee": "Direkter Webservice-Aufruf (unter Umgehung der UI) einer rechtebehafteten Methode ohne das erforderliche Recht muss serverseitig abgelehnt werden, auch wenn die UI die Aktion nicht anbietet.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-002", "id": "SyRS-002",
@@ -319,7 +337,8 @@
"tracelinks": "StRS-002", "tracelinks": "StRS-002",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Support-Mitarbeiter unterschiedlicher Filialen mit SHOW_HELPDESK_ONLY_OWN_BRANCH sehen bei identischer Suchanfrage jeweils nur Tickets ihrer eigenen Filiale.", "pruefidee": "Zwei Support-Mitarbeiter unterschiedlicher Filialen mit SHOW_HELPDESK_ONLY_OWN_BRANCH sehen bei identischer Suchanfrage jeweils nur Tickets ihrer eigenen Filiale.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-003", "id": "SyRS-003",
@@ -335,7 +354,8 @@
"tracelinks": "StRS-003", "tracelinks": "StRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "SELECT * FROM Invoices liefert dieselben fachlichen Felder wie eine direkte Abfrage auf RechKopf, jedoch mit englischen Spaltennamen.", "pruefidee": "SELECT * FROM Invoices liefert dieselben fachlichen Felder wie eine direkte Abfrage auf RechKopf, jedoch mit englischen Spaltennamen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-004", "id": "SyRS-004",
@@ -351,7 +371,8 @@
"tracelinks": "StRS-003", "tracelinks": "StRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein neues Rechnungsfeld wird nur im View/Entity ergänzt (nicht im Repository): Wert lädt korrekt, geht aber nach dem nächsten Speichervorgang verloren (Regressionstest).", "pruefidee": "Ein neues Rechnungsfeld wird nur im View/Entity ergänzt (nicht im Repository): Wert lädt korrekt, geht aber nach dem nächsten Speichervorgang verloren (Regressionstest).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-005", "id": "SyRS-005",
@@ -367,7 +388,8 @@
"tracelinks": "StRS-004", "tracelinks": "StRS-004",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach zwei aufeinanderfolgenden Änderungen an einem Vertrag existieren zwei Datensätze in VertragKopfVersions mit korrektem OriginalI3D-Bezug und vollständigen historischen Werten.", "pruefidee": "Nach zwei aufeinanderfolgenden Änderungen an einem Vertrag existieren zwei Datensätze in VertragKopfVersions mit korrektem OriginalI3D-Bezug und vollständigen historischen Werten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-006", "id": "SyRS-006",
@@ -383,7 +405,8 @@
"tracelinks": "StRS-005", "tracelinks": "StRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zugriff auf `/weboffer/{Token}` mit geratenem/ungültigem Token liefert Fehlermeldung „Beleg konnte nicht geladen werden.“ statt Fremddaten.", "pruefidee": "Zugriff auf `/weboffer/{Token}` mit geratenem/ungültigem Token liefert Fehlermeldung „Beleg konnte nicht geladen werden.“ statt Fremddaten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-007", "id": "SyRS-007",
@@ -400,7 +423,8 @@
"tracelinks": "StRS-005", "tracelinks": "StRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zweiter Aufruf von ChangeWebReceiptState nach bereits erfolgter Annahme wird serverseitig abgelehnt (Statuscheck), nicht nur clientseitig durch deaktivierte Buttons verhindert.", "pruefidee": "Zweiter Aufruf von ChangeWebReceiptState nach bereits erfolgter Annahme wird serverseitig abgelehnt (Statuscheck), nicht nur clientseitig durch deaktivierte Buttons verhindert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-008", "id": "SyRS-008",
@@ -416,7 +440,8 @@
"tracelinks": "StRS-006", "tracelinks": "StRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Manipulierter API-Request, der versucht, direkt einen Auftrag ohne vorherigen Signatur-Callback zu erzeugen, wird von ReceiptBL abgelehnt, da der Beleg noch im Zustand WebOfferSign verharrt.", "pruefidee": "Manipulierter API-Request, der versucht, direkt einen Auftrag ohne vorherigen Signatur-Callback zu erzeugen, wird von ReceiptBL abgelehnt, da der Beleg noch im Zustand WebOfferSign verharrt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-009", "id": "SyRS-009",
@@ -432,7 +457,8 @@
"tracelinks": "StRS-008", "tracelinks": "StRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit BillingIntervalKind=Monthly, AutomatedBilling=true: Am Fälligkeitstag entsteht ohne manuellen Eingriff eine neue Rechnung.", "pruefidee": "Vertrag mit BillingIntervalKind=Monthly, AutomatedBilling=true: Am Fälligkeitstag entsteht ohne manuellen Eingriff eine neue Rechnung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-010", "id": "SyRS-010",
@@ -448,7 +474,8 @@
"tracelinks": "StRS-009", "tracelinks": "StRS-009",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Änderung der Menge eines kontingentrelevanten Beleg-Items löst Neuberechnung von ContingentBalanceUsedHours aus.", "pruefidee": "Änderung der Menge eines kontingentrelevanten Beleg-Items löst Neuberechnung von ContingentBalanceUsedHours aus.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-011", "id": "SyRS-011",
@@ -464,7 +491,8 @@
"tracelinks": "StRS-010", "tracelinks": "StRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Änderung des zugrunde liegenden Rechts wirkt sich unmittelbar (nach Cache-Refresh) sowohl im Timer-Billing als auch in anderen Belegdatums-Kontexten gleich aus.", "pruefidee": "Änderung des zugrunde liegenden Rechts wirkt sich unmittelbar (nach Cache-Refresh) sowohl im Timer-Billing als auch in anderen Belegdatums-Kontexten gleich aus.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-012", "id": "SyRS-012",
@@ -480,7 +508,8 @@
"tracelinks": "StRS-011, StRS-012", "tracelinks": "StRS-011, StRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ändern der Anwendungseinstellung HelpdeskClosedState auf einen anderen Status-I3D bewirkt sofort, dass GetClosedHelpdeskStatus() den neuen Status liefert.", "pruefidee": "Ändern der Anwendungseinstellung HelpdeskClosedState auf einen anderen Status-I3D bewirkt sofort, dass GetClosedHelpdeskStatus() den neuen Status liefert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-013", "id": "SyRS-013",
@@ -497,7 +526,8 @@
"tracelinks": "StRS-013", "tracelinks": "StRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf von ApplyDistriToCentron mit EdiDataType=Alltron delegiert nachweislich an eine SupplierEdiBL.Alltron.cs-Methode (z. B. per Log-Eintrag oder Debugger).", "pruefidee": "Aufruf von ApplyDistriToCentron mit EdiDataType=Alltron delegiert nachweislich an eine SupplierEdiBL.Alltron.cs-Methode (z. B. per Log-Eintrag oder Debugger).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-014", "id": "SyRS-014",
@@ -513,7 +543,8 @@
"tracelinks": "StRS-013, StRS-014", "tracelinks": "StRS-013, StRS-014",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "EDI-Testdatei mit einer fehlerhaften und neun korrekten Positionszeilen: Neun Positionen werden verarbeitet, eine wird mit Fehlerprotokoll übersprungen.", "pruefidee": "EDI-Testdatei mit einer fehlerhaften und neun korrekten Positionszeilen: Neun Positionen werden verarbeitet, eine wird mit Fehlerprotokoll übersprungen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-015", "id": "SyRS-015",
@@ -529,7 +560,8 @@
"tracelinks": "StRS-015", "tracelinks": "StRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gültiges Microsoft-ID-Token, aber Mandant ohne Lizenz OpenIDConnectAuthentication → Login schlägt mit „No license for OpenIDConnectAuthentication“ fehl.", "pruefidee": "Gültiges Microsoft-ID-Token, aber Mandant ohne Lizenz OpenIDConnectAuthentication → Login schlägt mit „No license for OpenIDConnectAuthentication“ fehl.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-016", "id": "SyRS-016",
@@ -545,7 +577,8 @@
"tracelinks": "StRS-015", "tracelinks": "StRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ändert seine Microsoft-E-Mail-Adresse (oid bleibt gleich): Login funktioniert unverändert.", "pruefidee": "Benutzer ändert seine Microsoft-E-Mail-Adresse (oid bleibt gleich): Login funktioniert unverändert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-017", "id": "SyRS-017",
@@ -561,7 +594,8 @@
"tracelinks": "StRS-015", "tracelinks": "StRS-015",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ticket wird nach 31 Minuten Inaktivität bei nachfolgendem API-Call als abgelaufen erkannt und erfordert erneuten Login.", "pruefidee": "Ticket wird nach 31 Minuten Inaktivität bei nachfolgendem API-Call als abgelaufen erkannt und erfordert erneuten Login.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-018", "id": "SyRS-018",
@@ -577,7 +611,8 @@
"tracelinks": "StRS-017", "tracelinks": "StRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Manuelle UI-Prüfung: Ribbon minimieren, mehrere Module durchklicken, aktives Modul muss stets erkennbar bleiben.", "pruefidee": "Manuelle UI-Prüfung: Ribbon minimieren, mehrere Module durchklicken, aktives Modul muss stets erkennbar bleiben.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-019", "id": "SyRS-019",
@@ -593,7 +628,8 @@
"tracelinks": "-", "tracelinks": "-",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Debug-Build sendet Testmail an externe.adresse@kunde.de: tatsächlicher Empfänger im Mailserver-Log ist test@nexoware.com.", "pruefidee": "Debug-Build sendet Testmail an externe.adresse@kunde.de: tatsächlicher Empfänger im Mailserver-Log ist test@nexoware.com.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-001", "id": "SwRS-001",
@@ -609,7 +645,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Code-Analyse: keine zwei Konstanten in UserRightsConst.cs besitzen denselben Integer-Wert.", "pruefidee": "Statische Code-Analyse: keine zwei Konstanten in UserRightsConst.cs besitzen denselben Integer-Wert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-002", "id": "SwRS-002",
@@ -625,7 +662,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Codeverwendung einer obsoleten Konstante erzeugt eine Compiler-Warnung (CS0618), verhindert den Build aber nicht.", "pruefidee": "Neue Codeverwendung einer obsoleten Konstante erzeugt eine Compiler-Warnung (CS0618), verhindert den Build aber nicht.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-003", "id": "SwRS-003",
@@ -641,7 +679,8 @@
"tracelinks": "SyRS-001", "tracelinks": "SyRS-001",
"konsolidierung": "Kandidat: Vereinheitlichung der Rechteprüfung auf einen einzigen, schichtübergreifend wiederverwendbaren Mechanismus im Zielsystem (z. B. Policy-based Authorization statt drei paralleler APIs).", "konsolidierung": "Kandidat: Vereinheitlichung der Rechteprüfung auf einen einzigen, schichtübergreifend wiederverwendbaren Mechanismus im Zielsystem (z. B. Policy-based Authorization statt drei paralleler APIs).",
"pruefidee": "Code-Review: Für ein Beispielrecht wird geprüft, ob UI-Sichtbarkeitsprüfung und BL-Durchsetzungsprüfung unabhängig voneinander gepflegt werden (z. B. unterschiedliche Rechte-ID durch Copy-Paste-Fehler).", "pruefidee": "Code-Review: Für ein Beispielrecht wird geprüft, ob UI-Sichtbarkeitsprüfung und BL-Durchsetzungsprüfung unabhängig voneinander gepflegt werden (z. B. unterschiedliche Rechte-ID durch Copy-Paste-Fehler).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-004", "id": "SwRS-004",
@@ -657,7 +696,8 @@
"tracelinks": "StRS-003", "tracelinks": "StRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Beleg mit Number=-1 liefert IsTemplate=true; ein Beleg mit Number=0 oder positiv liefert IsTemplate=false.", "pruefidee": "Ein Beleg mit Number=-1 liefert IsTemplate=true; ein Beleg mit Number=0 oder positiv liefert IsTemplate=false.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-005", "id": "SwRS-005",
@@ -673,7 +713,8 @@
"tracelinks": "StRS-003", "tracelinks": "StRS-003",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jeden Belegtyp lässt sich per Unit-Test verifizieren, dass State nur einen der drei Enum-Werte annehmen kann (Datenbankkonsistenzprüfung).", "pruefidee": "Für jeden Belegtyp lässt sich per Unit-Test verifizieren, dass State nur einen der drei Enum-Werte annehmen kann (Datenbankkonsistenzprüfung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-006", "id": "SwRS-006",
@@ -689,7 +730,8 @@
"tracelinks": "SyRS-007", "tracelinks": "SyRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Web-Angebot im Zustand WebOfferSign hat gleichzeitig ReceiptState.Active, bis die Signatur abgeschlossen ist.", "pruefidee": "Ein Web-Angebot im Zustand WebOfferSign hat gleichzeitig ReceiptState.Active, bis die Signatur abgeschlossen ist.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-007", "id": "SwRS-007",
@@ -706,7 +748,8 @@
"tracelinks": "StRS-005, SyRS-007", "tracelinks": "StRS-005, SyRS-007",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde ändert dieselbe Position zweimal (Menge 5 dann 3): Nach Annahme wird nur die letzte Änderung (3) im neuen Beleg übernommen.", "pruefidee": "Kunde ändert dieselbe Position zweimal (Menge 5 dann 3): Nach Annahme wird nur die letzte Änderung (3) im neuen Beleg übernommen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-008", "id": "SwRS-008",
@@ -722,7 +765,8 @@
"tracelinks": "StRS-005", "tracelinks": "StRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg mit AllowChangeQuantity=false, AllowChangeReceiptItemArticlePositionKind=true: Nach Annahme wird nur die Positionsart-Änderung übernommen, eine vom Kunden vorgenommene Mengenänderung wird verworfen (potenziell ohne Information an den Kunden – siehe Hypothesen.md).", "pruefidee": "Beleg mit AllowChangeQuantity=false, AllowChangeReceiptItemArticlePositionKind=true: Nach Annahme wird nur die Positionsart-Änderung übernommen, eine vom Kunden vorgenommene Mengenänderung wird verworfen (potenziell ohne Information an den Kunden – siehe Hypothesen.md).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-009", "id": "SwRS-009",
@@ -738,7 +782,8 @@
"tracelinks": "StRS-005", "tracelinks": "StRS-005",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Race-Condition-Test: Change-Requests werden zwischen Klick „Annehmen“ und Serververarbeitung durch einen parallelen Prozess gelöscht → Server antwortet mit Fehler statt fälschlicher Vollannahme.", "pruefidee": "Race-Condition-Test: Change-Requests werden zwischen Klick „Annehmen“ und Serververarbeitung durch einen parallelen Prozess gelöscht → Server antwortet mit Fehler statt fälschlicher Vollannahme.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-010", "id": "SwRS-010",
@@ -754,7 +799,8 @@
"tracelinks": "StRS-006, SyRS-008", "tracelinks": "StRS-006, SyRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Nach Auslösung des Signaturvorgangs erhält sowohl die Kunden-E-Mail-Adresse (receiptPdfDocument.MailAddress) als auch die Mitarbeiter-E-Mail-Adresse je eine E-Mail mit unterschiedlichem Template.", "pruefidee": "Nach Auslösung des Signaturvorgangs erhält sowohl die Kunden-E-Mail-Adresse (receiptPdfDocument.MailAddress) als auch die Mitarbeiter-E-Mail-Adresse je eine E-Mail mit unterschiedlichem Template.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-011", "id": "SwRS-011",
@@ -770,7 +816,8 @@
"tracelinks": "StRS-006", "tracelinks": "StRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "OfferSignExpiredDateCount=7: Link ist am Tag 7 nutzbar, am Tag 8 liefert der Aufruf „Ungültiger Link“.", "pruefidee": "OfferSignExpiredDateCount=7: Link ist am Tag 7 nutzbar, am Tag 8 liefert der Aufruf „Ungültiger Link“.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-012", "id": "SwRS-012",
@@ -786,7 +833,8 @@
"tracelinks": "StRS-006", "tracelinks": "StRS-006",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede der drei SignatureType-Varianten entsteht ein gültiges, im PDF sichtbares Signaturbild.", "pruefidee": "Für jede der drei SignatureType-Varianten entsteht ein gültiges, im PDF sichtbares Signaturbild.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-013", "id": "SwRS-013",
@@ -803,7 +851,8 @@
"tracelinks": "StRS-008", "tracelinks": "StRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Reflection-Test: ReceiptContract.BaseType == typeof(ReceiptBase); Properties enthalten BillingIntervalKind und MandatI3D.", "pruefidee": "Reflection-Test: ReceiptContract.BaseType == typeof(ReceiptBase); Properties enthalten BillingIntervalKind und MandatI3D.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-014", "id": "SwRS-014",
@@ -819,7 +868,8 @@
"tracelinks": "StRS-008", "tracelinks": "StRS-008",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung aus Vertrag mit MandatI3D erzeugt einen SEPA-Lastschrift-Exportdatensatz mit korrekter Mandatsreferenz.", "pruefidee": "Rechnung aus Vertrag mit MandatI3D erzeugt einen SEPA-Lastschrift-Exportdatensatz mit korrekter Mandatsreferenz.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-015", "id": "SwRS-015",
@@ -835,7 +885,8 @@
"tracelinks": "StRS-010, SyRS-011", "tracelinks": "StRS-010, SyRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Wechsel von ReceiptKind=InvoiceClass zu DeliveryList bei fehlendem Recht: Hinweistext wechselt von „der Rechnung“ zu „des Lieferscheins“ ohne Seiten-Reload.", "pruefidee": "Wechsel von ReceiptKind=InvoiceClass zu DeliveryList bei fehlendem Recht: Hinweistext wechselt von „der Rechnung“ zu „des Lieferscheins“ ohne Seiten-Reload.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-016", "id": "SwRS-016",
@@ -851,7 +902,8 @@
"tracelinks": "StRS-010", "tracelinks": "StRS-010",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "UseBillingDate=false, Benutzer ohne Recht: Kein Info-Icon sichtbar. UseBillingDate=true, gleicher Benutzer: Info-Icon erscheint.", "pruefidee": "UseBillingDate=false, Benutzer ohne Recht: Kein Info-Icon sichtbar. UseBillingDate=true, gleicher Benutzer: Info-Icon erscheint.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-017", "id": "SwRS-017",
@@ -867,7 +919,8 @@
"tracelinks": "StRS-011", "tracelinks": "StRS-011",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Upload eines 512x512-PNG-Icons resultiert in einem gespeicherten 16x16-BMP-Icon.", "pruefidee": "Upload eines 512x512-PNG-Icons resultiert in einem gespeicherten 16x16-BMP-Icon.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-018", "id": "SwRS-018",
@@ -883,7 +936,8 @@
"tracelinks": "StRS-012", "tracelinks": "StRS-012",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Status wird nur in einer TaskManagementHelpdeskAction referenziert (0 Tickets): Löschung wird dennoch verweigert mit Meldung „... wird in 1 Task verwendet.“", "pruefidee": "Status wird nur in einer TaskManagementHelpdeskAction referenziert (0 Tickets): Löschung wird dennoch verweigert mit Meldung „... wird in 1 Task verwendet.“",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-019", "id": "SwRS-019",
@@ -899,7 +953,8 @@
"tracelinks": "StRS-013", "tracelinks": "StRS-013",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Hinzufügen eines neuen Lieferanten erfordert laut Doku nur eine neue Datei `SupplierEdiBL.NeuerLieferant.cs` plus Erweiterung des Dispatch in ApplyDistriToCentron.", "pruefidee": "Hinzufügen eines neuen Lieferanten erfordert laut Doku nur eine neue Datei `SupplierEdiBL.NeuerLieferant.cs` plus Erweiterung des Dispatch in ApplyDistriToCentron.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-020", "id": "SwRS-020",
@@ -915,7 +970,8 @@
"tracelinks": "SyRS-016", "tracelinks": "SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-Test instanziiert OpenIdConnectAuthObject mit einer ClaimsIdentity, die einen \"oid\"-Claim enthält: SubjectIdentifier liefert exakt diesen Wert.", "pruefidee": "Unit-Test instanziiert OpenIdConnectAuthObject mit einer ClaimsIdentity, die einen \"oid\"-Claim enthält: SubjectIdentifier liefert exakt diesen Wert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-021", "id": "SwRS-021",
@@ -931,7 +987,8 @@
"tracelinks": "SyRS-015, SyRS-016", "tracelinks": "SyRS-015, SyRS-016",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Token ohne oid-Claim führt zu Log-Eintrag „Could not find subject identifier 'oid' in JWT claims.“ ohne DB-Zugriff (verifizierbar per SQL-Profiler/Mock).", "pruefidee": "Token ohne oid-Claim führt zu Log-Eintrag „Could not find subject identifier 'oid' in JWT claims.“ ohne DB-Zugriff (verifizierbar per SQL-Profiler/Mock).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-022", "id": "SwRS-022",
@@ -947,7 +1004,8 @@
"tracelinks": "SyRS-017", "tracelinks": "SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei aufeinanderfolgende API-Aufrufe im Abstand von 1 Minute lösen nur eine tatsächliche DB-Schreiboperation für ExpiryDate aus (per SQL-Profiler nachweisbar).", "pruefidee": "Zwei aufeinanderfolgende API-Aufrufe im Abstand von 1 Minute lösen nur eine tatsächliche DB-Schreiboperation für ExpiryDate aus (per SQL-Profiler nachweisbar).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-023", "id": "SwRS-023",
@@ -963,7 +1021,8 @@
"tracelinks": "SyRS-017", "tracelinks": "SyRS-017",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Login mit ApplicationKind, der dem 24h-Fall zugeordnet ist, erzeugt ein Ticket mit ExpiryDate = jetzt + 1440 Minuten.", "pruefidee": "Login mit ApplicationKind, der dem 24h-Fall zugeordnet ist, erzeugt ein Ticket mit ExpiryDate = jetzt + 1440 Minuten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-024", "id": "SwRS-024",
@@ -979,6 +1038,7 @@
"tracelinks": "StRS-017, SyRS-018", "tracelinks": "StRS-017, SyRS-018",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ribbon minimiert, verschiedene Module (auch mit abweichender visueller Struktur/Custom-Templates) angewählt: Unterstreichung erscheint in allen Fällen ohne Cast-Exception.", "pruefidee": "Ribbon minimiert, verschiedene Module (auch mit abweichender visueller Struktur/Custom-Templates) angewählt: Unterstreichung erscheint in allen Fällen ohne Cast-Exception.",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -37,6 +39,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1,0 | | Belege je Anforderung (Median) | 1,0 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 45 (75,0 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 45 (75,0 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -54,5 +60,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 26 ungedeckt: SwRS-003 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 1 von 26 ungedeckt: SwRS-003 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 59 von 60 mit Tracelinks (98,3 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 59 von 60 mit Tracelinks (98,3 %) |
@@ -97,6 +97,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-sonnet-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -127,6 +129,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (97,3 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (97,3 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -144,6 +150,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 73 von 73 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 73 von 73 mit Tracelinks (100,0 %) |
## V1-Reihe: fünf Messpunkte unter identischer Bedingung ## V1-Reihe: fünf Messpunkte unter identischer Bedingung
@@ -15,7 +15,8 @@
"tracelinks": "SyRS-01, SyRS-02", "tracelinks": "SyRS-01, SyRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einen fixierten Auftrag ändern und prüfen, dass `Version` erhöht und der alte Datensatz weiterhin per `OriginalI3D`/Vorgängerversion referenzierbar ist.", "pruefidee": "Einen fixierten Auftrag ändern und prüfen, dass `Version` erhöht und der alte Datensatz weiterhin per `OriginalI3D`/Vorgängerversion referenzierbar ist.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-02", "id": "StRS-02",
@@ -32,7 +33,8 @@
"tracelinks": "SyRS-03, SyRS-04", "tracelinks": "SyRS-03, SyRS-04",
"konsolidierung": "Kandidat: Analoge Stornoabläufe in OrderBL/OfferBL/DeliveryListBL/CreditVoucherBL wurden nicht im Detail geprüft (siehe Analysebericht.md) und sollten auf einheitliche Umsetzung verglichen werden.", "konsolidierung": "Kandidat: Analoge Stornoabläufe in OrderBL/OfferBL/DeliveryListBL/CreditVoucherBL wurden nicht im Detail geprüft (siehe Analysebericht.md) und sollten auf einheitliche Umsetzung verglichen werden.",
"pruefidee": "Rechnung stornieren und prüfen: (a) neue Version wird angelegt, (b) State der neuen Version = 3, (c) Positionsmengen = 0, (d) Vorgängerversion bleibt abrufbar.", "pruefidee": "Rechnung stornieren und prüfen: (a) neue Version wird angelegt, (b) State der neuen Version = 3, (c) Positionsmengen = 0, (d) Vorgängerversion bleibt abrufbar.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-03", "id": "StRS-03",
@@ -49,7 +51,8 @@
"tracelinks": "SyRS-05", "tracelinks": "SyRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für einen Kunden mit zwei offenen Lieferscheinen vor Stichtag und einem nach Stichtag prüfen, dass nur die beiden ersten in der Ergebnisliste erscheinen.", "pruefidee": "Für einen Kunden mit zwei offenen Lieferscheinen vor Stichtag und einem nach Stichtag prüfen, dass nur die beiden ersten in der Ergebnisliste erscheinen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-04", "id": "StRS-04",
@@ -66,7 +69,8 @@
"tracelinks": "SyRS-06", "tracelinks": "SyRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit Beginn 01.01., LaufzeitArt=Monatlich, LaufzeitDauer=1 anlegen und prüfen, dass das berechnete nächste Datum der 01.02. ist.", "pruefidee": "Vertrag mit Beginn 01.01., LaufzeitArt=Monatlich, LaufzeitDauer=1 anlegen und prüfen, dass das berechnete nächste Datum der 01.02. ist.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-05", "id": "StRS-05",
@@ -83,7 +87,8 @@
"tracelinks": "SyRS-07, SyRS-08", "tracelinks": "SyRS-07, SyRS-08",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "TimerBilling-Einstellungsseite öffnen, `ReceiptKind` zwischen Rechnung/Lieferschein wechseln und prüfen, dass der Hinweistext bei fehlender Berechtigung/Einstellung erscheint.", "pruefidee": "TimerBilling-Einstellungsseite öffnen, `ReceiptKind` zwischen Rechnung/Lieferschein wechseln und prüfen, dass der Hinweistext bei fehlender Berechtigung/Einstellung erscheint.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-06", "id": "StRS-06",
@@ -100,7 +105,8 @@
"tracelinks": "SyRS-09, SyRS-10", "tracelinks": "SyRS-09, SyRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einem Benutzer ein Recht ausschließlich über eine neue Gruppenzuordnung erteilen und prüfen, dass `HasUserRight` anschließend `true` liefert.", "pruefidee": "Einem Benutzer ein Recht ausschließlich über eine neue Gruppenzuordnung erteilen und prüfen, dass `HasUserRight` anschließend `true` liefert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-07", "id": "StRS-07",
@@ -118,7 +124,8 @@
"tracelinks": "SyRS-11", "tracelinks": "SyRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Recht „SETTINGS“, aber in Gruppe „Administratoren“, ruft geschützte Funktion auf und erhält Zugriff.", "pruefidee": "Benutzer ohne Recht „SETTINGS“, aber in Gruppe „Administratoren“, ruft geschützte Funktion auf und erhält Zugriff.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-08", "id": "StRS-08",
@@ -135,7 +142,8 @@
"tracelinks": "SyRS-12", "tracelinks": "SyRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einem WebAccount ein Web-Recht zuweisen und prüfen, dass dies keine Auswirkung auf interne `Sichtrus`-Rechte desselben zugrunde liegenden Kunden hat (und umgekehrt).", "pruefidee": "Einem WebAccount ein Web-Recht zuweisen und prüfen, dass dies keine Auswirkung auf interne `Sichtrus`-Rechte desselben zugrunde liegenden Kunden hat (und umgekehrt).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-09", "id": "StRS-09",
@@ -152,7 +160,8 @@
"tracelinks": "SyRS-13", "tracelinks": "SyRS-13",
"konsolidierung": "Kandidat: Einheitliches Cross-Cutting-Konzern-Pattern über alle sechs Beleg-BL-Klassen hinweg; im Zielsystem als zentraler Autorisierungsfilter statt Einzelprüfung je Methode konsolidierbar.", "konsolidierung": "Kandidat: Einheitliches Cross-Cutting-Konzern-Pattern über alle sechs Beleg-BL-Klassen hinweg; im Zielsystem als zentraler Autorisierungsfilter statt Einzelprüfung je Methode konsolidierbar.",
"pruefidee": "Als WebAccount mit `CustomerI3D=100` eine Abfrage mit `filter.CustomerI3D=200` senden und prüfen, dass die Ergebnisliste leer ist.", "pruefidee": "Als WebAccount mit `CustomerI3D=100` eine Abfrage mit `filter.CustomerI3D=200` senden und prüfen, dass die Ergebnisliste leer ist.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-10", "id": "StRS-10",
@@ -169,7 +178,8 @@
"tracelinks": "SyRS-14", "tracelinks": "SyRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne hinterlegten Schlüssel führt Validierung durch und erhält die definierte Fehlermeldung statt eines Erfolgs.", "pruefidee": "Benutzer ohne hinterlegten Schlüssel führt Validierung durch und erhält die definierte Fehlermeldung statt eines Erfolgs.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-11", "id": "StRS-11",
@@ -186,7 +196,8 @@
"tracelinks": "SyRS-15, SyRS-16, SyRS-17", "tracelinks": "SyRS-15, SyRS-16, SyRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Mit gültigem Zertifikat und konfiguriertem TSA-Server ein PDF signieren und die Signatur inkl. Zeitstempel technisch verifizieren.", "pruefidee": "Mit gültigem Zertifikat und konfiguriertem TSA-Server ein PDF signieren und die Signatur inkl. Zeitstempel technisch verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-12", "id": "StRS-12",
@@ -202,7 +213,8 @@
"tracelinks": "SyRS-18", "tracelinks": "SyRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Einen neuen Ticketstatus mit eigenem Icon/Farbe anlegen und prüfen, dass er in der Statusauswahl eines Tickets erscheint, ohne dass Code geändert wurde.", "pruefidee": "Einen neuen Ticketstatus mit eigenem Icon/Farbe anlegen und prüfen, dass er in der Statusauswahl eines Tickets erscheint, ohne dass Code geändert wurde.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-13", "id": "StRS-13",
@@ -218,7 +230,8 @@
"tracelinks": "SyRS-19", "tracelinks": "SyRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit `OnlyOwnBranch` meldet sich an und prüft, dass nur Tickets der eigenen Niederlassung in der Liste erscheinen.", "pruefidee": "Benutzer mit `OnlyOwnBranch` meldet sich an und prüft, dass nur Tickets der eigenen Niederlassung in der Liste erscheinen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-14", "id": "StRS-14",
@@ -234,7 +247,8 @@
"tracelinks": "SyRS-20", "tracelinks": "SyRS-20",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für einen Artikel mit `BarcodeScanen=1` zwei Barcodes erfassen und prüfen, dass der Bestand 2 beträgt, unabhängig vom `Bestand`-Feld in `NebenlagerArtikel`.", "pruefidee": "Für einen Artikel mit `BarcodeScanen=1` zwei Barcodes erfassen und prüfen, dass der Bestand 2 beträgt, unabhängig vom `Bestand`-Feld in `NebenlagerArtikel`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-15", "id": "StRS-15",
@@ -250,7 +264,8 @@
"tracelinks": "SyRS-21", "tracelinks": "SyRS-21",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde mit Rabatt=10% und Zahlungsziel „30 Tage netto“ anlegen; neuen Auftrag für diesen Kunden erstellen und prüfen, dass beide Werte im Beleg vorbelegt sind.", "pruefidee": "Kunde mit Rabatt=10% und Zahlungsziel „30 Tage netto“ anlegen; neuen Auftrag für diesen Kunden erstellen und prüfen, dass beide Werte im Beleg vorbelegt sind.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-16", "id": "StRS-16",
@@ -266,7 +281,8 @@
"tracelinks": "SyRS-22", "tracelinks": "SyRS-22",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`InvoiceReminderDays=14` konfigurieren, Rechnung anlegen und prüfen, dass `ReminderDate` = heute + 14 Tage beträgt; bei Einstellung 0/nicht gesetzt bleibt `ReminderDate` unverändert.", "pruefidee": "`InvoiceReminderDays=14` konfigurieren, Rechnung anlegen und prüfen, dass `ReminderDate` = heute + 14 Tage beträgt; bei Einstellung 0/nicht gesetzt bleibt `ReminderDate` unverändert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-17", "id": "StRS-17",
@@ -283,7 +299,8 @@
"tracelinks": "SyRS-23, SyRS-24", "tracelinks": "SyRS-23, SyRS-24",
"konsolidierung": "Kandidat: Die drei Attribute teilen nahezu identische Filterlogik (Unterschied nur in Any/All/Single-Verknüpfung) und könnten im Zielsystem auf einen parametrisierten Autorisierungsfilter konsolidiert werden.", "konsolidierung": "Kandidat: Die drei Attribute teilen nahezu identische Filterlogik (Unterschied nur in Any/All/Single-Verknüpfung) und könnten im Zielsystem auf einen parametrisierten Autorisierungsfilter konsolidiert werden.",
"pruefidee": "Endpunkt mit `[AuthorizeUserRight(X)]` ohne Session aufrufen → 401; mit Session aber ohne Recht X aufrufen → 403; mit Recht X aufrufen → 200.", "pruefidee": "Endpunkt mit `[AuthorizeUserRight(X)]` ohne Session aufrufen → 401; mit Session aber ohne Recht X aufrufen → 403; mit Recht X aufrufen → 200.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-18", "id": "StRS-18",
@@ -299,7 +316,8 @@
"tracelinks": "SyRS-17", "tracelinks": "SyRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "TSA-Passwort speichern und den Rohwert in der Einstellungstabelle prüfen — er darf nicht dem eingegebenen Klartext entsprechen.", "pruefidee": "TSA-Passwort speichern und den Rohwert in der Einstellungstabelle prüfen — er darf nicht dem eingegebenen Klartext entsprechen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-01", "id": "SyRS-01",
@@ -315,7 +333,8 @@
"tracelinks": "StRS-01", "tracelinks": "StRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Sequenzieller Aufruf beobachten (z. B. per Log/Debugger) und prüfen, dass alle drei Phasen in der genannten Reihenfolge durchlaufen werden.", "pruefidee": "Sequenzieller Aufruf beobachten (z. B. per Log/Debugger) und prüfen, dass alle drei Phasen in der genannten Reihenfolge durchlaufen werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-02", "id": "SyRS-02",
@@ -331,7 +350,8 @@
"tracelinks": "StRS-01", "tracelinks": "StRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg mit gebundenem Barcode neu versionieren und prüfen, dass ein Historieneintrag mit der alten Versionsnummer erhalten bleibt.", "pruefidee": "Beleg mit gebundenem Barcode neu versionieren und prüfen, dass ein Historieneintrag mit der alten Versionsnummer erhalten bleibt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-03", "id": "SyRS-03",
@@ -347,7 +367,8 @@
"tracelinks": "StRS-02", "tracelinks": "StRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`CancelInvoice` aufrufen und Rückgabewert von `StoreAsset` sowie den persistierten Datensatz prüfen (State=3, alle Positionsmengen=0).", "pruefidee": "`CancelInvoice` aufrufen und Rückgabewert von `StoreAsset` sowie den persistierten Datensatz prüfen (State=3, alle Positionsmengen=0).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-04", "id": "SyRS-04",
@@ -363,7 +384,8 @@
"tracelinks": "StRS-02", "tracelinks": "StRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`State`-Werte 1, 2, 3 und z. B. 4 an der UI anzeigen lassen und die jeweilige Beschriftung/leere Anzeige prüfen.", "pruefidee": "`State`-Werte 1, 2, 3 und z. B. 4 an der UI anzeigen lassen und die jeweilige Beschriftung/leere Anzeige prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-05", "id": "SyRS-05",
@@ -379,7 +401,8 @@
"tracelinks": "StRS-03", "tracelinks": "StRS-03",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Lieferscheine (vor/nach Stichtag) für denselben Kunden anlegen und prüfen, dass nur der Beleg vor dem Stichtag zurückgegeben wird.", "pruefidee": "Zwei Lieferscheine (vor/nach Stichtag) für denselben Kunden anlegen und prüfen, dass nur der Beleg vor dem Stichtag zurückgegeben wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-06", "id": "SyRS-06",
@@ -395,7 +418,8 @@
"tracelinks": "StRS-04", "tracelinks": "StRS-04",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit `LaufzeitArt=null` anlegen und prüfen, dass keine Exception geworfen wird und kein Folgedatum berechnet wird.", "pruefidee": "Vertrag mit `LaufzeitArt=null` anlegen und prüfen, dass keine Exception geworfen wird und kein Folgedatum berechnet wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-07", "id": "SyRS-07",
@@ -411,7 +435,8 @@
"tracelinks": "StRS-05", "tracelinks": "StRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`ReceiptKind` von Invoice auf DeliveryList umstellen und beobachten, dass `BillingDateIsEnabled`/`ShowBillingDateNoteEnabledInfo` neu ausgewertet werden.", "pruefidee": "`ReceiptKind` von Invoice auf DeliveryList umstellen und beobachten, dass `BillingDateIsEnabled`/`ShowBillingDateNoteEnabledInfo` neu ausgewertet werden.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-08", "id": "SyRS-08",
@@ -428,7 +453,8 @@
"tracelinks": "StRS-05", "tracelinks": "StRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`CanChangeDateInInvoices=false` setzen, ReceiptKind=Invoice wählen und prüfen, dass das Datumsfeld deaktiviert ist und der Hinweistext „... der Rechnung ...“ erscheint.", "pruefidee": "`CanChangeDateInInvoices=false` setzen, ReceiptKind=Invoice wählen und prüfen, dass das Datumsfeld deaktiviert ist und der Hinweistext „... der Rechnung ...“ erscheint.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-09", "id": "SyRS-09",
@@ -444,7 +470,8 @@
"tracelinks": "StRS-06", "tracelinks": "StRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer meldet sich an (Cache wird befüllt); Recht wird per Admin-Oberfläche entzogen; prüfen, ob und wann (gleiche Session/nach Neuanmeldung) `HasUserRight` das entzogene Recht noch als vorhanden meldet.", "pruefidee": "Benutzer meldet sich an (Cache wird befüllt); Recht wird per Admin-Oberfläche entzogen; prüfen, ob und wann (gleiche Session/nach Neuanmeldung) `HasUserRight` das entzogene Recht noch als vorhanden meldet.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-10", "id": "SyRS-10",
@@ -460,7 +487,8 @@
"tracelinks": "StRS-06", "tracelinks": "StRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer zwei Gruppen zuordnen, die ein gemeinsames Recht enthalten, und prüfen, dass es in der Ergebnisliste nur einmal vorkommt.", "pruefidee": "Benutzer zwei Gruppen zuordnen, die ein gemeinsames Recht enthalten, und prüfen, dass es in der Ergebnisliste nur einmal vorkommt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-11", "id": "SyRS-11",
@@ -477,7 +505,8 @@
"tracelinks": "StRS-07", "tracelinks": "StRS-07",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-07.", "pruefidee": "Siehe StRS-07.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-12", "id": "SyRS-12",
@@ -493,7 +522,8 @@
"tracelinks": "StRS-08", "tracelinks": "StRS-08",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Web-Recht für einen WebAccount setzen und prüfen, dass keine Zeile in `Sichtrus`/`Sichmemb` dafür angelegt wird.", "pruefidee": "Web-Recht für einen WebAccount setzen und prüfen, dass keine Zeile in `Sichtrus`/`Sichmemb` dafür angelegt wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-13", "id": "SyRS-13",
@@ -510,7 +540,8 @@
"tracelinks": "StRS-09", "tracelinks": "StRS-09",
"konsolidierung": "Kandidat: sechsfach dupliziertes Prüfmuster, siehe StRS-09.", "konsolidierung": "Kandidat: sechsfach dupliziertes Prüfmuster, siehe StRS-09.",
"pruefidee": "Siehe StRS-09.", "pruefidee": "Siehe StRS-09.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-14", "id": "SyRS-14",
@@ -526,7 +557,8 @@
"tracelinks": "StRS-10", "tracelinks": "StRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-10.", "pruefidee": "Siehe StRS-10.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-15", "id": "SyRS-15",
@@ -542,7 +574,8 @@
"tracelinks": "StRS-11", "tracelinks": "StRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Alle fünf Einstellungswerte setzen, Anwendung neu starten und prüfen, dass `GetPdfSigningSettings` dieselben Werte zurückliefert.", "pruefidee": "Alle fünf Einstellungswerte setzen, Anwendung neu starten und prüfen, dass `GetPdfSigningSettings` dieselben Werte zurückliefert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-16", "id": "SyRS-16",
@@ -558,7 +591,8 @@
"tracelinks": "StRS-11", "tracelinks": "StRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Recht „SETTINGS“ ruft `SavePdfSigningSettings` auf und erhält `Result.AsError` mit Code `RightCheckFailed`.", "pruefidee": "Benutzer ohne Recht „SETTINGS“ ruft `SavePdfSigningSettings` auf und erhält `Result.AsError` mit Code `RightCheckFailed`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-17", "id": "SyRS-17",
@@ -574,7 +608,8 @@
"tracelinks": "StRS-11, StRS-18", "tracelinks": "StRS-11, StRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-18.", "pruefidee": "Siehe StRS-18.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-18", "id": "SyRS-18",
@@ -590,7 +625,8 @@
"tracelinks": "StRS-12", "tracelinks": "StRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-12.", "pruefidee": "Siehe StRS-12.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-19", "id": "SyRS-19",
@@ -606,7 +642,8 @@
"tracelinks": "StRS-13", "tracelinks": "StRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-13.", "pruefidee": "Siehe StRS-13.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-20", "id": "SyRS-20",
@@ -622,7 +659,8 @@
"tracelinks": "StRS-14", "tracelinks": "StRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-14.", "pruefidee": "Siehe StRS-14.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-21", "id": "SyRS-21",
@@ -638,7 +676,8 @@
"tracelinks": "StRS-15", "tracelinks": "StRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-15.", "pruefidee": "Siehe StRS-15.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-22", "id": "SyRS-22",
@@ -654,7 +693,8 @@
"tracelinks": "StRS-16", "tracelinks": "StRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe StRS-16.", "pruefidee": "Siehe StRS-16.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-23", "id": "SyRS-23",
@@ -670,7 +710,8 @@
"tracelinks": "StRS-17", "tracelinks": "StRS-17",
"konsolidierung": "Kandidat: siehe SyRS-24 (gleiche Filterinfrastruktur, unterschiedliche Verknüpfung).", "konsolidierung": "Kandidat: siehe SyRS-24 (gleiche Filterinfrastruktur, unterschiedliche Verknüpfung).",
"pruefidee": "Siehe StRS-17.", "pruefidee": "Siehe StRS-17.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-24", "id": "SyRS-24",
@@ -686,7 +727,8 @@
"tracelinks": "StRS-17", "tracelinks": "StRS-17",
"konsolidierung": "Kandidat: `AuthorizeUserRightAttribute`, `AuthorizeAnyUserRightAttribute` und `AuthorizeAllUserRightsAttribute` teilen fast identischen Aufbau (nur Any/All/Single-Verknüpfung unterscheidet sich) — im Zielsystem auf einen parametrisierten Filter konsolidierbar.", "konsolidierung": "Kandidat: `AuthorizeUserRightAttribute`, `AuthorizeAnyUserRightAttribute` und `AuthorizeAllUserRightsAttribute` teilen fast identischen Aufbau (nur Any/All/Single-Verknüpfung unterscheidet sich) — im Zielsystem auf einen parametrisierten Filter konsolidierbar.",
"pruefidee": "Attribut mit leerem Rechte-Array `[AuthorizeAnyUserRight()]` testen und prüfen, dass der Zugriff mit 403 verweigert wird (Fail-Closed-Verhalten).", "pruefidee": "Attribut mit leerem Rechte-Array `[AuthorizeAnyUserRight()]` testen und prüfen, dass der Zugriff mit 403 verweigert wird (Fail-Closed-Verhalten).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-01", "id": "SwRS-01",
@@ -702,7 +744,8 @@
"tracelinks": "SyRS-01", "tracelinks": "SyRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-Test: `asset.Version` vor/nach Aufruf vergleichen, Differenz muss exakt 1 sein.", "pruefidee": "Unit-Test: `asset.Version` vor/nach Aufruf vergleichen, Differenz muss exakt 1 sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-02", "id": "SwRS-02",
@@ -718,7 +761,8 @@
"tracelinks": "SyRS-01", "tracelinks": "SyRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Reflektion über eine beliebige abgeleitete Klasse (z. B. `Invoice`) prüfen, dass `State`/`OriginalI3D` vorhanden und vom Typ `int` sind.", "pruefidee": "Reflektion über eine beliebige abgeleitete Klasse (z. B. `Invoice`) prüfen, dass `State`/`OriginalI3D` vorhanden und vom Typ `int` sind.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-03", "id": "SwRS-03",
@@ -734,7 +778,8 @@
"tracelinks": "SyRS-02", "tracelinks": "SyRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Historieneintrag nach Versionswechsel abfragen und `Version`-Feld mit der tatsächlichen Belegversion zum Zeitpunkt der Erstellung vergleichen.", "pruefidee": "Historieneintrag nach Versionswechsel abfragen und `Version`-Feld mit der tatsächlichen Belegversion zum Zeitpunkt der Erstellung vergleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-04", "id": "SwRS-04",
@@ -750,7 +795,8 @@
"tracelinks": "SyRS-03", "tracelinks": "SyRS-03",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-03.", "pruefidee": "Siehe SyRS-03.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-05", "id": "SwRS-05",
@@ -766,7 +812,8 @@
"tracelinks": "SyRS-04", "tracelinks": "SyRS-04",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Converter mit Werten 0,1,2,3,4 aufrufen und exakte Rückgabewerte prüfen.", "pruefidee": "Converter mit Werten 0,1,2,3,4 aufrufen und exakte Rückgabewerte prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-06", "id": "SwRS-06",
@@ -782,7 +829,8 @@
"tracelinks": "SyRS-05", "tracelinks": "SyRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-05.", "pruefidee": "Siehe SyRS-05.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-07", "id": "SwRS-07",
@@ -798,7 +846,8 @@
"tracelinks": "SyRS-06", "tracelinks": "SyRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-06.", "pruefidee": "Siehe SyRS-06.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-08", "id": "SwRS-08",
@@ -814,7 +863,8 @@
"tracelinks": "SyRS-06", "tracelinks": "SyRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf mit `receiptKind=Invoice` und `receiptKind=CreditVoucher` und Vergleich der jeweils ausgeführten Named Query (z. B. per SQL-Profiler).", "pruefidee": "Aufruf mit `receiptKind=Invoice` und `receiptKind=CreditVoucher` und Vergleich der jeweils ausgeführten Named Query (z. B. per SQL-Profiler).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-09", "id": "SwRS-09",
@@ -830,7 +880,8 @@
"tracelinks": "SyRS-07", "tracelinks": "SyRS-07",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "`ReceiptKind` zweimal auf denselben Wert setzen und prüfen, dass `UpdateBillingDateIsEnabled()` nur beim ersten (wertändernden) Aufruf ausgeführt wird.", "pruefidee": "`ReceiptKind` zweimal auf denselben Wert setzen und prüfen, dass `UpdateBillingDateIsEnabled()` nur beim ersten (wertändernden) Aufruf ausgeführt wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-10", "id": "SwRS-10",
@@ -846,7 +897,8 @@
"tracelinks": "SyRS-08", "tracelinks": "SyRS-08",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-08.", "pruefidee": "Siehe SyRS-08.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-11", "id": "SwRS-11",
@@ -862,7 +914,8 @@
"tracelinks": "SyRS-09", "tracelinks": "SyRS-09",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei aufeinanderfolgende `HasUserRight`-Aufrufe für denselben Benutzer per SQL-Profiler beobachten; es darf nur eine `Sichtrus`/`Sichmemb`-Abfrage anfallen.", "pruefidee": "Zwei aufeinanderfolgende `HasUserRight`-Aufrufe für denselben Benutzer per SQL-Profiler beobachten; es darf nur eine `Sichtrus`/`Sichmemb`-Abfrage anfallen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-12", "id": "SwRS-12",
@@ -878,7 +931,8 @@
"tracelinks": "SyRS-09", "tracelinks": "SyRS-09",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "SQL direkt gegen Testdatenbestand ausführen und Ergebnis mit erwarteten Gruppenrechten abgleichen.", "pruefidee": "SQL direkt gegen Testdatenbestand ausführen und Ergebnis mit erwarteten Gruppenrechten abgleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-13", "id": "SwRS-13",
@@ -894,7 +948,8 @@
"tracelinks": "SyRS-10", "tracelinks": "SyRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Methode mit einem `AppUser`-Objekt aus einer bereits geschlossenen/fremden Session aufrufen und prüfen, dass kein `LazyInitializationException` auftritt.", "pruefidee": "Methode mit einem `AppUser`-Objekt aus einer bereits geschlossenen/fremden Session aufrufen und prüfen, dass kein `LazyInitializationException` auftritt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-14", "id": "SwRS-14",
@@ -910,7 +965,8 @@
"tracelinks": "SyRS-11", "tracelinks": "SyRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-11.", "pruefidee": "Siehe SyRS-11.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-15", "id": "SwRS-15",
@@ -927,7 +983,8 @@
"tracelinks": "SyRS-11", "tracelinks": "SyRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gruppe „Administratoren“ in Testsystem umbenennen und prüfen, dass `IsAdmin()` für ehemalige Mitglieder anschließend `false` liefert.", "pruefidee": "Gruppe „Administratoren“ in Testsystem umbenennen und prüfen, dass `IsAdmin()` für ehemalige Mitglieder anschließend `false` liefert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-16", "id": "SwRS-16",
@@ -943,7 +1000,8 @@
"tracelinks": "SyRS-12", "tracelinks": "SyRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-12.", "pruefidee": "Siehe SyRS-12.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-17", "id": "SwRS-17",
@@ -959,7 +1017,8 @@
"tracelinks": "SyRS-12", "tracelinks": "SyRS-12",
"konsolidierung": "Kandidat: zwei Überladungen mit identischer Delegationslogik — im Zielsystem ggf. auf eine generische Signatur reduzierbar.", "konsolidierung": "Kandidat: zwei Überladungen mit identischer Delegationslogik — im Zielsystem ggf. auf eine generische Signatur reduzierbar.",
"pruefidee": "Beide Überladungen mit äquivalenten Werten aufrufen und identisches Ergebnis prüfen.", "pruefidee": "Beide Überladungen mit äquivalenten Werten aufrufen und identisches Ergebnis prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-18", "id": "SwRS-18",
@@ -975,7 +1034,8 @@
"tracelinks": "SyRS-13", "tracelinks": "SyRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-13.", "pruefidee": "Siehe SyRS-13.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-19", "id": "SwRS-19",
@@ -991,7 +1051,8 @@
"tracelinks": "SyRS-13", "tracelinks": "SyRS-13",
"konsolidierung": "Kandidat: siehe SyRS-13.", "konsolidierung": "Kandidat: siehe SyRS-13.",
"pruefidee": "Jede der fünf Dateien einzeln öffnen und die konkrete Bedingung mit dem Muster aus SwRS-18 vergleichen.", "pruefidee": "Jede der fünf Dateien einzeln öffnen und die konkrete Bedingung mit dem Muster aus SwRS-18 vergleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-20", "id": "SwRS-20",
@@ -1007,7 +1068,8 @@
"tracelinks": "SyRS-14", "tracelinks": "SyRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aufruf mit leerem Schlüssel prüft spezifische Fehlermeldung; Aufruf mit korrektem/falschem TOTP-Code prüft jeweiliges Ergebnis.", "pruefidee": "Aufruf mit leerem Schlüssel prüft spezifische Fehlermeldung; Aufruf mit korrektem/falschem TOTP-Code prüft jeweiliges Ergebnis.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-21", "id": "SwRS-21",
@@ -1023,7 +1085,8 @@
"tracelinks": "SyRS-14", "tracelinks": "SyRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Named Queries im Mapping/Query-Katalog auffinden und deren SQL-Text auf Plausibilität (korrekte Tabelle/Spalte) prüfen.", "pruefidee": "Named Queries im Mapping/Query-Katalog auffinden und deren SQL-Text auf Plausibilität (korrekte Tabelle/Spalte) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-22", "id": "SwRS-22",
@@ -1039,7 +1102,8 @@
"tracelinks": "SyRS-15", "tracelinks": "SyRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-15.", "pruefidee": "Siehe SyRS-15.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-23", "id": "SwRS-23",
@@ -1055,7 +1119,8 @@
"tracelinks": "SyRS-16", "tracelinks": "SyRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-16.", "pruefidee": "Siehe SyRS-16.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-24", "id": "SwRS-24",
@@ -1071,7 +1136,8 @@
"tracelinks": "SyRS-17", "tracelinks": "SyRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-17.", "pruefidee": "Siehe SyRS-17.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-25", "id": "SwRS-25",
@@ -1087,7 +1153,8 @@
"tracelinks": "SyRS-18", "tracelinks": "SyRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-18.", "pruefidee": "Siehe SyRS-18.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-26", "id": "SwRS-26",
@@ -1103,7 +1170,8 @@
"tracelinks": "SyRS-19", "tracelinks": "SyRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-19.", "pruefidee": "Siehe SyRS-19.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-27", "id": "SwRS-27",
@@ -1119,7 +1187,8 @@
"tracelinks": "SyRS-20", "tracelinks": "SyRS-20",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-20.", "pruefidee": "Siehe SyRS-20.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-28", "id": "SwRS-28",
@@ -1135,7 +1204,8 @@
"tracelinks": "SyRS-21", "tracelinks": "SyRS-21",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-21.", "pruefidee": "Siehe SyRS-21.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-29", "id": "SwRS-29",
@@ -1151,7 +1221,8 @@
"tracelinks": "SyRS-22", "tracelinks": "SyRS-22",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-22.", "pruefidee": "Siehe SyRS-22.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-30", "id": "SwRS-30",
@@ -1167,7 +1238,8 @@
"tracelinks": "SyRS-23", "tracelinks": "SyRS-23",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Siehe SyRS-23.", "pruefidee": "Siehe SyRS-23.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-31", "id": "SwRS-31",
@@ -1183,6 +1255,7 @@
"tracelinks": "SyRS-24", "tracelinks": "SyRS-24",
"konsolidierung": "Kandidat: nahezu identischer Aufbau beider Filterklassen (siehe SyRS-24).", "konsolidierung": "Kandidat: nahezu identischer Aufbau beider Filterklassen (siehe SyRS-24).",
"pruefidee": "Siehe SyRS-24.", "pruefidee": "Siehe SyRS-24.",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -32,6 +34,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (97,3 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 71 (97,3 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -49,5 +55,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **erfüllt** (40 risikorelevante Anforderungen, alle gedeckt) |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 73 von 73 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 73 von 73 mit Tracelinks (100,0 %) |
@@ -97,6 +97,8 @@ Ohne Subagenten sind Haupt- und Gesamtwerte für `claude-sonnet-5` identisch.
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -133,6 +135,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 42 (62,7 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 42 (62,7 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -150,6 +156,7 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 5 von 31 ungedeckt: StRS-17, SyRS-05, SyRS-18, SwRS-10, SwRS-26 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 5 von 31 ungedeckt: StRS-17, SyRS-05, SyRS-18, SwRS-10, SwRS-26 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 67 von 67 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 67 von 67 mit Tracelinks (100,0 %) |
## V1-Reihe: fünf Messpunkte unter identischer Bedingung ## V1-Reihe: fünf Messpunkte unter identischer Bedingung
@@ -14,7 +14,8 @@
"tracelinks": "SyRS-01", "tracelinks": "SyRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede der sieben Belegarten prüfen, dass Kopf-Objekt Number, Date, State, BranchI3D, CurrencyI3D, Receiver konsistent befüllt und persistiert wird; Test: Angebot anlegen → in Auftrag übernehmen → Referenz auf Ursprungsangebot prüfen.", "pruefidee": "Für jede der sieben Belegarten prüfen, dass Kopf-Objekt Number, Date, State, BranchI3D, CurrencyI3D, Receiver konsistent befüllt und persistiert wird; Test: Angebot anlegen → in Auftrag übernehmen → Referenz auf Ursprungsangebot prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-02", "id": "StRS-02",
@@ -31,7 +32,8 @@
"tracelinks": "SyRS-02", "tracelinks": "SyRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg stornieren, danach Versuch `SetPaid` aufzurufen → erwartete Fehlermeldung mit Code `DefaultMessageCodes.ErrorMessage`.", "pruefidee": "Beleg stornieren, danach Versuch `SetPaid` aufzurufen → erwartete Fehlermeldung mit Code `DefaultMessageCodes.ErrorMessage`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-03", "id": "StRS-03",
@@ -48,7 +50,8 @@
"tracelinks": "SyRS-03", "tracelinks": "SyRS-03",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg zweimal ändern und speichern; prüfen, dass für jede Änderung ein neuer Datensatz mit inkrementierendem `OriginalI3D`-Bezug in der *Versions-Tabelle entsteht und alle Positionswerte identisch zum historischen Stand sind.", "pruefidee": "Beleg zweimal ändern und speichern; prüfen, dass für jede Änderung ein neuer Datensatz mit inkrementierendem `OriginalI3D`-Bezug in der *Versions-Tabelle entsteht und alle Positionswerte identisch zum historischen Stand sind.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-04", "id": "StRS-04",
@@ -65,7 +68,8 @@
"tracelinks": "SyRS-04", "tracelinks": "SyRS-04",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Suche mit `ReceiptKinds = [Invoice]` und einem Kunden ohne Anzeigerecht für Rechnungen ausführen → 0 Treffer für diese Belegart trotz vorhandener Datensätze.", "pruefidee": "Suche mit `ReceiptKinds = [Invoice]` und einem Kunden ohne Anzeigerecht für Rechnungen ausführen → 0 Treffer für diese Belegart trotz vorhandener Datensätze.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-05", "id": "StRS-05",
@@ -82,7 +86,8 @@
"tracelinks": "SyRS-05", "tracelinks": "SyRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit `BillingIntervalKind=Monthly`, `AutomatedBilling=true` anlegen, Systemdatum auf Fälligkeitstag stellen, automatisierten Lauf ausführen → genau eine neue Rechnung mit Bezug `ContractI3D` entsteht.", "pruefidee": "Vertrag mit `BillingIntervalKind=Monthly`, `AutomatedBilling=true` anlegen, Systemdatum auf Fälligkeitstag stellen, automatisierten Lauf ausführen → genau eine neue Rechnung mit Bezug `ContractI3D` entsteht.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-06", "id": "StRS-06",
@@ -99,7 +104,8 @@
"tracelinks": "SyRS-06", "tracelinks": "SyRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "RMM-Dienst simulieren als nicht erreichbar, Vertrag mit RMM-Artikelreferenz abrechnen lassen → Rechnungserstellung schlägt mit definierter Fehlermeldung fehl, keine Teil-Rechnung wird gespeichert.", "pruefidee": "RMM-Dienst simulieren als nicht erreichbar, Vertrag mit RMM-Artikelreferenz abrechnen lassen → Rechnungserstellung schlägt mit definierter Fehlermeldung fehl, keine Teil-Rechnung wird gespeichert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-07", "id": "StRS-07",
@@ -116,7 +122,8 @@
"tracelinks": "SyRS-07", "tracelinks": "SyRS-07",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Kunde mit Limit 1000€ (Netto) anlegen, offene Belege mit Summe 900€ anlegen, neuen Beleg über 200€ ohne Override speichern → Bestätigungsdialog mit korrekt berechneter Differenz (100€) erscheint; mit `SaveAlthoughCustomerLimitExceeded=true` wird gespeichert.", "pruefidee": "Kunde mit Limit 1000€ (Netto) anlegen, offene Belege mit Summe 900€ anlegen, neuen Beleg über 200€ ohne Override speichern → Bestätigungsdialog mit korrekt berechneter Differenz (100€) erscheint; mit `SaveAlthoughCustomerLimitExceeded=true` wird gespeichert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-08", "id": "StRS-08",
@@ -133,7 +140,8 @@
"tracelinks": "SyRS-08", "tracelinks": "SyRS-08",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Codestellen suchen, die `LockOrderAfterDunningLevel` lesend mit dem tatsächlichen `DunningLevel` eines Kunden vergleichen (z. B. in Order-/DeliveryList-SpecificLogic oder UI-ViewModels); falls keine gefunden wird, mit Fachbereich klären, ob die Sperre nur UI-seitig/manuell umgesetzt ist.", "pruefidee": "Codestellen suchen, die `LockOrderAfterDunningLevel` lesend mit dem tatsächlichen `DunningLevel` eines Kunden vergleichen (z. B. in Order-/DeliveryList-SpecificLogic oder UI-ViewModels); falls keine gefunden wird, mit Fachbereich klären, ob die Sperre nur UI-seitig/manuell umgesetzt ist.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-09", "id": "StRS-09",
@@ -150,7 +158,8 @@
"tracelinks": "SyRS-09", "tracelinks": "SyRS-09",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Recht `CREATE_CUSTOMER` versucht Kunde anzulegen → `AccountBL` liefert `Result.AsError(\"Fehlende Rechte um Accounts zu erstellen\")`, kein Datensatz wird angelegt.", "pruefidee": "Benutzer ohne Recht `CREATE_CUSTOMER` versucht Kunde anzulegen → `AccountBL` liefert `Result.AsError(\"Fehlende Rechte um Accounts zu erstellen\")`, kein Datensatz wird angelegt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-10", "id": "StRS-10",
@@ -167,7 +176,8 @@
"tracelinks": "SyRS-10, SyRS-11", "tracelinks": "SyRS-10, SyRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne Passwort-Manager-Lizenz ruft `GetPasswordManagerCustomersEmployeesRights` auf → Fehler \"Sie besitzen keine Lizenz für den Passwort-Manager.\"; Benutzer mit hinterlegtem 2FA-Schlüssel gibt falsche PIN ein → Fehler \"Die eingegebene PIN ist ungültig!\".", "pruefidee": "Benutzer ohne Passwort-Manager-Lizenz ruft `GetPasswordManagerCustomersEmployeesRights` auf → Fehler \"Sie besitzen keine Lizenz für den Passwort-Manager.\"; Benutzer mit hinterlegtem 2FA-Schlüssel gibt falsche PIN ein → Fehler \"Die eingegebene PIN ist ungültig!\".",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-11", "id": "StRS-11",
@@ -184,7 +194,8 @@
"tracelinks": "SyRS-12", "tracelinks": "SyRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Feature mit Lizenz-GUID ohne zugeordnete Lizenz beim Kunden aufrufen → `HasLicense` liefert `false`, UI blendet Funktion aus (Beispiel Passwort-Manager, siehe StRS-10).", "pruefidee": "Feature mit Lizenz-GUID ohne zugeordnete Lizenz beim Kunden aufrufen → `HasLicense` liefert `false`, UI blendet Funktion aus (Beispiel Passwort-Manager, siehe StRS-10).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-12", "id": "StRS-12",
@@ -200,7 +211,8 @@
"tracelinks": "SyRS-13", "tracelinks": "SyRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Test-EDI-Datei eines unterstützten Lieferanten (z. B. Alltron-Lieferavis) einspielen → zugehöriger c-entron-Auftrag wird um Lieferinformationen (Sendungsverfolgung, Seriennummern) ergänzt, Verarbeitungsstatus wird in `EDILogBL` protokolliert.", "pruefidee": "Test-EDI-Datei eines unterstützten Lieferanten (z. B. Alltron-Lieferavis) einspielen → zugehöriger c-entron-Auftrag wird um Lieferinformationen (Sendungsverfolgung, Seriennummern) ergänzt, Verarbeitungsstatus wird in `EDILogBL` protokolliert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-13", "id": "StRS-13",
@@ -216,7 +228,8 @@
"tracelinks": "SyRS-14", "tracelinks": "SyRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aktionspreis mit `EffectiveUntil` in der Vergangenheit anlegen → erscheint nicht im Preisspiegel; Versuch, Aktionspreis ohne Distributor zu speichern → Validierungsfehler.", "pruefidee": "Aktionspreis mit `EffectiveUntil` in der Vergangenheit anlegen → erscheint nicht im Preisspiegel; Versuch, Aktionspreis ohne Distributor zu speichern → Validierungsfehler.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-14", "id": "StRS-14",
@@ -232,7 +245,8 @@
"tracelinks": "SyRS-15", "tracelinks": "SyRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne `BOOK_ARTICLE_STOCK_INTO_NEGATIVE` versucht Abbuchung, die den Bestand unter 0 bringen würde → Aktion wird verweigert; Benutzer mit Recht kann die Buchung durchführen.", "pruefidee": "Benutzer ohne `BOOK_ARTICLE_STOCK_INTO_NEGATIVE` versucht Abbuchung, die den Bestand unter 0 bringen würde → Aktion wird verweigert; Benutzer mit Recht kann die Buchung durchführen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-15", "id": "StRS-15",
@@ -248,7 +262,8 @@
"tracelinks": "SyRS-16", "tracelinks": "SyRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnung mit manipulierter Positionssumme (Abweichung > 3,00 vom Kopfbetrag) exportieren → Export schlägt mit Fehler fehl; Abweichung ≤ 3,00 → Export mit Warnung und korrigiertem Wert.", "pruefidee": "Rechnung mit manipulierter Positionssumme (Abweichung > 3,00 vom Kopfbetrag) exportieren → Export schlägt mit Fehler fehl; Abweichung ≤ 3,00 → Export mit Warnung und korrigiertem Wert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-16", "id": "StRS-16",
@@ -265,7 +280,8 @@
"tracelinks": "SyRS-17", "tracelinks": "SyRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "In DEBUG-Build eine Mail an \"kunde@fremdefirma.de\" auslösen → tatsächlicher Empfänger ist \"test@nexoware.com\"; Mail an \"kollege@nexoware.com\" bleibt unverändert.", "pruefidee": "In DEBUG-Build eine Mail an \"kunde@fremdefirma.de\" auslösen → tatsächlicher Empfänger ist \"test@nexoware.com\"; Mail an \"kollege@nexoware.com\" bleibt unverändert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-17", "id": "StRS-17",
@@ -281,7 +297,8 @@
"tracelinks": "SyRS-18", "tracelinks": "SyRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Ein Modul mit beiden Implementierungen identifizieren (z. B. `IAccountContractsLogic`) und prüfen, dass beide Implementierungen dieselbe Methode mit identischer Rückgabestruktur anbieten.", "pruefidee": "Ein Modul mit beiden Implementierungen identifizieren (z. B. `IAccountContractsLogic`) und prüfen, dass beide Implementierungen dieselbe Methode mit identischer Rückgabestruktur anbieten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-18", "id": "StRS-18",
@@ -298,7 +315,8 @@
"tracelinks": "SyRS-19", "tracelinks": "SyRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Suchfilter mit SQL-Metazeichen (`'; DROP TABLE ...`) in `SearchText` befüllen → Query wird als Parameterwert behandelt, keine strukturelle Änderung der Abfrage; Penetrationstest mit automatisiertem SQLi-Scanner auf Such-Endpunkt.", "pruefidee": "Suchfilter mit SQL-Metazeichen (`'; DROP TABLE ...`) in `SearchText` befüllen → Query wird als Parameterwert behandelt, keine strukturelle Änderung der Abfrage; Penetrationstest mit automatisiertem SQLi-Scanner auf Such-Endpunkt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "StRS-19", "id": "StRS-19",
@@ -315,7 +333,8 @@
"tracelinks": "SyRS-20", "tracelinks": "SyRS-20",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stichprobenprüfung von 20 zufällig gewählten Fehlermeldungen/UI-Strings auf deutsche Sprache und Vorhandensein einer `.en.resx`-Übersetzung.", "pruefidee": "Stichprobenprüfung von 20 zufällig gewählten Fehlermeldungen/UI-Strings auf deutsche Sprache und Vorhandensein einer `.en.resx`-Übersetzung.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-01", "id": "SyRS-01",
@@ -331,7 +350,8 @@
"tracelinks": "StRS-01", "tracelinks": "StRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für alle sieben Belegarten per Reflection prüfen, dass sie von `ReceiptBase` erben und keine der Basiseigenschaften \"shadowen\"/überschreiben.", "pruefidee": "Für alle sieben Belegarten per Reflection prüfen, dass sie von `ReceiptBase` erben und keine der Basiseigenschaften \"shadowen\"/überschreiben.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-02", "id": "SyRS-02",
@@ -348,7 +368,8 @@
"tracelinks": "StRS-02", "tracelinks": "StRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Automatisierter Test: Beleg canceln, `SetPaid(true)` aufrufen → Fehler; Beleg mit State=Active, `SetPaid(true)` → State wird Completed und Log-Eintrag `CreateSetAsPaidEntry` wird erzeugt.", "pruefidee": "Automatisierter Test: Beleg canceln, `SetPaid(true)` aufrufen → Fehler; Beleg mit State=Active, `SetPaid(true)` → State wird Completed und Log-Eintrag `CreateSetAsPaidEntry` wird erzeugt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-03", "id": "SyRS-03",
@@ -365,7 +386,8 @@
"tracelinks": "StRS-03", "tracelinks": "StRS-03",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Schema-Diff zwischen `AngKopf` und `AngKopfVersions` (bzw. `VertragPos`/`VertragPosVersions`) automatisiert prüfen: alle Spalten aus der Basistabelle (außer I3D) müssen 1:1 in der Versionstabelle vorhanden sein.", "pruefidee": "Schema-Diff zwischen `AngKopf` und `AngKopfVersions` (bzw. `VertragPos`/`VertragPosVersions`) automatisiert prüfen: alle Spalten aus der Basistabelle (außer I3D) müssen 1:1 in der Versionstabelle vorhanden sein.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-04", "id": "SyRS-04",
@@ -381,7 +403,8 @@
"tracelinks": "StRS-04", "tracelinks": "StRS-04",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lasttest: Suche über alle sieben Belegarten mit großem Datenbestand (>100.000 Belege je Art) ausführen, Antwortzeit und Einhaltung des 5-Minuten-Timeouts messen.", "pruefidee": "Lasttest: Suche über alle sieben Belegarten mit großem Datenbestand (>100.000 Belege je Art) ausführen, Antwortzeit und Einhaltung des 5-Minuten-Timeouts messen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-05", "id": "SyRS-05",
@@ -397,7 +420,8 @@
"tracelinks": "StRS-05", "tracelinks": "StRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Verträge mit unterschiedlichen Intervallkombinationen (z. B. Monthly/1, Monthly/3, Yearly/1) anlegen und den automatisierten Lauf für verschiedene Stichtage simulieren; erwartete Rechnungstermine mit tatsächlich erzeugten vergleichen.", "pruefidee": "Verträge mit unterschiedlichen Intervallkombinationen (z. B. Monthly/1, Monthly/3, Yearly/1) anlegen und den automatisierten Lauf für verschiedene Stichtage simulieren; erwartete Rechnungstermine mit tatsächlich erzeugten vergleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-06", "id": "SyRS-06",
@@ -413,7 +437,8 @@
"tracelinks": "StRS-06", "tracelinks": "StRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Integrationstest mit simuliertem RMM-Dienstausfall: (a) Vertrag mit RMM-Artikelreferenzen → Exception und Log-Eintrag; (b) Vertrag ohne RMM-Bezug → Rechnung wird trotz RMM-Ausfall normal erstellt.", "pruefidee": "Integrationstest mit simuliertem RMM-Dienstausfall: (a) Vertrag mit RMM-Artikelreferenzen → Exception und Log-Eintrag; (b) Vertrag ohne RMM-Bezug → Rechnung wird trotz RMM-Ausfall normal erstellt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-07", "id": "SyRS-07",
@@ -429,7 +454,8 @@
"tracelinks": "StRS-07", "tracelinks": "StRS-07",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Regressionstest mit mehrstufiger Belegkette (Angebot→Auftrag→Rechnung), bei dem derselbe Betrag nicht doppelt ins Limit einfließt (Prüfung `GetLimitUsedInOriginReceipts`-Abzug).", "pruefidee": "Regressionstest mit mehrstufiger Belegkette (Angebot→Auftrag→Rechnung), bei dem derselbe Betrag nicht doppelt ins Limit einfließt (Prüfung `GetLimitUsedInOriginReceipts`-Abzug).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-08", "id": "SyRS-08",
@@ -445,7 +471,8 @@
"tracelinks": "StRS-08", "tracelinks": "StRS-08",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Gezielte Codesuche nach lesendem Zugriff auf `LockOrderAfterDunningLevel` außerhalb von Zuweisung/Mapping; Rückfrage an Fachbereich, ob die Sperre ausschließlich manuell (Mitarbeiterhinweis) erfolgt.", "pruefidee": "Gezielte Codesuche nach lesendem Zugriff auf `LockOrderAfterDunningLevel` außerhalb von Zuweisung/Mapping; Rückfrage an Fachbereich, ob die Sperre ausschließlich manuell (Mitarbeiterhinweis) erfolgt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-09", "id": "SyRS-09",
@@ -461,7 +488,8 @@
"tracelinks": "StRS-09", "tracelinks": "StRS-09",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer mit 3 angefragten Rechten, von denen er nur 1 besitzt, aufrufen → Rückgabemenge enthält exakt dieses eine Recht.", "pruefidee": "Benutzer mit 3 angefragten Rechten, von denen er nur 1 besitzt, aufrufen → Rückgabemenge enthält exakt dieses eine Recht.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-10", "id": "SyRS-10",
@@ -477,7 +505,8 @@
"tracelinks": "StRS-10", "tracelinks": "StRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Direkter Webservice-Aufruf ohne UI (z. B. via Testclient) gegen einen Kunden ohne Passwort-Manager-Lizenz → Fehlerantwort mit `LicenseNotFound`, keine Daten im Response-Body.", "pruefidee": "Direkter Webservice-Aufruf ohne UI (z. B. via Testclient) gegen einen Kunden ohne Passwort-Manager-Lizenz → Fehlerantwort mit `LicenseNotFound`, keine Daten im Response-Body.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-11", "id": "SyRS-11",
@@ -493,7 +522,8 @@
"tracelinks": "StRS-10", "tracelinks": "StRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "PIN-Test mit korrektem TOTP-Wert (aus demselben Secret berechnet) → Erfolg; mit falschem/abgelaufenem Wert → \"Die eingegebene PIN ist ungültig!\"; Benutzer ohne Schlüssel → spezifischer Hinweistext.", "pruefidee": "PIN-Test mit korrektem TOTP-Wert (aus demselben Secret berechnet) → Erfolg; mit falschem/abgelaufenem Wert → \"Die eingegebene PIN ist ungültig!\"; Benutzer ohne Schlüssel → spezifischer Hinweistext.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-12", "id": "SyRS-12",
@@ -509,7 +539,8 @@
"tracelinks": "StRS-11", "tracelinks": "StRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Lizenzserver offline simulieren → `HasLicense` liefert weiterhin Werte aus `FileLicenseCache`; Lizenz mit `count=3` grenzt eine vierte Nutzung ab (siehe Beispiel MyDay-Import in Dokumentation).", "pruefidee": "Lizenzserver offline simulieren → `HasLicense` liefert weiterhin Werte aus `FileLicenseCache`; Lizenz mit `count=3` grenzt eine vierte Nutzung ab (siehe Beispiel MyDay-Import in Dokumentation).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-13", "id": "SyRS-13",
@@ -525,7 +556,8 @@
"tracelinks": "StRS-12", "tracelinks": "StRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede in der Tabelle als \"✗\" markierte Kombination (z. B. Komsa+Invoice) prüfen, dass das System dies erkennt und keinen Verarbeitungsversuch unternimmt, statt eine Ausnahme unbehandelt zu werfen.", "pruefidee": "Für jede in der Tabelle als \"✗\" markierte Kombination (z. B. Komsa+Invoice) prüfen, dass das System dies erkennt und keinen Verarbeitungsversuch unternimmt, statt eine Ausnahme unbehandelt zu werfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-14", "id": "SyRS-14",
@@ -541,7 +573,8 @@
"tracelinks": "StRS-13", "tracelinks": "StRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Aktionspreis mit `EffectiveFrom > EffectiveUntil` speichern → Validierungsfehler; Aktionspreis mit `EffectiveUntil = gestern` → wird im Preisspiegel nicht angezeigt.", "pruefidee": "Aktionspreis mit `EffectiveFrom > EffectiveUntil` speichern → Validierungsfehler; Aktionspreis mit `EffectiveUntil = gestern` → wird im Preisspiegel nicht angezeigt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-15", "id": "SyRS-15",
@@ -557,7 +590,8 @@
"tracelinks": "StRS-14", "tracelinks": "StRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jedes der 10 Rechte einen Benutzer ohne dieses Recht testen und sicherstellen, dass das zugehörige Flag `false` ist und die serverseitige Aktion verweigert wird (nicht nur UI-Ausblendung).", "pruefidee": "Für jedes der 10 Rechte einen Benutzer ohne dieses Recht testen und sicherstellen, dass das zugehörige Flag `false` ist und die serverseitige Aktion verweigert wird (nicht nur UI-Ausblendung).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-16", "id": "SyRS-16",
@@ -573,7 +607,8 @@
"tracelinks": "StRS-15", "tracelinks": "StRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "E-Rechnung mit Reverse-Charge-Fall exportieren → Steuerkategorie \"AE\" mit Hinweistext \"Steuerschuldnerschaft...\"; Testfall mit absichtlicher Rundungsdifferenz von 3,50 → Export schlägt fehl.", "pruefidee": "E-Rechnung mit Reverse-Charge-Fall exportieren → Steuerkategorie \"AE\" mit Hinweistext \"Steuerschuldnerschaft...\"; Testfall mit absichtlicher Rundungsdifferenz von 3,50 → Export schlägt fehl.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-17", "id": "SyRS-17",
@@ -589,7 +624,8 @@
"tracelinks": "StRS-16", "tracelinks": "StRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Unit-Test: `ValidateAddress(\"kunde@fremd.de\")` in simuliertem DEBUG-Kontext → liefert `test@nexoware.com`; `ValidateAddress(\"kollege@nexoware.com\")` → liefert unverändert.", "pruefidee": "Unit-Test: `ValidateAddress(\"kunde@fremd.de\")` in simuliertem DEBUG-Kontext → liefert `test@nexoware.com`; `ValidateAddress(\"kollege@nexoware.com\")` → liefert unverändert.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-18", "id": "SyRS-18",
@@ -605,7 +641,8 @@
"tracelinks": "StRS-17", "tracelinks": "StRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für ein bestehendes Modul (`IAccountContractsLogic`) beide Implementierungen gegen dieselbe Testsuite laufen lassen und identisches Verhalten (bei identischen Daten) verifizieren.", "pruefidee": "Für ein bestehendes Modul (`IAccountContractsLogic`) beide Implementierungen gegen dieselbe Testsuite laufen lassen und identisches Verhalten (bei identischen Daten) verifizieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-19", "id": "SyRS-19",
@@ -622,7 +659,8 @@
"tracelinks": "StRS-18", "tracelinks": "StRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Codeanalyse (z. B. Regex-Suche nach String-Konkatenation mit `filter.` in SQL-Strings) über alle `*SearchConfiguration`- und `*BL`-Klassen; ergänzend automatisierter SQLi-Test gegen Such-Endpunkte.", "pruefidee": "Statische Codeanalyse (z. B. Regex-Suche nach String-Konkatenation mit `filter.` in SQL-Strings) über alle `*SearchConfiguration`- und `*BL`-Klassen; ergänzend automatisierter SQLi-Test gegen Such-Endpunkte.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SyRS-20", "id": "SyRS-20",
@@ -638,7 +676,8 @@
"tracelinks": "StRS-19", "tracelinks": "StRS-19",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Stichprobe: für N zufällige Keys aus `LocalizedStrings.resx` prüfen, ob ein entsprechender Key in `LocalizedStrings.en.resx` existiert (Vollständigkeitsquote ermitteln).", "pruefidee": "Stichprobe: für N zufällige Keys aus `LocalizedStrings.resx` prüfen, ob ein entsprechender Key in `LocalizedStrings.en.resx` existiert (Vollständigkeitsquote ermitteln).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-01", "id": "SwRS-01",
@@ -654,7 +693,8 @@
"tracelinks": "SyRS-01", "tracelinks": "SyRS-01",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vererbungshierarchie aller Klassen mit Namensmuster `Receipt*` per Reflection prüfen: alle erben transitiv von `ReceiptBase`.", "pruefidee": "Vererbungshierarchie aller Klassen mit Namensmuster `Receipt*` per Reflection prüfen: alle erben transitiv von `ReceiptBase`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-02", "id": "SwRS-02",
@@ -670,7 +710,8 @@
"tracelinks": "SyRS-01, SyRS-03", "tracelinks": "SyRS-01, SyRS-03",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neues Feld nur in View + Entity ergänzen (nicht im Repository) → Wert wird nach Speichern+Neuladen NICHT persistiert; Regressionstest als Vorlage für künftige Feldänderungen einrichten.", "pruefidee": "Neues Feld nur in View + Entity ergänzen (nicht im Repository) → Wert wird nach Speichern+Neuladen NICHT persistiert; Regressionstest als Vorlage für künftige Feldänderungen einrichten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-03", "id": "SwRS-03",
@@ -686,7 +727,8 @@
"tracelinks": "SyRS-02", "tracelinks": "SyRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Compile-Test: `default: throw new ArgumentOutOfRangeException()` in `GetReceiptStateString` deckt auf, wenn ein neuer Enum-Wert ohne Anpassung eingeführt wird.", "pruefidee": "Compile-Test: `default: throw new ArgumentOutOfRangeException()` in `GetReceiptStateString` deckt auf, wenn ein neuer Enum-Wert ohne Anpassung eingeführt wird.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-04", "id": "SwRS-04",
@@ -702,7 +744,8 @@
"tracelinks": "SyRS-02", "tracelinks": "SyRS-02",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Fehlermeldungstext exakt gegen Testfall abgleichen (inkl. Tippfehler-Erkennung als Regressionsschutz gegen unbeabsichtigte Textänderung); parallele Änderung mit veraltetem `ConcurrencyControlGuid` → Fehler `ChangedByOtherInstance`.", "pruefidee": "Fehlermeldungstext exakt gegen Testfall abgleichen (inkl. Tippfehler-Erkennung als Regressionsschutz gegen unbeabsichtigte Textänderung); parallele Änderung mit veraltetem `ConcurrencyControlGuid` → Fehler `ChangedByOtherInstance`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-05", "id": "SwRS-05",
@@ -718,7 +761,8 @@
"tracelinks": "SyRS-03", "tracelinks": "SyRS-03",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Automatisiertes Schema-Diff-Skript zwischen jeder `*Kopf`/`*Pos`-Tabelle und ihrer `*Versions`-Entsprechung als CI-Check.", "pruefidee": "Automatisiertes Schema-Diff-Skript zwischen jeder `*Kopf`/`*Pos`-Tabelle und ihrer `*Versions`-Entsprechung als CI-Check.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-06", "id": "SwRS-06",
@@ -734,7 +778,8 @@
"tracelinks": "SyRS-03", "tracelinks": "SyRS-03",
"konsolidierung": "Kandidat: SwRS-05 (gemeinsame Testbasis Schema+Kopiervorgang)", "konsolidierung": "Kandidat: SwRS-05 (gemeinsame Testbasis Schema+Kopiervorgang)",
"pruefidee": "Beleg mit 5 Positionen zweimal ändern → 2 Kopf-Versionsdatensätze, 10 Positions-Versionsdatensätze mit korrektem `KopfVersionsI3D`-Bezug je Änderungszeitpunkt.", "pruefidee": "Beleg mit 5 Positionen zweimal ändern → 2 Kopf-Versionsdatensätze, 10 Positions-Versionsdatensätze mit korrektem `KopfVersionsI3D`-Bezug je Änderungszeitpunkt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-07", "id": "SwRS-07",
@@ -750,7 +795,8 @@
"tracelinks": "SyRS-04", "tracelinks": "SyRS-04",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Filter setzen, der von genau einer von sieben Belegarten unterstützt wird → Ergebnis enthält ausschließlich Treffer dieser einen Belegart, keine Fehlermeldung für die anderen sechs.", "pruefidee": "Filter setzen, der von genau einer von sieben Belegarten unterstützt wird → Ergebnis enthält ausschließlich Treffer dieser einen Belegart, keine Fehlermeldung für die anderen sechs.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-08", "id": "SwRS-08",
@@ -766,7 +812,8 @@
"tracelinks": "SyRS-04, SyRS-09", "tracelinks": "SyRS-04, SyRS-09",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Benutzer ohne `ShowRight` für Verträge sucht mit `ReceiptKinds` leer (alle Belegarten) → Ergebnisliste enthält keine Vertragsbelege, auch wenn diese existieren.", "pruefidee": "Benutzer ohne `ShowRight` für Verträge sucht mit `ReceiptKinds` leer (alle Belegarten) → Ergebnisliste enthält keine Vertragsbelege, auch wenn diese existieren.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-09", "id": "SwRS-09",
@@ -782,7 +829,8 @@
"tracelinks": "SyRS-05", "tracelinks": "SyRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vertrag mit allen Kontingent-Feldern befüllen, Serialisierung/Deserialisierung (DTO-Mapping) auf Vollständigkeit prüfen.", "pruefidee": "Vertrag mit allen Kontingent-Feldern befüllen, Serialisierung/Deserialisierung (DTO-Mapping) auf Vollständigkeit prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-10", "id": "SwRS-10",
@@ -798,7 +846,8 @@
"tracelinks": "SyRS-05", "tracelinks": "SyRS-05",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Codereview/Komponententest: `AutomaticFacturaBL.Contracts.cs` auf Vorhandensein der beschriebenen Verantwortlichkeiten (Fälligkeitsselektion, RMM-Aufruf, Kontingent-Update) prüfen.", "pruefidee": "Codereview/Komponententest: `AutomaticFacturaBL.Contracts.cs` auf Vorhandensein der beschriebenen Verantwortlichkeiten (Fälligkeitsselektion, RMM-Aufruf, Kontingent-Update) prüfen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-11", "id": "SwRS-11",
@@ -814,7 +863,8 @@
"tracelinks": "SyRS-06", "tracelinks": "SyRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Rechnungsvorlage mit Platzhalter in Position 3 von 6 → RMM-Positionen erscheinen an Position 3; Vorlage ohne Platzhalter → RMM-Positionen erscheinen bei Position (Anzahl-2).", "pruefidee": "Rechnungsvorlage mit Platzhalter in Position 3 von 6 → RMM-Positionen erscheinen an Position 3; Vorlage ohne Platzhalter → RMM-Positionen erscheinen bei Position (Anzahl-2).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-12", "id": "SwRS-12",
@@ -830,7 +880,8 @@
"tracelinks": "SyRS-06", "tracelinks": "SyRS-06",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Zwei Testfälle wie in SyRS-06 beschrieben, zusätzlich Prüfung der geloggten Fehlermeldung (`_logger.Error(errorMsg)`).", "pruefidee": "Zwei Testfälle wie in SyRS-06 beschrieben, zusätzlich Prüfung der geloggten Fehlermeldung (`_logger.Error(errorMsg)`).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-13", "id": "SwRS-13",
@@ -846,7 +897,8 @@
"tracelinks": "SyRS-07", "tracelinks": "SyRS-07",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Beleg über 500€ anlegen (Limitverbrauch 500€), danach auf 600€ ändern und erneut speichern → Limitverbrauch insgesamt 600€, nicht 1100€.", "pruefidee": "Beleg über 500€ anlegen (Limitverbrauch 500€), danach auf 600€ ändern und erneut speichern → Limitverbrauch insgesamt 600€, nicht 1100€.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-14", "id": "SwRS-14",
@@ -863,7 +915,8 @@
"tracelinks": "SyRS-07, SyRS-08", "tracelinks": "SyRS-07, SyRS-08",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Feldweise Persistenztest: alle genannten Felder setzen, speichern, neu laden, Werte vergleichen.", "pruefidee": "Feldweise Persistenztest: alle genannten Felder setzen, speichern, neu laden, Werte vergleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-15", "id": "SwRS-15",
@@ -879,7 +932,8 @@
"tracelinks": "SyRS-08", "tracelinks": "SyRS-08",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Vollständige Volltextsuche über die gesamte Codebasis (auch WPF.UI-ViewModels, Reports, gespeicherte Prozeduren) nach `LockOrderAfterDunningLevel`; falls keine Durchsetzung gefunden wird, Rückfrage an Fachbereich/Produktverantwortliche.", "pruefidee": "Vollständige Volltextsuche über die gesamte Codebasis (auch WPF.UI-ViewModels, Reports, gespeicherte Prozeduren) nach `LockOrderAfterDunningLevel`; falls keine Durchsetzung gefunden wird, Rückfrage an Fachbereich/Produktverantwortliche.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-16", "id": "SwRS-16",
@@ -895,7 +949,8 @@
"tracelinks": "SyRS-09", "tracelinks": "SyRS-09",
"konsolidierung": "Kandidat: SwRS-08 (beide nutzen Rechteprüfung als Vorfilter, aber unterschiedliche Aufrufer/Mechanik — AppRightsBL arbeitet auf App-Usern, ReceiptSearcher auf konfigurierten ShowRight-Werten)", "konsolidierung": "Kandidat: SwRS-08 (beide nutzen Rechteprüfung als Vorfilter, aber unterschiedliche Aufrufer/Mechanik — AppRightsBL arbeitet auf App-Usern, ReceiptSearcher auf konfigurierten ShowRight-Werten)",
"pruefidee": "Unit-/Integrationstest mit bekannter Testdatenbank: Benutzer mit 2 von 5 angefragten Rechten → Rückgabe enthält exakt 2 IDs.", "pruefidee": "Unit-/Integrationstest mit bekannter Testdatenbank: Benutzer mit 2 von 5 angefragten Rechten → Rückgabe enthält exakt 2 IDs.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-17", "id": "SwRS-17",
@@ -912,7 +967,8 @@
"tracelinks": "SyRS-09", "tracelinks": "SyRS-09",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Statische Codeanalyse: Suche nach numerischen Literalen in `HasUserRight(...)`/`CheckRightsFromUser(...)`-Aufrufen als Verstoß gegen die Konvention.", "pruefidee": "Statische Codeanalyse: Suche nach numerischen Literalen in `HasUserRight(...)`/`CheckRightsFromUser(...)`-Aufrufen als Verstoß gegen die Konvention.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-18", "id": "SwRS-18",
@@ -928,7 +984,8 @@
"tracelinks": "SyRS-10", "tracelinks": "SyRS-10",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Alle öffentlichen Methoden von `PasswordManagerBL` auflisten und prüfen, ob jede davon dieselbe Lizenzprüfung am Anfang durchführt (Konsistenzprüfung, da nur eine Methode im Detail gelesen wurde — siehe Analysebericht/Lücken).", "pruefidee": "Alle öffentlichen Methoden von `PasswordManagerBL` auflisten und prüfen, ob jede davon dieselbe Lizenzprüfung am Anfang durchführt (Konsistenzprüfung, da nur eine Methode im Detail gelesen wurde — siehe Analysebericht/Lücken).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-19", "id": "SwRS-19",
@@ -944,7 +1001,8 @@
"tracelinks": "SyRS-11", "tracelinks": "SyRS-11",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Drei Testfälle: kein Schlüssel hinterlegt, korrekte PIN, falsche PIN → jeweils erwartetes Result-Objekt.", "pruefidee": "Drei Testfälle: kein Schlüssel hinterlegt, korrekte PIN, falsche PIN → jeweils erwartetes Result-Objekt.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-20", "id": "SwRS-20",
@@ -961,7 +1019,8 @@
"tracelinks": "SyRS-12", "tracelinks": "SyRS-12",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Drei Testfälle mit präparierten Lizenzdaten: keine Lizenz, unbegrenzte Lizenz, Lizenz mit count=3 → jeweils erwartetes Result-Verhalten.", "pruefidee": "Drei Testfälle mit präparierten Lizenzdaten: keine Lizenz, unbegrenzte Lizenz, Lizenz mit count=3 → jeweils erwartetes Result-Verhalten.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-21", "id": "SwRS-21",
@@ -977,7 +1036,8 @@
"tracelinks": "SyRS-13", "tracelinks": "SyRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Neue Testlieferant-Integration nach Schema hinzufügen und prüfen, dass `ApplyDistriToCentron` sie ohne Änderung an bestehenden Partial-Classes korrekt dispatcht.", "pruefidee": "Neue Testlieferant-Integration nach Schema hinzufügen und prüfen, dass `ApplyDistriToCentron` sie ohne Änderung an bestehenden Partial-Classes korrekt dispatcht.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-22", "id": "SwRS-22",
@@ -993,7 +1053,8 @@
"tracelinks": "SyRS-13", "tracelinks": "SyRS-13",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jede der 7×4 theoretisch möglichen Kombinationen dokumentieren/testen, ob sie unterstützt wird (Abgleich mit Tabelle \"Document Types Supported\").", "pruefidee": "Für jede der 7×4 theoretisch möglichen Kombinationen dokumentieren/testen, ob sie unterstützt wird (Abgleich mit Tabelle \"Document Types Supported\").",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-23", "id": "SwRS-23",
@@ -1009,7 +1070,8 @@
"tracelinks": "SyRS-14", "tracelinks": "SyRS-14",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Speicherversuch mit leerem Distributor → Fehler; mit `EffectiveFrom` nach `EffectiveUntil` → Fehler; gültiger Datensatz → erfolgreich gespeichert und im Preisspiegel sichtbar bei aktuellem Datum im Bereich.", "pruefidee": "Speicherversuch mit leerem Distributor → Fehler; mit `EffectiveFrom` nach `EffectiveUntil` → Fehler; gültiger Datensatz → erfolgreich gespeichert und im Preisspiegel sichtbar bei aktuellem Datum im Bereich.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-24", "id": "SwRS-24",
@@ -1025,7 +1087,8 @@
"tracelinks": "SyRS-15", "tracelinks": "SyRS-15",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Für jedes der 11 Rechte einzeln: Benutzer ohne dieses (aber mit allen anderen) Recht → nur das zugehörige Flag ist `false`.", "pruefidee": "Für jedes der 11 Rechte einzeln: Benutzer ohne dieses (aber mit allen anderen) Recht → nur das zugehörige Flag ist `false`.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-25", "id": "SwRS-25",
@@ -1041,7 +1104,8 @@
"tracelinks": "SyRS-16", "tracelinks": "SyRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Drei Testfälle: Abweichung 0,00 (kein Hinweis), 2,50 (Warnung + Korrektur), 5,00 (Fehler, kein Export).", "pruefidee": "Drei Testfälle: Abweichung 0,00 (kein Hinweis), 2,50 (Warnung + Korrektur), 5,00 (Fehler, kein Export).",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-26", "id": "SwRS-26",
@@ -1057,7 +1121,8 @@
"tracelinks": "SyRS-16", "tracelinks": "SyRS-16",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Je einen Testfall pro Kategorie (Standard, steuerfrei Inland, innergemeinschaftlich, Export, Reverse Charge) mit erwartetem Code und Hinweistext abgleichen.", "pruefidee": "Je einen Testfall pro Kategorie (Standard, steuerfrei Inland, innergemeinschaftlich, Export, Reverse Charge) mit erwartetem Code und Hinweistext abgleichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-27", "id": "SwRS-27",
@@ -1073,7 +1138,8 @@
"tracelinks": "SyRS-17", "tracelinks": "SyRS-17",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Randfalltests: leere Adresse, Adresse \"NEXOWARE.COM\"-Großschreibung, Adresse ohne @-Zeichen.", "pruefidee": "Randfalltests: leere Adresse, Adresse \"NEXOWARE.COM\"-Großschreibung, Adresse ohne @-Zeichen.",
"qm": "" "qm": "",
"uebernahme": ""
}, },
{ {
"id": "SwRS-28", "id": "SwRS-28",
@@ -1089,6 +1155,7 @@
"tracelinks": "SyRS-18", "tracelinks": "SyRS-18",
"konsolidierung": "nein", "konsolidierung": "nein",
"pruefidee": "Codebase-weite Suche nach Interfaces mit Suffix `Logic`, die NICHT dem Muster `I*Logic`/`BL*Logic`/`WS*Logic` folgen, als Qualitätsindikator für Konventionsabweichungen (siehe Konsolidierungshinweis Analysebericht).", "pruefidee": "Codebase-weite Suche nach Interfaces mit Suffix `Logic`, die NICHT dem Muster `I*Logic`/`BL*Logic`/`WS*Logic` folgen, als Qualitätsindikator für Konventionsabweichungen (siehe Konsolidierungshinweis Analysebericht).",
"qm": "" "qm": "",
"uebernahme": ""
} }
] ]
@@ -2,6 +2,8 @@
Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`. Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockformat des Prompts). Erzeugt von `analyse-anforderungen.py`.
Die Kenngrößen decken die **maschinell prüfbare** Hälfte des Evaluationsrahmens aus Kapitel 4.3 ab: Belegqualität und Übernahmewürdigkeit gehören zur *Statement-Qualität*, Verteilung und Konsolidierungskandidaten zur *Set-Qualität*, Tracelinks und Belegklassifikation zur *Traceability-Qualität*. Die Expertenbewertung nach Likert-Skala tritt daneben und wird hier nicht ersetzt.
### Verteilung über die Ebenen ### Verteilung über die Ebenen
| Ebene | Anzahl | Anteil | | Ebene | Anzahl | Anteil |
@@ -38,6 +40,10 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| Belege je Anforderung (Median) | 1 | | Belege je Anforderung (Median) | 1 |
| Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 42 (62,7 %) | | Anforderungen mit mindestens einem `PRIMÄR`-Beleg | 42 (62,7 %) |
### Übernahmewürdigkeit
**nicht erhoben** – das Feld `Übernahmewürdigkeit` wurde erst mit der Prompt-Fassung vom 2026-08-26 eingeführt und liegt für diesen Lauf nicht vor. Hinweise auf Workarounds stecken ersatzweise im Feld `Status`.
### Status ### Status
| Kategorie | Anzahl | Anteil | | Kategorie | Anzahl | Anteil |
@@ -55,5 +61,6 @@ Maschinell aus `Ergebnisse\StRS.md`, `SyRS.md` und `SwRS.md` ausgewertet (Blockf
| **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) | | **Belegpflicht** – jede Anforderung mindestens ein Artefaktbeleg | **erfüllt** (0 Anforderungen ohne Beleg) |
| **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 5 von 31 ungedeckt: StRS-17, SyRS-05, SyRS-18, SwRS-10, SwRS-26 | | **Risikobasierte Priorisierung** – Sicherheit, Abrechnung, Berechtigungen brauchen einen `PRIMÄR`-Beleg oder die Kennzeichnung `[HYPOTHESE]` | **verletzt** – 5 von 31 ungedeckt: StRS-17, SyRS-05, SyRS-18, SwRS-10, SwRS-26 |
| **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** | | **Verifizierbarkeit** – jede Anforderung mit Prüfidee oder Akzeptanzkriterium | **erfüllt** |
| **Übernahmewürdigkeit** – Einstufung für die Migrationsperspektive | *nicht erhoben* (Feld erst ab Prompt-Fassung 2026-08-26) |
| **Traceability** – Verknüpfung zwischen den Ebenen | 67 von 67 mit Tracelinks (100,0 %) | | **Traceability** – Verknüpfung zwischen den Ebenen | 67 von 67 mit Tracelinks (100,0 %) |