diff --git a/server/pruef-zuteilung.mjs b/server/pruef-zuteilung.mjs
index 9bc1baa5..4adcee8b 100644
--- a/server/pruef-zuteilung.mjs
+++ b/server/pruef-zuteilung.mjs
@@ -436,6 +436,60 @@ melde("\n=== Fertig machen und bewerten ===");
ok(fremderStatus.code === 403 || fremderStatus.code === 404,
` und wer sie nicht hat, setzt auch keinen Status (${fremderStatus.code})`);
+ /* ===================================================================
+ EINE DAUERHAFTE AUFGABE WIRD NICHT ABGEHAKT -- AUCH NICHT UEBER
+ DEN STATUS (02.10.2026)
+
+ VanVan im Support, Meldung #6: „Der Modi kann die dauerhafte
+ Aufgabe immer noch auf erledigt setzen."
+
+ Die Sperre gab es seit dem 30.09., aber nur in `/mein-stand`. Der
+ Statusweg kannte `dauerhaft` nicht -- und seit die Modi den Status
+ setzen darf (zwanzig Zeilen weiter oben), stand ihr genau der Weg
+ offen, der ihr an der anderen Tuer verwehrt ist. Zwei Tueren, eine
+ Regel, und die Regel hing nur an einer.
+
+ GEPRUEFT WERDEN BEIDE TUEREN, sonst wandert der Fehler nur. */
+ {
+ const d = await rufe("/workspace/api/aufgaben", { method: "POST", keks: chef,
+ body: { titel: "Neue begruessen", dauerhaft: true, zuteilung: [idAnna] } });
+ const idDauer = d.json?.id;
+ ok(d.code === 201 && Number.isInteger(idDauer),
+ `eine dauerhafte Aufgabe (#${idDauer})`);
+ await rufe(`/workspace/api/aufgaben/${idDauer}/annehmen`, { method: "POST", keks: anna });
+
+ const ueberStand = await rufe(`/workspace/api/aufgaben/${idDauer}/mein-stand`,
+ { method: "POST", keks: anna, body: { zustand: "erledigt" } });
+ ok(ueberStand.code === 409 && ueberStand.json?.fehler === "dauerhafte_aufgabe",
+ `Tuer 1 (mein-stand) ist zu (${ueberStand.code} ${ueberStand.json?.fehler})`);
+
+ const ueberStatus = await rufe(`/workspace/api/aufgaben/${idDauer}`,
+ { method: "PATCH", keks: anna, body: { status: "erledigt" } });
+ ok(ueberStatus.code === 409 && ueberStatus.json?.fehler === "dauerhafte_aufgabe",
+ `Tuer 2 (Status) jetzt auch (${ueberStatus.code} ${ueberStatus.json?.fehler})`
+ + " — das war VanVans Befund");
+
+ /* ANFANGEN DARF SIE SEHR WOHL. Auch eine stehende Aufgabe hat
+ einen Anfang; gesperrt ist nur das Abhaken. Ohne diese Zeile
+ waere „gesperrt" eine Regel, die zu viel sperrt. */
+ const anfangen = await rufe(`/workspace/api/aufgaben/${idDauer}`,
+ { method: "PATCH", keks: anna, body: { status: "arbeit" } });
+ ok(anfangen.code === 200, ` anfangen darf sie trotzdem (${anfangen.code})`);
+
+ /* UND DIE LEITUNG BEENDET SIE. Eine Pflicht, die niemand mehr
+ beenden kann, waere eine Falle statt einer Regel. */
+ const chefBeendet = await rufe(`/workspace/api/aufgaben/${idDauer}`,
+ { method: "PATCH", keks: chef, body: { status: "erledigt" } });
+ ok(chefBeendet.code === 200, ` und die Leitung beendet sie (${chefBeendet.code})`);
+
+ /* DER KNOPF FEHLT AUCH AUF DEM BILDSCHIRM -- einer, der eine
+ Absage holt, ist schlimmer als keiner. */
+ const liste = await rufe("/workspace/api/aufgaben", { keks: anna });
+ const dAnna = (liste.json?.aufgaben || []).find((x) => x.id === idDauer);
+ ok(dAnna?.darf_beenden === false,
+ `und die Oberflaeche erfaehrt es (darf_beenden ${dAnna?.darf_beenden})`);
+ }
+
/* ZURUECKRAEUMEN -- und die Rueckfahrt ist selbst eine Messung.
Dieser Abschnitt hat Annas Aufgabe auf „arbeit" gestellt. Ein
diff --git a/server/workspace-aufgaben.js b/server/workspace-aufgaben.js
index 47926626..bcc0c38e 100644
--- a/server/workspace-aufgaben.js
+++ b/server/workspace-aufgaben.js
@@ -544,6 +544,12 @@ aufgabenRouter.get("/workspace/api/aufgaben", (req, res) => {
Recht -- vorher hing sie am falschen, und eine Modi sah
gar keinen. */
r.darf_status = darfStatusSetzen(req.person, r);
+ /* UND DARF ER SIE BEENDEN? Bei einer dauerhaften Aufgabe nur
+ die Leitung. Ohne diese Zeile stuende dort ein Knopf
+ „erledigt", der eine Absage holt -- und ein Knopf, der
+ eine Absage holt, ist schlimmer als keiner (so steht es
+ seit dem 30.09. in /mein-stand). */
+ r.darf_beenden = !r.dauerhaft || darfAufgabenVerteilen(req.person);
/* DIE OBERFLAECHE SOLL DEN KNOPF NUR ZEIGEN, WENN ER GEHT.
Bisher entschied sie es an `darf_verteilen` -- einer Auskunft
ueber die PERSON. Loeschen haengt aber an der AUFGABE: Die
@@ -1121,6 +1127,40 @@ aufgabenRouter.patch("/workspace/api/aufgaben/:id", gleicheHerkunft, (req, res)
const { aus, fehler } = pruefeFelder(req.body || {}, { neu: false, person: req.person });
if (fehler.length) return res.status(400).json({ fehler: fehler.join(" ") });
+ /* ==== EINE DAUERHAFTE AUFGABE WIRD NICHT ABGEHAKT ==============
+ (02.10.2026 — und der Anlass ist zur Haelfte meiner)
+
+ VanVan im Support, Meldung #6: „Der Modi kann die dauerhafte
+ Aufgabe immer noch auf erledigt setzen."
+
+ Die Sperre gab es seit dem 30.09. — aber nur in `/mein-stand`.
+ Der Statusweg kannte `dauerhaft` ueberhaupt nicht. Wer die
+ Aufgabe ohnehin aendern durfte (etwa weil das Uebernehmen aus
+ dem Pool ihn verantwortlich macht), hakte sie damit einfach ab.
+
+ UND ICH HABE DAS LOCH HEUTE VERBREITERT: Seit die Modi den
+ Status setzen darf, stand ihr dieser Weg offen, der ihr in
+ `/mein-stand` ausdruecklich verwehrt ist. Zwei Tueren, eine
+ Regel — und die Regel hing nur an einer.
+
+ „Neue begruessen" ist nicht fertig, wenn man es einmal gemacht
+ hat. Sie ist keine Aufgabe, die man abarbeitet, sondern eine,
+ die man TUT.
+
+ BEENDET WIRD SIE VON DER LEITUNG. Das stand schon im Kommentar
+ in `/mein-stand` — jetzt stimmt es auch hier. Wer verteilen
+ darf, darf auch beenden; eine Pflicht, die niemand mehr beenden
+ kann, waere eine Falle statt einer Regel.
+
+ DERSELBE FEHLERCODE wie in `/mein-stand` (`dauerhafte_aufgabe`):
+ Die Oberflaeche uebersetzt ihn schon. Ein zweiter Code fuer
+ dieselbe Sache waere der, den beim naechsten Mal jemand
+ uebersetzt und der andere nicht. */
+ if (aus.status === "erledigt" && aufgabe.dauerhaft
+ && !darfAufgabenVerteilen(req.person)) {
+ return res.status(409).json({ fehler: "dauerhafte_aufgabe" });
+ }
+
/* Zuordnungen darf nur das Management verschieben. */
if (!istLeitung(req.person)) { delete aus.creator_id; delete aus.verantwortlich_id; }
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 11069850..b6c99030 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,8 +16,8 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+