test(17): Browser-Gegenproben #7/#8/#9 nachgeholt — Phase 17 auf passed
Die drei human-check-Punkte aus Phase 17 waren am 2026-08-12 offen geblieben,
weil in der Ausfuehrungssitzung kein Browser-Tool verfuegbar war. Sie wurden
jetzt gegen frisch gebaute Images aus main (79015dd) mit echtem Chrome und
leerer Datenbank durchgeklickt.
#7 (17-01 Task 2): nutzer1 speichert sein Postfach, die Werte ueberleben den
Reload; nutzer2 sieht ein leeres Formular statt der Werte von nutzer1. Danach
zwei TenderEmailConfig-Zeilen mit je eigenem userId.
#8 (17-03 Task 1): Meine Quellen zeigt alle drei Abschnitte, ein eigener
RSS-Feed erscheint sofort mit Entfernen-Knopf, der plattformweite service-bund
steht darunter ohne, und das Digest-Intervall "Woechentlich" ueberlebt den
Reload.
#9 (17-03 Task 2): USER sieht auf /settings keine Bedienelemente, nur Hinweis
und Verweis; SUPER_ADMIN sieht Abrufintervall und plattformweite Feeds, aber
kein Postfach und keine Benachrichtigung mehr. Das Zahnrad fuehrt in beiden
Faellen nach Meine Quellen.
Zusaetzlich am laufenden Server gemessen, weil eine ausgeblendete Schaltflaeche
kein Beweis fuer eine serverseitige Sperre ist: als nutzer2 liefert GET
/rss-feeds nur den plattformweiten Feed, DELETE auf den plattformweiten wie auf
den fremden Feed antwortet 404 ohne die Zeile anzufassen, und POST mit
scope=platform wird mit 403 abgewiesen.
WINDOWS.md #7/#8/#9 auf fixed (open_count 9 -> 6), Verifikationsbericht mit
Nachtrag und Screenshots auf passed, ROADMAP auf Complete, STATE nachgezogen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5jtbGzC5Sf9npJ3JCjKhq
This commit is contained in:
@@ -609,7 +609,7 @@ Phases execute in numeric order: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10
|
|||||||
| 14. RSS, Email-Alert Ingestion & Module Rollout | 5/5 | In Progress| |
|
| 14. RSS, Email-Alert Ingestion & Module Rollout | 5/5 | In Progress| |
|
||||||
| 15. Modul-Berechtigungen: Gruppen & User-Grants | 8/8 | Complete | 2026-08-04 (Bericht 15-04 am 2026-08-11 nachgezogen) |
|
| 15. Modul-Berechtigungen: Gruppen & User-Grants | 8/8 | Complete | 2026-08-04 (Bericht 15-04 am 2026-08-11 nachgezogen) |
|
||||||
| 16. AD-Gruppen-Synchronisation | 5/5 | Complete | 2026-08-11 |
|
| 16. AD-Gruppen-Synchronisation | 5/5 | Complete | 2026-08-11 |
|
||||||
| 17. Eigene Ausschreibungs-Quellen je Nutzer | 3/3 | Human Needed | 2026-08-12 (3 Browser-Gegenproben offen, WINDOWS.md #7/#8/#9) |
|
| 17. Eigene Ausschreibungs-Quellen je Nutzer | 3/3 | Complete | 2026-08-12 (Browser-Gegenproben #7/#8/#9 am 2026-09-07 nachgeholt, alle bestanden) |
|
||||||
|
|
||||||
### Phase 17: Eigene Ausschreibungs-Quellen je Nutzer
|
### Phase 17: Eigene Ausschreibungs-Quellen je Nutzer
|
||||||
|
|
||||||
|
|||||||
+13
-18
@@ -4,16 +4,16 @@ milestone: v1.1
|
|||||||
milestone_name: Ausschreibungs-Radar
|
milestone_name: Ausschreibungs-Radar
|
||||||
current_phase: 17
|
current_phase: 17
|
||||||
current_phase_name: eigene-ausschreibungs-quellen-je-nutzer
|
current_phase_name: eigene-ausschreibungs-quellen-je-nutzer
|
||||||
status: verifying
|
status: verified
|
||||||
stopped_at: "17-03 abgeschlossen: UI-Aufteilung Meine Quellen vs. Administration, Backlog-Punkt geschlossen. Phase 17 vollstaendig — bereit fuer /gsd-ship (Browser-Gegenprobe aller drei Plaene und Testserver-Rollout stehen als offene Punkte in WINDOWS.md)."
|
stopped_at: "Phase 17 verifiziert und abgeschlossen: die drei offenen Browser-Gegenproben (WINDOWS.md #7/#8/#9) wurden am 2026-09-07 im echten Browser nachgeholt und bestanden. Verifikationsbericht steht auf passed, Roadmap auf Complete. Naechster Schritt: /gsd-ship."
|
||||||
last_updated: "2026-08-12T10:06:09.773Z"
|
last_updated: "2026-09-07T07:56:00.000Z"
|
||||||
last_activity: 2026-08-12
|
last_activity: 2026-09-07
|
||||||
last_activity_desc: Phase 17 execution started
|
last_activity_desc: Phase 17 Browser-Gegenproben nachgeholt, Phase auf passed
|
||||||
progress:
|
progress:
|
||||||
total_phases: 17
|
total_phases: 17
|
||||||
completed_phases: 16
|
completed_phases: 17
|
||||||
total_plans: 83
|
total_plans: 83
|
||||||
completed_plans: 82
|
completed_plans: 83
|
||||||
---
|
---
|
||||||
|
|
||||||
# Project State
|
# Project State
|
||||||
@@ -27,17 +27,12 @@ See: .planning/PROJECT.md (updated 2026-07-17)
|
|||||||
|
|
||||||
## Current Position
|
## Current Position
|
||||||
|
|
||||||
Phase: 17 (eigene-ausschreibungs-quellen-je-nutzer) — EXECUTING
|
Phase: 17 (eigene-ausschreibungs-quellen-je-nutzer) — VERIFIED / passed
|
||||||
Plan: 3 of 3
|
Plan: 3 of 3
|
||||||
Status: Phase complete — ready for verification
|
Status: Phase abgeschlossen und im Browser gegengeprueft — bereit fuer /gsd-ship
|
||||||
uebersprungen (kein AD-Schreibzugriff, Entscheidung des Users 2026-08-11).
|
Last activity: 2026-09-07 — Browser-Gegenproben #7/#8/#9 nachgeholt, alle bestanden
|
||||||
UAT-Test 2 hat einen kritischen Fehler in der Loescherkennung aufgedeckt, der
|
|
||||||
beim ersten echten Sync alle AD-gebundenen Gruppen entfernt haette — behoben in
|
|
||||||
260811-f9i. Offene Annahme A1 (objectGUID uebersteht Umbenennung) steht
|
|
||||||
dokumentiert in 16-VERIFICATION.md.
|
|
||||||
Last activity: 2026-08-12 — Phase 17 execution started
|
|
||||||
|
|
||||||
Progress: [██████████] 99%
|
Progress: [██████████] 100%
|
||||||
|
|
||||||
## Performance Metrics
|
## Performance Metrics
|
||||||
|
|
||||||
@@ -341,7 +336,7 @@ Items acknowledged and carried forward from previous milestone close:
|
|||||||
|
|
||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-08-12T10:06:09.739Z
|
Last session: 2026-09-07T07:56:00.000Z
|
||||||
Stopped at: 17-03 abgeschlossen: UI-Aufteilung Meine Quellen vs. Administration, Backlog-Punkt geschlossen. Phase 17 vollstaendig — bereit fuer /gsd-ship (Browser-Gegenprobe aller drei Plaene und Testserver-Rollout stehen als offene Punkte in WINDOWS.md).
|
Stopped at: Phase 17 auf passed gesetzt; 6 aeltere Browser-Gegenproben aus Phase 15/16 (WINDOWS.md #1-#6) bleiben offen.
|
||||||
Resume file: None
|
Resume file: None
|
||||||
Last activity: 2026-07-14 - Built LDAP per-user exclude/denylist filter (9d1323f), migration applied on live DB, verified via Playwright: sync deactivated 4 excluded service accounts (administrator/krbtgt/guest/dns-ldap), 2 real LDAP users stay active, 0 wrongly created
|
Last activity: 2026-07-14 - Built LDAP per-user exclude/denylist filter (9d1323f), migration applied on live DB, verified via Playwright: sync deactivated 4 excluded service accounts (administrator/krbtgt/guest/dns-ldap), 2 real LDAP users stay active, 0 wrongly created
|
||||||
|
|||||||
+12
-12
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
schema_version: 1
|
schema_version: 1
|
||||||
open_count: 9
|
open_count: 6
|
||||||
waived_count: 0
|
waived_count: 0
|
||||||
fixed_count: 0
|
fixed_count: 3
|
||||||
total_count: 9
|
total_count: 9
|
||||||
last_updated: 2026-08-12T10:02:49.291Z
|
last_updated: 2026-09-07T07:50:56.910Z
|
||||||
---
|
---
|
||||||
|
|
||||||
# Broken Windows Ledger
|
# Broken Windows Ledger
|
||||||
@@ -21,9 +21,9 @@ last_updated: 2026-08-12T10:02:49.291Z
|
|||||||
| 4 | 16 | unrun-verify | .planning/phases/16-ad-gruppen-synchronisation/16-03-PLAN.md | | 16-03 Task 2 human-check: RESEARCH.md Annahmen A1 (objectGUID uebersteht AD-Umbenennung) und A2 (byteweise Hex-Filter-Syntax) sind gegen kein echtes Active Directory geprueft — kein erreichbares AD in dieser Sandbox. Negatives Ergebnis bei A1 oder A2 ist Stopp-Grund fuer die Loeschsemantik (D-05). | open | | 2026-08-06T14:21:59.987Z | |
|
| 4 | 16 | unrun-verify | .planning/phases/16-ad-gruppen-synchronisation/16-03-PLAN.md | | 16-03 Task 2 human-check: RESEARCH.md Annahmen A1 (objectGUID uebersteht AD-Umbenennung) und A2 (byteweise Hex-Filter-Syntax) sind gegen kein echtes Active Directory geprueft — kein erreichbares AD in dieser Sandbox. Negatives Ergebnis bei A1 oder A2 ist Stopp-Grund fuer die Loeschsemantik (D-05). | open | | 2026-08-06T14:21:59.987Z | |
|
||||||
| 5 | 16 | unrun-verify | .planning/phases/16-ad-gruppen-synchronisation/16-04-PLAN.md | | Manueller Browser-Durchklick aus dem Plan-Verification-Block (drei GroupFormModal-Zustaende: Anlegen mit Hinweis-Link, lokale Gruppe umbenennen, importierte Gruppe mit gesperrtem Namen + internem Namen speichern; Namensanzeige mit Tooltip in der Liste nach dem Speichern) nicht ausgefuehrt — kein Browser-Tool in dieser Session verfuegbar. | open | | 2026-08-06T14:31:14.336Z | |
|
| 5 | 16 | unrun-verify | .planning/phases/16-ad-gruppen-synchronisation/16-04-PLAN.md | | Manueller Browser-Durchklick aus dem Plan-Verification-Block (drei GroupFormModal-Zustaende: Anlegen mit Hinweis-Link, lokale Gruppe umbenennen, importierte Gruppe mit gesperrtem Namen + internem Namen speichern; Namensanzeige mit Tooltip in der Liste nach dem Speichern) nicht ausgefuehrt — kein Browser-Tool in dieser Session verfuegbar. | open | | 2026-08-06T14:31:14.336Z | |
|
||||||
| 6 | 16 | unrun-verify | .planning/phases/16-ad-gruppen-synchronisation/16-05-PLAN.md | | 16-05 <verification> Manuell nachzuholen (Browser): Sync ausloesen und pruefen, dass alle drei Zahlenzeilen erscheinen; Lauf mit verschobener Standardmarkierung provozieren und Amber-Zeile pruefen; Freigabe-Matrix-Spaltensuche unter beiden Namen probieren - nicht ausgefuehrt, kein Browser-Tool in dieser Session verfuegbar. | open | | 2026-08-06T14:39:03.905Z | |
|
| 6 | 16 | unrun-verify | .planning/phases/16-ad-gruppen-synchronisation/16-05-PLAN.md | | 16-05 <verification> Manuell nachzuholen (Browser): Sync ausloesen und pruefen, dass alle drei Zahlenzeilen erscheinen; Lauf mit verschobener Standardmarkierung provozieren und Amber-Zeile pruefen; Freigabe-Matrix-Spaltensuche unter beiden Namen probieren - nicht ausgefuehrt, kein Browser-Tool in dieser Session verfuegbar. | open | | 2026-08-06T14:39:03.905Z | |
|
||||||
| 7 | 17 | unrun-verify | .planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-01-PLAN.md | | 17-01 Task 2 human-check: Browser-Gegenprobe (normaler Nutzer oeffnet /modules/tender-radar/my-sources, speichert Postfach, zweites Konto desselben Mandanten sieht leeres Formular) nicht ausgefuehrt — kein Browser-Tool in dieser Session verfuegbar. Automatisierte Pruefungen (prisma validate/migrate status, Index-Liste, beide Typpruefungen, 335/335 src/tenders-Tests) sind gelaufen und gruen. | open | | 2026-08-12T09:24:35.289Z | |
|
| 7 | 17 | unrun-verify | .planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-01-PLAN.md | | 17-01 Task 2 human-check: Browser-Gegenprobe (normaler Nutzer oeffnet /modules/tender-radar/my-sources, speichert Postfach, zweites Konto desselben Mandanten sieht leeres Formular) nicht ausgefuehrt — kein Browser-Tool in dieser Session verfuegbar. Automatisierte Pruefungen (prisma validate/migrate status, Index-Liste, beide Typpruefungen, 335/335 src/tenders-Tests) sind gelaufen und gruen. | fixed | | 2026-08-12T09:24:35.289Z | 2026-09-07T07:50:56.468Z |
|
||||||
| 8 | 17 | unrun-verify | apps/web/src/app/(portal)/modules/tender-radar/my-sources/page.tsx | | Browser-Gegenprobe Plan 17-03 Task 1 (Tracer-Feedback-Gate): Meine Quellen mit drei Abschnitten, neu angelegter eigener Feed sofort sichtbar, plattformweiter Feed ohne Entfernen-Knopf, Digest-Intervall speichert nach Reload — kein Browser-Tool in dieser Sitzung verfuegbar | open | | 2026-08-12T10:02:49.122Z | |
|
| 8 | 17 | unrun-verify | apps/web/src/app/(portal)/modules/tender-radar/my-sources/page.tsx | | Browser-Gegenprobe Plan 17-03 Task 1 (Tracer-Feedback-Gate): Meine Quellen mit drei Abschnitten, neu angelegter eigener Feed sofort sichtbar, plattformweiter Feed ohne Entfernen-Knopf, Digest-Intervall speichert nach Reload — kein Browser-Tool in dieser Sitzung verfuegbar | fixed | | 2026-08-12T10:02:49.122Z | 2026-09-07T07:50:56.693Z |
|
||||||
| 9 | 17 | unrun-verify | apps/web/src/app/(portal)/modules/tender-radar/settings/page.tsx | | Browser-Gegenprobe Plan 17-03 Task 2: USER-Konto sieht keine Bedienelemente auf /settings (nur Hinweis+Verweis), ADMIN-Konto sieht Abrufintervall+plattformweite Feeds ohne Postfach/Benachrichtigung, Zahnrad fuehrt in beiden Faellen nach Meine Quellen — kein Browser-Tool in dieser Sitzung verfuegbar | open | | 2026-08-12T10:02:49.291Z | |
|
| 9 | 17 | unrun-verify | apps/web/src/app/(portal)/modules/tender-radar/settings/page.tsx | | Browser-Gegenprobe Plan 17-03 Task 2: USER-Konto sieht keine Bedienelemente auf /settings (nur Hinweis+Verweis), ADMIN-Konto sieht Abrufintervall+plattformweite Feeds ohne Postfach/Benachrichtigung, Zahnrad fuehrt in beiden Faellen nach Meine Quellen — kein Browser-Tool in dieser Sitzung verfuegbar | fixed | | 2026-08-12T10:02:49.291Z | 2026-09-07T07:50:56.910Z |
|
||||||
|
|
||||||
````json
|
````json
|
||||||
[
|
[
|
||||||
@@ -106,10 +106,10 @@ last_updated: 2026-08-12T10:02:49.291Z
|
|||||||
"file": ".planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-01-PLAN.md",
|
"file": ".planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-01-PLAN.md",
|
||||||
"line": null,
|
"line": null,
|
||||||
"description": "17-01 Task 2 human-check: Browser-Gegenprobe (normaler Nutzer oeffnet /modules/tender-radar/my-sources, speichert Postfach, zweites Konto desselben Mandanten sieht leeres Formular) nicht ausgefuehrt — kein Browser-Tool in dieser Session verfuegbar. Automatisierte Pruefungen (prisma validate/migrate status, Index-Liste, beide Typpruefungen, 335/335 src/tenders-Tests) sind gelaufen und gruen.",
|
"description": "17-01 Task 2 human-check: Browser-Gegenprobe (normaler Nutzer oeffnet /modules/tender-radar/my-sources, speichert Postfach, zweites Konto desselben Mandanten sieht leeres Formular) nicht ausgefuehrt — kein Browser-Tool in dieser Session verfuegbar. Automatisierte Pruefungen (prisma validate/migrate status, Index-Liste, beide Typpruefungen, 335/335 src/tenders-Tests) sind gelaufen und gruen.",
|
||||||
"status": "open",
|
"status": "fixed",
|
||||||
"reason": "",
|
"reason": "",
|
||||||
"recorded_at": "2026-08-12T09:24:35.289Z",
|
"recorded_at": "2026-08-12T09:24:35.289Z",
|
||||||
"resolved_at": null
|
"resolved_at": "2026-09-07T07:50:56.468Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 8,
|
"id": 8,
|
||||||
@@ -118,10 +118,10 @@ last_updated: 2026-08-12T10:02:49.291Z
|
|||||||
"file": "apps/web/src/app/(portal)/modules/tender-radar/my-sources/page.tsx",
|
"file": "apps/web/src/app/(portal)/modules/tender-radar/my-sources/page.tsx",
|
||||||
"line": null,
|
"line": null,
|
||||||
"description": "Browser-Gegenprobe Plan 17-03 Task 1 (Tracer-Feedback-Gate): Meine Quellen mit drei Abschnitten, neu angelegter eigener Feed sofort sichtbar, plattformweiter Feed ohne Entfernen-Knopf, Digest-Intervall speichert nach Reload — kein Browser-Tool in dieser Sitzung verfuegbar",
|
"description": "Browser-Gegenprobe Plan 17-03 Task 1 (Tracer-Feedback-Gate): Meine Quellen mit drei Abschnitten, neu angelegter eigener Feed sofort sichtbar, plattformweiter Feed ohne Entfernen-Knopf, Digest-Intervall speichert nach Reload — kein Browser-Tool in dieser Sitzung verfuegbar",
|
||||||
"status": "open",
|
"status": "fixed",
|
||||||
"reason": "",
|
"reason": "",
|
||||||
"recorded_at": "2026-08-12T10:02:49.122Z",
|
"recorded_at": "2026-08-12T10:02:49.122Z",
|
||||||
"resolved_at": null
|
"resolved_at": "2026-09-07T07:50:56.693Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 9,
|
"id": 9,
|
||||||
@@ -130,10 +130,10 @@ last_updated: 2026-08-12T10:02:49.291Z
|
|||||||
"file": "apps/web/src/app/(portal)/modules/tender-radar/settings/page.tsx",
|
"file": "apps/web/src/app/(portal)/modules/tender-radar/settings/page.tsx",
|
||||||
"line": null,
|
"line": null,
|
||||||
"description": "Browser-Gegenprobe Plan 17-03 Task 2: USER-Konto sieht keine Bedienelemente auf /settings (nur Hinweis+Verweis), ADMIN-Konto sieht Abrufintervall+plattformweite Feeds ohne Postfach/Benachrichtigung, Zahnrad fuehrt in beiden Faellen nach Meine Quellen — kein Browser-Tool in dieser Sitzung verfuegbar",
|
"description": "Browser-Gegenprobe Plan 17-03 Task 2: USER-Konto sieht keine Bedienelemente auf /settings (nur Hinweis+Verweis), ADMIN-Konto sieht Abrufintervall+plattformweite Feeds ohne Postfach/Benachrichtigung, Zahnrad fuehrt in beiden Faellen nach Meine Quellen — kein Browser-Tool in dieser Sitzung verfuegbar",
|
||||||
"status": "open",
|
"status": "fixed",
|
||||||
"reason": "",
|
"reason": "",
|
||||||
"recorded_at": "2026-08-12T10:02:49.291Z",
|
"recorded_at": "2026-08-12T10:02:49.291Z",
|
||||||
"resolved_at": null
|
"resolved_at": "2026-09-07T07:50:56.910Z"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
````
|
````
|
||||||
|
|||||||
@@ -1,35 +1,42 @@
|
|||||||
---
|
---
|
||||||
phase: 17-eigene-ausschreibungs-quellen-je-nutzer
|
phase: 17-eigene-ausschreibungs-quellen-je-nutzer
|
||||||
verified: 2026-08-12T15:10:00Z
|
verified: 2026-08-12T15:10:00Z
|
||||||
status: human_needed
|
reverified: 2026-09-07T07:55:00Z
|
||||||
|
status: passed
|
||||||
score: 7/7 must-haves verified
|
score: 7/7 must-haves verified
|
||||||
behavior_unverified: 0
|
behavior_unverified: 0
|
||||||
overrides_applied: 0
|
overrides_applied: 0
|
||||||
human_verification:
|
human_verification: []
|
||||||
- test: "17-01 Task 2 human-check: Als normaler Nutzer (Rolle USER, Modulzugang) /modules/tender-radar/my-sources oeffnen, Postfach speichern, neu laden — Werte stehen noch. Mit zweitem Konto desselben Mandanten anmelden — Formular ist leer, nicht die Werte des ersten Nutzers."
|
human_verification_completed:
|
||||||
expected: "Jeder Nutzer sieht und speichert ausschliesslich sein eigenes Postfach; kein Nutzer sieht das Formular des anderen vorausgefuellt."
|
- test: "17-01 Task 2 human-check — zwei Konten desselben Mandanten, je eigenes Postfach"
|
||||||
why_human: "Erfordert echte Browser-Session mit zwei unterschiedlichen angemeldeten Konten; aus dem Code/Tests allein nicht zu beobachten. Als WINDOWS.md #7 (unrun-verify, status open) erfasst."
|
result: passed
|
||||||
- test: "17-03 Task 1 human-check: Als normaler Nutzer /modules/tender-radar/my-sources oeffnen — drei Abschnitte sichtbar, eigenen RSS-Feed anlegen (erscheint sofort in eigener Liste), service.bund.de-Feed steht darunter ohne Entfernen-Knopf, Digest-Intervall auf 'Woechentlich' stellen, neu laden — Wert bleibt."
|
completed: 2026-09-07
|
||||||
expected: "Alle drei Abschnitte funktionieren durchgehend im echten Browser, kein Verweis auf die Administrationsseite fuer einen normalen Nutzer."
|
evidence: "WINDOWS.md #7 fixed; uat-2026-09-07/w7-nutzer2-leer.png; DB: zwei TenderEmailConfig-Zeilen mit je eigenem userId"
|
||||||
why_human: "Kein Browser-Tool in der Ausfuehrungssitzung verfuegbar. Als WINDOWS.md #8 (unrun-verify, status open) erfasst."
|
- test: "17-03 Task 1 human-check — Meine Quellen, drei Abschnitte, eigener Feed, Digest-Intervall"
|
||||||
- test: "17-03 Task 2 human-check: Als Konto mit Rolle USER /modules/tender-radar/settings direkt aufrufen — keine Bedienelemente, nur Hinweis + Verweis. Als Administrator dieselbe Adresse — Abrufintervall + plattformweite Feeds da, Postfach/Benachrichtigung nicht mehr. Zahnrad fuehrt in beiden Faellen nach 'Meine Quellen'."
|
result: passed
|
||||||
expected: "Rollentrennung greift im echten Browser identisch zu den Komponententests; Navigation ueber das Zahnrad funktioniert im echten Next.js-Router."
|
completed: 2026-09-07
|
||||||
why_human: "Kein Browser-Tool in der Ausfuehrungssitzung verfuegbar. Als WINDOWS.md #9 (unrun-verify, status open) erfasst."
|
evidence: "WINDOWS.md #8 fixed; uat-2026-09-07/w8-nutzer1-my-sources.png; DB: TenderNotificationPref digestInterval=weekly"
|
||||||
|
- test: "17-03 Task 2 human-check — Rollentrennung /settings, Zahnrad-Navigation"
|
||||||
|
result: passed
|
||||||
|
completed: 2026-09-07
|
||||||
|
evidence: "WINDOWS.md #9 fixed; uat-2026-09-07/w9-user-settings.png + w9-admin-settings.png"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Phase 17: Eigene Ausschreibungs-Quellen je Nutzer — Verification Report
|
# Phase 17: Eigene Ausschreibungs-Quellen je Nutzer — Verification Report
|
||||||
|
|
||||||
**Phase Goal:** Jeder Nutzer speist seine eigenen Ausschreibungs-Quellen ein — eigenes Alert-Postfach und eigene RSS-Feeds statt einer gemeinsamen Konfiguration. Die Einstellungsseite trennt danach sauber nach Zustaendigkeit: Plattform-Administration (Abrufintervall) bleibt Admin-Sache, Quellen und Digest-Intervall gehoeren dem Nutzer.
|
**Phase Goal:** Jeder Nutzer speist seine eigenen Ausschreibungs-Quellen ein — eigenes Alert-Postfach und eigene RSS-Feeds statt einer gemeinsamen Konfiguration. Die Einstellungsseite trennt danach sauber nach Zustaendigkeit: Plattform-Administration (Abrufintervall) bleibt Admin-Sache, Quellen und Digest-Intervall gehoeren dem Nutzer.
|
||||||
|
|
||||||
**Verified:** 2026-08-12
|
**Verified:** 2026-08-12 — **re-verifiziert im Browser:** 2026-09-07
|
||||||
**Status:** human_needed
|
**Status:** passed
|
||||||
**Re-verification:** No — initial verification
|
**Re-verification:** Yes — die drei offenen Browser-Gegenproben wurden am 2026-09-07 nachgeholt (siehe Nachtrag am Ende)
|
||||||
|
|
||||||
## Summary Verdict
|
## Summary Verdict
|
||||||
|
|
||||||
**The phase goal is achieved in the codebase.** All backend and frontend mechanisms described in 17-CONTEXT.md (D-01..D-05), all five ROADMAP requirements (SRC-01..SRC-05), and all seven ROADMAP Success Criteria are implemented, migrated locally, and covered by 362/362 API `src/tenders` tests + 58/58 web tender-radar tests, both re-run fresh in this verification (not taken from SUMMARY claims). The one hard scope fence (D-05: `Tender` stays platform-global) holds — verified directly against the live database schema, not just against source comments. Test quality on inspection is genuinely good: hand-written expectations, evaluating Prisma fakes for ownership/delete-protection, no tautological "expectation built from the same helper as the code under test" pattern found.
|
**The phase goal is achieved in the codebase.** All backend and frontend mechanisms described in 17-CONTEXT.md (D-01..D-05), all five ROADMAP requirements (SRC-01..SRC-05), and all seven ROADMAP Success Criteria are implemented, migrated locally, and covered by 362/362 API `src/tenders` tests + 58/58 web tender-radar tests, both re-run fresh in this verification (not taken from SUMMARY claims). The one hard scope fence (D-05: `Tender` stays platform-global) holds — verified directly against the live database schema, not just against source comments. Test quality on inspection is genuinely good: hand-written expectations, evaluating Prisma fakes for ownership/delete-protection, no tautological "expectation built from the same helper as the code under test" pattern found.
|
||||||
|
|
||||||
**However, the phase cannot be marked `passed`.** Three `human-check` items from the plans (17-01 Task 2, 17-03 Task 1, 17-03 Task 2) were never executed in a real browser — this is honestly disclosed in the SUMMARYs and in WINDOWS.md (#7/#8/#9, all `status: open`), not glossed over. This verifier ran the same programmatic checks the SUMMARYs claim (test suites, type-checks, migration status, DB index/content inspection) and confirms all of them pass, but the actual click-through UX (form pre-fill, save-then-reload persistence, role-based visibility in a live Next.js router, navigation via the gear icon) remains genuinely unproven. Per the routing rules, this makes the phase `human_needed`, not `passed`.
|
**Stand 2026-08-12 konnte die Phase nicht auf `passed` gesetzt werden**, weil drei `human-check`-Punkte aus den Plaenen (17-01 Task 2, 17-03 Task 1, 17-03 Task 2) nie in einem echten Browser ausgefuehrt worden waren — offen ausgewiesen in den SUMMARYs und in WINDOWS.md (#7/#8/#9). Die programmatischen Pruefungen liefen damals schon alle gruen; unbewiesen blieb allein der tatsaechliche Durchklick (Formular-Vorbefuellung, Speichern-und-Neuladen, Rollensichtbarkeit im echten Next.js-Router, Navigation ueber das Zahnrad).
|
||||||
|
|
||||||
|
**Am 2026-09-07 wurden genau diese drei Punkte im echten Browser nachgeholt und alle drei bestanden** — Aufbau, Beobachtungen und Belege stehen im Nachtrag am Ende dieses Berichts. WINDOWS.md #7/#8/#9 stehen auf `fixed`. Damit wechselt die Phase auf `passed`.
|
||||||
|
|
||||||
## Goal Achievement
|
## Goal Achievement
|
||||||
|
|
||||||
@@ -127,7 +134,8 @@ Inspected `tender-rss-feed.service.spec.ts`, `email-alert.adapter.spec.ts`, `Rss
|
|||||||
|
|
||||||
None. Grep for `TBD|FIXME|XXX|TODO|HACK|PLACEHOLDER` (and case-insensitive `placeholder`/`not yet implemented`) across all 15 phase-modified backend/frontend files returned only pre-existing, benign uses of the word "placeholder" (documenting the `portals: ['rss']` symbolic constant, and the loading-skeleton UI state) — none indicate unfinished work.
|
None. Grep for `TBD|FIXME|XXX|TODO|HACK|PLACEHOLDER` (and case-insensitive `placeholder`/`not yet implemented`) across all 15 phase-modified backend/frontend files returned only pre-existing, benign uses of the word "placeholder" (documenting the `portals: ['rss']` symbolic constant, and the loading-skeleton UI state) — none indicate unfinished work.
|
||||||
|
|
||||||
### Human Verification Required
|
### Human Verification Required — am 2026-09-07 vollstaendig nachgeholt (alle drei bestanden)
|
||||||
|
|
||||||
|
|
||||||
1. **17-01 Task 2 human-check (WINDOWS.md #7, open)**
|
1. **17-01 Task 2 human-check (WINDOWS.md #7, open)**
|
||||||
**Test:** As a normal USER-role account with module access, open `/modules/tender-radar/my-sources`, fill and save the mailbox form, reload — values persist. Then log in as a second account of the same tenant — the form is empty, not pre-filled with the first user's values.
|
**Test:** As a normal USER-role account with module access, open `/modules/tender-radar/my-sources`, fill and save the mailbox form, reload — values persist. Then log in as a second account of the same tenant — the form is empty, not pre-filled with the first user's values.
|
||||||
@@ -150,9 +158,80 @@ All three items are honestly recorded as `open`/`unrun-verify` in `.planning/WIN
|
|||||||
|
|
||||||
No implementation gaps found. All must-haves at the mechanism level (schema, migration, service, controller, adapter, frontend wiring, tests, i18n, requirements traceability, backlog closure) are verified directly against the live codebase and a live local database — not inferred from SUMMARY claims. The phase's own scope fence (D-05, `Tender` stays platform-global) is independently confirmed intact.
|
No implementation gaps found. All must-haves at the mechanism level (schema, migration, service, controller, adapter, frontend wiring, tests, i18n, requirements traceability, backlog closure) are verified directly against the live codebase and a live local database — not inferred from SUMMARY claims. The phase's own scope fence (D-05, `Tender` stays platform-global) is independently confirmed intact.
|
||||||
|
|
||||||
The only open item is the disclosed set of three real-browser click-throughs, which the phase's own artifacts already flag as unrun rather than passed. This is a verification-completeness gap, not an implementation gap — routed here as `human_needed` per the standard decision tree (a non-empty human-verification section always overrides `passed`, even when every other truth is independently verified).
|
Der einzige offene Punkt war die Gruppe der drei echten Browser-Durchlaeufe — eine Luecke in der Vollstaendigkeit der Pruefung, keine Luecke in der Umsetzung. Sie wurde am 2026-09-07 geschlossen (siehe Nachtrag); es sind keine offenen Punkte mehr verzeichnet.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Verified: 2026-08-12*
|
*Verified: 2026-08-12*
|
||||||
*Verifier: Claude (gsd-verifier)*
|
*Verifier: Claude (gsd-verifier)*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Nachtrag: Browser-Gegenprobe vom 2026-09-07
|
||||||
|
|
||||||
|
Die drei am 2026-08-12 offen gebliebenen `human-check`-Punkte wurden nachgeholt. Aufbau: frisch
|
||||||
|
gebaute Images aus `main` (`79015dd`), lokaler Docker-Stack, leere Datenbank, echter Chrome
|
||||||
|
ueber Playwright. Testdaten ueber die Oberflaeche angelegt — Modul im Marktplatz aktiviert,
|
||||||
|
Freigabe in der Matrix an die Standardgruppe erteilt, zwei USER-Konten (`nutzer1`, `nutzer2`)
|
||||||
|
im selben Mandanten.
|
||||||
|
|
||||||
|
### WINDOWS #7 — eigenes Postfach je Nutzer (17-01 Task 2) — BESTANDEN
|
||||||
|
|
||||||
|
| Schritt | Beobachtung |
|
||||||
|
|---|---|
|
||||||
|
| `nutzer1` oeffnet `/modules/tender-radar/my-sources` | Postfach-Formular leer, Hinweis „Noch nicht gespeichert" |
|
||||||
|
| Postfach ausfuellen und speichern | „Einstellungen gespeichert.", Hinweis verschwindet |
|
||||||
|
| Seite neu laden | `imap.nutzer1.test`, `alerts@nutzer1.test`, Benutzername `nutzer1-postfach` stehen wieder da |
|
||||||
|
| `nutzer2` oeffnet dieselbe Seite | Formular **leer**, Hinweis „Noch nicht gespeichert" — nicht die Werte von `nutzer1` |
|
||||||
|
| `nutzer2` speichert sein eigenes Postfach | Zweite Zeile entsteht, erste bleibt unveraendert |
|
||||||
|
|
||||||
|
Datenbank danach: zwei `TenderEmailConfig`-Zeilen, je ein eigener `userId`, beide mit gefuelltem
|
||||||
|
`encryptedInboxCreds`. Beleg: `uat-2026-09-07/w7-nutzer2-leer.png`.
|
||||||
|
|
||||||
|
### WINDOWS #8 — Meine Quellen, alle drei Abschnitte (17-03 Task 1) — BESTANDEN
|
||||||
|
|
||||||
|
| Schritt | Beobachtung |
|
||||||
|
|---|---|
|
||||||
|
| Seitenaufbau | Drei Abschnitte: „Mein Postfach", „Meine Feeds", „Benachrichtigung" |
|
||||||
|
| Eigenen RSS-Feed anlegen | „Mein Testfeed" erscheint **sofort** in der eigenen Liste, mit Entfernen-Knopf |
|
||||||
|
| Plattformweiter Feed | `service-bund` steht darunter unter „Diese Feeds werden von der Administration gepflegt und gelten fuer alle." — **ohne** Entfernen-Knopf |
|
||||||
|
| Digest-Intervall auf „Woechentlich", dann neu laden | Wert steht noch (`TenderNotificationPref.digestInterval = weekly`, nur fuer `nutzer1`) |
|
||||||
|
| Verweis auf die Administrationsseite | Fuer das USER-Konto **nicht** vorhanden |
|
||||||
|
|
||||||
|
`nutzer2` sieht in „Meine Feeds" nur „Noch keine RSS-Feeds hinterlegt" plus den plattformweiten
|
||||||
|
Feed — der Feed von `nutzer1` taucht bei ihm nicht auf. Beleg:
|
||||||
|
`uat-2026-09-07/w8-nutzer1-my-sources.png`.
|
||||||
|
|
||||||
|
### WINDOWS #9 — Rollentrennung der Einstellungsseite (17-03 Task 2) — BESTANDEN
|
||||||
|
|
||||||
|
| Rolle | `/modules/tender-radar/settings` direkt aufgerufen |
|
||||||
|
|---|---|
|
||||||
|
| USER (`nutzer1`) | Keine Bedienelemente. Nur „Diese Seite verwaltet plattformweite Einstellungen und ist Administratoren vorbehalten." plus Verweis „Meine Quellen →" |
|
||||||
|
| SUPER_ADMIN (`admin`) | Abrufintervall (60 Min.), Aktiv-Schalter, Speichern, plus plattformweite RSS-Feeds **mit** Entfernen-Knopf. Postfach und Benachrichtigung sind auf dieser Seite **nicht** mehr vorhanden |
|
||||||
|
|
||||||
|
Das Zahnrad auf der Modulseite fuehrt in **beiden** Faellen nach `/modules/tender-radar/my-sources`
|
||||||
|
— als Link angeklickt, nicht nur im Markup gelesen. Belege:
|
||||||
|
`uat-2026-09-07/w9-user-settings.png`, `uat-2026-09-07/w9-admin-settings.png`.
|
||||||
|
|
||||||
|
### Zusatzbeleg: Schutz gegen fremde und plattformweite Feeds am laufenden Server
|
||||||
|
|
||||||
|
Der Verifikationsbericht hatte SC 3 aus dem Quelltext belegt. Die Oberflaeche blendet den
|
||||||
|
Entfernen-Knopf nur aus — das ist kein Beweis, dass der Server ihn auch verweigert. Deshalb
|
||||||
|
zusaetzlich gegen die laufende API gemessen, angemeldet als `nutzer2`:
|
||||||
|
|
||||||
|
| Aufruf | Antwort | Wirkung |
|
||||||
|
|---|---|---|
|
||||||
|
| `GET /modules/tender-radar/rss-feeds` | 200, genau ein Eintrag: `service-bund`, `isPlatformWide: true` | Der Feed von `nutzer1` ist fuer `nutzer2` unsichtbar |
|
||||||
|
| `DELETE .../rss-feeds/<plattformweiter Feed>` | 404 | Zeile bleibt bestehen |
|
||||||
|
| `DELETE .../rss-feeds/<Feed von nutzer1>` | 404 | Zeile bleibt bestehen |
|
||||||
|
| `POST .../rss-feeds` mit `scope: "platform"` | 403 „Nur Administratoren duerfen plattformweite RSS-Feeds anlegen." | Kein Eintrag entsteht |
|
||||||
|
|
||||||
|
Der Bestand war danach unveraendert: eine plattformweite Zeile, eine Zeile von `nutzer1`.
|
||||||
|
|
||||||
|
### Ergebnis
|
||||||
|
|
||||||
|
Alle sieben Erfolgskriterien sind jetzt nicht nur als Mechanismus, sondern auch im laufenden
|
||||||
|
System belegt. `WINDOWS.md` #7, #8 und #9 stehen auf `fixed`. Der Phasenstatus wechselt von
|
||||||
|
`human_needed` auf `passed`.
|
||||||
|
|
||||||
|
*Nachtrag verfasst: 2026-09-07*
|
||||||
|
|||||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 76 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Reference in New Issue
Block a user