Eine Kampagne gehoert zur Agentur -- auch wenn DogFather ueberall admin ist

Aufgefallen beim Nachweis auf der echten Adresse, nicht beim Bauen:
Der Kasten haengt an `bereich === "agentur"` und an der Rolle. DogFather
ist aber in BEIDEN Haeusern `admin`. Oeffnet er auf
crew.dogfather-universe.com von Hand `bereich.html?b=agentur`, dann
stimmt der Bereich, die Rolle stimmt -- und `hausFuerNeuenEintrag` gaebe
der Kampagne das Haus "crew". Eine Agentur-Kampagne staende im Rudel,
und die Trennung waere an genau der Stelle unterlaufen, an der niemand
nachsieht. Bauplan, Teil 11: "Nichts im Haus Team Dogi."

ZWEI FRAGEN, ZWEI SCHWELLEN -- und das ist Absicht:

  /api/ich (ZEIGEN)     haus !== "crew"
  Route    (SCHREIBEN)  haus === "agentur"

Der Unterschied betrifft genau einen Fall: `null`. Den gibt es nur auf
einer PRUEFADRESSE -- `sitzungLesen` vergibt dort seit dem 24.09.2026
bewusst kein Haus, und die Begruendung dort nennt den Schaden:
Als 127.0.0.1 einmal ein Haus bekam, fiel pruef-chat-kanaele mit 13
Fehlschlaegen um, und die naechsten Pruefungen waeren still gruen
geblieben, ohne noch etwas zu messen. Eine echte Anfrage hat immer eine
der beiden Waende; eine Sitzung zu einer dritten lehnt
`sitzungPasstZurAdresse` ohnehin ab.

Beim SCHREIBEN wird trotzdem streng gefragt: Ein Eintrag mit
`haus = null` waere in BEIDEN Haeusern sichtbar -- genau das, was Teil
11 ausschliesst.

WAS ICH DABEI ZWEIMAL FALSCH VERSUCHT HABE
  Zuerst sollte das Bildwerkzeug ueber die Agenturwand kommen, damit
  es den Kasten weiter messen kann. Den Host-Kopf beim Durchreichen zu
  ueberschreiben wirkt nicht -- gemessen: /api/ich meldete weiter
  `darf: false`, der Wirt blieb "127.0.0.1:4338". Chromium laesst
  `Host` nicht ueberschreiben.

  Dann den Namen wirklich aufloesen (--host-resolver-rules). Das
  funktioniert, bringt aber die Anmeldemaske der echten Wand mit einer
  Tuer davor, die ein Bildwerkzeug nicht aufmachen soll. Gemessen
  werden soll die KACHEL, nicht der Zugang.

  Deshalb bleibt bild-kampagne auf der Pruefadresse -- und genau
  deshalb fragt /api/ich `!== "crew"` statt `=== "agentur"`. Beide
  Zeilen tragen jetzt die Begruendung bei sich, damit sie niemand
  "vereinheitlicht": Das macht entweder die Pruefungen blind oder
  laesst eine Kampagne ins Rudel.

Zwei Gegenproben gefahren, beide schlagen an: Route nimmt jede Wand an
-> 2 rot. /api/ich fragt nicht nach dem Haus -> 1 rot.

GEPRUEFT: pruef-kampagne 98 -> 99 gruen · bild-kampagne 20 Messungen
gruen · pruef-struktur, pruef-haus-trennung 107, pruef-agentur 62,
pruef-eventkarte 94, pruef-alle-wege, pruef-schranke, pruef-zeichen 8

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-07 17:31:11 +02:00
co-authored by Claude Opus 5
parent 10e24b0c93
commit 8cde56bd96
4 changed files with 122 additions and 8 deletions
+35 -5
View File
@@ -264,6 +264,36 @@ kampagneRouter.post("/workspace/api/kampagne/einlesen", async (req, res) => {
`keine Leitung (${person.rolle})`);
}
/* ---- Und nur auf der AGENTURADRESSE ---------------------
Bauplan, Teil 11: "Nichts im Haus Team Dogi."
WARUM DAS EINE EIGENE ZEILE BRAUCHT: DogFather ist in BEIDEN
Haeusern `admin`, und `istLeitung` fragt nur nach der Rolle.
Meldet er sich auf crew.dogfather-universe.com an und oeffnet
dort `bereich.html?b=agentur`, dann ist er Leitung, der
Bereich stimmt -- und `hausFuerNeuenEintrag` gaebe der
Kampagne das Haus "crew". Eine Agentur-Kampagne staende
damit im Rudel, und die Trennung waere genau an der Stelle
unterlaufen, an der sie niemand nachsieht.
Gefragt wird POSITIV ("ist es die Agentur?") und nicht
negativ ("ist es nicht die Crew?"): Ohne Adresse gibt
`hausFuerNeuenEintrag` `null` zurueck, und ein Eintrag ohne
Haus ist in BEIDEN sichtbar. Fuer die meisten Eintraege ist
das die bewusst sichere Richtung -- fuer eine Kampagne waere
es das Gegenteil.
Dasselbe Haus wird unten beim Schreiben benutzt, nicht ein
zweites Mal berechnet. */
const haus = hausFuerNeuenEintrag(person, "agentur");
if (haus !== "agentur") {
return schiefgegangen(403,
"Kampagnen gehören zur Agentur. Bitte auf "
+ "workspace.dogfather-universe.com anmelden.",
`falsches Haus: ${haus ?? "ohne Adresse"}`);
}
const text = String(req.body?.text ?? "");
if (!text.trim()) {
return schiefgegangen(400,
@@ -440,11 +470,11 @@ kampagneRouter.post("/workspace/api/kampagne/einlesen", async (req, res) => {
kuerzen(regelnText(gelesen.kuer, hinweise)),
dringlichkeit,
jetzt, person.id,
/* NICHT von Hand auf "agentur" gesetzt: Das Haus entscheidet
die Adresse, über die jemand hereinkommt. Wer es hier
festschreibt, baut die Trennung ein zweites Mal -- und
zwei Fassungen derselben Regel laufen auseinander. */
hausFuerNeuenEintrag(person, "agentur"),
/* NICHT von Hand auf "agentur" gesetzt, sondern dieselbe
Angabe, die oben schon ueber die Annahme entschieden
hat. Zweimal zu rechnen waeren zwei Fassungen derselben
Regel -- und die laufen auseinander. */
haus,
nummer, link, jetzt, gelesen.pflicht.zone,
JSON.stringify(gelesen.auszug));
eintragId = Number(lastInsertRowid);