Changelog
Was sich in SpiderHead geändert hat, Release für Release. Jeder Eintrag nennt die Art der Änderung und ob sie heute funktioniert.
Unreleased
Seit 3.1.065 Einträge22. Oktober 2026
7 geändert2 behobenGeändertFunktioniertA results difference between two scans can now be attributed.#1529
The new read-only
#1529 (Issue auf GitHub)scan-config-diff(CLIseohead scan-config-diff --before a.sqlite --after b.sqlite, MCPseo_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 ashttp.headerscompares as one leaf, exactly as the manifest records it.GeändertFunktioniertA native crawl now measures its own reading level.#1516
The new
#1516 (Issue auf GitHub)checks.readabilitymodule 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, versionflesch-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.BehobenFunktioniertCrawls on hosts that enforce https no longer spend a redirect hop on every http URL.#1484
The new opt-in
#1484 (Issue auf GitHub)http.upgrade_to_httpssetting 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 carriestransport_upgraded: truein its record (persisted aspages.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.GeändertFunktioniertA crawl started deep can now stay in its own subtree.#1481
The new
#1481 (Issue auf GitHub)scope.start_folder_onlytoggle admits only URLs at or below the start URL's path folder: a crawl started at/blog/postwalks/blog/and everything under it, and links pointing above the folder are counted as unfollowed evidence (excludedunderoutside_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 incrawl-describe-settings. With the toggle off nothing changes.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
#1486 (Issue auf GitHub)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 newROBOTS_BLOCKED_OUTLINKfinding (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: underreport_onlythe same targets are reported (they would have been blocked), and underignorethe 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.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
#1518 (Issue auf GitHub)alt, so anchor-text review treated every image link as unnamed. The parser now records that alt as the link's anchor with ananchor_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 reportsnullthere rather than a false text-derived answer.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
#1530 (Issue auf GitHub)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 settingdiscovery.record_invalid_targetsrecords 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 newINVALID_LINK_TARGETcheck turns the pages that have them into findings with the raw values as evidence. A missing href and a pure in-page#anchorare 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.GeändertFunktioniert
HEADING_SKIPnow flags heading-order jumps in both directions, completing the#1545heading-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
#1545 (Issue auf GitHub)axe.heading_orderbehaviour the check was modelled on. Evidence rows carry from/to levels and texts for both directions.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 behobenGeä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ändertGeändertBetaDas CLI-Paket
seoheadist in Fachmodule aufgeteilt.#1514
#1514 (Issue auf GitHub)cli/_shared.pyenthält die Befehlsregister und Eingabehilfen.checks_cmds,project_cmds,scan_cmds,crawl_cmds,sources_cmds,reports_cmdsundmisc_cmdsenthalten je ihren Teil der bisherigen kwarg-Zuordnung auscli/__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--helpbleibt für jeden Befehl byte-identisch.GeändertBetaMCP-Handler wandern in ein eigenes Handler-Paket.#1514
Die Server-Handler liegen jetzt in
#1514 (Issue auf GitHub)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.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ändertGeä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ändertGeä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
#1347 (Issue auf GitHub)scan-graphstatt 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-Befehlscan-exportfü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.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
#1347 (Issue auf GitHub)crawl-site --scan-outundscan-url-queryangebunden. 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“.
12. Oktober 2026
8 hinzugefügt10 geändert2 behobenBehobenFunktioniertFix: 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
#1343 (Issue auf GitHub)--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.GeändertFunktioniertBenannte Crawl-Profile lassen sich als validiertes JSON prüfen, über
seo_crawl_site#1299auswählen und als Projektstandard setzen…
Benannte Crawl-Profile lassen sich als validiertes JSON prüfen, über
#1299 (Issue auf GitHub)seo_crawl_siteauswä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 normalisierenutm_*- undfbclid-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.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
#979 (Issue auf GitHub)doctorund ein MCP-Tool für lokale Voraussetzungen.seohead --versiongibt die Paketversion aus. - Neu sind revisionsbewusste, opake bedingte Lesevorgänge fürproject-observeundproject-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.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_disabledund Registersummen in#1296gespeicherten Scan-Nachweisen…
Gespeicherte Projekt-Scan-Nachweise enthalten exakte Zustände
#1296 (Issue auf GitHub)checks_run,checks_skipped,checks_disabledund 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.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
#1295 (Issue auf GitHub)headers-analyzefü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 überscan-link-inspect --view pathverfügbar. -scan-link-inspect --view links --preset inlinks|broken_linksliefert 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.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
#1303 (Issue auf GitHub)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.
11. Oktober 2026
16 geändertGeä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
#1304 (Issue auf GitHub)scan.v1zu 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-blocksliefert 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.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
#1307 (Issue auf GitHub)true. Truthy-Strings oder Ganzzahlen erlauben keinen Embedding-Aufruf.GeändertFunktioniertInbox-Referenzen akzeptieren Ziel-IDs (
inbox:<uuid>), damit eine Notiz das betroffene#1314Ziel zitieren kann. - Checklisten-Punkte, die nie versucht wurden und manuell sind, zeigen den Status
#1314 (Issue auf GitHub)not_runstattreview. Nur ein Versuch, der auf eine Entscheidung wartet, bleibt beireview. - Das Read-Modell Issues (Nachweise ausobserve) meldet Zählungen je Prüfung (by_check) und einennext_offsetnach den ersten 20 Befunden.findings_pageblättert durch den Rest.GeändertFunktioniertGeplante Projekt-Scans (#1322, Core):
schedule.jsonim Verzeichnis jedes Projekts hält#1322den eigenen Zeitplan der Seite…
Geplante Projekt-Scans (#1322, Core):
#1322 (Issue auf GitHub)schedule.jsonim 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-Modusspider,sitemapoderlist, 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 überschedule-set/seo_schedule_setmitexpected_revisionbearbeitet.schedule-showzeigt den Fälligkeitsstatus des Hauptprojekts und der verknüpften Wettbewerber sowie den nächsten Lauf.schedule-run-dueist 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-installundschedule-uninstallschreiben 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,perplexitybotsowie Desktop- und Mobil-Browser) oder ein eigener String. Der Standard ist jetztSpiderHeadBot/<version> (+https://github.com/PavloSEO/spiderhead), und die Zuordnung der robots.txt-Gruppen nutzt dieselbe Kennung. Seiten, die bisher der robots-GruppeSEOHEAD-Toolsentsprachen, müssenSpiderHeadBotin ihren Regeln nennen.GeändertFunktioniert
workflow-startbraucht nur ein angenommenes Owner-Ziel:--goal-id(oder#1314
#1314 (Issue auf GitHub)context.goal_id) reicht aus. Der registrierte Prompt ist standardmäßigskill: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 inseohead workflow-start --helpdokumentiert. - Checklisten-Populationen akzeptieren unvollständige Objekte: Nurkindundsourcesind 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.xmldes Ursprungs zurück, wenn robots.txt keine Sitemap deklariert. Ein fehlender Fallback wird als unvollständig vermerkt, unterbricht den Crawl aber nicht.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
#1314 (Issue auf GitHub)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.GeändertFunktioniertDie Checklisten-Abdeckung bindet gestreamte audit.v2-Berichte:
report-build --projectund die Berichtsausgabe…
Die Checklisten-Abdeckung im Projekt bindet jetzt gestreamte audit.v2-Berichte.
report-build --projectundaudit-workflow --action reporthä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 --inputakzeptiert den Schlüsselformat.report-build --project --format jsonbei einem gestreamten Audit wird mit einer Begründung abgelehnt, weil das JSON unverändert geschrieben wird und den Checklisten-Snapshot nicht tragen kann.
Roadmap
108 offenOffene Meilensteine auf GitHub. Jede Zeile ist ein offenes Issue: geplante Arbeit, noch nicht ausgeliefert.
Desktop-Grundlagen
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
UX-Muster auf Augenhöhe: Tabs, Spalten pro Filter, Drill-down aus der Übersicht, gespeichertes Layout (Epic #1522)
- HinzugefügtGeplantEin gemeinsamer Aktivitätsstatus für alle Fenster und Bedienelemente#1496 (Issue auf GitHub)
- HinzugefügtGeplantAnwendungsmodi, die die gesamte Oberfläche umkonfigurieren#1490 (Issue auf GitHub)
Crawl-Engine
Höflichkeit und Robots-Regeln, Wiederholungen, Budgets, URL-Erkennung, Speicher im großen Maßstab, Scan-Lebenszyklus (Epic #1520)
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ügtGeplantAutomatische Obergrenze für parallel gerenderte Seiten nach verfügbarem Arbeitsspeicher#1480 (Issue auf GitHub)
- HinzugefügtGeplantShadow-DOM- und iframe-Inhalte in die Rendering-Erfassung einbeziehen#1477 (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ü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ügtGeplantVertrauenswürdige benutzerdefinierte CA-Zertifikate für gecrawlten Traffic#1442 (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ü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
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ügtGeplantBenutzerdefinierte Extraktion mit mehreren Engines und Validierungsstatus#1513 (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ü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ü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ü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ü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ü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
Workflows für Website-Verantwortliche: Aufgaben, Exporte, geplante Berichte und ihre Zustellung (Epic #1314)
Rebranding
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
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
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
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
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)
3.1.0
Erstes getaggtes Release nach der Umbenennung von SEOHEAD Tools11. Oktober 2026455 Einträge · Erstes getaggtes Release nach der Umbenennung von SEOHEAD Tools138 hinzugefügt275 geändert42 behoben
11. Oktober 2026
5 hinzugefügt54 geändert2 behobenGeä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.jsonim Projektverzeichnis enthält den#1322Zeitplan (Wochentage und/oder Tage des Monats, ein Zeitfenster in der Zeitzone der Website, Aktivierung und Deaktivierung, Konkurrenten, Crawl-Modus
#1322 (Issue auf GitHub)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 überschedule-set/seo_schedule_setmitexpected_revision.schedule-showzeigt den letzten Lauf und das nächste fällige Zeitfenster.schedule-run-dueist ein Headless-Einstiegspunkt, der nur fällige Scans ausführt, Überschneidungen über ein Lease verhindert und jede Entscheidung im Projekt-Journal festhält.schedule-installundschedule-uninstallschreiben bzw. entfernen einen launchd-plist, eine Cron-Zeile oder einen Task-Scheduler-Befehl nur auf ausdrücklichen Aufruf.GeändertFunktioniertCrawl-User-Agents (#1322): Voreinstellungen (
spiderhead,googlebot,#1322
#1322 (Issue auf GitHub)googlebot-desktop,googlebot-smartphone,bingbot,yandexbot,yandexmobilebot,baiduspider,duckduckbot,applebot,gptbot,claudebot,perplexitybotsowie Desktop- und mobile Browser) oder eine eigene Zeichenkette. Der Standard ist jetztSpiderHeadBot/<version> (+https://github.com/PavloSEO/spiderhead), und die Zuordnung der robots.txt-Gruppen nutzt dieselbe Kennung. Websites, die der bisherigen robots-GruppeSEOHEAD-Toolsentsprachen, müssenSpiderHeadBotin ihren Regeln nennen.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:
#1314 (Issue auf GitHub)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; oderunmeasured, wenn der Audit die Prüfung gar nicht erwähnt. Ein nicht gemessener Punkt behält seinen bisherigen Eintrag und wird inchecklist_evidencenamentlich aufgeführt, zählt also nie als 0. Schlägt ein Crawl fehl oder wird er unterbrochen, markiert er seine automatischen Prüfungen alsfailedmit dem Fehlergrund. Derselbe Aufzeichnungspfad bedient jetzt auch den Ablaufprepare, der bisher eine eigene Kopie der Schleife hatte. Ein Projekt mit nicht initialisierter Checkliste wird unter Angabe des Grundes übersprungen.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
#1314 (Issue auf GitHub)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.GeändertFunktioniertKonkurrenz-Kandidaten lassen sich über die CLI erfassen, auflisten und entfernen…#1314
Konkurrenz-Kandidaten lassen sich über die CLI (
#1314 (Issue auf GitHub)project-competitors-add,project-competitors-list,project-competitors-remove) und die passenden MCP-Toolsseo_project_competitors_*erfassen, auflisten und entfernen. Jeder Kandidat behält die URL so, wie sie eingegeben wurde, einschließlich eineswww-Hosts. www- und nackte Hosts gelten bei Dublettenprüfungen als dieselbe Website. Ein Konkurrent mitwww-Host bricht die Vorbereitung nicht mehr ab und lässtproject-observenicht mehr fehlschlagen.GeändertFunktioniert
--max-urlsist jetzt das Seitenbudget des Crawls: Ein explizites Seitenbudget füllt#1314nicht gesetzte Budgets…
#1314 (Issue auf GitHub)--max-urlsist 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 ohneapprove_large_crawlzugelassen werden. Budgets oberhalb der Projektschwellen werden weiterhin abgelehnt.GeändertFunktioniertEin bewusster Stopp wegen des URL-Budgets wird als abgeschlossene Erfassung mit#1314
#1314 (Issue auf GitHub)finish_reasonstopped_by_budgetund einer Zeitfinished_atgespeichert, statt alsinterruptedohne Endzeit. Die noch wartenden URLs bleiben für eine Fortsetzung erhalten.GeändertFunktioniertKonkurrenz-URLs behalten den Host so, wie eingegeben (zum Beispiel bleibt
www.#1314erhalten), 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.
#1314 (Issue auf GitHub)duplicate-checkmarkiert einen Lauf ohne verglichene Paare als nicht gemessen. Seitenübergreifende Template-Befunde (gleiche Kopfüberschrift, geringer Textanteil) sind ein einziger Befund mit Seitenanzahl (#1314).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
#1314 (Issue auf GitHub)coverage.jsonab. Eingebaute Zeilen werden bei Bedarf hinzugefügt, sobald eine davon berührt wird.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#1314Ziel zitieren kann…
Inbox-Verweise akzeptieren Ziel-IDs (
#1314 (Issue auf GitHub)inbox:<uuid>), damit eine Notiz das Ziel zitieren kann, das sie betrifft.GeändertFunktioniertNie versuchte manuelle Checklisten-Punkte zeigen den Status
not_runstatt review…#1314Nie versuchte manuelle Checklisten-Punkte zeigen den Status
#1314 (Issue auf GitHub)not_runstattreview. Nur ein Versuch, der auf eine Entscheidung wartet, bleibt inreview.GeändertFunktioniertDas Issues-Lesemodell (Belege der
observe-Befunde) meldet Zähler je Prüfung#1314(
#1314 (Issue auf GitHub)by_check) und einennext_offsetnach den ersten 20 Befunden.findings_pageblättert durch den Rest.GeändertFunktioniertNative Crawl-Prüfungen (#1314): Die Bildgröße (
IMG_OVER_KB) wird jetzt aus den eigenen#1314Bildabrufen des Crawls gemessen, der Sitemap-Status (
#1314 (Issue auf GitHub)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_DIMENSIONSundHREFLANG_ERRORweisen 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.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
#1314 (Issue auf GitHub)log.mdgeschrieben. Der Core erfasst automatisch Einträge für abgeschlossene Crawls (scans), erstellte Projektberichte und Checklisten-Versuche (agent). Die Einträge landen inevents.jsonlund werden vonproject-event-pagegelesen. Die automatischen Hooks lassen den Crawl, Bericht oder Checklistenschritt, den sie beschreiben, nie fehlschlagen.project-event-appendundseo_project_event_appendbehalten ihre Schnittstelle und erhalten die Zeile inlog.md.GeändertFunktioniertDer native Crawl speichert jetzt die Sicherheits-Header, die die Prüfungen auswerten#1314
(
#1314 (Issue auf GitHub)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 alsDUPLICATE_SECURITY_HEADERgemeldet.GeändertFunktioniert
workflow-startbraucht nur ein angenommenes Inhaber-Ziel:--goal-id(oder#1314
#1314 (Issue auf GitHub)context.goal_id) genügt. Der registrierte Prompt ist standardmäßigskill: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 inseohead workflow-start --helpdokumentiert.GeändertFunktioniertChecklisten-Populationen akzeptieren unvollständige Objekte: Nur
kindundsourcesind#1314Pflicht, und…
Checklisten-Populationen akzeptieren unvollständige Objekte: Nur
#1314 (Issue auf GitHub)kindundsourcesind Pflicht, die übrigen Schlüssel sind standardmäßig nicht gesetzt. Eine abgelehnte Population nennt ihre fehlenden oder unbekannten Schlüssel.GeändertFunktioniertNative Projekt-Crawls greifen auf die
/sitemap.xmldes Ursprungs zurück, wenn#1314robots.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
#1307 (Issue auf GitHub)true; Zeichenketten oder Zahlen, die nur wahr wirken, lösen nie einen Embedding-Aufruf aus.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
#1304 (Issue auf GitHub)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.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
#1304 (Issue auf GitHub)scan-structured-blocksausgeliefert. 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.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
recordakzeptiert jetzt eine erfolgreiche automatische Prüfung, derengespeicherter Scan ein gestreamter audit.v2-Scan ist. Bisher schlug der Aufruf mit
'NoneType' object is not subscriptablefehl, weil das Audit in der Begleitdatei liegt und nicht in der Legacy-Tabelle des Scans. Die akzeptierten Datensatzformen sind dokumentiert inseohead project checklist-record --help, im Schema des MCP-Toolsseo_project_checklist_recordund indocs/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 --projectund
audit-workflow --action reporthä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 --inputakzeptiert den Schlüsselformat.report-build --project --format jsonbei 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ändertGeä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ändertFunktioniert
check_sampleinseohead/checks/custom_extract.pyführt CSS-, XPath- und#1059Regex-Extraktoren aus…
#1059 (Issue auf GitHub)check_sampleinseohead/checks/custom_extract.pyführt CSS-, XPath- und Regex-Extraktoren gegen ein gespeichertes HTML-Dokument aus, ohne Scan und ohne Netzwerkanfrage. Jedes Ergebnis enthält seine Werte und einenreasonfür ein leeres Ergebnis (no_match,empty_htmloderbudget_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.GeändertFunktioniertDie Prüfung der Pagination-Reihenfolge (
PAGINATION_SEQUENCE_ERROR) bewertet jetzt#1057Schrittserien: Wenn ein Schritt…
Die Prüfung der Pagination-Reihenfolge (
#1057 (Issue auf GitHub)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,8bricht bei 5 zu 8). Unregelmäßige Offset-Schemata und unnummerierte Serien bleiben ungeprüft und werden als übersprungen benannt.HinzugefügtFunktioniertNeue Crawl-Prüfung
INTERNAL_NOFOLLOW_OUTLINKS(Hinweis): benennt jede Quellseite…#1052Neue Crawl-Prüfung
#1052 (Issue auf GitHub)INTERNAL_NOFOLLOW_OUTLINKS(Hinweis): Jede Quellseite mit internennofollow-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 bisherpartialwar. Die Prüfung läuft bei nativen Crawls und wird bei reinen Export- und URL-Listen-Durchläufen namentlich übersprungen.GeändertFunktioniertParser liest medienbezogene
<link rel="alternate">-Angaben ohnehreflang(eine…#1051Der Parser liest medienbezogene
#1051 (Issue auf GitHub)<link rel="alternate">-Angaben ohnehreflang(eine separate mobile URL) inparse_htmlalsmobile_alternatesein (#1051). Die SF-PrüfungMobile Alternate Linkist weiterhin eine Lücke, denn die Prüfung, die das Canonical der mobilen URL vergleicht, ist noch nicht geschrieben.HinzugefügtFunktioniertNeue Prüfung
HREFLANG_UNLINKED_TARGET(Warnung): ein hreflang-Alternativziel, auf das#1050kein…
Neue Prüfung
#1050 (Issue auf GitHub)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 wieUNLINKED_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.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 (
#1049 (Issue auf GitHub)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).GeändertFunktioniertSemantically Similar: Der Status bleibt
gap, die Notiz nennt jetzt den Blocker.#1041Befehl 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#1040Website mit…
Neue Prüfung
#1040 (Issue auf GitHub)INTERNAL_LINK_SPONSORED_UGC(Hinweis): Ein Link innerhalb derselben Website, derrel="sponsored"oderrel="ugc"trägt, wird mit seiner vollständigen rel-Tokenmenge gemeldet. Wie die übrigen rel-basierten Linkprüfungen braucht sielink_attributes.capture. Ohne diese Option wird sie als nicht gemessen ausgewiesen.HinzugefügtFunktioniertKern der XML-Sitemap-Erzeugung aus einem gespeicherten Scan:
select_indexablebehält#1039nur HTML-Seiten mit Status 200, die auf sich selbst kanonisiert sind, kein
#1039 (Issue auf GitHub)noindextragen und nicht per robots.txt gesperrt sind. Für jede ausgeschlossene URL wird der Grund angegeben.render_sitemapsschreibt ein<urlset>oder bei 50.000 URLs bzw. 52.428.800 Byte pro Datei mehrere Dateien plus eine<sitemapindex>. CLI- und MCP-Anbindung folgen.HinzugefügtFunktioniert
cloudflare-traffic(CLI) undseo_cloudflare_traffic(MCP): eine schreibgeschützte#1026Cloudflare-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
#1026 (Issue auf GitHub)log-analyze. Die Daten sind mitsource: cloudflare-aggregatedgekennzeichnet, 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 ausCLOUDFLARE_API_TOKENoderSEOHEAD_CLOUDFLARE_TOKEN_FILEund wird nie ausgegeben.GeändertFunktioniertInterner Evaluator für Search-Console-Befunde, noch nicht in die Berichte eingebunden:#1025
#1025 (Issue auf GitHub)seohead/checks/search_console_findings.pyverknü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.GeändertFunktioniert
crawl-enrichmeldet vier Web-Analytics-Befunde aus einer Offline-CSV mit URL als#1024Schlüssel: verwaiste URLs laut Analytics, indexierbare Seiten ohne Analytics-Daten, nicht indexierbare Seiten mit Besuchen und eine Absprungrate über 70 %. Mit den benannten Spalten
#1024 (Issue auf GitHub)--visits-columnund--bounce-columnwä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).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
#1024 (Issue auf GitHub)crawl-enrichaus einer Offline-CSV.sf rungibt sie weiterhin nicht aus.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
#1023 (Issue auf GitHub)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.GeändertFunktioniertAMP-Paarprüfungen (#1020):
AMP_NON_200,AMP_MISSING_CANONICAL,#1020
#1020 (Issue auf GitHub)AMP_MISSING_RETURN_LINK,AMP_NON_INDEXABLE_CANONICALundAMP_INDEXABLElesen 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 SpalteAMP HTML. Die übrigen zehn AMP-Regeln von SF bleiben bewusst ausgeschlossen.HinzugefügtFunktioniert
HTML_OVER_2MB: absolute 2-MB-Obergrenze für HTML-Dokumente, getrennt von…#1019Neu ist
#1019 (Issue auf GitHub)HTML_OVER_2MB, eine absolute Obergrenze von 2 MB für ein HTML-Dokument, getrennt von der medianbezogenen PrüfungLARGE_HTML. Die SF-Prüfung „HTML Document Over 2MB“ wird jetzt darauf abgebildet und nicht mehr auf die Regel mit 200 KB.HinzugefügtFunktioniertNeuer Hinweis
URL_HAS_PARAMETERSim Crawl-Audit: interne HTML-Seite, deren URL…#1018Neuer Hinweis
#1018 (Issue auf GitHub)URL_HAS_PARAMETERSim Crawl-Audit: Eine interne HTML-Seite, deren URL Query-Parameter enthält, wird unabhängig vom Canonical-Status gemeldet.URL_HAS_PARAMSbehält seine engere Bedeutung für Seiten ohne Canonical (#1018).GeändertFunktioniertRobots-Direktiven (#1017): veraltete
noodpundnoydirin Meta-Robots oder#1017X-Robots-Tag…Robots-Direktiven (#1017): Veraltete
#1017 (Issue auf GitHub)noodp- undnoydir-Angaben in Meta-Robots oderX-Robots-Tagerzeugen jetzt die HinweiseNOODPundNOYDIRim SF-Audit. Bisher standen sie auf der Liste außerhalb des Umfangs.none(noindex+nofollow) ist für denX-Robots-Tag-Pfad und für den Meta-Pfad durch Regressionstests abgedeckt.HinzugefügtFunktioniertNeue Prüfung
JS_CONSOLE_ERRORS(SF „Pages with JavaScript Errors“): Seite, deren…#1015Neue Crawl-Prüfung
#1015 (Issue auf GitHub)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 istrendering.artifacts.console_errors.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:
#1013 (Issue auf GitHub)MISSING_CSP,MISSING_X_CONTENT_TYPE_OPTIONS,MISSING_X_FRAME_OPTIONS(erfüllt durch eine CSP-Direktiveframe-ancestors) undMISSING_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.HinzugefügtFunktioniertValidator für geschlossene Spezifikationen von Seitenaktionen (
click,scroll,#1011
#1011 (Issue auf GitHub)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).GeändertFunktioniert
log-analyzeliest gzip-komprimierte Zugriffslogs (rotierteaccess.log.N.gz-Dateien#1009und…
#1009 (Issue auf GitHub)log-analyzeliest gzip-komprimierte Zugriffslogs direkt ein, also rotierteaccess.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.GeändertFunktioniert
scan-url-queryerhält fertige Ansichts-Presets (--preset, z.#1007B.
status_4xx…
#1007 (Issue auf GitHub)scan-url-querybekommt fertige Ansichts-Presets (--preset, zum Beispielstatus_4xx,title_missing,title_over_60,h1_missing,noindex_meta). Sie werden per UND mit Ihren Filtern verknüpft. Mit--export PATHund--export-format csv|xlsxschreibt der Befehl jede passende Zeile in eine neue Datei. Der Export bricht oberhalb von--export-max-rowsab (Standard: 100.000) und überschreibt nie eine vorhandene Datei.GeändertFunktioniertRegeln für Rich-Suchergebnisse aus dem Python-Code ausgelagert…#1001
Die Regeln für Rich-Suchergebnisse wurden aus dem Python-Code in
#1001 (Issue auf GitHub)seohead/data/rich_results_rules.jsonausgelagert, eine versionierte Datendatei, die mit dem Paket ausgeliefert wird. Der Wertversiondieser Datei steht alsrules_versionan jedem Ergebnis. Eine Regel ändern Sie also über die Daten, nicht über den Code.GeändertFunktioniertBewertungen für Rich-Suchergebnisse (
check_schemaund Prüfungen gespeicherter#1001Strukturdaten)…
Die Bewertungen für Rich-Suchergebnisse (
#1001 (Issue auf GitHub)check_schemaund die Prüfungen gespeicherter strukturierter Nachweise) tragen jetztrules_version. Damit nennt jedes Ergebnis den Offline-Regelstand, der es erzeugt hat.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:
#997 (Issue auf GitHub)scripts/generate_project_catalogue.py,generate_registry_inventory.py,render_readme_visuals.py,linux_lifecycle_smoke.py,capacity_watchdog.pyundprofile_million_audit.py. Indocs/README.mdsteht, was jedes davon schreibt und welche in der CI laufen (#997).HinzugefügtFunktioniertSemantic-Core-Pipeline als
seohead/semanticsmit eigener SQLite-Datenbank pro Projekt…#995Die Semantic-Core-Pipeline kommt als
#995 (Issue auf GitHub)seohead/semanticsmit 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-Toolsseo_semantics_status,seo_semantics_run,seo_semantics_mineundseo_semantics_paid(kostenpflichtige Stufen brauchenconfirm_paid=true), Louvain-Clustering hinter dem neuen Extrasemantics, der mitgelieferte Skillsemantic-coreund ein synthetisches Beispielprojekt. Anbieterkosten einer Semantik-Stufe werden im gemeinsamen Spend-Journal markiert (#995).GeändertFunktioniertGeführten Telegram-Bot-Adapter
seohead/integrations/botentfernt; Zustellbelege des#995Monitorings…
Der geführte Telegram-Bot-Adapter
#995 (Issue auf GitHub)seohead/integrations/botwurde entfernt. Die Zustellbelege des Monitorings liegen jetzt inseohead/projects/service_delivery.py(#995).GeändertFunktioniert
scan-url-queryliefertclick_depth, den kürzesten internen Linkpfad ab der Startseite#992des Scans, als Spalte, Filter und Sortierschlüssel. Seiten, die kein gespeicherter Link erreicht, haben den Wert
#992 (Issue auf GitHub)NULL(verwaiste Seiten).crawl_depthbleibt 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 mitreason_code: click_depth_unavailablefehl, statt ein falschesNULLzu melden. Der Wert wird bei jeder Abfrage aus der Tabellelinksneu 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).GeändertFunktioniert
scan-url-queryund sein MCP-Tool akzeptieren ein optionales Argumentfacets(eine#991Liste von Gruppen-IDs oder
#991 (Issue auf GitHub)all). Es liefert in einem Durchgang pro Gruppe Zählwerte über dieselben Filter:status_2xxbis5xx,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.GeändertFunktioniertProjektquellen-Bindungen, erste Stufe (#990):
project-sources-link,#990
#990 (Issue auf GitHub)project-sources-unlinkundproject-sources-list(CLI, dazuseo_project_sources_link|unlink|listüber MCP) halten fest, welche Anbieter-Ressourcen-IDs ein lokales Projekt nutzt. Die Angaben stehen insources.jsonnebenproject.json. Nur offline: keine Erkennung, kein Anbieteraufruf, keine Zugangsdaten.project.jsonwird nie umgeschrieben.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 (
#988 (Issue auf GitHub)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.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 (
#985 (Issue auf GitHub)details.path). So lässt sich bei einer Korrektur jeder Sprung benennen, der ersetzt werden muss. Bezug: #985.GeändertFunktioniertBefunde zu Weiterleitungsketten und -schleifen aus einem nativen Crawl enthalten jetzt#985
auch
#985 (Issue auf GitHub)details.inbound_links(interne Links, die noch auf die erste URL der Kette zeigen, mit Ankertexten, begrenzt auf 20) undinbound_links_count. Ohne ein Inventar aller Inlinks steht das Feld aufnull, mit Begründung. Bezug: #985.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:
#984 (Issue auf GitHub)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 indocs/PROJECTS.mdunter „Linking a semantic core“ (teilweise #984).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) undseo_provider_authmit#964
#964 (Issue auf GitHub)action=cancel(MCP) brechen einen ausstehenden Browser-Zustimmungsablauf ab.statuszeigt 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.GeändertFunktioniert
crawl-site --urls/--urls-file --projectregistriert den URL-Listen-Crawl jetzt als#962Beobachtungslauf (
#962 (Issue auf GitHub)mode=list). Er erscheint dadurch inproject-observeundproject-scansmit seinem Artefakt im Verzeichnisscans/des Projekts. Ein fehlgeschlagener Collector wird alsfailedvermerkt. Fortschritt und Wiederaufnahme von Listen-Läufen sind noch nicht abgedeckt (#962).HinzugefügtFunktioniertStrukturierte Gliederung der Playbooks:
skill-listundscenario-listliefern…#955Neu ist eine strukturierte Gliederung der Playbooks:
#955 (Issue auf GitHub)skill-listundscenario-listliefern die geordneten Schritte jedes Playbooks, undskill-showbzw.scenario-showergänzen Überschriften und Schritte. So kann ein Agent die Methode lesen, ohne Markdown zu parsen (#955). Neu sind außerdem der CLI-Befehlscenario-listund das MCP-Toolseo_scenario_list.GeändertFunktioniert
scan-content-searchmit--kind regex(MCPkind="regex") für gespeicherte Dokumente…#954
#954 (Issue auf GitHub)scan-content-searchakzeptiert--kind regex(MCPkind="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.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
#949 (Issue auf GitHub)cost_unknownundcharge_status: unknownvermerkt.spend-reportführt sie deshalb als unsicher auf und zählt sie nicht als gemessenen Aufruf ohne Kosten (#949).HinzugefügtFunktioniertNeuer Befehl
scan-structured-blocks(CLI) und MCP-Toolseo_scan_structured_blocks…#948Neu sind der Befehl
#948 (Issue auf GitHub)scan-structured-blocks(CLI) und das MCP-Toolseo_scan_structured_blocks. Für eine gespeicherte URL beschreiben sie jeden JSON-LD-Block mit seiner Quellzeile, dem Statusvalid/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.GeändertFunktioniert
crawl-siteohne Projekt teilt jetzt sein Request-Limit pro Host mit parallelen Crawls…#942
#942 (Issue auf GitHub)crawl-siteohne 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.GeändertFunktioniertcrawl-site-Profile (#941):
crawl-profile listzeigt die gespeicherten Profilnamen und…#941crawl-site-Profile (#941):
#941 (Issue auf GitHub)crawl-profile listzeigt die gespeicherten Profilnamen,crawl-profile delete NAMEentfernt eines. Beide Befehle geben JSON aus und lehnen unbekannte Namen mit der Liste der gespeicherten Profile ab.GeändertFunktioniertcrawl-site-Profile (#941):
--save-profile NAME --config FILEspeichert eine geprüfte#941Crawler-Konfiguration als benanntes Profil. Sie wird abgelehnt, wenn sie Zugangsdaten-Header enthält.
#941 (Issue auf GitHub)--profile NAMEstartet den Crawl mit dem Profil, und--setwird weiterhin darüber angewendet. Profile liegen in~/.config/seohead/crawl-profilesoder im Verzeichnis, dasSEOHEAD_CRAWL_PROFILESnennt. Auflisten und Löschen von Profilen sind in dieser Stufe noch nicht enthalten.GeändertFunktioniert
compare.v1listet jetzt Seiten, die nur auf einer Seite gecrawlt wurden (url_sets:#938only_in_before…
#938 (Issue auf GitHub)compare.v1listet 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, stehturl_sets.unprovenauf true. Das Fehlen einer URL wird dann nicht als Beweis dargestellt.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 (
#930 (Issue auf GitHub){"url": ..., "loop": true}). Er wird nicht erneut abgerufen, sodass die wiederholte URL in den gespeicherten Nachweisen sichtbar ist.final_urlzeigt weiterhin auf den letzten abgerufenen Sprung (#930).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:
#926 (Issue auf GitHub)remediation-createbzw.seo_remediation_createlegt ein neues, leeres Ledger an, das an ein Projekt gebunden ist (producer_buildmuss ein vollständiger 40-stelliger Git-SHA sein, bestehende Pfade werden abgelehnt).remediation-ingestbzw.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.GeändertFunktioniert
crawl_siteund Scan-Läufe meldeneffective_max_requests_per_secondundwarnings:#925Warnung…
#925 (Issue auf GitHub)crawl_siteund Scan-Läufe meldeneffective_max_requests_per_secondundwarnings. 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.GeändertFunktioniertStrukturiertes Projekt-Ereignisprotokoll (
events.jsonl): nur anhängbare Ereignisse mit#923Quelle, Akteur und begrenztem Text. Gelesen wird vom neuesten zum ältesten, seitenweise, mit Filtern nach Quelle und Text. Verfügbar als
#923 (Issue auf GitHub)project-event-appendundproject-event-pagein der CLI sowie alsseo_project_event_appendundseo_project_event_pageüber MCP (Issue #923).HinzugefügtFunktioniertBefehl
ai-columnund MCP-Toolseo_ai_column: erste Stufe der benutzerdefiniertenKI-Spalte…
Neu sind der Befehl
ai-columnund das MCP-Toolseo_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 bestehenrapid,ShowcaseundToolbarnicht mehr. Kyrillische Stämme werden weiterhin als Teilzeichenfolge erkannt. - Die Navigationserfassung bildet den Grundreloadaufrefresh_navigationab. Nicht zugeordnete angeforderte Gründe, etwapageBlockInterstitial, 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 seintimeoutan 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 alsok: false, statt sie auszulösen. - Der CrUX-Fehlerparser verkraftet Antwortkörper, die keine Objekte sind. - Eine unerreichbare Prüfungsqlite3 is Noneim 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 jetztseohead.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
csvmit Zeilensource,target,301Neues Redirect-Format
csv(Zeilensource,target,301, bei Bedarf in Anführungszeichen) fürgenerate_ruleund die CLI-Hilfe vonredirects-generate. Das Formatwordpress-redirectionist nicht enthalten, da seine Import-Syntax nicht verifiziert wurde (#998).GeändertFunktioniertDas Laufjournal (
runs.jsonl) wird ab einer Größengrenze rotiertDas 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 alsruns.jsonl.1erhalten. 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ändertHinzugefü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
#931 (Issue auf GitHub)scan-status,scan-url-detail,scan-link-inspectund 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überpages_status) und weisen dies im ergänzenden Feldvalidationaus ("light"oder"full"). Eine vollständige Validierung läuft auf Anforderung (full_validation: truebeiscan-statusoder--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-detailführt die Suche nach dem Weiterleitungsziel (ohne Index aufresponses.effective_url_id) innerhalb eines Budgets von 0,5 s aus und meldetresponses.redirect_target_lookupalsskipped, statt eine große Tabelle zu scannen.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(MCPseo_scan_url_query) für gefilterte Abfragen#927Neu:
#927 (Issue auf GitHub)scan-url-query(MCPseo_scan_url_query), ein reiner Lesezugriff mit serverseitigem Filtern, Sortieren und Paginieren über die gesamte Seitentabelle eines gespeicherten Scans. Die Antwort enthälttotal,filtered_total(nullplusfiltered_total_state: capped, wenn die Zählung ihr Zeitbudget überschreitet), eine Spaltenauswahl, Labels zur Scan-Abdeckung, das Formatseohead.scan-url-query.v1und in jedem Fehlerfall einen maschinenlesbarenreason_code. Pro Aufruf sind höchstens 200 Zeilen möglich. Sortierung nachurl,status_code,page_ordinaloderurl_idnutzt Indizes. Jede andere Spalte braucht einen Filter, der höchstens 100.000 Zeilen übrig lässt, sonst kommtsort_not_indexed. Der Scan wird mit leichter Identitäts- und Schemaprüfung geöffnet, nicht mit vollständiger Validierung, und nie verändert.GeändertFunktioniertPaginierte Links mit
scan-link-inspect --view links(MCPseo_scan_link_inspect)#924
#924 (Issue auf GitHub)scan-link-inspect --view links(MCPseo_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,relmit den Flags nofollow/sponsored/ugc, intern oder extern, gespeicherte Position, Attributtargetund der HTTP-Status der Gegenseite (null, wenn diese Seite nicht gescannt wurde). Filter nach Linktyp, Follow-Status, Statusklasse und Teilstring.offset/limitbis 200.total/filtered_totalsind exakt oder als gekürzt markiert. Der Scan wird schreibgeschützt ohne vollständige Validierung geöffnet. Fehler tragen einen maschinenlesbarenreason_code(url_not_found,scan_not_available,url_not_scanned,links_not_retained). Bestehende Ansichten und Felder bleiben unverändert.GeändertFunktioniertPaketstruktur neu geordnet, ohne Kompatibilitäts-Shims (
seohead.servers)Paketstruktur neu geordnet, ohne Kompatibilitäts-Shims:
seohead.serversheißt jetztseohead.mcp,seohead.toolsheißt jetztseohead.checks.seohead.botundseohead.remote_apiliegen nun unterseohead.integrations. Die CLI befindet sich im Paketseohead.cli(mitseohead.cli.terminal_progress). Die gemeinsamen Root-Module (models,graph,filesystem,runlog,verification,canonical_policy,input_contracts,job_contracts,provider_matrix) wanderten nachseohead.core, die Build-Herkunft nachseohead._build.provenance.examples/undconfig.example.jsonliegen jetzt indocs/examples/,PROVENANCE.mdundTRADEMARKS.mdindocs/legal/. Die Befehleseoheadundsf-analyzerbleiben 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 kommendocs/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), unddocs/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 behobenBehobenFunktioniertByte-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=0für unbegrenztes Sammeln#818Native SQLite-Scans akzeptieren
#818 (Issue auf GitHub)max_urls=0, um bis zur vollständigen Leerung der Warteschlange zu sammeln, undmax_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.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-observein 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 behobenHinzugefü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 behobenGeä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#818Die 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
#818 (Issue auf GitHub)docs/PDF_OVERVIEW.md.HinzugefügtFunktioniertSchreibgeschützte GA4-Operation
page_viewsfür Seitenaufrufe#782Neue schreibgeschützte GA4-Operation
#782 (Issue auf GitHub)page_viewsfü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.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ändertGeä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 behobenHinzugefü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_assignmentfür deklarierte#878Template-/Komponenten-URL…
Optionale Aufgabengruppierung über
#878 (Issue auf GitHub)check_assignmentfü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.HinzugefügtFunktioniertOptionale Release-Vergleichskarten
url-correspondence.v1mit deklarierten Ursprüngen#877und URL-…
Neue, optionale Release-Vergleichskarten
#877 (Issue auf GitHub)url-correspondence.v1mit deklarierten Ursprüngen und URL-Paaren, Ablehnung bei Kollisionen, Herkunftsnachweisen für Seitendaten und Ausgabe alsrelease_review.v1.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-#837oder Staging-Zugriff verlangen…
Vor jedem Token, Dataset-Check oder Staging-Schreibvorgang ist eine separate, vom Host verwaltete
#837 (Issue auf GitHub)cost_authorized-Freigabe für BigQuery erforderlich.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 (
#836 (Issue auf GitHub)examples/reporting-pack/worksheets/) kommt hinzu: je eine CSV-Datei pro BI-Datensatz plus das Manifest, byte-deterministisch ausexamples/audit.jsonund 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üftscripts/generate_reporting_pack_worksheets.py --check.HinzugefügtFunktioniert
examples/reporting-pack/SETUP.mdergänzen: mechanische Anleitung für den Eigentümer zum#836Import der…
#836 (Issue auf GitHub)examples/reporting-pack/SETUP.mdergä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.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ügtFunktioniert
scan-fragment-links(seo_scan_fragment_links) und die Audit-PrüfungBROKEN_BOOKMARK#827ergänzen…
#827 (Issue auf GitHub)scan-fragment-links(seo_scan_fragment_links) und die Audit-PrüfungBROKEN_BOOKMARKwerden 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#topfü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.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ügtFunktioniert
CANONICAL_TARGET_ERRORergänzen: meldet abgerufene kanonische Ziele mit 4xx- oder#8245xx-Antwort…
#824 (Issue auf GitHub)CANONICAL_TARGET_ERRORmeldet 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 unterCANONICAL_TO_REDIRECT.HinzugefügtFunktioniert
CANONICAL_HOMEPAGE_GROUPergänzen für Gruppen aus mindestens drei abgerufenen,#824indexierbaren Seiten…
#824 (Issue auf GitHub)CANONICAL_HOMEPAGE_GROUPerfasst 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.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
#823 (Issue auf GitHub)seohead/sf/core/eeat.py. Sie melden, was ein Crawl beobachten kann, und nie einen E-E-A-T-Wert.NO_AUTHOR_BYLINEundNO_CONTENT_DATESgreifen 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, diebyline-Klasse,<time datetime>, JSON-LDauthor,datePublishedunddateModifiedsowie ein datumsähnlicher URL-Pfad.MISSING_ABOUT_PAGE,MISSING_CONTACT_PAGE,MISSING_PRIVACY_POLICYundMISSING_TERMS_PAGEmelden einen von fünf Zuständen:found_indexable(still),found_non_indexable,found_error,discovered_not_crawledodernot_discovered. So wird eine Seite, die existiert, aber nicht ausgeliefert wird, nicht genauso behandelt wie eine Seite, auf die niemand verlinkt.FEW_CITATIONSmeldet nur, was Linkpositionen belegen können: einen ausgehenden Link im Fließtext oder eine deklarierte Anzahl von null.YMYL_REVIEW_CANDIDATEmarkiert 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älttrust_signalsals NULL und wird im Überspringungsgrund gezählt.summary.trust_evidencehält den geprüften Umfang, den Zustand je Art und einen Hinweis auf teilweise Crawls fürnot_discovered-Urteile fest.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-dirspeichert Seiten-, Link- und Formularnachweise nun in#817anhängbaren JSONL-Sidecars…
Legacy-
#817 (Issue auf GitHub)crawl-site --out-dirspeichert 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.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_cancelledbenennen und den isolierten…#811Benennt den Abbruch fixierter Browser-Anfragen als
#811 (Issue auf GitHub)render_cancelledund schließt bei Abbruch oder Verbindungsverlust den isolierten Remote-Kontext und den Browser, ohne lokalen Fallback.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#801reproduzierbare, 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
#801 (Issue auf GitHub)<html lang>der Seite und den Anteilen der Schriftsysteme. Der normalisierte Text selbst wird nie gespeichert.--scanstreamt 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).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 progressund das MCP-Tool#795seo_project_progresshinzufügen…Ergänzt den begrenzten, paginierten CLI-Befehl
#795 (Issue auf GitHub)project progressund das MCP-Toolseo_project_progressmit 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.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).
#794 (Issue auf GitHub)project-checklist-initundseo_project_checklist_initakzeptieren einen optionalenplan: einen Prüfer, eine URL-populationalscomplete_set, eine benanntesampleoderunknown, jeweils mitsource,sizeoder aufgezähltenurls, dazu optional Populationen protemplatessowie eine optionaletasks-Vereinbarung (all_agreedoder eine belegteselectionvorhandener 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 aufseohead.coverage.v3hoch 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 alsnot_agreedgemeldet und liegen sichtbar außerhalb jedes Nenners.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
#794 (Issue auf GitHub)completebedeutet 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.GeändertFunktioniertDer Checklisten-Status liefert jetzt
coveragemit fünf getrennten Quoten:#794
#794 (Issue auf GitHub)audit_tasks,checks(mitmeasured_urls),manual_review,deliverable_reviewundurl_population. Jede hat eigene Werte fürbasis,numerator,denominatorundstate, sodass eine URL-Anzahl nie mit einer Prüf- oder Aufgabenanzahl vermischt wird. Ein Nenner, der sich nicht begründen lässt, bleibtnullmitstate: "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 aufpartialund zählen nur verifizierte, zulässige URLs. Die URL-Zugehörigkeit wird gegen die vereinbarte Aufzählung geprüft. Eine Population, die nur übersizedeklariert 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 aufunknownzurück, sobald eine Website ihren Nenner nicht begründen kann.GeändertFunktioniertEin Eintrag
not_applicableist jetzt ein geprüfter Ausschluss: Er braucht einen Grund,#794einen Prüfer…
Ein Eintrag
#794 (Issue auf GitHub)not_applicableist jetzt ein geprüfter Ausschluss. Er erfordert einen Grund, einen Prüfer und eine nachprüfbare Nachweisbasis: ein projektrelativ mit Digest versehenesartifactoder einen explizitenevidence-Verweis. Geprüfte Ausschlüsse behalten ihre stabile ID und Historie. Sie verlassen die Aufgaben-Nenner nur durch die erfasste Entscheidung und werden separat unterexclusionsaufgeführt. Ein deaktiviertes Element, ein veralteter Ausschlusseintrag oder ein älterernot_applicable-Eintrag, der vor der Regel zur Nachweisbasis geschrieben wurde, bleibt alspending_exclusionim 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.HinzugefügtFunktioniertDen adressierbaren Prompt
workflow/full-audit-v1und das Szenariofull-auditüber…#793Ergänzt den adressierbaren Prompt
#793 (Issue auf GitHub)workflow/full-audit-v1und das Szenariofull-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.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-IDSEOL)#788hinzugefügt…
Ergänzt das Behebungs-Ledger
#788 (Issue auf GitHub)ledger.v1(seohead.storage.ledger, Anwendungs-IDSEOL). 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 validiertenscan.v1- undscan.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- undaggregate_only-Abdeckung sowieunavailable-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 sowiedocs/LEDGER.md(#788).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
#781 (Issue auf GitHub)evidence-normalizeliest einen mitgelieferten CSV-, XLSX- oder JSON-Export bzw. einen gespeichertenseohead.provider-evidence.v1-Umschlag vollständig offline ein und erzeugt ein versioniertes Dokumentseohead.normalized-evidence.v1anhand eines optionalen Mapping-Manifestsseohead.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 Wert0bleibt 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-joinverknüpft normalisierte Nachweise mit einem Scan, Audit oder einer Seitenliste nach der strikten Schlüsselrichtlinieexternal_join.v1und 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.--compareergä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.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ändertFunktioniert
seohead watchzu einem rein lesenden Projektbeobachter mit gespeicherter#775Befundnavigation ausbauen…
Erweitert
#775 (Issue auf GitHub)seohead watchzu 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.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).
#761 (Issue auf GitHub)scripts/generate_review_pack.pyerzeugt 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 eineSHA256SUMS.txt, die alles abdeckt. Die Erzeugung lehnt ein Tag ab, das nicht zupyproject.tomlpasst. Die Verifikation prüft Formate und gespeicherte Hashes erneut und entpackt jede Distribution, um ihr eingebettetes Manifest, Name und Version laut Dateiname sowie die FelderNameundVersionder eigenen*.dist-info/METADATAoderPKG-INFOgegenpyproject.tomlzu validieren, statt dem Eintrag zu vertrauen. Ein Sentinel-Scan nachSEOHEAD_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 echtesv*-Release an.HinzugefügtFunktioniert
docs/SOFTWARE_REVIEW.mdhinzufügen: die Karte ausgehender Endpunkte und Datenflüsse#761(was jede…
Ergänzt
#761 (Issue auf GitHub)docs/SOFTWARE_REVIEW.mdmit 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.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-exportin deterministische, nummerierte Arbeitsblätter#759aufteilen…
Teilt große XLSX-Datensätze aus
#759 (Issue auf GitHub)scan-exportin deterministische, nummerierte Arbeitsblätter auf. Ein Blatt Partitions mit Zeilenerhaltung dokumentiert die Aufteilung, statt am Zeilenlimit eines Excel-Blatts zu scheitern.GeändertFunktioniertArbeitsblätter Findings und Pages von
report-buildam Zeilenlimit von Excel aufteilen#759und eine…
Teilt die Arbeitsblätter Findings und Pages von
#759 (Issue auf GitHub)report-buildam Zeilenlimit von Excel auf und erzeugt eine gehashte.xlsx.index.jsonmit exakten Datensatzbereichen, Quellgesamtheit sowie Verweisen auf Auswahl und Abdeckung. Der vorherige Bericht bleibt bei abgefangenen Schreibfehlern erhalten. Streaming-Zwischendateien werden bei einer Unterbrechung bereinigt.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_fixesfür begrenzte Nachprüfungen ausgewählter URLs#755anhand 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
#749 (Issue auf GitHub)Content-Typeder 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.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#747Neu:
#747 (Issue auf GitHub)scan-export(seo_scan_export) – ein schreibgeschützter Offline-Export von Scan-Daten im versionierten Vertragscan_export.v1. Er liest ein validiertes SQLite-Artefaktscan.v1oder eineaudit.jsondes 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.--recordsund--fieldsbieten eine validierte Projektion über Seiten-, Link- und Befundsätze. Unbekannte Datensatztypen oder Feldnamen werden abgelehnt, bevor eine Ausgabedatei entsteht. Fehlende Werte bleiben explizit (JSONnull, XMLstate="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.GeändertFunktioniert
crawl-siteprüft erfasste externe Ziele optional und begrenzt.#746
#746 (Issue auf GitHub)discovery.external.crawlläuft nach dem Schließen der internen Frontier als eigene Phase. Jedes eindeutige ausgehende Linkziel wird genau einmal abgerufen, mit eigenen Budgetsexternal_checks.max_targets,max_hosts,max_requests,max_depthundmax_redirects. Ein rekursives Durchlaufen fremder Hosts findet nie statt. Ergebnisse (abgerufen, fehlgeschlagen, blockiert, übersprungen mit der ablehnenden Regel) werden inexternal_checks.jsonlim Laufverzeichnis angehängt. Sie behalten die Herkunft der Quellseite und bleiben beim Fortsetzen erhalten, ohne verbrauchte Budgets erneut zu öffnen. Die Abdeckung wird indiscovery.external_checksgetrennt von der Vollständigkeit des internen Crawls ausgewiesen. Voraussetzung istdiscovery.external.store. Auf der nativen SQLite-Route (--scan-out) wird der Lauf mit Nennung dieser Option abgelehnt, bis der Collector die Phase unterstützt.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.
#744 (Issue auf GitHub)rendering.browser.enginewähltchromium(weiterhin Standard),firefoxoderwebkitü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 wirdrendering.browser.mobile_emulationabgelehnt, weilis_mobilenicht unterstützt wird. Die unabhängige Optionrendering.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.GeändertFunktioniert
rendering.browser.viewport_widthundrendering.browser.viewport_height: beliebige#744Viewport-Maße
#744 (Issue auf GitHub)rendering.browser.viewport_widthundrendering.browser.viewport_heightergänzen beliebige Viewport-Maße neben den bestehenden Voreinstellungendesktopundmobile. 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.GeändertFunktioniert
rendering.browser.page_concurrencybegrenzt parallele Browser-Abrufe#744
#744 (Issue auf GitHub)rendering.browser.page_concurrencybegrenzt die Anzahl gleichzeitiger Browser-Abrufe bei der Eskalation. Das ist getrennt vonspeed.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.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
#744 (Issue auf GitHub)rendering.rendered_links.crawlaktiviert ist.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
#718 (Issue auf GitHub)gsc-archiveundseo_gsc_archiveverfügbar. Offlinestatus, explizite Vorbereitung, begrenzte Erfassung und geprüfte Snapshots nutzen einen gemeinsamen Kern.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ändertFunktioniert
metrika-report(seo_metrika_report) undMetrikaClient.report(): große Abfragen#714werden in Kalendermonate aufgeteilt
#714 (Issue auf GitHub)metrika-report(seo_metrika_report) undMetrikaClient.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 gesampelteraccuracy=0.1erneut 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 insplit.unfetched. Eine abgebrochene Scheibe nennt ihre eigene Spanne mitpartial. Gesamtwertetotal_rows/totalsbleiben 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).offsetundlimitwerden aus dem globalen, zusammengeführten Satz gebildet. Stichprobenfelder spiegeln, was die API tatsächlich meldet (sampled, schlechtestersample_share). Meldet eine Scheibe sie nicht, bleibt der Gesamtwert unbekannt:nullin CLI- und MCP-Antwort, nie ein erfundenesfalse.contains_sensitive_dataist die ODER-Verknüpfung über alle Scheiben;min/maxwerden auf den zusammengeführten Zeilen neu berechnet. Fehlende oder fehlerhafte Metrikzellen und Summen markieren den Body alsincompletestatt als Null. Der Blocksplithä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 angegebenentimezoneoder 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 (etwamonth), wird weiterhin wiederholt und gesampelt, bevor der Fehler ausgegeben wird. Eine expliziteaccuracywird in allen dokumentierten Formen beachtet (low,medium,high,fulloder ein numerischer Anteil wie"1"). Liegt sie über der letzten Stichprobe, greift der Rückfall aufaccuracy=0.1. Eine bereits niedrigere Einstellung des Aufrufers (lowoder 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.GeändertFunktioniertYandex Webmaster: Operation
indexingliest den echten v4-Endpunkt#713Yandex Webmaster: Die Operation
#713 (Issue auf GitHub)indexingliest jetzt den tatsächlichen v4-Endpunkt/indexing/samplesstatt des nicht vorhandenen/search-urls. Neu istbroken_links_samples, das/links/internal/broken/samplesliest. Das Paging hält sich an die dokumentierte Seitengrößen-Obergrenze jedes Endpunkts (500 für Abfragen, 100 für Stichprobenlisten), statt überalllimit=500zu senden (#713).GeändertFunktioniertYandex Webmaster: paginierte Erfassung prüft
countund Listenform jeder Seite#713Die paginierte Erfassung in Yandex Webmaster prüft das dokumentierte
#713 (Issue auf GitHub)countund die Listenform jeder Seite, auch wenncountunter der Zahl der zurückgegebenen Zeilen liegt. Pro Seite wird höchstens das verbleibende Zeilenbudget angefragt, damit ein Schnitt durchmax_rowsnie zu einem falschencompleteüberliest. Eine einzelne, nicht paginierte Seite wird als begrenzter Ausschnitt mitreturned/truncatedausgewiesen. Verbleiben ungelesene Zeilen, wirdpartialgemeldet. Fehlerhafte Seiten schlagen fehl, statt ein vollständiges, leeres Ergebnis zu behaupten (#713).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 behobenHinzugefügtFunktioniertNeu:
crawl-importfür zugeordnete Crawl-CSV-Bundles von Drittanbietern#819Neu:
#819 (Issue auf GitHub)crawl-importfü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 inthird_party_crawl.v1erhalten. Das Ergebnis gilt nicht als nativer Scan und nicht als SF-Audit.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.mdmit der Matrix aus Provider-Fähigkeiten und#779Spezialisten-Workflows
Neu:
#779 (Issue auf GitHub)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 inseohead/core/provider_matrix.pyüberscripts/generate_provider_matrix.py. Je Workflow nennt sie die ausgelieferten Befehle, Authentifizierung, Kosten bzw. Kontingent, Datenschutzklasse, Einschränkungen und den CSV-Fallback überprovider-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 erkennentests/test_docs_drift.pyundtests/test_provider_matrix.py.BehobenFunktioniert
keywords-exact(seo_keywords_exact) liefert wieder Ergebnisse#720
#720 (Issue auf GitHub)keywords-exact(seo_keywords_exact) konnte nie ein Ergebnis liefern: Die Aufgabe war für ein Arsenkin-Tool namenskeywords_frequencyangelegt, das es nicht gibt. Jeder Aufruf endete daher mit404 WRONG_TOOL. Exakt!Wgeht jetzt an das Toolwordstatmittype=1, dem Phrasen-Array unterqueriesund der Region als Einzelelement-Liste.GeändertFunktioniertFür
!Wwird der Selektoroveralangefragt: diews-Werte sind verschiedene Operatoren#720Für
#720 (Issue auf GitHub)!Wwird der Selektoroveralangefragt. Diews-Werte von Arsenkin sind unterschiedliche Operatoren:baseist breit (WS),quotedist die Wortgruppe in Anführungszeichen („WS“),overalist die exakte Wortform (!WS), die!Wverlangt, undexactist die strikt geordnete Form ([!WS]).GeändertFunktioniertVor dem Senden werden Zeichen entfernt, die der Provider ablehnt (
/, Anführungszeichen)#720Vor dem Senden werden Zeichen entfernt, die der Provider ablehnt. Eine einzige Phrase mit
#720 (Issue auf GitHub)/oder Anführungszeichen ließ den gesamten Stapel mit422 JSON_VALIDATION_ERRORscheitern. Umgeschriebene Phrasen werden incleanedzurückgemeldet, damit der Aufrufer sieht, welche in einer anderen Form gemessen wurden.GeändertFunktioniert
frequenciesliefert{phrase: {"base": N, "overal": N}}neben der Rohantwort#720
#720 (Issue auf GitHub)frequencieswird als{phrase: {"base": N, "overal": N}}neben der rohen Provider-Antwort ausgegeben. Liefert eine Phrase nur Ergebnisse anderer Regionen, wird sie ausgelassen und inwarningsaufgeführt, statt fremde Zahlen zu übernehmen.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ändertFunktioniert
sources-doctor: Legacy-Blocksources.gscfolgtprovider_status.gsc#717Der Legacy-Block
#717 (Issue auf GitHub)sources.gscinsources-doctorfolgtprovider_status.gsc.readyund das neue Feldcomponentsstammen 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, Typservice_account, exakte Google-Token-URI und Pflichtfelder. Beide Doctor-Blöcke melden einen sicheren Statusservice_account_status(missing,unsafe_file,too_large,unreadable,malformed_json,unsupported_shapeoderconfigured_unverified). So bleiben eine zu große, unlesbare oder fehlerhafte Datei von einer konfigurierten, aber ungeprüften unterscheidbar, ohne den Inhalt offenzulegen.GeändertFunktioniert
crawl-site-Artefakte setzenfinished_atundfinished, sobald alle Frontier-Zeilen#712einen Endzustand haben
Scan-Artefakte von
#712 (Issue auf GitHub)crawl-sitesetzenfinished_atund den Lebenszyklusfinished, sobald jede angenommene Frontier-Zeile einen Endzustand erreicht hat. Das gilt auch für Läufe mit teilweise erhaltenen Nachweisen:crawl_partialbenennt bereits fehlende Beobachtungen. Eine leere Warteschlange wirkt daher nicht mehr wie eine unterbrochene Erfassung inscan-status,scan-listoder der Historie (#712). Ein ausdrücklich gestoppter Lauf (abgebrochen, bevor er Arbeit angenommen hat, abgebrochen oder durch den Fehlerschalter angehalten) behältinterruptedund den gespeicherten Grund, auch nachdem die Warteschlange leer ist, einschließlich überresume_or_finalize. Stopp-Pfade erhalten so nie einen falschen Endzeitstempel.GeändertFunktioniert
duplicate-check --scanundboilerplate-report --scanstreamen große Korpora#710
#710 (Issue auf GitHub)duplicate-check --scanundboilerplate-report --scanstreamen 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 mitinterrupted. 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).GeändertFunktioniertMetrika:
report()undby_time()lehnenoffset < 1lokal mitValueErrorab#707
#707 (Issue auf GitHub)report()undby_time()in Metrika lehnenoffset < 1lokal mit einemValueErrorab, statt es an die Reporting API weiterzuleiten. Die API beantwortetoffset=0mit HTTP 400. Neue Offline-Tests fixieren den 1-basierten Vertrag fürmetrika-report,seo_metrika_reportundprovider-collectaggregate_report. Außerdem prüfen sie, dass die Stoppbedingungen der Paginierung (total_rows,ROW_CAP) die bei einem abweichendenoffsetübersprungenen Zeilen mitzählen (#707).
2. Oktober 2026
1 hinzugefügt2 geändertGeändertFunktioniert
metrika-traffic-pdfunter macOS: Chrome startet ohne Warten und wird nach der Prüfung#731beendet
#731 (Issue auf GitHub)metrika-traffic-pdfunter macOS: Chrome schreibt das PDF und läuft weiter. Der Browser wird jetzt ohne Warten gestartet und beendet, sobald das PDF geprüft ist.GeändertFunktioniertYandex Webmaster:
user_idaus dem Token, neue schreibgeschützte Operationen#713Yandex Webmaster:
#713 (Issue auf GitHub)user_idwird aus dem Token ermittelt. Neue schreibgeschützte Operationen sindsummary,diagnostics,sqi_history,search_history,query_history,in_search_history,events_history,indexing_history,important_urls,broken_links_historyundexternal_links_history.paramssteuert Datum und Indikatoren. Abfrage- und Crawl-Stichprobenlisten sind paginiert (#713).HinzugefügtFunktioniertNeuer Fachskill
traffic-report: Kundenbericht zum TrafficNeuer 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ändertHinzugefügtFunktioniertNeu:
metrika-traffic-pdf(seo_metrika_traffic_pdf) für einen statischen#731Traffic-Bericht im A4-Querformat
Neu:
#731 (Issue auf GitHub)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 Dokumentseohead.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:lastSignTrafficSourcesamt 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ücklichesattribution=last_clickverfügbar. Jede Anfrage sendetoffset=1, da die API ab 1 zählt. Fehlende Daten bleiben sichtbar: Jeder Block trägtok,unavailableoderskippedmit Grund. Eine Veränderung ohne Vergleichswert istnull, nicht Null. Fehlt der Browser, bleibt das HTML erhalten und das PDF wird als übersprungen gemeldet. Bestehende Dateien inout_dirwerden nur mitoverwrite=trueersetzt.GeändertFunktioniertMetrika-Reports beginnen bei
offset=1: Die Reporting API zählt ab 1.#707Jede Anfrage mit
#707 (Issue auf GitHub)offset=0beantwortete sie mit HTTP 400 (#707, #728, #729).
26. September 2026
1 hinzugefügtHinzugefügtFunktioniertNative Crawls erkennen
HEADING_SKIPbei Sprüngen in der Überschriftenebene#725Neuer Nachweis
#725 (Issue auf GitHub)HEADING_SKIPim 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.
23. September 2026
1 geändertGeä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 behobenHinzugefü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.txtgefunden, mit Fallback auf/sitemap.xml#703Sitemaps werden ausgehend von der Site-Wurzel über
#703 (Issue auf GitHub)robots.txtgefunden, mit Fallback auf/sitemap.xml. Schlägt die Expansion aller Sitemaps fehl, meldet dasok: false.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#701Gespeicherte Scan-Pfade heißen einheitlich
#701 (Issue auf GitHub)--scan, Inline-JSON--input. Die alten Varianten--inputfür Scan-Pfade und--json-inputfunktionieren noch eine Version lang mit einer Warnung.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
#700 (Issue auf GitHub)Cache-Control: no-store. Bodies mit Zugangsdaten werden weiterhin nicht gespeichert.
9. September 2026
10 hinzugefügt9 geändert2 behobenHinzugefü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
notranslatekorrigiert,#692ohne 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ändertFunktioniert
crawl-siteim URL-Modus schreibt standardmäßig einen kollisionssicheren SQLite-Scan#676
#676 (Issue auf GitHub)crawl-siteim URL-Modus schreibt standardmäßig einen kollisionssicheren nativen SQLite-Scan im Verzeichnisscans/des Aufrufers.--out-dirbleibt 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.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ändertFunktioniert
render-check --viewport mobile: feste Smartphone-Identität#670
#670 (Issue auf GitHub)render-check --viewport mobileverwendet für seine Roh- und Browseranfragen jetzt eine feste Smartphone-Diagnoseidentität. Ein explizites--user-agentist über CLI und MCP verfügbar. Jeder abgeschlossene oder teilweise Vergleich protokolliert die verwendete Identität und die Viewport-Größe.HinzugefügtFunktioniertNeue
--scan-Eingaben für Duplikat- und Boilerplate-Analyse#669Schreibgeschützte
#669 (Issue auf GitHub)--scan-Eingaben für die Analyse von Duplikaten und Boilerplate im Korpus, mit Abdeckung der gespeicherten Seitentexte und Herkunftsnachweis.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-factsfür Stack-Fakten#648Mit
#648 (Issue auf GitHub)project-factslassen sich Stack-Fakten nach der Projekterstellung erfassen, optional aus einem expliziten, robots.txt-konformentech-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.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ügtFunktioniert
examples/project-skeletonmit leerer Checkliste,project…#648
#648 (Issue auf GitHub)examples/project-skeletonwird mit einer initialisierten, noch ergebnislosen Checkliste ausgeliefert. Dadurch meldetproject statusauf diesem Beispiel Abdeckungszahlen stattnot_initialized. Die Datei wird gegen den aktuellen Katalog geprüft.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 behobenGeä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
#656 (Issue auf GitHub)Set-Cookiegesetzt 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 denCookie:-Header vom Draht und speicherte das serialisierte DOM dieser Seite alsomitted/credentialed. Das geschah bei einem Lauf mithttp.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_usedfür ein gerendertes Dokument stammt jetzt nur noch aus der Konfiguration des Laufs, also aushttp.credential_headersoder einem persistenten Browserprofil. Das leitetcrawl/sqlite_render.py::_policy_factsab. 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 untercredentialedweg, unverändert. Der Cookie-Wert wird nie gespeichert.GeändertFunktioniertZählwerte hinter dem Flag
partialwerden ausgewiesen#656
#656 (Issue auf GitHub)rendered_bodiesim Ergebnis voncrawl-sitenennt, 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.GeändertFunktioniert
og:urlim nativen Crawl erfassen (#654)#654
#654 (Issue auf GitHub)rules.check_ogführtog:urluntermissing_tags, sobald das Feld leer ist. Der native Pfad las das Tag aber nie: keinog_urlinPageRecord, keine Spalteog_urlinscan_v1.sqlund keinOG:URLin der Internal:All-Projektion auscrawl/evidence.py. Die Spalte existierte nur auf der Screaming-Frog-Seite, wonormalizeOG:URLimmer 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 alsog:url. Es wird in der nullable Spaltepages.og_urlgespeichert, 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 alsOG:URL. Das ist die Erfassungsseite des Schnitts, dessen Leseseite #646 behoben hat.tests/test_open_graph_seam.pyerhält eine dritte Fixture-Site mit Open Graph, aber ohneog:title, damit die Prüfung tatsächlich greift. Eine Seite deklariertog:urlund 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.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
#647 (Issue auf GitHub)Set-Cookieenthielt, gingen alle späteren Anfragen mitCookie:raus, und der Korpus-Writer stufte sie als authentifizierten Abruf ein. Auf einer öffentlichen Website mithttp.credential_headers = []undcredentials_acknowledged = falseverwarf 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, dennhttp.headerslehnt die Konfigurationsprüfung ab. Ein Crawl mit konfigurierten Zugangsdaten lässt diese Seitenkörper weiterhin untercredentialedweg, unverändert.GeändertFunktioniertZählwerte, die ein
partial-Flag nicht erfassen kann#647
#647 (Issue auf GitHub)html_bodiesim Ergebnis voncrawl-sitenennt, 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, unterx-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.GeändertFunktioniertEinträge aus
CHANGELOG.mdin eine Datei pro Änderung#638Changelog-Einträge wandern aus
#638 (Issue auf GitHub)CHANGELOG.mdin je eine Datei pro Änderung unterchangelog.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## Unreleasedergä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.GeändertFunktioniertFragmente heißen nach dem Issue, z.#638
B.
changelog.d/638.mdEin Fragment heißt nach dem Issue, das es schließt, etwa
#638 (Issue auf GitHub)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 schreibtno-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.pyfügt die Fragmente bei der Veröffentlichung in## Unreleasedein. Die Reihenfolge richtet sich nach der Issue-Nummer, nicht nach der Reihenfolge des Dateisystems. Mit--prunewerden 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.mdwird 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.GeändertFunktioniertDoc-Gates, die
CHANGELOG.mdlasen, prüfen jetzt Fragmente#638Die Doc-Gates, die
#638 (Issue auf GitHub)CHANGELOG.mdlasen, 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.pyführteCHANGELOG.mdinPUBLIC_MARKDOWN. Deshalb lesen das Englisch-Gate, das Gate für „nur existierende Befehle“ und das Gate für veraltete Zählwerte jetzt auchchangelog.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.pyschließt das Changelog bewusst vom Live-Zählwert-Scan aus, und seine Dateiliste erreichtchangelog.d/nie. Das ist dieselbe Antwort aus demselben Grund.tests/test_doc_commands.py,tests/test_docs_commands_execute.pyundtests/test_examples_gate.pylesen das Changelog gar nicht. Ein neuer Testtests/test_changelog_fragments.pyhä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.
Früher (kein Datum erfasst)
23 hinzugefügt30 geändert17 behobenBehobenFunktioniert
Set-Cookieohne Wert: Erkennung läuft weiter (#651)Ein Header ganz ohne
name=value-Paar, etwaSet-Cookie: Secure; HttpOnly, denemall.byneben zwei korrekten Cookies sendet, wird im Jar zuCookie(name='Secure', value=None). Dafür wirfthttpx.Cookies.__getitem__einenKeyError.dict(resp.cookies)schlug deshalb bei einem Namen fehl, den der eigene Iterator der Map geliefert hatte.tech-detectendete mit Code 1, einer nackten Meldungerror: 'Secure'und ohne JSON auf stdout, obwohl die Seite erfolgreich abgerufen worden war. MCPseo_tech_detectreichte denKeyErroran den Aufrufer weiter.site-auditlieferte still zurück, mit fehlendem Technologieabschnitt.detect_techdurchlä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 inmalformed_cookiesund 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ändertFunktioniert
render-checkmisst 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-encodingdes Origins an Playwright.route.fulfillwendet auf den übergebenen Body aber nie eine Content-Codierung an. Chromium parste deshalb gzip alstext/htmlund 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 alsok: false, reason: incomplete_renderzurück. Die Meldung gab dem Rendering die Schuld und empfahl--wait domcontentloadedoder ein längeres--timeout, obwohl der Render fehlerfrei abgeschlossen war.seohead.techmeldete 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 entferntcontent-encodingaus dem, was sie weiterleitet.content-lengthwar 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 zubrundzstdweiterzureichen. 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_htmlspeichert jedes Tag unter seinem vollen Property-Namen, etwa{"og:title": ...}, wie es der eigene Docstring beschreibt.crawl/collect.pyfragte dasselbe Dict aber nach"title","description"und"image".dict.getlieferte jedes MalNone. Deshalb warenog_title,og_descriptionundog_imagebei 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, denncrawl/evidence.pyprojiziert diese Spalten inOG:Title,OG:DescriptionundOG:Imagedes 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 voncheck_ogverbarg 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 Testtests/test_open_graph_seam.pycrawlt zwei Loopback-Fixture-Sites. Er verfolgt den Wert vom Parser überpages.jsonlund die Tabellepagesdes Scan-Artefakts bis zu denOG:*-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-linkinghinzu (#634). Die Bausteine existierten bereits: jede Kante mit Position, Anker und nofollow-Flag in der Tabellelinks, dazuORPHAN_PAGE,INLINK_BOILERPLATE_ONLYundLOW_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_linkingenthält das Histogramm, das Maximum, die Aufteilung in erreichbar und unerreichbar, die internen Kanten nach Seitenposition und die Anzahl wiederholter Kanten.audit.mdzeigt das neben der Gesundheitsübersicht. Der Durchlauf startet bei der URL, mit der der Crawl tatsächlich begann, nie beipages.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_DEPTHschlägt bei einer indexierbaren Seite an, deren kürzester Weg vom Start-URLthresholds.click_depth_maxüberschreitet (Standard 10). Jeder Befund nennt den verwendeten Wert.DUPLICATE_INTERNAL_LINKschlä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_HEADINGundIMAGE_LINK_WITHOUT_TEXTbrauchen, 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, begrenzteslink_placement_jsonneben 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
unclassifiedund wird nie untercontenteingerechnet.link_position.classifyist 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 zuerstnav. 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_MISSINGgreift nur, wenn eine Konfigurationrequirements.require_h2setzt. 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_canonicalist 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_mdbaute die Überschrift mitsrc.get("project", "site"). Der Schlüssel"project"ist aber im Blocksourceder Aufgabenliste immer vorhanden. Er wird beim Erstellen ausrun.get("project")befüllt, und ein Lauf ohne Projekt speichert dort den WertNone, statt den Schlüssel wegzulassen. Der Default vondict.getgreift nur bei einem fehlenden Schlüssel, nie bei einem, derNoneenthält. Ein nativer Crawl und eine Reanalyse lassenprojectbeide ungesetzt. Jede daraus erstellte Aufgabenliste erhielt deshalb das Wort „None“ als Überschrift. Jetzt fällt die Überschrift mitorzurück, was auch einen gespeichertenNoneabfängt. Sie greift dann aufstart_urlodersourceder Website zurück, bevor sie aufgibt. Dieselbe Reihenfolge nutzteseohead.reports.facts.crawl_domainbereits, um den Namen einer Website aus dem Blockrunzu 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_audithatte dieselbe latente Form eine Zeile weiter (run.get("project") or ""inreports/__init__.py). Sie war gegen einen gespeichertenNonebereits 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 dieselbecrawl_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, H2ist, 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.pagesspeicherteh1,h1_2undh2als drei Strings ohne Reihenfolge und ohne Ort. Ein nativer Crawl speichert jetzt die gesamte Gliederungh1bish6in DOM-Reihenfolge. Jede Überschrift hat Ebene, Text und Seitenregion, in der neuen nullable Spalteheading_outline_json.HEADING_BEFORE_H1undHEADING_IN_PAGE_CHROMElesen 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 beantwortetHEADING_BEFORE_H1weiterhin 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 ererror: 'rel_next_2'aus, denn diestr()einesKeyErrorist 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 meldetaudit_available: falsemit diesem Grund, statt an der Ausnahme abzubrechen.crawl-sitebeendet 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. DerKeyErrorselbst 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 überinspect(). Das führt außerdemPRAGMA quick_checkundPRAGMA 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 nacktersqlite3.OperationalError("interrupted"). Dieser wurde wörtlich zucannot inspect native scan: interruptedverpackt, 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 explizitestimeout_secondsdes Aufrufers überschreibt es weiterhin. Ein Frist-Abbruch erzeugt jetzt einenScanError, 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ügtFunktioniert
crawl-site --resume <scan.sqlite>ergänzt (#619)NativeScan.resume_snapshot(), die Tabelleresume_stateund der Writer, der sie füllt, existierten seit dem Entwurf des Scan-Artefakts.crawl_to_scansetzte 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-outauf 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.--resumenimmt 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-siteschreibt 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_resumedbleibt 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.BehobenFunktioniert
render-check: ungerenderte Seiten nicht als sauber (#642)render-checkstuft 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 inrender.py. Erstens: Ein Render, der an seiner Ladestufe ein Timeout hatte, fiel auf das DOM beidomcontentloadedzurü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 meldeteok: True,js_dependent: Falseund 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_reachedhielt 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 meldetjs_dependent: None. Das heißt: Dieser Lauf weiß es nicht. Vorher stand dortFalse. Das galt auch beim Standard--wait load, nicht nur bei ausdrücklich angefordertemnetworkidle. 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 vonrender_checkließ den Schlüsselempty_shellganz weg. So ging ein leerer Mount-Punkt einer Single-Page-Application verloren, obwohldetect_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 inpatterns_unprobedmit 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_ROBOTSist der Ersatzwert, den_fetch_robotsauf 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 vonparse_robots, und nur diese Form akzeptiert der Kontextrobots_summarydes Scan-Artefakts. Im--scan-out-Modus brach ein Crawl deshalb mitnative parsed robots summary is invalidab, 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 keintext/plainwar. 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.BehobenFunktioniert
escalate()zählt fehlgeschlagene Proben nicht als sauberBehebt, 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 dasfor/elsedas 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.EscalationResultführt solche Muster jetzt inpatterns_unprobed, zusammen mit den dort bereits erfassten Mustern aus abgebrochenen Läufen. Der Grund der Probe steht im neuen Feldpatterns_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 Mustersok: Falseliefern.BehobenFunktioniert
render-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üfungok: falsemitreason: "incomplete_render"zurück. Dazu kommt ein benannter Grund mit beiden Byte-Zahlen und beide Snapshots zur Ansicht. Es gibt keine Befunde, undjs_dependent: nullstattfalse, weil der Lauf es nicht weiß.site-auditträgt das insummary.tools_failedein, 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 networkidlein ein Timeout. Jetzt fällt der Lauf auf das DOM beidomcontentloadedzurück, ohne zweite Navigation.wait_reachedzeigt, 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ändertFunktioniert
crawl-sitemit 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 -lazu 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 istfetched + queued, begrenzt durch das URL-Budget. Er heißtknownund nichttotal. 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 alsrate n/a, nie als0.0 req/s. Beide Werte stammen aus den eigenen Strukturen des Crawls. Bei einem SQLite-Scan kommen sie aus derselbenresume_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_MULTIPLEundPAGINATION_URL_NOT_IN_ANCHORmelden 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/2und/blog/page/2/aus zwei Plugins sind damit ein Nachfolger in zwei Schreibweisen, keine mehrdeutige Serie.PAGINATION_URL_NOT_IN_ANCHORbraucht die gesamte Linkliste einer Seite und liest dafür den All-Inlinks-Export.PAGINATION_MULTIPLEbraucht das nicht. Es liest jetzt zuerst die leichteren Vorkommensspaltenrel="next" 2undrel="prev" 2ausInternal:All, genau wieCANONICAL_MULTIPLEbereits ausCanonical Link Element 2antwortet. All Inlinks dient nur als Fallback für ein Profil, dessenInternal:Allohne diese Spalten geschrieben wurde.PAGINATION_SEQUENCE_ERRORmeldet 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.pyEin 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.pystellte nur sicher, dass jede Prüfungs-ID registriert ist und jedecheck_*-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.pydurchsuchttests/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 Dateitest_check_verdict_gaps.pyschließ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 RatchetKNOWN_UNCOVEREDdes 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-agenthebelte 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 ZeileUser-agent:oder eine, deren Botname ein Inline-Kommentar verschluckte (User-agent: # old bot rule), wurde zu einem leeren Token geparst._rules_forbehandelte 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 GruppeUser-agent: *für jeden Crawler, den die Datei nicht erwähnt. Eine robots.txt, deren einzige wesentliche RegelUser-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 Funktionis_allowedauf. 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_allverlangte nur das Dateinamen-Tokeninternal. Ein partieller Internal-Reiter pro Typ, etwainternal_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ätzlichall.discover_exportswählte für einen logischen Schlüssel bei zwei passenden Dateien die erste in sortierter Dateinamenreihenfolge. Lagen etwainternal_all.csvundinternal-all.csvmit 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_sfnahm 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_commandhängte--auth-confignur 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-seospiderconfigist das richtig, für ein vom Aufrufer ausdrücklich verlangtes Profil falsch. Eine fehlende explizitesf_cli.auth_configbricht jetzt ab, bevor Screaming Frog startet.BehobenFunktioniertZwei Extraktionsfehler in
seohead/checks/parser.py(#138, #140)collapse_whitespacedekodierte HTML-Entitäten ein zweites Mal, obwohl BeautifulSoups lxml-Parser bereits bei jedemtag.get_text()- undtag.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, undspider.pyrief 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, seintarget-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, alsotarget="_blank"ohnerel="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 alsUNSAFE_CROSS_ORIGIN_LINK,PROTOCOL_RELATIVE_LINK,OUTLINK_TO_LOCALHOST,FOLLOW_AND_NOFOLLOW_INLINKS,FORM_URL_INSECUREundFORM_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 brauchtlink_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_hrefallein macht den größten Teil davon aus. Das Register wächst von 121 auf 127 Prüfungen.BehobenFunktioniert
report-buildohne Befunde bei SF-Analyzer-JSON (#151)Behebt, dass
report-buildfür ein SF-Analyzer-audit.jsoneinen Bericht ohne Befunde rendert (#151). Das dokumentierte Rezept,sf run --tasksinreport-build --format docx,xlsx,csvodermdzu leiten, lasfindingsund flache Seitenschlüssel. Das SF-Schema verwendet diese nicht. Befunde liegen unterissues, Seitenfakten unterpages[].metrics. Die Abweichung ergab eine sichere Zusammenfassung0/0/0/0für ein Audit, das echte kritische Probleme gefunden hatte, und keine Befundabschnitte.build_reporterkennt jetzt beide Formen, das nativeseohead.site-audit/1und das Format des SF Analyzer. Letzteres wird vor dem Rendern in den flachen Vertrag überführt, den die vier menschenlesbaren Writer bereits verstehen.--format jsonbleibt 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 mitok: Falseabgelehnt, und die Meldung nennt die Abweichung des Schemas. Früher wurde es als leeres Ergebnis gerendert. Außerdem ist das toteif ... : passentfernt, das wie eine Prüfung aussah und nie etwas tat.tests/test_docs_commands_execute.pyprüft jetzt die gerenderte Zusammenfassung des dokumentierten Rezepts gegen die eigenen Summen vonaudit.jsonund nicht nur den Exitcode.GeändertFunktioniertZwei Kostenschutz-Lücken in
seohead/data_sources/(#157, #159)geo_guardprüfte nur das beratende Feldcountry. Daher konntensearch_volume,keyword_ideas,keyword_difficultyundserpden Live-Endpunkt von DataForSEO fürlocation_code=2643(Russland) oder2112(Belarus) erreichen, wenn ein Aufrufer die numerische Geo-Zielgruppe angab, ohnecountryzu füllen. Der Guard prüft jetzt zuerstlocation_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-/setsowiewordstat.topRequests,wordstat.dynamicsundweb.searchAsyncvon 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 Flagattempt_failed: network_error. Der Aufruf schlägt direkt fehl und riskiert keine zweite Abrechnung. Idempotente Lesezugriffe, also Arsenkin-/checkund/getsowie das Polling von Yandex-Cloud-Operationen, bleiben unverändert und wiederholen weiterhin.yandex_cloud.WebSearch.search_batchisoliert eine verlorene Übermittlung auf die eigene Anfrage, statt den ganzen Batch abzubrechen.metrika.pywiederholt 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 voncollect.py. Die vierzehn anderen Aufrufstellen, einschließlich dercrawl-site-Engine inspider.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 so169.254.169.254oder 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 denHost-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_NETWORKSundSEOHEAD_ALLOW_PRIVATE_HOSTSbleiben 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_FLAGSvollstä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 ohneisErrorzurück. Eine Pipeline, die auf$?prüft, oder ein Client, der nurisErrorliest, konnte den Fehler so nicht erkennen.cli.pyendet jetzt in diesem Fall mit 1. Der eigene Exitcode 2 vonlog-scanfür einen sich selbst widersprechenden Lauf bleibt ein separates, dokumentiertes Signal (siehedocs/USAGE.md).mcp_server.pywirft über einen gemeinsamen Wrapper_checked()einenToolError, sodass der ClientisErrorsieht. Beide Wege rufenhandlers.handler_failed()auf, damit CLI und MCP nicht auseinanderlaufen, was als Fehler zählt. Zusätzlich fehlten inSOURCE_FLAGSdie Flags--phrase,--keywords,--query/--queries,--seed,--countersowie--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ändertFunktioniert
docs/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.pyprü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_URLSu.a. (#124)
Die eigenen Grenzen des Sitemap-Protokolls werden jetzt geprüft (#124).
SITEMAP_TOO_MANY_URLSschlägt bei mehr als 50.000 Einträgen in einer Datei an.SITEMAP_TOO_LARGEschlägt bei mehr als 50 MB unkomprimiert an.SITEMAP_URL_DUPLICATEDmeldet 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.mdist 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 vonaudit.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ügtFunktioniert
docs/COVERAGE_SF_ISSUES.mdausseohead/sf/core/sf_issue_map.pygeneriertdocs/COVERAGE_SF_ISSUES.mdwird ausseohead/sf/core/sf_issue_map.pygeneriert. 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. Ersetztdocs/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 normalisierteloczurü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 jetztloc, wie veröffentlicht, zusammen mitloc_normalizedfü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, undcontrol/. 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 nurSKILL.md.HinzugefügtFunktioniert
tests/chains/: Fixture-Site aus den Formen, die Ketten brechentests/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 auslogscanselbst. Ein Widerspruch, den der Scanner benennen kann, ist deshalb ein Kettentest, der genau das prüft.GeändertFunktioniert
reconcile_sitemapmeldet URLs in ihrer SchreibweiseDer 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ügtFunktioniert
docs/scenarios/: zehn End-to-End-Ketten mit echten Befehlendocs/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 vontests/test_docs_commands_execute.pygegen die Fixture-Site ausgeführt. Dessen Extraktor und die Gates für reines Englisch und für Zählwerte durchsuchendocs/jetzt auf allen Ebenen und nicht nur oberhalb.HinzugefügtFunktioniert
log-scan(CLI) undseo_log_scan(MCP): Läufe auf Widersprüche prüfenlog-scan(CLI) undseo_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)
_DispatchGateliest jetzt die injizierte Uhr des Crawls statttime.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.headerswird in jede Anfrage neben den Zugangs-Headern eingemischt.speed.adaptivesteuert 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.storeund.crawl,discovery.external.storeunddiscovery.redirects.crawlbestimmen jetzt, was der Crawl speichert und was er verfolgt.discovery.canonicals.*,discovery.external.crawlunddiscovery.redirects.storesind 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-helpund im Lauf-Manifest steht und nichts ändert, ist schlechter als gar keine. Die Ausnahmeliste des Coverage-Canaries ist jetzt leer. Jeder Pfad inDEFAULTSä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"], dannarticle. Welcher Treffer griff, wird alsauto_main/auto_role_main/auto_articlefestgehalten. Der bisherige Standard, also der gesamte Body abzüglich der Tagsnavundfooter, 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 aufTHIN_CONTENTundLOW_TEXT_RATIOaus. Für den Fallback-Pfad kommenheaderundasidezunavundfooterinDEFAULT_EXCLUDE_TAGShinzu. Ein konfigurierter Selektor hat weiterhin Vorrang. Findet er nichts, greiftfallback_default_body, statt stillschweigend eine andere Region automatisch zu erkennen.GeändertFunktioniert
URL_NOT_IN_SITEMAPvergleicht 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 Argumentcomparable. So fragtSITEMAP_ORPHANdie Erreichbarkeit weiterhin gegen alle Link-Ziele ab und kann keine Waisen erfinden. Was ausgeschlossen wurde, wird unterlinked_not_comparablezurückgegeben statt verworfen.BehobenFunktioniertCanonical-Prüfungen für Sites korrigiert, die beide Schreibweisen einer URL mit und ohne
Slash ausliefern (#95).
norm_urlentfernt 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, meldeteCANONICAL_TO_REDIRECT78 Live-Seiten, deren Canonical mit 200 antwortet.AuditContextstellt jetztpages_by_normbereit, mit allen Seiten unter einem Schlüssel.page_by_normliefert die Variante, die mit 2xx antwortete.CANONICAL_TO_REDIRECTundCANONICAL_NON_INDEXABLEschlagen nur noch an, wenn keine Variante widerspricht.BehobenFunktioniert
size_byteskorrigiert: 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 aufhttp_cache.v2. Einträge der Version 1 werden einmalig neu abgerufen, statt ohne Größenangabe wiedergegeben zu werden.HinzugefügtFunktioniert
docs/TOOL_REFERENCE.mdergä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 Toolseo_*/sf_*die Argumente mit Typ und Standardwert, dessen Kosten (Netzwerk, Schreibzugriffe, Idempotenz, kostenpflichtige Nutzung, aus dem Profil inToolAnnotations) und die Hinweise zu Verhalten und Fehlerfällen aus dem eigenen Docstring.tests/test_docs_drift.pylässt den Build fehlschlagen, wenn die Datei von den Tool-Definitionen abweicht oder ein Tool fehlt.HinzugefügtFunktioniert
tests/test_docs_commands_execute.pyergänzt: extrahiert jedenseohead ...-Befehl ausREADME, docs, Skills und examples…
Ergänzt
tests/test_docs_commands_execute.py: Die Datei extrahiert jedenseohead ...-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 vonexamples/. 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ückkehrendenmcp-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 gemeinsameStruktur 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 vondocs/SKILLS.mdist 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.mdunddocs/TESTING.md, eine veraltete MCP-Tool-Zahl indocs/TOOLS.md, eine veraltete Tool-Referenz-Zahl indocs/README.mdsowie 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_MISSINGundNO_COMPRESSION. Jeder wird aus Belegen berechnet, die ein Crawl bereits hat.content_encoding,meta_charset,doctypeundviewportgehö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-helpbeschrieben, aber von keinem Code gelesen (#63).limits.max_response_bytes,speed.max_delay_seconds,robots.user_agent_tokenundspeed.stop_after_consecutive_timeoutssteuern jetzt ein Verhalten, das vorher fest codiert war.robots.unavailable_means_stopbestimmt, 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_timeoutunddiscovery.follow_nofollowsind neu implementierte Funktionen.http.user_agentwird jetzt in echten Requests verwendet, statt immer den Standard-User-Agent des Toolkits zu senden.crawl-describe-settings(CLI) undseo_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,SIGALRMauf 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 auscontent_area.pyübernommen, statt einen zweiten zu erfinden. Verdrahtet ist das in der Linkerfassung voncrawl/spider.py, hinterlink_position.classify(Standard aus, denn eine Position pro Link kostet bei großen Crawls Speicher). Site-weit aggregiertcrawl/linkgraph.pydie Werte überinlink_composition. Das speist einen neuen BefundINLINK_BOILERPLATE_ONLYfü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_inlinksberechnet (LOW_LINK_SCORE). Dazu kommen ein Canonical-Ziel, auf das kein Hyperlink zeigt (UNLINKED_CANONICAL); die Erkennung vonrel="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 sindtools/duplicate.pyundtools/content_area.pyerstmals in das Audit eingebunden.ORPHAN_PAGE,SITEMAP_ORPHANund 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 (
notranslateundunavailable_after) sowie kanonische URLs mit Fragment. Die Registry wächst von 96 auf 104 Prüfungen. Siehedocs/CHECKLIST_AUDIT.md.HinzugefügtFunktioniert
asset-weight-checkergänzt: lädt die verlinkten CSS- und JS-Dateien einer Seite undmeldet renderblockierende Ressourcen…
Ergänzt:
asset-weight-checklädt die verlinkten CSS- und JS-Dateien einer Seite und meldet renderblockierende Ressourcen, übergroße Dateien, doppelte Bibliotheken (per Content-Hash), fehlende Minifizierung, fehlendesfont-display, JS mit veralteten Polyfills sowie fehlende Komprimierung und langlebiges Caching.HinzugefügtFunktioniert
crawl-site --sitemap <url>ergänzt (undsitemaps.auto_discoverin--config): Dernative Crawler startet aus den deklarierten URLs einer Sitemap…
Ergänzt:
crawl-site --sitemap <url>sowiesitemaps.auto_discoverin--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 insummary.sitemapderaudit.jsongeschrieben. Dafür gelten dieselben Prüf-IDsSITEMAP_ORPHANundURL_NOT_IN_SITEMAPwie in der Screaming-Frog-Pipeline.HinzugefügtFunktioniert
crawl-site --config-helpergänzt, generiert ausseohead/crawl/config.py, und zweialte Flags aus der Hilfe ausgeblendet…
Ergänzt:
crawl-site --config-help, generiert ausseohead/crawl/config.py. Die Optionen--max-depthund--min-delaysind aus--helpausgeblendet, 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_techaufgeteilt…
Das Technologie-Fingerprinting ist jetzt in einen Abruf-Schritt und einen reinen Schritt
analyze_techaufgeteilt. Analytics- und Tag-Manager-IDs werden erfasst statt nur ihrer Namen. Neu ist der Berichttag_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_CHAINundREDIRECT_LOOPbrauchen damit keinen nativen Redirect-Chains-Bericht von Screaming Frog mehr. Ein Export im Light-Profil oder ein Lauf voncrawl-siteliefert dieselben Befunde.HinzugefügtFunktioniertKonfigurierbarer Inhaltsbereich (
content_area.py) ergänzt, der die Wortanzahl auf denHauptbereich 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.pygetrennt: exakte Treffer werden aus demextrahierten Text gehasht…
Exakte und Near-Duplicates werden in
duplicate.pygetrennt. 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 derInhaltsbereich…
Ergänzt: abhängigkeitsfreie Markdown-Extraktion (
markdown_extract.py). Sie bietet eine Ausgabe nur des Inhaltsbereichs und eine Ausgabe des gesamten Dokuments.GeändertFunktioniert
markdown_extractundboilerplate_reportin CLI und MCP eingebunden, als…markdown_extractundboilerplate_reportsind jetzt in CLI und MCP eingebunden, alsmarkdown-extract/seo_markdown_extractundboilerplate-report/seo_boilerplate_report. Damit stehen 47 Kern-Tools bereit, vorher 45. Außerdem hatseo_duplicate_checkjetzt das Flagonly_indexablein der MCP-Signatur, dasduplicate_checkauf Handler-Ebene schon hatte. In der MCP-Signatur war es übersehen worden. Der URL-Pfad voncitability-checkwurde neu auf die Markdown-Ausgabe ausmarkdown_extractdes Inhaltsbereichs umgestellt. Bisher lief er über das Feldtextdes 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 Feldtextdes Parsers selbst, das weiterhin das gesamte Dokument umfasst.page_facts.pyextrahiert daraus Schema-Belege wiesameAs-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üfungenTHIN_CONTENTundLOW_TEXT_RATIOinsf/core/rules.py. Derenword_countundtext_ratiostammen 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 ausparser.parse_htmlgelesen wird.GeändertFunktioniertNamenskonvention festgehalten (
docs/NAMING.md) und Kollisionen bei Modul-Basenamenaufgelöst…
Eine Namenskonvention ist in
docs/NAMING.mdfestgehalten. 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-reviewergänzt und dreipraxisnahe Rezepte…
Ergänzt: der berechtigungspflichtige Workflow-Skill
analytics-console-reviewund drei praxisnahe Rezepte.- GeändertFunktioniertUnterstützung der aktuellen Sicherheitslinie
3.xdokumentiert. 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-siteergä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 übercache.mode. Der Standard istoff, damit sich hinter einem Default kein Seiteneffekt verbirgt. Umgesetzt sind echte HTTP-Frischelogik (max-age/Expires, Revalidierung überETag/Last-Modified,Vary-bewusste Varianten,no-store/no-cachewerden beachtet). Ein Modusreplayzum Debuggen wird im Manifest vermerkt und ist nie der Standard. Das Flaginvalidateerzwingt einen expliziten harten Refresh. Jede abgerufene Seite trägtcache_status(hit/revalidated/miss). Der Lauf trägtcache_statsundcache_replaysowohl im Handler-Output als auch imrun-Block deraudit.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 infetch_oneselbst ausgelöst, wenn tatsächlich ein echter Netzwerk-Roundtrip bevorsteht.HinzugefügtFunktioniertJournal-gesteuerte Wiederverwendung in
seohead/core/runlog.pyergänzt(
SEOHEAD_REUSE_POLICY, ein Höchstalter pro Tool…Ergänzt: journal-gesteuerte Wiederverwendung in
seohead/core/runlog.py.SEOHEAD_REUSE_POLICYsetzt 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 mitreused: trueundreused_from_tsmarkiert, 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.
3.0.0
Erster öffentlicher Snapshot30. August 202610 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.