AI Slop Code RIsk Monitor

nowork-studio/NotFair

Open-source SEO, GEO, and marketing skills for AI agents.

23.6 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for nowork-studio/NotFair, a Python project with 3,917 GitHub stars. SynthScan examined 32,386 lines of code across 277 source files, recording 430 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 23.6 (Elevated pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

23.6
Adjusted Signal
23.6
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
3.9K
Stars
Python
Language
32.4K
Lines of Code
277
Files
430
Pattern Hits
2026-10-12
Scan Date
0.12
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 34.1/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 260 finding(s).

Hallucinated Dependency & Supply Chain Risk 2.4/100 · LOW

Are imports declared and package/API names verified? 15 finding(s).

Agent Over-Engineering Ratio 65.9/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 371 finding(s).

PR Review Velocity Impact 70.3/100 · HIGH

Which changes need focused human review? 430 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 34MEDIUM 93LOW 303

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 430 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Decorative Section Separators82 hits · 260 pts
SeverityFileLineSnippetContext
MEDIUMtest/install.test.sh15# ─── Helpers ─────────────────────────────────────────────────COMMENT
MEDIUMtest/install.test.sh136# ─── Test 1: Plugin metadata exists and is valid ─────────────COMMENT
MEDIUMtest/install.test.sh186# ─── Test 2: All skills exist with SKILL.md ──────────────────COMMENT
MEDIUMtest/install.test.sh206# ─── Test 3: Legacy structure removed, helper bin retained ─────────COMMENT
MEDIUMtest/install.test.sh251# ─── Test 4: Shared preambles exist ─────────────────────────COMMENT
MEDIUMtest/install.test.sh278# ─── Test 5: MCP server configuration ───────────────────────COMMENT
MEDIUMtest/install.test.sh304# ─── Test 6: Connectors section in README ─────────────────────COMMENT
MEDIUMtest/install.test.sh319# ─── Test 7: Reference docs exist ───────────────────────────COMMENT
MEDIUMtest/install.test.sh329# ─── Test 8: Eval fixtures exist where shipped ───────────────COMMENT
MEDIUMtest/install.test.sh340# ─── Test 9: Frontmatter has argument-hint ───────────────────COMMENT
MEDIUMtest/install.test.sh352# ─── Results ──────────────────────────────────────────────────COMMENT
MEDIUM⚡test/unit/test_strapi_scripts.py353# ── preflight_strapi.py — SSRF protection ─────────────────────────────────────COMMENT
MEDIUMtest/unit/test_strapi_scripts.py17# ── Load scripts without executing main() ────────────────────────────────────COMMENT
MEDIUMtest/unit/test_strapi_scripts.py41# ── fetch_strapi_content.py ───────────────────────────────────────────────────COMMENT
MEDIUMtest/unit/test_strapi_scripts.py250# ── push_strapi_seo.py ────────────────────────────────────────────────────────COMMENT
MEDIUM⚡test/unit/test_cms_scripts.py94# ── fetch_wordpress_content.py ────────────────────────────────────────────────COMMENT
MEDIUM⚡test/unit/test_cms_scripts.py265# ── fetch_contentful_content.py ───────────────────────────────────────────────COMMENT
MEDIUM⚡test/unit/test_cms_scripts.py380# ── fetch_ghost_content.py ────────────────────────────────────────────────────COMMENT
MEDIUM⚡test/unit/test_cms_scripts.py458# ── SSRF protection (shared logic, tested via WordPress) ──────────────────────COMMENT
MEDIUM⚡test/unit/test_cms_scripts.py482# ── WordPress auth header ─────────────────────────────────────────────────────COMMENT
MEDIUM⚡test/unit/test_cms_scripts.py504# ── SEO audit (Ghost, same logic as WordPress) ────────────────────────────────COMMENT
MEDIUMtest/unit/test_cms_scripts.py16# ── Load scripts without executing main() ────────────────────────────────────COMMENT
MEDIUMtest/unit/test_cms_scripts.py39# ── cms_detect.py ─────────────────────────────────────────────────────────────COMMENT
MEDIUMscripts/notfair-update-check.sh28# ─── Dev symlink: skip update checks entirely ────────────────COMMENT
MEDIUMscripts/notfair-update-check.sh42# ─── Step 0: Check if updates are disabled ────────────────────COMMENT
MEDIUMscripts/notfair-update-check.sh48# ─── Snooze helper ──────────────────────────────────────────COMMENT
MEDIUMscripts/notfair-update-check.sh91# ─── Step 1: Read and validate local version ─────────────────COMMENT
MEDIUMscripts/notfair-update-check.sh104# ─── Step 2: Check "just upgraded" marker ─────────────────────COMMENT
MEDIUMscripts/notfair-update-check.sh117# ─── Step 3: Check cache freshness ──────────────────────────COMMENT
MEDIUMscripts/notfair-update-check.sh151# ─── Step 4: Slow path — fetch remote version ────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py62# ── SSRF protection ───────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py102# ── Config loading ────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py151# ── HTTP helpers with retry ───────────────────────────────────────────────────COMMENT
MEDIUM⚡seo/seo-analysis/scripts/push_strapi_seo.py208# ── Version detection ─────────────────────────────────────────────────────────COMMENT
MEDIUM⚡seo/seo-analysis/scripts/push_strapi_seo.py218# ── Current SEO value fetching ────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py245# ── Payload builder ───────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py278# ── Diff display ──────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py299# ── Confirmation ──────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py311# ── Core update logic ─────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py416# ── CLI ───────────────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_wordpress.py33# ── Config loading ────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_wordpress.py81# ── Security: SSRF protection ─────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_wordpress.py125# ── HTTP helper ───────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_wordpress.py171# ── Validation checks ─────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_contentful.py29# ── Config loading ────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_contentful.py78# ── HTTP helper with retry ────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_contentful.py113# ── Validation checks ─────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_ghost_content.py46# ── Config loading ────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_ghost_content.py130# ── HTTP helper with retry ────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_ghost_content.py197# ── Response normalisation ────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_ghost_content.py239# ── Pagination ────────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_ghost_content.py281# ── SEO audit ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_ghost.py32# ── Config loading ────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_ghost.py79# ── Security: SSRF protection ─────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_ghost.py122# ── HTTP helper with retry ────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/preflight_ghost.py153# ── Validation checks ─────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_strapi_content.py43# ── SSRF protection ───────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_strapi_content.py83# ── Config loading ────────────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_strapi_content.py132# ── HTTP helper with retry ────────────────────────────────────────────────────COMMENT
MEDIUMseo/seo-analysis/scripts/fetch_strapi_content.py167# ── Version detection ─────────────────────────────────────────────────────────COMMENT
22 more matches not shown…
Hyper-Verbose Identifiers216 hits · 218 pts
SeverityFileLineSnippetContext
LOWtest/test_skill_routing_e2e.py150def test_routing_seo_triggers():CODE
LOWtest/test_skill_routing_e2e.py164def test_routing_seo_non_triggers():CODE
LOWtest/test_skill_llm_eval.py59def test_seo_quick_wins_clarity():CODE
LOWtest/test_skill_llm_eval.py67def test_seo_report_format_clarity():CODE
LOW⚡test/test_ads_skill_llm_eval.py55def test_ads_heuristics_clarity():CODE
LOW⚡test/test_ads_skill_llm_eval.py63def test_ads_workflows_clarity():CODE
LOW⚡test/test_ads_skill_llm_eval.py71def test_ads_audit_scoring_clarity():CODE
LOW⚡test/test_ads_skill_llm_eval.py79def test_ads_audit_report_clarity():CODE
LOW⚡test/test_ads_skill_llm_eval.py87def test_ads_copy_formulas_clarity():CODE
LOWtest/test_mcp_skill_e2e.py36def test_universal_mcp_is_the_only_registered_server_and_skills_are_portable():CODE
LOWtest/test_mcp_skill_e2e.py71def test_ads_wrappers_resolve_from_the_plugin_root_without_fallback():CODE
LOWtest/test_mcp_skill_e2e.py82def test_all_host_configs_and_registry_use_one_versioned_connection():CODE
LOWtest/test_mcp_skill_e2e.py116def test_active_plugin_files_do_not_advertise_legacy_endpoints():CODE
LOWtest/test_mcp_skill_e2e.py140def test_live_mcp_oauth_discovery_round_trip(origin):CODE
LOWtest/test_skill_e2e.py76def test_seo_no_gsc_technical_audit():CODE
LOWtest/test_skill_e2e.py118def test_seo_fixture_full_audit():CODE
LOWtest/unit/test_security_boundaries.py34 def test_private_aliases_and_nonpublic_addresses_never_connect(self):CODE
LOWtest/unit/test_security_boundaries.py44 def test_all_dns_answers_validated_and_actual_connect_pinned(self):CODE
LOWtest/unit/test_security_boundaries.py55 def test_scheme_credentials_and_proxy_cannot_bypass(self):CODE
LOWtest/unit/test_security_boundaries.py65 def test_redirects_recheck_destination_and_preserve_public_fetch(self):CODE
LOWtest/unit/test_security_boundaries.py93 def test_every_cms_get_preserves_same_origin_and_rejects_other_origin(self):CODE
LOWtest/unit/test_security_boundaries.py124 def test_origin_normalization_scheme_changes_and_put_behavior(self):CODE
LOWtest/unit/test_security_boundaries.py134 def test_both_metadata_fields_are_text_for_every_json_type(self):CODE
LOW⚡test/unit/test_strapi_scripts.py161 def test_meta_description_too_short(self):CODE
LOW⚡test/unit/test_strapi_scripts.py167 def test_meta_description_too_long(self):CODE
LOW⚡test/unit/test_strapi_scripts.py173 def test_root_field_fallback_for_meta_title(self):CODE
LOW⚡test/unit/test_strapi_scripts.py180 def test_seo_schema_component_when_seo_key_present(self):CODE
LOW⚡test/unit/test_strapi_scripts.py186 def test_all_fields_present_with_valid_seo(self):CODE
LOW⚡test/unit/test_strapi_scripts.py275 def test_component_schema_wraps_in_seo(self):CODE
LOW⚡test/unit/test_strapi_scripts.py281 def test_root_fields_schema_flat(self):CODE
LOW⚡test/unit/test_strapi_scripts.py287 def test_returns_none_when_nothing_to_update(self):CODE
LOW⚡test/unit/test_strapi_scripts.py291 def test_merges_existing_seo_component(self):CODE
LOW⚡test/unit/test_strapi_scripts.py299 def test_both_fields_in_update(self):CODE
LOW⚡test/unit/test_strapi_scripts.py306 def test_auto_detect_component_from_current_attrs(self):CODE
LOW⚡test/unit/test_strapi_scripts.py312 def test_auto_detect_root_when_no_seo_key(self):CODE
LOW⚡test/unit/test_strapi_scripts.py319 def test_none_current_attrs_handled(self):CODE
LOW⚡test/unit/test_strapi_scripts.py328 def test_guard_skips_when_timestamps_match(self):CODE
LOW⚡test/unit/test_strapi_scripts.py333 def test_guard_fires_when_timestamps_differ(self):CODE
LOW⚡test/unit/test_strapi_scripts.py339 def test_guard_skips_check_when_expected_empty(self):CODE
LOW⚡test/unit/test_strapi_scripts.py346 def test_guard_skips_check_when_live_empty(self):CODE
LOWtest/unit/test_strapi_scripts.py74 def test_returns_empty_dict_for_none(self):CODE
LOWtest/unit/test_strapi_scripts.py78 def test_returns_empty_dict_for_empty_dict(self):CODE
LOWtest/unit/test_strapi_scripts.py94 def test_missing_fields_default_to_empty_string(self):CODE
LOWtest/unit/test_strapi_scripts.py138 def test_title_fallback_to_name(self):CODE
LOWtest/unit/test_strapi_scripts.py145 def test_missing_meta_title_flag(self):CODE
LOWtest/unit/test_strapi_scripts.py233 def test_entry_with_multiple_issues_counted_once_in_complete(self):CODE
LOWtest/unit/test_strapi_scripts.py376 def test_public_ip_is_not_private(self):CODE
LOWtest/unit/test_strapi_scripts.py382 def test_invalid_string_returns_false(self):CODE
LOW⚡test/unit/test_cms_scripts.py89 def test_missing_file_returns_empty(self):CODE
LOW⚡test/unit/test_cms_scripts.py102 def test_yoast_head_json_extracted(self):CODE
LOW⚡test/unit/test_cms_scripts.py128 def test_yoast_takes_priority_over_rank_math(self):CODE
LOW⚡test/unit/test_cms_scripts.py136 def test_no_seo_plugin_returns_empty_meta_title(self):CODE
LOW⚡test/unit/test_cms_scripts.py146 def test_partial_yoast_missing_description(self):CODE
LOW⚡test/unit/test_cms_scripts.py173 def test_document_id_is_string(self):CODE
LOW⚡test/unit/test_cms_scripts.py182 def test_seo_fields_extracted(self):CODE
LOW⚡test/unit/test_cms_scripts.py187 def test_missing_meta_title_flagged(self):CODE
LOW⚡test/unit/test_cms_scripts.py195 def test_meta_title_too_long_flagged(self):CODE
LOW⚡test/unit/test_cms_scripts.py207 def test_meta_description_too_short_flagged(self):CODE
LOW⚡test/unit/test_cms_scripts.py213 def test_meta_description_too_long_flagged(self):CODE
LOW⚡test/unit/test_cms_scripts.py219 def test_meta_description_in_range_not_flagged(self):CODE
156 more matches not shown…
Empty Error Handlers28 hits · 140 pts
SeverityFileLineSnippetContext
HIGHtest/test_skill_e2e.py141except Exception:CODE
HIGHseo/seo-analysis/scripts/push_strapi_seo.py98except (socket.gaierror, OSError):CODE
HIGHseo/seo-analysis/scripts/push_strapi_seo.py117except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/url_inspection.py49except (OSError, ValueError):CODE
HIGHseo/seo-analysis/scripts/url_inspection.py234except (ValueError, TypeError):CODE
HIGHseo/seo-analysis/scripts/_uid.py76except (OSError, NotImplementedError):CODE
HIGHseo/seo-analysis/scripts/_uid.py85except OSError:CODE
HIGHseo/seo-analysis/scripts/preflight_wordpress.py48except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/preflight_wordpress.py121except (socket.gaierror, OSError):CODE
HIGHseo/seo-analysis/scripts/preflight_wordpress.py246except Exception:CODE
HIGHseo/seo-analysis/scripts/analyze_gsc.py51except (OSError, ValueError):CODE
HIGHseo/seo-analysis/scripts/preflight_contentful.py44except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/pagespeed.py41except OSError:CODE
HIGHseo/seo-analysis/scripts/fetch_ghost_content.py61except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/fetch_ghost_content.py126except (socket.gaierror, OSError):CODE
HIGHseo/seo-analysis/scripts/preflight_ghost.py47except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/preflight_ghost.py118except (socket.gaierror, OSError):CODE
HIGHseo/seo-analysis/scripts/fetch_strapi_content.py79except (socket.gaierror, OSError):CODE
HIGHseo/seo-analysis/scripts/fetch_strapi_content.py98except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/preflight_strapi.py43except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/preflight_strapi.py95except (socket.gaierror, OSError):CODE
HIGHseo/seo-analysis/scripts/fetch_wordpress_content.py76except (socket.gaierror, OSError):CODE
HIGHseo/seo-analysis/scripts/fetch_wordpress_content.py95except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/cms_detect.py31except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/list_gsc_sites.py25except (OSError, ValueError):CODE
HIGHseo/seo-analysis/scripts/fetch_contentful_content.py54except (OSError, PermissionError):CODE
HIGHseo/seo-analysis/scripts/preflight.py51except FileNotFoundError:CODE
HIGHseo/seo-analysis/scripts/preflight.py377except OSError:CODE
Excessive Try-Catch Wrapping39 hits · 49 pts
SeverityFileLineSnippetContext
LOWtest/test_skill_e2e.py141 except Exception:CODE
LOWtest/helpers/eval_store.py57 except Exception:CODE
LOWtest/helpers/eval_store.py65 except Exception:CODE
MEDIUMtest/helpers/eval_store.py46def _git_info() -> tuple[str, str]:CODE
LOWtest/helpers/llm_judge.py62 except Exception as e:CODE
LOWscripts/notfair-change-watch.sh114except Exception:STRING
LOWseo/seo-analysis/scripts/push_strapi_seo.py76 except Exception:CODE
LOW⚡seo/seo-analysis/scripts/push_strapi_seo.py226 except Exception as e:CODE
LOWseo/seo-analysis/scripts/push_strapi_seo.py331 except Exception:CODE
MEDIUMseo/seo-analysis/scripts/push_strapi_seo.py64def _is_private_ip(ip_str):CODE
LOWseo/seo-analysis/scripts/url_inspection.py319 except Exception as exc:CODE
LOWseo/seo-analysis/scripts/_uid.py50 except Exception:CODE
LOWseo/seo-analysis/scripts/_uid.py82 except Exception:CODE
LOWseo/seo-analysis/scripts/preflight_wordpress.py95 except Exception:CODE
LOWseo/seo-analysis/scripts/preflight_wordpress.py246 except Exception:CODE
MEDIUMseo/seo-analysis/scripts/preflight_wordpress.py83def _is_private_ip(ip_str):CODE
LOWseo/seo-analysis/scripts/analyze_gsc.py539 except Exception:CODE
LOWseo/seo-analysis/scripts/analyze_gsc.py618 except Exception as exc:CODE
MEDIUMseo/seo-analysis/scripts/analyze_gsc.py56def get_access_token():CODE
LOWseo/seo-analysis/scripts/pagespeed.py74 except Exception as e:CODE
LOWseo/seo-analysis/scripts/pagespeed.py305 except Exception as exc:CODE
LOWseo/seo-analysis/scripts/fetch_ghost_content.py105 except Exception:CODE
MEDIUMseo/seo-analysis/scripts/fetch_ghost_content.py94def _is_private_ip(ip_str):CODE
LOWseo/seo-analysis/scripts/preflight_ghost.py92 except Exception:CODE
MEDIUMseo/seo-analysis/scripts/preflight_ghost.py81def _is_private_ip(ip_str):CODE
LOWseo/seo-analysis/scripts/fetch_strapi_content.py57 except Exception:CODE
MEDIUMseo/seo-analysis/scripts/fetch_strapi_content.py45def _is_private_ip(ip_str):CODE
LOWseo/seo-analysis/scripts/preflight_strapi.py104 except Exception:CODE
LOWseo/seo-analysis/scripts/preflight_strapi.py252 except Exception:CODE
LOWseo/seo-analysis/scripts/fetch_wordpress_content.py55 except Exception:CODE
MEDIUMseo/seo-analysis/scripts/fetch_wordpress_content.py44def _is_private_ip(ip_str):CODE
LOWseo/seo-analysis/scripts/preflight.py189 except Exception:CODE
LOWseo/broken-link-checker/scripts/checker.py135 except Exception as e2:CODE
LOWseo/broken-link-checker/scripts/checker.py140 except Exception as e:CODE
LOWseo/broken-link-checker/scripts/checker.py160 except Exception as e:CODE
LOWseo/broken-link-checker/scripts/checker.py210 except Exception as e:CODE
LOWseo/broken-link-checker/scripts/checker.py225 except Exception as e:CODE
MEDIUMseo/broken-link-checker/scripts/checker.py226 print(f"Error crawling {current_url}: {e}", file=sys.stderr)CODE
MEDIUMseo/broken-link-checker/scripts/checker.py26def _validate_public_url(url):CODE
Cross-File Repetition6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHseo/seo-analysis/scripts/url_inspection.py0return the quota_project_id from the adc json file, or none.STRING
HIGHseo/seo-analysis/scripts/analyze_gsc.py0return the quota_project_id from the adc json file, or none.STRING
HIGHseo/seo-analysis/scripts/list_gsc_sites.py0return the quota_project_id from the adc json file, or none.STRING
HIGHseo/seo-analysis/scripts/fetch_ghost_content.py0paginate through all entries. returns list of normalised entries.STRING
HIGHseo/seo-analysis/scripts/fetch_wordpress_content.py0paginate through all entries. returns list of normalised entries.STRING
HIGHseo/seo-analysis/scripts/fetch_contentful_content.py0paginate through all entries. returns list of normalised entries.STRING
Deep Nesting27 hits · 27 pts
SeverityFileLineSnippetContext
LOWtest/unit/test_security_boundaries.py65CODE
LOWtest/unit/test_security_boundaries.py93CODE
LOWtest/unit/test_broken_link_checker.py24CODE
LOWtest/unit/test_broken_link_checker.py39CODE
LOWtest/helpers/session_runner.py49CODE
LOWseo/seo-analysis/scripts/push_strapi_seo.py104CODE
LOWseo/seo-analysis/scripts/push_strapi_seo.py418CODE
LOWseo/seo-analysis/scripts/url_inspection.py212CODE
LOWseo/seo-analysis/scripts/url_inspection.py251CODE
LOWseo/seo-analysis/scripts/preflight_wordpress.py35CODE
LOWseo/seo-analysis/scripts/preflight_wordpress.py199CODE
LOWseo/seo-analysis/scripts/analyze_gsc.py151CODE
LOWseo/seo-analysis/scripts/show_pagespeed.py78CODE
LOWseo/seo-analysis/scripts/preflight_contentful.py31CODE
LOWseo/seo-analysis/scripts/pagespeed.py29CODE
LOWseo/seo-analysis/scripts/fetch_ghost_content.py48CODE
LOWseo/seo-analysis/scripts/preflight_ghost.py34CODE
LOWseo/seo-analysis/scripts/fetch_strapi_content.py85CODE
LOWseo/seo-analysis/scripts/preflight_strapi.py30CODE
LOWseo/seo-analysis/scripts/fetch_wordpress_content.py82CODE
LOWseo/seo-analysis/scripts/cms_detect.py18CODE
LOWseo/seo-analysis/scripts/fetch_contentful_content.py41CODE
LOWseo/seo-analysis/scripts/preflight.py31CODE
LOWseo/seo-analysis/scripts/preflight.py357CODE
LOWseo/broken-link-checker/scripts/checker.py116CODE
LOWseo/broken-link-checker/scripts/checker.py144CODE
LOWseo/broken-link-checker/scripts/checker.py105CODE
Structural Annotation Overuse10 hits · 15 pts
SeverityFileLineSnippetContext
LOWgoogle-ads/audit/references/business-context.md7### Step 1: Resolve the website URLCOMMENT
LOWgoogle-ads/audit/references/business-context.md13### Step 2: Crawl the websiteCOMMENT
LOWgoogle-ads/audit/references/business-context.md32### Step 3: Extract business context from crawled pagesCOMMENT
LOWseo/seo-analysis/WORKFLOW.md721### Step 1: Find Queries Without Dedicated PagesCOMMENT
LOWseo/seo-analysis/WORKFLOW.md742### Step 2: Build Topic Clusters from GSC DataCOMMENT
LOWseo/seo-analysis/WORKFLOW.md752### Step 3: Business Context Gap CheckCOMMENT
LOWseo/seo-analysis/WORKFLOW.md763### Step 4: Offer Deeper Keyword ResearchCOMMENT
LOW…keyword-research/references/topic-cluster-templates.md13### Step 1: Define the Pillar TopicCOMMENT
LOW…keyword-research/references/topic-cluster-templates.md36### Step 2: Map Cluster SubtopicsCOMMENT
LOW…keyword-research/references/topic-cluster-templates.md49### Step 3: Define Internal Linking MapCOMMENT
Unused Imports10 hits · 10 pts
SeverityFileLineSnippetContext
LOWtest/unit/test_security_boundaries.py6CODE
LOWtest/unit/test_security_boundaries.py14CODE
LOWtest/unit/test_strapi_scripts.py12CODE
LOWtest/helpers/touchfiles.py11CODE
LOWscripts/notfair-content-calendar.py16CODE
LOWseo/seo-analysis/scripts/url_inspection.py36CODE
LOWseo/seo-analysis/scripts/_uid.py28CODE
LOWseo/seo-analysis/scripts/analyze_gsc.py24CODE
LOWseo/seo-analysis/scripts/list_gsc_sites.py12CODE
LOWseo/broken-link-checker/scripts/checker.py15CODE
Fake / Example Data5 hits · 6 pts
SeverityFileLineSnippetContext
LOW⚡test/unit/test_analyze_gsc.py364 result = gsc.gsc_query('fake-token', 'sc-domain:test.com', {'dimensions': ['query']})CODE
LOW⚡test/unit/test_analyze_gsc.py370 result = gsc.gsc_query('fake-token', 'sc-domain:test.com', {'dimensions': ['query']})CODE
LOW⚡test/unit/test_analyze_gsc.py392 result = gsc.gsc_query('fake-token', 'sc-domain:test.com', {'dimensions': ['query']})CODE
LOWtest/unit/test_analyze_gsc.py248 return gsc.pull_period_comparison('fake-token', 'sc-domain:test.com', 28)CODE
LOWseo/shared/business-context.md259 "business_name": "Acme Corp",CODE
Example Usage Blocks2 hits · 3 pts
SeverityFileLineSnippetContext
LOWtest/install.test.sh4# Usage:COMMENT
LOWscripts/notfair-config.sh4# Usage:COMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMtest/test_skill_routing_e2e.py103 # Hard harness failure (timeout/crash) must not silently pass "should not trigger" testsCOMMENT
Over-Commented Block3 hits · 3 pts
SeverityFileLineSnippetContext
LOWscripts/notfair-change-watch.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/notfair-change-watch.sh21# notfair-change-watch ics <account> <change_id> > reminder.icsCOMMENT
LOWscripts/notfair-update-check.sh1#!/usr/bin/env bashCOMMENT
Verbosity Indicators1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtest/unit/test_broken_link_checker.py148 # We need to check if /private is skipped.COMMENT