diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 1c0e953..fe197c5 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -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| | | 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 | -| 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 diff --git a/.planning/STATE.md b/.planning/STATE.md index 4208563..6065e6b 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -4,16 +4,16 @@ milestone: v1.1 milestone_name: Ausschreibungs-Radar current_phase: 17 current_phase_name: eigene-ausschreibungs-quellen-je-nutzer -status: verifying -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)." -last_updated: "2026-08-12T10:06:09.773Z" -last_activity: 2026-08-12 -last_activity_desc: Phase 17 execution started +status: verified +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-09-07T07:56:00.000Z" +last_activity: 2026-09-07 +last_activity_desc: Phase 17 Browser-Gegenproben nachgeholt, Phase auf passed progress: total_phases: 17 - completed_phases: 16 + completed_phases: 17 total_plans: 83 - completed_plans: 82 + completed_plans: 83 --- # Project State @@ -27,17 +27,12 @@ See: .planning/PROJECT.md (updated 2026-07-17) ## Current Position -Phase: 17 (eigene-ausschreibungs-quellen-je-nutzer) — EXECUTING +Phase: 17 (eigene-ausschreibungs-quellen-je-nutzer) — VERIFIED / passed Plan: 3 of 3 -Status: Phase complete — ready for verification -uebersprungen (kein AD-Schreibzugriff, Entscheidung des Users 2026-08-11). -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 +Status: Phase abgeschlossen und im Browser gegengeprueft — bereit fuer /gsd-ship +Last activity: 2026-09-07 — Browser-Gegenproben #7/#8/#9 nachgeholt, alle bestanden -Progress: [██████████] 99% +Progress: [██████████] 100% ## Performance Metrics @@ -341,7 +336,7 @@ Items acknowledged and carried forward from previous milestone close: ## Session Continuity -Last session: 2026-08-12T10:06:09.739Z -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). +Last session: 2026-09-07T07:56:00.000Z +Stopped at: Phase 17 auf passed gesetzt; 6 aeltere Browser-Gegenproben aus Phase 15/16 (WINDOWS.md #1-#6) bleiben offen. 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 diff --git a/.planning/WINDOWS.md b/.planning/WINDOWS.md index bdef505..48c84eb 100644 --- a/.planning/WINDOWS.md +++ b/.planning/WINDOWS.md @@ -1,10 +1,10 @@ --- schema_version: 1 -open_count: 9 +open_count: 6 waived_count: 0 -fixed_count: 0 +fixed_count: 3 total_count: 9 -last_updated: 2026-08-12T10:02:49.291Z +last_updated: 2026-09-07T07:50:56.910Z --- # 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 | | | 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 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 | | -| 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 | | -| 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 | | +| 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 | 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 | fixed | | 2026-08-12T10:02:49.291Z | 2026-09-07T07:50:56.910Z | ````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", "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.", - "status": "open", + "status": "fixed", "reason": "", "recorded_at": "2026-08-12T09:24:35.289Z", - "resolved_at": null + "resolved_at": "2026-09-07T07:50:56.468Z" }, { "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", "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", - "status": "open", + "status": "fixed", "reason": "", "recorded_at": "2026-08-12T10:02:49.122Z", - "resolved_at": null + "resolved_at": "2026-09-07T07:50:56.693Z" }, { "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", "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", - "status": "open", + "status": "fixed", "reason": "", "recorded_at": "2026-08-12T10:02:49.291Z", - "resolved_at": null + "resolved_at": "2026-09-07T07:50:56.910Z" } ] ```` diff --git a/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-VERIFICATION.md b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-VERIFICATION.md index e7e5bab..6f22b00 100644 --- a/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-VERIFICATION.md +++ b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/17-VERIFICATION.md @@ -1,35 +1,42 @@ --- phase: 17-eigene-ausschreibungs-quellen-je-nutzer verified: 2026-08-12T15:10:00Z -status: human_needed +reverified: 2026-09-07T07:55:00Z +status: passed score: 7/7 must-haves verified behavior_unverified: 0 overrides_applied: 0 -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." - expected: "Jeder Nutzer sieht und speichert ausschliesslich sein eigenes Postfach; kein Nutzer sieht das Formular des anderen vorausgefuellt." - 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." - - 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." - expected: "Alle drei Abschnitte funktionieren durchgehend im echten Browser, kein Verweis auf die Administrationsseite fuer einen normalen Nutzer." - why_human: "Kein Browser-Tool in der Ausfuehrungssitzung verfuegbar. Als WINDOWS.md #8 (unrun-verify, status open) erfasst." - - 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'." - expected: "Rollentrennung greift im echten Browser identisch zu den Komponententests; Navigation ueber das Zahnrad funktioniert im echten Next.js-Router." - why_human: "Kein Browser-Tool in der Ausfuehrungssitzung verfuegbar. Als WINDOWS.md #9 (unrun-verify, status open) erfasst." +human_verification: [] +human_verification_completed: + - test: "17-01 Task 2 human-check — zwei Konten desselben Mandanten, je eigenes Postfach" + result: passed + completed: 2026-09-07 + evidence: "WINDOWS.md #7 fixed; uat-2026-09-07/w7-nutzer2-leer.png; DB: zwei TenderEmailConfig-Zeilen mit je eigenem userId" + - test: "17-03 Task 1 human-check — Meine Quellen, drei Abschnitte, eigener Feed, Digest-Intervall" + result: passed + completed: 2026-09-07 + 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 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 -**Status:** human_needed -**Re-verification:** No — initial verification +**Verified:** 2026-08-12 — **re-verifiziert im Browser:** 2026-09-07 +**Status:** passed +**Re-verification:** Yes — die drei offenen Browser-Gegenproben wurden am 2026-09-07 nachgeholt (siehe Nachtrag am Ende) ## 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. -**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 @@ -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. -### 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)** **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. -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* *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/` | 404 | Zeile bleibt bestehen | +| `DELETE .../rss-feeds/` | 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* diff --git a/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w7-nutzer2-leer.png b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w7-nutzer2-leer.png new file mode 100644 index 0000000..0b3354b Binary files /dev/null and b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w7-nutzer2-leer.png differ diff --git a/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w8-nutzer1-my-sources.png b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w8-nutzer1-my-sources.png new file mode 100644 index 0000000..4b21242 Binary files /dev/null and b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w8-nutzer1-my-sources.png differ diff --git a/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w9-admin-settings.png b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w9-admin-settings.png new file mode 100644 index 0000000..ee87da2 Binary files /dev/null and b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w9-admin-settings.png differ diff --git a/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w9-user-settings.png b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w9-user-settings.png new file mode 100644 index 0000000..adf024a Binary files /dev/null and b/.planning/phases/17-eigene-ausschreibungs-quellen-je-nutzer/uat-2026-09-07/w9-user-settings.png differ