Highlights: auf der Agenturadresse gibt es die Rudel-Bretter nicht mehr

Filipe, dringend: "ich kann gerade bei highlights keine videos
hochladen."

DAS HOCHLADEN WAR NICHT KAPUTT. Gemessen an der laufenden Datenbank:
49 Highlights, ALLE mit haus = crew -- so legt hausFuerNeuenEintrag
sie an, ausdruecklich "egal, von welcher Adresse aus jemand
hineinschreibt". Der Adressriegel vom 03.10. zeigt auf der
Agenturadresse aber nur haus = agentur:

    crew.     -> 49 Highlights
    workspace -> 0

Das Brett stand dort leer, und ein eingefuegtes Video verschwand in
derselben Sekunde: angelegt und sofort ausgeblendet. Von aussen sieht
das aus wie "geht nicht hoch". Beleg: Eintrag #77 wurde heute um
08:41 erfolgreich angelegt, #76 gestern von Filipe selbst.

Im Serverlog stand seit Stunden keine Fehlerzeile, und TikTok
antwortet dem Server normal (HTTP 200 in 0,2 s) -- beides geprueft,
bevor im Code gesucht wurde.

ZWEI REGELN WIDERSPRACHEN SICH, und jede fuer sich war richtig:
"diese Bretter sind immer crew" gegen "diese Adresse zeigt nur
agentur". Keine Pruefung konnte das merken, weil keine den
Zwischenraum ansah.

Aufgeloest in Filipes Richtung (Rueckfrage 05.10.): Auf der
Agenturadresse gibt es diese Bretter gar nicht -- 404 statt leerem
Brett. Das ist die Regel vom 24.09. beim Wort genommen: "auf jeder
Adresse nur deren Bestand."

EINE Regel (brettAufDieserAdresse), zwei Tore: die Middleware in
workspace-bereiche.js und die Video-Route, die NICHT an ihr haengt.
Ohne das zweite liesse sich weiterhin etwas anlegen, das danach
niemand sieht -- derselbe Zustand, nur still.

Ohne Adresse (Pruefungen, 127.0.0.1) bleibt alles offen, dieselbe
vorsichtige Richtung wie in nurDiesesHaus.

ZWEIMAL VON DER MESSUNG KORRIGIERT WORDEN:

1. Ich hatte zusaetzlich einen Kachelfilter gebaut. Er war toter
   Code: Auf der Agenturadresse liefert bereicheRoh `null` ("der
   Browser nimmt seine eigene Liste"), und in dieser stehen die
   Rudel-Bretter gar nicht -- weder in start.html noch in
   bereiche.js. Es gab nichts zu filtern. Wieder entfernt: Ein
   Filter, den nichts erreicht, sieht beim Lesen aus wie der Schutz,
   und man sucht den echten nicht mehr.

2. Meine erste Pruefzeile erwartete auf der Agenturadresse
   Serverkacheln und wurde rot -- zu Recht, ich hatte eine Liste
   vermutet, wo keine ist.

pruef-haus-trennung 100 -> 107, beide Richtungen und alle drei Wege
(Kachel, Brett, Video). Die Gegenprobe auf crew. schickt bewusst
KEINE echte TikTok-Adresse: Der Riegel sitzt vor der Adresspruefung,
also beweist 400 ebenso gut, dass er nicht gesprungen ist -- und der
Lauf geht dafuer nicht ins Netz. Mit einer echten Adresse riss der
Server beim Beenden in einen libuv-Absturz (107 Pruefungen, 1 Fehler,
Rueckgabewert 127).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-05 12:19:10 +02:00
co-authored by Claude Opus 5
parent b625d901a5
commit adb265e603
4 changed files with 157 additions and 3 deletions
+93
View File
@@ -996,6 +996,99 @@ console.log("=== Haengt es wirklich an der Adresse? ===");
+ `(${titel(fremd) || "leer"} / ${titel(echt) || "leer"})`);
}
/* =======================================================================
DIE BRETTER DES RUDELS GIBT ES NUR AUF DER CREW-ADRESSE (05.10.2026)
Filipe: "ich kann gerade bei highlights keine videos hochladen."
GEMESSEN AN DER LAUFENDEN DATENBANK, bevor etwas angefasst wurde:
49 Highlights, ALLE mit `haus = crew` -- so legt
`hausFuerNeuenEintrag` sie an, ausdruecklich unabhaengig von der
Adresse. Der Adressriegel vom 03.10. zeigt auf der Agenturadresse
aber nur `haus = agentur`:
crew. -> 49 Highlights
workspace -> 0
Das Brett stand dort leer, und ein eingefuegtes Video verschwand in
derselben Sekunde -- angelegt und sofort ausgeblendet. Von aussen
sieht das aus wie "das Hochladen geht nicht". Belegt: Eintrag #77
wurde heute um 08:41 erfolgreich angelegt.
ZWEI REGELN WIDERSPRACHEN SICH, und keine Pruefung konnte das
merken: Jede fuer sich war richtig. Diese hier misst genau den
Zwischenraum -- deshalb in BEIDE Richtungen und auf allen drei
Wegen (Kachel, Brett, Video). Ein Riegel an nur einem davon waere
derselbe Fehler in leiser.
======================================================================= */
console.log("");
console.log("=== Rudel-Bretter: nur auf crew. ===");
{
const a = await beide("/workspace/api/ich", dogi.keks);
const ziele = (x) => [...(x?.bereiche || []), ...(x?.bereiche_zusatz || [])]
.map((k) => k.ziel || "");
const crewZiele = ziele(a.crew);
const wsZiele = ziele(a.ws);
/* Die Zahl gehoert in die Bedingung: Kaeme gar keine Kachel zurueck,
waere "keine Highlight-Kachel" gruen, ohne etwas gesehen zu haben. */
ok(crewZiele.length > 0 && crewZiele.some((z) => /b=highlight/.test(z)),
`auf crew. steht die Highlights-Kachel (${crewZiele.length} Kacheln)`);
/* AUF DER AGENTURADRESSE SCHICKT DER SERVER GAR KEINE LISTE, und das
ist Absicht: `bereiche === null` heisst "der Browser nimmt seine
eigene". Hier stand zuerst eine Zeile, die dort Agenturbretter
erwartete -- sie wurde rot, und zwar zu Recht: Ich hatte eine
Liste vermutet, wo keine ist. In der Browserliste stehen die
Rudel-Bretter ohnehin nicht (weder in start.html noch in
bereiche.js nachweisbar), deshalb gibt es dort auch nichts
auszublenden -- die Kachel war nie das Problem. */
ok(a.ws?.bereiche === null,
`auf der Agenturadresse kommt bewusst keine Serverliste (${JSON.stringify(a.ws?.bereiche)})`);
ok(!wsZiele.some((z) => /b=highlight/.test(z)),
`und nirgends eine Highlights-Kachel (${wsZiele.length} Zusatzkacheln geprueft)`);
/* ---- Das Brett selbst ------------------------------------------- */
const hl = {
crew: await hole("/workspace/api/bereich/highlight", { host: CREW, keks: dogi.keks }),
ws: await hole("/workspace/api/bereich/highlight", { host: WS, keks: dogi.keks }),
};
ok(hl.crew.status === 200, `das Brett antwortet auf crew. (${hl.crew.status})`);
ok(hl.ws.status === 404,
`auf der Agenturadresse gibt es es gar nicht -- 404 statt leer (${hl.ws.status})`);
/* ---- Und der Weg, auf dem das Video hereinkommt ------------------
Er haengt NICHT an derselben Middleware und braucht seinen
eigenen Riegel. Genau deshalb wird er hier eigens gemessen: Ohne
ihn liesse sich weiterhin etwas anlegen, das danach niemand
sieht -- derselbe Zustand, nur still. */
const video = await hole("/workspace/api/bereich/highlight/video", {
host: WS, keks: dogi.keks, methode: "POST",
rumpf: JSON.stringify({ url: "https://www.tiktok.com/@dogfather/video/1234567890" }),
});
ok(video.status === 404,
`auch ein Video laesst sich von dort nicht mehr einfuegen (${video.status})`);
/* GEGENPROBE: Auf crew. wird es NICHT mit 404 abgewiesen. Die
Adresse ist der Unterschied, nicht etwa eine kaputte Route --
sonst waere die Zeile darueber wertlos. (Dass TikTok die erfundene
Nummer nicht kennt, ist hier egal: Jede Antwort ausser 404 zeigt,
dass der Riegel nicht gegriffen hat.) */
const videoCrew = await hole("/workspace/api/bereich/highlight/video", {
host: CREW, keks: dogi.keks, methode: "POST",
/* ABSICHTLICH KEINE ECHTE TIKTOK-ADRESSE. Der Riegel sitzt VOR der
Adresspruefung: Kommt hier 400 ("keine TikTok-Adresse") zurueck,
ist er nachweislich nicht gesprungen -- und die Pruefung schickt
dabei keine Anfrage ins Netz. Mit einer echten Adresse lief der
Server gegen TikTok, und die offenen Verbindungen rissen ihn
beim Beenden in einen libuv-Absturz: 107 Pruefungen, 1 Fehler,
Rueckgabewert 127. */
rumpf: JSON.stringify({ url: "https://example.invalid/kein-tiktok" }),
});
ok(videoCrew.status === 400,
`Gegenprobe: auf crew. greift der Riegel nicht (${videoCrew.status} statt 404)`);
}
d.close();
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
console.log("");
+8 -1
View File
@@ -82,7 +82,7 @@ import {
db, protokolliere, echteIp, sitzungLesen, DATEN_ORDNER, betreutWo, darfCreator, betreuteIds, istLeitung, istDogFather, siehtAlles, istSpicy, ohneDogFather,
externPruefen, externSql,
ohneTeamDogi, ohneAgentur, siehtModis, fuehrtTeamDogi, MODI_BEREICHE_ERLAUBT, brettHinterSeiteOffen, TEAM_DOGI_ROLLEN,
TREFF_BRETTER, TREFF_ROLLEN, AUSSEN_ROLLEN,
TREFF_BRETTER, TREFF_ROLLEN, AUSSEN_ROLLEN, brettAufDieserAdresse,
heuteLokal,
gehoertAufDieseAdresse,
bereicheFuer, kanaeleFuer, KANAELE,
@@ -949,6 +949,13 @@ bereicheRouter.use("/workspace/api/bereich/:bereich", (req, res, next) => {
Faellt eines weg, haelt das andere. */
if (TREFF_BRETTER.includes(b) && !TREFF_ROLLEN.has(req.person?.rolle)) return nein();
/* UND AUF DER AGENTURADRESSE GIBT ES SIE GAR NICHT (05.10.2026).
Begruendung bei `brettAufDieserAdresse` in workspace.js -- kurz:
Diese Bretter sind immer `crew`, der Adressriegel zeigt dort nur
`agentur`, also standen sie leer da und Neues verschwand sofort.
Jetzt antwortet die Seite gar nicht erst. */
if (!brettAufDieserAdresse(req.person, b)) return nein();
if (!TEAM_DOGI_ROLLEN.has(req.person?.rolle)) return next();
/* Bretter mit eigener Kachel: wer die Kachel hat, darf hinein. */
if (MODI_BEREICHE_ERLAUBT.has(b)) return next();
+9 -2
View File
@@ -46,7 +46,7 @@ import { join } from "node:path";
import { mkdirSync, writeFileSync, unlinkSync } from "node:fs";
import {
db, protokolliere, echteIp, sitzungLesen, DATEN_ORDNER,
KANAELE, kanalVonHandle, TREFF_BRETTER,
KANAELE, kanalVonHandle, TREFF_BRETTER, brettAufDieserAdresse,
heuteLokal,
hausFuerNeuenEintrag,
} from "./workspace.js";
@@ -162,7 +162,14 @@ videoRouter.post("/workspace/api/bereich/:bereich/video", async (req, res) => {
let abgelegt = null;
try {
const bereich = String(req.params.bereich);
if (!TREFF_BRETTER.includes(bereich)) {
/* DIESE ROUTE HAT IHR EIGENES TOR. Sie haengt nicht an der
Middleware von workspace-bereiche.js -- deshalb steht der
Adressriegel hier eigens. Ohne ihn liesse sich von der
Agenturadresse aus weiterhin ein Video anlegen, das danach
niemand dort sieht: genau der Zustand, der heute gemeldet
wurde, nur still. */
if (!TREFF_BRETTER.includes(bereich)
|| !brettAufDieserAdresse(req.person, bereich)) {
return res.status(404).json({ fehler: "nicht_gefunden" });
}
const warum = darfSchreiben(req.person, bereich);
+47
View File
@@ -2160,6 +2160,53 @@ const TREFF_MIT_EIGENEM = [...TREFF_BEREICHE, HILFE_KACHEL, STECKBRIEF_KACHEL_TR
assets/js/bereiche.js und wird dort ergaenzt. `[]` heisst "diese
Rolle bekommt gar nichts"; ihr eine einzelne Kachel zu geben waere
die Ausnahme, die spaeter niemand mehr erklaeren kann. */
/** Gibt es dieses Brett auf der Adresse, auf der jemand angemeldet ist?
*
* DIE SIEBEN BRETTER DES RUDELS GIBT ES NUR BEI TEAM DOGI (05.10.2026).
*
* Filipe: "ich kann gerade bei highlights keine videos hochladen."
*
* Nachgemessen an der laufenden Datenbank: 49 Highlights, ALLE mit
* `haus = crew` -- so legt `hausFuerNeuenEintrag` sie an, ausdruecklich
* "egal, von welcher Adresse aus jemand hineinschreibt". Seit dem
* Adressriegel vom 03.10. zeigt die Agenturadresse aber nur Eintraege
* mit `haus = agentur`. Ergebnis:
*
* crew. -> 49 Highlights
* workspace-> 0
*
* Das Brett stand dort also leer da, und was jemand einfuegte,
* verschwand in derselben Sekunde -- angelegt, aber sofort
* ausgeblendet. Von aussen sieht das aus wie "das Hochladen geht
* nicht"; in Wahrheit ging alles, nur sehen konnte er es nicht.
*
* Zwei Regeln widersprachen sich: Die eine sagt "diese Bretter sind
* immer crew", die andere "auf dieser Adresse nur agentur". Aufgeloest
* wird es in Filipes Richtung (05.10.2026, nach Rueckfrage): Auf der
* Agenturadresse gibt es diese Bretter gar nicht mehr -- weder als
* Kachel noch als Seite noch als Schnittstelle. Das ist die Regel vom
* 24.09. beim Wort genommen: "auf jeder Adresse nur deren Bestand."
*
* OHNE ADRESSE (Pruefungen, 127.0.0.1) bleibt alles offen. Dieselbe
* vorsichtige Richtung wie in `nurDiesesHaus` -- ein Riegel, der auch
* dort zuschlaegt, wo niemand ein Haus kennt, sperrt die eigenen
* Messungen aus. */
export const brettAufDieserAdresse = (person, bereich) =>
!(TREFF_BRETTER.includes(String(bereich)) && person?.haus === "agentur");
/* HIER STAND EIN KACHELFILTER -- und er war toter Code (05.10.2026).
Die Idee war, die Rudel-Kacheln auf der Agenturadresse aus der
Serverliste zu streichen. Nachgemessen gibt es dort gar keine
Serverliste: `bereicheRoh` liefert fuer die Agenturrollen `null`,
und das heisst "der Browser nimmt seine eigene Liste". In dieser
stehen die Rudel-Bretter nicht -- weder in start.html noch in
bereiche.js. Es gab also nichts zu filtern.
Ein Filter, den nichts erreicht, ist schlimmer als keiner: Er sieht
beim Lesen aus wie der Schutz, und man sucht den echten nicht mehr.
Der echte ist das Tor in workspace-bereiche.js und in der
Video-Route -- beide gemessen in pruef-haus-trennung. */
export function bereicheFuer(person) {
const liste = bereicheRoh(person);
if (liste === null || !Array.isArray(liste) || !liste.length) return liste;