Setzt die Reihenfolge aus docs/EXTRAKTION.md um. **Qualitätssignal statt Vermutung.** `articleQuality()` unterscheidet vier Zustände: ok · unextracted (kein Text, aber keine Wand → Server-Versuch lohnt) · blocked (Quelle hat die Zustimmungsseite geliefert → Server kann das prinzipiell nicht lösen) · thin. Vorher beantwortete eine einzige Funktion zwei verschiedene Fragen und war deshalb an beiden Aufrufstellen ein Stück falsch — die eigenen Tests haben das aufgedeckt. Jetzt getrennt: `titleIsJustHost` für „ist der Titel unbrauchbar", `articleQuality` für „was ist mit dem Artikel los". **Neu extrahieren.** Der Web-Client emittiert jetzt `ArticleEnriched` — einzeln im Reader, als Stapel in der Liste („N ohne Text neu holen", seriell, weil jeder Versuch ein Fetch auf eine fremde Seite ist). Das Event lag samt nicht-destruktivem Reducer schon im Schema, wurde aber nur von Native genutzt. Kein Schema-Bump nötig. **Wand-Erkennung ohne Raten.** `redirectedToWall()` prüft das Redirect-Ziel: wer eine Artikel-URL anfragt und auf /sonstiges/zustimmung/ landet, hat keinen Artikel bekommen — unabhängig von der Wortzahl. Die alte Schwelle (300 Wörter) lag bei Golem mit 254 knapp richtig, hätte eine ausführlichere Consent-Seite aber durchgelassen. Dazu ein Metadaten-Fallback: hinter der Wand wenigstens og:title/og:description retten, damit die Karte nicht „golem.de" heisst. **Browser-Erweiterung** (apps/extension, MV3, Chrome + Firefox). Ein Klick speichert die gerenderte Seite mitsamt Sitzung — der einzige Weg an harte Wände. Nutzt denselben /lese-liste/add/receive-Transport wie das Bookmarklet, damit es einen gepflegten Eingang gibt statt zweier. Bewusst ohne API-Schlüssel, ohne dauerhafte Leseerlaubnis (activeTab), ohne Telemetrie; ein check.mjs wacht darüber, dass die Berechtigungen nicht stillschweigend wachsen. **Und ein ehrlicheres Schild.** Auf den Karten stand bisher „Cookie-Wand" auch dort, wo gar keine gemeldet war — genau das zeigte der Screenshot vom 27.07. Jetzt „Quelle blockiert" vs. „Ohne Text", mit je einer Aktion, die zum Zustand passt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
48 lines
1 KiB
JSON
48 lines
1 KiB
JSON
{
|
|
"manifest_version": 3,
|
|
"name": "Pageta — Artikel speichern",
|
|
"version": "0.1.0",
|
|
"description": "Speichert die geöffnete Seite in deine Pageta-Lese-Liste — mit dem Text, den du siehst, auch hinter Zustimmungs-Abfragen.",
|
|
"default_locale": "de",
|
|
|
|
"icons": {
|
|
"16": "icons/icon-16.png",
|
|
"32": "icons/icon-32.png",
|
|
"48": "icons/icon-48.png",
|
|
"128": "icons/icon-128.png"
|
|
},
|
|
|
|
"action": {
|
|
"default_title": "In Pageta speichern",
|
|
"default_icon": {
|
|
"16": "icons/icon-16.png",
|
|
"32": "icons/icon-32.png",
|
|
"48": "icons/icon-48.png",
|
|
"128": "icons/icon-128.png"
|
|
}
|
|
},
|
|
|
|
"background": {
|
|
"service_worker": "background.js",
|
|
"scripts": ["background.js"],
|
|
"type": "module"
|
|
},
|
|
|
|
"options_ui": {
|
|
"page": "options.html",
|
|
"open_in_tab": false
|
|
},
|
|
|
|
"permissions": ["activeTab", "scripting", "storage"],
|
|
|
|
"host_permissions": ["https://app.pageta.com/"],
|
|
|
|
"optional_host_permissions": ["https://*/", "http://*/"],
|
|
|
|
"browser_specific_settings": {
|
|
"gecko": {
|
|
"id": "pageta@mana.how",
|
|
"strict_min_version": "121.0"
|
|
}
|
|
}
|
|
}
|