Changelog

Was sich in SpiderHead geändert hat, Release für Release. Jeder Eintrag nennt die Art der Änderung und ob sie heute funktioniert.

Releases auf GitHub
In Entwicklung

Unreleased

Seit 3.1.065 Einträge

22. Oktober 2026

7 geändert2 behoben
  • GeändertFunktioniertA results difference between two scans can now be attributed.#1529

    The new read-only scan-config-diff (CLI seohead scan-config-diff --before a.sqlite --after b.sqlite, MCP seo_scan_config_diff) reads both scans' recorded effective configurations from their headers — the sites are never re-read — and reports a field-by-field diff over the manifest's dotted setting paths: changed settings with both values, added, removed, an identical flag, and how many settings were compared. Identical configurations report no differences; a free-form map such as http.headers compares as one leaf, exactly as the manifest records it.

    #1529 (Issue auf GitHub)
  • GeändertFunktioniertA native crawl now measures its own reading level.#1516

    The new checks.readability module computes, offline over each page's retained content area, the sentence count, average words per sentence, the Flesch Reading Ease score (206.835 − 1.015·words/sentences − 84.6·syllables/words, English vowel-group syllable heuristic, version flesch-reading-ease.v1) and the standard band label. The four values are stored as per-URL scan fields (pages.sentence_count, avg_words_per_sentence, flesch, readability), carried into the analyzer frame under the same column names an SF export uses — so the existing READABILITY_DIFFICULT and LONG_SENTENCES checks now fire on native crawls too, with no new check IDs. A page whose content area was not retained, or holds no word with a letter, records NULL/"" — unmeasured, never a zero that would read as measured-and-easy. Text ratio and word count behavior are unchanged.

    #1516 (Issue auf GitHub)
  • BehobenFunktioniertCrawls on hosts that enforce https no longer spend a redirect hop on every http URL.#1484

    The new opt-in http.upgrade_to_https setting rewrites http URLs to https before any request — seed, sitemap seeds and discovered links alike, in both spider and list modes and in native scans: no redirect is recorded for the upgrade, the http and https spellings collapse into one page identity, and each page fetched this way carries transport_upgraded: true in its record (persisted as pages.transport_upgraded, absent in older scans reads as false). The operator opting in is the declaration that the hosts enforce transport security; a host without https answers with visible connection errors rather than a silent fallback. With the setting off, nothing changes.

    #1484 (Issue auf GitHub)
  • GeändertFunktioniertA crawl started deep can now stay in its own subtree.#1481

    The new scope.start_folder_only toggle admits only URLs at or below the start URL's path folder: a crawl started at /blog/post walks /blog/ and everything under it, and links pointing above the folder are counted as unfollowed evidence (excluded under outside_start_folder) exactly like any other scope rejection — no hand-written include patterns required. The folder is the directory the start URL sits in (a trailing-slash start keeps its own folder); a start URL at the host root is refused, because the root has no folder to stay below. The setting is recorded per scan in the run manifest like every result-affecting setting, and appears in crawl-describe-settings. With the toggle off nothing changes.

    #1481 (Issue auf GitHub)
  • BehobenFunktioniertPages that link at robots-disallowed targets are no longer silent about it.#1486

    When robots.txt disallows a linked URL and the crawl's robots policy is respect, the target is never fetched and never becomes a page row, so no target-side check can see it: the link between a page and a whole hidden section existed only in the edge list. The new ROBOTS_BLOCKED_OUTLINK finding (notice) lists, per source page, the outlinks whose destinations the policy kept out — both URLs named, internal and external edges alike, the target still never fetched. The population follows the robots policy mode: under report_only the same targets are reported (they would have been blocked), and under ignore the check skips honestly — no URL was measured against robots.txt. Crawl-list runs without retained link edges skip by name like the other link findings.

    #1486 (Issue auf GitHub)
  • GeändertFunktioniertAn image-only link now names its destination when the wrapped image carries alt text.#1518

    Links whose visible content is an image used to show an empty anchor in link evidence even when the image had a descriptive alt, so anchor-text review treated every image link as unnamed. The parser now records that alt as the link's anchor with an anchor_source: "alt" marker distinguishing alt-derived anchors from text-derived ones (absent marker = text or nothing). A link with visible text keeps its text; a link with neither stays empty and keeps feeding the no-anchor-text checks. The marker rides the LinkEdge into the scan (links.anchor_source), the links export and the per-link query views; a scan written before the field reports null there rather than a false text-derived answer.

    #1518 (Issue auf GitHub)
  • GeändertFunktioniertHrefs that cannot become fetchable link targets leave evidence instead of vanishing.#1530

    Link parsing drops an unparsable href (malformed syntax, e.g. a truncated http://[invalid) or a non-http(s) scheme (mailto:, javascript:) with no trace: the source page keeps nothing to say it points at something broken. The new opt-in crawl setting discovery.record_invalid_targets records each rejection per page — the raw href exactly as written plus the reason (unparsable_syntax / unsupported_scheme) — through the parser, the crawl record, the scan schema (pages.invalid_link_targets_json) and the analyzer frame, and the new INVALID_LINK_TARGET check turns the pages that have them into findings with the raw values as evidence. A missing href and a pure in-page #anchor are absence, not defects, and are never recorded; a measured clean page records an empty list; a crawl that ran without the setting skips the check honestly instead of reporting a clean site nobody measured. Rejected targets are data: they never enter the frontier. The setting is off by default and is recorded in the run manifest like every finding-changing setting.

    #1530 (Issue auf GitHub)
  • GeändertFunktioniertHEADING_SKIP now flags heading-order jumps in both directions, completing the#1545

    heading-sequence check: a content heading that skips a level down (H2 -> H4) and one that jumps back up past an open section (H4 -> H2) are the same defect -- the outline steps over a section that was never opened or never closed. A one-level return (H3 -> H2) closes the current section and starts a sibling, which is correct nesting and stays clean, matching the SF 24.3 axe.heading_order behaviour the check was modelled on. Evidence rows carry from/to levels and texts for both directions.

    #1545 (Issue auf GitHub)
  • GeändertFunktioniertThird-party product names now appear only where they describe compatibility: a trademark#1554

    and non-affiliation notice was added, the export analyzer is called Export Analyzer, and report reasons and docs describe what an export lacks instead of making claims about another product.

    #1554 (Issue auf GitHub)

21. Oktober 2026

3 hinzugefügt4 geändert3 behoben
  • GeändertBetaDesktop: URL-Datensatz als flache Liste oder als Pfadbaum.#1492

    Ein Umschalter für Liste und Baum am Ende der Gruppenleiste wechselt den Datensatz zwischen der flachen Seitenliste und einem einklappbaren Pfadbaum. Beide nutzen dieselben Zeilen und Filter: Hosts sind die oberen Knoten, Verzeichnis-URLs sind eigene Ordner-Blätter, Dokument-URLs hängen am letzten Ordner. Wer ein Blatt auswählt, steuert die gemeinsame Tabellenauswahl, sodass Details und Filter den Wechsel überstehen.

    #1492 (Issue auf GitHub)
  • HinzugefügtBetaDesktop: Ansicht nur mit Daten zur Durchsicht.#1495

    View > Data only (Ctrl+Alt+D) blendet für lange Prüfsitzungen Navigation und Kopfleiste aus und lässt nur die Daten stehen. Die Auswahl bleibt pro Sitzung erhalten, und die eigenen Panels jeder Ansicht reagieren weiterhin auf ihre eigenen Schalter.

    #1495 (Issue auf GitHub)
  • BehobenBetaLogs: time-taken in beiden Positionen und bei Layouts mit einem Ident-Token.#1534

    Die Apache-Parser extrahieren jetzt Referer, User-Agent und time-taken, wenn die Antwortzeit zwischen Größe und Referer steht oder am Ende der Zeile folgt. Bisher wurden beide Felder in Anführungszeichen stillschweigend verworfen. Die Formaterkennung akzeptiert ein oder zwei Ident-Token zwischen Client-IP und Zeitstempel, sodass das nginx-Layout mit einem Bindestrich importiert wird, statt komplett zu scheitern. Der Importbericht nennt die akzeptierten Varianten (combined-2-ident, combined-1-ident). Betrifft #1534 und #1535.

    #1534 (Issue auf GitHub)
  • GeändertBetaDesktop: Abstandsskala ist fertig, keine Abstände außerhalb der Skala mehr.#1374

    Die restlichen 184 Aufrufe von setContentsMargins/setSpacing außerhalb der Skala in 60 Dateien wurden auf die Token-Skala umgestellt, mit einer Zuordnung, die Werte nur verkleinert. Der Ratchet-Test schlägt nun bei jedem Wert außerhalb der Skala fehl. Zuerst normalisiert wurden Search, Images, Inbox, Issues, Logs, Journal und Onboarding.

    #1374 (Issue auf GitHub)
  • GeändertBetaDesktop: schnelle Verbesserungen, rohe TSV-Werte, Projekt im Fenstertitel, AA-Kontrast

    für tertiären Text.

    copy_tsv kopiert die gespeicherten Werte, sodass der sichtbare Platzhalter für fehlende Daten nie in der Tabellenkalkulation landet. Der Fenstertitel zeigt das geöffnete Projekt (Project — SpiderHead); tertiärer Text erreicht auf erhöhten Flächen jetzt den AA-Kontrast.

  • BehobenBetaDesktop: ehrliche Tastaturbereiche, Return öffnet Details, lesbare Fehlerquellen.

    F6 wechselt nur zwischen Navigation und der aktuellen Seite. Return öffnet die Details der markierten Zeile, wie es das Zeilenmenü immer versprochen hatte. Lesefehler in der Statusleiste nennen jetzt die Operation (URL-Tabelle, Crawl-Parameter) statt der rohen Request-ID.

  • GeändertBetaDesktop: das View-Menü bindet sich an die eigenen Panels der aktuellen Ansicht.

    Eine Ansicht kann panel_actions() bereitstellen, also Tripel aus (Titel, ist sichtbar, Umschalter). Das View-Menü baut seinen Panel-Abschnitt beim Anzeigen aus der Ansicht. Die URL-Ansicht bietet ihre Laufzusammenfassung und den Modus nur mit Tabelle; die alten Audit-Einträge bleiben auf ihrer eigenen Seite.

  • BehobenBetaDesktop: Aktivitäts-Ticks fluten die Logs geschlossener Fenster nicht mehr.

    Das globale Aktivitätssignal rief weiterhin gelöschte BusyIndicator-Widgets auf. Geschlossene Fenster bleiben jetzt still.

  • HinzugefügtBetaDesktop: Tabs im Simple-Modus lassen sich ausblenden und wiederherstellen.

    Kontextmenü der Tab-Leiste: Tab ausblenden, ausgeblendete wiederherstellen, alle anzeigen. Die Auswahl bleibt erhalten. Der erste Tab bleibt immer sichtbar, der letzte sichtbare Tab kann nicht ausgeblendet werden, und ein ausgeblendeter Tab erscheint wieder, sobald die Übersicht in ihn hineinführt.

  • HinzugefügtBetaDesktop: Zustände im Simple-Modus, Markenleiste und Offline-Erfassungen.

    Zustandspanels mit Aktionen: keine Ergebnisse (Suche löschen / alle anzeigen), fehlgeschlagen (erneut versuchen / Log anzeigen), Core nicht gefunden (Einstellungen öffnen). Ein Hinweis zum Stopp zählt gecrawlte und eingereihte URLs. Die Werkzeugleiste trägt das Spinnen-Markenzeichen, und die Fehleranzahl ist als Badge dargestellt.

20. Oktober 2026

1 hinzugefügt3 geändert
  • GeändertBetaDas CLI-Paket seohead ist in Fachmodule aufgeteilt.#1514

    cli/_shared.py enthält die Befehlsregister und Eingabehilfen. checks_cmds, project_cmds, scan_cmds, crawl_cmds, sources_cmds, reports_cmds und misc_cmds enthalten je ihren Teil der bisherigen kwarg-Zuordnung aus cli/__init__.py, der argparse-Flags und der Sonderfälle der Hauptverteilung. Die veröffentlichte Import-Oberfläche bleibt unverändert, das Modul schrumpft von 4.506 auf 513 Zeilen, und die Ausgabe von --help bleibt für jeden Befehl byte-identisch.

    #1514 (Issue auf GitHub)
  • GeändertBetaMCP-Handler wandern in ein eigenes Handler-Paket.#1514

    Die Server-Handler liegen jetzt in seohead/mcp/handlers/, nach Bereichen getrennt: Projekte, Traffic, Logs, Quellen, Inhalte, Semantik, Workflow, aufbewahrte Scans, Evidence und BI-Export, Umgebung und Katalog. Dokumentation und Quellpfad-Verweise folgen dem neuen Aufbau.

    #1514 (Issue auf GitHub)
  • GeändertBetaURL-Tabelle: Mehrfachauswahl mit TSV-Kopie der Auswahl.#1347

    Feinschliff der URL-Tabelle aus #1347: Mehrere Zeilen markieren und genau diese Auswahl als TSV kopieren.

    #1347 (Issue auf GitHub)
  • HinzugefügtBetaKern der Live-Steuerung der Crawl-Rate (in Arbeit).#1360

    Der Kern, mit dem sich die Crawl-Rate während eines laufenden Scans ändern lässt (#1360). Die Verdrahtung in der Desktop-App folgt.

    #1360 (Issue auf GitHub)
Ältere Tage (4)Show all

14. Oktober 2026

3 geändert
  • GeändertBetaDesktop: Scan-Fortschritt, URL-Limit, Stopp-Schaltfläche und Abschlussgründe.#1358

    Erledigt/eingereiht, Geschwindigkeit, ETA und das angeforderte URL-Limit erscheinen in der Scan-Liste, in den Scan-Details und in der Navigationskarte. Der Stopp-Schalter in der Kopfleiste heißt Stop scan statt einer Run-ID, aktualisiert sich ohne Flackern und verschwindet, sobald der Lauf beendet ist. Abgeschlossene Läufe nennen ihren Grund (URL-, Anfrage- oder Zeitlimit, Fehler, Speicherplatz).

    #1358 (Issue auf GitHub)
  • GeändertBetaDesktop: ein Schaltflächensystem, Standard-Seitenränder, keine Chips für nicht verfügbare

    Funktionen.

    Ein Schaltflächensystem über alle Ansichten, Standard-Seitenränder, und die Chips für nicht verfügbare Funktionen sind entfernt.

  • GeändertBetaDesktop: Redirect generator und Snippet editor wandern in den Bereich Tools.

    Methods enthält nur noch den Methodenkatalog und zeigt beim Öffnen den gewählten Scan. Der Snippet editor wählt vorab den Kontext des gewählten Scans.

13. Oktober 2026

3 geändert
  • GeändertFunktioniertDesktop Crawler: URL-Detail-Tabs über die Crawl-Datei (inlinks, outlinks, resources,#1349

    snippet, saved source, head…

    Desktop Crawler: URL-Detail-Tabs (inlinks, outlinks, resources, snippet, saved source, headers) über die Crawl-Datei, Filter pro Tab mit Zählern, eine umfangreichere Übersicht mit Direktiven, eine Spaltenauswahl pro Tab, verbunden mit den Exportspalten, Sortierung per Kopfzeile, Kontextmenü und Tastaturnavigation. Neuer Scan kann seine Einstellungen als benanntes Crawl-Profil speichern.

    #1349 (Issue auf GitHub)
  • GeändertFunktioniertDesktop: tote Oberflächen.#1347

    Der Link-graph-Abschnitt liest Knoten-, Kanten- und Summen für verwaiste Seiten sowie eine paginierte…

    Desktop: tote Oberflächen. Der Abschnitt Link graph liest Knoten-, Kanten- und Summen für verwaiste Seiten sowie eine paginierte Knotentabelle aus dem Core-Befehl scan-graph statt aus einem Platzhalter. Issues listet die größten Prüfgruppen aus den Zählern des Cores pro Prüfung. Die URL-Tabelle zeigt und sortiert die Spalte Inlinks; fehlt bei einem Scan jede Linkbeobachtung, erscheint ein Hinweis. Die nie messbare Spalte Issue count wird nicht mehr angeboten. Export und Berichte führen den Core-Befehl scan-export für Seiten oder Befunde in CSV, XLSX, JSON oder XML in einen gewählten Ordner aus. Die Vergleichs- und Task-Datensätze, der Spalten-Platzhalter und der Export-Verlauf, den der Core nicht stützen kann, sind entfernt. Gespeicherte, aber noch nicht angewendete Einstellungen sind jetzt sichtbar deaktiviert, mit dem Grund beim Hovern. Der Dialog zur Crawl-Konfiguration listet Parameter ohne validierten Editor einmalig und schreibgeschützt auf, statt sie in die Editorliste zu mischen. Das Feld Why this scan im Neuen Scan erklärt, warum es leer ist.

    #1347 (Issue auf GitHub)
  • GeändertFunktioniertDesktop: tote Oberflächen.#1347

    Der Bereich Crawler startet jetzt einen Ad-hoc-Crawl ohne Projekt. Das Adressfeld, der Umschalter Site/List/Sitemap, das URL-Limit, Start/Stop, die Prüf-Tabs, die Adresssuche, die Übersichtszähler, der Detailbereich und der CSV/XLSX-Export sind an die Core-Befehle crawl-site --scan-out und scan-url-query angebunden. Die Statusleiste zeigt die eigenen Werte des Cores zu Geschwindigkeit, gecrawlt und verbleibend. Beim Öffnen des Bereichs startet nichts. Das temporäre Ergebnis wird bei Clear, beim nächsten Crawl und beim Beenden der Anwendung entfernt. Die Einträge des Quick-Crawl-Menüs öffnen den Bereich. Das Badge „Unavailable in this core version“ in der Kopfleiste ist entfernt. Compare öffnet nach dem Lesen eines Projekts nicht mehr im Fehlerzustand: Ein geleerter Vergleich ist ein neutraler Hinweis, zwei Scans zu wählen. Nur ein echter Fehler zeigt den Zustand „nicht verfügbar“.

    #1347 (Issue auf GitHub)

12. Oktober 2026

8 hinzugefügt10 geändert2 behoben
  • BehobenFunktioniertFix: Kompatibilität der nativen Scan-Konfiguration über Upgrades und Rollbacks hinweg.#1344

    Der bestehende Header und Fingerprint bleiben erhalten. Neue wirksame Optionen werden in einem versionierten Kontext gespeichert, und das bisherige Verhalten der Tracking-Parameter bleibt erhalten, wenn der Kontext fehlt. Beim Fortsetzen werden alle wirksamen Einstellungen vollständig geprüft. Nicht unterstützte oder inkonsistente Artefakte werden abgelehnt.

    #1344 (Issue auf GitHub)
  • BehobenFunktioniertFix: Erkennung von RDFa in gespeicherten Scans, damit relative Property-IRIs und fremde#1344

    Hosts kein Schema.org-Markup begründen…

    Die Erkennung von RDFa in gespeicherten Scans wird so korrigiert, dass relative Property-IRIs und fremde Hosts kein Schema.org-Markup begründen. Absolute Vokabular-IRIs und erkannte Präfixe bleiben erhalten. Die Deadline-Tests der Suche bleiben mit günstigen Fixture-Mustern begrenzt.

    #1344 (Issue auf GitHub)
  • GeändertFunktioniertKompakte Tabs der Projekteinstellungen bleiben im Fenster; weitere Einstellungen über ein#1315

    Überlaufmenü…

    Kompakte Tabs der Projekteinstellungen bleiben im Fenster, weitere Einstellungen sind über ein Überlaufmenü erreichbar. Der überflüssige Zeitplan-Auswähler wird ausgeblendet, wenn nur die Hauptseite verfügbar ist. Die Auswahl zwischen verknüpften Seiten bleibt in beiden Fenstergrößen erhalten. - Eine Vorschau des eigenen User-Agents erscheint nur, wenn der Wert vorhanden ist. Ein Voreinstellungsname wird nicht als tatsächlich gesendeter Header ausgegeben. Die konfigurierten Verzögerungsgrenzen des Schedulers bleiben erhalten. - Die Erstellung von Owner-Aufgaben wird nach einer Projektaktualisierung neu bewertet. Kompatible Wettbewerber-Läufe, die der Core geprüft hat, bleiben bei unabhängigen Checklisten-Revisionen erhalten. Bestätigung und Prüfung der aktuellen Revision bleiben für Schreibvorgänge Pflicht. - Die Bot-Verifizierung bleibt deaktiviert, bis gespeicherte Projektlogs verfügbar sind. Gewöhnliche Qt-Tabellenmodell-Aufrufe werden unterstützt. Gespeicherte Problemsummen werden getrennt von begrenzten URL-Stichproben und nicht gemessenen Prüfungen angezeigt. - Gebündelte Schriften werden pro Anwendung einmal registriert statt bei jedem Theme-Wechsel erneut als Duplikat.

    #1315 (Issue auf GitHub)
  • HinzugefügtFunktioniertNur-Schreib-Verwaltung von Anbieter-Zugangsdaten über den lokalen CLI-stdin-Kanal, mit#1343

    expliziter GSC-OAuth-Zustimmung…

    Nur-Schreib-Verwaltung von Anbieter-Zugangsdaten über den lokalen CLI-stdin-Kanal, expliziter Lebenszyklus der GSC-OAuth-Zustimmung und nur vorschauende Erkennung von Kontoressourcen. Die Wahl des Anbieters und Schreibvorgänge für MCP-Zugangsdaten bleiben an explizite Entscheidungen des Inhabers gebunden. - Begrenzte URL-Inspection-Befunde kommen in die projektgebundene SF-Ausgabe, hinter der expliziten Option --gsc-inspect. Dazu kommen eine lokale Kontingentbuchung pro Property und ein gespeicherter, allowlist-gefilterter Inspektionsverlauf. SF führt zudem gemessene Verläufe aus GSC, GA4, Metrika und Cloudflare zusammen, ohne implizite Anbieteraufrufe. Registrierte URL-Befunde gelangen in den regulären Problemstrom des Audits, während fehlende oder partielle Abdeckung ausdrücklich benannt wird. - Cloudflare-Tagesaggregat-Snapshots pro URL, expliziter Enterprise-Logpull-Import, ein vom Aufrufer gelieferter Logpush-NDJSON-Import über den lokalen Logspeicher sowie optionale, schreibgeschützte Lesezugriffe auf KI-Einstellungen, Redirect-/WAF-Regelsätze und Logpush-Jobs. Eine separat bestätigte, planabhängige Erfassung über Instant Logs nutzt eine kurze, begrenzte WebSocket-Sitzung und speichert nur ein gedeckeltes lokales Präfix. Die Route lässt bestehende Sitzungen unberührt und meldet das dokumentierte Leerlauf-Ablaufdatum von Cloudflare, weil die Edge-API keinen Stopp-Endpunkt bietet. Logpush-Ziel-Streams bleiben im Besitz des Kunden und werden nicht eingelesen. - Ein expliziter aktueller Moz-JSON-RPC-Backlink-Vorgang kommt hinzu, während die bisherigen URL-Metriken Standard bleiben. Unsichere Ausgabenbelege bleiben in den Journal-Berichten null. - Ein begrenzter Leser für PageSpeed-Artefakt-Zusammenfassungen prüft die Zugehörigkeit und liefert nur Lighthouse-Felder aus einer Allowlist.

    #1343 (Issue auf GitHub)
  • GeändertFunktioniertBenannte Crawl-Profile lassen sich als validiertes JSON prüfen, über seo_crawl_site#1299

    auswählen und als Projektstandard setzen…

    Benannte Crawl-Profile lassen sich als validiertes JSON prüfen, über seo_crawl_site auswählen und als Standard eines Projekts festlegen. Projektspezifische Crawl-Overrides liegen darüber. - Der Crawl-Fortschritt schätzt die Zeit für die aktuell bekannte Warteschlange und kennzeichnet sie getrennt von der Gesamtdauer des Crawls. Crawl-Ziele normalisieren utm_*- und fbclid-Parameter standardmäßig. - Aktive native Projekt-Scans nehmen einmalige Pause- und Stopp-Anfragen per Run-ID und Checkpoint über den bestehenden SQLite-Wiederherstellungspfad an. - Host-gebundene HTTP-Basic-/Digest-Authentifizierung und optionale zstd-Antwortaushandlung nutzen Umgebungsreferenzen, ausdrückliche Bestätigung, Authentifizierung nur über HTTPS und Anfragebudgets. Crawl-Ergebnisse enthalten begrenzte Lastschätzungen und behalten eine unbekannte Plattengröße als null bei.

    #1299 (Issue auf GitHub)
  • HinzugefügtFunktioniertBetriebliche Projektstatus-Zusammenfassung: Sammler-Fortschritt, Vollständigkeit des#1291

    letzten Scans, Ordnerzustand…

    Neue betriebliche Projektstatus-Zusammenfassung mit Fortschritt aktiver Sammler, Vollständigkeit des letzten Scans, Ordnerzustand, offenen Aufgaben des Hauptprojekts, zuletzt erfasster Agentenaktivität und gespeicherter Größe des Scan-Verzeichnisses. Der Verbindungsstatus bleibt unbekannt, solange kein Live-Heartbeat vorliegt.

    #1291 (Issue auf GitHub)
  • HinzugefügtFunktioniertMaschinenlesbarer core-info-Vertrag mit verifizierter Build-Revision/-Zeit, unterstützten#979

    CLI- und MCP-Tools…

    Neuer maschinenlesbarer core-info-Vertrag mit verifizierter Build-Revision und -Zeit, unterstützten CLI- und MCP-Tools sowie exakter Revisionskompatibilität für die Desktop-App. Dazu ein rein lesender allgemeiner Befehl doctor und ein MCP-Tool für lokale Voraussetzungen. seohead --version gibt die Paketversion aus. - Neu sind revisionsbewusste, opake bedingte Lesevorgänge für project-observe und project-activity. Außerdem gibt es Release-Prüfungen mit Zustimmung und prüfsummenverifizierte Downloads von Wheel- und Quellpaketen, mit Fortschritt, Abbruchmöglichkeit und ohne automatische Installation.

    #979 (Issue auf GitHub)
  • HinzugefügtFunktioniertVorab-Schätzungen für kostenpflichtige Stufen und Statusverlauf je Stufe in#1298

    semantic-core-Projekten.

    Vorab-Schätzungen für kostenpflichtige Stufen und ein Statusverlauf je Stufe in semantic-core-Projekten. - Unterstützt werden zugeordnete CSV-/XLSX-Importvorschauen, gefilterte Exporte, seitenweise Cluster-Lesevorgänge, geprüfte Auswahl der Landingpages und lokale, belegbasierte Insights.

    #1298 (Issue auf GitHub)
  • HinzugefügtFunktioniertGerenderte Crawls erhalten begrenzte Seitenaktionen und Presets, die jedes Projekt selbst#1302

    aktiviert.

    Gerenderte Crawls erhalten begrenzte, projektweise aktivierbare Seitenaktionen und Presets. Dazu kommen gespeicherte Unterschiede zwischen Roh- und gerendertem DOM sowie Browser-Netzwerkfehler. Aus den erfassten gerenderten Layouts werden Befunde zu mobilem Überlauf, Textgröße und Zielgröße abgeleitet. Außerdem gibt es einen Screenshot des ersten sichtbaren Bereichs und eine ausdrückliche Metadatenangabe zur DOM-Darstellung.

    #1302 (Issue auf GitHub)
  • HinzugefügtFunktioniertExakte Zustände checks_run, checks_skipped, checks_disabled und Registersummen in#1296

    gespeicherten Scan-Nachweisen…

    Gespeicherte Projekt-Scan-Nachweise enthalten exakte Zustände checks_run, checks_skipped, checks_disabled und Registergesamtwerte. Ausgewertete und übersprungene Zählungen bleiben disjunkt, und fehlende Audit-Abdeckung wird als nicht verfügbar gemeldet. - Gespeicherte Scans zeigen begrenzte statische und gerenderte HTML-Fenster mit Scan- und Dokumentidentität, Hashes des rohen Bodys und des dekodierten Texts sowie Befundseiten für exakte URLs über die gemeinsamen CLI- und MCP-Handler. Die URL-Detailansicht enthält ein begrenztes Quell-HTML-Fenster. Nicht verfügbare und mehrdeutige Nachweise bleiben ausdrücklich sichtbar. Der Body-Vergleich unterstützt statische/gerenderte Paare ebenso wie Vergleiche zwischen Scans. - Der Scan-Status meldet den Integritätszustand, den betroffenen Scan, die Verfügbarkeit von Checkpoints und Schadenszähler, die auch null sein können. Portable Projektarchive können alle HTML-Bodies weglassen, Bodies älter als 30 oder 90 Tage auslassen oder nur die neuesten N erkannten Scans behalten. Die Evidenztabellen bleiben dabei erhalten.

    #1296 (Issue auf GitHub)
  • GeändertFunktioniertErweiterte URL-Abfragen gespeicherter Scans: Linkzähler, Filter für#1295

    Title/Canonical/hreflang/Sitemap und quellenbewusste Facetten…

    Erweiterte URL-Abfragen gespeicherter Scans mit Zählern für erhaltene Links, Filtern für Title, Canonical, hreflang und Sitemap sowie quellenbewussten Facetten. Fehlende Messungen für Links, Sitemap, hreflang oder Audit bleiben als nicht verfügbar ausgewiesen und erscheinen nie als Null. - Optionale Schweregrade und Prüfzähler über den gesamten Scan aus der gespeicherten Audit-Zusammenfassung, mit ausdrücklichen Zuständen für ausgelöst, still, übersprungen, deaktiviert und nicht verfügbar. - Ein wiederaufbaubarer Index der kürzesten Klicktiefe wird gespeichert, wenn ein scan.v2-Capture oder eine Offline-Neuanalyse abgeschlossen ist. Ältere Scan-Dateien leiten die Tiefe weiterhin aus ihrem gespeicherten Linkgraphen ab, innerhalb des Abfragebudgets. - Ressourcen-Filter nach Art und URL, gebunden an das Quelldokument, Vorkommens- und Typzähler, Zustände für gespeicherte Bytes sowie Block- und Gewichtsaggregate in den gespeicherten Ressourcennachweisen. Nicht deklarierte Ressourcen und partielle Ladegewichte bleiben ausdrücklich sichtbar. - HTTPX-Zeiten für TCP-/Verbindungsaufbau, TLS, Wartezeit auf Antwortheader und Body-Download werden in scan.v2 erfasst, wenn der Transport Trace-Events ausgibt. DNS bleibt nicht verfügbar, weil HTTPX kein eigenes Resolver-Ereignis liefert; die Zeit kann im Verbindungsaufbau enthalten sein. Offline steht headers-analyze für gespeicherte, geschwärzte Header und Phasennachweise bereit. - Ein CLI- und MCP-Lesevorgang der Verzeichnisstruktur nutzt temporäre SQLite-Aggregation mit begrenzter Tiefe, Kinderzahl, Knotenzahl und Ausgabegröße. Bestehende Lesevorgänge für den kürzesten Pfad bleiben über scan-link-inspect --view path verfügbar. - scan-link-inspect --view links --preset inlinks|broken_links liefert benannte Ansichten für interne eingehende Links und defekte ausgehende Ziele. - Native scan.v2-Finalisierung und Offline-Neuanalyse versuchen jetzt eine optionale, an die Quelle gebundene indizierte URL-Abfrageprojektion für Ressourcenzahlen und -arten der Seite, Markierungen doppelter Titles, Abdeckung und ungefilterte Facetten. Lesevorgänge nutzen sie nur für einen abgeschlossenen Scan mit passender Scan-UUID, Evidence-Revision, Fähigkeiten und Start-URL. Ein Requeue macht die Veröffentlichung ungültig. Ältere Scans behalten den schreibgeschützten, begrenzten Fallback, ohne Migration von scan.v1. Am synthetischen Fixture mit einer Million Seiten, geteiltem HTML und Bildern dauerte die echte Projektion 6,36 s bei 400,7 MB Spitzen-RSS. Fünf-Lauf-Mediane lagen bei 5,23–43,38 ms für Seiten mit Ressourcenspalten, 60,81 ms für den Bildfilter und 5,38 ms für alle Facetten, innerhalb des Budgets von 200/300 ms. 100 Bildzeilen waren exakt. Das validiert die Abfrage-Performance synthetischer gespeicherter Scans, nicht einen Live-Crawl mit einer Million URLs. Inlinks- und Sitemap-Facetten blieben ausdrücklich nicht verfügbar, daher war die Facettenantwort partiell.

    #1295 (Issue auf GitHub)
  • GeändertFunktioniertProjekt-Checkliste v4 mit Zuständigen, Akzeptanzkriterien, Befund- und Methodenlinks,#1294

    begrenzten Wettbewerber-URLs…

    Projekt-Checkliste v4 enthält Zuständige, Akzeptanzkriterien, Verknüpfungen zu Befunden und Methoden, begrenzte Obergrenzen für Wettbewerber-URLs sowie nur anfügbare, zugeordnete Aufgabenkommentare. Frühere Abdeckungsformate werden weiterhin gelesen. - Die Annahme eines Inbox-Ziels legt die stabile benutzerdefinierte Checklisten-Aufgabe an, mit dem ursprünglichen Ziel als Beschreibung. Die Annahme führt die Aufgabe weder aus, noch schließt sie sie ab. - Aufgaben- und Berichtsansichten zeigen ehrliche, aufgabenbezogene Messzustände für betroffene URLs sowie KPIs eigener Aufgaben. Zählungen bleiben nicht verfügbar, wenn die gespeicherten Belege die betroffenen URLs nicht auflisten.

    #1294 (Issue auf GitHub)
  • GeändertFunktioniertProjektgebundene Markdown-, DOCX- und XLSX-Berichte mit Zählern eigener Aufgaben,#1297

    Zuweisung und Akzeptanz…

    Projektgebundene Berichte in Markdown, DOCX und XLSX enthalten Zähler eigener Aufgaben, Felder für Zuweisung und Akzeptanz sowie optionale Nachweise zu betroffenen URLs mit ihrem Messzustand.

    #1297 (Issue auf GitHub)
  • HinzugefügtFunktioniertMCP-Tool-Katalog mit Kategorie- und Projektbezug, Offset-Paging und begrenzte#1312

    URL-Prüfungs-Batches.

    Kategorie- und Projektbezug als Metadaten mit Offset-Paging für den MCP-Tool-Katalog. Dazu ein begrenzter URL-Prüfungs-Batch für explizite Listen oder gespeicherte Scan-Seiten. - Automatische Bildqualitätsprüfung mit SSIM-Führung, explizites Entfernen von EXIF-Daten und Optimierungsberichte für gespeicherte Scans. WordPress-Redirection-CSV-Ausgabe mit lokaler Analyse von Ketten und Schleifen. - Die älteren Flags für Crawl-Tiefe und Verzögerung werden in der Hilfe angezeigt, ihr Kompatibilitätsverhalten bleibt erhalten.

    #1312 (Issue auf GitHub)
  • HinzugefügtFunktioniertBegrenzte compare.v2-Stream-Lesevorgänge mit Integritätsprüfung, Sortierung und#1300

    URL-Filter; erzeugt eine Markdown-Zusammenfassung…

    Begrenzte compare.v2-Stream-Lesevorgänge mit Integritätsprüfung, Sortierung und URL-Filter. Erzeugt eine begrenzte Markdown-Zusammenfassung und exakte Vorher-/Nachher-Karten je URL. Fehlende Beobachtungen bleiben als nicht erneut geprüft erhalten. Der gespeicherte URL-Verlauf wird um Seitenfakten und Deltas zwischen benachbarten Scans erweitert. Nicht verfügbare und fehlende Beobachtungen bleiben nicht vergleichbar. Compare-Checkpoints und Fortschrittsstände werden für die Wiederaufnahme bei exakt gleichen Eingaben gespeichert. Verifizierte abgeschlossene Pakete werden als Cache-Treffer wiederverwendet. Pro Änderung gibt es Scheiben des primären Segments sowie gespeicherte Nachweise der HTTP-Antwortcodes externer Links.

    #1300 (Issue auf GitHub)
  • GeändertFunktioniertDer Reader für gespeicherte strukturierte Daten pro exakter URL erhält begrenztes#1304

    JSON-LD, Microdata, RDFa…

    Der Reader für gespeicherte strukturierte Daten pro exakter URL wird um begrenztes JSON-LD, Microdata und RDFa, Sprachbelege, Quellherkunft und lokale Offline-Validierung nach Schema.org erweitert.

    #1304 (Issue auf GitHub)
  • GeändertFunktioniertGespeicherte Inhaltssuche: begrenzte Vorkommen mit Zeichen-Offsets im Quelltext, Zeilen#1301

    und Treffer-Navigation pro Dokument…

    Die gespeicherte Inhaltssuche meldet begrenzte Vorkommen mit Zeichen-Offsets im Quelltext, einbasierten Zeilennummern, Treffer-Navigation pro Dokument und optional geschwärzten Sechs-Zeilen-Fenstern. Die Filterung nach exakter URL läuft, bevor SQLite die gespeicherten Dokumente rankt. Vollständige Trefferzahlen bleiben sichtbar, wenn das Limit von 10.000 Offsets oder 64 KiB pro Datensatz die zurückgegebenen Vorkommen kürzt; die Abdeckung ist dann partiell. Regex-Suchen sind nicht verfügbar, wenn eine Zeitgrenze nicht durchgesetzt werden kann. Nicht verfügbare Bodies bleiben unbekannt, nie fehlend. - Indizierte Suchpakete sind auf 512 MiB begrenzt. Wird das Limit erreicht, wird ein ausdrücklich unvollständiges Paket mit der gemessenen Abdeckung und dem Byte-Limit veröffentlicht. - Neue Offline-Route für Beispiele eigener Extraktion mit vom Aufrufer gelieferten HTML-Dateien. Die optionale URL ist nur ein Etikett und löst keinen Abruf aus. Das Abrufen von Live-URLs bleibt eine Entscheidung des Inhabers.

    #1301 (Issue auf GitHub)
  • GeändertFunktioniertSnippet-Edit-CSV-Zeilen als nicht angewendete Prüfaufgaben importieren, lokale Typografie#1010

    nach Profil messen…

    Snippet-Edit-CSV-Zeilen werden als nicht angewendete Prüfaufgaben importiert. Lokale Typografie wird nach einem vom Aufrufer vorgegebenen Profil gemessen. Abfrage-Auszüge aus ausdrücklich gewählten gespeicherten Scans werden mit Dokumentherkunft ergänzt. Keine Schwelle einer Suchmaschine und keine Aussage zum Rendering wird abgeleitet.

    #1010 (Issue auf GitHub)
  • GeändertFunktioniertGespeicherte native Crawls vergleichen Antwort-Bodies über eine begrenzte Menge#1013

    erkennbarer Content-Type-Familien…

    Gespeicherte native Crawls vergleichen die aufbewahrten Antwort-Bodies über eine begrenzte Menge erkennbarer Content-Type-Familien. Nicht verfügbare, zu große und mehrdeutige Bodies bleiben ausdrücklich unvermessen.

    #1013 (Issue auf GitHub)
  • GeändertFunktioniertNative Analyse gespeicherter Bilder meldet fehlende oder ungültige Größenangaben und#1303

    informative oder fehlerhafte leere Alt-Texte

    Die native Analyse gespeicherter Bilder meldet fehlende oder ungültige Größenangaben sowie informative oder fehlerhafte leere Alt-Texte. Gültige dekorative alt=""-Attribute bleiben erhalten. Komplett fehlende alt-Attribute bleiben Befunde mit einem ARIA-Namen. Sichtbare dekorative Bilder brauchen weiterhin Größenangaben. - Bildbefunde behalten Umfang (Quelle, Ziel, Status), Grund, Dokument und begrenzte Ordinal-Positionen. Fehlende Bodies bewahren bekannte positive Seitenzahlen, ohne eine Bild-URL oder eine Ressourcenantwort zu erfinden. Antwortfehler bei Bildern und Byte-Schwellen behalten Status und Grund. - Die Bildauswahl löst nach dem Wiederöffnen die Quellseiten auf. Ressourcennachweise nennen die gespeicherten Abruf- und Deklarationszeilen neben den Quelldokumenten. Die Identität nativer Bilder umfasst Quellseite und Umfang. Dadurch werden Bilder über Seiten hinweg absichtlich nicht zusammengefasst, und ältere native Bild-Fingerprints werden migriert. Ältere Befunde ohne Quellseite behalten ihre bisherige Identität. Wiederholte Elemente behalten exakte Zählungen und begrenzte Positionsstichproben. - Der synthetische Shop bewahrt die ursprünglichen Defekte und 15 Kontrollfälle. Er ergänzt informative leere Alt-Texte sowie fehlende Größenangaben bei vorhandenen Produkten, ohne die Crawl-Zahlen zu verändern.

    #1303 (Issue auf GitHub)

11. Oktober 2026

16 geändert
  • GeändertFunktioniertDie gesamte Toolkit-Suite läuft einmal auf Python 3.15 statt in einer Matrix älterer

    Versionen; vier Testgruppen bleiben.

    Die gesamte Toolkit-Suite läuft einmal auf Python 3.15 statt in einer Matrix älterer Versionen. Vier geprüfte Testgruppen und die kombinierte Abdeckung bleiben erhalten. CI und Bootstrap der Release-Builds verwenden dieselbe stabile Python-Version.

  • GeändertFunktioniertGespeicherte Audit-Prüfungen und native Desktop-Verbesserungen konsolidiert.

    Die gespeicherten Audit-Prüfungen und die nativen Desktop-Verbesserungen werden konsolidiert. Ressourcen-Budgeteinstellungen bleiben erhalten, ohne den eingefrorenen Scan-Header zu verändern. Sichere Offline-Neuanalyse und Wiederaufnahme bleiben erhalten. Die nativen Komponenten der Projekteinstellungen, Theme-Tokens und gebündelten Schriften werden gemeinsam genutzt. Private Designvorlagen werden aus dem verteilten Baum entfernt. - Behebungs-Re-Checks werden an die validierte wirksame Asset-Richtlinie gebunden, während der ursprüngliche Scan-Header und die Quellbytes unverändert bleiben.

  • GeändertFunktioniertProjekteinstellungen „Schedule“ und „Crawl“ neu aufgebaut: gemeinsame native#1323

    Canvas-Komponenten, Roboto und Material Symbols offline

    Die Projekteinstellungen Schedule und Crawl werden mit gemeinsamen nativen Canvas-Komponenten, offline Roboto-Schriften und Material Symbols neu aufgebaut, bei 800 px einspaltig. - Die gesamte Anwendungsoberfläche ist auf Englisch. Bestehende Zeitplan-Befehle und Dokumentverträge bleiben erhalten, und es werden nur vom Core gestützte Zeitplandaten angezeigt. - Workspace-Identitäten und Aliasse bleiben erhalten, während die Projekteinstellungen geöffnet sind. Doppelte Speichervorgänge werden verhindert, während der Core antwortet.

    #1323 (Issue auf GitHub)
  • GeändertFunktioniertDesktop-Projekteinstellungen erhalten einen Schedule-Tab (Wochentage, Monatstage,#1322

    Laufzeitfenster, Zeitzone …

    Desktop-Projekteinstellungen erhalten einen Schedule-Tab (Wochentage, Monatstage, Laufzeitfenster, Zeitzone, Wettbewerber) und einen Crawl-Tab (Crawl-Modus, User-Agent-Voreinstellung oder eigener String, Pause zwischen Anfragen, URL-Budget, SpiderHeadBot oder eigener User-Agent). Beide lesen und schreiben das Projekt über den Core. Die Projektübersicht zeigt den nächsten und letzten geplanten Lauf. Ein Modus --tray führt die fälligen Scans des Cores aus und hält den Mac nur während eines laufenden Scans wach.

    #1322 (Issue auf GitHub)
  • GeändertFunktioniertNative Audits zeigen renderblockierendes Head-Markup aus vollständigem gespeichertem#1303

    HTML, ohne das Schema zu ändern…

    Native Audits zeigen renderblockierendes Head-Markup aus vollständigem gespeichertem HTML, ohne das eingefrorene Schema scan.v1 zu ändern. Fehlende, unvollständige und durch Budgets begrenzte Bodies bleiben nicht verfügbar. Die bestehende Erkennung von Head-Ressourcen und die SF-Eingabe für benutzerdefinierte Extraktion werden wiederverwendet. - Konfigurierbare Budgets für beobachtete Navigation und einzelne Ressourcen in Bytes, Signale zu Cache- und Font-Auslieferung, Heuristiken zu Minifizierung und Legacy-Skripten sowie exakte Duplikate von Skripten auf derselben Seite aus gespeicherten scan.v2-Nachweisen. Nicht abgerufene Daten und unvollständige Laufzeit-Payloads bleiben ausdrücklich. Responsive Deklarationen werden nicht als Laufzeitgewicht summiert. Nur-HTML-Untergrenzen, skalare Abdeckungszahlen, Font-Stichproben und Quellzusammenfassungen bleiben ausdrücklich und begrenzt. - Auf angeforderten Renderings werden begrenzte präzise JS-/CSS-Abdeckungsdaten aus Chromium erfasst, außerdem UTF-16-Nutzungszusammenfassungen und Befunde zur Bildgrößen-Angabe im Rendering. Sie werden beim Wiederöffnen oder bei der Offline-Neuanalyse gelesen. Nicht unterstützte Engines und fehlende Messungen gelten nicht als saubere Ergebnisse. - Begrenztes, passendes Lighthouse-JSON pro URL wird akzeptiert für LCP-Erkennung, Abhängigkeitsbäume, Verursacher von Layout-Verschiebungen, Bildauslieferung, erzwungenes Reflow und Befunde zur Skriptausführung, mit Herkunft der Erfassung und Eingabe-Hashes. Es kommen kein Lighthouse-Prozess, kein kostenpflichtiger Anbieter und keine Ableitung von Felddaten-CWV hinzu. Register, SF-Abdeckung und generierte Referenzdokumentation werden aktualisiert. - Zusätzliche Asset-Schwellen bleiben aus dem eingefrorenen nativen Scan-Header ausgeschlossen. Ihre exakten Werte werden in einem validierten, versionierten Laufkontext gespeichert. Die Wiederaufnahme vergleicht diese Werte separat, und die Offline-Neuanalyse stellt sie aus den gespeicherten Nachweisen wieder her. Ältere schlanke Leser können die unveränderte Form der Header-Konfiguration weiterhin prüfen.

    #1303 (Issue auf GitHub)
  • GeändertFunktioniertDokumentgebundene statische AMP- und Barrierefreiheits-Nachweise in bestehenden#1304

    Scan-Kontextzeilen speichern

    Dokumentgebundene statische AMP- und Barrierefreiheitsnachweise werden in bestehenden Scan-Kontextzeilen gespeichert, ohne das SQL-Schema scan.v1 zu verändern. Strukturelle AMP-Befunde prüfen den ursprünglichen Doctype, Head und Body, den UTF-8-Zeichensatz, den Viewport, das Laufzeitskript und die Boilerplate-Deklarationen. Gepaarte AMP-Ziele ohne AMP-Root-Marker werden gesondert erkannt. Vollständige AMP-Validator-Regeln bleiben bis zur Lizenzentscheidung nicht verfügbar. - Befunde zur Barrierefreiheit werden für Dokumentsprache, Formularbeschriftungen, Bildalternativen, Überschriftensprünge und das Hauptlandmark gestartet. Befunde behalten begrenzte Beispiele und vollständige Vorkommenszahlen. Berechneter Kontrast und gerenderte axe-core-Regeln bleiben unvermessen. - Schema.org-Microdata und gängige RDFa-Subjekte und -Eigenschaften werden mit dem mitgelieferten Vokabular und den bestehenden Regeln für Rich Results validiert. Gespeicherte Fehler, Warnungen und fehlende Pflichteigenschaften pro URL werden zu nativen Befunden. Nicht unterstützte RDFa-Konstrukte gelten als ausdrücklich partielle Nachweise, nicht als sauberes Validierungsergebnis. - scan-structured-blocks liefert geparste JSON-LD-Bäume mit Quelle, Position und Syntaxfehlern je Block. Breite Eigenschaftsbäume werden begrenzt, und ihr Limit wird angezeigt. Das neueste Dokument für eine angeforderte URL und Darstellung wird gelesen, ohne den Scan zu verändern. - Partielle oder nicht verfügbare strukturierte Nachweise bleiben erhalten, ohne bestätigte Fehler der Nachbarn zu verdecken. Unterstützte JSON-LD-Identitäten werden gegen dieselbe Dokumentbasis wie HTML-Markup aufgelöst, unter Beibehaltung des Quell-JSON. Skalare und leere JSON-Blöcke gelten nicht als gültige Graphen. Die normalisierte Auswahl von Live-JSON-LD-Tags wird zwischen Parser und ausgelieferter Projektion geteilt.

    #1304 (Issue auf GitHub)
  • GeändertFunktioniertRohe Canonical- und Paginierungsattribute als versionierter Dokumentkontext speichern,#1305

    ohne das eingefrorene Scan-SQL zu ändern

    Rohe Canonical- und Paginierungsattribute werden als versionierter Dokumentkontext gespeichert, ohne das eingefrorene SQL des Scans zu ändern. Canonical-Links mit nicht unterstützten hreflang-, lang-, media- oder type-Attributen, fehlerhafte Annotationen sowie Deklarationen über Hosts oder Protokolle hinweg führen zu belegbezogenen Befunden. Unbekannte, aber wohlgeformte Relationsschlüsselwörter bleiben unklassifiziert. - Begrenzte Ziel-Prüfungen auf demselben Host werden auf die Paginierung erweitert, und gemessene noindex-/canonical-Beobachtungen werden gespeichert. Native Canonical-Ketten und Befunde zu noindex bei Canonical/hreflang können Prüfungen nutzen. Ältere Prüfungen nur mit Status bleiben lesbar, ohne HTML-Direktiven als gemessen zu gelten. - Undurchsichtige native Paginierungsketten werden auf explizite, wechselseitige Widersprüche in next/prev beurteilt. Nummerierte Regeln und Schrittweiten werden gespeichert, benannte nicht beurteilte Zustände ausgewiesen. Gespeicherte Befund-URLs, auch gruppierte Mitglieder, werden über scan-url-query mit temporären SQLite-Tabellen ausgewählt und als audit.v2-Nachweise gestreamt. - Unbekannte Unicode- und Satzzeichen-Relationstoken bleiben unklassifiziert. Äquivalente IDN- und Standardport-Autoritäten bei Canonical werden normalisiert, und exakte Zielpfade der nativen Paginierung bleiben erhalten. Nicht lesbare gemischte Seitenmarkierungen bleiben unbeurteilt. Der Paginierungsfehler des Shops wird auch erkannt, wenn Seite eins keine Zahl in der URL hat. - Die deklarierten next/prev-Annotationen des Shop-Fixtures werden gerendert, damit seine D41-Paginierungs-Ground-Truth tatsächlich ausgeliefert und durch die native Erfassung validiert werden kann.

    #1305 (Issue auf GitHub)
  • GeändertFunktioniertServerlogs speichern exakte, auf dem Datenträger gehaltene Bot-IP-Summen statt einer#1311

    gedeckelten Stichprobe

    Serverlogs speichern jetzt exakte, auf dem Datenträger gehaltene Bot-IP-Summen statt einer gedeckelten Stichprobe, mit begrenzten Datensätzen je IP, Besuchen, letztem Besuch und Subnetz-Filtern. Eine ausdrückliche DNS-Prüfung checkt jede ausgewählte IP einzeln, erfasst PTR- und Vorwärts-Nachweise, unterstützt IPv6 und behält Ergebnisse von „nicht verfügbar“ und Zeitüberschreitungen als ungeprüft bei. Lokale Caches laufen nach einer Stunde ab, Lesevorgänge lösen nie DNS aus. - Neu sind der lokale Import von Projektlogs, eine paginierte Zusammenfassung, Bot-Nachweise und die Verknüpfung mit nativen Scans, über die gemeinsamen CLI- und MCP-Handler. Getrennte Log-Artefakte behalten Datums-Partitionen sowie Abdeckungs- und Herkunftsangaben, ohne die eingefrorenen Scan-Schemata zu verändern. Fehlende oder unvollständige Nachweise verhindern Schlussfolgerungen über Abwesenheit. Die Log-Ansichten der Desktop-App folgen separat.

    #1311 (Issue auf GitHub)
  • GeändertFunktioniertNative Audits gruppieren defekte interne Links nach beobachtetem Ziel mit Quell- und#1306

    Ankerbelegen, Weiterleitungsketten…

    Native Audits gruppieren defekte interne Links nach beobachtetem Ziel mit Quell- und Ankerbelegen, erfassen Weiterleitungsketten und Schleifen mit Status je Hop, unterscheiden pfadbasierte interne Suche und leere Anker und zeigen erfasste Ergebnisse ohne Antwort bei externen Links. Befunde zur Konsistenz von Sitemap und robots.txt nutzen gespeicherte Mitgliedschaft und Antwortbelege ohne Live-Abrufe. Fehlende und partielle Belege bleiben ausdrücklich. - Ein begrenzter Linkgraph gespeicherter Scans mit Filtern nach Position, Abschnitt und lokaler Nachbarschaft, Aggregation pro Abschnitt und Kantenänderungen zwischen Scans. Die Offline-Neuanalyse ergänzt Positionen über wiederaufnehmbare abgeleitete Batches und meldet nicht klassifizierte Belege in der Linkprüfung und im Scan-Status. Das eingefrorene Schema scan.v1 bleibt unverändert. - Lokale XML-Sitemap-Erzeugung aus kanonischen, indexierbaren gespeicherten 200er-Seiten mit beobachtetem lastmod, Ausschlüssen, Protokollaufteilung, Sitemap-Index und optionaler Bild-Sitemap. CLI und MCP nutzen dieselbe Implementierung. Die Veröffentlichung verlangt ein frisches lokales Verzeichnis und deployt nie Dateien. - Zum Zeitpunkt der Erfassung fehlende Discovery-Ziele bleiben erhalten, wenn spätere Sitemap- oder Seed-Verarbeitung die URL in den gespeicherten Katalog aufnimmt. Erklärte nicht aufgelöste oder ausgeschlossene Belege bleiben unveränderlich. Beanspruchte bekannte Ziele und nicht leere Identitätsabweichungen bleiben ungültig. - Bild-Sitemaps schließen bekannte Nicht-200-Antworten von Ressourcen aus, auch wenn die Ressource nicht als gecrawlte Seite gespeichert wurde. Nicht gemessene Bildantworten werden als partielle Abdeckung markiert.

    #1306 (Issue auf GitHub)
  • GeändertFunktioniertGoogle-DataForSEO-Produktionsaufrufe vor dem Client-Aufbau prüfen,#1310

    Offline-Kostenschätzungen und USD-Obergrenzen je Aufruf…

    Google-DataForSEO-Produktionsaufrufe werden vor dem Aufbau des Clients geprüft. Offline-Angebote aus den vom Nutzer gelieferten Anbieterpreisen werden angezeigt. SERP-Tiefe und Kosten für Suchoperatoren fließen ein, und bekannte USD-Obergrenzen je Aufruf werden vor dem Transport durchgesetzt. Begrenzte Backlink-Index-Vorgänge werden erweitert. Fehlende Kosten oder fehlerhafte Antwortstrukturen werden als unsichere Belege im Journal erfasst. Limits in Projekt- und Monatswährung bleiben bis zur Entscheidung des Inhabers offen. - Explizite Backlink-Quell- und Importbelege werden mit vollständigen rel-Token-Beobachtungen, Ankern, verweisenden Domains, Filtern und transparenten Spam-Prüfsignalen in private lokale Verlaufs-Snapshots zusammengeführt. Neu sind CLI- und MCP-Routen für Profil und geprüften Disavow-Export, ohne automatische Einreichungen. - Hinweise zu gemischten rel-Token und zu ausgehenden gesponserten Offenlegungen werden aus gespeicherten nativen Nachweisen erzeugt. Nicht verfügbarer Kontext bleibt erhalten. Anzahlen sind null, wenn HTML-Gesamtheiten gar nicht geparst wurden. Die Klassen sponsored, ugc und nofollow erscheinen in Berichten und Spenderprüfungen, ohne das eingefrorene Schema der gespeicherten Scans zu ändern.

    #1310 (Issue auf GitHub)
  • GeändertFunktioniertNative DOM- und Duplikatprüfungen lesen das gespeicherte Dokument jeder Seite über die#1307

    exakte URL

    Native DOM- und Duplikatprüfungen lesen jetzt das ausgewählte gespeicherte Dokument jeder Seite über die exakte URL, mit verifizierter Herkunft von Antwort und Body. Deaktivierte Speicherung sowie fehlende, ungültige oder über dem Budget liegende Bodies bleiben als ausdrückliche Auslassungen sichtbar. Partielle Befunde tragen ihre Abdeckung. Exakte Hashes des Inhaltsbereichs und begrenzte SimHash-/LSH-Befunde werden im nativen Audit gespeichert, ohne ein SF-HTML-Verzeichnis vorauszusetzen. Schwellenadaptive LSH-Bänder erhalten die Trefferquote qualifizierender Paare und verringern breite Kandidatenbuckets. Die Erschöpfung des Budgets für Nah-Analysen verwirft keine exakten Hash-Befunde. - SF-Audits führen optional eine semantische Ähnlichkeitsprüfung sowie einen Abgleich von Title und H1 mit dem gespeicherten Body durch, mit einem ausdrücklich angegebenen lokalen Adapter oder deklarierten Embeddings. Es wird kein Modell und kein Anbieter automatisch gewählt. Adapter-Identität, Quell-Hashes, Scores, Limits und Auslassungen begleiten die Prüfkandidaten. Semantische Ähnlichkeit behauptet weder Duplicate Content noch Abfragerelevanz oder Kannibalisierung. Die beiden semantischen SF-Abdeckungszeilen bleiben Lücken, bis ein echter Adapter gewählt und validiert ist. Eine Freigabe für externe Anbieter erfordert den wörtlichen Boolean true. Truthy-Strings oder Ganzzahlen erlauben keinen Embedding-Aufruf.

    #1307 (Issue auf GitHub)
  • GeändertFunktioniertInbox-Referenzen akzeptieren Ziel-IDs (inbox:<uuid>), damit eine Notiz das betroffene#1314

    Ziel zitieren kann. - Checklisten-Punkte, die nie versucht wurden und manuell sind, zeigen den Status not_run statt review. Nur ein Versuch, der auf eine Entscheidung wartet, bleibt bei review. - Das Read-Modell Issues (Nachweise aus observe) meldet Zählungen je Prüfung (by_check) und einen next_offset nach den ersten 20 Befunden. findings_page blättert durch den Rest.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertGeplante Projekt-Scans (#1322, Core): schedule.json im Verzeichnis jedes Projekts hält#1322

    den eigenen Zeitplan der Seite…

    Geplante Projekt-Scans (#1322, Core): schedule.json im Verzeichnis jedes Projekts enthält den eigenen, unabhängigen Zeitplan dieser Seite. Dazu gehören Wochentage und/oder Monatstage, ein Zeitfenster in der Zeitzone der Seite, Aktivierung oder Deaktivierung, Crawl-Modus spider, sitemap oder list, Budgets für URLs und Anfragen je Lauf, Verzögerung zwischen Anfragen, User-Agent und projektrelativer Stand der Wiederaufnahme je Abschnitt. Das Hauptprojekt kann verknüpfte Wettbewerber einbeziehen, jeder mit eigenem Takt und eigener Scan-Richtlinie. Einstellungen werden über schedule-set / seo_schedule_set mit expected_revision bearbeitet. schedule-show zeigt den Fälligkeitsstatus des Hauptprojekts und der verknüpften Wettbewerber sowie den nächsten Lauf. schedule-run-due ist ein kopfloser Einstiegspunkt. Er führt nur unabhängig fällige Scans aus, hält prozessgebundene Sperren bis zum Ende jedes Laufs, hält den Abbruchstatus fest, bevor er den Abbruch weiterreicht, und protokolliert Ergebnisse oder Überschneidungen von Wettbewerbern in jedem betroffenen Projekt. schedule-install und schedule-uninstall schreiben oder entfernen eine launchd-plist, eine cron-Zeile oder einen Task-Scheduler-Befehl nur auf ausdrücklichen Aufruf. - User-Agents für Crawls: Voreinstellungen (spiderhead, googlebot, googlebot-desktop, googlebot-smartphone, bingbot, yandexbot, yandexmobilebot, baiduspider, duckduckbot, applebot, gptbot, claudebot, perplexitybot sowie Desktop- und Mobil-Browser) oder ein eigener String. Der Standard ist jetzt SpiderHeadBot/<version> (+https://github.com/PavloSEO/spiderhead), und die Zuordnung der robots.txt-Gruppen nutzt dieselbe Kennung. Seiten, die bisher der robots-Gruppe SEOHEAD-Tools entsprachen, müssen SpiderHeadBot in ihren Regeln nennen.

    #1322 (Issue auf GitHub)
  • GeändertFunktioniertworkflow-start braucht nur ein angenommenes Owner-Ziel: --goal-id (oder#1314

    context.goal_id) reicht aus. Der registrierte Prompt ist standardmäßig skill:workflow/full-audit-v1, und die Checklisten-Aufgabe ist standardmäßig die, die das angenommene Ziel angelegt hat (custom:goal-<entry>). Ablehnungen nennen den Owner-Befehl, der die fehlende Verknüpfung behebt. Die Optionen sind in seohead workflow-start --help dokumentiert. - Checklisten-Populationen akzeptieren unvollständige Objekte: Nur kind und source sind Pflicht, die übrigen Schlüssel bleiben standardmäßig ungesetzt. Eine abgelehnte Population nennt ihre fehlenden oder unbekannten Schlüssel. - Native Projekt-Crawls greifen auf /sitemap.xml des Ursprungs zurück, wenn robots.txt keine Sitemap deklariert. Ein fehlender Fallback wird als unvollständig vermerkt, unterbricht den Crawl aber nicht.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertWettbewerber-Workspaces behalten die URL wie eingegeben: Der Crawl startet mit der#1314

    www-URL statt mit dem nackten Host…

    Wettbewerber-Workspaces behalten die URL so, wie sie eingegeben wurde. Ein Wettbewerber-Crawl startet mit seiner www-URL statt mit dem nackten Host. Ein Crawl einer Wettbewerber-URL markiert die Checklisten-Punkte des Hauptprojekts nicht mehr; das Ergebnis wird nur im eigenen Workspace des Wettbewerbers erfasst. Wird ein Projekt mit einem beschädigten Wettbewerber-Workspace geöffnet, meldet die Anwendung diesen Wettbewerber als nicht verfügbar, statt zu scheitern.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertDie Checklisten-Abdeckung bindet gestreamte audit.v2-Berichte: report-build --project

    und die Berichtsausgabe…

    Die Checklisten-Abdeckung im Projekt bindet jetzt gestreamte audit.v2-Berichte. report-build --project und audit-workflow --action report hängen den Checklisten-Snapshot an die Ausgabe in xlsx, docx, csv, md und PDF an, statt einen ungebundenen Bericht zu erzeugen. Ein Scan, der durch sein URL-Budget gestoppt wurde (stopped_by_budget), wird als letzter geprüfter Scan des Projekts akzeptiert. Sein Bericht nennt den begrenzten Umfang. report-build --input akzeptiert den Schlüssel format. report-build --project --format json bei einem gestreamten Audit wird mit einer Begründung abgelehnt, weil das JSON unverändert geschrieben wird und den Checklisten-Snapshot nicht tragen kann.

Geplant

Roadmap

108 offen

Offene Meilensteine auf GitHub. Jede Zeile ist ein offenes Issue: geplante Arbeit, noch nicht ausgeliefert.

Desktop-Grundlagen

10 von 14 geschlossen

Erst muss der Desktop laufen: Blocker, 800×600, tote Tabs, ehrliche Zustände (Welle 1 des Desktop-Plans)

  • HinzugefügtGeplantDesktop: Owner-Walkthrough an einem echten Projekt (Visuals, Scans, Issues, Exporte,#1358

    Tools)

    #1358 (Issue auf GitHub)
  • BehobenGeplantDesktop: tote Tabs, deaktivierte Aktionen und Platzhalter-Screens#1347 (Issue auf GitHub)
  • HinzugefügtGeplantWindows: nativer Crawl, Projektjournal und Desktop-Build schlagen fehl; Desktop erzeugt#1345

    leere Fenster und ist auf 4K unbenutzbar

    #1345 (Issue auf GitHub)

Desktop-Parität

19 von 34 geschlossen

UX-Muster auf Augenhöhe: Tabs, Spalten pro Filter, Drill-down aus der Übersicht, gespeichertes Layout (Epic #1522)

Crawl-Engine

9 von 51 geschlossen

Höflichkeit und Robots-Regeln, Wiederholungen, Budgets, URL-Erkennung, Speicher im großen Maßstab, Scan-Lebenszyklus (Epic #1520)

  • HinzugefügtGeplantCrawl-Seed aus einem Google Sheet#1527 (Issue auf GitHub)
  • HinzugefügtGeplantIm HTTP-Link-Response-Header gelieferte canonical- und Paginierungs-Annotationen#1517

    erfassen, inklusive Herkunft der Deklaration

    #1517 (Issue auf GitHub)
  • HinzugefügtGeplantLaufenden Crawl steuern: Scope live eingrenzen und URLs einspeisen#1485 (Issue auf GitHub)
  • HinzugefügtGeplantOptionales Crawling von Fragment-Identifier-Routen#1482 (Issue auf GitHub)
  • HinzugefügtGeplantAutomatische Obergrenze für parallel gerenderte Seiten nach verfügbarem Arbeitsspeicher#1480 (Issue auf GitHub)
  • HinzugefügtGeplantRendering-Fehler als eigenes URL-Ergebnis#1479 (Issue auf GitHub)
  • HinzugefügtGeplantShadow-DOM- und iframe-Inhalte in die Rendering-Erfassung einbeziehen#1477 (Issue auf GitHub)
  • HinzugefügtGeplantBrowser-Konsolenmeldungen je gerenderter URL erfassen#1475 (Issue auf GitHub)
  • HinzugefügtGeplantSchutz vor knappem Speicherplatz für den Scan-Speicher#1474 (Issue auf GitHub)
  • HinzugefügtGeplantKompatibilitäts-Fallback für Legacy-TLS-Server#1473 (Issue auf GitHub)
  • HinzugefügtGeplantKlassifizierter Netzwerkfehlergrund je URL#1472 (Issue auf GitHub)
  • HinzugefügtGeplantEntdeckungsquelle für jede gecrawlte URL festhalten#1471 (Issue auf GitHub)
  • HinzugefügtGeplantRelative Links gegen die Basis-URL des Dokuments auflösen#1470 (Issue auf GitHub)
  • HinzugefügtGeplantStabile Besuchsreihenfolge für reproduzierbare Crawls#1469 (Issue auf GitHub)
  • HinzugefügtGeplantCrawl-Budget nach Ebenen von flach nach tief verbrauchen#1468 (Issue auf GitHub)
  • HinzugefügtGeplantKlicktiefe folgt dem kürzesten Entdeckungspfad#1467 (Issue auf GitHub)
  • HinzugefügtGeplantStrukturelle URL-Normalisierung vor der Crawl-Deduplizierung#1466 (Issue auf GitHub)
  • HinzugefügtGeplantrobots.txt bei Parallelität höchstens einmal pro Origin abrufen#1465 (Issue auf GitHub)
  • HinzugefügtGeplantRetry-After beachten und bei Drosselungsantworten zurückfahren#1463 (Issue auf GitHub)
  • HinzugefügtGeplantWeb-Formular-Authentifizierung für gerenderte Crawls#1447 (Issue auf GitHub)
  • HinzugefügtGeplantOptionale begrenzte Wiederholung bei 5xx-Antworten#1446 (Issue auf GitHub)
  • HinzugefügtGeplantErweiterte Crawl-Budgets: Ordnertiefe, pro Subdomain, pro Tiefenebene, pro Pfadmuster,#1445

    max. Links pro Seite

    #1445 (Issue auf GitHub)
  • HinzugefügtGeplantOptionen der sitemap-Generierung: priority, changefreq, PDFs, CDN-Bilder, Dateien pro#1444

    Segment

    #1444 (Issue auf GitHub)
  • HinzugefügtGeplantWiederverwendbare Export-Presets#1443 (Issue auf GitHub)
  • HinzugefügtGeplantVertrauenswürdige benutzerdefinierte CA-Zertifikate für gecrawlten Traffic#1442 (Issue auf GitHub)
  • HinzugefügtGeplantCDN- und Mirror-Hostnamen als internen Scope behandeln#1441 (Issue auf GitHub)
  • HinzugefügtGeplantURL-Rewriting-Engine für den Crawl-Scope#1440 (Issue auf GitHub)
  • HinzugefügtGeplantEigene robots.txt als Override für einen Crawl#1439 (Issue auf GitHub)
  • HinzugefügtGeplantKonfigurierbare Cookie-Akzeptanzrichtlinie für Crawls#1438 (Issue auf GitHub)
  • HinzugefügtGeplantExport als Offline-Website-Archiv#1437 (Issue auf GitHub)
  • HinzugefügtGeplantEntdeckung über Annotationsziele (canonical, hreflang, AMP, Meta-Refresh, iframes)#1436 (Issue auf GitHub)
  • HinzugefügtGeplantMedienelemente (video, audio, source) crawlen und auditieren#1435 (Issue auf GitHub)
  • HinzugefügtGeplantNicht crawlbare interne Links erkennen und melden#1434 (Issue auf GitHub)
  • HinzugefügtGeplantLokale Lighthouse-Erhebung für eine Stichprobe gerenderter URLs#1430 (Issue auf GitHub)
  • HinzugefügtGeplantcontrol/rate-and-load: durch Crawl-Rate verursachte 5xx von Bot-Schutz-403/429 trennen,#1366

    im Schritt „bevor die Seite beschuldigt wird“

    #1366 (Issue auf GitHub)
  • HinzugefügtGeplantrobots-check meldet „no robots.txt (crawl allowed)“, wenn robots.txt von einer WAF mit#1364

    403 beantwortet wird

    #1364 (Issue auf GitHub)
  • HinzugefügtGeplantHTTP-Client erhält 403 auf jede Anfrage an einen Shopify-Storefront hinter Cloudflare,#1363

    der curl mit 200 antwortet

    #1363 (Issue auf GitHub)
  • HinzugefügtGeplantLive crawl speed control: change rate and threads during a running scan#1360 (Issue auf GitHub)
  • HinzugefügtGeplantCore: Unebenheiten beim Onboarding echter Projekte (Wettbewerber, Logs, Crawl-Limits,#1359

    Archiv)

    #1359 (Issue auf GitHub)

Analyse und Datenfelder

10 von 64 geschlossen

Lesbarkeit, Vektoren und semantische Merkmale, Felder pro URL, Prüfabdeckung, Zusammenfassungen (Epic #1521)

  • HinzugefügtGeplantMehrere Tabellen-Exporte in einer Arbeitsmappe zusammenführen#1528 (Issue auf GitHub)
  • HinzugefügtGeplantBarrierefreiheits-Findings mit WCAG-Stufenauswahl und Schweregrad-Taxonomie nach#1526

    Auswirkung

    #1526 (Issue auf GitHub)
  • HinzugefügtGeplantSameSite-Attribut für jedes beobachtete Cookie erfassen#1519 (Issue auf GitHub)
  • HinzugefügtGeplantBenutzerdefinierte Extraktion mit mehreren Engines und Validierungsstatus#1513 (Issue auf GitHub)
  • HinzugefügtGeplantZusammenfassungsblock zur Crawl-Population#1512 (Issue auf GitHub)
  • HinzugefügtGeplantRegeln zur Live-Neuberechnung der Audit-Statistik#1511 (Issue auf GitHub)
  • HinzugefügtGeplantInterner Link-Score als optionale Post-Crawl-Metrik#1510 (Issue auf GitHub)
  • HinzugefügtGeplantAudit-Tabellenexport passend zum sichtbaren Vergleichsmodus#1509 (Issue auf GitHub)
  • HinzugefügtGeplantAudit-Aufschlüsselung pro Segment mit Schweregrad-Diagrammen#1508 (Issue auf GitHub)
  • HinzugefügtGeplantHinweisbereich pro Finding mit Kopieren und externen Links#1507 (Issue auf GitHub)
  • HinzugefügtGeplantFindings-Delta zwischen zwei Scans mit Farbmarkierung für Verbesserungen#1506 (Issue auf GitHub)
  • HinzugefügtGeplantProzentualer Anteil am Korpus pro Finding#1505 (Issue auf GitHub)
  • HinzugefügtGeplantAudit-Findings standardmäßig nach Priorität sortieren#1504 (Issue auf GitHub)
  • HinzugefügtGeplantAudit-Zusammenfassung mit Zählern und Typfilter#1503 (Issue auf GitHub)
  • HinzugefügtGeplantZweiachsige Schweregrad-Taxonomie für Audit-Findings#1502 (Issue auf GitHub)
  • HinzugefügtGeplantJavaScript-Konsolenfehler als Seiten-Findings#1487 (Issue auf GitHub)
  • HinzugefügtGeplantAntworten der Paginierungsziele validieren#1458 (Issue auf GitHub)
  • HinzugefügtGeplantBildnutzung seitenübergreifend je Bild aggregieren#1457 (Issue auf GitHub)
  • HinzugefügtGeplantZutreffende robots.txt-Regel für jede blockierte URL anzeigen#1456 (Issue auf GitHub)
  • HinzugefügtGeplanthreflang-Annotationen aus HTTP-Link-Headern und XML-sitemaps extrahieren#1455 (Issue auf GitHub)
  • HinzugefügtGeplantÄhnlichkeit in Prozent und hervorgehobene Unterschiede bei Near-Duplicate-Paaren#1454 (Issue auf GitHub)
  • HinzugefügtGeplantCookie-Inventar-Audit mit Zusammenfassung nach First- und Third-Party#1453 (Issue auf GitHub)
  • HinzugefügtGeplantDoppelte und mehrfache Meta-Keywords seitenübergreifend verfolgen#1452 (Issue auf GitHub)
  • HinzugefügtGeplantCSS-Hintergrundbilder als Bildnachweis erfassen#1451 (Issue auf GitHub)
  • HinzugefügtGeplantFindings für Weiterleitungsketten, die in einem Client- oder Serverfehler enden#1450 (Issue auf GitHub)
  • HinzugefügtGeplantKonfigurierbare Analysepopulation für Duplikat- und Issue-Auswertung#1449 (Issue auf GitHub)
  • HinzugefügtGeplantPDF-Dokumenteigenschaften und -Links extrahieren und auditieren#1448 (Issue auf GitHub)
  • HinzugefügtGeplantSchätzung des CO₂-Fußabdrucks pro Seite#1433 (Issue auf GitHub)
  • HinzugefügtGeplantVektorsuche über den vorgehaltenen Korpus#1432 (Issue auf GitHub)
  • HinzugefügtGeplantN-Gramm-Häufigkeitsanalyse über gecrawlte Inhalte#1431 (Issue auf GitHub)
  • HinzugefügtGeplantNur gerenderte interne Links und Fließtext als vollwertige Findings#1429 (Issue auf GitHub)
  • HinzugefügtGeplantPrüfungen für defekte und per robots.txt gesperrte externe JS- und CSS-Dateien hinzufügen#1427 (Issue auf GitHub)
  • HinzugefügtGeplantPrüfung auf zu viele JS- und CSS-Dateien pro Seite hinzufügen#1426 (Issue auf GitHub)
  • HinzugefügtGeplantPrüfung auf Abweichung zwischen hreflang-Sprache und html lang hinzufügen#1425 (Issue auf GitHub)
  • HinzugefügtGeplantPrüfung auf fehlerhafte href-Werte hinzufügen#1424 (Issue auf GitHub)
  • HinzugefügtGeplantFindings zu www- und http-Varianten der Startseite in Scans aufnehmen#1423 (Issue auf GitHub)
  • HinzugefügtGeplantFindings zu Vorhandensein und Format von llms.txt in Scans aufnehmen#1422 (Issue auf GitHub)
  • HinzugefügtGeplantUngültige sitemap.xml als Scan-Finding melden#1420 (Issue auf GitHub)
  • HinzugefügtGeplantUngültige robots.txt als Scan-Finding melden#1419 (Issue auf GitHub)
  • HinzugefügtGeplantTLS-Probe hinzufügen: Zertifikatsablauf, Hostnamen-Abweichung, Protokollversion, schwache#1418

    Cipher

    #1418 (Issue auf GitHub)
  • HinzugefügtGeplantPrüfung auf Nicht-HTML-Ressourcen hinzufügen, die als normale Seitenlinks verlinkt sind#1417 (Issue auf GitHub)
  • HinzugefügtGeplantPrüfung auf Seiten mit nur einem internen Inlink hinzufügen#1416 (Issue auf GitHub)
  • HinzugefügtGeplantExterne Links mit rel speichern und EXTERNAL_NOFOLLOW hinzufügen#1415 (Issue auf GitHub)
  • BehobenGeplantSecurity-Header und HSTS werden nur an der finalen Antwort bewertet; Redirect-Hops und#1414

    der www-Host werden nie geprüft

    #1414 (Issue auf GitHub)
  • BehobenGeplantRich-Result-Regeln für SoftwareApplication sind zu lax; prüfen, ob Structured-Data-Fehler#1413

    der Startseite ausgewiesen werden

    #1413 (Issue auf GitHub)
  • BehobenGeplantLOW_TEXT_RATIO schlägt auf fast jeder Seite an; Messung und Schwellenwert neu kalibrieren#1412 (Issue auf GitHub)
  • BehobenGeplantGruppierte Findings melden die Anzahl 1 und fehlen in der Finding-Abfrage pro URL#1411 (Issue auf GitHub)
  • HinzugefügtGeplantsite-audit liefert für eine Fehlerantwort Findings auf Seitenebene, statt die Seite als#1365

    nicht auditiert zu markieren

    #1365 (Issue auf GitHub)

Projekte und Workflows

8 von 10 geschlossen

Workflows für Website-Verantwortliche: Aufgaben, Exporte, geplante Berichte und ihre Zustellung (Epic #1314)

Rebranding

0 von 1 geschlossen

Umbenennung seohead → spiderhead: CLI, Paket, Umgebung, Dokumentation (#1523)

  • HinzugefügtGeplantCLI-Binary, Paket und Umgebungspräfix von seohead in spiderhead umbenennen#1523 (Issue auf GitHub)

CLI- und MCP-Schnittstellen

7 von 12 geschlossen

Klare Fehlermeldungen, echte Hilfetexte, begrenzte Leseausgaben, MCP-Transporte (Epics #1410 #1421)

  • HinzugefügtGeplantMCP-Server als vollwertiger CLI-Modus mit stdio- und Streamable-HTTP-Transport#1525 (Issue auf GitHub)
  • BehobenGeplantEchte Unterhilfe für 'seohead sf' statt eines Stubs für weitergereichte Argumente anzeigen#1406 (Issue auf GitHub)

KI-Schicht

0 von 1 geschlossen

Prompt-Ziele pro SEO-Element auf Basis von seo_ai_column, anbieterunabhängig (#1524)

  • HinzugefügtGeplantKI-gestützte Seitenanalyse mit konfigurierbaren Prompt-Zielen über Crawl-Daten#1524 (Issue auf GitHub)

Code-Qualität

0 von 2 geschlossen

Aufteilung der Riesendateien in Module und Richtung der Abhängigkeiten (#1514 #1515)

  • HinzugefügtGeplantAbhängigkeitsrichtung: Core-zu-Feature-Import-Inversionen entfernen#1515 (Issue auf GitHub)
  • HinzugefügtGeplantÜberdimensionierte Adapter- und Engine-Module in zusammenhängende Einheiten aufteilen#1514 (Issue auf GitHub)

Distribution: installers & one-command install

0 von 2 geschlossen

Sales-readiness theme: native installers per OS, our own package name, and a one-command CLI install. Being ready to ship is the point of this milestone.

  • HinzugefügtGeplantOwn command name with a one-command install (pipx/brew) for the CLI#1557 (Issue auf GitHub)
  • HinzugefügtGeplantShip native installers: DMG (macOS), Linux (AppImage/deb), Windows installer#1556 (Issue auf GitHub)
Release

3.1.0

Erstes getaggtes Release nach der Umbenennung von SEOHEAD Tools11. Oktober 2026
455 Einträge · Erstes getaggtes Release nach der Umbenennung von SEOHEAD Tools138 hinzugefügt275 geändert42 behoben

11. Oktober 2026

5 hinzugefügt54 geändert2 behoben
  • GeändertFunktioniertProjekteinstellungen Schedule und Crawl neu aufgebaut: gemeinsame native#1323

    Canvas-Komponenten, offline Schriften

    Projekteinstellungen Schedule und Crawl werden mit gemeinsamen nativen Canvas-Komponenten, offline Roboto-Schriften und Material Symbols sowie einem einspaltigen Layout bei 800 px neu aufgebaut.

    #1323 (Issue auf GitHub)
  • GeändertFunktioniertDurchgehend englische Oberfläche; bestehende Zeitplan-Befehle und Dokumentverträge#1323

    bleiben, nur Core-gestützte Daten

    Die Anwendungsoberfläche ist durchgehend auf Englisch. Bestehende Zeitplan-Befehle und Dokumentverträge bleiben erhalten. Angezeigt werden nur Zeitplandaten, die vom Core gestützt sind.

    #1323 (Issue auf GitHub)
  • GeändertFunktioniertWorkspace-Identitäten und Aliasse bleiben beim Öffnen der Projekteinstellungen erhalten;#1323

    keine doppelten Speicherungen…

    Workspace-Identitäten und Aliasse bleiben erhalten, während die Projekteinstellungen geöffnet sind. Doppelte Speichervorgänge werden verhindert, solange der Core antwortet.

    #1323 (Issue auf GitHub)
  • GeändertFunktioniertDesktop-Projekteinstellungen: neuer Schedule-Tab (Wochentage, Monatstage,#1322

    Laufzeitfenster, Zeitzone …

    Desktop-Projekteinstellungen erhalten einen Schedule-Tab (Wochentage, Monatstage, Laufzeitfenster, Zeitzone, Wettbewerber) und einen Crawl-Tab (Crawl-Modus, User-Agent-Voreinstellung oder eigener String, Pause zwischen Anfragen, URL-Budget, SpiderHeadBot oder eigener User-Agent). Beide lesen und schreiben das Projekt über den Core. Die Projektübersicht zeigt den nächsten und letzten geplanten Lauf. Ein Modus --tray führt die fälligen Scans des Cores aus und hält den Mac nur während eines laufenden Scans wach.

    #1322 (Issue auf GitHub)
  • GeändertFunktioniertGeplante Projekt-Scans (#1322, Core): schedule.json im Projektverzeichnis enthält den#1322

    Zeitplan (Wochentage und/oder Tage des Monats, ein Zeitfenster in der Zeitzone der Website, Aktivierung und Deaktivierung, Konkurrenten, Crawl-Modus spider/sitemap/list, URL- und Anfragebudgets pro Durchlauf, Pausen zwischen Anfragen und den Slice-Modus, der den vorherigen unvollständigen Crawl fortsetzt). Bearbeitet wird die Datei über schedule-set / seo_schedule_set mit expected_revision. schedule-show zeigt den letzten Lauf und das nächste fällige Zeitfenster. schedule-run-due ist ein Headless-Einstiegspunkt, der nur fällige Scans ausführt, Überschneidungen über ein Lease verhindert und jede Entscheidung im Projekt-Journal festhält. schedule-install und schedule-uninstall schreiben bzw. entfernen einen launchd-plist, eine Cron-Zeile oder einen Task-Scheduler-Befehl nur auf ausdrücklichen Aufruf.

    #1322 (Issue auf GitHub)
  • GeändertFunktioniertCrawl-User-Agents (#1322): Voreinstellungen (spiderhead, googlebot,#1322

    googlebot-desktop, googlebot-smartphone, bingbot, yandexbot, yandexmobilebot, baiduspider, duckduckbot, applebot, gptbot, claudebot, perplexitybot sowie Desktop- und mobile Browser) oder eine eigene Zeichenkette. Der Standard ist jetzt SpiderHeadBot/<version> (+https://github.com/PavloSEO/spiderhead), und die Zuordnung der robots.txt-Gruppen nutzt dieselbe Kennung. Websites, die der bisherigen robots-Gruppe SEOHEAD-Tools entsprachen, müssen SpiderHeadBot in ihren Regeln nennen.

    #1322 (Issue auf GitHub)
  • GeändertFunktioniertEin gespeicherter Projekt-Crawl markiert jetzt die automatischen Checklisten-Punkte, die#1314

    er gemessen hat.

    Jeder aktivierte Prüfpunkt erhält eines von drei Ergebnissen: succeeded, wenn der gespeicherte Audit die Prüfung ausgeführt hat, mit dem Scan als Nachweis; unavailable, wenn der Crawl sie übersprungen oder deaktiviert hat, mit dem Grund des Crawls; oder unmeasured, wenn der Audit die Prüfung gar nicht erwähnt. Ein nicht gemessener Punkt behält seinen bisherigen Eintrag und wird in checklist_evidence namentlich aufgeführt, zählt also nie als 0. Schlägt ein Crawl fehl oder wird er unterbrochen, markiert er seine automatischen Prüfungen als failed mit dem Fehlergrund. Derselbe Aufzeichnungspfad bedient jetzt auch den Ablauf prepare, der bisher eine eigene Kopie der Schleife hatte. Ein Projekt mit nicht initialisierter Checkliste wird unter Angabe des Grundes übersprungen.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertKonkurrenz-Workspaces behalten die URL so, wie eingegeben: Ein Konkurrenz-Crawl startet#1314

    von der www…

    Konkurrenz-Workspaces behalten die URL so, wie sie eingegeben wurde: Ein Konkurrenz-Crawl startet von der www-URL statt vom nackten Host. Ein Crawl einer Konkurrenz-URL markiert die Checklisten-Punkte des Inhabers nicht mehr; das Ergebnis wird nur im eigenen Workspace des Konkurrenten gespeichert. Wird ein Projekt mit einem beschädigten Konkurrenz-Workspace geöffnet, wird dieser Konkurrent als nicht verfügbar gemeldet, statt dass der Vorgang fehlschlägt.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertKonkurrenz-Kandidaten lassen sich über die CLI erfassen, auflisten und entfernen…#1314

    Konkurrenz-Kandidaten lassen sich über die CLI (project-competitors-add, project-competitors-list, project-competitors-remove) und die passenden MCP-Tools seo_project_competitors_* erfassen, auflisten und entfernen. Jeder Kandidat behält die URL so, wie sie eingegeben wurde, einschließlich eines www-Hosts. www- und nackte Hosts gelten bei Dublettenprüfungen als dieselbe Website. Ein Konkurrent mit www-Host bricht die Vorbereitung nicht mehr ab und lässt project-observe nicht mehr fehlschlagen.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniert--max-urls ist jetzt das Seitenbudget des Crawls: Ein explizites Seitenbudget füllt#1314

    nicht gesetzte Budgets…

    --max-urls ist jetzt das Seitenbudget des Crawls. Ein explizites Seitenbudget füllt nicht gesetzte Anfrage- und Zeitbudgets (3 Anfragen und 2 Sekunden pro Seite), sodass Crawls von 50 bis 300 Seiten ohne approve_large_crawl zugelassen werden. Budgets oberhalb der Projektschwellen werden weiterhin abgelehnt.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertEin bewusster Stopp wegen des URL-Budgets wird als abgeschlossene Erfassung mit#1314

    finish_reason stopped_by_budget und einer Zeit finished_at gespeichert, statt als interrupted ohne Endzeit. Die noch wartenden URLs bleiben für eine Fortsetzung erhalten.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertKonkurrenz-URLs behalten den Host so, wie eingegeben (zum Beispiel bleibt www.#1314

    erhalten), statt ohne ihn gespeichert zu werden.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertDesktop übernimmt Konkurrenzseiten aus der Zwischenablage oder einzeln über den Core,#1314

    legt je Seite eine URL-Obergrenze fest und startet ihre Scans parallel. Eine Konkurrenz gilt erst als gescannt, wenn ein abgeschlossener, gespeicherter Scan vorliegt.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertNative Scans messen HSTS, Mixed Content und strukturierte Daten aus ihren eigenen#1314

    gespeicherten Nachweisen. Ein fehlender oder veralteter SF-Export führt deshalb nicht mehr dazu, dass sie als fehlend gemeldet werden. duplicate-check markiert einen Lauf ohne verglichene Paare als nicht gemessen. Seitenübergreifende Template-Befunde (gleiche Kopfüberschrift, geringer Textanteil) sind ein einziger Befund mit Seitenanzahl (#1314).

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertDie Annahme eines Inhaber-Ziels fügt nur die Checklisten-Aufgabe dieses Ziels hinzu.#1314

    Der Vorgang gleicht nicht mehr den gesamten eingebauten Katalog mit coverage.json ab. Eingebaute Zeilen werden bei Bedarf hinzugefügt, sobald eine davon berührt wird.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertEine belegte Checkliste nennt den aktiven Halter (zum Beispiel einen laufenden nativen#1314

    Crawl und seine PID), statt die Sperre als Überbleibsel zu bezeichnen. Die Sperre speichert die PID ihres Schreibers. Eine Sperre ohne aktiven Halter wird weiterhin als Überbleibsel gemeldet.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertEin Workflow-Lauf, der durch einen fehlgeschlagenen, nicht verfügbaren, übersprungenen#1314

    oder unterbrochenen Schritt blockiert ist, bleibt fortsetzbar. Ein späterer ausstehender Schritt darf über einen Schritt ohne Erfolg hinweg als Checkpoint gespeichert werden. Schritte müssen weiterhin in der registrierten Reihenfolge als Checkpoint gespeichert werden, und ein unterbrochener Lauf nimmt keine weiteren Schritte an.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertEine vom Agenten erfasste Prüfung schließt einen manuellen oder zu liefernden Punkt nicht#1314

    mehr für den Inhaber ab.

    Der Punkt wartet weiterhin auf die Freigabe durch den Inhaber oder auf einen Prüfer, der kein Agent ist.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertInbox-Verweise akzeptieren Ziel-IDs (inbox:<uuid>), damit eine Notiz das betroffene#1314

    Ziel zitieren kann…

    Inbox-Verweise akzeptieren Ziel-IDs (inbox:<uuid>), damit eine Notiz das Ziel zitieren kann, das sie betrifft.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertNie versuchte manuelle Checklisten-Punkte zeigen den Status not_run statt review…#1314

    Nie versuchte manuelle Checklisten-Punkte zeigen den Status not_run statt review. Nur ein Versuch, der auf eine Entscheidung wartet, bleibt in review.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertDas Issues-Lesemodell (Belege der observe-Befunde) meldet Zähler je Prüfung#1314

    (by_check) und einen next_offset nach den ersten 20 Befunden. findings_page blättert durch den Rest.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertNative Crawl-Prüfungen (#1314): Die Bildgröße (IMG_OVER_KB) wird jetzt aus den eigenen#1314

    Bildabrufen des Crawls gemessen, der Sitemap-Status (SITEMAP_URL_4XX_5XX, SITEMAP_URL_3XX, SITEMAP_URL_NON_INDEXABLE) aus dem eigenen Abruf jeder in der Sitemap gelisteten URL. Eine gelistete URL, die der Crawl nie angefragt hat, zählt als nicht gemessen, niemals als sauber. IMG_MISSING_ALT, IMG_MISSING_DIMENSIONS und HREFLANG_ERROR weisen bei einem nativen Scan darauf hin, dass der Crawl sie nicht so misst, wie der SF-Export sie definiert, statt auf einen SF-Filter zu verweisen. Fehlende hreflang- und Mixed-Content-Nachweise eines nativen Scans werden als vom nativen Crawl nicht gemessen gemeldet, nicht als fehlender Export.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertProjekt-Journal (#1314): Jedes Projektereignis wird jetzt zusätzlich als ein Stichpunkt#1314

    in log.md geschrieben…

    Projekt-Journal (#1314): Jedes Projektereignis wird jetzt zusätzlich als ein Stichpunkt in log.md geschrieben. Der Core erfasst automatisch Einträge für abgeschlossene Crawls (scans), erstellte Projektberichte und Checklisten-Versuche (agent). Die Einträge landen in events.jsonl und werden von project-event-page gelesen. Die automatischen Hooks lassen den Crawl, Bericht oder Checklistenschritt, den sie beschreiben, nie fehlschlagen. project-event-append und seo_project_event_append behalten ihre Schnittstelle und erhalten die Zeile in log.md.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertDer native Crawl speichert jetzt die Sicherheits-Header, die die Prüfungen auswerten#1314

    (Strict-Transport-Security, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy). Bisher wurden sie bei der Erfassung verworfen, sodass eine Website, die HSTS sendete, als ohne HSTS gemeldet wurde. Set-Cookie-Header speichern nur ihre Flags (secure, httponly, samesite=), niemals Cookie-Name oder -Wert. Ein Sicherheits-Header, der auf derselben Seite mehrfach gesendet wird, wird als DUPLICATE_SECURITY_HEADER gemeldet.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertworkflow-start braucht nur ein angenommenes Inhaber-Ziel: --goal-id (oder#1314

    context.goal_id) genügt. Der registrierte Prompt ist standardmäßig skill:workflow/full-audit-v1, und die Checklisten-Aufgabe ist standardmäßig die, die das angelegte Ziel annimmt (custom:goal-<entry>). Ablehnungen nennen den Inhaber-Befehl, der die fehlende Verknüpfung behebt. Die Optionen sind in seohead workflow-start --help dokumentiert.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertChecklisten-Populationen akzeptieren unvollständige Objekte: Nur kind und source sind#1314

    Pflicht, und…

    Checklisten-Populationen akzeptieren unvollständige Objekte: Nur kind und source sind Pflicht, die übrigen Schlüssel sind standardmäßig nicht gesetzt. Eine abgelehnte Population nennt ihre fehlenden oder unbekannten Schlüssel.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertNative Projekt-Crawls greifen auf die /sitemap.xml des Ursprungs zurück, wenn#1314

    robots.txt keine Sitemap angibt. Fehlt auch diese Rückfalloption, wird das als unvollständig vermerkt, unterbricht den Crawl aber nicht.

    #1314 (Issue auf GitHub)
  • GeändertFunktioniertServer-Logs speichern jetzt exakte, auf Datenträger gesicherte Summen der Bot-IPs statt#1311

    einer gekappten Stichprobe, mit begrenzten Datensätzen je IP, Besuchen, letztem Besuch und Subnetz-Filtern. Die explizite DNS-Prüfung verifiziert jede ausgewählte IP einzeln, erfasst PTR- und Vorwärtsnachweise, unterstützt IPv6 und hält Ergebnisse wie „nicht verfügbar“ oder Zeitüberschreitung als nicht geprüft fest. Lokale Caches laufen nach einer Stunde ab. Lesezugriffe lösen nie DNS-Abfragen aus.

    #1311 (Issue auf GitHub)
  • HinzugefügtFunktioniertLokaler Import von Projekt-Logs, paginierte Zusammenfassung, Bot-Nachweise und#1311

    Scan-Verknüpfung ergänzt…

    Lokaler Import von Projekt-Logs, paginierte Zusammenfassung, Bot-Nachweise und Verknüpfung mit nativen Scans über die gemeinsamen CLI- und MCP-Handler ergänzt. Separate Log-Artefakte behalten Datumspartitionen sowie Abdeckung und Herkunft der Quelle, ohne die eingefrorenen Scan-Schemata zu ändern. Fehlende oder unvollständige Nachweise halten Schlussfolgerungen über ein Nichtvorhandensein zurück. Die Log-Ansichten der Desktop-App folgen als separate Darstellung.

    #1311 (Issue auf GitHub)
  • GeändertFunktioniertProduktive DataForSEO-Aufrufe für Google werden vor dem Client-Aufbau geprüft,#1310

    Offline-Kostenvoranschläge…

    Produktive DataForSEO-Aufrufe für Google werden vor dem Client-Aufbau geprüft. Offline-Kostenvoranschläge basieren auf den übergebenen Anbieterpreisen, und die Kosten berücksichtigen die SERP-Tiefe sowie Gebühren für Suchoperatoren. Bekannte Obergrenzen in USD je Aufruf werden vor dem Transport durchgesetzt. Begrenzte Backlink-Index-Operationen werden erweitert, und fehlende Kosten oder fehlerhafte Antwortformen werden als unsichere Belege im Journal festgehalten. Währungslimits pro Projekt und Monat bleiben bis zur Entscheidung des Inhabers offen.

    #1310 (Issue auf GitHub)
  • GeändertFunktioniertExplizite Backlink-Quellen- und Importnachweise fließen in private lokale#1310

    Verlaufs-Snapshots ein, mit vollständigen rel-Token-Beobachtungen, Ankertexten, verweisenden Domains, Filtern und transparenten Signalen zur Spam-Prüfung. Außerdem gibt es CLI- und MCP-Routen für das Profil und einen geprüften Disavow-Export, ohne automatische Einreichungen.

    #1310 (Issue auf GitHub)
  • HinzugefügtFunktioniertHinweise zur Prüfung gemischter rel-Token und ausgehender sponsored-Kennzeichnung aus#1310

    gespeicherten nativen Nachweisen. Dabei bleibt der nicht verfügbare Kontext erhalten, vollständig nicht geparste HTML-Populationen führen zu null-Zählern, und die Klassen sponsored, ugc und nofollow erscheinen in Berichten und Spenderprüfungen, ohne das eingefrorene Schema gespeicherter Scans zu ändern.

    #1310 (Issue auf GitHub)
  • GeändertFunktioniertNative DOM- und Dublettenprüfungen lesen das je Seite gewählte gespeicherte Dokument#1307

    jetzt über die exakte URL, mit verifizierter Zuordnung von Antwort und Body. Deaktivierte Speicherung sowie fehlende, ungültige oder über dem Budget liegende Bodies bleiben explizite Auslassungen; Teilbefunde tragen ihre Abdeckung mit sich. Exakte Hashes des Inhaltsbereichs und begrenzte SimHash- und LSH-Befunde werden im nativen Audit gespeichert, ohne ein SF-HTML-Verzeichnis zu benötigen. Schwellenadaptive LSH-Bänder erhalten die Trefferquote qualifizierender Paare und reduzieren breite Kandidaten-Buckets. Das Erschöpfen des Budgets für Nahe-Analysen verwirft keine Befunde exakter Hashes.

    #1307 (Issue auf GitHub)
  • GeändertFunktioniertSF-Audits führen optional semantische Ähnlichkeit sowie Title-/H1-Prüfung gegen den#1307

    gespeicherten Body aus…

    SF-Audits führen optional eine semantische Ähnlichkeitsprüfung sowie den Abgleich von Title und H1 mit dem gespeicherten Body durch, und zwar über einen ausdrücklich angegebenen lokalen Adapter oder deklarierte Embeddings. Kein Modell und kein Anbieter wird automatisch gewählt. Adapter-Identität, Quell-Hashes, Scores, Grenzen und Auslassungen begleiten die Prüfkandidaten. Semantische Ähnlichkeit belegt weder doppelten Inhalt noch Suchrelevanz oder Kannibalisierung. Die beiden semantischen SF-Abdeckungszeilen bleiben Lücken, bis ein echter Adapter gewählt und validiert ist. Eine externe Anbieter-Freigabe erfordert den wörtlichen booleschen Wert true; Zeichenketten oder Zahlen, die nur wahr wirken, lösen nie einen Embedding-Aufruf aus.

    #1307 (Issue auf GitHub)
  • GeändertFunktioniertNative gespeicherte Audits gruppieren defekte interne Links nach beobachtetem Ziel mit#1306

    Quell- und Ankertext-Nachweisen, erfassen Weiterleitungsketten und -schleifen mit Status je Hop und unterscheiden pfadbasierte interne Suche sowie leere Anker. Außerdem zeigen sie erfasste externe Ergebnisse ohne Antwort. Befunde zur Konsistenz von Sitemap und robots.txt nutzen gespeicherte Mitgliedschafts- und Antwortnachweise ohne Live-Abrufe. Fehlende und teilweise Nachweise bleiben explizit.

    #1306 (Issue auf GitHub)
  • HinzugefügtFunktioniertEin begrenzter Link-Graph gespeicherter Scans mit Filtern nach Position, Bereich und#1306

    lokaler Nachbarschaft ist ergänzt, dazu Aggregation nach Bereichen und Änderungen der Kanten von Scan zu Scan. Die Offline-Nachberechnung füllt Positionen mit wiederaufnehmbaren abgeleiteten Batches nach und meldet nicht klassifizierte Nachweise in der Linkprüfung und im Scan-Status. Das eingefrorene Schema scan.v1 bleibt unverändert.

    #1306 (Issue auf GitHub)
  • HinzugefügtFunktioniertLokale XML-Sitemap-Erzeugung aus kanonischen, indexierbaren gespeicherten 200-Seiten mit…#1306

    Lokale XML-Sitemap-Erzeugung aus kanonischen, indexierbaren gespeicherten 200-Seiten ist ergänzt, mit beobachtetem lastmod, Ausschlüssen, Aufteilung nach Protokoll, Sitemap-Index und optionaler Bild-Sitemap. CLI und MCP nutzen dieselben Implementierungen. Die Veröffentlichung der Ausgabe erfordert ein frisches lokales Verzeichnis und deployt niemals Dateien.

    #1306 (Issue auf GitHub)
  • GeändertFunktioniertFehlende Erkennungsziele aus der Erfassungszeit bleiben erhalten, wenn spätere Sitemap-#1306

    oder Seed-Verarbeitung die URL ergänzt…

    Fehlende Erkennungsziele aus der Erfassungszeit bleiben erhalten, wenn spätere Sitemap- oder Seed-Verarbeitung die URL zum gespeicherten Katalog hinzufügt. Erklärte unaufgelöste oder ausgeschlossene Nachweise bleiben unveränderlich. Beanspruchte bekannte Ziele und Identitätsabweichungen ungleich null bleiben ungültig.

    #1306 (Issue auf GitHub)
  • GeändertFunktioniertDie Bild-Sitemap schließt bekannte Nicht-200-Antworten von Ressourcen aus, auch wenn die#1306

    Ressource nicht als Seite gespeichert wurde…

    Die Bild-Sitemap schließt bekannte Nicht-200-Antworten von Ressourcen aus, auch wenn die Ressource nicht als gecrawlte Seite gespeichert wurde, und markiert nicht gemessene Bildantworten als Teilabdeckung.

    #1306 (Issue auf GitHub)
  • GeändertFunktioniertRohe Canonical- und Pagination-Attribute als versionierten Dokumentkontext speichern,#1305

    ohne…

    Rohe Canonical- und Pagination-Attribute werden als versionierter Dokumentkontext gespeichert, ohne das eingefrorene SQL des Scans zu ändern. Canonical-Links mit nicht unterstützten hreflang-, lang-, media- oder type-Attributen, fehlerhafte Annotationen sowie domain- oder protokollübergreifende Angaben erzeugen jetzt belegte Befunde. Unbekannte, aber korrekt geformte Relationsschlüsselwörter bleiben unklassifiziert.

    #1305 (Issue auf GitHub)
  • GeändertFunktioniertBegrenzte Ziel-Prüfungen auf demselben Host werden auf Pagination ausgeweitet und#1305

    gemessene noindex- und Canonical-Beobachtungen gespeichert…

    Begrenzte Ziel-Prüfungen auf demselben Host werden auf Pagination ausgeweitet, und gemessene noindex- und Canonical-Beobachtungen werden gespeichert. Native Canonical-Ketten sowie Canonical- und hreflang-noindex-Befunde können Prüfungen nutzen. Ältere, nur auf den Status ausgerichtete Prüfungen bleiben lesbar und für HTML-Direktiven als nicht gemessen.

    #1305 (Issue auf GitHub)
  • GeändertFunktioniertUndurchsichtige native Pagination-Ketten werden auf eindeutige gegenseitige#1305

    next/prev-Widersprüche geprüft. Nummerierte Regeln und Schrittregeln bleiben erhalten, ebenso benannte ungeprüfte Zustände. Gespeicherte Befund-URLs, auch gruppierte Mitglieder, werden über scan-url-query mit temporären SQLite-Tabellen und gestreamten audit.v2-Nachweisen ausgewählt.

    #1305 (Issue auf GitHub)
  • BehobenFunktioniertUnbekannte Unicode- und Relationstoken mit Satzzeichen bleiben unklassifiziert,#1305

    äquivalente IDN- und Standard-Port-Canonicals werden normalisiert…

    Unbekannte Unicode- und Relationstoken mit Satzzeichen bleiben unklassifiziert. Äquivalente IDN- und Standard-Port-Canonical-Autoritäten werden normalisiert, und exakte native Pagination-Zielpfade bleiben erhalten. Nicht lesbare gemischte Seitentoken bleiben ungeprüft. Der Pagination-Fehler des Shops wird auch dann erkannt, wenn Seite eins keine Nummer in der URL hat.

    #1305 (Issue auf GitHub)
  • GeändertFunktioniertDie deklarierten next/prev-Annotationen der Shop-Fixture werden gerendert, damit die#1305

    D41-Referenz…

    Die deklarierten next/prev-Annotationen der Shop-Fixture werden gerendert, damit ihre D41-Pagination-Referenz tatsächlich ausgeliefert und von der nativen Erfassung validiert werden kann.

    #1305 (Issue auf GitHub)
  • GeändertFunktioniertDokumentgebundene statische AMP- und Barrierefreiheitsnachweise in vorhandenen#1304

    Scan-Kontextzeilen speichern…

    Dokumentgebundene statische AMP- und Barrierefreiheitsnachweise werden in vorhandenen Scan-Kontextzeilen gespeichert, unter Beibehaltung des eingefrorenen SQL-Schemas scan.v1. Strukturelle AMP-Befunde prüfen die ursprüngliche Doctype-Deklaration, head und body, den UTF-8-Charset, den Viewport, das Runtime-Skript und die Boilerplate-Deklarationen. Gepaarte AMP-Ziele ohne AMP-Root-Marker werden gesondert erkannt. Vollständige AMP-Validator-Regeln bleiben bis zu einer Lizenzentscheidung nicht verfügbar.

    #1304 (Issue auf GitHub)
  • GeändertFunktioniertErste Barrierefreiheitsbefunde zu Dokumentsprache, Formularlabels, Bildalternativen,#1304

    Überschriften-Sprüngen und dem Hauptlandmark. Die Befunde enthalten begrenzte Beispiele und vollständige Vorkommenszahlen. Berechneter Kontrast und gerenderte axe-core-Regeln bleiben nicht gemessen.

    #1304 (Issue auf GitHub)
  • GeändertFunktioniertSchema.org-Microdata und gängige RDFa-Subjekte und -Eigenschaften werden mit dem#1304

    mitgelieferten Vokabular validiert…

    Schema.org-Microdata und gängige RDFa-Subjekte und -Eigenschaften werden mit dem mitgelieferten Vokabular und den bestehenden Regeln für Rich Results validiert. Gespeicherte Fehler, Warnungen und fehlende Pflichteigenschaften je URL werden zu nativen Befunden. Nicht unterstützte RDFa-Konstrukte sind eine ausdrücklich benannte Teilnachweisung und kein sauberes Validierungsergebnis.

    #1304 (Issue auf GitHub)
  • GeändertFunktioniertGeparste JSON-LD-Bäume werden zusammen mit Quelle, Position und Syntaxfehlern je Block in#1304

    scan-structured-blocks ausgeliefert…

    Geparste JSON-LD-Bäume werden zusammen mit Quelle, Position und Syntaxfehlern je Block in scan-structured-blocks ausgeliefert. Breite Eigenschaftsbäume werden begrenzt, und die Grenze wird angegeben. Das neueste Dokument für eine angeforderte URL und Darstellung wird gelesen, ohne dessen Scan zu verändern.

    #1304 (Issue auf GitHub)
  • GeändertFunktioniertTeilweise oder nicht verfügbare strukturierte Nachweise bleiben erhalten, ohne bestätigte#1304

    Fehler benachbarter Elemente zu verbergen.

    Unterstützte JSON-LD-Identitäten werden gegen dieselbe Dokumentbasis aufgelöst wie HTML-Markup, wobei das Quell-JSON erhalten bleibt. Skalare und leere JSON-Blöcke werden nicht als gültige Graphen akzeptiert. Die Auswahl normalisierter aktiver JSON-LD-Tags wird zwischen Parser und ausgelieferter Projektion geteilt.

    #1304 (Issue auf GitHub)
  • GeändertFunktioniertNative Audits zeigen Render-blockierendes Head-Markup aus vollständigem gespeichertem#1303

    HTML, ohne…

    Native Audits zeigen render-blockierendes Head-Markup aus vollständigem gespeichertem HTML, ohne das eingefrorene Schema scan.v1 zu ändern. Fehlende, unvollständige und budgetbegrenzte Bodies bleiben nicht verfügbar. Die vorhandene Erkennung von Head-Ressourcen und die Eingabe für SF-Custom-Extraction werden wiederverwendet.

    #1303 (Issue auf GitHub)
  • HinzugefügtFunktioniertKonfigurierbare native Budgets für beobachtete Navigation und einzelne Ressourcen-Bytes#1303

    ergänzt, dazu Signale zur Cache- und Font-Auslieferung, Heuristiken für Minifizierung und Legacy-Skripte sowie exakte Dubletten von Skripten auf derselben Seite, aus gespeicherten scan.v2-Nachweisen. Nicht abgerufene Daten und unvollständige Laufzeit-Payloads bleiben explizit. Responsive Deklarationen werden nicht als Laufzeitgewicht addiert. Untergrenzen nur aus HTML, skalare Abdeckungszähler, Font-Stichproben und Quellzusammenfassungen bleiben explizit und begrenzt.

    #1303 (Issue auf GitHub)
  • GeändertFunktioniertBegrenzte präzise Chromium-JS- und CSS-Coverage bei angeforderten Renderings erfassen,#1303

    UTF-16-Nutzungszusammenfassungen speichern…

    Begrenzte präzise Chromium-JS- und CSS-Coverage wird bei angeforderten Renderings erfasst. UTF-16-Nutzungszusammenfassungen und Befunde zur Bildgrößenangabe beim Rendern werden gespeichert und nach erneutem Öffnen oder Offline-Nachberechnung gelesen. Nicht unterstützte Engines und fehlende Messungen werden nicht zu sauberen Ergebnissen.

    #1303 (Issue auf GitHub)
  • GeändertFunktioniertPassendes Lighthouse-JSON je URL für LCP-Erkennung, Abhängigkeitsbäume, Verursacher von#1303

    Layout-Verschiebungen…

    Passendes Lighthouse-JSON je URL (begrenzt) wird für die Erkennung von LCP, Abhängigkeitsbäumen, Verursachern von Layout-Verschiebungen, Bildauslieferung, erzwungenem Reflow und Skriptausführung akzeptiert, mit Herkunftsnachweis der Erfassung und Eingabe-Hashes. Es kommt kein Lighthouse-Prozess, kein kostenpflichtiger Anbieter und keine Ableitung von Felddaten-CWV hinzu. Register, SF-Abdeckung und generierte Referenzdokumentation werden aktualisiert.

    #1303 (Issue auf GitHub)
  • BehobenFunktioniertZusätzliche Asset-Schwellenwerte bleiben aus dem eingefrorenen nativen Scan-Header heraus#1303

    und werden in einem validierten, versionierten Lauf-Kontext gespeichert…

    Zusätzliche Asset-Schwellenwerte bleiben aus dem eingefrorenen nativen Scan-Header heraus. Ihre exakten Werte werden in einem validierten, versionierten Lauf-Kontext gespeichert. Die Fortsetzung vergleicht diese Werte getrennt, und die Offline-Nachberechnung stellt sie aus gespeicherten Nachweisen wieder her. Ältere, leichtgewichtige Leser können die unveränderte Form der Header-Konfiguration weiterhin einsehen.

    #1303 (Issue auf GitHub)
  • GeändertFunktioniertChecklist record akzeptiert jetzt eine erfolgreiche automatische Prüfung, deren

    gespeicherter Scan ein gestreamter audit.v2-Scan ist. Bisher schlug der Aufruf mit 'NoneType' object is not subscriptable fehl, weil das Audit in der Begleitdatei liegt und nicht in der Legacy-Tabelle des Scans. Die akzeptierten Datensatzformen sind dokumentiert in seohead project checklist-record --help, im Schema des MCP-Tools seo_project_checklist_record und in docs/INPUTS.md.

  • GeändertFunktioniertDie vollständige Toolkit-Suite läuft einmal auf Python 3.15 statt in einer Matrix älterer

    Versionen. Dabei bleiben vier verifizierte Testgruppen und die kombinierte Coverage erhalten. Für die Bootstraps von CI und Release-Builds wird dieselbe stabile Python-Version verwendet.

  • GeändertFunktioniertDie Ansicht „Work“ im Desktop liest jede Checklisten-Seite (100 pro Anfrage) statt der

    ersten 50 Zeilen. Issues benennt jede Kernprüfung aus dem Register, statt „Andere Prüfung“ anzuzeigen.

  • GeändertFunktioniertDie Ansicht „Work“ liest jede Checklisten-Seite, zeigt das Aufgabenpanel des Projekts

    aber jeweils nur eine Seite. Eine Checkliste beliebiger Größe scheitert damit nicht mehr mit „höchstens 100 Zeilen“. Desktop öffnet den Scan, den ein vollständiger Audit zurücklässt (der größte vollständige Scan), wenn der Inhaber keinen gewählt hat. Die Core-Erkennung prüft außerdem die eigene Umgebung des Desktop-Interpreters (sys.prefix), bevor sie den PATH durchsucht.

  • GeändertFunktioniertGespeicherte Audit-Prüfungen und native Desktop-Verbesserungen werden konsolidiert.

    Ressourcen-Budgets bleiben erhalten, ohne den eingefrorenen Scan-Header zu ändern. Sichere Offline-Nachberechnung und Fortsetzung bleiben erhalten. Native Projekt-Einstellungskomponenten, Theme-Tokens und mitgelieferte Schriften werden geteilt. Private Design-Vorlagen werden aus dem verteilten Verzeichnis entfernt.

  • GeändertFunktioniertNachprüfungen der Remediation werden an die validierte wirksame Asset-Richtlinie

    gebunden, während der ursprüngliche Scan-Header und die Quellbytes erhalten bleiben.

  • GeändertFunktioniertDie Checklisten-Abdeckung des Projekts bindet gestreamte audit.v2-Berichte: report-build --project

    und audit-workflow --action report hängen den Checklisten-Snapshot an die Ausgabe als xlsx, docx, csv, md und PDF-Übersicht, statt einen ungebundenen Bericht zu erstellen. Ein Scan, der durch sein URL-Budget gestoppt wurde (stopped_by_budget), wird als letzter auditierter Scan des Projekts akzeptiert, und sein Bericht nennt den eingeschränkten Umfang. report-build --input akzeptiert den Schlüssel format. report-build --project --format json bei einem gestreamten Audit wird mit einer Begründung abgelehnt, weil das JSON unverändert geschrieben wird und den Checklisten-Snapshot nicht enthalten kann.

10. Oktober 2026

16 hinzugefügt51 geändert
  • GeändertFunktioniertDer Desktop-Scan-Monitor folgt dem ScanRun-Designboard: echter Prozentwert aus den#1203

    Zählern fetched und found, eine 10-px-Fortschrittsleiste, das Rate-Limit des Collectors und eine ehrliche 120-px-Platzhalter-Grafik für die Geschwindigkeit. Die Rate-Historie im Core wird in #1203 verfolgt.

    #1203 (Issue auf GitHub)
  • GeändertFunktioniertcheck_sample in seohead/checks/custom_extract.py führt CSS-, XPath- und#1059

    Regex-Extraktoren aus…

    check_sample in seohead/checks/custom_extract.py führt CSS-, XPath- und Regex-Extraktoren gegen ein gespeichertes HTML-Dokument aus, ohne Scan und ohne Netzwerkanfrage. Jedes Ergebnis enthält seine Werte und einen reason für ein leeres Ergebnis (no_match, empty_html oder budget_exceeded), sodass eine leere Antwort nie als sauberes Ergebnis erscheint (#1059). Es ist nur ein Core-Aufruf. Ein CLI- oder MCP-Tool ist noch nicht registriert, und das Abrufen einer Live-URL ist bewusst nicht enthalten.

    #1059 (Issue auf GitHub)
  • GeändertFunktioniertDie Prüfung der Pagination-Reihenfolge (PAGINATION_SEQUENCE_ERROR) bewertet jetzt#1057

    Schrittserien: Wenn ein Schritt…

    Die Prüfung der Pagination-Reihenfolge (PAGINATION_SEQUENCE_ERROR) bewertet jetzt Schrittserien. Deckt ein Schritt den größten Teil der Schritte einer Serie ab, wird ein Bruch von diesem Schritt gemeldet (?page=1,3,5,8 bricht bei 5 zu 8). Unregelmäßige Offset-Schemata und unnummerierte Serien bleiben ungeprüft und werden als übersprungen benannt.

    #1057 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeue Crawl-Prüfung INTERNAL_NOFOLLOW_OUTLINKS (Hinweis): benennt jede Quellseite…#1052

    Neue Crawl-Prüfung INTERNAL_NOFOLLOW_OUTLINKS (Hinweis): Jede Quellseite mit internen nofollow-Outlinks wird mit Anzahl und einer begrenzten Stichprobe der Ziele gemeldet. Damit ist die seitenbezogene Lücke bei der Zeile „Internal Nofollow Outlinks“ von Screaming Frog geschlossen, die bisher partial war. Die Prüfung läuft bei nativen Crawls und wird bei reinen Export- und URL-Listen-Durchläufen namentlich übersprungen.

    #1052 (Issue auf GitHub)
  • GeändertFunktioniertParser liest medienbezogene <link rel="alternate">-Angaben ohne hreflang (eine…#1051

    Der Parser liest medienbezogene <link rel="alternate">-Angaben ohne hreflang (eine separate mobile URL) in parse_html als mobile_alternates ein (#1051). Die SF-Prüfung Mobile Alternate Link ist weiterhin eine Lücke, denn die Prüfung, die das Canonical der mobilen URL vergleicht, ist noch nicht geschrieben.

    #1051 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeue Prüfung HREFLANG_UNLINKED_TARGET (Warnung): ein hreflang-Alternativziel, auf das#1050

    kein…

    Neue Prüfung HREFLANG_UNLINKED_TARGET (Warnung): Ein hreflang-Alternativziel, auf das im Crawl kein normaler Hyperlink zeigt, wird gemeldet. Damit ist Screaming Frogs Ansicht „Unlinked Hreflang URLs“ abgedeckt. Die Prüfung liest den Export All Hreflang und die Spalte Internal:All Inlinks, genau wie UNLINKED_CANONICAL. Ein Selbstverweis zählt nicht, und bei einem partiellen Crawl wird der Befund zurückgehalten. Die Registry wächst damit von 182 auf 183 Prüfungen.

    #1050 (Issue auf GitHub)
  • GeändertFunktioniertBildgrößen auf gerenderten Routen: render-check erfasst jetzt die intrinsische Pixelgröße…#1049

    Bildgrößen auf gerenderten Routen: render-check erfasst jetzt für jedes Bild die intrinsische Pixelgröße im Verhältnis zur gerenderten Box und zum Device Pixel Ratio (image_sizing: Nachweise für zu große und hochskalierte Bilder). Das liefert nur Nachweise; eine Prüfungs-ID im SF-analyzer gibt es noch nicht. Deshalb wechselt „Incorrectly Sized Images“ von Lücke zu teilweise abgedeckt (#1049).

    #1049 (Issue auf GitHub)
  • GeändertFunktioniertSemantically Similar: Der Status bleibt gap, die Notiz nennt jetzt den Blocker.#1041

    Befehl und MCP-Tool für semantische Ähnlichkeit existieren, aber es wird kein Embedding-Adapter ausgeliefert, und der SF-Lauf ruft das Modul noch nicht auf (#1041).

    #1041 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeue Prüfung INTERNAL_LINK_SPONSORED_UGC (Hinweis): ein Link innerhalb derselben#1040

    Website mit…

    Neue Prüfung INTERNAL_LINK_SPONSORED_UGC (Hinweis): Ein Link innerhalb derselben Website, der rel="sponsored" oder rel="ugc" trägt, wird mit seiner vollständigen rel-Tokenmenge gemeldet. Wie die übrigen rel-basierten Linkprüfungen braucht sie link_attributes.capture. Ohne diese Option wird sie als nicht gemessen ausgewiesen.

    #1040 (Issue auf GitHub)
  • HinzugefügtFunktioniertKern der XML-Sitemap-Erzeugung aus einem gespeicherten Scan: select_indexable behält#1039

    nur HTML-Seiten mit Status 200, die auf sich selbst kanonisiert sind, kein noindex tragen und nicht per robots.txt gesperrt sind. Für jede ausgeschlossene URL wird der Grund angegeben. render_sitemaps schreibt ein <urlset> oder bei 50.000 URLs bzw. 52.428.800 Byte pro Datei mehrere Dateien plus eine <sitemapindex>. CLI- und MCP-Anbindung folgen.

    #1039 (Issue auf GitHub)
  • HinzugefügtFunktioniertcloudflare-traffic (CLI) und seo_cloudflare_traffic (MCP): eine schreibgeschützte#1026

    Cloudflare-GraphQL-Analytics-Quelle für den Log-Analyzer, wenn die Origin-Logs fehlen (#1026, #1009). Sie liefert Bots × URLs × Statuscodes × Cache-Status pro Tag im Format von log-analyze. Die Daten sind mit source: cloudflare-aggregated gekennzeichnet, weil es gruppierte Edge-Daten und keine Rohlogs sind. Es gibt keine Client-IPs, also auch keine Reverse-DNS-Verifikation. Tage, die die Obergrenze von 10.000 Zeilen pro Seite erreichen, werden nach Zeitfenstern aufgeteilt. Der Aufruf wird im Spend-Journal als kostenloser Anbieter gezählt. Das Token stammt aus CLOUDFLARE_API_TOKEN oder SEOHEAD_CLOUDFLARE_TOKEN_FILE und wird nie ausgegeben.

    #1026 (Issue auf GitHub)
  • GeändertFunktioniertInterner Evaluator für Search-Console-Befunde, noch nicht in die Berichte eingebunden:#1025

    seohead/checks/search_console_findings.py verknüpft Crawl-Seiten mit einem normalisierten GSC-Nachweisdokument und wertet GSC_ORPHAN, NO_SEARCH_DATA und NON_INDEXABLE_WITH_SEARCH_DATA aus. Eine Prüfung wird mit Begründung übersprungen, wenn der Crawl partiell ist, das Zeitfenster unvollständig ist, die Erhebung gesampelt oder gekürzt wurde oder kein Nachweis vorliegt. Eine übersprungene Prüfung wird nie als fehlerfrei gemeldet.

    #1025 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-enrich meldet vier Web-Analytics-Befunde aus einer Offline-CSV mit URL als#1024

    Schlüssel: verwaiste URLs laut Analytics, indexierbare Seiten ohne Analytics-Daten, nicht indexierbare Seiten mit Besuchen und eine Absprungrate über 70 %. Mit den benannten Spalten --visits-column und --bounce-column wählen Sie die Daten aus. Fehlt eine Spalte, wird das namentlich abgelehnt. Nicht lesbare Werte werden gezählt und nie als null gewertet. Verwaiste URLs laut Analytics werden bei einem partiellen Crawl zurückgehalten. Die Live-Abfrage pro URL aus Metrika oder GA4 ist noch nicht enthalten (#990, #984).

    #1024 (Issue auf GitHub)
  • GeändertFunktioniertDie SF-Abdeckungsübersicht führt die vier Web-Analytics-Probleme (Orphan URLs, Bounce#1024

    Rate…

    Die SF-Abdeckungsübersicht führt die vier Web-Analytics-Probleme („Orphan URLs“, „Bounce Rate Above 70%“, „No GA Data“, „Non-Indexable with GA Data“) nicht mehr als außerhalb des Umfangs, sondern als Befunde von crawl-enrich aus einer Offline-CSV. sf run gibt sie weiterhin nicht aus.

    #1024 (Issue auf GitHub)
  • GeändertFunktioniertCoverage-Kern für ungenutztes CSS und JavaScript (#1023, Stufe 1): ein reiner Analyzer#1023

    nimmt…

    Coverage-Kern für ungenutztes CSS und JavaScript (#1023, Stufe 1): Ein reiner Analyzer verarbeitet die page.coverage-Payloads von Playwright und meldet pro Ressource die ungenutzten Zeichen. Ist eine große Ressource überwiegend ungenutzt, gibt es einen Befund. Das Erfassen der Coverage von einer gerenderten Seite folgt in der nächsten Stufe.

    #1023 (Issue auf GitHub)
  • GeändertFunktioniertAMP-Paarprüfungen (#1020): AMP_NON_200, AMP_MISSING_CANONICAL,#1020

    AMP_MISSING_RETURN_LINK, AMP_NON_INDEXABLE_CANONICAL und AMP_INDEXABLE lesen das AMP-Ziel, das eine Desktop-Seite mit <link rel="amphtml"> angibt. Beurteilt werden nur AMP-Seiten, die der Crawl erfasst hat. Ein nicht erfasstes Ziel wird als benannter Skip ausgewiesen. Der native Crawl schreibt das aufgelöste Ziel jetzt in die Spalte AMP HTML. Die übrigen zehn AMP-Regeln von SF bleiben bewusst ausgeschlossen.

    #1020 (Issue auf GitHub)
  • HinzugefügtFunktioniertHTML_OVER_2MB: absolute 2-MB-Obergrenze für HTML-Dokumente, getrennt von…#1019

    Neu ist HTML_OVER_2MB, eine absolute Obergrenze von 2 MB für ein HTML-Dokument, getrennt von der medianbezogenen Prüfung LARGE_HTML. Die SF-Prüfung „HTML Document Over 2MB“ wird jetzt darauf abgebildet und nicht mehr auf die Regel mit 200 KB.

    #1019 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeuer Hinweis URL_HAS_PARAMETERS im Crawl-Audit: interne HTML-Seite, deren URL…#1018

    Neuer Hinweis URL_HAS_PARAMETERS im Crawl-Audit: Eine interne HTML-Seite, deren URL Query-Parameter enthält, wird unabhängig vom Canonical-Status gemeldet. URL_HAS_PARAMS behält seine engere Bedeutung für Seiten ohne Canonical (#1018).

    #1018 (Issue auf GitHub)
  • GeändertFunktioniertRobots-Direktiven (#1017): veraltete noodp und noydir in Meta-Robots oder#1017

    X-Robots-Tag…

    Robots-Direktiven (#1017): Veraltete noodp- und noydir-Angaben in Meta-Robots oder X-Robots-Tag erzeugen jetzt die Hinweise NOODP und NOYDIR im SF-Audit. Bisher standen sie auf der Liste außerhalb des Umfangs. none (noindex+nofollow) ist für den X-Robots-Tag-Pfad und für den Meta-Pfad durch Regressionstests abgedeckt.

    #1017 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeue Prüfung JS_CONSOLE_ERRORS (SF „Pages with JavaScript Errors“): Seite, deren…#1015

    Neue Crawl-Prüfung JS_CONSOLE_ERRORS (SF „Pages with JavaScript Errors“): eine Seite, deren gespeicherte Render-Konsole Fehler protokolliert hat. Die Prüfung liest die gesicherten Konsolen-Begleitdateien eines nativen Scans offline, ohne erneutes Rendern. Ein nicht lesbarer Datensatz wird als benannter Skip ausgewiesen und nie als fehlerfreie Seite. Voraussetzung ist rendering.artifacts.console_errors.

    #1015 (Issue auf GitHub)
  • GeändertFunktioniertCrawls melden vier fehlende Sicherheits-Header pro HTML-Seite aus der gespeicherten…#1013

    Crawls melden jetzt vier fehlende Sicherheits-Header pro HTML-Seite aus der gespeicherten finalen Antwort: MISSING_CSP, MISSING_X_CONTENT_TYPE_OPTIONS, MISSING_X_FRAME_OPTIONS (erfüllt durch eine CSP-Direktive frame-ancestors) und MISSING_REFERRER_POLICY. Seiten, deren gespeicherte Header sich nicht parsen lassen, zählen als nicht gemessen und nicht als fehlerfrei. Ein Crawl ohne gespeicherten Scan überspringt sie mit Begründung.

    #1013 (Issue auf GitHub)
  • HinzugefügtFunktioniertValidator für geschlossene Spezifikationen von Seitenaktionen (click, scroll,#1011

    wait_for_selector, wait_ms) mit einem statischen Zeitbudget für gerenderte Crawls. Er ist noch nicht ans Rendering angebunden, daher bleibt das Crawl-Verhalten unverändert (#1011).

    #1011 (Issue auf GitHub)
  • GeändertFunktioniertlog-analyze liest gzip-komprimierte Zugriffslogs (rotierte access.log.N.gz-Dateien#1009

    und…

    log-analyze liest gzip-komprimierte Zugriffslogs direkt ein, also rotierte access.log.N.gz-Dateien und umbenannte Archive. Das Format erkennt es am Inhalt, nicht an der Dateiendung. Ein abgeschnittenes oder beschädigtes Archiv wird als Fehler gemeldet, ohne Teilzählungen.

    #1009 (Issue auf GitHub)
  • GeändertFunktioniertscan-url-query erhält fertige Ansichts-Presets (--preset, z.#1007

    B. status_4xx…

    scan-url-query bekommt fertige Ansichts-Presets (--preset, zum Beispiel status_4xx, title_missing, title_over_60, h1_missing, noindex_meta). Sie werden per UND mit Ihren Filtern verknüpft. Mit --export PATH und --export-format csv|xlsx schreibt der Befehl jede passende Zeile in eine neue Datei. Der Export bricht oberhalb von --export-max-rows ab (Standard: 100.000) und überschreibt nie eine vorhandene Datei.

    #1007 (Issue auf GitHub)
  • GeändertFunktioniertRegeln für Rich-Suchergebnisse aus dem Python-Code ausgelagert…#1001

    Die Regeln für Rich-Suchergebnisse wurden aus dem Python-Code in seohead/data/rich_results_rules.json ausgelagert, eine versionierte Datendatei, die mit dem Paket ausgeliefert wird. Der Wert version dieser Datei steht als rules_version an jedem Ergebnis. Eine Regel ändern Sie also über die Daten, nicht über den Code.

    #1001 (Issue auf GitHub)
  • GeändertFunktioniertBewertungen für Rich-Suchergebnisse (check_schema und Prüfungen gespeicherter#1001

    Strukturdaten)…

    Die Bewertungen für Rich-Suchergebnisse (check_schema und die Prüfungen gespeicherter strukturierter Nachweise) tragen jetzt rules_version. Damit nennt jedes Ergebnis den Offline-Regelstand, der es erzeugt hat.

    #1001 (Issue auf GitHub)
  • GeändertFunktioniertSechs Wartungs- und Generator-Skripte jetzt in der Doku beschrieben…#997

    Dokumentiert sind jetzt die sechs Wartungs- und Generator-Skripte, die bisher nirgends in der Doku vorkamen: scripts/generate_project_catalogue.py, generate_registry_inventory.py, render_readme_visuals.py, linux_lifecycle_smoke.py, capacity_watchdog.py und profile_million_audit.py. In docs/README.md steht, was jedes davon schreibt und welche in der CI laufen (#997).

    #997 (Issue auf GitHub)
  • HinzugefügtFunktioniertSemantic-Core-Pipeline als seohead/semantics mit eigener SQLite-Datenbank pro Projekt…#995

    Die Semantic-Core-Pipeline kommt als seohead/semantics mit eigener SQLite-Datenbank pro Projekt: seohead semantics <stage> --project DIR (init, import, collect, clean, graph, exact, cluster, competitors, synonyms, report, excel, mine, sitematch, relevance, status, export), die MCP-Tools seo_semantics_status, seo_semantics_run, seo_semantics_mine und seo_semantics_paid (kostenpflichtige Stufen brauchen confirm_paid=true), Louvain-Clustering hinter dem neuen Extra semantics, der mitgelieferte Skill semantic-core und ein synthetisches Beispielprojekt. Anbieterkosten einer Semantik-Stufe werden im gemeinsamen Spend-Journal markiert (#995).

    #995 (Issue auf GitHub)
  • GeändertFunktioniertGeführten Telegram-Bot-Adapter seohead/integrations/bot entfernt; Zustellbelege des#995

    Monitorings…

    Der geführte Telegram-Bot-Adapter seohead/integrations/bot wurde entfernt. Die Zustellbelege des Monitorings liegen jetzt in seohead/projects/service_delivery.py (#995).

    #995 (Issue auf GitHub)
  • GeändertFunktioniertscan-url-query liefert click_depth, den kürzesten internen Linkpfad ab der Startseite#992

    des Scans, als Spalte, Filter und Sortierschlüssel. Seiten, die kein gespeicherter Link erreicht, haben den Wert NULL (verwaiste Seiten). crawl_depth bleibt unverändert und ist weiterhin die Frontier-Tiefe, für jede aus der Sitemap gestartete URL also 0. Ein Scan, der seine Links nicht gespeichert hat, schlägt mit reason_code: click_depth_unavailable fehl, statt ein falsches NULL zu melden. Der Wert wird bei jeder Abfrage aus der Tabelle links neu berechnet. Ihn beim Abschluss des Scans als indizierte Spalte zu speichern, ist noch offen, weil dafür eine Entscheidung zur Schemaversion nötig ist (#992).

    #992 (Issue auf GitHub)
  • GeändertFunktioniertscan-url-query und sein MCP-Tool akzeptieren ein optionales Argument facets (eine#991

    Liste von Gruppen-IDs oder all). Es liefert in einem Durchgang pro Gruppe Zählwerte über dieselben Filter: status_2xx bis 5xx, title_missing, canonical_missing, directives_noindex/nofollow, with_outlinks. Gruppen, die eine Projektion brauchen (intern/extern, Sitemap, Title-Duplikate und -Länge, Canonical selbst/anders), sind noch nicht enthalten.

    #991 (Issue auf GitHub)
  • GeändertFunktioniertProjektquellen-Bindungen, erste Stufe (#990): project-sources-link,#990

    project-sources-unlink und project-sources-list (CLI, dazu seo_project_sources_link|unlink|list über MCP) halten fest, welche Anbieter-Ressourcen-IDs ein lokales Projekt nutzt. Die Angaben stehen in sources.json neben project.json. Nur offline: keine Erkennung, kein Anbieteraufruf, keine Zugangsdaten. project.json wird nie umgeschrieben.

    #990 (Issue auf GitHub)
  • GeändertFunktioniertNativer Crawl: neue Prüfung IMG_BROKEN (#989, Stufe 1) meldet <img>-Ziele mit 4xx/5xx…#989

    Nativer Crawl: Die neue Prüfung IMG_BROKEN (#989, Stufe 1) meldet <img>-Ziele, die mit 4xx oder 5xx geantwortet haben, und nennt die Quellseite als Nachweis. Sie liest den gespeicherten Ressourcengraphen und überspringt ehrlich, wenn kein Bild gemessen wurde.

    #989 (Issue auf GitHub)
  • HinzugefügtFunktioniertReiner Soft-404-Klassifikator über dem gespeicherten Seitentext#988

    (classify_stored_soft404)…

    Neu ist ein reiner Soft-404-Klassifikator über dem gespeicherten Seitentext (classify_stored_soft404). Er erkennt leeren Text, eine Fehlerphrase auf einer dünnen Seite und einen Simhash-Treffer auf eine 404-Vorlage. Er ist noch nicht in den Crawl eingebunden und gibt keine Befunde aus. Das ist die erste Stufe von Issue #988.

    #988 (Issue auf GitHub)
  • GeändertFunktioniertNative Crawls prüfen Canonical- und hreflang-Ziele, die kein Link erreicht hat, nach dem#987

    Crawl je Ziel einmal, höchstens 5.000. Antwortet ein Ziel mit 4xx oder 5xx oder leitet es weiter, meldet der Crawl CANONICAL_TARGET_ERROR, CANONICAL_TO_REDIRECT oder HREFLANG_BROKEN_TARGET, wie bisher schon bei gecrawlten Zielen (#987).

    #987 (Issue auf GitHub)
  • GeändertFunktioniertBefunde zu Weiterleitungsketten und -schleifen tragen jetzt den vollständigen Sprungpfad…#985

    Befunde zu Weiterleitungsketten und -schleifen aus einem nativen Crawl enthalten jetzt den vollständigen Sprungpfad (details.path). So lässt sich bei einer Korrektur jeder Sprung benennen, der ersetzt werden muss. Bezug: #985.

    #985 (Issue auf GitHub)
  • GeändertFunktioniertBefunde zu Weiterleitungsketten und -schleifen aus einem nativen Crawl enthalten jetzt#985

    auch details.inbound_links (interne Links, die noch auf die erste URL der Kette zeigen, mit Ankertexten, begrenzt auf 20) und inbound_links_count. Ohne ein Inventar aller Inlinks steht das Feld auf null, mit Begründung. Bezug: #985.

    #985 (Issue auf GitHub)
  • GeändertFunktioniertProjekte können den Link zu ihrem Semantic Core als vom Betreiber erfasste Fakten#984

    speichern…

    Projekte können einen Link zu ihrem Semantic Core als vom Betreiber eingetragene Fakten speichern: semcore_project, semcore_cluster_count, semcore_landing_mapping. Der Semantic Core bleibt in seiner eigenen Datenbank und wird nicht in die Projektdatenbank übernommen. Die Erkennung schreibt diese Fakten nie, und ein eingetragener Fakt kann sich nicht als Erkennungsherkunft ausgeben. Dokumentiert in docs/PROJECTS.md unter „Linking a semantic core“ (teilweise #984).

    #984 (Issue auf GitHub)
  • GeändertFunktioniertDesktop: Der Bildschirm Link graph folgt dem GraphFilters-Design (Canvas und Filterpanel).#975

    Der Kern liefert noch nicht den gesamten Link-Graphen. Deshalb zeigt das Canvas einen ehrlichen Wartezustand, und die Filter bleiben inaktiv, bis der Kern ihn liefert (#975).

    #975 (Issue auf GitHub)
  • GeändertFunktioniertGSC-OAuth: provider-auth --action cancel (CLI) und seo_provider_auth mit#964

    action=cancel (MCP) brechen einen ausstehenden Browser-Zustimmungsablauf ab. status zeigt den ausstehenden Ablauf an, wenn einer existiert. Der Ablaufdatensatz speichert keine Berechtigungsdaten und läuft nach zehn Minuten ab. Das ist die erste Stufe von #964: Es gibt noch keinen Browser-Start und keinen Callback. Die öffentliche Oberfläche legt deshalb keinen Ablauf an, und ein verbundener Zugriff wird weiterhin nie behauptet.

    #964 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-site --urls/--urls-file --project registriert den URL-Listen-Crawl jetzt als#962

    Beobachtungslauf (mode=list). Er erscheint dadurch in project-observe und project-scans mit seinem Artefakt im Verzeichnis scans/ des Projekts. Ein fehlgeschlagener Collector wird als failed vermerkt. Fortschritt und Wiederaufnahme von Listen-Läufen sind noch nicht abgedeckt (#962).

    #962 (Issue auf GitHub)
  • HinzugefügtFunktioniertStrukturierte Gliederung der Playbooks: skill-list und scenario-list liefern…#955

    Neu ist eine strukturierte Gliederung der Playbooks: skill-list und scenario-list liefern die geordneten Schritte jedes Playbooks, und skill-show bzw. scenario-show ergänzen Überschriften und Schritte. So kann ein Agent die Methode lesen, ohne Markdown zu parsen (#955). Neu sind außerdem der CLI-Befehl scenario-list und das MCP-Tool seo_scenario_list.

    #955 (Issue auf GitHub)
  • GeändertFunktioniertscan-content-search mit --kind regex (MCP kind="regex") für gespeicherte Dokumente…#954

    scan-content-search akzeptiert --kind regex (MCP kind="regex"), um gespeicherte Dokumente mit einem Python-Regulärausdruck zu durchsuchen. Ungültige Ausdrücke werden vor dem Scan abgelehnt. Ein Dokument, das das Zeitbudget für den Regex überschreitet, wird als nicht verfügbar gemeldet, nie als fehlend.

    #954 (Issue auf GitHub)
  • GeändertFunktioniertDataForSEO-Aufrufe ohne Antwort (Netzwerkfehler nach dem Senden) werden als cost_unknown#949

    vermerkt…

    DataForSEO-Aufrufe, deren Antwort verloren geht (Netzwerkfehler nach dem Senden der Anfrage), werden im Journal mit cost_unknown und charge_status: unknown vermerkt. spend-report führt sie deshalb als unsicher auf und zählt sie nicht als gemessenen Aufruf ohne Kosten (#949).

    #949 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeuer Befehl scan-structured-blocks (CLI) und MCP-Tool seo_scan_structured_blocks…#948

    Neu sind der Befehl scan-structured-blocks (CLI) und das MCP-Tool seo_scan_structured_blocks. Für eine gespeicherte URL beschreiben sie jeden JSON-LD-Block mit seiner Quellzeile, dem Status valid / errors / warnings / parse_error, den Typen, einer flachen Liste der Eigenschaften, dem begrenzten Quell-JSON und den Fehlern im Schema.org-Graphen. Das arbeitet offline und nur auf dem gespeicherten vollständigen Seitenkörper, ohne Netzwerkanfragen und ohne Änderungen an Artefakten.

    #948 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-site ohne Projekt teilt jetzt sein Request-Limit pro Host mit parallelen Crawls…#942

    crawl-site ohne Projekt, das ein SQLite-Scan-Artefakt schreibt, teilt seine Obergrenze für Anfragen pro Host jetzt mit anderen gleichzeitigen Crawls desselben Hosts. Dafür gibt es einen privaten Zeitplan im Benutzerverzeichnis (~/.config/seohead/.origin-pacing.sqlite). Projektlose Crawls liefen bisher prozessübergreifend ungedrosselt.

    #942 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-site-Profile (#941): crawl-profile list zeigt die gespeicherten Profilnamen und…#941

    crawl-site-Profile (#941): crawl-profile list zeigt die gespeicherten Profilnamen, crawl-profile delete NAME entfernt eines. Beide Befehle geben JSON aus und lehnen unbekannte Namen mit der Liste der gespeicherten Profile ab.

    #941 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-site-Profile (#941): --save-profile NAME --config FILE speichert eine geprüfte#941

    Crawler-Konfiguration als benanntes Profil. Sie wird abgelehnt, wenn sie Zugangsdaten-Header enthält. --profile NAME startet den Crawl mit dem Profil, und --set wird weiterhin darüber angewendet. Profile liegen in ~/.config/seohead/crawl-profiles oder im Verzeichnis, das SEOHEAD_CRAWL_PROFILES nennt. Auflisten und Löschen von Profilen sind in dieser Stufe noch nicht enthalten.

    #941 (Issue auf GitHub)
  • GeändertFunktioniertcompare.v1 listet jetzt Seiten, die nur auf einer Seite gecrawlt wurden (url_sets:#938

    only_in_before…

    compare.v1 listet jetzt Seiten, die nur auf einer Seite des Vergleichs gecrawlt wurden (url_sets: only_in_before, only_in_after, Anzahlen). Ist einer der beiden Crawls partiell, steht url_sets.unproven auf true. Das Fehlen einer URL wird dann nicht als Beweis dargestellt.

    #938 (Issue auf GitHub)
  • GeändertFunktioniertSprünge in Weiterleitungs- und Canonical-Ketten speichern Status, nächstes Location und#930

    Antwortzeit…

    Jeder Sprung in Weiterleitungs- und Canonical-Ketten speichert Status, nächstes Location (bei Weiterleitungen) und Antwortzeit. So lässt sich die Kette einer URL aus gespeicherten Nachweisen lesen, ohne eine weitere Anfrage (#930).

    #930 (Issue auf GitHub)
  • GeändertFunktioniertWeiterleitungsschleifen enden in URL-Ketten mit einem Markierungsschritt ({"url": ..., "loop": true}#930

    )…

    Weiterleitungsschleifen in URL-Ketten enden mit einem Markierungsschritt ({"url": ..., "loop": true}). Er wird nicht erneut abgerufen, sodass die wiederholte URL in den gespeicherten Nachweisen sichtbar ist. final_url zeigt weiterhin auf den letzten abgerufenen Sprung (#930).

    #930 (Issue auf GitHub)
  • HinzugefügtFunktioniertRemediation-Ledger: Schritte create und scan-ingest über CLI und MCP verfügbar…#926

    Die Schritte create und scan-ingest des Remediation-Ledgers sind über CLI und MCP verfügbar: remediation-create bzw. seo_remediation_create legt ein neues, leeres Ledger an, das an ein Projekt gebunden ist (producer_build muss ein vollständiger 40-stelliger Git-SHA sein, bestehende Pfade werden abgelehnt). remediation-ingest bzw. seo_remediation_ingest übernimmt ein gespeichertes Audit als Baseline und Historie, ohne den Crawl erneut laufen zu lassen. Das erneute Einlesen derselben Revision ist idempotent. Die Speicherlogik bleibt unverändert. Das ist die erste Stufe von #926.

    #926 (Issue auf GitHub)
  • GeändertFunktioniertcrawl_site und Scan-Läufe melden effective_max_requests_per_second und warnings:#925

    Warnung…

    crawl_site und Scan-Läufe melden effective_max_requests_per_second und warnings. Ab einer effektiven Rate von mehr als 2 req/s gibt es eine Warnung; der Schwellenwert gilt strikt größer als 2. Die CLI gibt dieselbe Warnung auf stderr aus. JSON auf stdout und die Standardwerte bleiben unverändert. Am Pacer wurde nichts geändert.

    #925 (Issue auf GitHub)
  • GeändertFunktioniertStrukturiertes Projekt-Ereignisprotokoll (events.jsonl): nur anhängbare Ereignisse mit#923

    Quelle, Akteur und begrenztem Text. Gelesen wird vom neuesten zum ältesten, seitenweise, mit Filtern nach Quelle und Text. Verfügbar als project-event-append und project-event-page in der CLI sowie als seo_project_event_append und seo_project_event_page über MCP (Issue #923).

    #923 (Issue auf GitHub)
  • HinzugefügtFunktioniertBefehl ai-column und MCP-Tool seo_ai_column: erste Stufe der benutzerdefinierten

    KI-Spalte…

    Neu sind der Befehl ai-column und das MCP-Tool seo_ai_column, die erste Stufe der benutzerdefinierten KI-Spalte (Bezug: #1012). Für ausgewählte gespeicherte Scan-Seiten oder übergebene normalisierte Einträge bereiten sie einen begrenzten Plan vor, auf Basis von Title, Überschriften und einem Textauszug. Dazu kommen eine zeichenbasierte Größenschätzung ohne Preis und der Zustimmungsumfang, den der aufrufende Agent vor jeder Übertragung einhalten muss. Übergebene Werte pro URL werden gegen den Quell-Hash jeder Seite geprüft. Fehlende, veraltete, leere oder zu große Werte werden als solche gemeldet und nie aufgefüllt. Optional exportiert ein formelsicheres CSV die Spalte. SEOHEAD hält keinen Anbieterschlüssel und führt keinen Modellaufruf durch.

  • GeändertFunktioniertGemeinsame Helfer zum Öffnen lesender und schreibender SQLite-Datenbanken in

    seohead.core.sqlite.

    Storage-Reader, Scan-Importer, GSC-Archiv, Sources-Store, Evidence-Join-Store und die beiden Prüfklassen öffnen ihre Datenbanken jetzt über einen gemeinsamen Helfer für Verbindung, Row-Factory und PRAGMAs. Die beiden Prüfklassen schließen ihre Verbindungen explizit. Das Verhalten bleibt gleich. Pfadnormalisierung und PRAGMA-Reihenfolge bleiben an jeder Aufrufstelle.

  • GeändertFunktioniertKorrekturen aus einem Review von Prüfungen, Datenquellen und Nachweis-Import.

    Verhaltensänderungen auf diesen Pfaden sind beabsichtigt: - Weiterleitungsketten mit genau der Sprunggrenze (Standard: 20) werden jetzt aufgelöst, statt als nicht auflösbar gemeldet zu werden. Die Schleifenprüfung läuft vor der Grenzprüfung, sowohl bei der Kettenauflösung als auch bei den Sprungpfad-Durchläufen. - EEAT-Vertrauens- und Zitationsprüfungen vergleichen Zielhosts mit ihrem Port (netloc), analog zur Logik für interne Links. Websites mit expliziten Ports können dadurch andere Ergebnisse liefern. - llms.txt-Stichwortprüfungen treffen ASCII-Begriffe als ganze Wörter, optional mit Pluralform. Dadurch bestehen rapid, Showcase und Toolbar nicht mehr. Kyrillische Stämme werden weiterhin als Teilzeichenfolge erkannt. - Die Navigationserfassung bildet den Grund reload auf refresh_navigation ab. Nicht zugeordnete angeforderte Gründe, etwa pageBlockInterstitial, werden als Frame-Beobachtungen erfasst, die der Validator akzeptiert. - Die Technologieerkennung behandelt eine negierte Implikation (["not", X]) als Implikation von nichts. - Der Nachweis-Import weist doppelt deklarierte Metrikennamen ab, und die Search-Console-Erkennung verwendet die Zeilen, die sie erhält. - Yandex-Cloud-Wiederholungen warten nur zwischen den Versuchen. Yandex-Webmaster-Query-Analytics-Wiederholungen warten vor dem nächsten Versuch. - Der Schema-Build übergibt sein timeout an den HTTP-Client (Standard unverändert). - Der Speicher für Zustellbelege wird mit Modus 0600 angelegt, bevor SQLite ihn öffnet. - Semantische Graph-Läufe werden seriell ausgeführt, weil die Stoppwortmenge Modulzustand ist. Der semantische Runner meldet SQLite-Fehler als ok: false, statt sie auszulösen. - Der CrUX-Fehlerparser verkraftet Antwortkörper, die keine Objekte sind. - Eine unerreichbare Prüfung sqlite3 is None im Ledger wurde entfernt.

  • GeändertFunktioniertDesktop: ein Backlinks-Bildschirm im Design-v2-Layout.

    Er zeigt den ehrlichen Wartezustand, bis der Kern ein Projekt-Linkprofil speichert (#999). Es gibt keine Beispielzeilen, und die Gruppenfilter sind mit demselben Grund deaktiviert.

  • GeändertFunktioniertDesktop-Crawler-Bildschirm: Banner für temporäre Ergebnisse mit gewählter Adresse und

    Status…

    Desktop-Crawler-Bildschirm: Hinzugefügt wird ein Banner für temporäre Ergebnisse mit der ausgewählten Adresse und dem Statustext. Es erscheint nur, wenn ein Crawl ohne Projekt Ergebnisse liefert. Die Aktionen zum Leeren und zum Speichern als Projekt wandern unter 1000 px Breite in ein Überlaufmenü. Adressfeld und Prüfungs-Tabs bleiben bei schmaler Breite nutzbar. Der Ergebniskopf scrollt, statt seine Spalten zu stauchen. Die Statusleiste der Shell erhält in dunklem und hellem Design denselben rechten Innenabstand von 8 px.

  • GeändertFunktioniertDesktop: Bildschirm für fatale Zustände je Canvas (ErrorsCore): fehlender Kern, wenig

    Speicherplatz…

    Desktop: Der Bildschirm für fatale Zustände folgt dem Canvas ErrorsCore. Fehlender Kern, wenig Speicherplatz und fehlende Schreibrechte werden aus echten Fakten angezeigt. Kernversion und Scan-Integrität zeigen die neutrale Pille „in dieser Kernversion nicht verfügbar“, bis der Kern sie meldet.

  • GeändertFunktioniertDesktop: URL-Zeilenmenü, Spaltenkopfmenü, Menüleisten-Gruppen Edit, Scan und…

    Desktop: Das URL-Zeilenmenü und das Spaltenkopfmenü, die Menüleisten-Gruppen Edit, Scan und Window sowie die Kontextmenüs für Befunde und Aufgaben folgen dem Menüs-Board des Canvas. Einträge, die der Kern noch nicht liefert, bleiben sichtbar, aber deaktiviert. Der Grund steht im Tooltip.

  • GeändertFunktioniertDesktop: Bildschirm „Export und Berichte“ folgt dem Canvas ProjExport (Datensatz…

    Desktop: Der Bildschirm „Export und Berichte“ folgt dem Design-Canvas ProjExport (Auswahl von Datensatz und Format, Ordnerkarte, letzte Exporte). Datensätze und Formate, die der Kern noch nicht exportieren kann (Vergleich, Aufgaben, PDF), werden als nicht verfügbar angezeigt. Der Startknopf bleibt deaktiviert, bis der Export angebunden ist (#1191).

  • GeändertFunktioniertFührende TAB- und CR-Zeichen in Marketing-Inventar-Kennungen und CSV-Prüflisten

    neutralisieren…

    Führende TAB- und CR-Zeichen in Marketing-Inventar-Kennungen und in CSVs mit Entwürfen für Meta-Descriptions werden mit demselben Apostroph-Präfix neutralisiert, das bereits für =, +, - und @ gilt. Beide Schutzmaßnahmen nutzen jetzt seohead.core.tabular.neutralize_formula.

  • GeändertFunktioniertProvider-Anfragen mit Zugangsdaten folgen keinen Weiterleitungen mehr

    Anfragen an Provider mit Zugangsdaten (Arsenkin, Metrika, Yandex Cloud, IndexNow, Topvisor, BI-Ziele) folgen keinen HTTP-Weiterleitungen mehr. So wird ein Authorization-Header nie an einen anderen Host gesendet. Eine Weiterleitung erscheint jetzt als HTTP-Fehler des Providers.

  • HinzugefügtFunktioniertNeues Redirect-Format csv mit Zeilen source,target,301

    Neues Redirect-Format csv (Zeilen source,target,301, bei Bedarf in Anführungszeichen) für generate_rule und die CLI-Hilfe von redirects-generate. Das Format wordpress-redirection ist nicht enthalten, da seine Import-Syntax nicht verifiziert wurde (#998).

  • GeändertFunktioniertDas Laufjournal (runs.jsonl) wird ab einer Größengrenze rotiert

    Das Laufjournal (runs.jsonl) rotiert jetzt, sobald es eine Größengrenze überschreitet (standardmäßig 5 MiB; SEOHEAD_RUN_LOG_MAX_BYTES überschreibt den Wert). Die vorherige Generation bleibt als runs.jsonl.1 erhalten. Lesezugriffe umfassen beide Dateien, sodass Reuse-Abfragen weiterhin aktuelle Aufrufe finden.

  • GeändertFunktioniertSchema-Tab der URL-Karte in der Desktop-App im Design-v2-Layout

    Der Schema-Tab der Desktop-URL-Karte nutzt die Canvas-Struktur von Design v2 (Blockliste, Blockbaum, Prüfungen). Der Core liefert nur die Anzahl der JSON-LD-Blöcke pro URL. Deshalb zeigen die Spalten ehrliche Wartezustände mit Verweis auf Core-Issue 948. Bekannte Anzahlen bleiben echt, Beispielblöcke gibt es keine.

9. Oktober 2026

4 hinzugefügt4 geändert
  • HinzugefügtFunktioniertTerminal mit RU/EN-Beschriftung, Scan-Fortschritt und kompakter Ausgabe#951

    Terminal-Beschriftungen in RU oder EN je nach Sprachauswahl, ein Block für den laufenden Scan, eine explizite Scan-Auswahl und eine kompakte Ausgabe des Observers.

    #951 (Issue auf GitHub)
  • GeändertFunktioniertGespeicherte Scans öffnen sich für Lesezugriffe schlanker (#931)#931

    scan-status, scan-url-detail, scan-link-inspect und der Projekt-Observer (project-scans, project-observe) validieren das gesamte Artefakt nicht mehr bei jedem Öffnen. Sie prüfen Identität, Schema, Version und Kopfzeile, holen Zähler per SQL (GROUP BY über pages_status) und weisen dies im ergänzenden Feld validation aus ("light" oder "full"). Eine vollständige Validierung läuft auf Anforderung (full_validation: true bei scan-status oder --input '{"input_path": "...", "full_validation": true}' in der CLI) oder wenn dieselben Bytes (Pfad, Größe, mtime, WAL-Zustand, Header-Hash) im Prozess bereits vollständig validiert wurden. Ein Scan, der die leichten Prüfungen nicht besteht, wird mit demselben Fehler abgelehnt wie zuvor. Jeder Schreib- oder Nachweis-Pfad validiert weiterhin vollständig. scan-url-detail führt die Suche nach dem Weiterleitungsziel (ohne Index auf responses.effective_url_id) innerhalb eines Budgets von 0,5 s aus und meldet responses.redirect_target_lookup als skipped, statt eine große Tabelle zu scannen.

    #931 (Issue auf GitHub)
  • HinzugefügtFunktioniertProtokollierter gemeinsamer MCP-Status mit Widerruf von Tool-Aufrufen#929

    Gemeinsamer, protokollierter MCP-Status mit Widerruf beim Start und live während laufender Tool-Aufrufe. Die sichere Anwesenheit der Clients ist über die CLI einsehbar.

    #929 (Issue auf GitHub)
  • HinzugefügtFunktioniertClient-Registrierung nur mit ausdrücklicher Erlaubnis#929

    Client-Registrierung mit ausdrücklicher Zustimmung, Vorschau, atomaren Schreibvorgängen, geprüften Sicherungen und konfliktsicherer Wiederherstellung.

    #929 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeu: scan-url-query (MCP seo_scan_url_query) für gefilterte Abfragen#927

    Neu: scan-url-query (MCP seo_scan_url_query), ein reiner Lesezugriff mit serverseitigem Filtern, Sortieren und Paginieren über die gesamte Seitentabelle eines gespeicherten Scans. Die Antwort enthält total, filtered_total (null plus filtered_total_state: capped, wenn die Zählung ihr Zeitbudget überschreitet), eine Spaltenauswahl, Labels zur Scan-Abdeckung, das Format seohead.scan-url-query.v1 und in jedem Fehlerfall einen maschinenlesbaren reason_code. Pro Aufruf sind höchstens 200 Zeilen möglich. Sortierung nach url, status_code, page_ordinal oder url_id nutzt Indizes. Jede andere Spalte braucht einen Filter, der höchstens 100.000 Zeilen übrig lässt, sonst kommt sort_not_indexed. Der Scan wird mit leichter Identitäts- und Schemaprüfung geöffnet, nicht mit vollständiger Validierung, und nie verändert.

    #927 (Issue auf GitHub)
  • GeändertFunktioniertPaginierte Links mit scan-link-inspect --view links (MCP seo_scan_link_inspect)#924

    scan-link-inspect --view links (MCP seo_scan_link_inspect) blättert durch die ausgehenden oder eingehenden Hyperlinks einer URL. Die Suche erfolgt über die Adresse statt über die Dokument-ID. Angezeigt werden Anker, rel mit den Flags nofollow/sponsored/ugc, intern oder extern, gespeicherte Position, Attribut target und der HTTP-Status der Gegenseite (null, wenn diese Seite nicht gescannt wurde). Filter nach Linktyp, Follow-Status, Statusklasse und Teilstring. offset/limit bis 200. total/filtered_total sind exakt oder als gekürzt markiert. Der Scan wird schreibgeschützt ohne vollständige Validierung geöffnet. Fehler tragen einen maschinenlesbaren reason_code (url_not_found, scan_not_available, url_not_scanned, links_not_retained). Bestehende Ansichten und Felder bleiben unverändert.

    #924 (Issue auf GitHub)
  • GeändertFunktioniertPaketstruktur neu geordnet, ohne Kompatibilitäts-Shims (seohead.servers)

    Paketstruktur neu geordnet, ohne Kompatibilitäts-Shims: seohead.servers heißt jetzt seohead.mcp, seohead.tools heißt jetzt seohead.checks. seohead.bot und seohead.remote_api liegen nun unter seohead.integrations. Die CLI befindet sich im Paket seohead.cli (mit seohead.cli.terminal_progress). Die gemeinsamen Root-Module (models, graph, filesystem, runlog, verification, canonical_policy, input_contracts, job_contracts, provider_matrix) wanderten nach seohead.core, die Build-Herkunft nach seohead._build.provenance. examples/ und config.example.json liegen jetzt in docs/examples/, PROVENANCE.md und TRADEMARKS.md in docs/legal/. Die Befehle seohead und sf-analyzer bleiben unverändert. Python-Importe alter Modulpfade müssen angepasst werden.

  • GeändertFunktioniertREADME neu geschrieben: Installation, Schnellstarts und Funktionsübersicht

    Das README wurde um Installation, drei Schnellstart-Pfade (nativer Crawl bis Bericht, Offline-Exporte von Screaming Frog, Projekt plus Agent), eine Funktionsübersicht nach Bereichen, eine CLI-Übersicht, MCP-Setup für Claude Code und Claude Desktop, die Begleit-Desktop-App und die Grenze zwischen Gemessenem und Nicht-Gemessenem neu aufgebaut. Terminal-Screenshots unter docs/assets/ stammen aus einem lokalen QA-Fixture und dem synthetischen Export-Fixture. Neu hinzu kommen docs/CLI.md, das jeden registrierten Befehl nach Aufgabe gruppiert, mit Kennzeichnung für Netzwerk, Schreibzugriff und Kosten (ein Drift-Test schlägt fehl, wenn ein Befehl fehlt), und docs/WORKFLOWS.md, das die bisher nur referenzierten Befehle für Workflow-Läufe, Posteingang und Monitor-Records dokumentiert.

8. Oktober 2026

1 hinzugefügt10 geändert1 behoben
  • BehobenFunktioniertByte-Zählung für HTML/DOM bleibt transaktionslokal und inkrementell#914

    Die Byte-Zählung für gespeichertes HTML/DOM bleibt transaktionslokal und inkrementell, statt alle gespeicherten Body-Inhalte für jede eindeutige Antwort neu zu scannen. Beim erneuten Öffnen wird der Zähler einmal neu aufgebaut. Deduplizierung, Rollback, Savepoints und Grenzen der Body-Speicherung bleiben erhalten.

    #914 (Issue auf GitHub)
  • GeändertFunktioniertBI-Reporting: nicht verifizierte Erhebungsstatus bleiben unbekannt#833

    Das BI-Reporting behält nicht verifizierte Erhebungsstatus der Provider und Qualitätsflags als unbekannt in Metriken, Abdeckung und Manifesten. Bestätigtes Sampling, Schwellenwerte oder Kürzungen gelten als teilweise. Kohorten „Suche vs. Sitzungen“ verlangen eine explizite Erhebungsqualität, nichtnegative Zählmessungen und qualifizierte Quellbereiche. Pro Achse bleiben Quellidentität, Attribution, Suchbereich und Kalenderregel erhalten. Das synthetische Reporting-Paket bleibt offline. Die native Abnahme für Sheets und Looker ist separat.

    #833 (Issue auf GitHub)
  • GeändertFunktioniertNative SQLite-Scans akzeptieren max_urls=0 für unbegrenztes Sammeln#818

    Native SQLite-Scans akzeptieren max_urls=0, um bis zur vollständigen Leerung der Warteschlange zu sammeln, und max_depth=-1, um das Tiefenlimit abzuschalten. Zeit- und HTTP-Budgets bleiben separat konfigurierbar, Speicherschutz sowie Unterbrechung und Wiederaufnahme bleiben aktiv. Ältere materialisierte Routen lehnen eine unbegrenzte URL-Menge ab.

    #818 (Issue auf GitHub)
  • GeändertFunktioniertSitemap-only-Scans behalten das deaktivierte URL-Limit bei#818

    Auch Sitemap-only-Scans behalten das deaktivierte URL-Limit bei. Sie lehnen ihr erstes deklariertes Element nicht mehr ab, wenn das konfigurierte Limit null ist.

    #818 (Issue auf GitHub)
  • GeändertFunktioniertFeste Request-Raten über dem Standard von 2 Requests/s wirken jetzt#818

    Explizit festgelegte endliche Request-Raten über dem Standard von 2 Requests/s wirken jetzt auch auf die gemeinsame Pacing-Spur pro Projekt-Origin, nicht nur auf den Limiter pro Scan. Parallele Scans reservieren weiterhin einen gemeinsamen Zeitplan pro Host, statt dessen Rate zu vervielfachen.

    #818 (Issue auf GitHub)
  • GeändertFunktioniertAbbruch der nativen Analyse liefert ein fortsetzbares Teilergebnis#754

    Wird die native Analyse unterbrochen, liefert sie jetzt ein explizites, fortsetzbares Ergebnis mit Status „unterbrochen“ und behält die erfassten Seiten. Ein KeyboardInterrupt-Traceback entfällt.

    #754 (Issue auf GitHub)
  • GeändertFunktioniertProjektkatalog nach dem Bing-Szenario-Update neu generiert#754 (Issue auf GitHub)
  • GeändertFunktioniertFehlerhafte Bing-Webmaster-Antwortzeilen werden abgelehnt#753

    Fehlerhafte Antwortzeilen von Bing Webmaster werden abgelehnt, statt ein vollständiges leeres Ergebnis zu melden. Rohdaten, Quellzeilen und exakte zurückgegebene Zählwerte bleiben in den gespeicherten Provider-Nachweisen erhalten. Antworten mit Link-Zählungen behalten ihre dokumentierte Seitenstruktur. Umfasst die Gesamtmenge mehrere Seiten und wurde nur eine angeforderte Seite erfasst, wird sie als teilweise gemeldet.

    #753 (Issue auf GitHub)
  • GeändertFunktioniertGemeinsamer Google-Dienstkonto-Fallback für GA4 erkannt#753

    Der bestehende gemeinsame Google-Dienstkonto-Fallback wird in der GA4-Readiness und bei der Erkennung von Zugangsdaten erkannt. Berechtigungen des Kontos und Zugriff auf das Ziel bleiben ungeprüft. Fehlerhafte Zugangsdaten werden ausdrücklich gemeldet. OAuth-Bearer-Unterstützung bleibt erhalten, ohne dass beide Quellen gleichzeitig nötig sind.

    #753 (Issue auf GitHub)
  • GeändertFunktioniertHeadless-Fähigkeiten an native Run-Isolation und öffentliches Routing binden#743

    Headless-Fähigkeitsreferenzen werden an die native Run-Isolation und die Routing-Grenze für öffentliche externe Crawls gebunden. Dabei wird interne Implementierung von der Verfügbarkeit in CLI und MCP unterschieden. Crawl-Verhalten und Kapazitätsaussagen bleiben unverändert.

    #743 (Issue auf GitHub)
  • HinzugefügtFunktioniertBegrenzte Seiten abgeschlossener Läufe in project-observe (CLI und MCP)

    Begrenzte Paginierung abgeschlossener Läufe für project-observe in CLI und MCP, wobei jeder gespeicherte laufende Datensatz sichtbar bleibt. Seiten erhalten exakte Run-IDs und die umgekehrte Zulassungsreihenfolge. Zählwerte und Aufbewahrungsangaben beziehen sich auf den aktuellen Speicher mit 100 Datensätzen, nicht auf die gesamte Historie. Lesen ändert gespeicherte Laufzeitzustände nie. JSON-CLI-Eingaben behalten ihre Paginierung und Projektbeschränkung, sofern kein ausdrücklich benannter Schalter sie überschreibt.

  • GeändertFunktioniertCtrl+C wird über die gesamte native Nacherfassung behandelt

    Ctrl+C wird über die gesamte native Übergabe nach der Erfassung behandelt, einschließlich Öffnen des gespeicherten Scans, optionaler Folgephasen, Analyse und Finalisierung. Unvollständige Erfassungen behalten ihre Daten und den fortsetzbaren Checkpoint und liefern ein explizites JSON-Ergebnis mit Status „unterbrochen“. Eine Unterbrechung nach dem letzten Commit erhält das fertige Artefakt und meldet dessen tatsächliche Audit-Verfügbarkeit. Eine explizite Wiederaufnahme vollendet unvollständige Nacharbeiten auch bei leerer Warteschlange. Bestehende Flags zum Auslassen von Nachweisen und die gespeicherten Sitemap-Eingaben bleiben erhalten.

7. Oktober 2026

4 hinzugefügt4 geändert1 behoben
  • HinzugefügtFunktioniertLinux-Abnahme-Fixture für echte SSH-Worker-Ausführung mit Schlüssel#754

    Ein Wegwerf-Linux-Abnahme-Fixture für echte SSH-Worker-Ausführung per Schlüssel, authentifizierte API- und TLS-Downloads sowie ENOSPC im nativen Worker auf einem begrenzten tmpfs, das nur Jobs nutzen. Queue und Nachweise bleiben erhalten. Vor einem neuen JS-Recovery-Job ist ein expliziter Nicht-Erfolg ohne Wiederholung nötig. Lokale Lebenszyklusmessungen werden klar von SSH- und Betriebssystem-Containment-Nachweisen getrennt.

    #754 (Issue auf GitHub)
  • GeändertFunktioniertTeilweise JavaScript-Nachweise in Remote-Job-Ergebnissen bleiben erhalten#754

    Teilweise JavaScript-Nachweise bleiben in Remote-Job-Ergebnissen erhalten, auch bei schreibgeschützter Korrektur älterer abgeschlossener Jobs. Aufbewahrte Artefakte und Render-Budgets bleiben unverändert. Echte Queue-Sicherung und -Wiederherstellung wird über authentifizierten Status, Downloads und persistente Idempotenz geprüft. Die zweiseitige Recovery-Fixture bleibt bei vollständigem Rendering innerhalb ihrer bestehenden endlichen Budgets.

    #754 (Issue auf GitHub)
  • GeändertFunktioniertExit-Code 130 ohne Traceback, wenn SIGINT die JSON-Ausgabe unterbricht

    Wird die finale JSON-Ausgabe per SIGINT unterbrochen, nachdem ein Handler abgeschlossen ist, endet das Programm mit Exit-Code 130 ohne Traceback. Aufbewahrte Artefakte bleiben unverändert. Ein abgeschnittener Ausgabestrom wird nie als Erfolg gemeldet.

  • HinzugefügtFunktioniertContent-Bereich-Strategie wird für Hashes und Token-Zählungen protokolliert

    Protokolliert wird die Content-Bereich-Strategie, mit der aufbewahrte Hashes und Token-Zählungen entstanden sind, nicht die Standardstrategie des Parsers. Explizite Selektoren und Ausschlüsse haben jetzt passende Extraktionsherkunft, auch wenn der Parser seinen Standardbereich verwendet hat.

  • BehobenFunktioniertUnveröffentlichte SQLite-Staging-Dateien bleiben aus Verlauf und Aufbewahrung

    Unveröffentlichte native SQLite-Staging-Dateien bleiben aus dem Scan-Verlauf und aus den Kandidaten für die Aufbewahrung heraus. Ungültige veröffentlichte Dateien werden weiterhin gemeldet, und benutzerbenannte versteckte Scans bleiben erlaubt.

  • HinzugefügtFunktioniertNative SQLite-Erfassung nur per Sitemap ergänzt

    Neu: native SQLite-Erfassung nur über die Sitemap. Eine explizite Sitemap definiert die vollständige angeforderte URL-Menge, ohne Startseiten-Fallback, Hyperlink-Erweiterung oder Erweiterung über Weiterleitungsziele. Leere, unvollständige und über dem Budget liegende Sitemap-Mengen stoppen ausdrücklich. Eine Wiederaufnahme nutzt die gespeicherte Menge erneut, ohne das XML abzurufen.

  • GeändertFunktioniertEigene Lauf-Datensätze für parallele Erfassungen und gemeinsame Rate-Bremse pro Host

    Eigene Lauf-Datensätze bleiben für gleichzeitige native Erfassungen erhalten. Parallele Läufe teilen sich ein projektlokales Dispatch-Gate mit 2 Requests/s für denselben öffentlichen Host. Jeder Lauf zeigt Quelltyp, Ursprung, Konfigurations-Fingerprint und die Grenze der aggregierten Rate gegenüber Beobachtern.

  • HinzugefügtFunktioniertOffline-Literalsuche in gespeicherten Inhalten (HEAD, HTML, Body-Text, CSS-Markup)

    Offline-Literalsuche über gespeichertes HEAD, HTML, Body-Text und per CSS-Selektor gewähltes Markup. Dabei gelten ausdrückliche Abdeckungen für statisch und gerendert, unbekannte fehlende Bodies, optionale geschwärzte Snippets und integritätsgeprüfte Paginierung neuer lokaler Ergebnispakete.

  • GeändertFunktioniertExport gespeicherter Screaming-Frog-Crawls behält eigene Einstellungen

    Beim Export behält ein gespeicherter Screaming-Frog-Crawl seine eigenen Einstellungen: load-crawl setzt nicht mehr die aktuelle Spider-Konfiguration ein. Live-Läufe von Spider und Liste erhalten weiterhin ihre expliziten Profile pro Lauf.

6. Oktober 2026

9 hinzugefügt14 geändert9 behoben
  • GeändertFunktioniertTests lösen Loopback-Virtual-Hosts auf allen Betriebssystemen gleich auf#896

    Eigene Tests für externe Captures lösen ihre Loopback-Virtual-Hosts auf allen Betriebssystemen einheitlich auf, ohne die Netzwerkrichtlinie im Produktivbetrieb zu ändern.

    #896 (Issue auf GitHub)
  • BehobenFunktioniertTerminal-Eingabe über dem select-Limit, Entf verwirft keine Notizen mehr#896

    Die Terminal-Eingabe funktioniert auch oberhalb der select-Deskriptorgrenze. Entf und nicht unterstützte Steuersequenzen brechen keine ungespeicherten Notizen mehr ab.

    #896 (Issue auf GitHub)
  • GeändertFunktioniertVersionierte Browser-Navigationsereignisse werden gespeichert#826

    Versionierte Browser-Navigationsereignisse bleiben mit begrenzten Auslassungen erhalten, zusammen mit Erfassungsstatus, Renderer-Richtlinie und URL-Herkunft. Beobachtete HTTP-Weiterleitungen, Chromium-Navigation über Skript, Verlauf oder Fragment und unbekannte Ursachen werden unterschieden, ohne menschliche Klicks zu unterstellen.

    #826 (Issue auf GitHub)
  • HinzugefügtFunktioniertGleiche Belege in render-check und in Scan-Navigationsberichten#826

    Dieselben Belege werden über render-check und begrenzte Offline-Scan-Navigationsberichte bereitgestellt. Teilweise Beobachtungen bleiben erhalten, wenn das Rendern fehlschlägt.

    #826 (Issue auf GitHub)
  • GeändertFunktioniertRollback-Kompatibilität: Navigationsnachweise in erweiterbaren Renderer-Einstellungen#826

    Die Rollback-Kompatibilität bleibt erhalten, weil Navigationsnachweise in erweiterbaren Renderer-Einstellungen gespeichert werden. Die frühere Prerelease-Kodierung wird validiert, ohne Provenienzprüfungen abzuschwächen. Beobachtete Ereignisse gelten dabei nicht als Renderer-Richtlinie.

    #826 (Issue auf GitHub)
  • BehobenFunktioniertGroße verschachtelte Zusammenfassungen bleiben in vollständigen PDF-Begleitdateien#818

    Große verschachtelte Zusammenfassungen, einschließlich Tiefen-Histogrammen, bleiben in vollständigen PDF-Begleitdateien erhalten, ohne das begrenzte Budget für Anzeige-Metadaten zu belasten. Benannte Ziele, Gliederungen und interne Links bleiben erhalten, wenn portable Links der Begleitdatei durch Klonen des vollständigen PDF-Dokuments umgeschrieben werden.

    #818 (Issue auf GitHub)
  • HinzugefügtFunktioniertExplizites pdf_policy="overview-v1" für aufbewahrte audit.v2-PDF-Anfragen#818

    Die erste Seite unterscheidet vollständige Quellzahlen sowie angezeigte und ausgelassene Mengen. Deterministische Anzeigepräfixe behalten die vollständigen Abdeckungszustände und Gründe und verlinken auf das vollständige streamende Audit-JSON sowie die CSV-Begleitdateien für Findings, Pages und Scope. Ein Manifest mit Hash- und Zählwerten dokumentiert Herkunft und Ressourcengrenzen. Bestehende Ziele werden abgelehnt, Exporte werden zunächst in einen Staging-Bereich geschrieben, und der PDF-Abschlussmarker wird erst veröffentlicht, nachdem alle verpflichtenden Begleitdateien validiert sind. Das Standardverhalten des PDF bleibt unverändert. Die Übersicht wird nie stillschweigend gewählt oder als erschöpfendes PDF beschrieben. Genaue Grenzen und Absturzverhalten stehen in docs/PDF_OVERVIEW.md.

    #818 (Issue auf GitHub)
  • HinzugefügtFunktioniertSchreibgeschützte GA4-Operation page_views für Seitenaufrufe#782

    Neue schreibgeschützte GA4-Operation page_views für Aufrufzahlen nach Datum, Hostname und besuchtem Pfad, unabhängig von Sitzungen auf Landingpages. Sie nutzt die bestehenden GA4-Zugangsdaten, Transport und den paginierten Berichtsleser mit begrenzten Wiederholungen, Quota- und Berechtigungsergebnissen. Dazu kommen explizite Angaben zu Zeitzone, Sampling und Schwellenwert sowie die URL-Bindung an den deklarierten Ursprung. Gespeicherte eingeschränkte Provider-Nachweise werden über den bestehenden Join und die BI-Pipeline normalisiert. Fehlender Traffic bleibt als nicht verfügbar markiert und wird nicht zu null.

    #782 (Issue auf GitHub)
  • BehobenFunktioniertObserver-Aktualisierungen bleiben begrenzt: Die Abdeckung je Site wird wiederverwendet,#777

    die Aktivität aktiver Collectors wird getrennt projiziert, und audit.v2-Findings werden seitenweise ausgegeben. Nicht zugehörige Graph-Sammlungen werden dabei nicht materialisiert.

    #777 (Issue auf GitHub)
  • GeändertFunktioniertAktive Collectors bleiben in der Historie, Zählerfenster mit Zeitstempel#777

    Jeder aktive Collector bleibt in der begrenzten Historie erhalten. Gemessene Zählerfenster werden mit Zeitstempel veröffentlicht, und nicht gemessene Zähler werden von null unterschieden. Der verifizierte Fortschritt von Screaming Frog wird gestreamt, während beide Diagnose-Pipes begrenzt bleiben.

    #777 (Issue auf GitHub)
  • HinzugefügtFunktioniertSchreibgeschützte Seiten für Checkliste, Aufgabe und gespeicherten Scan#777

    Neu: schreibgeschützte Seiten für Checkliste, Aufgabendetails und gespeicherte Scans, dazu ein ausdrücklicher Geltungsbereich der anwendbaren Methoden und eine Projektion des neuesten Posteingangs.

    #777 (Issue auf GitHub)
  • BehobenFunktioniertSitemap-Läufe bleiben getrennt, laufende Zähler bleiben unbekannt#777

    Ausdrücklich verknüpfte Sitemap-Läufe bleiben getrennt: Laufende Zähler bleiben unbekannt. Endmessungen zählen geparste Sitemap-Dokumente getrennt von deklarierten URLs, Fehlern und Kürzungen.

    #777 (Issue auf GitHub)
  • GeändertFunktioniertChecklisten-Belege über Dateiidentität beobachten, ohne Neuhashing#777

    Checklisten-Artefaktbelege werden über geschützte Dateiidentitäts-Metadaten beobachtet, ohne aufbewahrte Bytes bei jeder Aktualisierung erneut zu hashen. Ausdrückliche Abdeckungsabfragen behalten die Byte-Prüfung. Geänderte oder ungeprüfte Altnachweise bleiben als veraltet beziehungsweise ungeprüft sichtbar.

    #777 (Issue auf GitHub)
  • BehobenFunktioniertHistorische Prioritätsbelege bleiben an ihren ursprünglichen Umfang gebunden#777

    Historische Prioritätsbelege bleiben an ihren ursprünglichen Itemumfang gebunden, wenn nach der Vorbereitung neue Aufgaben hinzukommen. Jeder vollständige Abdeckungskandidat wird vor der atomaren Veröffentlichung validiert. Gezielte Detailabfragen zu Mitbewerbern bleiben passiv und prüfen nur Metadaten.

    #777 (Issue auf GitHub)
  • HinzugefügtFunktioniertPlattenbasierter Vergleich gespeicherter Audits mit vollständigen NDJSON-Ergebnissen#762

    Neu: expliziter plattenbasierter Vergleich gespeicherter Audits mit vollständigen NDJSON-Ergebnissen, deterministischer Reihenfolge, Quellidentitäten, Prüfsummen je Datei und einer Bilanzprüfung der Findings vor und nach der Änderung. Große audit.v2-Vergleiche brauchen ein neues Ausgabeverzeichnis. Doppelte Identitäten und Kollisionen bei der URL-Zuordnung führen zu einem Fehler, statt Zeilen zu verlieren.

    #762 (Issue auf GitHub)
  • BehobenFunktioniertGezielte audit.v2-Prüfung bleibt bei Doppelzeilen begrenzt#762

    Die gezielte audit.v2-Prüfung bleibt auch bei doppelten Zeilen begrenzt und behält die validierte Scan-Identität in ausgewählten Dokumenten. Widersprüchliche Identitäten oder ungültige Nach-Crawls werden als Nachweis einer Behebung abgelehnt.

    #762 (Issue auf GitHub)
  • HinzugefügtFunktioniertOptionale gzip-Kompression für vollständige compare.v2-NDJSON-Dateien#762

    Neu: optionale Streaming-gzip-Kompression für vollständige compare.v2-NDJSON-Dateien, mit deterministischen komprimierten Bytes und exakten Hashes der komprimierten Dateien sowie dekodierten Zeilen- und Byte-Zählungen. Ein begrenzter Reader prüft Klartext- und gzip-Exporte und lehnt beschädigte Streams oder abweichende Manifest-Zählwerte ab. Klartext bleibt die Standardausgabe.

    #762 (Issue auf GitHub)
  • BehobenFunktioniertKorpusvergleich bleibt ungeklärt, solange ein Vollständigkeitsflag fehlt#762

    Die Kompatibilität beim Vergleich gespeicherter Korpora bleibt unbekannt, wenn eines der beiden Vollständigkeitsflags fehlt. Bei bekannt teilweisen Korpora wird ausdrücklich gewarnt. Übersprungene und deaktivierte Check-IDs bleiben samt Gründen zusammen mit den Findings-Deltas erhalten, damit fehlende Messungen nicht als geprüfte Behebung erscheinen.

    #762 (Issue auf GitHub)
  • GeändertFunktioniertTerminal-Observer zeigt Aufgaben, Methoden, Scans, Läufe und Belege lesbar an#752

    Der Terminal-Observer blättert lesbar durch Details zu Aufgaben, Methoden, strukturierten Daten, Scans, Läufen, Posteingang und aufbewahrten Belegen, mit begrenzten Seiten und ehrlicher Abdeckungsangabe. Speicherzugriffe und ausdrückliche Notiz-Übermittlungen laufen außerhalb der Eingabeschleife.

    #752 (Issue auf GitHub)
  • GeändertFunktioniertNotiz- und Zielentwürfe bleiben getrennt, mit Cursor-Bearbeitung#752

    Notiz- und Zielentwürfe bleiben während einer Sitzung getrennt. Cursor-Bearbeitung ist möglich, übergroße Einfügungen werden ohne Kürzung behalten, und Speicherbelege erscheinen in jedem Layout. Ungespeicherte Entwürfe werden nach regulärem Beenden des Terminals zur Wiederherstellung ausgegeben.

    #752 (Issue auf GitHub)
  • HinzugefügtFunktioniertAbdeckung und Artefakte für eigene Site und Mitbewerber durchsuchen#752

    Neu: ausdrückliches Durchsuchen von Abdeckung und Artefakten für die eigene Site und für Mitbewerber. Die gewählte Site bleibt über Scan- und Befundseiten erhalten, aktuelle notizbasierte Mitbewerber-Vorschläge werden angezeigt, und der Erfassungsfortschritt bleibt in kompakten Terminals sichtbar. Veraltete Stichproben werden nicht mehr als laufender Fortschritt animiert.

    #752 (Issue auf GitHub)
  • HinzugefügtFunktioniertVersionierte Headless-Fähigkeitsinventur aus den echten Crawler-Einstellungen#743

    Neu: versionierte Headless-Fähigkeitsinventur, aus den echten Crawler-Einstellungen generiert, mit Verweisen auf Implementierung, CLI/MCP, Tests und ausdrücklich benannte Lücken bei der Abnahme.

    #743 (Issue auf GitHub)
  • HinzugefügtFunktioniertOpt-in-Benchmark für eigene HTML/JavaScript-Origins mit eingefrorenen Budgets#743

    Neu: Opt-in-Benchmark für eigene HTML/JavaScript-Origins mit eingefrorenen Budgets für Phasen, Prozessbaum-Speicher, Datenträger und Wiederherstellung. Die gemessenen DOMs erzeugen echte Browser. Das Profil belegt für sich genommen keine Kapazität für JavaScript bei großen Sites.

    #743 (Issue auf GitHub)
  • BehobenFunktioniertNative JavaScript-Bridge: Streaming-Argument korrigiert#743

    Das nicht unterstützte Streaming-Argument der nativen JavaScript-Bridge ist behoben. Bereits beobachtete Render-Zähler bleiben bei geordnetem Abbruch und bei der Wiederaufnahme erhalten.

    #743 (Issue auf GitHub)
  • GeändertFunktioniertlog-scan liest native Scan-Pfade und audit.v2-Begleitdateien ohne Legacy-JSON#711

    log-scan liest aufbewahrte native Scan-Pfade und audit.v2-Begleitdateien, ohne Legacy-JSON zu materialisieren. Konsistenzbefunde werden gestreamt. Native Seitenzugehörigkeit und Deduplizierung der Findings bleiben auf der Platte. Exakte Anomaliezahlen bleiben erhalten, nur die Beispiele werden begrenzt. Ausdrücklich gemeldet wird, dass die native Trace-Entscheidung zu Ausschlüssen fehlt.

    #711 (Issue auf GitHub)
  • GeändertFunktioniertSitemap-lastmod-Befund auf Site-Ebene am reinen Origin erkennen#711

    Ein Sitemap-lastmod-Befund auf Site-Ebene wird am reinen Origin der gemessenen Site erkannt, wenn keine Startseite gecrawlt wurde. Die Ausnahme setzt passende Sitemap-Zusammenfassungen voraus. Sie befreit weder Seiten-Befunde noch fremde Hosts oder nicht unterstützte Zielpfade.

    #711 (Issue auf GitHub)
  • GeändertFunktioniertaudit.v2-Scans über exakten Schlüssel und Ordinal-Index vergleichen

    Vergleich aufbewahrter audit.v2-Scans über exakten Schlüssel und Ordinal-Index, ohne Seiten- und Findings-Nutzdaten in temporärem SQLite-Speicher zu duplizieren. Vollständige Zeilen, deterministische Klartext- und gzip-Exporte, Quellidentitäten und Legacy-Eingaben bleiben unterstützt. Audit-Leser fixieren den geprüften Snapshot über indizierte Zeilenlesezugriffe.

  • GeändertFunktioniertEigene Vergleichsausgaben bei spätem Veröffentlichungsfehler zurückrollen und fremde

    Ziele ablehnen…

    Eigene Vergleichsausgaben bei spätem Veröffentlichungsfehler zurückrollen und Ziele ablehnen, die während des Laufs parallel angelegt wurden. Das Manifest bleibt die endgültige Commit-Markierung des Pakets.

  • GeändertFunktioniertÖffentlicher Einstieg beschreibt konfigurierbares SEO-Engineering mit Agenten und

    verlinkt…

    Der öffentliche Einstieg beschreibt konfigurierbares SEO-Engineering mit Agenten und verknüpft den gesamten Funktionsumfang mit seinen Methoden, Eingaben und Grenzen der Nachweise. Veraltete Hinweise zu nativem Crawler, Screaming Frog, Projektabdeckung und Maßnahmen werden korrigiert. Die vom Agenten erstellte Entwickler-Arbeitsmappe wird getrennt von den sachlichen Berichtsausgaben dokumentiert, einschließlich geprüfter Abnahmekriterien und Quelllinks.

  • BehobenFunktioniertBerichtsparität zwischen gestreamten audit.v2-Eingaben und gleichwertigem Audit-JSON

    wiederherstellen.

    Markdown nutzt jetzt einen gemeinsamen inkrementellen Renderer, inklusive Erläuterungen zu nicht verfügbaren Prüfungen, Ausschlussprotokollen und abschließenden Hinweisen zur Abdeckung. XLSX teilt ein gemeinsames Metadaten-Layout und schreibt Befunde und Seiten über begrenzte, nur schreibende Arbeitsblätter. Alle Arbeitsblätter, Spalten, Filter, Diagramme und Quellenzähler bleiben erhalten. Zurückgehaltene unterdrückte Befunde lassen sich wiedergeben, ohne ihre Sammlung vollständig zu materialisieren. Fehlende Lauf-URLs verwenden dieselbe Rückfalloption auf die erste Seite.

  • GeändertFunktioniertHerkunft von PDF-Audits unabhängig vom gemeinsamen Audit-Schema kennzeichnen: nativer

    Crawler…

    Die Herkunft von PDF-Audits wird unabhängig vom gemeinsamen Audit-Schema gekennzeichnet: nativer Crawler, Screaming-Frog-Exporte oder ein ausdrücklich benannter SF-Collector sowie ein unbekannter Collector. Ein natives Audit mit dem SF-Analyzer-Schema erhält keine Screaming-Frog-Überschrift mehr.

  • GeändertFunktioniertZeilen zu unterdrückten Befunden im Umfang per Stream in CSV schreiben statt gerenderte

    Erklärungen anzusammeln…

    Zeilen zu unterdrückten Befunden im Umfang werden per Stream in CSV geschrieben, statt ihre gerenderten Erklärungen im Speicher anzusammeln. Vollständige Ausschlussexporte behalten ihre Reihenfolge und Quelldaten bei, während der Speicherbedarf bei großen Mengen aufbewahrter Ausschlüsse begrenzt bleibt.

5. Oktober 2026

1 geändert
  • GeändertFunktioniertJede Zeile mit Abdeckungslücken anhand ihrer tatsächlichen Mode-Zelle abgleichen,#830

    abgedeckte Check- und Tool-Verweise prüfen…

    Jede Zeile mit Abdeckungslücken wird anhand ihrer tatsächlichen Mode-Zelle abgeglichen, abgedeckte Check- und Tool-Verweise werden gegen die öffentlichen Register validiert, und Prioritäten werden aus den offenen Zeilen erzeugt.

    #830 (Issue auf GitHub)

4. Oktober 2026

56 hinzugefügt75 geändert5 behoben
  • HinzugefügtFunktioniertOffline-Projektion des GSC-Fortschritts für Marken- und Nicht-Markenanfragen mit#880

    expliziten Unicode-fähigen…

    Eine Offline-Projektion des GSC-Fortschritts nach Marken- und Nicht-Markenanfragen ergänzt die Auswertung um explizite, Unicode-fähige Aliase, eine kompatible gewichtete CTR und beschriftete Bänder für die durchschnittliche Position.

    #880 (Issue auf GitHub)
  • HinzugefügtFunktioniertOptionale Aufgabengruppierung über check_assignment für deklarierte#878

    Template-/Komponenten-URL…

    Optionale Aufgabengruppierung über check_assignment für deklarierte Zuordnungen von Template- und Komponenten-URLs oder validierte Crawl-Segmente. Gruppierte Arbeitseinheiten behalten Vorkommens- und URL-Zähler, begrenzte Nachweise, die Herkunft der Gruppierung, den Prüfumfang sowie die Zustände deklariert, Kandidat, bestätigt und nicht zugeordnet.

    #878 (Issue auf GitHub)
  • HinzugefügtFunktioniertOptionale Release-Vergleichskarten url-correspondence.v1 mit deklarierten Ursprüngen#877

    und URL-…

    Neue, optionale Release-Vergleichskarten url-correspondence.v1 mit deklarierten Ursprüngen und URL-Paaren, Ablehnung bei Kollisionen, Herkunftsnachweisen für Seitendaten und Ausgabe als release_review.v1.

    #877 (Issue auf GitHub)
  • HinzugefügtFunktioniertOffline-Projektion von Veröffentlichungskohorten mit evidenzgeprüfter Datumsherkunft…#876

    Offline-Projektion von Veröffentlichungskohorten, geprüft auf Nachweise, mit Datumsherkunft, Autorenverzeichnis, gekennzeichneten Beobachtungen der Anbieter und optionalen Altersfenstern.

    #876 (Issue auf GitHub)
  • HinzugefügtFunktioniertOffline-Inventar von CTAs und eingebetteten Formularen für übergebenes HTML,#875

    vorkommensgetreu…

    Offline-Inventar von CTAs und eingebetteten Formularen für übergebenes HTML. Es erhält jedes Vorkommen, führt fehlende Ziele als Null-Werte, begrenzt JSON- und CSV-Ausgaben und weist unvollständige Abdeckung des Textkörpers explizit aus.

    #875 (Issue auf GitHub)
  • GeändertFunktioniertTimeout-Klassifizierung bei Remote-Zugriffen erhalten, Transportfehler schwärzen und#866

    direkte Proxy-Manifeste…

    Die Timeout-Klassifizierung bei Remote-Zugriffen bleibt erhalten, Transportfehler werden geschwärzt, und direkte Proxy-Manifeste lassen sich für gezielte Verifizierung sicher wiedergeben.

    #866 (Issue auf GitHub)
  • GeändertFunktioniertAttributionsnachweise aus dem gespeicherten SQL-Linkgraphen lesen und explizite#866

    Null-Attribution erhalten…

    Attributionsnachweise werden aus dem gespeicherten SQL-Linkgraphen gelesen, explizite Null-Attribution bleibt beim Export erhalten, und zwischengespeicherte Prüfungen externer Links bleiben beim Fortsetzen erhalten.

    #866 (Issue auf GitHub)
  • GeändertFunktioniertIntegrierte Kataloge und Berichtsverträge neu generieren; PDF-Validator mit dem Extra#866

    „all“ installieren…

    Integrierte Kataloge und Berichtsverträge werden neu generiert. Der PDF-Validator wird mit dem Extra „all“ installiert, und Fake-Browser-Tests hängen nicht mehr von der Auswahl eines lokalen Chrome ab.

    #866 (Issue auf GitHub)
  • HinzugefügtFunktioniertOffline-Ladeplan für BigQuery (optional) mit schemaversionierten Tabellen, Abrechnungs…#837

    Ein optionaler Offline-Ladeplan für BigQuery macht schemaversionierte Tabellen, Abrechnungsanforderungen und explizite Autorisierungsvoraussetzungen sichtbar, ohne Cloud-Zugriff.

    #837 (Issue auf GitHub)
  • HinzugefügtFunktioniertBigQuery-REST-Transport mit Allowlist und deterministischen Staging-Ladejobs…#837

    BigQuery-REST-Transport über eine Allowlist mit deterministischen Staging-Ladejobs, Abgleich der Zeilenzahl und dokumentierter atomarer Veröffentlichung je Tabelle statt einer erfundenen tabellenübergreifenden Transaktion.

    #837 (Issue auf GitHub)
  • GeändertFunktioniertSeparate, host-verwaltete BigQuery-cost_authorized-Freigabe vor jedem Token-, Dataset-#837

    oder Staging-Zugriff verlangen…

    Vor jedem Token, Dataset-Check oder Staging-Schreibvorgang ist eine separate, vom Host verwaltete cost_authorized-Freigabe für BigQuery erforderlich.

    #837 (Issue auf GitHub)
  • HinzugefügtFunktioniertLokaler, validierter Builder für Looker-Studio-Kopierlinks für das synthetische#836

    Fünf-Seiten-Berichtspaket…

    Ein rein lokaler, validierter Builder für Looker-Studio-Kopierlinks für das synthetische Fünf-Seiten-Berichtspaket. Er verlangt eine ursprüngliche Bericht-ID und exakte Quellaliase für Sheets oder BigQuery, ohne einen Bericht zu veröffentlichen oder eine Vorlage zu erfinden.

    #836 (Issue auf GitHub)
  • HinzugefügtFunktioniertDie eingecheckte synthetische Arbeitsblatt-Fixture#836

    (examples/reporting-pack/worksheets/) ergänzen…

    Die eingecheckte synthetische Arbeitsblatt-Fixture (examples/reporting-pack/worksheets/) kommt hinzu: je eine CSV-Datei pro BI-Datensatz plus das Manifest, byte-deterministisch aus examples/audit.json und zwei synthetischen GSC- und GA4-Eingaben erzeugt. Sie zeigt die Zustände gemessene Null, unterdrückt bzw. fehlend, nur extern, nicht schlüsselbar, übersprungene Prüfung, nicht verfügbarer Datensatz und unvollständige Quadranten. Die Reproduzierbarkeit prüft scripts/generate_reporting_pack_worksheets.py --check.

    #836 (Issue auf GitHub)
  • HinzugefügtFunktioniertexamples/reporting-pack/SETUP.md ergänzen: mechanische Anleitung für den Eigentümer zum#836

    Import der…

    examples/reporting-pack/SETUP.md ergänzt die mechanische Anleitung für den Eigentümer: Import der sechs Arbeitsblätter in Google Sheets, Verdrahtung der reservierten Datenquellen-Aliase, Aufbau der fünf Blueprint-Seiten mit den deklarierten Steuerelementen und berechneten Feldern, Aktivierung der Kopierberechtigung und Prüfung einer frischen Kopie. Die native Looker-Studio-Vorlage bleibt ein vom Eigentümer freizugebender externer Schritt. Enthalten sind keine Bericht-ID, kein Link und kein Google-Schreibzugriff.

    #836 (Issue auf GitHub)
  • GeändertFunktioniertPartitionsnamen, Zähler und Prüfsummen des erzeugten BI-Pakets erhalten, damit die#836

    Arbeitsblatt-Fixture…

    Partitionsnamen, Zähler und Prüfsummen des erzeugten BI-Pakets bleiben erhalten, damit die Arbeitsblatt-Fixture die bestehende Sheets-Vorabprüfung und die Konsumenten gefilterter Exporte besteht. Die separaten Felder für Aliase der Linking-API sind dokumentiert. Die Prüfung einer frischen Kopie über die generierte URL ist verpflichtend, eine manuelle Reparatur der Quelle entfällt.

    #836 (Issue auf GitHub)
  • GeändertFunktioniertDoppelte Linking-API-Aliase nach Leerzeichen-Normalisierung ablehnen und die exakten#836

    Aliase aus den URL-Parametern zurückgeben…

    Doppelte Linking-API-Aliase werden nach der Normalisierung von Leerzeichen abgelehnt, und die exakt in den URL-Parametern verwendeten Aliase werden zurückgegeben. Gemeinsame Lauf-Feld-IDs sowie gruppierte Steuerelemente für Anbieter-Datumsangaben werden definiert, und Abdeckungsdiagramme schließen überlappende Grundgesamtheiten aus. Das Erstellen der nativen Vorlage und die Prüfung einer frischen Kopie bleiben externe Abnahmeanforderungen.

    #836 (Issue auf GitHub)
  • HinzugefügtFunktioniertExplizite, evidenzgeprüfte URL-Kohortenzeilen zu lokalen BI-Paketen hinzufügen,#835

    einschließlich…

    Explizite, evidenzgeprüfte URL-Kohortenzeilen werden zu lokalen BI-Paketen hinzugefügt, einschließlich Quadranten aus Search Console und GA4, die bei gemessener Null sicher bleiben. Diese gibt es jedoch nur für eins-zu-eins vollständige, kompatible Beobachtungen.

    #835 (Issue auf GitHub)
  • GeändertFunktioniertBeobachtete Inlink-Anteile aus eindeutigen Linkseiten im Scope berechnen, deren#835

    HTML-Extraktion abgeschlossen ist…

    Beobachtete Inlink-Anteile werden aus eindeutigen verlinkenden Seiten im Scope berechnet, deren HTML-Extraktion abgeschlossen ist. Wiederholte Vorkommen bleiben getrennt erhalten, und Teilgesamtheiten werden entsprechend gekennzeichnet.

    #835 (Issue auf GitHub)
  • HinzugefügtFunktioniertTypisierte, deterministische Offline-BI-Pakete für gespeicherte Scans/Audits und#834

    übergebene Anbieter-Nachweise…

    Typisierte, deterministische Offline-BI-Pakete für gespeicherte Scans und Audits sowie übergebene Anbieter-Nachweise, mit Grenzen für Partitionen, Null-Zustände, Zeilenerhaltung und formelsichere CSV-Zellen.

    #834 (Issue auf GitHub)
  • GeändertFunktioniertBefunde aus begrenzten audit.v2-Begleitdateien erhalten und bis zu 1.000.000 Scan-URLs#834

    über ein SQLite-Nachweisartefakt verknüpfen…

    Befunde aus begrenzten audit.v2-Begleitdateien bleiben erhalten. Bis zu 1.000.000 aufbewahrte Scan-URLs werden über ein dauerhaftes SQLite-Nachweisartefakt verknüpft und ohne Materialisierung von Seiten- oder Trefferlisten in BI gestreamt. Das liefert keine kopierbare Looker-Studio-Vorlage.

    #834 (Issue auf GitHub)
  • GeändertFunktioniertBefundgruppen, Kandidaten für Anbieter-Quadranten und zulässige Inlink-Quellen über einen#834

    begrenzten SQLite-Index projizieren…

    Befundgruppen, Kandidaten für Anbieter-Quadranten und zulässige Inlink-Quellen werden über einen begrenzten, temporären SQLite-Index projiziert. Dynamische Anbieterdimensionen bleiben über ausgewählte Exporte sowie Offline-Pläne für Sheets und BigQuery gültig. Anzahl der Partitionen und Speicherverbrauch sind begrenzt.

    #834 (Issue auf GitHub)
  • GeändertFunktioniertZiel-URLs und Meldungen nativer Audit-Befunde als typisierte BI-Spalten erhalten, nicht#834

    nur…

    Ziel-URLs und Meldungen nativer Audit-Befunde werden als typisierte BI-Spalten geführt, nicht nur innerhalb der gespeicherten Quell-JSON. So bleiben bei exakten URL-Auswahlen alle betroffenen Befunde erhalten.

    #834 (Issue auf GitHub)
  • HinzugefügtFunktioniertscan-fragment-links (seo_scan_fragment_links) und die Audit-Prüfung BROKEN_BOOKMARK#827

    ergänzen…

    scan-fragment-links (seo_scan_fragment_links) und die Audit-Prüfung BROKEN_BOOKMARK werden ergänzt: Jeder <a href> mit Fragment in vollständigem, aufbewahrtem HTML oder DOM wird gegen die Element-IDs und <a name>-Ziele des Zieldokuments aufgelöst, nach dem WHATWG-Algorithmus für das Scrollen zum Fragment. Zuerst wird das serialisierte Fragment gegen IDs und Namen geprüft, danach der prozentkodierte bzw. UTF-8-dekodierte Wert gegen beide. + bleibt ein wörtliches Pluszeichen, # und #top führen zum Dokumentanfang. Statische, gerenderte und Legacy-Fragment-Darstellungen werden unabhängig bewertet, Weiterleitungs- und <base href>-Regeln werden berücksichtigt, und eine andere Query-Zeichenkette ist ein anderes Dokument. Fehlende, gekürzte, nicht unterstützte, fehlgeschlagene oder über dem Budget liegende Körper werden als benannte Überspringungen gemeldet – niemals als defekte Befunde. Screaming-Frog-Exporte und Legacy-Importe weisen die Prüfung als nicht verfügbar aus, statt sie als fehlerfrei zu behaupten. Ergebnisse sind begrenzt und deterministisch paginiert (total, returned, offset/limit, next_offset, Abdeckungszustand) und über CLI, MCP und die Zusammenfassung des aufbewahrten Scan-Audits identisch. Es wird nichts abgerufen: Die Auswertung ist rein lesend und offline.

    #827 (Issue auf GitHub)
  • GeändertFunktioniertNative hreflang-Rückverlinkungen gegen vollständige aufbewahrte Zieldeklarationen#825

    validieren…

    Native hreflang-Rückverlinkungen werden gegen vollständige aufbewahrte Zieldeklarationen validiert. Dabei wird unterschieden zwischen einer bekannt fehlenden Rückverlinkung und einem nicht gecrawlten oder nicht verfügbaren Ziel. Beobachtete noindex-Alternativen werden gemeldet, Rohlabels und normalisierte URL-Identitäten mit Kontext zu Duplikaten und Konflikten erhalten und Beziehungen bei Teilpopulationen als nicht gemessen markiert. Die bestehenden Audit-, CLI-, MCP- und Berichtsoberflächen liefern dieselben Befunde ohne zusätzliches Abrufen.

    #825 (Issue auf GitHub)
  • HinzugefügtFunktioniertCANONICAL_TARGET_ERROR ergänzen: meldet abgerufene kanonische Ziele mit 4xx- oder#824

    5xx-Antwort…

    CANONICAL_TARGET_ERROR meldet abgerufene kanonische Ziele mit 4xx- oder 5xx-Antwort, mit Nachweisen zu Quelle, Ziel, Antwort und Indexierbarkeit. Unbekannte oder statusunvollständige Ziele bleiben nicht verfügbar. Bekannte 2xx-Varianten heben das Fehlerurteil auf, und 3xx-Ziele bleiben unter CANONICAL_TO_REDIRECT.

    #824 (Issue auf GitHub)
  • HinzugefügtFunktioniertCANONICAL_HOMEPAGE_GROUP ergänzen für Gruppen aus mindestens drei abgerufenen,#824

    indexierbaren Seiten…

    CANONICAL_HOMEPAGE_GROUP erfasst Gruppen aus mindestens drei abgerufenen, indexierbaren Seiten aus zwei oder mehr Pfadbereichen mit unterschiedlichen Titeln und H1-Überschriften, die auf die abgerufene Startseite kanonisieren. Selbstbezug auf die Startseite, Abfrageparameter, erkennbare Paginierung, konfigurierte Paginierungs- und Filtermuster, unvollständige Startseiten-Nachweise und teilweise native Crawls erzeugen keinen seitenweiten Befund.

    #824 (Issue auf GitHub)
  • HinzugefügtFunktioniertObjektive Nachweise zu Autorschaft, Datum und Vertrauensseiten für gezielte Audits#823

    ergänzen (Issue #823)…

    Objektive Nachweise zu Autorschaft, Datum und Vertrauensseiten für gezielte Audits (Issue #823): acht Prüfungen mit Hinweis-Schweregrad in seohead/sf/core/eeat.py. Sie melden, was ein Crawl beobachten kann, und nie einen E-E-A-T-Wert. NO_AUTHOR_BYLINE und NO_CONTENT_DATES greifen nur bei inhaltstypischen Seiten, also bei einem JSON-LD-Artikeltyp, og:type=article, einem <article>-Element oder einem üblichen Inhaltspfad. Dabei werden die ausgewerteten Träger genannt, jeweils mit deklarierter Konfidenz: meta_author, rel_author, itemprop=author, die byline-Klasse, <time datetime>, JSON-LD author, datePublished und dateModified sowie ein datumsähnlicher URL-Pfad. MISSING_ABOUT_PAGE, MISSING_CONTACT_PAGE, MISSING_PRIVACY_POLICY und MISSING_TERMS_PAGE melden einen von fünf Zuständen: found_indexable (still), found_non_indexable, found_error, discovered_not_crawled oder not_discovered. So wird eine Seite, die existiert, aber nicht ausgeliefert wird, nicht genauso behandelt wie eine Seite, auf die niemand verlinkt. FEW_CITATIONS meldet nur, was Linkpositionen belegen können: einen ausgehenden Link im Fließtext oder eine deklarierte Anzahl von null. YMYL_REVIEW_CANDIDATE markiert deterministische Treffer ganzer Wörter in Pfad und Titel zur manuellen Prüfung, nie eine Einstufung. Nicht gemessen bleibt durchgehend von „nicht vorhanden“ getrennt: Eine Seite, deren Körper nie geparst wurde, behält trust_signals als NULL und wird im Überspringungsgrund gezählt. summary.trust_evidence hält den geprüften Umfang, den Zustand je Art und einen Hinweis auf teilweise Crawls für not_discovered-Urteile fest.

    #823 (Issue auf GitHub)
  • GeändertFunktioniertCrUX-Felddaten des aktuellen Fensters für LCP, INP und CLS (p75) gegen versionierte#822

    offizielle Schwellen klassifizieren…

    CrUX-Felddaten des aktuellen Zeitfensters für LCP, INP und CLS (p75) werden gegen versionierte offizielle Schwellenwerte klassifiziert. Dabei bleiben Umfang nach URL bzw. Origin, Formfaktor und Erhebungszeitraum erhalten. Fehlende, unvollständige und fehlgeschlagene Felddaten bleiben nicht verfügbar oder teilweise.

    #822 (Issue auf GitHub)
  • HinzugefügtFunktioniertExplizites, begrenztes URL-Sampling mit optionalem privatem Cache ergänzen und#822

    gespeicherte CrUX-Nachweise akzeptieren…

    Explizites, begrenztes URL-Sampling mit optionalem privatem Cache kommt hinzu. Gespeicherte CrUX-Nachweise werden in Site-Audits und Berichten akzeptiert, ohne automatische Anfragen an den Anbieter. Antwort- und Cache-Größe sind begrenzt. Inkonsistente gespeicherte Stichprobenzahlen oder wiederholte URL-Datensätze werden abgelehnt, statt eine vollständige Felddaten-Abdeckung zu melden.

    #822 (Issue auf GitHub)
  • GeändertFunktioniertGrenze der One-Shot-Docker-CLI getrennt von der optionalen Remote-API und dem#820

    Worker-Dienst dokumentieren…

    Die aktuelle One-Shot-Grenze der Docker-CLI wird getrennt von der optionalen, explizit konstruierten Remote-API und dem Worker-Dienst dokumentiert.

    #820 (Issue auf GitHub)
  • HinzugefügtFunktioniertSSH-Rezept für den Lauf im persistenten Workspace ergänzen und erklären, dass Exit- und#820

    Artefaktzustand der CLI…

    Das SSH-Rezept für den Lauf im persistenten Workspace kommt hinzu. Es erklärt, dass Exit-Status und Artefaktzustand der CLI keine Health-Prüfung eines HTTP-Dienstes sind.

    #820 (Issue auf GitHub)
  • GeändertFunktioniertNative SQLite-Crawls mit bis zu 1.000.000 URLs zulassen, mit separatem Budget von#818

    2.000.000 HTTP-Anfragen…

    Explizite native SQLite-Crawl-Konfigurationen werden bis 1.000.000 URLs zugelassen, mit separatem Budget von 2.000.000 HTTP-Anfragen und dem bestehenden synthetischen Profil nur für Speicher. CLI, MCP, Remote-Queue und Worker halten dieselben deklarierten Budgets ein. Materialisierte Legacy- und Listen-APIs behalten eine explizite Sicherheitsgrenze von 50.000 URLs. Listen-robots, Wiederholungen sowie Weiterleitungs- und Canonical-Sprünge teilen nun ihr Anfragebudget. Native Audits und die Offline-Neuanalyse nutzen den begrenzten audit.v2-Pfad, ohne die frühere Ablehnungsgrenze von 10.000 Seiten bzw. 20.000 Formularen. Zähler des Transaktions-Schreibers verhindern, dass die wachsende Frontier bei jedem Batch neu durchsucht wird. Ein manueller Abnahmetreiber protokolliert geladene Quellidentitäten, Unterbrechung und Fortsetzung sowie nachgelagerte Konsumenten. Die Zulassung allein ist jedoch kein Nachweis einer abgeschlossenen Abnahme für eine Million URLs.

    #818 (Issue auf GitHub)
  • GeändertFunktioniertJede manuelle native Abnahmestufe unter einem Ressourcen-Watchdog für Subprozesse#818

    ausführen, unterbrochene Artefakte aufbewahren…

    Jede manuelle native Abnahmestufe läuft unter einem Ressourcen-Watchdog für Subprozesse. Unterbrochene Artefakte bleiben erhalten, jede CSV- und XLSX-Zeile sowie die Aufgabenabdeckung werden geprüft, und geschütztes HTTP über den eigenen Loopback-Host wird separat mit unveränderter Standardtaktung getestet.

    #818 (Issue auf GitHub)
  • GeändertFunktioniertAusdrücklich autorisierte Remote-Crawl-Dauern bis 14 Tage zulassen, der Standard von#818

    einer Stunde bleibt…

    Ausdrücklich autorisierte Remote-Crawl-Dauern bis 14 Tage werden zugelassen. Der Standard von einer Stunde bleibt bestehen, ebenso die unabhängigen Budgets für Projekt, Anfragen, Speicherplatz, Leases und Rendering. So passt ein Ziel mit einer Million Seiten bei unverändert höflicher Anfragerate in den Lauf. Werte über der Dauergrenze und ungültige Typen schlagen fehl, bevor die Erhebung beginnt.

    #818 (Issue auf GitHub)
  • GeändertFunktioniertOffline-Neuanalyse nutzt eine eigene Frist für jede SQLite-Ausführung bzw.#818

    jeden Abruf…

    Die Offline-Neuanalyse nutzt für jede SQLite-Ausführung bzw. jeden Abruf eine eigene Frist. Abbruch und Unterbrechung von Abfragen bleiben erhalten, ohne dass Python-Parsing oder abgeleitete Schreibvorgänge auf die ursprüngliche Frist der Scan-Öffnungsprüfung angerechnet werden.

    #818 (Issue auf GitHub)
  • GeändertFunktioniertLegacy-crawl-site --out-dir speichert Seiten-, Link- und Formularnachweise nun in#817

    anhängbaren JSONL-Sidecars…

    Legacy-crawl-site --out-dir speichert Seiten-, Link- und Formularnachweise während Erhebung und Fortsetzung in anhängbaren JSONL-Sidecars, statt doppelte Listen im Speicher zu halten. Checkpoints prüfen die Anzahl der Sidecar-Einträge. Ältere v4-Checkpoints mit Inline-Formularen werden migriert, ohne Formularbefunde zu verlieren. Die bestehende Audit-Brücke benennt ihre Grenzen für die Materialisierung von Seiten, Formularen und Links und bewahrt erhobene Nachweise, wenn ein Audit nicht verfügbar ist. Ein früherer Bericht wird unter einem veralteten Dateinamen aufbewahrt, statt als aktueller Lauf zu erscheinen. Die native JavaScript-Eskalation liest Seitendatensätze über eine wiederverwendbare SQLite-Ansicht, statt alle Seitenobjekte neu aufzubauen. Vollständiges Streaming großer Audits wird weiterhin unter #816/#817 nachverfolgt.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertÜbergroße native Audits in geordneten audit.v2-Begleitdateien speichern, statt das Audit#817

    zu verwerfen…

    Übergroße native Audits werden in geordneten audit.v2-Begleitdateien gespeichert, statt die Verfügbarkeit des Audits zu verwerfen.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertNative Audit-Normalisierung direkt in ihren Kontext streamen, ohne Zwischenliste von#817

    Datensätzen.

    #817 (Issue auf GitHub)
  • BehobenFunktioniertNative Seitenzuordnungen im Audit und abgeleitete Kennzahlen je Seite in einem temporären#817

    SQLite-Kontextspeicher halten…

    Native Seitenzuordnungen im Audit und abgeleitete Kennzahlen je Seite werden in einem temporären SQLite-Kontextspeicher gehalten.

    #817 (Issue auf GitHub)
  • BehobenFunktioniertNative Befunde bis zur geordneten Aggregation, die ihre Berichtskennungen vergibt, auf#817

    der Festplatte halten.

    #817 (Issue auf GitHub)
  • BehobenFunktioniertNative Duplikat- und Inhaltsgruppen während der Analyse in geordnetem SQLite-Speicher#817

    halten.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertWiederholte Seitensuchen begrenzen, Befund-Backlinks bündeln und native Entdeckungstiefen#817

    auflösen…

    Wiederholte Seitensuchen werden begrenzt, Befund-Backlinks gebündelt und native Entdeckungstiefen aufgelöst, ohne jede Route neu aufzubauen oder jeden Knoten in Python zu laden. Lange Routen behalten ihre exakte Tiefe und explizit gekürzte Endpunkte.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertNative Seiteninputs und Inlink-Suchen streamen, bevor der Kontext aufgebaut wird.#817

    Nichtleere Korpus- und hreflang-Beziehungen werden über festplattenbasierte Indizes abgeleitet, vollständige Nachweissammlungen bleiben in audit.v2 erhalten, und begrenzte Stichproben von Beziehungsbefunden sind mit ihrer exakten Vorkommenszahl gekennzeichnet.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertSeiten-Cache nach geschätzten dekodierten Python-Bytes und Eintragszahl begrenzen; nicht#817

    gecachte…

    Der Seiten-Cache wird nach geschätzten dekodierten Python-Bytes und zusätzlich nach Eintragszahl begrenzt. Nicht gecachte übergroße Seiten bleiben lesbar, und Mutationen machen ihr altes Gewicht ungültig. HTML-Größenrangfolgen werden als stabile skalare URL-Größen-Paare geführt, statt jedes vollständige Seitenmodell zu behalten. Serialisiertes Seiten-JSON wird in Mutations-Callbacks nicht mehr gespeichert.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertNur skalare Fakten zu URL, Status, Indexierbarkeit, Canonical und Weiterleitung behalten,#817

    während Trailing-Slash-Paare geprüft werden…

    Beim Prüfen von Trailing-Slash-Paaren werden nur skalare Fakten zu URL, Status, Indexierbarkeit, Canonical und Weiterleitung behalten. Außerdem werden SQLite-Verbindungen für dauerhafte Adapter und Remote-Jobs explizit geschlossen.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertZählungen zu nicht verfügbaren Körpern und Zeichensatz-Abdeckung streamen, skalaren#817

    Auswahlzustand der Vertrauensseiten statt…

    Zählungen zur Abdeckung nicht verfügbarer Körper und Zeichensätze werden gestreamt. Statt Kandidaten-Seitenpopulationen zu behalten, bleibt nur der skalare Auswahlzustand der Vertrauensseiten erhalten. DOM-Treffer in gespeichertem HTML werden in zwei Durchläufen über den festen Dateiindex verarbeitet. Die Reihenfolge der repräsentativen normalisierten Varianten, die bestehenden URL-Beispiele, die vollständige Abdeckung der Treffer-Quellen und jeder Befund bleiben erhalten.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertLegacy-Crawl-Checkpoint-JSONL zeilenweise validieren, bevor angehängt wird, und fehlende…#817

    Legacy-Crawl-Checkpoint-JSONL wird vor dem Anhängen zeilenweise validiert. Fehlende, beschädigte oder unabgeschlossene Nachweise werden abgelehnt, ohne bestehende zu ersetzen. Ältere Checkpoints mit Inline-Formularen werden mit ihrer Sidecar-Datei verglichen, ohne eine zweite Formularliste anzulegen.

    #817 (Issue auf GitHub)
  • HinzugefügtFunktioniertHerkunftsgeprüfte Fortsetzung des JavaScript-Benchmarks zwischen abgeschlossenen Paaren#817

    ergänzen…

    Herkunftsgeprüfte Fortsetzung des JavaScript-Benchmarks zwischen abgeschlossenen Paaren. Frühere Belege und Speicherbudgets bleiben erhalten, unterbrochene Fälle bleiben als explizite Blocker sichtbar. Ein Benchmark-Fall gilt erst dann als bestanden, wenn Abfrage bzw. Neuanalyse erfolgreich waren und die vollständigen Seiten-CSV-Nachweise vorliegen.

    #817 (Issue auf GitHub)
  • GeändertFunktioniertExplizite URL-Listen mit dem nativen SQLite-Schreiber aufbewahren und dabei die exakte#817

    Eingabereihenfolge erhalten…

    Explizite URL-Listen werden mit dem nativen SQLite-Schreiber aufbewahrt. Dabei bleiben die exakte Eingabereihenfolge, mehrere Hosts und die Semantik ohne Discovery erhalten. Exchange-Datei-Eingaben werden gestreamt, Anfrage- und Zeitbudgets bleiben über die Fortsetzung der Erhebung hinweg erhalten, begrenzte Antwort- und Hop-Nachweise werden gespeichert, und Graph- und Formularprüfungen bleiben explizit nicht verfügbar. Große Verzeichnislisten nutzen denselben Spool mit einer separat begrenzten JSON-Audit-Brücke.

    #817 (Issue auf GitHub)
  • HinzugefügtFunktioniertVersioniertes audit.v2-SQLite-Begleitobjekt für vollständige, geordnete Audit-Sammlungen#816

    jenseits der…

    Ein versioniertes audit.v2-SQLite-Begleitobjekt für vollständige, geordnete Audit-Sammlungen jenseits der Größengrenze für Inline-JSON, mit Bindung an die Scan-Herkunft und durchgängiger Integritätsprüfung.

    #816 (Issue auf GitHub)
  • GeändertFunktioniertaudit.v2-Berichte als JSON, CSV, XLSX, Markdown und DOCX streamen, Populationen mit#816

    vielen Befunden vergleichen…

    audit.v2-Berichte in JSON, CSV, XLSX, Markdown und DOCX werden gestreamt und Populationen mit vielen Befunden verglichen. Snapshot- und Prune-Operationen bleiben mit der Begleitdatei gekoppelt, und das Schema scan.v1 bleibt unverändert.

    #816 (Issue auf GitHub)
  • GeändertFunktioniertGroße geordnete Gruppenmitgliedschaften einmalig in audit.v2-Speicherrevision 3 und#816

    Ledger-Revision 5 speichern…

    Große geordnete Gruppenmitgliedschaften werden einmalig in audit.v2-Speicherrevision 3 und Ledger-Revision 5 gespeichert. Ältere Audit-Lesevorgänge bleiben abwärtskompatibel, die Ledger-Migration erfolgt atomar, Mitglieder lassen sich über CLI und MCP explizit seitenweise abrufen, und die BI-Mitgliedschafts-Begleitdaten sind vollständig und an die Quelle gebunden.

    #816 (Issue auf GitHub)
  • GeändertFunktioniertDen audit.v2-Quell-Digest bei der Offline-Neuanalyse erhalten; unvollständigen#816

    Ledger-Gruppenumfang speichern…

    Der audit.v2-Quell-Digest bleibt bei der Offline-Neuanalyse erhalten. Unvollständiger Gruppenumfang im Ledger wird gespeichert, und Ingest-Ressourcen werden bei fehlgeschlagener Validierung geschlossen.

    #816 (Issue auf GitHub)
  • GeändertFunktioniertDen exakten Kapazitätsüberblick des Korpus wiederverwenden, solange ein nativer Scan nur#815

    mit Metadaten keine…

    Der exakte Kapazitätsüberblick des Korpus wird wiederverwendet, solange ein nativer Scan nur mit Metadaten keine Antwort-, Dokument-, Körper- oder Ressourcen-Nachweise hat. So entfallen wiederholte Lesevorgänge über den gesamten Korpus bei jedem Commit einer spärlichen Seite, ohne die Scan-Speicherung zu ändern.

    #815 (Issue auf GitHub)
  • HinzugefügtFunktioniertOpt-in-Offline-Profiler für die Scan-Kapazität nativer Scans mit unabhängig#815

    dimensionierten Links…

    Fügt einen optionalen Offline-Profiler für die Kapazität nativer Scans hinzu, mit unabhängig dimensionierten Links, gespeichertem HTML und gerendertem DOM, expliziten Ressourcenbudgets sowie einer Übung zu Prozessabbruch und Wiederaufnahme. Das bestehende Limit von 50.000 URLs bei der Aufnahme und die unvollständige Finalisierung werden als blockierte Nachweise ausgewiesen, nicht als Kapazität.

    #815 (Issue auf GitHub)
  • GeändertFunktioniertAbbruch fixierter Browser-Anfragen als render_cancelled benennen und den isolierten…#811

    Benennt den Abbruch fixierter Browser-Anfragen als render_cancelled und schließt bei Abbruch oder Verbindungsverlust den isolierten Remote-Kontext und den Browser, ohne lokalen Fallback.

    #811 (Issue auf GitHub)
  • GeändertFunktioniertVertrauenswürdige Remote-Projektkonfiguration erlauben, host-gebundene Verweise auf#810

    Umgebungs-Zugangsdaten zu liefern…

    Vertrauenswürdige Remote-Projektkonfigurationen dürfen Verweise auf host-gebundene Umgebungs-Zugangsdaten angeben. Die geschwärzten Herkunftsangaben bleiben gespeichert. Ist ein Verweis nicht verfügbar, bricht die Erhebung vor der Erfassung ab.

    #810 (Issue auf GitHub)
  • GeändertFunktioniertVom Dienst verwalteten, versionsgeprüften Remote-Playwright-Transport für ein#809

    eingereihtes Projekt erlauben…

    Erlaubt einen vom Dienst verwalteten, versionsgeprüften Remote-Playwright-Transport für ein eingereihtes Projekt. Der Endpunkt bleibt außerhalb der Einreichungen, und fixierte, richtlinienkonforme Browser-Anfragen bleiben erhalten.

    #809 (Issue auf GitHub)
  • HinzugefügtFunktioniertBeobachtete Pfade, Rück-Inlinks und Vorkommenskontext gespeicherter Scans über eine#807

    einzige…

    Macht beobachtete Pfade, Rück-Inlinks und den Vorkommenskontext gespeicherter Scans über eine gemeinsame, begrenzte und rein lesende CLI- und MCP-Abfrage zugänglich, mit eindeutiger Scan-Identität und expliziten Fehlerergebnissen.

    #807 (Issue auf GitHub)
  • HinzugefügtFunktioniertBegrenzte, rein lesende Auswertung der Linkplatzierung pro Vorkommen und des nächsten#806

    Überschriften-Kontexts aus…

    Ergänzt eine begrenzte, rein lesende Auswertung der Linkplatzierung pro Vorkommen und des nächstgelegenen Überschriften-Kontexts aus gespeichertem statischem HTML und gerendertem DOM. Doppelte Link-IDs bleiben erhalten, nicht verfügbare oder nur teilweise vorliegende Nachweise werden explizit ausgewiesen.

    #806 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeuer Befehl semantic-inputs (seo_semantic_inputs über MCP) erstellt das#801

    reproduzierbare, normalisierte Eingabe-Manifest, das die Arbeit an der semantischen Ähnlichkeit verarbeiten wird. Pro Dokument werden erfasst: der Hash des gespeicherten Bodys, der exakte Hash der dekodierten Eingabe, der Hash der normalisierten Ausgabe, die Strategie für den Inhaltsbereich und Sprachnachweise. Letztere bestehen aus dem eigenen <html lang> der Seite und den Anteilen der Schriftsysteme. Der normalisierte Text selbst wird nie gespeichert. --scan streamt die gespeicherten vollständigen Bodies offline unter der beim Crawl erfassten Konfiguration des Inhaltsbereichs, ohne erneuten Abruf. Ein fehlender oder unvollständiger Body bleibt eine explizite Auslassung und kein sauberes leeres Ergebnis (#801).

    #801 (Issue auf GitHub)
  • GeändertFunktioniertSeitenzahl, Dateigröße, extrahierbaren Text und Erhalt der Quellmodell-Datensätze der#800

    technischen Audit-PDF prüfen…

    Prüft Seitenzahl, Dateigröße, extrahierbaren Text und den Erhalt der Quellmodell-Datensätze der technischen Audit-PDF, bevor ein gerenderter Bericht veröffentlicht wird.

    #800 (Issue auf GitHub)
  • HinzugefügtFunktioniertZweisprachige Chromium-PDF-Ausgabe offline in die gemeinsamen CLI- und MCP-Pfade von#799

    report-build aufnehmen…

    Ergänzt die gemeinsamen CLI- und MCP-Pfade von report-build um eine zweisprachige Chromium-PDF-Ausgabe im Offline-Betrieb. Die temporäre Datei wird vor dem atomaren Ersetzen validiert und bereinigt.

    #799 (Issue auf GitHub)
  • HinzugefügtFunktioniertEigenständige englische und russische Layouts für die technische Audit-PDF mit neutralen#798

    Markenfarben…

    Ergänzt eigenständige englische und russische Layouts für die technische Audit-PDF mit neutralen Marken-Tokens, Diagrammen zu Schweregraden und Abdeckung, expliziten Zuständen für unvollständige Läufe und einem Seitenfluss für lange Inhalte.

    #798 (Issue auf GitHub)
  • BehobenFunktioniertPDF-Layout getrennt von der Erstellung des Audit-Modells und der CLI- und MCP-Integration#798

    halten.

    #798 (Issue auf GitHub)
  • HinzugefügtFunktioniertVersioniertes Offline-Inhaltsmodell für die technische Audit-PDF, das Quelldatensätze#797

    erhält…

    Ergänzt ein versioniertes Offline-Inhaltsmodell für die technische Audit-PDF. Es bewahrt Quelldatensätze, exakte Anzahlen von Quell- und projizierten Werten, Umfang und Abdeckungszustände für beide unterstützten Audit-Verträge.

    #797 (Issue auf GitHub)
  • GeändertFunktioniertRegistrierte Versionen von Workflow-Szenarien, Website- und Wettbewerbskontext, Nachweise#796

    pro Schritt…

    Speichert registrierte Versionen von Workflow-Szenarien, Kontext zu Website und Wettbewerbern, Nachweise pro Schritt und Prüfgates. Unterbrochene Läufe kann eine spätere lokale Sitzung nur dann fortsetzen, wenn ihre aktuellen Abhängigkeiten weiterhin gültig sind.

    #796 (Issue auf GitHub)
  • GeändertFunktioniertFür Workflow-Starts eine Controller-Arbeitsliste verlangen und explizite Triage-Belege#796

    für Fachnotizen…

    Verlangt für Workflow-Starts eine Controller-Arbeitsliste und speichert explizite Triage-Belege für Fachnotizen, die als Aufgabe, Ziel, Wettbewerber, blockiert oder abgelehnt eingestuft werden.

    #796 (Issue auf GitHub)
  • GeändertFunktioniertErfolgreiche Workflow-Checkpoints müssen die projektgebundenen gespeicherten#796

    Artefakt-Bytes prüfen…

    Erfolgreiche Workflow-Checkpoints müssen die projektgebundenen, gespeicherten Artefakt-Bytes gegen ihre SHA-256-Belege prüfen. Fehlende oder geänderte Nachweise machen einen früheren Abschluss veraltet, ohne die Historie umzuschreiben. Prüfbudgets bestätigen Nachweise nie stillschweigend und verwerfen auch nicht deren Beleg.

    #796 (Issue auf GitHub)
  • GeändertFunktioniertExplizite, begrenzte Profile für Nachweis-Hash-Richtlinien erlauben und ältere#796

    Richtlinien dabei normalisieren.

    Die passive Beobachtung des Workflows prüft gespeicherte Verifikationsmetadaten, ohne Artefakte erneut zu hashen. Geänderte oder nicht verifizierte Belege bleiben explizit sichtbar.

    #796 (Issue auf GitHub)
  • HinzugefügtFunktioniertBegrenzten, paginierten CLI-Befehl project progress und das MCP-Tool#795

    seo_project_progress hinzufügen…

    Ergänzt den begrenzten, paginierten CLI-Befehl project progress und das MCP-Tool seo_project_progress mit Zählern für den Status der Checkliste und den nächsten umsetzbaren Punkten. Die Ansicht nutzt die bereichsbezogenen Abdeckungsergebnisse. Ein Prozentwert für den Abschluss der Audit-Aufgaben wird nur ausgewiesen, wenn jede einbezogene Website einen abgestimmten Plan und einen gemessenen, nicht leeren Aufgaben-Nenner hat. Er ist dann ausdrücklich als solcher gekennzeichnet. Die Abdeckung der URL-Grundgesamtheit bleibt davon getrennt.

    #795 (Issue auf GitHub)
  • GeändertFunktioniertProjekt-Checklisten können jetzt den vereinbarten Audit-Umfang erfassen und ehrliche#794

    Abdeckungsquoten melden…

    Projekt-Checklisten können jetzt den vereinbarten Audit-Umfang erfassen und ehrliche Abdeckungsquoten ausweisen (#794). project-checklist-init und seo_project_checklist_init akzeptieren einen optionalen plan: einen Prüfer, eine URL-population als complete_set, eine benannte sample oder unknown, jeweils mit source, size oder aufgezählten urls, dazu optional Populationen pro templates sowie eine optionale tasks-Vereinbarung (all_agreed oder eine belegte selection vorhandener Checklisten-Element-IDs). Der Plan ist an die Website-Identität des Projekts gebunden und mit der Schreibrevision versehen. Das Erfassen eines Plans stuft die Checkliste auf seohead.coverage.v3 hoch und hängt an eine gespeicherte Planhistorie an. Eine erneute Erfassung einer identischen Vereinbarung ist eine idempotente Operation ohne Wirkung. Ändert sich die Vereinbarung, werden frühere Nachweise als veraltet markiert, statt sie unter einem geänderten Nenner neu zu bewerten. Dokumente mit einem Plan im v3-Format werden beim Lesen migriert. Lesen, Abgleichen oder Anwenden von Prioritäten erfindet oder erweitert nie eine Population, und v1- und v2-Dokumente laden unverändert weiter. Elemente außerhalb einer Auswahl werden als not_agreed gemeldet und liegen sichtbar außerhalb jedes Nenners.

    #794 (Issue auf GitHub)
  • GeändertFunktioniertDer Checklisten-Abschluss folgt jetzt dem gemessenen Umfang: ein website-bezogenes#794

    automatisches Element…

    Der Checklisten-Abschluss folgt jetzt dem gemessenen Umfang. Ein website-bezogenes automatisches Element, das auf einer begrenzten, also teilweisen Messung beruht, bleibt offen, statt als erledigt zu gelten. Ein Element, das auf explizite Stichproben-URLs beschränkt ist, gilt weiterhin als abgeschlossen, sobald das Artefakt genau diesen Umfang abdeckt. Das oberste Feld complete bedeutet jetzt, dass das bereichsbezogene Audit abgeschlossen ist: Jede anwendbare vereinbarte Aufgabe ist erledigt, es gibt keine offenen Ausschlüsse, und die vereinbarte URL-Grundgesamtheit ist vollständig durch verifizierte Messungen abgedeckt. Ein unbekannter oder nicht gemessener Umfang kann daher nie ein abgeschlossenes Audit melden.

    #794 (Issue auf GitHub)
  • GeändertFunktioniertDer Checklisten-Status liefert jetzt coverage mit fünf getrennten Quoten:#794

    audit_tasks, checks (mit measured_urls), manual_review, deliverable_review und url_population. Jede hat eigene Werte für basis, numerator, denominator und state, sodass eine URL-Anzahl nie mit einer Prüf- oder Aufgabenanzahl vermischt wird. Ein Nenner, der sich nicht begründen lässt, bleibt null mit state: "unknown" und einem Grund. Er wird weder zu 0/0 noch zu 100 %. Messungen, die sich nicht gegen die vereinbarte Population verifizieren lassen, halten die URL-Achse auf partial und zählen nur verifizierte, zulässige URLs. Die URL-Zugehörigkeit wird gegen die vereinbarte Aufzählung geprüft. Eine Population, die nur über size deklariert ist, zählt daher keine gemessenen URLs, und der Zähler kann seinen Nenner nie übersteigen. Populationen pro Template werden beim Erfassen oder Lesen eines Plans als vereinbarte Teilmengen der Website-Population validiert. Aufgezählte Template-URLs müssen zur aufgezählten Website-Menge gehören, und die deklarierte Template-Zugehörigkeit darf die vereinbarte Website-Größe nie übersteigen. Ein widersprüchlicher Plan wird daher abgelehnt, statt gekürzt oder über den Nenner hinaus gezählt zu werden. Gespeicherte Prüfnachweise enthalten jetzt die gemessene URL-Aufzählung. Der URL-Zähler ist damit eine nachprüfbare Menge und keine bloße Zeilenanzahl. Die Aggregation über mehrere Websites summiert die Achsen je Website und fällt auf unknown zurück, sobald eine Website ihren Nenner nicht begründen kann.

    #794 (Issue auf GitHub)
  • GeändertFunktioniertEin Eintrag not_applicable ist jetzt ein geprüfter Ausschluss: Er braucht einen Grund,#794

    einen Prüfer…

    Ein Eintrag not_applicable ist jetzt ein geprüfter Ausschluss. Er erfordert einen Grund, einen Prüfer und eine nachprüfbare Nachweisbasis: ein projektrelativ mit Digest versehenes artifact oder einen expliziten evidence-Verweis. Geprüfte Ausschlüsse behalten ihre stabile ID und Historie. Sie verlassen die Aufgaben-Nenner nur durch die erfasste Entscheidung und werden separat unter exclusions aufgeführt. Ein deaktiviertes Element, ein veralteter Ausschlusseintrag oder ein älterer not_applicable-Eintrag, der vor der Regel zur Nachweisbasis geschrieben wurde, bleibt als pending_exclusion im Nenner, bis er erneut geprüft wird. So kann Deaktivierung, Entfernen aus dem Katalog oder Neuklassifizierung die vereinbarten Zähler nie stillschweigend verkleinern. Ein frischer, geprüfter Ausschluss für ein aus dem Katalog entferntes Element wird regulär aufgelöst und bleibt nicht dauerhaft als ausstehend stehen.

    #794 (Issue auf GitHub)
  • HinzugefügtFunktioniertDen adressierbaren Prompt workflow/full-audit-v1 und das Szenario full-audit über…#793

    Ergänzt den adressierbaren Prompt workflow/full-audit-v1 und das Szenario full-audit über die bestehenden Katalogrouten für Skills und Szenarien in CLI und MCP. Der Workflow nutzt die ausgelieferten Erhebungs- und Methodenpfade, knüpft Verifikation und Berichterstellung an tatsächliche Nachweise und trennt die Projektvorbereitung vom Abschluss des vollständigen Audits.

    #793 (Issue auf GitHub)
  • GeändertFunktioniertEntscheidungen zur Behebung an unveränderliche Verifikationsartefakte und exakte Hashes#792

    vorher/nachher binden…

    Bindet Entscheidungen zur Behebung an unveränderliche Verifikationsartefakte und exakte Nachweis-Hashes für den Zustand vor und nach der Behebung, einschließlich gestreamter audit.v2-Baselines.

    #792 (Issue auf GitHub)
  • GeändertFunktioniertGespeicherte Behebungsergebnisse mit Abdeckungszuständen für repräsentierte und#791

    vollständige Umfänge melden…

    Meldet gespeicherte Behebungsergebnisse mit Abdeckungszuständen für repräsentierte und vollständige Umfänge, Nenner je Aufgabe und begrenzten Fallseiten für große Ledger.

    #791 (Issue auf GitHub)
  • HinzugefügtFunktioniertBegrenzte Nachprüfungen der Behebung nach Ledger-Schlüssel hinzufügen, die den#790

    abgesicherten Verifier wiederverwenden…

    Ergänzt begrenzte Nachprüfungen der Behebung nach Ledger-Schlüssel. Sie verwenden den abgesicherten Verifier wieder, streamen audit.v2-Auswahlen und lehnen Umfangsabweichungen ab.

    #790 (Issue auf GitHub)
  • GeändertFunktioniertVerifikation der Behebung an die gespeicherte Audit-Identität und die ursprüngliche…#790

    Bindet die Verifikation der Behebung an die gespeicherte Audit-Identität und an die ursprüngliche, ergebnisrelevante Richtlinie. Eine wiederverwendete Scan-UUID allein löst nicht mehr einen älteren Fall auf.

    #790 (Issue auf GitHub)
  • HinzugefügtFunktioniertDas Behebungs-Ledger ledger.v1 (seohead.storage.ledger, Anwendungs-ID SEOL)#788

    hinzugefügt…

    Ergänzt das Behebungs-Ledger ledger.v1 (seohead.storage.ledger, Anwendungs-ID SEOL). Es ist ein separates, projektgebundenes SQLite-Artefakt, das Befunde, die Identität je Vorkommen, die Zugehörigkeit betroffener URLs und einen nur anhängbaren Beobachtungsverlauf aus validierten scan.v1- und scan.v2-Audits erfasst, ohne die Quellscans zu verändern. Bei der Aufnahme wird jede Quelle über die Scan-UUID zusammen mit Nachweisrevision, Audit-Digest und Identität von Producer und Konfiguration gebunden. Exakte Wiederholungen sind idempotent. Widersprüchliche Bytes unter derselben Revision werden atomar abgelehnt. capped- und aggregate_only-Abdeckung sowie unavailable-Nachweise bleiben als Daten erhalten und gelten nicht stillschweigend als behoben. Enthalten sind eine transaktionale Migration von 0 auf 1, die vollständige Schema- und Integritätsprüfung beim Öffnen sowie docs/LEDGER.md (#788).

    #788 (Issue auf GitHub)
  • HinzugefügtFunktioniertWegwerfbares Loopback-TLS-Reverse-Proxy-Profil hinzufügen, das authentifizierte#787

    Artefakt-Isolation prüft…

    Ergänzt ein wegwerfbares Loopback-TLS-Reverse-Proxy-Profil. Es prüft die Isolation authentifizierter Artefakte, Backup und Restore, den Ablauf sowie das atomare Zurückrollen nach einem Upgrade, ohne einen Dienst auszurollen.

    #787 (Issue auf GitHub)
  • GeändertFunktioniertEinmalige SSH-CLI-Jobs, Artefakt- und Vorfallseinträge, synthetische Wiederherstellung#787

    und die…

    Dokumentiert einmalige SSH-CLI-Jobs, Artefakt- und Vorfallseinträge, die synthetische Wiederherstellung und die getrennte Grenze für einen künftigen Dienst: Zustandsprüfung, Proxy, TLS und Firewall.

    #787 (Issue auf GitHub)
  • HinzugefügtFunktioniertBetriebsprofil für einen selbst gehosteten Remote-Dienst mit privaten Bindungen und#787

    authentifizierten…

    Ergänzt das Betriebsprofil für einen selbst gehosteten Remote-Dienst: private Bindungen, authentifizierte Nachweise zum Zustand, Verweise auf Secret-Dateien, Vorfallseinträge, eine mit SQLite konsistente Wiederherstellung, Rollback eines Releases und ein explizites Ablaufdatum für terminale Artefakte.

    #787 (Issue auf GitHub)
  • HinzugefügtFunktioniertProjektgebundene Richtlinie für Remote-Ziele künftiger eingereihter Jobs hinzufügen.#786

    Wird ein Worker gebunden, validiert die Richtlinie Ziele und Einstellungen, prüft DNS beim Versand erneut, fixiert HTTP- und Browser-Ressourcenanfragen und erzwingt Budgets pro Origin sowie für alle Anfragen insgesamt. Remote-Proxys und alternative Browser-Backends schlagen im Zweifel fehl, bis ihr Egress nachweislich sicher ist.

    #786 (Issue auf GitHub)
  • HinzugefügtFunktioniertProjektisolierte SQLite-Warteschlange und Worker mit Lease für native Scans in der#785

    optionalen…

    Ergänzt eine projektisolierte SQLite-Warteschlange und einen Worker für native Scans mit Lease für die optionale, authentifizierte Remote-API. Jobs behalten native Scans sowie JSON- und Markdown-Berichte. Sie unterstützen idempotente Einreichung, Abbruch, Wiederherstellung nach Neustartfehlern, auf den Geltungsbereich beschränkte Artefakt-Downloads und eine explizite Aufbewahrung, ohne standardmäßig einen Listener zu aktivieren.

    #785 (Issue auf GitHub)
  • GeändertFunktioniertOptionalen, authentifizierten und versionierten Vertrag für die Remote-Scan-API mit#784

    begrenzten nativen…

    Definiert einen optionalen, authentifizierten und versionierten Vertrag für die Remote-Scan-API mit begrenzten Einstellungen für den nativen Crawl, projektbezogenen Berechtigungen, idempotenter Einreichung, OpenAPI-Schema und Nachweisen, die mit dem Scan-Status kompatibel sind. Er setzt eigenständige, dauerhafte Worker sowie eine Ziel- und Egress-Richtlinie voraus. Lokale Installationen von CLI und MCP bleiben unverändert (#784).

    #784 (Issue auf GitHub)
  • HinzugefügtFunktioniertGepinntes Ubuntu-SSH-Runbook und einen Wegwerf-Smoke-Test des Linux-Lebenszyklus#783

    hinzufügen, der…

    Ergänzt ein gepinntes Ubuntu-SSH-Runbook und einen Wegwerf-Smoke-Test des Linux-Lebenszyklus. Er belegt Installation, JavaScript-Rendering, Erkennung von Artefakten, Upgrade, Versionsnachweis und Rollback, ohne einen Remote-Dienst.

    #783 (Issue auf GitHub)
  • GeändertFunktioniertImportierte Analytics- und Suchnachweise für Scan-Joins normalisieren (#781).#781

    evidence-normalize liest einen mitgelieferten CSV-, XLSX- oder JSON-Export bzw. einen gespeicherten seohead.provider-evidence.v1-Umschlag vollständig offline ein und erzeugt ein versioniertes Dokument seohead.normalized-evidence.v1 anhand eines optionalen Mapping-Manifests seohead.evidence-mapping.v1. Dabei bleibt die Herkunft jedes Feldes erhalten (aus dem Umschlag, deklariert oder unbekannt) für Quelle, Berichtsidentität, Zeitraum, Zeitzone, Attribution, Engine, Erhebungsabdeckung und URL-Bindung. Ein gemessener Wert 0 bleibt null. Fehlende Zeilen, leere oder Null-Zellen, Formelzellen, unterdrückte Werte, nicht erhobene Zeiträume sowie fehlgeschlagene oder übersprungene Erhebungen bleiben dagegen explizit nicht verfügbar. evidence-join verknüpft normalisierte Nachweise mit einem Scan, Audit oder einer Seitenliste nach der strikten Schlüsselrichtlinie external_join.v1 und nur mit ausdrücklichen Lockerungen. Zugeordnete, nur im Crawl vorhandene, nur extern vorhandene und nicht schlüsselbare Populationen bleiben auf ihrer deklarierten Granularität erhalten. Schlüsselkollisionen werden gemeldet, statt Zeilen zu vervielfachen. --compare ergänzt zusammen mit einer deklarierten Richtlinie eine reine Entscheidung ohne Nebeneffekte: kompatibel, inkompatibel oder unbekannt, geprüft über Zeitraum, Zeitzonengrenze, Identität, Attribution, Engine und Granularität. Außerdem meldet sie, ob gemessene Nullwerte für Quadranten in der nachgelagerten Kohortenarbeit geeignet sind. Eingeschränkte Quellen halten Zeilen und Identifikatoren in einem lokalen, privaten Artefakt und geben nur Anzahlen zurück.

    #781 (Issue auf GitHub)
  • HinzugefügtFunktioniertOffline-Ansicht zur Anbieter-Bereitschaft mit geschwärzten Verweisen auf Zugangsdaten…#780

    Ergänzt eine Offline-Ansicht zur Anbieter-Bereitschaft mit geschwärzten Verweisen auf Zugangsdaten, Schemata der Operationsrouten, Metadaten zu Quota und Datenschutz sowie expliziten Zuständen des Zielzugriffs. Das bloße Vorhandensein von Zugangsdaten belegt niemals eine Berechtigung.

    #780 (Issue auf GitHub)
  • GeändertFunktioniertseohead watch zu einem rein lesenden Projektbeobachter mit gespeicherter#775

    Befundnavigation ausbauen…

    Erweitert seohead watch zu einem rein lesenden Projektbeobachter mit Navigation durch gespeicherte Befunde, Detailansicht der Nachweise, Status gespeicherter Ansichten und Review-Status sowie ausdrücklich eingegrenzten Hinweisen im MCP-Posteingang.

    #775 (Issue auf GitHub)
  • HinzugefügtFunktioniertAutorisierte synthetische Berichtszustellung mit dauerhaften Idempotenz-Belegen und…#773

    Ergänzt autorisierte synthetische Berichtszustellung mit dauerhaften Idempotenz-Belegen und einem wiederholungssicheren Verhalten beim Neustart.

    #773 (Issue auf GitHub)
  • GeändertFunktioniertUnsichere Zustellungsansprüche nach Prozessende oder fehlerhafter Dokumentbestätigung#773

    erhalten…

    Unsichere Zustellungsansprüche bleiben nach einem Prozessende oder einer fehlerhaften Dokumentbestätigung erhalten. So wird ein automatischer zweiter Upload verhindert, wenn die Annahme nicht sicher festgestellt werden kann.

    #773 (Issue auf GitHub)
  • GeändertFunktioniertBerichtsvorschauen aus gespeicherten Nachweisen messen, einschließlich gerenderter Größe,#772

    Quell-Digest…

    Misst Berichtsvorschauen anhand gespeicherter Nachweise, einschließlich gerenderter Größe, Quell-Digest, Populationszahlen, Abdeckung und Profil. Fehlende Renderer und übergroße Eingaben werden vor dem Versand gemeldet. Das JS-Budget des gründlichen Assistenten wird an den gemeinsamen Warteschlangen-Vertrag angeglichen.

    #772 (Issue auf GitHub)
  • GeändertFunktioniertExakte, bestätigte Bot-Versandidentitäten über Abstürze von Warteschlange und#771

    Besitzwechsel hinweg erhalten…

    Bewahrt die exakten, bestätigten Bot-Versandidentitäten über Abstürze von Warteschlange und Besitzwechsel hinweg, dedupliziert vertrauenswürdige Updates und trennt Status, Abbruch, Wiederherstellung und Zustellung nach auslösendem Akteur und Chat. Identische, bewusst erneut gestartete Läufe bleiben eigenständige Jobs.

    #771 (Issue auf GitHub)
  • BehobenFunktioniertDen zuletzt bestätigten Job je Akteur und Chat nach einem Dienstneustart wiederherstellen#771

    und Abbruch…

    Stellt nach einem Dienstneustart den zuletzt bestätigten Job je Akteur und Chat wieder her. Abbruch und das erneut bestätigte Wiederholen bleiben erhalten. Ein nicht bestätigter Entwurf wird nicht fortgesetzt.

    #771 (Issue auf GitHub)
  • HinzugefügtFunktioniertNachweispaket für die Softwareprüfung zu Self-Hosting, Recht und Beschaffung hinzufügen…#761

    Ergänzt das Nachweispaket für die Softwareprüfung zu Self-Hosting, Recht und Beschaffung (#761). scripts/generate_review_pack.py erzeugt und verifiziert ein versioniertes Inventar von Abhängigkeiten und Lizenzen. Es gibt ein Profil je Installationsgruppe mit aufgelösten Versionen und Lizenzquellen, gemessen in der erzeugenden Umgebung. Anforderungen, die durch Marker ausgeschlossen, durch die Spezifikation nicht erfüllt oder nicht installiert sind, werden erfasst statt verworfen. Dazu kommt ein Provenienzdokument auf Release-Ebene, das die gebauten Distributionen mit einem Tag und der Quellrevision aus dem eingebetteten Build-Manifest verknüpft, sowie eine SHA256SUMS.txt, die alles abdeckt. Die Erzeugung lehnt ein Tag ab, das nicht zu pyproject.toml passt. Die Verifikation prüft Formate und gespeicherte Hashes erneut und entpackt jede Distribution, um ihr eingebettetes Manifest, Name und Version laut Dateiname sowie die Felder Name und Version der eigenen *.dist-info/METADATA oder PKG-INFO gegen pyproject.toml zu validieren, statt dem Eintrag zu vertrauen. Ein Sentinel-Scan nach SEOHEAD_REVIEW_CANARY_* belegt, dass Paketdateien und Diagnosen keine eingeschleusten Zugangsdaten oder Kundenmarkierungen enthalten. CI erzeugt und verifiziert das Paket bei jedem Lauf mit einem Wegwerf-Tag. Der Release-Workflow verifiziert es und hängt es an ein echtes v*-Release an.

    #761 (Issue auf GitHub)
  • HinzugefügtFunktioniertdocs/SOFTWARE_REVIEW.md hinzufügen: die Karte ausgehender Endpunkte und Datenflüsse#761

    (was jede…

    Ergänzt docs/SOFTWARE_REVIEW.md mit der Karte der ausgehenden Endpunkte und Datenflüsse. Sie zeigt, was jede Funktion kontaktiert, was sie sendet und ob der Aufruf optional ist. Dazu kommen die Grenze zwischen lokal und remote, die Speicherung von Zugangsdaten und Artefakten, der Telemetriestatus, die Meldewege für Sicherheitsprobleme, der Wartungsstatus und das Vorgehen bei der Prüfung von Release-Änderungen. Die Dokumentation verlinkt auf die Installations- und Deployment-Runbooks (#783, #787), statt sie zu duplizieren.

    #761 (Issue auf GitHub)
  • HinzugefügtFunktioniertOffline-Vorabprüfung von Google-Sheets-Kapazität und Prüfsumme für vollständige lokale#760

    BI-Pakete…

    Ergänzt eine Offline-Vorabprüfung von Google-Sheets-Kapazität und Prüfsumme für vollständige lokale BI-Pakete. Sie stellt keine Anfrage an Google und schreibt nichts in Tabellen.

    #760 (Issue auf GitHub)
  • HinzugefügtFunktioniertExpliziten, allowlist-geprüften Google-Sheets-Ersetzungstransport mit#760

    Arbeitsblatt-Zuordnung je Datensatz…

    Ergänzt einen expliziten, per Allowlist freigegebenen Google-Sheets-Transport zum Ersetzen. Er bietet Zuordnung der Arbeitsblätter je Datensatz, begrenztes Staging und Readback sowie eine atomare, nur Werte umfassende Veröffentlichung, die bestehende Arbeitsblatt-IDs erhält.

    #760 (Issue auf GitHub)
  • GeändertFunktioniertGoogle-Sheets-Staging vor jeder Remote-Stage-Erstellung checkpointen und eine verlorene#760

    Startantwort…

    Setzt vor jeder Erstellung einer Remote-Stage einen Checkpoint für das Google-Sheets-Staging. Eine verlorene Startantwort gleicht sie anhand der deterministischen Stage-Sheet-Identitäten ab, bevor erneut versucht wird.

    #760 (Issue auf GitHub)
  • GeändertFunktioniertTypisierte numerische und boolesche Werte sowie lückenhafte Google-Readbacks erhalten,#760

    doppelte…

    Erhält typisierte numerische und boolesche Werte sowie lückenhafte Google-Readbacks. Doppelte Arbeitsblatt-Ziele und Abweichungen im Datensatz-Vertrag werden abgelehnt. Die Wiederherstellung wird an das exakt konfigurierte Ziel gebunden, und fortsetzbares Staging bleibt nach einer Quota-Erschöpfung erhalten. Das Wachstum des Zielrasters wird vor dem atomaren Ersetzen budgetiert. Bei unterbrochenen Läufen werden unbestätigte Zeilenanzahlen gemeldet.

    #760 (Issue auf GitHub)
  • GeändertFunktioniertVollständige quellgebundene Gruppen-Begleitdateien vor Schreibvorgängen am Ziel#760

    validieren…

    Validiert vollständige, quellgebundene Gruppen-Begleitdateien vor Schreibvorgängen am Ziel und erhält sie zusammen mit den ausgewählten Befunden. Lokal bleibende Mitgliedsverweise werden in den Belegen für Ziel und Arbeitsmappe ausgewiesen, ohne zu behaupten, dass die Begleitdatei hochgeladen wurde.

    #760 (Issue auf GitHub)
  • GeändertFunktioniertGroße XLSX-Datensätze aus scan-export in deterministische, nummerierte Arbeitsblätter#759

    aufteilen…

    Teilt große XLSX-Datensätze aus scan-export in deterministische, nummerierte Arbeitsblätter auf. Ein Blatt Partitions mit Zeilenerhaltung dokumentiert die Aufteilung, statt am Zeilenlimit eines Excel-Blatts zu scheitern.

    #759 (Issue auf GitHub)
  • GeändertFunktioniertArbeitsblätter Findings und Pages von report-build am Zeilenlimit von Excel aufteilen#759

    und eine…

    Teilt die Arbeitsblätter Findings und Pages von report-build am Zeilenlimit von Excel auf und erzeugt eine gehashte .xlsx.index.json mit exakten Datensatzbereichen, Quellgesamtheit sowie Verweisen auf Auswahl und Abdeckung. Der vorherige Bericht bleibt bei abgefangenen Schreibfehlern erhalten. Streaming-Zwischendateien werden bei einer Unterbrechung bereinigt.

    #759 (Issue auf GitHub)
  • GeändertFunktioniertXLSX-Zellen mit mehr als 32.767 Zeichen ablehnen, bevor die Tabellenbibliothek sie kürzen#759

    kann…

    Lehnt XLSX-Zellen mit mehr als 32.767 Zeichen ab, bevor die Tabellenbibliothek sie kürzen kann. Sie schützt die Metadaten des Blatts Summary vor Formel-Injection und weist fehlerhafte gespeicherte Audit-Zeilen zurück, bevor ein unvollständiger Export einen Erfolg melden kann. Vollständiges CSV und JSON sowie die begrenzte Richtlinie für die PDF-Übersicht bleiben verfügbar.

    #759 (Issue auf GitHub)
  • HinzugefügtFunktioniertBegrenzte Auslieferung ausgewählter BI-CSV-Dateien mit exakter Zeilenbilanz für Quelle,#759

    Auswahl und Auslassungen…

    Ergänzt eine begrenzte Auslieferung ausgewählter BI-CSV-Dateien mit exakter Zeilenbilanz für Quelle, Auswahl und Auslassungen, erhaltener Quellabdeckung, gestreamten Hashes und einem dauerhaften Index der Bereichszuordnung von CSV zu XLSX-Arbeitsblatt. Übergroße Excel-Zellen schlagen fehl, bevor sie gekürzt werden. Unterbrochene Ausgaben werden nicht als vollständig markiert.

    #759 (Issue auf GitHub)
  • GeändertFunktioniertVollständige, unveränderliche Zeilen zur Prüfabdeckung neben den BI-Exporten ausgewählter#759

    Befunde erhalten…

    Erhält vollständige, unveränderliche Zeilen zur Prüfabdeckung neben den BI-Exporten ausgewählter Befunde, einschließlich der Gründe für übersprungene Prüfungen. Unterstützt außerdem die exakte Auswahl von Befunden nach gespeichertem Scope-Segment des Crawls.

    #759 (Issue auf GitHub)
  • HinzugefügtFunktioniertOffline-Crawl-Diagnose für gespeicherte native Scans und Altlauf-Artefakte hinzufügen,#758

    mit…

    Ergänzt Offline-Crawl-Diagnosen für gespeicherte native Scans und Artefakte älterer Läufe. Enthalten sind begrenzte Entscheidungsnachweise, umsetzbare Erklärungen, rein lesender Zugriff über CLI und MCP sowie ein separater, optionaler Befehl bzw. ein Tool für den geschwärzten Export.

    #758 (Issue auf GitHub)
  • HinzugefügtFunktioniertVersionierte Projektansichten für Befunde mit festen Filtern und schweregradbewusster#757

    Sortierung…

    Ergänzt versionierte Projektansichten für Befunde mit festen Filtern, schweregradbewusster Sortierung, Spaltenauswahl und begrenzter Paginierung. Absteigend sortiert stehen kritische Befunde zuerst. Aufsteigend reicht die Reihe von Hinweis bis kritisch. CLI, MCP, Berichte und künftige Terminal-Navigation können dieselbe rein lesende Ansicht nutzen, ohne Quellnachweise, Bewertung, Aufgaben oder Abdeckung zu verändern.

    #757 (Issue auf GitHub)
  • HinzugefügtFunktioniertLokale Monitor-Planung standardmäßig deaktiviert, mit expliziten inkrementellen und…#756

    Ergänzt eine lokale Monitor-Planung, die standardmäßig deaktiviert ist. Sie umfasst explizite Budgets für inkrementelle Läufe und vollständige Aktualisierungen, Ablehnung bei Überlappung, Wiederherstellungsansprüche, unveränderliche Herkunft der Beobachtungen, gespeicherte Teilergebnisse, deduplizierte Warnungen und Hinweise zur Wiederherstellung. Der Monitor startet weder einen Timer noch einen Crawl oder einen Zustellungskanal.

    #756 (Issue auf GitHub)
  • HinzugefügtFunktioniertExpliziten, eingebundenen Adapter für die Zustellung gespeicherter vollständiger#756

    Monitor-Hinweise über Dienste hinzufügen.

    Er setzt ein autorisiertes, projektgebundenes Ziel und einen dauerhaften Speicher für Belege voraus. Standardmäßig sind weder Transport, Konto, Timer noch Ziel aktiviert.

    #756 (Issue auf GitHub)
  • GeändertFunktioniertGespeicherte Monitoring-Ansprüche, Abdeckung, Cache-Herkunft, abgeleitete#756

    Wiederherstellungsnachweise…

    Macht gespeicherte Monitoring-Ansprüche, Abdeckung, Cache-Herkunft, abgeleitete Wiederherstellungsnachweise und die optionale Zustellung über Dienste neustartsicher.

    #756 (Issue auf GitHub)
  • HinzugefügtFunktioniertExpliziten, lease-begrenzten Einmal-Collector für den Monitor mit cachebewusst#756

    gespeicherten…

    Ergänzt einen expliziten, lease-begrenzten Einmal-Collector für den Monitor mit cachebewusst gespeicherten Nachweisen und lokalen Zustellungsbelegen.

    #756 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeu: verify-fixes / seo_verify_fixes für begrenzte Nachprüfungen ausgewählter URLs#755

    anhand gespeicherter Befund-IDs, einer Verifikationsansicht oder einer expliziten URL-Liste. Die Funktion übernimmt die gespeicherte Crawl-Richtlinie, schreibt ein separates Verifikationsartefakt ohne Überschreiben sowie einen fokussierten Bericht und unterscheidet Befunde, die behoben, weiterhin vorhanden, geändert oder nicht prüfbar sind. Ein bestehender Audit „nach“ lässt sich nur ohne Netzwerkzugriff verifizieren, wenn er eine eigene Scan-UUID und einen späteren erfassten Beobachtungszeitpunkt besitzt. Nicht gemessene oder seitenübergreifende Befunde werden nie als behoben markiert.

    #755 (Issue auf GitHub)
  • GeändertFunktioniertNative URL-Crawls filtern gefundene Routen nach Dateiendung und Content-Type#749

    Native URL-Crawls können gefundene Routen vor dem Abruf nach der finalen Dateiendung filtern und vor dem Parsen oder Speichern des Bodys nach dem tatsächlichen Content-Type der Antwort. Beide Filterstufen protokollieren ihre Entscheidungen und bewahren Link-, Status-, Header- und Weiterleitungsnachweise. Gefilterte HTML-Metadaten bleiben ausdrücklich als nicht gemessen gekennzeichnet. Skript- und Stylesheet-Ressourcen behalten ihre eigene Auswahl und ihre eigenen Byte-Budgets.

    #749 (Issue auf GitHub)
  • GeändertFunktioniertIst ein HTML-Body nicht verfügbar, bleibt die Abdeckung explizit als übersprungen markiert#749

    Ist ein HTML-Body nicht verfügbar, behalten body-basierte Befunde jetzt eine explizit als übersprungen markierte Abdeckung. Parser-Standardwerte gelten dann nicht mehr als unauffällig und nicht als beobachtet fehlende Metadaten.

    #749 (Issue auf GitHub)
  • HinzugefügtFunktioniertPrüfbare Ausschlüsse nach URL-Muster für Befunde nach der Analyse#748

    Unterdrückte Befunde bleiben im Audit-JSON und in den report-build-Exporten erhalten, mit der passenden Regel und dem Grund. Die aktiven Befundsummen, der Score und das Task-Backlog spiegeln die konfigurierte Richtlinie wider. Native Scan-Artefakte bewahren die Richtlinie für die Nachanalyse ohne Netzwerkzugriff. Anzahl der Regeln und Feldlängen sind begrenzt.

    #748 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeu: scan-export (seo_scan_export) – schreibgeschützter Offline-Export von Scan-Daten#747

    Neu: scan-export (seo_scan_export) – ein schreibgeschützter Offline-Export von Scan-Daten im versionierten Vertrag scan_export.v1. Er liest ein validiertes SQLite-Artefakt scan.v1 oder eine audit.json des SF Analyzers und schreibt CSV (eine Datei pro Datensatztyp plus Manifest), XLSX (nur Schreibmodus), einen streamenden JSON-Envelope oder ein dokumentiertes XML-Dokument. Jede Ausgabe enthält Herkunftsangaben, Zeilenzahlen, Laufstatistiken und eine explizite Abdeckung: welche Prüfungen gelaufen, übersprungen, deaktiviert oder nicht nachvollziehbar sind. Diese Angaben lassen sich durch Feldauswahl nicht entfernen. --records und --fields bieten eine validierte Projektion über Seiten-, Link- und Befundsätze. Unbekannte Datensatztypen oder Feldnamen werden abgelehnt, bevor eine Ausgabedatei entsteht. Fehlende Werte bleiben explizit (JSON null, XML state="absent", CSV/XLSX \N) und werden nicht zu erfundenen Nullen. XML wird als generierte Serialisierung mit korrekter UTF-8-Escapierung erzeugt. Vom Aufrufer gelieferte XML-, DTD-, Stylesheet- oder Entity-Inhalte werden nie geparst. CSV und XLSX behalten die Abwehr gegen Formel-Injection. XLSX verweigert Überläufe bei Zeilen, Spalten und Zelltext, statt abzuschneiden. Bei einem Serialisierungsfehler bleibt kein plausibel wirkendes Teilartefakt zurück.

    #747 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-site prüft erfasste externe Ziele optional und begrenzt.#746

    discovery.external.crawl läuft nach dem Schließen der internen Frontier als eigene Phase. Jedes eindeutige ausgehende Linkziel wird genau einmal abgerufen, mit eigenen Budgets external_checks.max_targets, max_hosts, max_requests, max_depth und max_redirects. Ein rekursives Durchlaufen fremder Hosts findet nie statt. Ergebnisse (abgerufen, fehlgeschlagen, blockiert, übersprungen mit der ablehnenden Regel) werden in external_checks.jsonl im Laufverzeichnis angehängt. Sie behalten die Herkunft der Quellseite und bleiben beim Fortsetzen erhalten, ohne verbrauchte Budgets erneut zu öffnen. Die Abdeckung wird in discovery.external_checks getrennt von der Vollständigkeit des internen Crawls ausgewiesen. Voraussetzung ist discovery.external.store. Auf der nativen SQLite-Route (--scan-out) wird der Lauf mit Nennung dieser Option abgelehnt, bis der Collector die Phase unterstützt.

    #746 (Issue auf GitHub)
  • HinzugefügtFunktioniertExplizite HTTP-Forward-Proxy-Richtlinie für native Crawls#745

    Neue, explizite und validierte HTTP-Forward-Proxy-Richtlinie für native Crawls. Sie gilt für Seiten-, Sitemap-, Ressourcen- und gepinnte Browser-Anfragen und protokolliert die Route mit geschwärzter Herkunft.

    #745 (Issue auf GitHub)
  • GeändertFunktioniertRendering-Engine per Konfiguration wählbar: Chromium, Firefox oder WebKit#744

    Der Rendering-Schritt des nativen Crawlers ist nicht mehr auf Chromium fest verdrahtet. rendering.browser.engine wählt chromium (weiterhin Standard), firefox oder webkit über denselben abgesicherten Playwright-Pfad. Ein unbekannter Name schlägt bei der Validierung der Einstellungen fehl, nicht erst beim Start. Ist die gewählte Engine nicht installiert, meldet der Lauf einen Abhängigkeitsfehler mit der Korrektur (playwright install <engine>), statt stillschweigend auf Chromium zurückzufallen. Die dokumentierte Einschränkung von Firefox wird ehrlich umgesetzt: Dort wird rendering.browser.mobile_emulation abgelehnt, weil is_mobile nicht unterstützt wird. Die unabhängige Option rendering.browser.touch_emulation (has_touch) wird dagegen weiterhin an den Kontext übergeben. Probe-Abrufe und vollständige Renderings nutzen dieselbe wirksame Konfiguration, sodass ein Muster nie von einem anderen Browser eskaliert wird als dem, der seine Nachweise erzeugt hat.

    #744 (Issue auf GitHub)
  • GeändertFunktioniertrendering.browser.viewport_width und rendering.browser.viewport_height: beliebige#744

    Viewport-Maße

    rendering.browser.viewport_width und rendering.browser.viewport_height ergänzen beliebige Viewport-Maße neben den bestehenden Voreinstellungen desktop und mobile. Diese bestimmen das Profil weiterhin wie bisher. Das Maßpaar gilt nur gemeinsam und ist auf 1 bis 16384 px begrenzt. Ein eigenes Paar ersetzt nur die Maße der Voreinstellung. Es aktiviert weder mobile Emulation noch Touch-Emulation; diese bleiben explizite Schalter, die der Betreiber setzt.

    #744 (Issue auf GitHub)
  • GeändertFunktioniertrendering.browser.page_concurrency begrenzt parallele Browser-Abrufe#744

    rendering.browser.page_concurrency begrenzt die Anzahl gleichzeitiger Browser-Abrufe bei der Eskalation. Das ist getrennt von speed.concurrency, das weiterhin die Höflichkeit beim HTTP-Crawl steuert. Der Standardwert 1 behält das sequenzielle Verhalten bei und legt überhaupt keinen Pool an. Ab 2 laufen Probe-Abrufe und Renderings in einem begrenzten Worker-Pool. Jede Entscheidung, jedes Commit und jeder SQLite-Schreibvorgang bleibt im Orchestrator-Thread in der Reihenfolge der Übergabe. Render-Deadline, URL-Budget und die Richtlinien für Stichprobe bzw. Vollrendering gelten auch bei Parallelität. Ein gestoppter Batch wartet auf die bereits gestarteten Seiten und plant keine neuen mehr. Unterbrochene oder fehlgeschlagene Worker hinterlassen keine laufenden Threads, Seiten, Kontexte oder Browser.

    #744 (Issue auf GitHub)
  • GeändertFunktioniertEngine, Version, Viewport und Parallelität sind im Manifest und im Rendering-Nachweis#744

    erfasst

    Die gewählte Engine, ihre tatsächlich gemeldete Version, der wirksame Viewport und die konfigurierte Seiten-Parallelität werden im Crawl-Manifest, im Fingerprint und in der Renderer-Herkunft jedes gerenderten Dokuments festgehalten, auch bei fehlgeschlagenen Versuchen. Fehlgeschlagene Versuche protokollieren nur das Angeforderte und erfinden kein erfolgreiches Rendering. Beide Eskalationspfade berücksichtigen die Einstellungen: der Verzeichnis-Crawl und der native SQLite-Scan. Dort gelangen gerenderte Link-Kandidaten über die bestehende, deduplizierende Aufnahme in die Frontier, sobald rendering.rendered_links.crawl aktiviert ist.

    #744 (Issue auf GitHub)
  • HinzugefügtFunktioniertOptionale Canonical-Prüfungen für Paginierungs- und Filter-URL-Muster#727

    Optionale Canonical-Prüfungen für konfigurierte Paginierungs- und Filter-URL-Muster in den SF-Export- und nativen Audit-Pipelines. Paginierungsregeln unterstützen als Ziel die Seite selbst, die erste Seite oder die Landingpage. Filterregeln unterstützen die Seite selbst oder die Landingpage. Fehlen Richtlinien oder Ziele in den Crawl-Daten, bleibt das Ergebnis unbemessen. Die Statusprüfung der Zielseiten bleibt davon getrennt.

    #727 (Issue auf GitHub)
  • HinzugefügtFunktioniertWiederaufnehmbare GSC-Search-Analytics-Archive im lokalen Provider-History-Speicher#718

    Wiederaufnehmbare GSC-Search-Analytics-Archive im gemeinsamen lokalen SQLite-Speicher der Provider-Historie, einheitlich über gsc-archive und seo_gsc_archive verfügbar. Offlinestatus, explizite Vorbereitung, begrenzte Erfassung und geprüfte Snapshots nutzen einen gemeinsamen Kern.

    #718 (Issue auf GitHub)
  • GeändertFunktioniertProvider-Herkunft und nullbare Metriken erhalten, nur ungedeckte Zeiträume einreihen#718

    Provider- und Engine-Herkunft sowie nullbare Metriken bleiben erhalten. Eingereiht werden nur noch nicht abgedeckte Verfügbarkeitszeiträume. Wartezeiten wegen Kontingenten und begrenzte, vorübergehende Wiederholungen werden gespeichert.

    #718 (Issue auf GitHub)
  • HinzugefügtFunktioniertEine versionierte lokale SQLite-Historie für GA4, Metrika, GSC und Yandex Webmaster#716

    Eine versionierte lokale SQLite-Historie für tägliche Daten aus GA4, Metrika, GSC (Web-Abfragen und -Seiten) und Yandex Webmaster. Tage werden atomar ersetzt. Die Abdeckung wird explizit ausgewiesen: angefordert, leer, teilweise, fehlgeschlagen oder verzögert.

    #716 (Issue auf GitHub)
  • HinzugefügtFunktioniertDeterministische, begrenzte Synchronisation und JSON-/CSV-Export über CLI und MCP#716

    Deterministische, begrenzte Synchronisation, Offlinestatus und JSON-/CSV-Export über die gemeinsame CLI und den lokalen MCP-Server, einschließlich Additivität der Metriken und vorsichtiger Zeitzonenangaben. Im Repository werden keine Zugangsdaten oder Providerdaten gespeichert.

    #716 (Issue auf GitHub)
  • GeändertFunktioniertSF-Modus A prüft die Export-Fähigkeiten der CLI und verlangt einen vollständigen,#715

    frischen Export

    SF-Modus A prüft, ob die installierte CLI die angeforderten Export-Fähigkeiten hat, und verlangt vor der Analyse einen vollständigen, frischen Exportsatz. Die Herkunft des Vollprofils hält das geprüfte Export-Manifest und die Rückmeldung der Crawl-Rate fest. Eine explizit gesetzte Rate-Begrenzung schlägt vor dem Crawl fehl, wenn ihre Basiskonfiguration fehlt oder ungültig ist.

    #715 (Issue auf GitHub)
  • GeändertFunktioniertmetrika-report (seo_metrika_report) und MetrikaClient.report(): große Abfragen#714

    werden in Kalendermonate aufgeteilt

    metrika-report (seo_metrika_report) und MetrikaClient.report(): Lehnt die Reporting API eine Abfrage mit „Query is too complicated“ ab, wird sie jetzt in Kalendermonats-Scheiben mit 5 bis 15 s Backoff wiederholt. Eine Scheibe, die weiterhin abgelehnt wird, geht mit gesampelter accuracy=0.1 erneut raus. Zusammengeführt werden nur Metriken, die über disjunkte Zeiträume nachweislich additiv sind (ym:s:visits, ym:s:pageviews). Eine Abfrage für Unique-Besucher, Prozentwerte, Durchschnitte oder nicht prüfbare Metriken wird vor der ersten Scheibe abgelehnt, statt eine falsche Summe zurückzugeben. Scheiben werden beim Eintreffen unter einer globalen Zeilenobergrenze zusammengeführt, die auch den Download begrenzt. Ist sie erschöpft, werden restliche Partitionen nicht mehr angefragt; ihre Datumsspannen stehen in split.unfetched. Eine abgebrochene Scheibe nennt ihre eigene Spanne mit partial. Gesamtwerte total_rows/totals bleiben unbekannt, wenn nicht abgefragte Zeiträume sie unmöglich machen, und das Ergebnisfenster wird als teilweise markiert. Zusammengeführte Antworten wenden die Sortierung des Aufrufers (sort) erneut an (Dimensionen und Metriken oder der API-Standard: erste Metrik absteigend). offset und limit werden aus dem globalen, zusammengeführten Satz gebildet. Stichprobenfelder spiegeln, was die API tatsächlich meldet (sampled, schlechtester sample_share). Meldet eine Scheibe sie nicht, bleibt der Gesamtwert unbekannt: null in CLI- und MCP-Antwort, nie ein erfundenes false. contains_sensitive_data ist die ODER-Verknüpfung über alle Scheiben; min/max werden auf den zusammengeführten Zeilen neu berechnet. Fehlende oder fehlerhafte Metrikzellen und Summen markieren den Body als incomplete statt als Null. Der Block split hält angeforderte und aufgelöste Zeiträume, die verwendete Zeitzone sowie pro Scheibe Genauigkeit, Versuche, verworfene Zeilen und Stichprobenmetadaten fest. Scheitert eine Partition, nennt die Meldung die abgeschlossenen Spannen und die erschöpften Genauigkeiten. Relative Datumsangaben (today, NdaysAgo) werden in der angegebenen timezone oder der Zeitzone des Zählers aufgelöst (time_zone_name, sonst der Minutenversatz), nie im Datum des Hosts. Ein Zeitraum, der sich nicht in Daten abbilden lässt (etwa month), wird weiterhin wiederholt und gesampelt, bevor der Fehler ausgegeben wird. Eine explizite accuracy wird in allen dokumentierten Formen beachtet (low, medium, high, full oder ein numerischer Anteil wie "1"). Liegt sie über der letzten Stichprobe, greift der Rückfall auf accuracy=0.1. Eine bereits niedrigere Einstellung des Aufrufers (low oder ein Anteil gleich oder unter diesem Wert) bleibt erhalten und wird nicht nach oben gesampelt. Jede gestellte Anfrage, auch der abgelehnte Gesamtaufruf, landet im Ausgabenjournal.

    #714 (Issue auf GitHub)
  • GeändertFunktioniertYandex Webmaster: Operation indexing liest den echten v4-Endpunkt#713

    Yandex Webmaster: Die Operation indexing liest jetzt den tatsächlichen v4-Endpunkt /indexing/samples statt des nicht vorhandenen /search-urls. Neu ist broken_links_samples, das /links/internal/broken/samples liest. Das Paging hält sich an die dokumentierte Seitengrößen-Obergrenze jedes Endpunkts (500 für Abfragen, 100 für Stichprobenlisten), statt überall limit=500 zu senden (#713).

    #713 (Issue auf GitHub)
  • GeändertFunktioniertYandex Webmaster: paginierte Erfassung prüft count und Listenform jeder Seite#713

    Die paginierte Erfassung in Yandex Webmaster prüft das dokumentierte count und die Listenform jeder Seite, auch wenn count unter der Zahl der zurückgegebenen Zeilen liegt. Pro Seite wird höchstens das verbleibende Zeilenbudget angefragt, damit ein Schnitt durch max_rows nie zu einem falschen complete überliest. Eine einzelne, nicht paginierte Seite wird als begrenzter Ausschnitt mit returned/truncated ausgewiesen. Verbleiben ungelesene Zeilen, wird partial gemeldet. Fehlerhafte Seiten schlagen fehl, statt ein vollständiges, leeres Ergebnis zu behaupten (#713).

    #713 (Issue auf GitHub)
  • GeändertFunktioniertRender-Check nutzt Plattform-Vertrauen und eine explizit gewählte CA#709

    Der Render-Check nutzt das Vertrauen der Plattform und eine explizit gewählte CA, wiederholt gepinnte POST-Subrequests und meldet Fehler bei der Zertifikatsprüfung ohne Transportdetails.

    #709 (Issue auf GitHub)
  • GeändertFunktioniertTLS-Prüffehler des gepinnten Proxy-Transports wird erkannt und getestet#709

    Der TLS-Prüffehler des gepinnten Proxy-Transports wird erkannt. Vertrauen in eine explizite Fixture-CA, POST-Wiederholung, Antwortgrenzen und Ablehnung privater Ziele werden über einen eigenen synthetischen CONNECT-Interceptor getestet, ohne das Plattform-Vertrauen zu verändern.

    #709 (Issue auf GitHub)

3. Oktober 2026

5 hinzugefügt8 geändert1 behoben
  • HinzugefügtFunktioniertNeu: crawl-import für zugeordnete Crawl-CSV-Bundles von Drittanbietern#819

    Neu: crawl-import für ausdrücklich zugeordnete Crawl-CSV-Bundles von Drittanbietern. Die fremde Quellenidentität, die Abdeckung je Feld, doppelte Beobachtungen und nicht verfügbare Daten werden in third_party_crawl.v1 erhalten. Das Ergebnis gilt nicht als nativer Scan und nicht als SF-Audit.

    #819 (Issue auf GitHub)
  • HinzugefügtFunktioniertOptionaler Remote-Playwright-Browser mit expliziten Endpunkt- und Versionsprüfungen#808

    Neuer, optionaler Remote-Playwright-Browser-Transport mit expliziten Prüfungen von Endpunkt und Version sowie sicheren Fehlerzuständen. Ein Fallback auf einen lokalen Start gibt es nicht; das lokale Rendering bleibt Standard.

    #808 (Issue auf GitHub)
  • HinzugefügtFunktioniertKürzester beobachteter Pfad und umgekehrte Inlinks als begrenzte Python-Abfragen#805

    Neue, begrenzte und deterministische schreibgeschützte Python-Abfragen für den kürzesten beobachteten Pfad und umgekehrte Inlinks über gespeicherte Scan-Links. Jeder Hop ist einem Scan-Datensatz zugeordnet, und ein unvollständiger Graph wird ausdrücklich als solcher ausgewiesen.

    #805 (Issue auf GitHub)
  • GeändertFunktioniertRegressionstest für das Provider-Workflow-Routing an den korrigierten#779

    Arsenkin-Wordstat-Vertrag angepasst

    Der Regressionstest für das Provider-Workflow-Routing ist an den korrigierten vertraglichen Aufbau der Arsenkin-Wordstat-Häufigkeitsabfrage angepasst (#720, #779).

    #779 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeu: docs/PROVIDERS.md mit der Matrix aus Provider-Fähigkeiten und#779

    Spezialisten-Workflows

    Neu: docs/PROVIDERS.md, eine generierte Matrix aus Provider-Fähigkeiten und Spezialisten-Workflows (#779, Epic #753). Sie entsteht aus der aktuellen Provider-Registry und einem kuratierten Workflow-Katalog in seohead/core/provider_matrix.py über scripts/generate_provider_matrix.py. Je Workflow nennt sie die ausgelieferten Befehle, Authentifizierung, Kosten bzw. Kontingent, Datenschutzklasse, Einschränkungen und den CSV-Fallback über provider-join. Die Status unterscheiden unterstützt, teilweise, nicht unterstützt und ungeprüft. Kein angekündigter Provider gilt als live verifiziert. Explizit nicht unterstützte Arbeiten sind namentlich aufgeführt. Eine gestufte erste Version ist ausgewählt, ohne jeden Dienst als abgedeckt zu behaupten. Abweichungen zwischen dem committeten Dokument und den Registries erkennen tests/test_docs_drift.py und tests/test_provider_matrix.py.

    #779 (Issue auf GitHub)
  • BehobenFunktioniertkeywords-exact (seo_keywords_exact) liefert wieder Ergebnisse#720

    keywords-exact (seo_keywords_exact) konnte nie ein Ergebnis liefern: Die Aufgabe war für ein Arsenkin-Tool namens keywords_frequency angelegt, das es nicht gibt. Jeder Aufruf endete daher mit 404 WRONG_TOOL. Exakt !W geht jetzt an das Tool wordstat mit type=1, dem Phrasen-Array unter queries und der Region als Einzelelement-Liste.

    #720 (Issue auf GitHub)
  • GeändertFunktioniertFür !W wird der Selektor overal angefragt: die ws-Werte sind verschiedene Operatoren#720

    Für !W wird der Selektor overal angefragt. Die ws-Werte von Arsenkin sind unterschiedliche Operatoren: base ist breit (WS), quoted ist die Wortgruppe in Anführungszeichen („WS“), overal ist die exakte Wortform (!WS), die !W verlangt, und exact ist die strikt geordnete Form ([!WS]).

    #720 (Issue auf GitHub)
  • GeändertFunktioniertVor dem Senden werden Zeichen entfernt, die der Provider ablehnt (/, Anführungszeichen)#720

    Vor dem Senden werden Zeichen entfernt, die der Provider ablehnt. Eine einzige Phrase mit / oder Anführungszeichen ließ den gesamten Stapel mit 422 JSON_VALIDATION_ERROR scheitern. Umgeschriebene Phrasen werden in cleaned zurückgemeldet, damit der Aufrufer sieht, welche in einer anderen Form gemessen wurden.

    #720 (Issue auf GitHub)
  • GeändertFunktioniertfrequencies liefert {phrase: {"base": N, "overal": N}} neben der Rohantwort#720

    frequencies wird als {phrase: {"base": N, "overal": N}} neben der rohen Provider-Antwort ausgegeben. Liefert eine Phrase nur Ergebnisse anderer Regionen, wird sie ausgelassen und in warnings aufgeführt, statt fremde Zahlen zu übernehmen.

    #720 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeu: begrenzter, schreibgeschützter Topvisor-Zugriff über CLI und MCP#719

    Neu: begrenzter, schreibgeschützter Zugriff auf Topvisor über die gemeinsame CLI und den MCP-Handler. Zugangsdaten liegen in zentralen Dateien, die Paginierung ist explizit, kostenpflichtige Prüfungen sind nicht enthalten.

    #719 (Issue auf GitHub)
  • GeändertFunktioniertsources-doctor: Legacy-Block sources.gsc folgt provider_status.gsc#717

    Der Legacy-Block sources.gsc in sources-doctor folgt provider_status.gsc. ready und das neue Feld components stammen aus denselben Zugangsbestandteilen (OAuth-Bearer, dauerhafte Freigabe oder Dienstkonto). Bisher zählte nur die Bearer-Datei, daher galt ein konfiguriertes Dienstkonto als „GSC nicht eingerichtet“. Der Dienstkonto-Bestandteil prüft jetzt das JSON-Dokument selbst: private reguläre Datei, begrenzte Größe, Typ service_account, exakte Google-Token-URI und Pflichtfelder. Beide Doctor-Blöcke melden einen sicheren Status service_account_status (missing, unsafe_file, too_large, unreadable, malformed_json, unsupported_shape oder configured_unverified). So bleiben eine zu große, unlesbare oder fehlerhafte Datei von einer konfigurierten, aber ungeprüften unterscheidbar, ohne den Inhalt offenzulegen.

    #717 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-site-Artefakte setzen finished_at und finished, sobald alle Frontier-Zeilen#712

    einen Endzustand haben

    Scan-Artefakte von crawl-site setzen finished_at und den Lebenszyklus finished, sobald jede angenommene Frontier-Zeile einen Endzustand erreicht hat. Das gilt auch für Läufe mit teilweise erhaltenen Nachweisen: crawl_partial benennt bereits fehlende Beobachtungen. Eine leere Warteschlange wirkt daher nicht mehr wie eine unterbrochene Erfassung in scan-status, scan-list oder der Historie (#712). Ein ausdrücklich gestoppter Lauf (abgebrochen, bevor er Arbeit angenommen hat, abgebrochen oder durch den Fehlerschalter angehalten) behält interrupted und den gespeicherten Grund, auch nachdem die Warteschlange leer ist, einschließlich über resume_or_finalize. Stopp-Pfade erhalten so nie einen falschen Endzeitstempel.

    #712 (Issue auf GitHub)
  • GeändertFunktioniertduplicate-check --scan und boilerplate-report --scan streamen große Korpora#710

    duplicate-check --scan und boilerplate-report --scan streamen einen gespeicherten Korpus jetzt auch bei normal großen Sites, statt abzubrechen. Die Deadline für Öffnen und Validieren des Scans richtet sich nach der Artefaktgröße, und jede Dokumentlesung erhält eine eigene Deadline. Ein Korpus mit 1.500 Seiten endet daher nicht mehr mit interrupted. Das Eingabebyte-Budget zählt, was der Analyzer tatsächlich behält: extrahiertes Markdown für Duplikate, einen Digest pro Seite für Boilerplate, nicht die rohe HTML-Größe. Erreicht der Korpus eine Grenze, wird eine Teilabdeckung mit den genauen Zahlen (vorbereitet und geeignet) und der Grenze gemeldet, die das Lesen gestoppt hat (#710).

    #710 (Issue auf GitHub)
  • GeändertFunktioniertMetrika: report() und by_time() lehnen offset < 1 lokal mit ValueError ab#707

    report() und by_time() in Metrika lehnen offset < 1 lokal mit einem ValueError ab, statt es an die Reporting API weiterzuleiten. Die API beantwortet offset=0 mit HTTP 400. Neue Offline-Tests fixieren den 1-basierten Vertrag für metrika-report, seo_metrika_report und provider-collect aggregate_report. Außerdem prüfen sie, dass die Stoppbedingungen der Paginierung (total_rows, ROW_CAP) die bei einem abweichenden offset übersprungenen Zeilen mitzählen (#707).

    #707 (Issue auf GitHub)

2. Oktober 2026

1 hinzugefügt2 geändert
  • GeändertFunktioniertmetrika-traffic-pdf unter macOS: Chrome startet ohne Warten und wird nach der Prüfung#731

    beendet

    metrika-traffic-pdf unter macOS: Chrome schreibt das PDF und läuft weiter. Der Browser wird jetzt ohne Warten gestartet und beendet, sobald das PDF geprüft ist.

    #731 (Issue auf GitHub)
  • GeändertFunktioniertYandex Webmaster: user_id aus dem Token, neue schreibgeschützte Operationen#713

    Yandex Webmaster: user_id wird aus dem Token ermittelt. Neue schreibgeschützte Operationen sind summary, diagnostics, sqi_history, search_history, query_history, in_search_history, events_history, indexing_history, important_urls, broken_links_history und external_links_history. params steuert Datum und Indikatoren. Abfrage- und Crawl-Stichprobenlisten sind paginiert (#713).

    #713 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeuer Fachskill traffic-report: Kundenbericht zum Traffic

    Neuer Fachskill traffic-report: ein Kundenbericht zum Traffic als Monats- oder Jahresbericht aus Metrika, Webmaster und Search Console. Enthalten sind Conversions als Besuche, Plausibilitätsprüfungen der Ziele, Produkte, Käuferprofil und Regeln für Folien.

1. Oktober 2026

1 hinzugefügt1 geändert
  • HinzugefügtFunktioniertNeu: metrika-traffic-pdf (seo_metrika_traffic_pdf) für einen statischen#731

    Traffic-Bericht im A4-Querformat

    Neu: metrika-traffic-pdf (seo_metrika_traffic_pdf) erzeugt einen statischen Traffic-Bericht im A4-Querformat im Layout eines Analytics-Dashboards, auf Basis von Yandex Metrika. Erfassung und Rendering sind getrennte Stufen. Die Erfassung liest die Reporting API (etwa 40 kostenlose, schreibgeschützte Anfragen) in ein Dokument seohead.metrika-traffic/1. Enthalten sind neun KPI-Karten (Nutzer, Besuche, Seitenaufrufe, Seiten pro Besuch, Besuche pro Tag, Absprungrate, durchschnittliche Besuchsdauer, Anteil der Besucher mit zwei oder drei Besuchen, Anteil neuer Besucher) mit Veränderungen gegenüber dem vorherigen Zeitraum gleicher Länge und denselben Daten ein Jahr zuvor. Außerdem: tägliche Dynamik, Fenster von 3, 6 und 12 Monaten gegenüber den jeweils davor liegenden Fenstern, Suchmaschinen, Städte, Länder, Geräte, Alter, Geschlecht, die wichtigsten Landingpages und Suchphrasen sowie alle Traffic-Kanäle. Das Rendering formatiert dieses Dokument in eigenständiges HTML mit SVG-Diagrammen und druckt es über eine lokal installierte Chrome-, Edge- oder Chromium-Version als PDF. SEOHEAD_CHROME überschreibt die Suche. Branding (Name, Farben, Schriftstapel, Logotext) sowie deutsche oder englische Beschriftungen sind Eingaben. Search-Console-Abfragezeilen lassen sich als optionale Seite ergänzen. Die Zuordnung verwendet standardmäßig die letzte signifikante Quelle (ym:s:lastSignTrafficSource samt Suchmaschine und Phrase), wie es die Oberfläche von Metrika anzeigt. Die Last-Click-Dimensionen weichen davon um einige Prozent ab und bleiben als ausdrückliches attribution=last_click verfügbar. Jede Anfrage sendet offset=1, da die API ab 1 zählt. Fehlende Daten bleiben sichtbar: Jeder Block trägt ok, unavailable oder skipped mit Grund. Eine Veränderung ohne Vergleichswert ist null, nicht Null. Fehlt der Browser, bleibt das HTML erhalten und das PDF wird als übersprungen gemeldet. Bestehende Dateien in out_dir werden nur mit overwrite=true ersetzt.

    #731 (Issue auf GitHub)
  • GeändertFunktioniertMetrika-Reports beginnen bei offset=1: Die Reporting API zählt ab 1.#707

    Jede Anfrage mit offset=0 beantwortete sie mit HTTP 400 (#707, #728, #729).

    #707 (Issue auf GitHub)

26. September 2026

1 hinzugefügt
  • HinzugefügtFunktioniertNative Crawls erkennen HEADING_SKIP bei Sprüngen in der Überschriftenebene#725

    Neuer Nachweis HEADING_SKIP im nativen Crawl für Sprünge zwischen H1 und H6 im benannten Inhaltsbereich. Kopf- und Fußzeilen, Navigation, Seitenleisten sowie ausdrücklich verborgene oder geschlossene Dialog-Überschriften sind ausgenommen, damit Template-Oberflächen keine falsche Hierarchie erzeugen. Läufe nur mit Screaming-Frog-Export melden die Prüfung als nicht verfügbar.

    #725 (Issue auf GitHub)

23. September 2026

1 geändert
  • GeändertFunktioniertPrivate Geheimdateien unter Windows und Zustimmungsskript für die Search Console#708

    Private Geheimdateien werden unter Windows akzeptiert, wo es keine POSIX-Berechtigungsbits gibt. Außerdem gibt es ein Browser-Zustimmungsskript, das eine schreibgeschützte Search-Console-Freigabe speichert.

    #708 (Issue auf GitHub)

13. September 2026

2 hinzugefügt3 geändert2 behoben
  • HinzugefügtFunktioniertNative SQLite-Schreiber, Historie und Snapshots laufen unter Windows#705

    Native SQLite-Schreiber, Historie, Wiederholung, Snapshots, Neuauswertung und Veröffentlichung von Projekten funktionieren unter Windows mit betriebssystemgestützten Byte-Bereichssperren und portablen Prüfungen des freien Speicherplatzes. Das Leeren von POSIX-Verzeichnissen bleibt erhalten. Das Leeren von Dateien unter Windows und die atomare Veröffentlichung bleiben verfügbar, ohne eine POSIX-Garantie für fsync auf Verzeichnisse. Portable Workflows laufen in der Windows-CI und in einer isolierten Linux-Laufzeit.

    #705 (Issue auf GitHub)
  • BehobenFunktioniertRohtext-HTML-Scan bleibt mit älteren Python-Versionen kompatibel#705

    Der Rohtext-HTML-Scan bleibt mit Python-Versionen kompatibel, denen die neuere Scripting-Option von HTMLParser fehlt, einschließlich der Windows-Distribution von Python 3.12.

    #705 (Issue auf GitHub)
  • BehobenFunktioniertRichtlinien zu strukturierten Daten und Googlebot korrigiert und belegt#704

    Die Richtlinien von Google zu strukturierten Daten und Googlebot sind korrigiert und belegt, einschließlich der Verfügbarkeit von FAQ und HowTo sowie der Folgen der Richtlinie für strukturierte Daten.

    #704 (Issue auf GitHub)
  • GeändertFunktioniertSitemaps werden über robots.txt gefunden, mit Fallback auf /sitemap.xml#703

    Sitemaps werden ausgehend von der Site-Wurzel über robots.txt gefunden, mit Fallback auf /sitemap.xml. Schlägt die Expansion aller Sitemaps fehl, meldet das ok: false.

    #703 (Issue auf GitHub)
  • GeändertFunktioniertNativer Crawl lässt sich nach anonymen Server-Cookies fortsetzen#702

    Ein nativer Crawl lässt sich nach vom Server gesetzten anonymen Cookies fortsetzen. Die neue Sitzung wird vermerkt, ohne Cookie-Werte zu speichern. Crawls mit Zugangsdaten oder persistentem Profil bleiben nicht fortsetzbar.

    #702 (Issue auf GitHub)
  • GeändertFunktioniertEinheitlich: gespeicherte Scans als --scan, Inline-JSON als --input#701

    Gespeicherte Scan-Pfade heißen einheitlich --scan, Inline-JSON --input. Die alten Varianten --input für Scan-Pfade und --json-input funktionieren noch eine Version lang mit einer Warnung.

    #701 (Issue auf GitHub)
  • HinzugefügtFunktioniertAusdrückliche, standardmäßig ausgeschaltete Zustimmung zur Speicherung anonymer Nachweise#700

    Neue, standardmäßig ausgeschaltete ausdrückliche Zustimmung für die begrenzte Speicherung anonymer Nachweise mit Cache-Control: no-store. Bodies mit Zugangsdaten werden weiterhin nicht gespeichert.

    #700 (Issue auf GitHub)

9. September 2026

10 hinzugefügt9 geändert2 behoben
  • HinzugefügtFunktioniertProjektprioritäten: Vorschau offline und versionierte Anwendung der Richtlinie#694

    Vorschau der Projektprioritäten offline und ausdrückliche, versionierte Anwendung der Richtlinie anhand gespeicherter Stack-Fakten. Entscheidungen des Operators bleiben erhalten, der Richtlinienverlauf wird atomar gespeichert, und die Erklärungen der Prioritäten erscheinen identisch in den menschenlesbaren Berichten.

    #694 (Issue auf GitHub)
  • BehobenFunktioniertRichtlinien zu JavaScript-Rendering, Canonical, URL-Hygiene und notranslate korrigiert,#692

    ohne Laufzeitprüfungen oder Schweregrade zu ändern.

    #692 (Issue auf GitHub)
  • BehobenFunktioniertSitemap- und robots.txt-URLs von Dokumentations-Fixtures bleiben auf dem flüchtigen#690

    Loopback-Origin

    #690 (Issue auf GitHub)
  • HinzugefügtFunktioniertPortable Projekt-Checkliste mit Quellen-Katalog, eigenen Vorlagen und Historie#686

    Portable Abdeckung von Projekt-Checklisten mit einem mitgelieferten, aus den Quellen abgeleiteten Katalog, wiederverwendbaren eigenen Vorlagen, Definitions- und Nachweishistorie, optimistisch gesperrten gleichzeitigen Schreibvorgängen, expliziter manueller Prüfung und Lieferergebnissen sowie Offline-Ansichten für ausstehend, veraltet und blockiert. CLI, MCP und menschenlesbare Projektberichte nutzen dieselbe Basis.

    #686 (Issue auf GitHub)
  • HinzugefügtFunktioniertSchreibgeschützte Statusübersicht für native Scans#685

    Neu: schreibgeschützte Statusübersicht für native Scans mit den Populationen der Frontier und den übernommenen HTTP-Ergebnissen.

    #685 (Issue auf GitHub)
  • HinzugefügtFunktioniertPortable lokale Projekt-Arbeitsbereiche mit Zuständen für Checkliste und Vorbereitung#678

    Neu: portable lokale Projekt-Arbeitsbereiche mit ausdrücklichen Zuständen für ausstehende Checklisten und Vorbereitung.

    #678 (Issue auf GitHub)
  • HinzugefügtFunktioniertPrüfung der Google-Search-Central-Richtlinien im Repository dokumentiert#677

    Die Prüfung der Google-Search-Central-Richtlinien ist im Repository dokumentiert: 175 gelesene Leitfäden, ihre Kennzeichnung, Ausschlüsse, das Stichdatum des Snapshots und die drei daraus entstandenen Korrekturen.

    #677 (Issue auf GitHub)
  • GeändertFunktioniertcrawl-site im URL-Modus schreibt standardmäßig einen kollisionssicheren SQLite-Scan#676

    crawl-site im URL-Modus schreibt standardmäßig einen kollisionssicheren nativen SQLite-Scan im Verzeichnis scans/ des Aufrufers. --out-dir bleibt der ausdrückliche Pfad für das alte Verzeichnis. Listeneingabe sowie Cache-Konfigurationen mit Live- oder Replay-Modus benennen diesen Pfad, statt den Erfassungsmodus stillschweigend zu ändern.

    #676 (Issue auf GitHub)
  • GeändertFunktioniertDistributions-Builds übernehmen geprüfte Herkunftsangaben für native SQLite-Scans#675

    Saubere Distributions-Builds betten geprüfte Herkunftsangaben des Erstellers für native SQLite-Scans ein, wenn kein Quellcode-Checkout verfügbar ist.

    #675 (Issue auf GitHub)
  • GeändertFunktioniertPauschale Aussagen zu 301 und 302 im Audit-Skill durch Absicht und Canonical-Ziel ersetzt#671

    Die nicht belegten festen Aussagen zu 301 (Signalverlust) und 302 (kein Linkwert) im mitgelieferten Audit-Skill sind durch Hinweise zu dauerhafter bzw. temporärer Absicht und zum Canonical-Ziel ersetzt, mit Quellenangabe bei Google Search Central. Temporäre Weiterleitungen bleiben für vorübergehende Änderungen gültig. Ein Statuscode allein misst keinen Ranking-Verlust.

    #671 (Issue auf GitHub)
  • GeändertFunktioniertrender-check --viewport mobile: feste Smartphone-Identität#670

    render-check --viewport mobile verwendet für seine Roh- und Browseranfragen jetzt eine feste Smartphone-Diagnoseidentität. Ein explizites --user-agent ist über CLI und MCP verfügbar. Jeder abgeschlossene oder teilweise Vergleich protokolliert die verwendete Identität und die Viewport-Größe.

    #670 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeue --scan-Eingaben für Duplikat- und Boilerplate-Analyse#669

    Schreibgeschützte --scan-Eingaben für die Analyse von Duplikaten und Boilerplate im Korpus, mit Abdeckung der gespeicherten Seitentexte und Herkunftsnachweis.

    #669 (Issue auf GitHub)
  • HinzugefügtFunktioniertBefehlskatalog generiert, Store-Entscheidungen dokumentiert#668

    Ein generierter Katalog der Befehlseingaben ist ergänzt. Dokumentiert sind außerdem die Entscheidung zum Scan-Store, zum HTTP-Cache und zum Run-Journal.

    #668 (Issue auf GitHub)
  • GeändertFunktioniertKundenberichte mit lesbaren Befundtiteln#660

    Kundenorientierte Berichte in Markdown, CSV, XLSX, DOCX und Aufgabenberichte verwenden jetzt lesbare Befundtitel und gespeicherte Reproduktionsnachweise statt Registerkennungen oder Collector-Namen. Historische Datensätze ohne ausreichende Nachweise benennen diese Einschränkung ausdrücklich. Die JSON-Auditartefakte bleiben unverändert.

    #660 (Issue auf GitHub)
  • HinzugefügtFunktioniertNeuer Befehl project-facts für Stack-Fakten#648

    Mit project-facts lassen sich Stack-Fakten nach der Projekterstellung erfassen, optional aus einem expliziten, robots.txt-konformen tech-detect-Durchlauf. Vom Betreiber eingetragene Entscheidungen haben Vorrang vor erkannten Belegen. Ist eine Erkennung nicht verfügbar oder mehrdeutig, bleibt der Eintrag leer, und der Grund wird vermerkt.

    #648 (Issue auf GitHub)
  • GeändertFunktioniertREADME mit Projektcontroller, Screaming Frog als Gegenprüfung#648

    Das README beginnt jetzt mit dem Projektcontroller. Screaming Frog ist als Gegenprüfung im zweiten Durchgang beschrieben und nicht als Maßstab für Gleichwertigkeit.

    #648 (Issue auf GitHub)
  • HinzugefügtFunktioniertexamples/project-skeleton mit leerer Checkliste, project…#648

    examples/project-skeleton wird mit einer initialisierten, noch ergebnislosen Checkliste ausgeliefert. Dadurch meldet project status auf diesem Beispiel Abdeckungszahlen statt not_initialized. Die Datei wird gegen den aktuellen Katalog geprüft.

    #648 (Issue auf GitHub)
  • HinzugefügtFunktioniertVerträge für Projektvorbereitung, Nachweise und Korpora#354

    Neue Verträge für Projektvorbereitung, Anbieter-Nachweise, gespeicherte Korpora, begrenzte Extraktion, Scan-Nachweise sowie Workflow- und Katalogverträge. Sie legen die aufbewahrten Nachweise und die Grenzen des Fortschritts ausdrücklich fest.

    #354 (Issue auf GitHub)
  • GeändertFunktioniertMCP-Profile erfordern das optionale MCP-SDK ab Version 1.29#354

    MCP-Profile und metadatenerhaltende Fortschritts-Wrapper setzen das optionale MCP-SDK in Version 1.29 oder neuer voraus.

    #354 (Issue auf GitHub)
  • GeändertFunktioniertREADME gekürzt: Workflows von Aufgabe bis Artefakt

    Das README ist auf Workflows von Aufgabe über Befehl bis Artefakt konzentriert. Veraltete visuelle Einbettungen und Marketingzähler sind entfernt. Links zu den generierten Referenzen für die Live-Oberfläche bleiben erhalten.

  • GeändertFunktioniertREADME: Workflows von Eingabe bis Ergebnis

    Das README enthält jetzt praktische Workflows von der Eingabe bis zum Ergebnis, mit passenden CLI- und MCP-Aufrufen. Außerdem stimmen die Angaben zum aufbewahrten Korpus sowie zu den Grenzen von Browser und Anbietern.

8. September 2026

8 geändert2 behoben
  • GeändertFunktioniertSQLite-Doku an den tatsächlichen Stand angepasst#666

    Die Dokumentation des SQLite-Artefakts ist mit den ausgelieferten Verträgen für Body, Verlauf und Offline-Reanalyse abgeglichen (#666). Die dokumentierte Tabelle der späten Seitenfelder wird jetzt gegen die Importzuordnung geprüft. Eine ältere JSONL-Beobachtung bleibt damit SQL NULL, statt zu einem erfundenen sauberen Wert zu werden.

    #666 (Issue auf GitHub)
  • GeändertFunktioniertNative Audits führen fehlende Quellfelder als übersprungen#659

    Native Audits führen die Prüfungen für Meta-Keywords, sekundäres Canonical, HTTP-Version und amphtml als übersprungen, wenn ihre Quellfelder nicht erfasst wurden. Der Name der jeweiligen Prüfung steht dann im Bericht.

    #659 (Issue auf GitHub)
  • BehobenFunktioniertCookies der Website gelten nicht als Zugangsdaten des Betreibers#656

    Ein Cookie, das die Website gesetzt hat, wird im JavaScript-Rendering nicht mehr als Zugangsdaten des Betreibers gelesen. Außerdem wird jetzt ausdrücklich gemeldet, wenn ein Durchlauf gerenderte DOMs verwirft (#656). Ein Browser schickt zurück, was die Website über ihr eigenes Set-Cookie gesetzt hat. Sobald eine Seite ein Sitzungscookie setzte und danach eine Same-Origin-Ressource anfragte, etwa ein Script, ein Stylesheet oder ein Bild, las der Request-Hook des Renderers den Cookie:-Header vom Draht und speicherte das serialisierte DOM dieser Seite als omitted/credentialed. Das geschah bei einem Lauf mit http.credential_headers = []. Jeder Render baut einen eigenen Browserkontext, daher ist der Verlust seitenbezogen und nicht kumulativ. Jede Seite, die ein Cookie setzt, verliert ihr eigenes DOM, während der Lauf Seiten, Links und Eskalationszahlen so meldet, als wäre alles vollständig. credentials_used für ein gerendertes Dokument stammt jetzt nur noch aus der Konfiguration des Laufs, also aus http.credential_headers oder einem persistenten Browserprofil. Das leitet crawl/sqlite_render.py::_policy_facts ab. Der Renderer baut seinen Netzwerk-Client ohne eigene Zugangsdaten, daher fügt der Draht nichts hinzu. Ein Crawl mit konfigurierten Zugangsdaten lässt diese DOMs weiterhin unter credentialed weg, unverändert. Der Cookie-Wert wird nie gespeichert.

    #656 (Issue auf GitHub)
  • GeändertFunktioniertZählwerte hinter dem Flag partial werden ausgewiesen#656

    rendered_bodies im Ergebnis von crawl-site nennt, wie viele gerenderte DOMs behalten wurden, und den Grund für jeden verworfenen. Die CLI gibt das neben der Abschlusszeile aus. Bisher blieb das einem Fähigkeitsflag überlassen, das bei einem fehlenden DOM und bei allen anderen gleich partial sagte. Ein Lauf, der nichts verworfen hat, gibt nichts zusätzlich aus. Die Zählwerte werden aus dem Scan-Artefakt gelesen, sodass ein abgeschlossener Scan die Frage auch später beantwortet.

    #656 (Issue auf GitHub)
  • GeändertFunktioniertog:url im nativen Crawl erfassen (#654)#654

    rules.check_og führt og:url unter missing_tags, sobald das Feld leer ist. Der native Pfad las das Tag aber nie: kein og_url in PageRecord, keine Spalte og_url in scan_v1.sql und kein OG:URL in der Internal:All-Projektion aus crawl/evidence.py. Die Spalte existierte nur auf der Screaming-Frog-Seite, wo normalize OG:URL immer aufgelöst hat. Ein Export derselben Website sah daher den echten Wert, während ein nativer Crawl einen Mangel meldete. Das Tag wird jetzt dort gelesen, wo auch die anderen drei gelesen werden. Der Parser lieferte es bereits als og:url. Es wird in der nullable Spalte pages.og_url gespeichert, nullable wie alle später ergänzten Spalten, damit ein vor der Erfassung geschriebener Datensatz von einer Seite ohne Angabe unterscheidbar bleibt. Projiziert wird es als OG:URL. Das ist die Erfassungsseite des Schnitts, dessen Leseseite #646 behoben hat. tests/test_open_graph_seam.py erhält eine dritte Fixture-Site mit Open Graph, aber ohne og:title, damit die Prüfung tatsächlich greift. Eine Seite deklariert og:url und darf nicht als fehlend gelten, die andere deklariert keines und muss als fehlend gelten. Der entscheidende Test prüft beide Seiten zweimal, einmal aus dem Crawl und einmal aus einem Internal:All-Export derselben beiden Seiten, und verlangt dasselbe Urteil. #646 und #654 waren beide zwei Pfade, die sich widersprachen, ohne Test, der beide umspannt.

    #654 (Issue auf GitHub)
  • BehobenFunktioniertCookies der Website gelten nicht als Zugangsdaten (#647)#647

    Ein Crawl nutzt einen gemeinsamen HTTP-Client, und dieser hält ein Cookie-Jar. Sobald eine Antwort Set-Cookie enthielt, gingen alle späteren Anfragen mit Cookie: raus, und der Korpus-Writer stufte sie als authentifizierten Abruf ein. Auf einer öffentlichen Website mit http.credential_headers = [] und credentials_acknowledged = false verwarf das 33.001 von 40.920 Seitenkörpern. Der Lauf meldete Seiten und Links trotzdem so, als wäre alles vollständig. Alles, was aus dem gespeicherten HTML berechnet wird, etwa die Erkennung nahezu identischer Seiten, DOM-Tiefe und Knotenzahl, der Boilerplate-Anteil, die Überschriftenstruktur im Text und die Offline-Reanalyse, deckte dann 7.903 Seiten ab. Jeder seitenbezogene Prozentwert im selben Bericht bezog sich aber auf 40.920 Seiten. Zwei Grundgesamtheiten wurden als eine ausgegeben. Ein Abruf gilt als credentialed, wenn der Lauf so konfiguriert war, dass er für diesen Host einen Zugangs-Header sendet. Nur so kann ein sensibler Header eine vom Crawler gebaute Anfrage erreichen, denn http.headers lehnt die Konfigurationsprüfung ab. Ein Crawl mit konfigurierten Zugangsdaten lässt diese Seitenkörper weiterhin unter credentialed weg, unverändert.

    #647 (Issue auf GitHub)
  • GeändertFunktioniertZählwerte, die ein partial-Flag nicht erfassen kann#647

    html_bodies im Ergebnis von crawl-site nennt, wie viele abgerufene HTML-Seitenkörper behalten wurden, und den Grund für jeden verworfenen. Die CLI gibt das neben der Abschlusszeile aus, statt es einem Fähigkeitsflag zu überlassen, das bei einem fehlenden Seitenkörper und bei vier Fünfteln aller Seitenkörper gleich partial sagt. Ein Lauf ohne Verwerfungen gibt nichts zusätzlich aus. Geschwärzte Listen von Request- und Response-Headern führen jetzt die Namen der Header, die die Schwärzung entfernt hat, unter x-seohead-redacted-headers, nie deren Werte. Zwei Antworten, deren Seitenkörper unterschiedlich behandelt wurden, hatten früher identische Headerlisten protokolliert. Der Betreiber konnte im Artefakt deshalb nicht erkennen, warum ein Seitenkörper fehlte.

    #647 (Issue auf GitHub)
  • GeändertFunktioniertEinträge aus CHANGELOG.md in eine Datei pro Änderung#638

    Changelog-Einträge wandern aus CHANGELOG.md in je eine Datei pro Änderung unter changelog.d/. So steht ein Pull Request nicht mehr in Konflikt mit jedem anderen, der vorher gelandet ist (#638). Jeder Branch hat seinen Eintrag oben unter ## Unreleased ergänzt. Diese eine Zeile war damit der Konfliktpunkt der Datei: neun Handauflösungen über acht Pull Requests in zwei Sitzungen, jeweils mit erneutem Push und einem neuen CI-Lauf. Die Auflösung lautete jedes Mal „eigenen Block behalten, dann den fremden“. Ein Konflikt, dessen Lösung nie variiert, trägt keine Information. Der .gitattributes-Fix aus dem Issue, CHANGELOG.md merge=union, wurde vorher gemessen und verworfen. Union-Merge arbeitet zeilenweise. Enthalten beide Einträge eine identische Zeile, etwa eine Leerzeile innerhalb eines Eintrags, behält es eine Kopie und meldet Erfolg. Die Zeile des anderen Eintrags geht dabei verloren, ohne Konflikt und ohne Hinweis. Ein erster Test mit bewusst verschiedenen Zeilen lief sauber durch und verdeckte das. Ein stiller Datenverlust ist schlimmer als der Konflikt. Deshalb wurde die strukturelle Lösung umgesetzt.

    #638 (Issue auf GitHub)
  • GeändertFunktioniertFragmente heißen nach dem Issue, z.#638

    B. changelog.d/638.md

    Ein Fragment heißt nach dem Issue, das es schließt, etwa changelog.d/638.md. Dieser Schlüssel ist per Konstruktion je Branch eindeutig. Schließt ein Pull Request zwei Issues, entstehen zwei Fragmente, eines je Issue. Eine Änderung ohne Issue schreibt no-issue-<slug>.md. Ein Fragment enthält den Eintrag genau so, wie er im Changelog stehen soll: einen oder mehrere Bullet-Punkte der obersten Ebene mit ihren Fortsetzungszeilen, ohne Frontmatter und ohne Rahmen. So bleiben die mehrteiligen Fließtext-Einträge Byte für Byte erhalten und werden nicht auf Einzeiler gekürzt. python scripts/build_changelog.py fügt die Fragmente bei der Veröffentlichung in ## Unreleased ein. Die Reihenfolge richtet sich nach der Issue-Nummer, nicht nach der Reihenfolge des Dateisystems. Mit --prune werden die eingefügten Fragmente entfernt. Das Zusammenführen ersetzt den gesamten Bereich zwischen zwei Markierungskommentaren, statt in ihn einzufügen. Zweimal ausgeführt ergibt es dieselbe Datei, unabhängig davon, ob die Fragmente dazwischen entfernt wurden. CHANGELOG.md wird bei jedem Pull Request absichtlich nicht neu erzeugt. Ein Gate, das sie ständig synchron hält, würde beide Branches wieder in dieselbe Datei zwingen und den Konflikt neu aufbauen, den diese Lösung beseitigt.

    #638 (Issue auf GitHub)
  • GeändertFunktioniertDoc-Gates, die CHANGELOG.md lasen, prüfen jetzt Fragmente#638

    Die Doc-Gates, die CHANGELOG.md lasen, waren das eigentliche Risiko. Ein Gate, das stillschweigend nichts mehr prüft, ist schlimmer als die Konflikte. Beide Stellen wurden gefunden und decken jetzt die Fragmente ab. tests/test_docs_drift.py führte CHANGELOG.md in PUBLIC_MARKDOWN. Deshalb lesen das Englisch-Gate, das Gate für „nur existierende Befehle“ und das Gate für veraltete Zählwerte jetzt auch changelog.d/*.md. Die beiden Zählwert-Gates überspringen Fragmente aus demselben Grund wie das Changelog: Ein Eintrag hält fest, was zum Zeitpunkt des Schreibens galt. tests/test_doc_counts.py schließt das Changelog bewusst vom Live-Zählwert-Scan aus, und seine Dateiliste erreicht changelog.d/ nie. Das ist dieselbe Antwort aus demselben Grund. tests/test_doc_commands.py, tests/test_docs_commands_execute.py und tests/test_examples_gate.py lesen das Changelog gar nicht. Ein neuer Test tests/test_changelog_fragments.py hält jede dieser Antworten fest, dazu Benennung der Fragmente, deterministische Reihenfolge, idempotentes Zusammenführen und die Tatsache, dass zwei gleichzeitige Branches mit je einem neuen Fragment ohne Konflikt zusammengeführt werden.

    #638 (Issue auf GitHub)

Früher (kein Datum erfasst)

23 hinzugefügt30 geändert17 behoben
  • BehobenFunktioniertSet-Cookie ohne Wert: Erkennung läuft weiter (#651)

    Ein Header ganz ohne name=value-Paar, etwa Set-Cookie: Secure; HttpOnly, den emall.by neben zwei korrekten Cookies sendet, wird im Jar zu Cookie(name='Secure', value=None). Dafür wirft httpx.Cookies.__getitem__ einen KeyError. dict(resp.cookies) schlug deshalb bei einem Namen fehl, den der eigene Iterator der Map geliefert hatte. tech-detect endete mit Code 1, einer nackten Meldung error: 'Secure' und ohne JSON auf stdout, obwohl die Seite erfolgreich abgerufen worden war. MCP seo_tech_detect reichte den KeyError an den Aufrufer weiter. site-audit lieferte still zurück, mit fehlendem Technologieabschnitt. detect_tech durchläuft jetzt das Cookie-Jar. Ein Name ohne Wert bleibt erhalten, mit leerem Wert, statt verworfen zu werden. Mehrere Fingerprints (BITRIX_SM_GUEST_ID, craft_session, wfvt_) passen allein über den Cookie-Namen. Würde der Eintrag verworfen, ginge dieses Signal verloren. Der Eintrag wird aber nie stillschweigend in ein gewöhnliches Cookie umgewandelt. Die Namen stehen in malformed_cookies und werden in einem Befund genannt. So bleibt ein vom Server fehlerhaft gesendeter Header ein Fakt über die Website. Eine Antwort mit ausschließlich korrekten Cookies ist unverändert und liefert eine leere Liste.

  • GeändertFunktioniertrender-check misst komprimierte Seiten wieder richtig (#650)

    Die gepinnte Render-Route las den Origin mit dem undekodierten Stream von httpx und übergab diese Bytes zusammen mit dem content-encoding des Origins an Playwright. route.fulfill wendet auf den übergebenen Body aber nie eine Content-Codierung an. Chromium parste deshalb gzip als text/html und baute ein DOM aus dem komprimierten Stream: kein Title, keine h1, kein Canonical, keine Links, und die gerenderte Größe entsprach der Übertragung. Jede Website, die ihr HTML komprimiert, also fast alle, kam als ok: false, reason: incomplete_render zurück. Die Meldung gab dem Rendering die Schuld und empfahl --wait domcontentloaded oder ein längeres --timeout, obwohl der Render fehlerfrei abgeschlossen war. seohead.tech meldete 22.435 gerenderte Bytes gegenüber 121.793 Rohbytes. Jetzt sind es 123.048 mit dem echten Title und 31 Links. Die Route liest nun die dekodierte Entität und entfernt content-encoding aus dem, was sie weiterleitet. content-length war bereits als Hop-by-Hop-Header entfernt, daher nennt Playwright die Länge des tatsächlich empfangenen Bodys. Die Route fragt beim Origin nur die Codierungen an, die dieser Client dekodieren kann, statt Chromiums eigene Einladung zu br und zstd weiterzureichen. Eine Codierung, die trotzdem undekodiert ankommt, bricht die Anfrage ab und nennt sich selbst. Sonst würde der Fehler still reproduziert. Das Byte-Limit zählt jetzt dekodierte Bytes, also den Body, den der Renderer sieht. Eine Dekompressionsbombe hat die Grenze bisher komprimiert passiert.

  • GeändertFunktioniertOpen Graph wird im nativen Crawl korrekt gelesen (#646)

    parse_html speichert jedes Tag unter seinem vollen Property-Namen, etwa {"og:title": ...}, wie es der eigene Docstring beschreibt. crawl/collect.py fragte dasselbe Dict aber nach "title", "description" und "image". dict.get lieferte jedes Mal None. Deshalb waren og_title, og_description und og_image bei jeder Seite jedes nativen Crawls leer, der je lief. Im Lauf, der das aufdeckte, trugen 0 von 40.920 Seiten ein solches Feld, obwohl die Seiten der Website Open Graph veröffentlichen. Das ist die zentrale Regel des Repositorys auf den Kopf gestellt: Ein nicht gemessenes Feld wurde als gemessen gelesen. Der Fehler wanderte weiter, denn crawl/evidence.py projiziert diese Spalten in OG:Title, OG:Description und OG:Image des Internal:All-Frames. Eine Prüfung sah bei einem nativen Crawl also leer, bei einem Screaming-Frog-Export derselben Website den echten Wert. Der Honesty-Vertrag von check_og verbarg den Schaden, statt ihn zu zeigen. Ohne befüllte OG-Spalte wurde übersprungen. Eine Website mit Open Graph wurde daher genauso geprüft wie eine ohne. Der Parser bleibt unverändert, korrigiert wurde nur die Leseseite. Ein neuer Test tests/test_open_graph_seam.py crawlt zwei Loopback-Fixture-Sites. Er verfolgt den Wert vom Parser über pages.jsonl und die Tabelle pages des Scan-Artefakts bis zu den OG:*-Frame-Spalten. Eine zweite Site ohne Open Graph hält „leer, weil nicht vorhanden“ getrennt von „leer, weil nicht gelesen“. Außerdem fixiert er die Schlüsselform des Parsers in derselben Datei. Der Fehler lag darin, dass zwei korrekte Module sich über einen Schlüsselnamen uneinig waren, ohne Test, der beide umspannt.

  • GeändertFunktioniertInterne Verlinkung: Register von 157 auf 161 Prüfungen (#634)

    Die Frage, ob eine Website gut und wo schlecht verlinkt ist, wird jetzt beantwortet. Das Register wächst von 157 auf 161 Prüfungen, und es kommt der Skill internal-linking hinzu (#634). Die Bausteine existierten bereits: jede Kante mit Position, Anker und nofollow-Flag in der Tabelle links, dazu ORPHAN_PAGE, INLINK_BOILERPLATE_ONLY und LOW_LINK_SCORE. Nichts davon machte daraus eine Aussage über den Graphen. Ein Audit über 40.920 Seiten nannte deshalb stundenlang die falsche Hauptaussage: 66 % der Sitemap galten als durch interne Links unerreichbar. Die Zahl entstand, indem die URL-Anzahl des Crawls von der der Sitemap abgezogen wurde. Gemessen wurde damit nur, dass der Crawler nicht dort ankam. Der Graph aus den 5.252.235 Kanten des Artefakts, ausgehend von der Startseite, ergab dagegen 91,9 % Erreichbarkeit. Der eigentliche Mangel war die Tiefe: 23.742 Seiten, also 58 % der Website, lagen mehr als zehn Klicks von der Startseite entfernt. Die tiefste lag bei 3.005. Das Archiv ist eine verkettete Liste aus „nächster Beitrag“-Links und kein Baum. Die Klicktiefe ist jetzt die Hauptaussage des Audits. summary.internal_linking enthält das Histogramm, das Maximum, die Aufteilung in erreichbar und unerreichbar, die internen Kanten nach Seitenposition und die Anzahl wiederholter Kanten. audit.md zeigt das neben der Gesundheitsübersicht. Der Durchlauf startet bei der URL, mit der der Crawl tatsächlich begann, nie bei pages.crawl_depth. Diese Spalte zeigt nur, wo der Crawler eine URL zufällig erreichte. Ein sitemap-gesteuerter Crawl trägt für den größten Teil einer Website 0 ein, und ein Durchlauf von dort würde einen anderen Ort beschreiben. Gibt es keine aufgezeichnete Start-URL und beanspruchen mehr als eine Seite die Tiefe 0, verweigert die Messung den Lauf und nennt die Ursache.

  • GeändertFunktioniertVier Prüfungen nutzen die neuen Verlinkungsdaten

    DEEP_CLICK_DEPTH schlägt bei einer indexierbaren Seite an, deren kürzester Weg vom Start-URL thresholds.click_depth_max überschreitet (Standard 10). Jeder Befund nennt den verwendeten Wert. DUPLICATE_INTERNAL_LINK schlägt bei einer Seite an, die dasselbe Ziel mit demselben Anker mehr als einmal schreibt. Auf der oben genannten Website waren 509.744 von 1.134.307 Kanten, also 44,9 %, Wiederholungen. Es handelte sich um eine Hauptnavigation, die zweimal ausgegeben wurde. Die zweite Kopie entfernte JavaScript wieder. Der Template-Fehler war nur mit einem handgeschriebenen Skript zu finden. LINK_INSIDE_HEADING und IMAGE_LINK_WITHOUT_TEXT brauchen, was die Seitenregion eines Links nicht tragen kann: die Vorfahrenkette des Ankers und dessen Inhalt. Deshalb zeichnet ein nativer Crawl jetzt pro Seite ein kleines, begrenztes link_placement_json neben der Überschriftengliederung auf. Beide Prüfungen werden bei einem Screaming-Frog-Export per Name übersprungen, statt ohne Befund über nichts zu laufen.

  • GeändertFunktioniertDie Ehrlichkeitsregeln der Analyse gelten durchgängig

    Eine Kante ohne erfasste Position zählt als unclassified und wird nie unter content eingerechnet. link_position.classify ist standardmäßig aus, daher gilt das für jede Kante. Ein Lauf in diesem Zustand muss als „niemand hat hingesehen“ gelesen werden, nicht als Website, deren Links alle Fließtext sind. Eine Position, die in der Verteilung fehlt, wird als „hier keine Kanten klassifiziert“ gemeldet, nicht als Region, die der Website fehlt. Regeln werden der Reihe nach geprüft, und ein Menü innerhalb von <header> trifft zuerst nav. Ein partieller Crawl widerruft das Urteil zur Klicktiefe, unabhängig davon, ob es angeschlagen hat. Eine nie abgerufene Grenzseite könnte den kürzeren Weg enthalten. Eine Prüfung, die stillschweigend nichts findet, würde sonst bedeuten: „Jede Seite liegt innerhalb der Untergrenze“.

  • BehobenFunktioniertPrüfung, die nie lief, gilt nicht als sauber (#635)

    H2_MISSING greift nur, wenn eine Konfiguration requirements.require_h2 setzt. Der Standard ist false. Bei einem gewöhnlichen Lauf war der Zweig deshalb nie erreichbar, und das blieb unsichtbar. Die Abdeckung zählte die Prüfung zu den stillen Prüfungen, also zu dem Topf, der „über alle Seiten gelaufen und nichts gefunden“ bedeutet. Ein Leser erfuhr so, die Website habe eine Prüfung bestanden, die niemand ausgeführt hatte. Beim Audit, der das aufdeckte, hatten 61 % der Seiten gar keine H2. 5.066 davon waren länger als 800 Wörter, die Prüfung hätte also tausendfach angeschlagen. Jetzt wird sie mit einem Grund als übersprungen geführt, der die Einstellung nennt, die sie abschaltet. Die Antwort lautet also „nicht bewertet, und so wird sie bewertet“, statt Stille. require_canonical ist gleich aufgebaut und bekommt dieselbe Behandlung. Sein Standard ist true, deshalb lieferte es noch kein falsches Ergebnis. Jetzt kann es aber nicht mehr dazu werden.

  • BehobenFunktioniertAufgabenliste: „None“ als Überschrift behoben (#640)

    Die Überschrift der Aufgabenliste lautete „Audit Tasks — None“ für jedes Audit, dessen Lauf kein Projekt aufgezeichnet hatte (#640). render_tasks_md baute die Überschrift mit src.get("project", "site"). Der Schlüssel "project" ist aber im Block source der Aufgabenliste immer vorhanden. Er wird beim Erstellen aus run.get("project") befüllt, und ein Lauf ohne Projekt speichert dort den Wert None, statt den Schlüssel wegzulassen. Der Default von dict.get greift nur bei einem fehlenden Schlüssel, nie bei einem, der None enthält. Ein nativer Crawl und eine Reanalyse lassen project beide ungesetzt. Jede daraus erstellte Aufgabenliste erhielt deshalb das Wort „None“ als Überschrift. Jetzt fällt die Überschrift mit or zurück, was auch einen gespeicherten None abfängt. Sie greift dann auf start_url oder source der Website zurück, bevor sie aufgibt. Dieselbe Reihenfolge nutzte seohead.reports.facts.crawl_domain bereits, um den Namen einer Website aus dem Block run zu ermitteln. Sie wird jetzt exportiert und wiederverwendet, statt neu erfunden. So nennt eine Aufgabenliste ohne Projekt die tatsächliche Website und nicht das Wort „site“. seohead.reports._normalize_sf_audit hatte dieselbe latente Form eine Zeile weiter (run.get("project") or "" in reports/__init__.py). Sie war gegen einen gespeicherten None bereits abgesichert, ihr Fallback war aber eine leere Domain statt der URL, die der Lauf ebenfalls kennt. Dadurch blieb die Überschrift „SEO Audit: “ in docx und md in denselben Fällen leer. Jetzt fällt sie über dieselbe crawl_domain-Auflösung zurück.

  • GeändertFunktioniertÜberschriftengliederung: Register auf 157 Prüfungen (#632)

    Die Gliederung der Überschriften wird jetzt als Abfolge und als Karte der Seite gelesen. Das Register wächst von 155 auf 157 Prüfungen (#632). Die acht bestehenden Überschriftenprüfungen beurteilen Überschriften als Menge. Sie können feststellen, dass eine Seite eine H1 und vier H2 hat, mehr nicht. Eine Seite, deren DOM-Reihenfolge H2, H2, ..., H1, H2 ist, bestand deshalb alle acht. Ebenso eine Seite, deren H2 allesamt Menüpunkte im Kopfbereich waren. Auf einer Live-Website fand sich das bei einem Artikel-Template mit achtzehn Überschriften vor der eigenen H1. Es wurde trotzdem als sauber bei den Überschriften gemeldet. Gefehlt hat nicht die Regel, sondern der Nachweis. pages speicherte h1, h1_2 und h2 als drei Strings ohne Reihenfolge und ohne Ort. Ein nativer Crawl speichert jetzt die gesamte Gliederung h1 bis h6 in DOM-Reihenfolge. Jede Überschrift hat Ebene, Text und Seitenregion, in der neuen nullable Spalte heading_outline_json. HEADING_BEFORE_H1 und HEADING_IN_PAGE_CHROME lesen sie aus. Die Region nutzt die Taxonomie, mit der schon die Linkklassifikation arbeitet: nav, header, sidebar, footer, content, other. „Im Header“ bedeutet damit für eine Überschrift dasselbe wie für einen Link. Eine Überschrift, auf die keine Positionsregel passt, wird nur dann gegen den Inhaltsbereich eingeordnet, wenn das Dokument einen benennt: ein <main>, ein [role=main], ein <article> oder einen konfigurierten Selektor. Fällt die Inhaltswurzel auf den gesamten <body> zurück, hieße „content“ nur noch „irgendwo auf der Seite“. Dann gilt die Region als nicht gemessen, und die Seite wird unter den übersprungenen Prüfungen des Laufs mit diesem Grund geführt. Sie gilt also weder als sauber noch als Mangel. Die Reihenfolge braucht keine Region, daher beantwortet HEADING_BEFORE_H1 weiterhin auch diese Seiten. Eine Screaming-Frog-Datei enthält keine Gliederung. Beide Prüfungen werden dort per Name übersprungen.

  • BehobenFunktioniertErfassung bleibt erhalten, wenn das Audit abbricht (#627)

    Ein nativer Crawl einer Live-Website sammelte zwanzig Minuten lang 600 Seiten in einem --scan-out-Artefakt. Danach gab er error: 'rel_next_2' aus, denn die str() eines KeyError ist nur der Schlüssel. Keine Phase, kein Traceback und kein Hinweis darauf, dass jede gesammelte Seite vollständig und erneut analysierbar in der Datei lag. Die Erfassung schreibt ihre Zeilen und schließt, bevor das Audit beginnt. Alles, was danach fehlschlägt, liegt daher im Analysator und nie im Crawl. Eine unerwartete Ausnahme wird dort jetzt nach Phase benannt, mit Typ und Meldung der Ausnahme. Sie verweist auf das erhaltene Artefakt und auf den Befehl, der es erneut analysiert, genau wie der Pfad für zu große Audits es schon tat. Der Lauf meldet audit_available: false mit diesem Grund, statt an der Ausnahme abzubrechen. crawl-site beendet sich dafür mit Code 2. Das ist dieselbe dritte Antwort, die schon die Widerspruchsprüfung von log-scan nutzt. 0 würde „das Audit lief und fand dies“ bedeuten, 1 „der Befehl erzeugte nichts“. Beides stimmt nicht für einen Crawl, dessen Belege erhalten sind. Der KeyError selbst ließ sich nicht reproduzieren. Derselbe Befehl gegen dieselbe Website auf dem aktuellen Hauptzweig lief durch. Die Änderung betrifft also, was bei einem fehlgeschlagenen Audit passiert, nicht die Ursache des damaligen Fehlers.

  • BehobenFunktioniertAudit scheitert nicht mehr am festen 30-Sekunden-Budget (#631)

    NativeScan.open() liest den Header eines nativen Scans über inspect(). Das führt außerdem PRAGMA quick_check und PRAGMA foreign_key_check über die gesamte Datenbank aus. Das ist eine echte Sicherheitsprüfung, deren Kosten aber mit der Größe des Artefakts wachsen, während das Budget fest blieb. Ein 3,5 Stunden laufender Crawl mit 40.920 Seiten sammelte alles, was er sammeln sollte, und lieferte danach kein Audit. Beim erneuten Öffnen der resultierenden 1-GB-Datei brauchte die Validierung rund 48 Sekunden, das Budget lag aber bei 30. Schlimmer war, dass der Fehler keinen Hinweis auf das Budget gab. Der Abbruch der Frist kam von SQLite als nackter sqlite3.OperationalError("interrupted"). Dieser wurde wörtlich zu cannot inspect native scan: interrupted verpackt, was von einer wirklich beschädigten Datei nicht zu unterscheiden war. Beides ist behoben. Das Standardbudget richtet sich jetzt nach der Größe des Artefakts. Es gibt eine Untergrenze von 30 Sekunden für kleine Dateien, plus einen großzügigen Zuschlag pro Byte, der deutlich unter der gemessenen Validierungsrate von rund 22 MB/s liegt. Das ist eine Obergrenze gegen einen hängenden Lesevorgang und kein Leistungsziel. Ein explizites timeout_seconds des Aufrufers überschreibt es weiterhin. Ein Frist-Abbruch erzeugt jetzt einen ScanError, der Budget, verstrichene Zeit und Größe des Artefakts nennt. So erkennt der Betreiber eine langsame große Datei von einer beschädigten, statt „interrupted“ als eigenen Fehler zu lesen.

  • HinzugefügtFunktioniertcrawl-site --resume <scan.sqlite> ergänzt (#619)

    NativeScan.resume_snapshot(), die Tabelle resume_state und der Writer, der sie füllt, existierten seit dem Entwurf des Scan-Artefakts. crawl_to_scan setzte eine vorhandene Datei bereits fort, aber nur für einen Aufrufer, der die ursprünglichen effektiven Einstellungen Byte für Byte reproduzierte. Keine Schnittstelle bot das an. Zeigte --scan-out auf ein unterbrochenes Artefakt und war ein Flag geändert, wurde es als Konfigurationskonflikt abgelehnt. Ein unterbrochener Crawl (6.516 von 34.635 Seiten auf fremder Website) musste deshalb praktisch bei null beginnen. --resume nimmt nur das Artefakt entgegen. Start-URL und vollständige effektive Konfiguration werden aus der Datei gelesen, denn darauf wurde die gespeicherte Frontier gebaut. Jedes andere crawl-formende Flag, das zusammen damit übergeben wird, wird abgelehnt statt angewendet. Ein Scan, den eine andere Build-Version erzeugte, der für eine andere Start-URL steht, der bereits abgeschlossen ist, aus einer Reanalyse stammt oder mit Zugangs-Headern lief, die er nur geschwärzt speichern kann, wird schon anhand der Datei allein abgewiesen, bevor eine einzige Anfrage ausgeht. crawl-site schreibt beim Beenden außerdem eine Zeile auf stderr. Sie sagt, ob der Crawl vollständig beendet wurde oder vorzeitig stoppte, warum, und wie man ihn fortsetzt. Ausgenommen sind Abbrüche wegen URL- oder Dauerbudget. Ein Resume liest diese Budgets ebenfalls aus und kann sie daher nicht übergehen. Dann sagt die Zeile genau das, statt eine wirkungslose Fortsetzung anzubieten. run.crawl_resumed bleibt der dauerhafte Nachweis. Ein fortgesetzter Crawl der Offline-Fixture-Site ruft jede URL über beide Prozesse hinweg genau einmal auf. Das Ergebnis ist in jedem Feld identisch mit einem ununterbrochenen Crawl, bis auf diesen einen Eintrag.

  • BehobenFunktioniertrender-check: ungerenderte Seiten nicht als sauber (#642)

    render-check stuft eine nicht gerenderte Seite nicht mehr als sauber ein. Außerdem verwirft er die Roh-HTML-Belege bei einem fehlgeschlagenen Render nicht mehr (#642). Beides sind Folgen der Schutzprüfung aus #623 in render.py. Erstens: Ein Render, der an seiner Ladestufe ein Timeout hatte, fiel auf das DOM bei domcontentloaded zurück. Das ist an sich korrekt. Hatte bis dahin aber kein Script gelaufen, war das gerenderte DOM gleich dem Roh-HTML. Der Vergleich fand nichts, und der Lauf meldete ok: True, js_dependent: False und den einzigen Befund „Roh-HTML und gerendertes DOM sind materiell gleichwertig. JavaScript-Rendering bestimmt keine für SEO sichtbaren Inhalte“, bewertet als Hinweis. Das galt für eine Seite, die niemand gerendert hatte. wait_reached hielt die Wahrheit fest, aber das Site-Audit übernimmt aus dem Ergebnis nur den Befundtext und sonst nichts. Die Wahrheit kam deshalb nie an. Fiel ein Lauf auf eine frühere Stufe zurück, sagt er das jetzt in der Befundliste selbst, hält die Entwarnung zurück und meldet js_dependent: None. Das heißt: Dieser Lauf weiß es nicht. Vorher stand dort False. Das galt auch beim Standard --wait load, nicht nur bei ausdrücklich angefordertem networkidle. Zweitens: Die Schutzprüfung gab ihre einzige Aussage „der Vergleich ist nicht verfügbar“ zurück, bevor sie den Zweig für leere Shells erreichte. Der frühe Return von render_check ließ den Schlüssel empty_shell ganz weg. So ging ein leerer Mount-Punkt einer Single-Page-Application verloren, obwohl detect_empty_shell() ihn aus der rohen Serverantwort liest und dafür kein Browser nötig ist. Gerade eine SPA-Shell ist die Seite, deren Render in ein Timeout läuft. Dort ging der Befund also genau dann verloren, wenn er zählte. Ein Befund aus der Rohhälfte überlebt jetzt einen unvollendeten Render. Nur Befunde aus der gerenderten Hälfte werden unterdrückt. In einem Crawl landet eine Render-Probe ohne Urteil jetzt in patterns_unprobed mit ihrem Grund (Kanal aus #626). Vorher zählte sie als gemessenes Muster, das kein Rendering braucht.

  • GeändertFunktioniertUnlesbare robots.txt als Fakt über die Website melden (#629)

    EMPTY_ROBOTS ist der Ersatzwert, den _fetch_robots auf jedem Pfad zurückgibt, auf dem robots.txt nicht gelesen werden konnte. Er hatte noch die Form des geparsten robots aus der Zeit vor Gruppen und Sitemaps. Der Erfolgspfad liefert die Form von parse_robots, und nur diese Form akzeptiert der Kontext robots_summary des Scan-Artefakts. Im --scan-out-Modus brach ein Crawl deshalb mit native parsed robots summary is invalid ab, sobald robots.txt nicht erreichbar war. Das galt bei 429 oder 5xx, bei einer Weiterleitung außerhalb des Hosts, bei einer Schleife, bei Überschreiten des Hop-Budgets oder bei einem Body, der kein text/plain war. Auch ein einfaches 404 löste den Abbruch aus. Das ist kein Fehler, sondern nach RFC 9309 der Fall „keine Einschränkungen“ und der häufigste der sieben Fälle. Beide dokumentierten Ergebnisse gingen hinter dieser einen Zeile verloren. Eine fehlende robots.txt erlaubt nun wieder einen uneingeschränkten Crawl. Eine nicht verfügbare stoppt den Lauf, mit einem Hinweis, welcher von sechs Fehlerfällen zutrifft. Der Legacy-Crawl im Verzeichnismodus hat das nie bemerkt, weil niemand die alten Schlüssel liest. Gefunden wurde es auf einer Live-Website, deren robots.txt für jeden unbekannten User-Agent auf einen Cookie-Sync-Endpunkt weiterleitet.

  • BehobenFunktioniertescalate() zählt fehlgeschlagene Proben nicht als sauber

    Behebt, dass escalate() eine fehlgeschlagene Render-Probe als „dieses Muster braucht kein Rendering“ zählte (#626). Die Funktion prüft pro Muster eine URL, um zu entscheiden, ob es einen vollständigeren, mit JavaScript gerenderten Abruf braucht. Waren aber alle Proben eines Musters fehlgeschlagen, etwa durch einen Browserstart-Fehler, ein Timeout oder einen unvollständigen Render, also die im echten Crawl üblichen Fehlerarten, schrieb das for/else das Muster trotzdem als geprüft ein. Es landete weder eskaliert noch in der Liste der nicht auswertbaren Muster. Das verletzte die zentrale Regel des Projekts, dass fehlende oder nicht gemessene Belege nie als sauber gelten dürfen. Ein Muster, über das nichts bekannt war, wurde statisch gecrawlt und genauso gemeldet wie eines, das tatsächlich gemessen und als renderfrei befunden wurde. EscalationResult führt solche Muster jetzt in patterns_unprobed, zusammen mit den dort bereits erfassten Mustern aus abgebrochenen Läufen. Der Grund der Probe steht im neuen Feld patterns_unprobed_reasons. So kann ein Bericht sagen: „Dieses Muster wurde nicht bewertet“, statt einen Befund zu suggerieren. Ein Muster mit mindestens einer erfolgreichen Probe bleibt unverändert. Die Änderung wirkt nur, wenn alle Proben eines Musters ok: False liefern.

  • BehobenFunktioniertrender-check: unfertiger Render ist kein Mangel (#623)

    Wenn der Render nicht abgeschlossen war, kam der gerenderte Snapshot ohne Title, ohne h1, ohne Canonical, mit null Links und einem Fünftel der Bytes der rohen Antwort zurück. Der Vergleich las diese Leere als Aussage über die Website. Er meldete „der Title wird durch JavaScript verändert“, obwohl der Render den Title nie gelesen hatte, und „das Canonical wird per JavaScript injiziert“, obwohl er es nie gesehen hatte. Bei einem Live-Audit ergaben sich so vier falsche Befunde hintereinander. Jeder davon führt einen Entwickler zur Suche nach einem JavaScript-Fehler, den es nicht gibt. Das Paar wird jetzt geprüft, bevor es verglichen wird. Enthält die rohe Antwort Landmarken, das gerenderte Dokument aber keine einzige davon und ist es zudem nur einen Bruchteil so groß, gibt die Prüfung ok: false mit reason: "incomplete_render" zurück. Dazu kommt ein benannter Grund mit beiden Byte-Zahlen und beide Snapshots zur Ansicht. Es gibt keine Befunde, und js_dependent: null statt false, weil der Lauf es nicht weiß. site-audit trägt das in summary.tools_failed ein, dem Ort für eine nicht gemessene Prüfung. Die Erkennung ist bewusst eng. Eine einzige überlebende Landmarke oder ein gerendertes Dokument von mindestens der halben Größe der rohen Antwort wird wie bisher verglichen. Eine Seite ohne Title und ohne Links auf beiden Seiten gilt als gemessen und nur als leer, nicht als nicht gemessen. Ein Title, den ein Script tatsächlich umschreibt, löst seinen Befund weiter aus. Die Wartestrategie berücksichtigt auch die übliche Ursache. Eine Website, deren dauerhaft laufende Analyse-, Chat- oder Werbe-Scripte nie in den Netzwerk-Leerlauf kommen, lief unter --wait networkidle in ein Timeout. Jetzt fällt der Lauf auf das DOM bei domcontentloaded zurück, ohne zweite Navigation. wait_reached zeigt, aus welcher Stufe der Snapshot stammt. Dazu kommt eine kurze Ruhezeit für verzögerte Scripte. Eine Seite, bei der DOMContentLoaded nie feuerte, bleibt ein Renderfehler und wird nicht als unvollständig geführt.

  • GeändertFunktioniertcrawl-site mit Live-Fortschrittszeile (#619)

    Ein nativer Crawl gab seine effektive Anfragerate aus und danach bis zum Ende nichts mehr. Bei einer Website mit 34.000 Seiten war nur am Wachsen der Scan-Datei in ls -la zu erkennen, dass er noch arbeitete. Die Zeile aktualisiert sich jetzt im TTY an derselben Stelle. Sie zeigt abgerufene Seiten, die bisher bekannten URLs, deren Anteil an dieser Menge, die aktuelle Anfragerate über ein gleitendes Fenster, die verstrichene Zeit und, bei --scan-out, die Größe des Scan-Artefakts. Bewusst nicht gezeigt wird eine Gesamtzahl, die der Crawl nicht kennen kann. Ein Crawler entdeckt seine Arbeit selbst. Der Nenner ist fetched + queued, begrenzt durch das URL-Budget. Er heißt known und nicht total. Eine einmal gedruckte Kopfzeile sagt, dass die Frontier noch wächst und dass der Prozentwert keine Schätzung für das Laufende ist. Eine nicht messbare Rate erscheint als rate n/a, nie als 0.0 req/s. Beide Werte stammen aus den eigenen Strukturen des Crawls. Bei einem SQLite-Scan kommen sie aus derselben resume_snapshot-Abfrage, nach der die Erfassungsschleife steuert. Was auf dem Bildschirm steht, entspricht also dem Artefakt in diesem Moment und ist keine parallele Zählung, die abweichen kann. Ohne TTY, also bei Pipe, Logdatei oder CI, erscheint statt Neuzeichnen alle 30 Sekunden eine einfache Zeile. Neu ist -q/--quiet. Es unterdrückt Fortschrittszeile und Start-Ratenzeile und lässt das JSON-Ergebnis auf stdout unberührt.

  • GeändertFunktioniertDrei Paginierungsprüfungen ergänzt, Register auf 155 (#385)

    Die drei Paginierungszeilen, die #385 offen ließ, sind geschlossen. Das Register wächst von 152 auf 155 Prüfungen. PAGINATION_MULTIPLE und PAGINATION_URL_NOT_IN_ANCHOR melden eine Seite, die zwei verschiedene Nachfolger deklariert, oder eine, deren deklarierte URL nicht zugleich als Anker auf derselben Seite steht. Nachfolger werden nach URL-Normalisierung verglichen, also nach derselben Identität wie bei der Ankerprüfung. /blog/page/2 und /blog/page/2/ aus zwei Plugins sind damit ein Nachfolger in zwei Schreibweisen, keine mehrdeutige Serie. PAGINATION_URL_NOT_IN_ANCHOR braucht die gesamte Linkliste einer Seite und liest dafür den All-Inlinks-Export. PAGINATION_MULTIPLE braucht das nicht. Es liest jetzt zuerst die leichteren Vorkommensspalten rel="next" 2 und rel="prev" 2 aus Internal:All, genau wie CANONICAL_MULTIPLE bereits aus Canonical Link Element 2 antwortet. All Inlinks dient nur als Fallback für ein Profil, dessen Internal:All ohne diese Spalten geschrieben wurde. PAGINATION_SEQUENCE_ERROR meldet einen Bruch in einer Seitenzahlfolge, der die Serie sonst folgt. Das entspricht dem eigenen Vorbehalt des Issues. Eine Serie darf bei einer anderen Zahl als eins beginnen, und eine Schrittweite ist kein Bruch. Eine Serie, deren URLs keine Seitenzahl nennen, wird als nicht bewertet erklärt, statt an einer Nummerierung gemessen zu werden, die man hätte erfinden müssen. Jede unbewertete Serie wird unter den übersprungenen Prüfungen des Laufs genannt, mit dem Grund, der für *diese* Serie gilt. Eine Schrittweite, ein Zyklus, eine zu kurze Serie für eine Folge und eine unlesbare Seitenzahl sind vier verschiedene Aussagen. Drei davon betreffen Serien, deren URLs alle ihre Zahl nennen. Die Zählung läuft pro Serie, nicht pro Lauf. So kann der übliche WordPress-Aufbau, Seite eins unter /blog/ ohne Zahl und der Rest unter /blog/page/N/, nicht hinter einer bewertbaren Serie an anderer Stelle desselben Crawls verschwinden.

  • HinzugefügtFunktioniertGate für Prüfungsurteile (#98) neben test_check_producer_gate.py

    Ein Gate prüft jetzt, ob das Urteil jeder Prüfung je gegen Markup belegt wurde, das den Mangel tatsächlich enthält, und ob es bei Markup ohne Mangel schweigt. test_check_producer_gate.py stellte nur sicher, dass jede Prüfungs-ID registriert ist und jede check_*-Funktion aufgerufen wird. Über die Schlussfolgerung sagte es nichts. Genau diese Lücke ließ #94, #95 und #96 alle bestehenden Tests passieren, obwohl sie auf Live-Websites weiter falsch anschlugen. test_check_verdict_coverage.py durchsucht tests/ strukturell per AST, nicht über eine feste Liste von Aufrufstellen. Für jede Prüfung prüft es beide Seiten. Es schlägt den Build fehl, wenn eine neu registrierte Prüfung weder einen zweiseitigen Test noch eine benannte, begründete Ausnahme hat. Von den 152 Prüfungen im Register hatten 88 bereits einen zweiseitigen Beleg. Eine neue Datei test_check_verdict_gaps.py schließt 22 weitere Lücken, die mit vertretbarem Aufwand testbar sind. Dazu gehören Länge und Doppelung von Title und Description, doppelte H1, Vorhandensein von H2, URL-Hygiene, Direktiven- und Markup-Prüfungen, Antwortcodes und die beiden Prüfungen für native Filterexporte. Die übrigen 64 sind nicht versteckt, sondern im Ratchet KNOWN_UNCOVERED des Gates benannt. Die Liste soll schrumpfen, wenn Abdeckung hinzukommt. Sie darf nie wachsen, um eine nach Einführung des Gates hinzugefügte Prüfung zuzulassen.

  • BehobenFunktioniertLeerer User-agent hebelte die Standardregel aus (#566)

    Ein Fehler bei der Gruppenauswahl in robots.txt erlaubte es, dass ein leerer User-agent-Wert die Standardregel einer Website aufhob (#566). Eine nackte Zeile User-agent: oder eine, deren Botname ein Inline-Kommentar verschluckte (User-agent: # old bot rule), wurde zu einem leeren Token geparst. _rules_for behandelte dieses Token wie jeden anderen festen Namen. Ein leerer Name ist ein Präfix der Länge null von jedem Agenten und passte daher auf alle. Weil er als *benannter* Treffer zählte, schlug er die echte Gruppe User-agent: * für jeden Crawler, den die Datei nicht erwähnt. Eine robots.txt, deren einzige wesentliche Regel User-agent: * / Disallow: / war, galt deshalb als vollständig crawlbar. Das betraf sowohl den Bericht zum Zugriff der KI-Bots als auch das Gating des Live-Crawlers selbst. Beide rufen dieselbe Funktion is_allowed auf. Leere Tokens werden jetzt übersprungen. Eine solche Gruppe nennt damit niemanden, und die Wildcard-Gruppe gilt. Die spezifischste benannte Gruppe gewinnt weiterhin. Eine robots.txt, die niemanden nennt, erlaubt weiterhin alles.

  • BehobenFunktioniertVier Fehler bei Exportauswahl und Validierung (#209–#216)

    Vier Fehler bei Exportauswahl und Validierung ließen ein Audit ein Ergebnis präsentieren, das es nicht stützen konnte (#209, #210, #215, #216). Der Matcher für internal_all verlangte nur das Dateinamen-Token internal. Ein partieller Internal-Reiter pro Typ, etwa internal_html.csv, dem alle Nicht-HTML-Zeilen fehlen, erfüllte so den Pflichtexport Internal:All ohne Warnung über den fehlenden Hauptexport. Der Matcher verlangt jetzt zusätzlich all. discover_exports wählte für einen logischen Schlüssel bei zwei passenden Dateien die erste in sortierter Dateinamenreihenfolge. Lagen etwa internal_all.csv und internal-all.csv mit unterschiedlichen Zeilen vor, verwarf es die andere still, ohne dass die Lauf-Metadaten diese Wahl festhielten. Jetzt bricht es ab und nennt alle Kandidaten. run_sf nahm den neuesten Zeitstempel-Unterordner unter --out, egal wann er entstand. Ein erneuter Lauf, der mit Code 0 endete, ohne etwas zu schreiben, etwa bei einem Startfehler, den Screaming Frog nicht als Fehlercode meldet, konnte so die Exporte eines früheren Aufrufs als frisch zurückgeben. Jetzt vergleicht er mit einem Snapshot vor dem Prozessstart und schlägt laut fehl, wenn nichts Neues erscheint. build_command hängte --auth-config nur an, wenn die Profildatei bereits existierte. Bei einem Tippfehler oder einem gelöschten Pfad startete so still ein unauthentifizierter Crawl. Für das optionale Standard-seospiderconfig ist das richtig, für ein vom Aufrufer ausdrücklich verlangtes Profil falsch. Eine fehlende explizite sf_cli.auth_config bricht jetzt ab, bevor Screaming Frog startet.

  • BehobenFunktioniertZwei Extraktionsfehler in seohead/checks/parser.py (#138, #140)

    collapse_whitespace dekodierte HTML-Entitäten ein zweites Mal, obwohl BeautifulSoups lxml-Parser bereits bei jedem tag.get_text()- und tag.get(attr)-Wert einmal dekodiert hatte. Bei normalem Markup war das ein stiller No-op. Auf einer Seite, deren CMS oder Import-Pipeline die Entitäten bereits doppelt escaped hatte, was ein häufiges Artefakt ist, machte es aus sichtbar kaputtem Entity-Salat scheinbar sauberen Text. Die gemeldete Länge fiel dadurch unter das, was ein Browser-Tab oder ein SERP-Snippet tatsächlich zeigt. Längenbasierte Prüfungen von Title und Description schlugen so in beide Richtungen falsch aus. Der Helfer dekodiert jetzt gar nicht mehr. Außerdem durchsuchte die Extraktion von Links und URL-Quellen das gesamte Dokument ohne Einschränkung. Ein <a> oder <img>, das nur innerhalb eines inerten <template> existierte, galt als echter Link auf der Seite, und spider.py rief ihn tatsächlich ab. Das ist derselbe Fehler mit Phantom-URLs, der für <base href> in #4 geschlossen wurde. Beide Extraktoren überspringen jetzt Nachfahren von <template>. Der Inhalt eines Template-Elements ist laut HTML-Spezifikation nie Teil des gerenderten Dokuments und wird von Browser oder Crawler nur geladen, wenn ein Script ihn klont. <noscript> bleibt dort bewusst erreichbar, anders als bei der Textextraktion. Es ist echtes, im Standard definiertes Fallback-Markup, das ein Client mit deaktiviertem JavaScript und der Nicht-Rendering-Durchgang von Suchmaschinen tatsächlich laden. Würde man es ausschließen, bliebe dem Audit eine tatsächlich abrufbare URL verborgen. Auch die Wortzahl zählt Text von <svg>- und <math>-Nachfahren nicht mehr als Fließtext. Dazu gehören etwa die Barrierefreiheits-<title> eines Icon-Sprites, Glyph-<text> oder MathML-Notation. Ein 20-Icon-Header konnte die gemeldete Wortzahl sonst gegenüber dem echten Inhalt verdoppeln. Die Ausschlussliste liegt jetzt an einer Stelle, content_area.TEXT_EXCLUDED_TAGS, und wird von beiden Textextraktoren geteilt. Vorher gab es zwei Kopien, die bereits auseinandergelaufen waren.

  • BehobenFunktioniertLinks: rel, target, Roh-href; Formulare (#125)

    Der vollständige rel-Token-Satz eines Links, sein target-Attribut und der rohe href vor der Auflösung bleiben erhalten. <form>-Elemente werden mit Methode, Action und dem Hinweis extrahiert, ob ein Passwortfeld vorhanden ist (#125). Sechs katalogisierte Probleme hingen davon ab, dass diese drei Fakten verworfen wurden. Dazu gehören unsichere Links auf fremde Origins, also target="_blank" ohne rel="noopener" oder "noreferrer", protokollrelative Links (//host/path, vor der Auflösung), ausgehende Links auf localhost, eine Seite, die sowohl einen gefolgten als auch einen nofollow-internen Link erhält, eine unsichere Form-Action und ein Passwortformular auf einer Seite über HTTP. Alle sechs stehen jetzt im Register als UNSAFE_CROSS_ORIGIN_LINK, PROTOCOL_RELATIVE_LINK, OUTLINK_TO_LOCALHOST, FOLLOW_AND_NOFOLLOW_INLINKS, FORM_URL_INSECURE und FORM_ON_HTTP_URL. Die Prüfungen zu Formularen, localhost und der Mischung aus follow und nofollow brauchen nur Felder, die jeder Crawl ohnehin erfasst. Sie laufen daher immer. Das Paar aus fremden Origins und protokollrelativen Links braucht link_attributes.capture, das standardmäßig aus ist. Der Grund: Die zusätzlichen Daten je Kante erhöhten einen synthetischen Crawl mit 3.387 Seiten und 150 Links pro Seite um rund 50 %, etwa 95 Byte je Kante und insgesamt 46 MiB. raw_href allein macht den größten Teil davon aus. Das Register wächst von 121 auf 127 Prüfungen.

  • BehobenFunktioniertreport-build ohne Befunde bei SF-Analyzer-JSON (#151)

    Behebt, dass report-build für ein SF-Analyzer-audit.json einen Bericht ohne Befunde rendert (#151). Das dokumentierte Rezept, sf run --tasks in report-build --format docx, xlsx, csv oder md zu leiten, las findings und flache Seitenschlüssel. Das SF-Schema verwendet diese nicht. Befunde liegen unter issues, Seitenfakten unter pages[].metrics. Die Abweichung ergab eine sichere Zusammenfassung 0/0/0/0 für ein Audit, das echte kritische Probleme gefunden hatte, und keine Befundabschnitte. build_report erkennt jetzt beide Formen, das native seohead.site-audit/1 und das Format des SF Analyzer. Letzteres wird vor dem Rendern in den flachen Vertrag überführt, den die vier menschenlesbaren Writer bereits verstehen. --format json bleibt unverändert. Es gab die ursprünglichen Daten bereits korrekt weiter, was zeigte, dass sie nie fehlten. Ein Dokument, das keine der beiden Formen erfüllt, wird mit ok: False abgelehnt, und die Meldung nennt die Abweichung des Schemas. Früher wurde es als leeres Ergebnis gerendert. Außerdem ist das tote if ... : pass entfernt, das wie eine Prüfung aussah und nie etwas tat. tests/test_docs_commands_execute.py prüft jetzt die gerenderte Zusammenfassung des dokumentierten Rezepts gegen die eigenen Summen von audit.json und nicht nur den Exitcode.

  • GeändertFunktioniertZwei Kostenschutz-Lücken in seohead/data_sources/ (#157, #159)

    geo_guard prüfte nur das beratende Feld country. Daher konnten search_volume, keyword_ideas, keyword_difficulty und serp den Live-Endpunkt von DataForSEO für location_code=2643 (Russland) oder 2112 (Belarus) erreichen, wenn ein Aufrufer die numerische Geo-Zielgruppe angab, ohne country zu füllen. Der Guard prüft jetzt zuerst location_code, denn darauf wird tatsächlich abgerechnet. Außerdem wurde bei einem Netzwerkfehler während eines kostenpflichtigen Aufrufs (URLError/TimeoutError/SSLError) derselbe Payload ohne Idempotenz-Schlüssel erneut gesendet. Betroffen waren DataForSEO-post, Arsenkin-/set sowie wordstat.topRequests, wordstat.dynamics und web.searchAsync von Yandex Cloud. Protokolliert wurde nur der Versuch, der schließlich antwortete. Keiner der drei Anbieter bietet für diese Endpunkte einen Idempotenzmechanismus. Ein verlorener Response wird deshalb nicht mehr wiederholt. Der Versuch wird im Spend-Ledger vermerkt, mit unbekannten Kosten und dem Flag attempt_failed: network_error. Der Aufruf schlägt direkt fehl und riskiert keine zweite Abrechnung. Idempotente Lesezugriffe, also Arsenkin-/check und /get sowie das Polling von Yandex-Cloud-Operationen, bleiben unverändert und wiederholen weiterhin. yandex_cloud.WebSearch.search_batch isoliert eine verlorene Übermittlung auf die eigene Anfrage, statt den ganzen Batch abzubrechen. metrika.py wiederholt Netzwerkfehler genauso, wird aber nicht kostenpflichtig abgerechnet. Es blieb deshalb unverändert. Als Folgepunkt vermerkt: Ob die Erstellung des Logs-API-Exports aus Quota-Gründen dieselbe Behandlung bekommen sollte.

  • GeändertFunktioniertDNS-Rebinding in http_client() (#142): pinned_target()

    Eine DNS-Rebinding-Lücke in http_client() ist geschlossen (#142). pinned_target() war die Korrektur für das TOCTOU-Fenster aus #14. Es schützte aber nur den Listenabruf von collect.py. Die vierzehn anderen Aufrufstellen, einschließlich der crawl-site-Engine in spider.py, ließen httpx DNS ein zweites, unabhängiges Mal auflösen, um den Socket zu öffnen. Ein feindlicher Resolver, der diese zweite Anfrage anders beantwortete als die Prüfung des Guards, konnte so 169.254.169.254 oder jede Adresse nach RFC 1918 erreichen, unabhängig vom Urteil des Guards. http_client() baut jetzt jeden Client auf einem Transport, der die Verbindung an die selbst aufgelöste Adresse bindet. Das gilt bei der ersten Anfrage und bei jedem Redirect-Hop. Der Hostname bleibt nur für den Host-Header und für TLS-SNI erhalten. Die Korrektur ist damit strukturell und nicht eine Disziplin, die jeder Aufrufer selbst einhalten muss. SEOHEAD_ALLOW_PRIVATE_NETWORKS und SEOHEAD_ALLOW_PRIVATE_HOSTS bleiben unverändert.

  • BehobenFunktioniertExit-Codes von CLI und MCP bei Handler-Fehlern (#155, #156)

    Der Exit-Code-Vertrag für CLI und MCP ist korrigiert, wenn ein Handler seinen Fehler selbst meldet. Außerdem ist SOURCE_FLAGS vollständig (#155, #156). Ein Handler, der {"ok": false, ...} zurückgibt, ist die dokumentierte Form, mit der die Tool-Schicht Abruf-, Parse- oder Anbieterfehler ohne Ausnahme meldet. Bisher gab die CLI dieses JSON aus und beendete sich mit 0. Über MCP kam ein normales Ergebnis ohne isError zurück. Eine Pipeline, die auf $? prüft, oder ein Client, der nur isError liest, konnte den Fehler so nicht erkennen. cli.py endet jetzt in diesem Fall mit 1. Der eigene Exitcode 2 von log-scan für einen sich selbst widersprechenden Lauf bleibt ein separates, dokumentiertes Signal (siehe docs/USAGE.md). mcp_server.py wirft über einen gemeinsamen Wrapper _checked() einen ToolError, sodass der Client isError sieht. Beide Wege rufen handlers.handler_failed() auf, damit CLI und MCP nicht auseinanderlaufen, was als Fehler zählt. Zusätzlich fehlten in SOURCE_FLAGS die Flags --phrase, --keywords, --query/--queries, --seed, --counter sowie --before/--after. Jedes davon bestimmt die vollständige Eingabe eines Befehls bereits so wie --url. Ohne sie verarbeitete eine zeilenweise Schleife über einen dieser Werte stillschweigend nur die erste Zeile. Die Menge wird jetzt von _source_flag() an der Stelle gebildet, an der jedes Flag deklariert ist. Sie steht nicht mehr getrennt von Hand, sodass sie nicht erneut auseinanderlaufen kann.

  • GeändertFunktioniertdocs/scenarios/ von zehn auf 56 Ketten erweitert (#120)

    docs/scenarios/ wächst von zehn auf 56 Befehlsketten, gruppiert nach der Frage, mit der ein Leser kommt (#120). Welche Szenarien existieren, bestimmt die Abdeckungskarte und nicht der Geschmack. Jedes Szenario nennt die katalogisierten Probleme, die es löst. tests/test_scenario_coverage.py prüft, dass jedes Problem, das dieses Toolkit zu finden beansprucht, in mindestens einem Szenario vorkommt. Außerdem prüft er, dass kein Szenario ein Problem nennt, das die Karte nicht führt, und dass keines seine Grenzen auslässt. Alle 143 findbaren Probleme sind abgedeckt. Jeder Befehl in jeder Datei wird in der CI weiterhin gegen die Fixture-Site ausgeführt. Die Suite umfasst 2.008 Tests. Die Dokumentationsbefehls-Gates bilden die größte Einzelgruppe.

  • GeändertFunktioniertProtokollgrenzen: SITEMAP_TOO_MANY_URLS u.

    a. (#124)

    Die eigenen Grenzen des Sitemap-Protokolls werden jetzt geprüft (#124). SITEMAP_TOO_MANY_URLS schlägt bei mehr als 50.000 Einträgen in einer Datei an. SITEMAP_TOO_LARGE schlägt bei mehr als 50 MB unkomprimiert an. SITEMAP_URL_DUPLICATED meldet eine URL, die in mehr als einer Sitemap steht, und nennt beide Dokumente. Eine Datei über einer der Grenzen ist ungültig und nicht nur groß. Eine Suchmaschine liest möglicherweise einen Teil und verwirft den Rest, ohne dass der Websitebetreiber das sieht. Die Schwellen stammen aus dem Protokoll und nicht aus der Konfiguration. Beide Parser erfassen jetzt die Byte-Größe und die angegebene Anzahl je Dokument. Die Befunde nennen die Kind-Sitemap und nicht den Index. Das Register wächst von 118 auf 121 Prüfungen.

  • HinzugefügtFunktioniertNeu: docs/GUIDELINE.md, das Dokument für den Einstieg (#121)

    docs/GUIDELINE.md ist neu, das Dokument, das man zuerst liest (#121). Es erklärt, was das Tool ist und was nicht. Dazu gehören ein erster Durchlauf von Anfang bis Ende, die Wahl der Crawl-Rate und die Frage, ob die Fehler vom eigenen Setup stammen. Außerdem erläutert es das Lesen von audit.json, ohne sich täuschen zu lassen, und was die Konfigurationsdatei ändert und was sie nur kostet. Es nennt die sechs Fehler, die jeder zuerst macht, was zu tun ist, wenn das Tool falsch liegt, und was es überhaupt nicht beantworten kann. Verlinkt ist es im README direkt vor der Referenz.

  • HinzugefügtFunktioniertdocs/COVERAGE_SF_ISSUES.md aus seohead/sf/core/sf_issue_map.py generiert

    docs/COVERAGE_SF_ISSUES.md wird aus seohead/sf/core/sf_issue_map.py generiert. Die Datei enthält alle 320 Probleme des veröffentlichten Katalogs des Felds. Jedes hat genau einen Status: von einer benannten Prüfung gefunden, von einem benannten Befehl gefunden, teilweise gefunden (mit benanntem fehlenden Teil), eine benannte Lücke oder eine Entscheidung mit Begründung (#119). Von den 212 Problemen im Umfang sind 126 gefunden und 17 teilweise. 41 sind Lücken, und 28 erfordern etwas, das bewusst nicht gebaut wurde. Barrierefreiheit (92) und AMP (16) sind als einzelne Entscheidungen abgelehnt. Ihre vollständigen Listen stehen dort, damit die Entscheidung nachprüfbar ist. Ein Test prüft, dass jede referenzierte Prüfungs-ID und jeder Befehl noch existiert. Eine Umbenennung bricht deshalb den Build, statt das Dokument unbemerkt veralten zu lassen. Ersetzt docs/CHECKLIST_AUDIT.md, das ohne den Katalog verfasst wurde.

  • GeändertFunktioniertSitemap-Seeder ruft die veröffentlichte Adresse ab (#115)

    Der Sitemap-Seeder ruft die Adresse ab, die die Sitemap veröffentlicht hat, nicht die normalisierte Form (#115). sitemap.crawl() lieferte nur das normalisierte loc zurück. Eine Sitemap, die /a/ angab, führte deshalb zu einem Abruf von /a. Auf den meisten CMS war das eine 301, die der Crawler erfunden und dann als Fakt über die Website gemeldet hatte. Wo die Form ohne Schrägstrich gar nicht geroutet ist, war es ein 404. Jeder Eintrag trägt jetzt loc, wie veröffentlicht, zusammen mit loc_normalized für die Verbraucher, die darauf vergleichen. Weiterleitungsstatistiken aus früheren, sitemap-gesteuerten Crawls sind deshalb fragwürdig.

  • GeändertFunktioniertOperator-Skill als Controller-Verzeichnis umgebaut (#111)

    .claude/skills/ hat jetzt zwei Ebenen: 21 Methodenskills, die je eine Sache gut erledigen, und control/. Letzteres entscheidet, welche davon auf einer Website laufen, die noch niemand angesehen hat. Der Controller verweist, statt sich zu wiederholen. Er enthält fünf nachladbare Unter-Skills für Umfang, Rate und Last, das Lesen eines Audits, die Verifikation und die Lieferung. Außerdem gibt es ein Referenzarchiv in drei Dateien: Mängel, die auf Live-Websites gefunden wurden und woran man sie erkannte, welche Grundgesamtheit jede Prüfung beschreibt, und was das Toolkit überhaupt nicht beantworten kann. Das Gate für reines Englisch und das Doc-Befehl-Gate decken jetzt jede Markdown-Datei unter einem Skill-Verzeichnis ab, nicht nur SKILL.md.

  • HinzugefügtFunktionierttests/chains/: Fixture-Site aus den Formen, die Ketten brechen

    tests/chains/ ist eine Fixture-Site aus den Formen, die Weiterleitungsketten tatsächlich brechen. Dazu gehören beide Schrägstrich-Formen derselben URL, ein Body, der kein gültiges UTF-8 ist, eine Seite in windows-1251, eine Masthead außerhalb von <main>, ein Link auf einen fremden Host und ein per robots.txt gesperrter Pfad. Sie wird über Loopback gecrawlt. Dazu kommen siebzehn Behauptungen über den gesamten Lauf statt über ein einzelnes Modul (#112). Sie prüfen vier Eigenschaften. Erhalt: Eine Zahl ändert ihre Bedeutung beim Weitergeben nicht. Population: Ein Befund bezieht sich auf ein Mitglied der Menge, die er beschreibt. Determinismus: Zwei Crawls mit zwei Nebenläufigkeitsstufen ergeben dieselbe Antwort. Repräsentation: Eine Seite sagt, wie sie gemessen wurde. Die Populationsregeln stammen aus logscan selbst. Ein Widerspruch, den der Scanner benennen kann, ist deshalb ein Kettentest, der genau das prüft.

  • GeändertFunktioniertreconcile_sitemap meldet URLs in ihrer Schreibweise

    Der Vergleich läuft weiterhin über den normalisierten Schlüssel. Ein Befund, der eine normalisierte Form nannte, bezog sich aber auf eine URL, die im Crawl nirgends vorkam. Für Leser war das nicht verwertbar, und der Anomalie-Scanner konnte es nicht von einem Befund über eine nie abgerufene Seite unterscheiden. Jetzt nennt der Befund die URL so, wie sie geschrieben war.

  • HinzugefügtFunktioniertdocs/scenarios/: zehn End-to-End-Ketten mit echten Befehlen

    docs/scenarios/ enthält zehn End-to-End-Ketten. Jede zeigt die echten Befehle in ihrer Reihenfolge, das Artefakt am Ende, die Kosten und das, was diese Kette nicht beantworten kann (#110). Der Rest der Dokumentation listet, was das Toolkit hat. Dieser Teil beschreibt, was es tut. Verlinkt ist er im README über der Toolliste, damit ein Agent, der das Repository bewertet, die Ketten vor dem Inventar findet. Jeder gezeigte Befehl wird von tests/test_docs_commands_execute.py gegen die Fixture-Site ausgeführt. Dessen Extraktor und die Gates für reines Englisch und für Zählwerte durchsuchen docs/ jetzt auf allen Ebenen und nicht nur oberhalb.

  • HinzugefügtFunktioniertlog-scan (CLI) und seo_log_scan (MCP): Läufe auf Widersprüche prüfen

    log-scan (CLI) und seo_log_scan (MCP) lesen die eigenen Artefakte eines abgeschlossenen Laufs und melden Behauptungen, die nicht alle zugleich wahr sein können (#109). Es gibt acht Regeln. Jede stammt aus einem Fehler, der die gesamte Testsuite passiert hatte. Beispiele sind eine erfasste Größe, die nicht zur Datei auf der Platte passt, ein Textanteil über 100 %, eine Prüfung, die häufiger anschlägt als es Seiten gibt, ein Befund über eine URL, die der Lauf nie abgerufen hat, ein Canonical, das als Weiterleitung galt, obwohl diese URL im selben Lauf mit 2xx antwortete, eine Zusammenfassung, die ihren eigenen Zeilen widerspricht, Wörter auf einer Seite mit null Bytes und Seiten, die auf zwei Arten gemessen wurden, wobei nur einige sagen, welche. Jede Anomalie nennt beide Werte und die Stelle, an der jeder gelesen wurde. Die CLI endet mit Code 2, wenn ein Lauf sich selbst widerspricht. So stoppt eine Pipeline, statt die Zahlen zu veröffentlichen.

  • GeändertFunktioniertDer Pacing-Test misst nicht mehr die Wanduhr (#107)

    _DispatchGate liest jetzt die injizierte Uhr des Crawls statt time.monotonic() direkt. Der Test steuert sie mit einer virtuellen Uhr, die nur fortschreitet, wenn etwas schläft. Die Zeitpunkte der Dispatches sind damit die eigene Arithmetik des Crawlers, und die Prüfung ist exakt. Die alte Form verglich echte verstrichene Abstände mit einer Untergrenze von 0,024 s. Sie schlug bei unverändertem Code fehl, sobald der Rechner ausgelastet war.

  • GeändertFunktioniertZweite Hälfte der Prüfung ungenutzter Einstellungen (#91)

    http.headers wird in jede Anfrage neben den Zugangs-Headern eingemischt. speed.adaptive steuert die Verzögerung und die Anpassung der Nebenläufigkeit der Drossel. Die Zähler für Timeouts und Serverfehler laufen weiter, denn Aufgeben ist ein eigener Mechanismus, getrennt vom Zurückfahren. discovery.hyperlinks.store und .crawl, discovery.external.store und discovery.redirects.crawl bestimmen jetzt, was der Crawl speichert und was er verfolgt. discovery.canonicals.*, discovery.external.crawl und discovery.redirects.store sind entfernt, statt angebunden. Sie beschrieben Fähigkeiten, die der Spider nicht hat, etwa das Verfolgen von Canonicals oder Crawls über Hosts hinweg, oder Zustände, die er nicht unterdrücken kann. Eine Einstellung, die in --config-help und im Lauf-Manifest steht und nichts ändert, ist schlechter als gar keine. Die Ausnahmeliste des Coverage-Canaries ist jetzt leer. Jeder Pfad in DEFAULTS ändert ein beobachtbares Ergebnis und wird durch einen Test benannt.

  • GeändertFunktioniertInhaltsbereich aus der Semantik des Dokuments erkennen, wenn nichts konfiguriert ist…

    Ist nichts konfiguriert, wird der Inhaltsbereich aus der Semantik des Dokuments erkannt (#96): zuerst main, dann [role="main"], dann article. Welcher Treffer griff, wird als auto_main / auto_role_main / auto_article festgehalten. Der bisherige Standard, also der gesamte Body abzüglich der Tags nav und footer, zählte auf einem Live-WordPress-Beitrag 126 Template-Wörter von 433 (29 %), darunter einen Link zum Überspringen der Navigation (Skip-to-Content). Diese Aufblähung wirkt sich auf jeder Seite eines Templates in gleicher Richtung auf THIN_CONTENT und LOW_TEXT_RATIO aus. Für den Fallback-Pfad kommen header und aside zu nav und footer in DEFAULT_EXCLUDE_TAGS hinzu. Ein konfigurierter Selektor hat weiterhin Vorrang. Findet er nichts, greift fallback_default_body, statt stillschweigend eine andere Region automatisch zu erkennen.

  • GeändertFunktioniertURL_NOT_IN_SITEMAP vergleicht jetzt Seiten mit Seiten (#94).

    Bisher wurden die URLs einer Sitemap gegen jedes Ziel im Link-Graphen des Crawls abgeglichen. Auf einer Live-Site mit 124 Seiten löste die Prüfung so 392-mal aus: 362 Bilddateien, auf die eine Galerie direkt verlinkt, fünf Links auf andere Hosts und 30 URLs, die der Crawl nie abgerufen hatte. Das waren 74 % dieses Berichts und verdeckte die echten Befunde. Die beobachtete Seite umfasst jetzt nur noch die Seiten, die eine Sitemap deklarieren soll: abgerufen, 2xx, HTML, gleicher Host und indexierbar. reconcile_sitemap übernimmt diese Menge als eigenes Argument comparable. So fragt SITEMAP_ORPHAN die Erreichbarkeit weiterhin gegen alle Link-Ziele ab und kann keine Waisen erfinden. Was ausgeschlossen wurde, wird unter linked_not_comparable zurückgegeben statt verworfen.

  • BehobenFunktioniertCanonical-Prüfungen für Sites korrigiert, die beide Schreibweisen einer URL mit und ohne

    Slash ausliefern (#95).

    norm_url entfernt den abschließenden Slash absichtlich, damit ein Canonical ohne Slash zur Seite mit Slash passt. Der normalisierte Index behielt aber nur eine Seite pro Schlüssel. Ein typischer WordPress-Crawl enthält jedoch zwei: /x (301) und /x/ (200). Je nachdem, welche Variante zuerst eingefügt wurde, meldete CANONICAL_TO_REDIRECT 78 Live-Seiten, deren Canonical mit 200 antwortet. AuditContext stellt jetzt pages_by_norm bereit, mit allen Seiten unter einem Schlüssel. page_by_norm liefert die Variante, die mit 2xx antwortete. CANONICAL_TO_REDIRECT und CANONICAL_NON_INDEXABLE schlagen nur noch an, wenn keine Variante widerspricht.

  • BehobenFunktioniertsize_bytes korrigiert: Gemessen wird jetzt der Response-Body in der Form, in der er

    übertragen wurde, vor der Dekodierung…

    Korrigiert size_bytes: Gemessen wird jetzt der Response-Body, wie er übertragen wurde, bereits vor der Dekodierung (#99). Bisher wurde aus dem dekodierten String gemessen. Jedes Byte, das kein gültiges UTF-8 war, wurde zu U+FFFD und beim Rückkodieren zu drei Bytes. Eine 739-KB-WebP-Datei aus einem echten Crawl wurde so als 1,27 MB erfasst, und der Aufblähungsfaktor unterschied sich von Datei zu Datei. Bilder, PDFs, Schriften und HTML in einem Legacy-Zeichensatz (windows-1251) wurden alle zu hoch gezählt, ebenso das Textverhältnis, das gegen diesen Nenner berechnet wurde. Der HTTP-Cache speichert die Wire-Größe zusammen mit dem Eintrag. Eine wiedergegebene Seite meldet daher, was der Live-Abruf gemeldet hat. Das Schema wechselt auf http_cache.v2. Einträge der Version 1 werden einmalig neu abgerufen, statt ohne Größenangabe wiedergegeben zu werden.

  • HinzugefügtFunktioniertdocs/TOOL_REFERENCE.md ergänzt, generiert aus den MCP-Tool-Definitionen…

    Ergänzt docs/TOOL_REFERENCE.md, generiert aus den MCP-Tool-Definitionen (seohead/mcp/tool_reference.py, scripts/generate_tool_reference.py). Die Datei listet für jedes Tool seo_*/sf_* die Argumente mit Typ und Standardwert, dessen Kosten (Netzwerk, Schreibzugriffe, Idempotenz, kostenpflichtige Nutzung, aus dem Profil in ToolAnnotations) und die Hinweise zu Verhalten und Fehlerfällen aus dem eigenen Docstring. tests/test_docs_drift.py lässt den Build fehlschlagen, wenn die Datei von den Tool-Definitionen abweicht oder ein Tool fehlt.

  • HinzugefügtFunktionierttests/test_docs_commands_execute.py ergänzt: extrahiert jeden seohead ...-Befehl aus

    README, docs, Skills und examples…

    Ergänzt tests/test_docs_commands_execute.py: Die Datei extrahiert jeden seohead ...-Befehl aus README, docs, Skills und examples (scripts/doc_commands.py) und führt ihn offline aus. Als Ziel dient eine Loopback-Fixture-Site (tests/doc_fixtures/) sowie materialisierte Kopien von examples/. Der Test prüft, ob der Lauf sauber endet. Befehle, die echte Infrastruktur brauchen (RDAP/DNS, eine lizenzierte SF-Binary, einen kostenpflichtigen Provider-Zugang oder den nie zurückkehrenden mcp-Server), werden mindestens gegen den aktuellen Argument-Parser geprüft. Ein dokumentierter Befehl, der nicht mehr funktioniert, lässt jetzt die CI fehlschlagen, statt veraltete Anleitungen auszuliefern.

  • GeändertFunktioniertAlle 21 technischen Workflow-Skills (.claude/skills/*/SKILL.md) auf eine gemeinsame

    Struktur umgebaut…

    Alle 21 technischen Workflow-Skills (.claude/skills/*/SKILL.md) auf eine gemeinsame Struktur gebracht: Trigger, Anti-Trigger, Voraussetzungen (als Checkliste), der bestehende Workflow, Entscheidungspunkte, Definition of Done (als Checkliste) und Kosten. Die veraltete Befehlsabdeckung am Ende von docs/SKILLS.md ist korrigiert. Die echte Zahl, die beim Durchsuchen jeder Skill-Datei neu berechnet wird, sichert jetzt ein neuer Drift-Test ab.

  • BehobenFunktioniertMehrere Zählungen von Tools und Tests korrigiert, die unbemerkt von den echten Registries

    abgewichen waren (veraltete…

    Mehrere Zählungen von Tools und Tests korrigiert, die unbemerkt von den echten Registries abgewichen waren: eine veraltete CLI-Befehlszahl in docs/USAGE.md, docs/COMPARISON.md, README.md und docs/TESTING.md, eine veraltete MCP-Tool-Zahl in docs/TOOLS.md, eine veraltete Tool-Referenz-Zahl in docs/README.md sowie die Zahl der Offline-Tests. Die korrigierten Werte sichert ein Regressionstest (test_stale_tool_counts_do_not_reappear) ab.

  • HinzugefügtFunktioniertVier statische Lighthouse-Audits ergänzt, die weder Browser noch externe API brauchen

    (#59)…

    Ergänzt: vier statische Lighthouse-Audits, die weder Browser noch Drittanbieter-API brauchen (#59): MISSING_CHARSET, MISSING_DOCTYPE, VIEWPORT_MISSING und NO_COMPRESSION. Jeder wird aus Belegen berechnet, die ein Crawl bereits hat. content_encoding, meta_charset, doctype und viewport gehören jetzt zum normalisierten Spaltenvokabular. Ein SF-Export, der sie als Custom-Extraction-Spalten enthält, speist damit dieselben Prüfungen. Die Registry wächst von 114 auf 118 Prüfungen.

  • GeändertFunktioniertDie zehn verbleibenden Crawler-Einstellungen angebunden: validiert, ins Run-Manifest

    geschrieben und beschrieben, aber von keinem Code gelesen…

    Die zehn verbleibenden Crawler-Einstellungen sind jetzt angebunden. Sie waren validiert, standen im Run-Manifest und wurden von --config-help beschrieben, aber von keinem Code gelesen (#63). limits.max_response_bytes, speed.max_delay_seconds, robots.user_agent_token und speed.stop_after_consecutive_timeouts steuern jetzt ein Verhalten, das vorher fest codiert war. robots.unavailable_means_stop bestimmt, ob eine nicht erreichbare oder mit 5xx antwortende robots.txt den Crawl stoppt oder als uneingeschränkt gilt. Bisher stoppte eine nicht erreichbare robots.txt den Crawl unabhängig von der Richtlinie, eine mit 5xx dagegen immer. Jetzt gelten beide Fälle als „nicht verfügbar“ und werden über diese Einstellung gesteuert. limits.max_url_length, limits.max_query_variants_per_path, http.retry_on_timeout und discovery.follow_nofollow sind neu implementierte Funktionen. http.user_agent wird jetzt in echten Requests verwendet, statt immer den Standard-User-Agent des Toolkits zu senden. crawl-describe-settings (CLI) und seo_crawl_describe_settings (MCP) sind neu, damit ein Agent die Konfiguration ohne Dateisystem erkennen kann (#23).

  • HinzugefügtFunktioniertBenutzerdefinierte Suche (tools/custom_search.py) und Extraktion…

    Ergänzt: benutzerdefinierte Suche (tools/custom_search.py) und benutzerdefinierte Extraktion (tools/custom_extract.py) auf einem bereits gecrawlten Korpus. Es gibt Filter für Vorhandensein und Fehlen (Rohquelltext, sichtbarer Text, ein benanntes CSS-Element oder ein XPath-Knoten) sowie Extraktoren über CSS, XPath und Regex. Beide melden, gegen welche Darstellung sie liefen: statisches Markup oder gerendertes DOM. Fehlen wird ehrlich gezählt. Eine Seite, deren Abruf fehlschlug, fließt weder in den Zähler noch in den Nenner ein, statt als fehlend gezählt zu werden. Jedes Paar aus Dokument und Extraktor läuft unter einem Zeitbudget (Wanduhr, SIGALRM auf POSIX). Ein pathologischer Ausdruck bricht nur das jeweilige Dokument ab, der Lauf endet trotzdem.

  • HinzugefügtFunktioniertKlassifizierung der Linkposition ergänzt (tools/link_position.py)…

    Ergänzt: Klassifizierung der Linkposition (tools/link_position.py) als nav, header, sidebar, footer oder content. Grundlage ist eine geordnete Regel über den Vorfahrenpfad eines Links. Dabei wird der Begriff von Inhalt aus content_area.py übernommen, statt einen zweiten zu erfinden. Verdrahtet ist das in der Linkerfassung von crawl/spider.py, hinter link_position.classify (Standard aus, denn eine Position pro Link kostet bei großen Crawls Speicher). Site-weit aggregiert crawl/linkgraph.py die Werte über inlink_composition. Das speist einen neuen Befund INLINK_BOILERPLATE_ONLY für Seiten, die nur aus dem Boilerplate verlinkt sind. Die Registry wächst von 104 auf 105 Prüfungen.

  • HinzugefügtFunktioniertAcht Nachberechnungen nach dem Crawl ergänzt, die erst nach Abschluss eines Crawls

    beantwortbar sind…

    Ergänzt: acht Nachberechnungen, die erst nach Abschluss eines Crawls beantwortbar sind (Issue #15). Die interne Link-Bewertung wird aus dem Kantengraphen all_inlinks berechnet (LOW_LINK_SCORE). Dazu kommen ein Canonical-Ziel, auf das kein Hyperlink zeigt (UNLINKED_CANONICAL); die Erkennung von rel="next"-Schleifen und nicht verlinkten Serien (PAGINATION_LOOP, UNLINKED_PAGINATION_SERIES); die Reziprozität von hreflang (HREFLANG_MISSING_RETURN_LINK); Aggregate der Linkzusammensetzung (ONLY_NOFOLLOW_INLINKS, ONLY_NONINDEXABLE_SOURCE_INLINKS); der konkrete kürzeste Entdeckungspfad ab dem Crawl-Startpunkt (DEEP_DISCOVERY_PATH); ein selbst berechneter Fallback für Mixed Content (INSECURE_SUBRESOURCE); und das Clustering von Near-Duplicates aus gespeichertem Seitentext (NEAR_DUPLICATE/DUPLICATE_BY_HASH). Damit sind tools/duplicate.py und tools/content_area.py erstmals in das Audit eingebunden. ORPHAN_PAGE, SITEMAP_ORPHAN und die beiden neuen Prüfungen zu nicht verlinkten Seiten werden zurückgehalten. Bei einem Crawl, den der Aggregator als unvollständig markiert, erscheinen sie als benannter Skip statt als Befund, denn bei einem abgeschnittenen Crawl lässt sich „nichts verlinkt hierher“ nicht beweisen. Die Registry wächst von 104 auf 114 Prüfungen.

  • GeändertFunktioniertDie Crawl-Registry gegen eine externe Technical-SEO-Checkliste geprüft und acht günstige,

    verifizierte Lücken geschlossen…

    Die Crawl-Registry wurde gegen eine externe Technical-SEO-Checkliste geprüft. Dabei wurden acht günstige, verifizierte Lücken geschlossen: fünf hreflang-Prüfungen (ungültige Sprach- und Regionscodes, fehlende Selbstreferenz, fehlendes x-default, doppelte Einträge und nicht kanonische Ziele), zwei robots-Direktiven (notranslate und unavailable_after) sowie kanonische URLs mit Fragment. Die Registry wächst von 96 auf 104 Prüfungen. Siehe docs/CHECKLIST_AUDIT.md.

  • HinzugefügtFunktioniertasset-weight-check ergänzt: lädt die verlinkten CSS- und JS-Dateien einer Seite und

    meldet renderblockierende Ressourcen…

    Ergänzt: asset-weight-check lädt die verlinkten CSS- und JS-Dateien einer Seite und meldet renderblockierende Ressourcen, übergroße Dateien, doppelte Bibliotheken (per Content-Hash), fehlende Minifizierung, fehlendes font-display, JS mit veralteten Polyfills sowie fehlende Komprimierung und langlebiges Caching.

  • HinzugefügtFunktioniertcrawl-site --sitemap <url> ergänzt (und sitemaps.auto_discover in --config): Der

    native Crawler startet aus den deklarierten URLs einer Sitemap…

    Ergänzt: crawl-site --sitemap <url> sowie sitemaps.auto_discover in --config. Der native Crawler startet dabei mit den in einer Sitemap deklarierten URLs und folgt von dort den Links. Die deklarierte und die beobachtete Menge werden abgeglichen und in summary.sitemap der audit.json geschrieben. Dafür gelten dieselben Prüf-IDs SITEMAP_ORPHAN und URL_NOT_IN_SITEMAP wie in der Screaming-Frog-Pipeline.

  • HinzugefügtFunktioniertcrawl-site --config-help ergänzt, generiert aus seohead/crawl/config.py, und zwei

    alte Flags aus der Hilfe ausgeblendet…

    Ergänzt: crawl-site --config-help, generiert aus seohead/crawl/config.py. Die Optionen --max-depth und --min-delay sind aus --help ausgeblendet, werden aber weiterhin akzeptiert. So wächst die Liste der Flags nicht mehr mit jeder Crawler-Einstellung.

  • GeändertFunktioniertTechnologie-Fingerprinting in einen Abruf-Schritt und einen reinen Schritt analyze_tech

    aufgeteilt…

    Das Technologie-Fingerprinting ist jetzt in einen Abruf-Schritt und einen reinen Schritt analyze_tech aufgeteilt. Analytics- und Tag-Manager-IDs werden erfasst statt nur ihrer Namen. Neu ist der Bericht tag_coverage. Er gruppiert das Vorkommen nach URL-Template und vermerkt zu jeder Seite, wie sie gemessen wurde.

  • GeändertFunktioniertWeiterleitungsketten und -schleifen als zweiter Durchgang über die eigenen

    Weiterleitungsziele eines abgeschlossenen Crawls auflösen…

    Weiterleitungsketten und -schleifen werden jetzt als zweiter Durchgang über die eigenen Weiterleitungsziele eines abgeschlossenen Crawls aufgelöst. REDIRECT_CHAIN und REDIRECT_LOOP brauchen damit keinen nativen Redirect-Chains-Bericht von Screaming Frog mehr. Ein Export im Light-Profil oder ein Lauf von crawl-site liefert dieselben Befunde.

  • HinzugefügtFunktioniertKonfigurierbarer Inhaltsbereich (content_area.py) ergänzt, der die Wortanzahl auf den

    Hauptbereich begrenzt…

    Ergänzt: ein konfigurierbarer Inhaltsbereich (content_area.py). Er begrenzt die Wortanzahl auf den Hauptbereich und schließt standardmäßig Navigation und Footer aus. Die Linkfindung ist davon nicht betroffen. Die gewählte Strategie wird pro Seite ausgewiesen.

  • GeändertFunktioniertExakte und Near-Duplicates in duplicate.py getrennt: exakte Treffer werden aus dem

    extrahierten Text gehasht…

    Exakte und Near-Duplicates werden in duplicate.py getrennt. Exakte Treffer werden aus dem extrahierten Text gehasht, nicht aus den Rohbytes, und aus den Near-Duplicate-Clustern ausgeschlossen. Vergleiche berücksichtigen standardmäßig nur indexierbare Seiten.

  • HinzugefügtFunktioniertBericht zur Konsistenz des Boilerplates (boilerplate_report.py) ergänzt, der Header,

    Navigation und Footer pro Seite hasht…

    Ergänzt: ein Bericht zur Konsistenz des Boilerplates (boilerplate_report.py). Er hasht Header, Navigation und Footer pro Seite und markiert Template-Gruppen, die nur eine Minderheit bilden.

  • HinzugefügtFunktioniertAbhängigkeitsfreie Markdown-Extraktion (markdown_extract.py) ergänzt: nur der

    Inhaltsbereich…

    Ergänzt: abhängigkeitsfreie Markdown-Extraktion (markdown_extract.py). Sie bietet eine Ausgabe nur des Inhaltsbereichs und eine Ausgabe des gesamten Dokuments.

  • GeändertFunktioniertmarkdown_extract und boilerplate_report in CLI und MCP eingebunden, als…

    markdown_extract und boilerplate_report sind jetzt in CLI und MCP eingebunden, als markdown-extract/seo_markdown_extract und boilerplate-report/seo_boilerplate_report. Damit stehen 47 Kern-Tools bereit, vorher 45. Außerdem hat seo_duplicate_check jetzt das Flag only_indexable in der MCP-Signatur, das duplicate_check auf Handler-Ebene schon hatte. In der MCP-Signatur war es übersehen worden. Der URL-Pfad von citability-check wurde neu auf die Markdown-Ausgabe aus markdown_extract des Inhaltsbereichs umgestellt. Bisher lief er über das Feld text des Parsers, also über das gesamte Dokument als eine zusammengefasste Zeile ohne Absatz- oder Überschriftenumbrüche. Das behebt zwei Probleme. Erstens die Verwässerung durch Boilerplate, auf die das Issue hinwies. Zweitens einen latenten Fehler: Der flache Text ließ die Dimensionen „Answer-Blocks“ und „Structure-Quality“ bei jeder Live-URL stillschweigend auf null fallen. Bewusst nicht umgestellt wurden zwei Stellen. Erstens das Feld text des Parsers selbst, das weiterhin das gesamte Dokument umfasst. page_facts.py extrahiert daraus Schema-Belege wie sameAs-Links zu Social-Media, Breadcrumbs sowie Preis- und Bewertungs-Regexe. Diese Fakten stehen legitim in Header- und Footer-Widgets, die der Inhaltsbereich ausschließt. Zweitens die von Screaming Frog getriebenen Prüfungen THIN_CONTENT und LOW_TEXT_RATIO in sf/core/rules.py. Deren word_count und text_ratio stammen aus den Exportspalten von Screaming Frog, also aus Drittanbieterdaten. Das Toolkit hat dafür kein Roh-HTML. Eine Umstellung würde jede Seite erneut abrufen und damit das Design des SF-Audits als Offline-Korpus ohne Requests zunichtemachen. Der eigene Crawler des Toolkits (crawl-site) übernimmt die Begrenzung auf den Inhaltsbereich ohnehin, weil seine Wortanzahl direkt aus parser.parse_html gelesen wird.

  • GeändertFunktioniertNamenskonvention festgehalten (docs/NAMING.md) und Kollisionen bei Modul-Basenamen

    aufgelöst…

    Eine Namenskonvention ist in docs/NAMING.md festgehalten. Die dabei gefundenen Kollisionen bei Modul-Basenamen und die prozessbenannten Testdateien sind aufgelöst. Kein CLI-Befehl, kein Handler und kein MCP-Tool-Name hat sich geändert.

  • HinzugefügtFunktioniertOnboarding-Dateien für Community, Zitation und Agenten ohne Schlüssel ergänzt.
  • HinzugefügtFunktioniertDen berechtigungspflichtigen Workflow-Skill analytics-console-review ergänzt und drei

    praxisnahe Rezepte…

    Ergänzt: der berechtigungspflichtige Workflow-Skill analytics-console-review und drei praxisnahe Rezepte.

  • GeändertFunktioniertUnterstützung der aktuellen Sicherheitslinie 3.x dokumentiert.
  • GeändertFunktioniertTLS 1.2 oder neuer verlangt, direkte Zertifikatsprüfungen auf vorvalidierte öffentliche…

    TLS 1.2 oder neuer ist jetzt Pflicht. Direkte Zertifikatsprüfungen sind auf vorab validierte öffentliche Adressen festgelegt.

  • HinzugefügtFunktioniertHTTP-Antwort-Cache für crawl-site ergänzt (seohead/crawl/cache.py, opt-in über…

    Ergänzt: ein HTTP-Antwort-Cache für crawl-site (seohead/crawl/cache.py). Er ist opt-in über cache.mode. Der Standard ist off, damit sich hinter einem Default kein Seiteneffekt verbirgt. Umgesetzt sind echte HTTP-Frischelogik (max-age/Expires, Revalidierung über ETag/Last-Modified, Vary-bewusste Varianten, no-store/no-cache werden beachtet). Ein Modus replay zum Debuggen wird im Manifest vermerkt und ist nie der Standard. Das Flag invalidate erzwingt einen expliziten harten Refresh. Jede abgerufene Seite trägt cache_status (hit/revalidated/miss). Der Lauf trägt cache_stats und cache_replay sowohl im Handler-Output als auch im run-Block der audit.json. So sagt ein Bericht, der teilweise aus dem Cache stammt, das auch. Ein Cache-Treffer kostet keinen Request und verbraucht auch keine Drosselungsverzögerung und keinen Slot des Dispatch-Gates für Parallelität. Die Wartezeit wird erst in fetch_one selbst ausgelöst, wenn tatsächlich ein echter Netzwerk-Roundtrip bevorsteht.

  • HinzugefügtFunktioniertJournal-gesteuerte Wiederverwendung in seohead/core/runlog.py ergänzt

    (SEOHEAD_REUSE_POLICY, ein Höchstalter pro Tool…

    Ergänzt: journal-gesteuerte Wiederverwendung in seohead/core/runlog.py. SEOHEAD_REUSE_POLICY setzt ein maximales Alter in Sekunden pro Tool. Standardmäßig ist es leer, dann wird nie etwas wiederverwendet. Eine konfigurierte, noch frische und erfolgreiche frühere Antwort wird zurückgegeben, statt das Tool erneut aufzurufen. Sie ist mit reused: true und reused_from_ts markiert, sowohl im Ergebnis als auch im neuen Journal-Eintrag, den der Lauf weiterhin schreibt. Die Frische wird immer ab dem Zeitpunkt gemessen, an dem der Wert tatsächlich abgerufen wurde. Die Wiederverwendung selbst verlängert sie nie.

Release

3.0.0

Erster öffentlicher Snapshot30. August 2026
10 Einträge · Erster öffentlicher Snapshot10 geändert

30. August 2026

10 geändert
  • GeändertFunktioniertEin Python-Paket mit 42 gemeinsamen CLI- und MCP-Tools.
  • GeändertFunktioniertFünf zusätzliche Screaming-Frog-MCP-Tools und ein Crawl-Analyzer mit 96 Prüfungen.
  • GeändertFunktioniertRecon für Domain, CDN, Technologie, Sicherheit, Spiegel, Regionen, Bots und Backlinks.
  • GeändertFunktioniertSchema.org-Validierung und Generierung zusammenhängender Graphen.
  • GeändertFunktioniertBegrenzte sitemapbasierte Site-Belege sowie Berichte als XLSX, DOCX, CSV, Markdown und

    JSON.

  • GeändertFunktioniertOptionale Integrationen für Wordstat, Yandex-SERP, Arsenkin, Metrika und DataForSEO.
  • GeändertFunktioniert21 technische Workflow-Skills und sieben mitgelieferte SEO-Playbooks.
  • GeändertFunktioniertLokales stdio-MCP und Docker-Unterstützung; keine GUI, keine gehostete API, keine

    Telemetrie.

  • GeändertFunktioniertEvidenzgestütztes öffentliches README mit reproduzierbaren synthetischen Visuals zu

    Audit, Aufgaben, Oberfläche und Berichten.

  • GeändertFunktioniertÖffentliche Release-Grenze ohne Git-Historie und explizite Hinweise zu

    Drittanbieter-Software.

Datum = der Tag, an dem die Änderung landete (Git-Datum des changelog.d/-Fragments). Nummer = das geschlossene Issue. Titel = erster Satz, Details per Klick.