Tag 1 abgeschlossen
This commit is contained in:
@@ -54,6 +54,7 @@ def analysiere(lauf):
|
||||
konsolidierung=feld(b, 'Konsolidierung'),
|
||||
pruefidee=feld(b, 'Prüfidee') or feld(b, 'Pruefidee'),
|
||||
qm=feld(b, 'Qualitätsmerkmal'),
|
||||
uebernahme=feld(b, 'Übernahmewürdigkeit') or feld(b, 'Uebernahmewuerdigkeit'),
|
||||
))
|
||||
return anf
|
||||
|
||||
@@ -88,6 +89,20 @@ def abschnitt(anf):
|
||||
kons = [a for a in anf if a['konsolidierung'] and a['konsolidierung'].lower() != 'nein']
|
||||
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_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', '',
|
||||
'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', '',
|
||||
'| Ebene | Anzahl | Anteil |', '|---|---:|---:|']
|
||||
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)),
|
||||
'']
|
||||
|
||||
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 |', '|---|---:|---:|',
|
||||
'| belegt | %d | %s |' % (n - len(hyp), pct(n - 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 |'
|
||||
% ('**erfüllt**' if not 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) |'
|
||||
% (n - len(ohne_trace), n, pct(n - len(ohne_trace), n)))
|
||||
z.append('')
|
||||
|
||||
Reference in New Issue
Block a user