Der Weg ueber die TikTok-Datei des Creators ist entfernt

Filipe, mit den drei Knoepfen im Bild: "ich will nur dass wir manager
scouts, dogfather oder spicy sachen eintragen koennen und nicht die
creator. ich will keine daten von denen kriegen, nur wir."

Gebaut am Vormittag, am Nachmittag wieder ausgebaut. Der Weg war
technisch in Ordnung -- und er war der einzige, bei dem ein CREATOR uns
etwas gibt: seine eigene Datenkopie aus der TikTok-App. Genau das soll
nicht sein. Es bleiben die beiden Wir-Wege: die eigene Datei und die
Backstage-Tabelle der Agentur.

VOLLSTAENDIG ENTFERNT, NICHT VERSTECKT:
- beide Schnittstellen (/tiktok-datei und /tiktok-datei/vorschau)
- der Leser workspace-tiktok-datei.js (263 Zeilen)
- Knopf, Fenster, Dateiauswahl, Vorschau, Stilregeln
- der fertige Text, der einen Creator um seine Daten bittet
- der Erklaersatz unter der Knopfreihe

Ein Weg, der nur unsichtbar ist, ist weiterhin ein Weg -- wer die
Adresse kennt, benutzt ihn. Und eine Bitte an einen Creator um seine
Daten soll in diesem Haus nirgends mehr stehen, auch nicht in einem
Fenster, das niemand oeffnet.

GEPRUEFT WIRD JETZT DIE ABWESENHEIT, an drei Stellen: Knopf weg,
Fenster weg, und die Schnittstelle antwortet DOGFATHER mit 404 -- dem
staerksten Zugang, den es gibt. Bekommt er 404, bekommt ihn jeder.
Daneben die Gegenprobe, dass der Backstage-Weg weiterhin mit 200
antwortet; sonst bewiese das 404 nur einen Tippfehler.

pruef-tiktok-datei.mjs (47 Pruefungen) faellt mit dem Weg weg. Die
Zahl sinkt dadurch, und das ist hier richtig: Sie pruefte etwas, das
es nicht mehr gibt. Was bleibt, sind sechs Pruefungen, die das
Fehlen sichern -- pruef-backstage-import 63 -> 66.

NEBENBEI GEDREHT, NICHT GELOESCHT: pruef-leistung-optik behauptete
noch die Regel vom 07.09. ("beim Manager fehlt die Kachel", "die Seite
weist den Creator ab"). Beide Aussagen sind jetzt umgekehrt und messen
zusaetzlich, was vorher niemand gemessen hat: dass die Creatorin auf
der Zahlen-Seite ihre EIGENEN Zahlen sieht und trotzdem keinen
einzigen Knopf zum Eintragen hat -- beides zusammen, denn "keine
Knoepfe" waere auch auf einer leeren Seite wahr. 56 -> 59.

Nicht von mir, nachgemessen gegen den Stand ohne diese Aenderungen:
pruef-struktur meldet dieselben 6 Fehler (crew-index/teamlage nicht
verlinkt, start.css 348 KB, totes CSS .nase, UTC-Datum).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-11 15:02:21 +02:00
co-authored by Claude Opus 5
parent b34586be91
commit 14ed467928
31 changed files with 427 additions and 1262 deletions
+57 -25
View File
@@ -286,6 +286,30 @@ console.log("\n=== Gegenproben ===");
ok(status === 200, `heute als Tag geht dagegen durch (HTTP ${status})`);
}
/* DIE SCHNITTSTELLE ZUR TIKTOK-DATEI GIBT ES NICHT MEHR (11.09.2026).
Filipe: "ich will keine daten von denen kriegen, nur wir."
Ein ausgebauter Knopf ist keine Entfernung -- die Schnittstelle
waere weiterhin erreichbar, und wer die Adresse kennt, koennte
weiter eine Creator-Datei hochladen. Gemessen wird deshalb hier,
mit DogFathers Zugang, also dem staerksten, den es gibt: Bekommt
ER 404, bekommt ihn jeder.
GEGENPROBE DANEBEN: Der Backstage-Weg antwortet weiterhin. Sonst
bewiese das 404 nur, dass ich mich vertippt habe. */
for (const weg of ["/workspace/api/leistung/1/tiktok-datei",
"/workspace/api/leistung/1/tiktok-datei/vorschau"]) {
const { status } = await ruf(weg, keksDogi, { inhalt: {} });
ok(status === 404, `${weg.split("/").slice(-2).join("/")} gibt es nicht mehr (HTTP ${status})`);
}
{
const { status } = await ruf("/workspace/api/leistung/netzwerk-import/vorschau",
keksDogi, { text: TABELLE, tag: gestern });
ok(status === 200,
`Gegenprobe: der Backstage-Weg antwortet weiterhin (HTTP ${status})`);
}
/* WER SIEHT WEN -- direkt an der Schnittstelle gemessen, bevor der
Browser ins Spiel kommt. Wird der Auswahlliste auf der Seite etwas
fehlen, steht hier, ob es schon hier fehlte. */
@@ -370,21 +394,29 @@ console.log("\n=== Die Seite ===");
const satz = (id) => seite.$eval(id, (e) => (e.hidden ? "" : e.textContent))
.catch(() => "");
const netzSatz = await satz("#quelle-netz");
const ttSatz = await satz("#quelle-tt");
ok(/Backstage/.test(netzSatz) && /TikTok-Datei/.test(ttSatz),
"unter den Knöpfen steht dauerhaft, was die beiden Quellen sind");
ok(/Backstage/.test(netzSatz),
"unter den Knöpfen steht dauerhaft, woher die Zahlen kommen");
/* Und der fertige Text für den Creator -- mit den zwei Angaben, an
denen es sonst scheitert: JSON und "alle Daten". */
await seite.click("#tt-oeffnen");
await seite.waitForTimeout(300);
const fuerCreator = await seite.$eval("#tt-text", (e) => e.textContent);
ok(/JSON/.test(fuerCreator) && /Alle Daten/i.test(fuerCreator),
"der Text für den Creator nennt JSON und „Alle Daten“");
ok(/Einstellungen und Datenschutz/.test(fuerCreator) && /Deine Daten herunterladen/.test(fuerCreator),
"und den Weg in der App");
ok(/nicht gespeichert/.test(fuerCreator),
"und was mit der Datei passiert -- das gehört dem Creator gesagt");
/* ---- DER WEG UEBER DIE TIKTOK-DATEI IST WEG (11.09.2026) --------
Filipe: "ich will keine daten von denen kriegen, nur wir."
GEPRUEFT WIRD DIE ABWESENHEIT, und zwar an DREI Stellen -- sonst
hiesse "der Knopf ist weg" nur, dass er versteckt ist. Ein
versteckter Weg ist ein Weg: Wer die Adresse kennt, benutzt ihn.
Deshalb muss auch die Schnittstelle verschwunden sein.
Und der Text, der einen Creator um seine Daten bittet, darf
nirgends mehr auf der Seite stehen -- auch nicht in einem
Fenster, das niemand oeffnet. */
const spuren = await seite.evaluate(() => ({
knopf: !!document.getElementById("tt-oeffnen"),
fenster: !!document.getElementById("tt-dialog"),
text: document.body.textContent.includes("Deine Daten herunterladen"),
}));
ok(spuren.knopf === false, "der Knopf „TikTok-Datei des Creators\" ist weg");
ok(spuren.fenster === false, "und sein Fenster auch");
ok(spuren.text === false,
"und die Bitte an den Creator steht nirgends mehr auf der Seite");
/* ---- DIESELBE SEITE, ANDERE ROLLE (11.09.2026) -----------------
Filipe, mit der Kachel im Bild: "jetzt soll jede rolle diese
@@ -434,9 +466,9 @@ console.log("\n=== Die Seite ===");
return {
weg: location.pathname,
kacheln: 0,
import: h("import-oeffnen"), netz: h("netz-oeffnen"), tt: h("tt-oeffnen"),
import: h("import-oeffnen"), netz: h("netz-oeffnen"),
ziele: h("ziele-aendern"),
block: h("quellen-hinweis"), sNetz: h("quelle-netz"), sTt: h("quelle-tt"),
block: h("quellen-hinweis"), sNetz: h("quelle-netz"),
/* Wie viele Creator stehen zur Auswahl? Ein Creator darf hier
kein Auswahlfeld haben -- es haette nur ihn selbst drin. */
wahl: document.getElementById("creator-wahl")?.hidden === false
@@ -461,12 +493,12 @@ console.log("\n=== Die Seite ===");
ok(scoutBild.kachel === true && /leistung\.html$/.test(scoutBild.weg),
`der Scout findet die Kachel und kommt auf die Seite (${scoutBild.weg})`);
ok(scoutBild.fehler === "", `kein Skriptfehler beim Scout (${scoutBild.fehler || "keiner"})`);
ok(scoutBild.tt === false && scoutBild.import === false && scoutBild.ziele === false,
"der Scout darf eintragen: Datei, TikTok-Datei und Ziele sind da");
ok(scoutBild.import === false && scoutBild.ziele === false,
"der Scout darf eintragen: eigene Datei und Ziele sind da");
ok(scoutBild.netz === true,
"die Backstage-Tabelle bleibt ihm zu -- sie gilt für ALLE Creator");
ok(scoutBild.sTt === false && scoutBild.sNetz === true,
"und er liest nur die Erklärung zu dem Weg, den er auch hat");
ok(scoutBild.sNetz === true && scoutBild.block === true,
"die Backstage-Erklärung bekommt er nicht -- den Weg hat er nicht");
ok(scoutBild.aendern > 0,
`er kann einen Tag eintragen (${scoutBild.aendern} Knöpfe in der Liste)`);
@@ -486,10 +518,10 @@ console.log("\n=== Die Seite ===");
ok(b.kachel === true && /leistung\.html$/.test(b.weg),
`${rolle}: findet die Kachel und kommt auf die Seite`);
ok(b.fehler === "", `${rolle}: kein Skriptfehler (${b.fehler || "keiner"})`);
ok(b.netz === false && b.tt === false && b.import === false && b.ziele === false,
`${rolle}: alle vier Wege sind da -- auch die Backstage-Tabelle`);
ok(b.sNetz === false && b.sTt === false,
`${rolle}: und beide Erklärungen dazu`);
ok(b.netz === false && b.import === false && b.ziele === false,
`${rolle}: alle drei Wege sind da -- auch die Backstage-Tabelle`);
ok(b.sNetz === false,
`${rolle}: und die Erklärung dazu`);
ok(b.wahl >= mindestens,
`${rolle}: sieht ${b.wahl} Creator zur Auswahl (mindestens ${mindestens})`);
}
@@ -508,7 +540,7 @@ console.log("\n=== Die Seite ===");
`der Creator findet die Kachel und kommt auf die Seite (${creatorBild.weg})`);
ok(creatorBild.fehler === "", `kein Skriptfehler beim Creator (${creatorBild.fehler || "keiner"})`);
ok(creatorBild.import === true && creatorBild.netz === true
&& creatorBild.tt === true && creatorBild.ziele === true,
&& creatorBild.ziele === true,
"der Creator sieht KEINEN einzigen Eintrag-Knopf");
ok(creatorBild.aendern === 0,
`auch nicht an den einzelnen Tagen (${creatorBild.aendern} Knöpfe)`);