Goal-driven, loop-powered marketing agents that crush your business goals 24/7
This report presents the forensic synthetic code analysis of nowork-studio/NotFair, a TypeScript project with 3,336 GitHub stars. SynthScan v2.0 examined 97,398 lines of code across 562 source files, recording 521 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 9.2 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 521 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | notfair/src/server/goals/tick.more.test.ts | 286 | // ── pure brief composition ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 83 | // ── get_goal ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 152 | // ── define_goal (chat intake, step 1) ──────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 188 | // ── propose_goal_metric (chat intake, step 2) ──────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 266 | // ── backfill_metric_history ────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 321 | // ── add_supporting_metric ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 417 | // ── propose_target (chat intake, step 3) ───────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 493 | // ── amend_goal (live adjustments) ──────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 552 | // ── log_goal_action ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 599 | // ── review_goal_action ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 636 | // ── log_learning / search_learnings (per-agent memory) ─────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 671 | // ── update_goal_status ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 712 | // ── shared workspace context ───────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/goals/handlers.ts | 755 | // ── register_pull_request ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 27 | // ── Shared helpers ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 81 | // ── browser_status ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 108 | // ── browser_tabs ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 123 | // ── browser_open ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 151 | // ── browser_close ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 170 | // ── browser_navigate ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 192 | // ── browser_snapshot ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 227 | // ── browser_click ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 257 | // ── browser_type ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 287 | // ── browser_press ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 315 | // ── browser_scroll ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 336 | // ── browser_back ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 362 | // ── Helpers ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 374 | // ── Registry export ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/browser-tools.ts | 376 | // ─── Tool descriptions ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 36 | // ── Shared scaffolding ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 75 | // ── get_goal ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 88 | // ── define_goal ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 124 | // ── propose_goal_metric ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 164 | // ── backfill_metric_history ──────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 197 | // ── add_supporting_metric ────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 244 | // ── propose_target / amend_goal ──────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 315 | // ── log_goal_action ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 378 | // ── review_goal_action ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 408 | // ── log_learning / search_learnings ──────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 450 | // ── update_goal_status ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 474 | // ── get_project / set_shared_context ─────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 508 | // ── register_pull_request ────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/mcp-server/tools.ts | 541 | // ── Registry ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/browser/session.ts | 241 | // ── Idle auto-shutdown ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/sessions/view.ts | 87 | // ── Thread origins ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.test.ts | 70 | // ── fetch fixture: a routable fake OAuth ecosystem ─────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.test.ts | 138 | // ── startMcpConnect ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.test.ts | 250 | // ── probeMcpDiscovery ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.test.ts | 337 | // ── disconnectMcpAction ────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.test.ts | 368 | // ── listMcpToolsAction ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.test.ts | 442 | // ── addUserMcpServerAction ─────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.test.ts | 526 | // ── removeUserMcpServerAction ──────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/mcp.ts | 395 | // ─── helpers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/context.ts | 108 | // ── Instruction files ───────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/context.ts | 134 | // ── MCP tool definitions ────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/actions/context.ts | 148 | // ── Conversation (this thread) ──────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/db/goals.ts | 149 | // ── goals ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/db/goals.ts | 534 | // ── pins ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/db/goals.ts | 657 | // ── metric snapshots ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | notfair/src/server/db/goals.ts | 709 | // ── actions ────────────────────────────────────────────────────────────── | COMMENT |
| 91 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | notfair/src/app/api/upgrade/route.ts | 340 | export async function syncInstalledNativeBindings(packageRoot: string) { | CODE |
| LOW | notfair/src/server/goals/handlers.ts | 773 | export async function handleRegisterPullRequest( | CODE |
| LOW | notfair/src/server/goals/recovery.ts | 91 | export function recoverInterruptedGoalTicks( | CODE |
| LOW | notfair/src/server/goals/intake.ts | 15 | export function buildIntakeKickoffMessage(input: { | CODE |
| LOW | notfair/src/server/mcp-server/secret.ts | 22 | export function getOrCreateMcpServerSecret(): string { | CODE |
| LOW | notfair/src/server/mcp-server/secret.ts | 22 | export function getOrCreateMcpServerSecret(): string { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 153 | async function handleProposeGoalMetricTool(input: unknown): Promise<ToolResult> { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 186 | async function handleBackfillHistoryTool(input: unknown): Promise<ToolResult> { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 233 | async function handleAddSupportMetricTool(input: unknown): Promise<ToolResult> { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 397 | async function handleReviewGoalActionTool(input: unknown): Promise<ToolResult> { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 441 | async function handleSearchLearningsTool(input: unknown): Promise<ToolResult> { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 465 | async function handleUpdateGoalStatusTool(input: unknown): Promise<ToolResult> { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 497 | async function handleSetSharedContextTool(input: unknown): Promise<ToolResult> { | CODE |
| LOW | notfair/src/server/mcp-server/tools.ts | 528 | async function handleRegisterPullRequestTool( | CODE |
| LOW | notfair/src/server/mcp-server/registration.ts | 62 | export async function registerBrowserMcpForAgent( | CODE |
| LOW | notfair/src/server/mcp-server/registration.ts | 74 | async function registerInternalMcpForAgent(args: { | CODE |
| LOW | notfair/src/server/mcp-server/registration.ts | 117 | export async function registerCatalogMcpForAgent( | CODE |
| LOW | notfair/src/server/mcp-server/registration.ts | 178 | export async function registerCatalogMcpForProject( | CODE |
| LOW | notfair/src/server/agents/cascade-delete.ts | 41 | export async function getProjectDeletionSummary( | CODE |
| LOW | notfair/src/server/agents/cascade-delete.ts | 89 | export async function cascadeDeleteAgentArtifacts( | CODE |
| LOW | notfair/src/server/agents/cascade-delete.ts | 135 | export async function cascadeDeleteProjectArtifacts(project_slug: string): Promise<void> { | CODE |
| LOW | notfair/src/server/mcp/account-selection.ts | 43 | export async function resolvePostConnectSelection( | CODE |
| LOW | notfair/src/server/adapters/codex-local/test.ts | 5 | export async function testCodexLocalEnvironment(): Promise<HarnessEnvironmentHealth> { | CODE |
| LOW | notfair/src/server/adapters/claude-code-local/test.ts | 14 | export async function testClaudeCodeLocalEnvironment(): Promise<HarnessEnvironmentHealth> { | CODE |
| LOW | notfair/src/server/browser/chrome.ts | 70 | export function clearChromeSingletonArtifacts(userDataDir: string): void { | CODE |
| LOW | notfair/src/server/browser/session.ts | 82 | export async function getOrLaunchBrowser( | CODE |
| LOW | notfair/src/server/sessions/view.ts | 142 | function readFirstUserMessagePreview( | CODE |
| LOW | notfair/src/server/sessions/index.ts | 54 | export function getOrCreateSession(input: { | CODE |
| LOW | notfair/src/server/actions/projects.ts | 51 | export async function createProjectForOnboardingAction( | CODE |
| LOW | notfair/src/server/actions/projects.ts | 259 | export async function getProjectDeletionSummaryAction( | CODE |
| LOW | notfair/src/server/actions/projects.ts | 359 | export async function setProjectCodebasePathAction(input: { | CODE |
| LOW | notfair/src/server/actions/mcp.ts | 346 | export async function removeUserMcpServerAction(input: { | CODE |
| LOW | notfair/src/server/actions/mcp.ts | 610 | async function originFromIncomingRequest(): Promise<string> { | CODE |
| LOW | notfair/src/server/actions/goals.ts | 150 | export async function archiveCompletedGoalAction( | CODE |
| LOW | notfair/src/server/actions/goals.ts | 166 | export async function continueCompletedGoalAction( | CODE |
| LOW | notfair/src/server/actions/goals.ts | 278 | export async function markUserActionHandledAction( | CODE |
| LOW | notfair/src/server/db/projects.ts | 101 | export function setProjectGoogleAdsAccount( | CODE |
| LOW | notfair/src/server/db/user-mcp-servers.ts | 87 | export function findUserMcpServerByResourceUrl( | CODE |
| LOW | notfair/src/server/db/goal-groups.ts | 29 | function assertGoalsBelongToProject(projectSlug: string, goalIds: string[]): void { | CODE |
| LOW | notfair/src/server/db/goal-support-metrics.ts | 110 | export function recordSupportMetricSnapshot( | CODE |
| LOW | notfair/src/server/db/goal-support-metrics.ts | 132 | export function replaceSupportBackfillSnapshots( | CODE |
| LOW | notfair/src/server/db/goal-support-metrics.ts | 150 | export function listSupportMetricSnapshots( | CODE |
| LOW | notfair/src/server/db/goals.ts | 575 | export function listGatedActionsForOtherAgents( | CODE |
| LOW | notfair/src/server/db/db.ts | 35 | function ensureGoalTickOwnerColumn(db: Database.Database): void { | CODE |
| LOW | notfair/src/server/suggestions/xads.ts | 172 | export function xadsSuggestionsFromSnapshot( | CODE |
| LOW | notfair/src/server/suggestions/engine.ts | 74 | export async function generateSuggestionsForSource( | CODE |
| LOW | notfair/src/server/onboarding/accounts.ts | 136 | export async function setOnboardingAccountAction( | CODE |
| LOW | notfair/src/server/onboarding/accounts.ts | 264 | export async function setOnboardingMetaAdsAccountAction( | CODE |
| LOW | notfair/src/server/onboarding/accounts.ts | 369 | function parseGscPropertiesPayload( | CODE |
| LOW | notfair/src/server/onboarding/accounts.ts | 431 | export async function setOnboardingGscPropertyAction( | CODE |
| LOW | notfair/src/server/onboarding/accounts.ts | 491 | export async function getOnboardingConnectCardsAction( | CODE |
| LOW | notfair/src/components/mcp-icon.tsx | 26 | export function platformLogoForResourceUrl(resourceUrl: string): string | null { | CODE |
| LOW | notfair/src/lib/goal-platforms.ts | 94 | export function goalPlatformsForConnected( | CODE |
| LOW | test/test_skill_routing_e2e.py | 150 | def test_routing_seo_triggers(): | CODE |
| LOW | test/test_skill_routing_e2e.py | 164 | def test_routing_seo_non_triggers(): | CODE |
| LOW | test/test_skill_llm_eval.py | 59 | def test_seo_quick_wins_clarity(): | CODE |
| LOW | test/test_skill_llm_eval.py | 67 | def test_seo_report_format_clarity(): | CODE |
| LOW⚡ | test/test_ads_skill_llm_eval.py | 55 | def test_ads_heuristics_clarity(): | CODE |
| LOW⚡ | test/test_ads_skill_llm_eval.py | 63 | def test_ads_workflows_clarity(): | CODE |
| LOW⚡ | test/test_ads_skill_llm_eval.py | 71 | def test_ads_audit_scoring_clarity(): | CODE |
| 184 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | google-ads/shared/preamble.md | 5 | ## Step 0: Check for NotFair updates | COMMENT |
| LOW | google-ads/shared/preamble.md | 19 | ## Step 1: Resolve config | COMMENT |
| LOW | google-ads/shared/preamble.md | 44 | ## Step 2: MCP Server Detection | COMMENT |
| LOW | google-ads/shared/preamble.md | 80 | ## Step 3: Onboarding (only if accountId is missing) | COMMENT |
| LOW | google-ads/shared/preamble.md | 99 | ## Step 4: Calling tools | COMMENT |
| LOW | google-ads/audit/references/business-context.md | 7 | ### Step 1: Resolve the website URL | COMMENT |
| LOW | google-ads/audit/references/business-context.md | 13 | ### Step 2: Crawl the website | COMMENT |
| LOW | google-ads/audit/references/business-context.md | 32 | ### Step 3: Extract business context from crawled pages | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 34 | ### Step 1: Auto-upgrade | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 40 | ### Step 2: Detect current install | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 58 | ### Step 3: Save old version | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 64 | ### Step 4: Update marketplace repo and install | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 86 | ### Step 5: Update installed_plugins.json | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 114 | ### Step 6: Clean up old cache versions | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 128 | ### Step 7: Write marker + clear update state | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 137 | ### Step 8: Show What's New | COMMENT |
| LOW | notfair-upgrade-skill/SKILL.md | 153 | ### Step 9: Continue | COMMENT |
| LOW | seo/seo-analysis/SKILL.md | 728 | ### Step 1: Find Queries Without Dedicated Pages | COMMENT |
| LOW | seo/seo-analysis/SKILL.md | 749 | ### Step 2: Build Topic Clusters from GSC Data | COMMENT |
| LOW | seo/seo-analysis/SKILL.md | 759 | ### Step 3: Business Context Gap Check | COMMENT |
| LOW | seo/seo-analysis/SKILL.md | 770 | ### Step 4: Offer Deeper Keyword Research | COMMENT |
| LOW | …keyword-research/references/topic-cluster-templates.md | 13 | ### Step 1: Define the Pillar Topic | COMMENT |
| LOW | …keyword-research/references/topic-cluster-templates.md | 36 | ### Step 2: Map Cluster Subtopics | COMMENT |
| LOW | …keyword-research/references/topic-cluster-templates.md | 49 | ### Step 3: Define Internal Linking Map | COMMENT |
| LOW | seo/shared/preamble.md | 5 | ## Step 1: Check for cached GSC session | COMMENT |
| LOW | seo/shared/preamble.md | 13 | ## Step 2: Locate skill scripts | COMMENT |
| LOW | seo/shared/preamble.md | 24 | ## Step 3: Preflight — gcloud and GSC API | COMMENT |
| LOW | seo/shared/preamble.md | 42 | ## Step 4: Proceed | COMMENT |
| LOW | meta-ads/shared/preamble.md | 5 | ## Step 0: Check for NotFair updates | COMMENT |
| LOW | meta-ads/shared/preamble.md | 19 | ## Step 1: Resolve config | COMMENT |
| LOW | meta-ads/shared/preamble.md | 55 | ## Step 2: MCP Server Detection | COMMENT |
| LOW | meta-ads/shared/preamble.md | 80 | ## Step 3: Onboarding (only if metaAccountId is missing) | COMMENT |
| LOW | meta-ads/shared/preamble.md | 99 | ## Step 4: Calling tools | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/test_skill_e2e.py | 141 | except Exception: | CODE |
| LOW | test/helpers/eval_store.py | 57 | except Exception: | CODE |
| LOW | test/helpers/eval_store.py | 65 | except Exception: | CODE |
| MEDIUM | test/helpers/eval_store.py | 46 | def _git_info() -> tuple[str, str]: | CODE |
| LOW | test/helpers/llm_judge.py | 62 | except Exception as e: | CODE |
| LOW | seo/seo-analysis/scripts/push_strapi_seo.py | 75 | except Exception: | CODE |
| LOW⚡ | seo/seo-analysis/scripts/push_strapi_seo.py | 225 | except Exception as e: | CODE |
| LOW | seo/seo-analysis/scripts/push_strapi_seo.py | 330 | except Exception: | CODE |
| MEDIUM | seo/seo-analysis/scripts/push_strapi_seo.py | 63 | def _is_private_ip(ip_str): | CODE |
| LOW | seo/seo-analysis/scripts/url_inspection.py | 324 | except Exception as exc: | CODE |
| LOW | seo/seo-analysis/scripts/_uid.py | 50 | except Exception: | CODE |
| LOW | seo/seo-analysis/scripts/_uid.py | 82 | except Exception: | CODE |
| LOW | seo/seo-analysis/scripts/preflight_wordpress.py | 94 | except Exception: | CODE |
| LOW | seo/seo-analysis/scripts/preflight_wordpress.py | 245 | except Exception: | CODE |
| MEDIUM | seo/seo-analysis/scripts/preflight_wordpress.py | 82 | def _is_private_ip(ip_str): | CODE |
| LOW | seo/seo-analysis/scripts/analyze_gsc.py | 544 | except Exception: | CODE |
| LOW | seo/seo-analysis/scripts/analyze_gsc.py | 623 | except Exception as exc: | CODE |
| MEDIUM | seo/seo-analysis/scripts/analyze_gsc.py | 58 | def get_access_token(): | CODE |
| LOW | seo/seo-analysis/scripts/pagespeed.py | 74 | except Exception as e: | CODE |
| LOW | seo/seo-analysis/scripts/pagespeed.py | 305 | except Exception as exc: | CODE |
| LOW | seo/seo-analysis/scripts/fetch_ghost_content.py | 105 | except Exception: | CODE |
| MEDIUM | seo/seo-analysis/scripts/fetch_ghost_content.py | 94 | def _is_private_ip(ip_str): | CODE |
| LOW | seo/seo-analysis/scripts/preflight_ghost.py | 92 | except Exception: | CODE |
| MEDIUM | seo/seo-analysis/scripts/preflight_ghost.py | 81 | def _is_private_ip(ip_str): | CODE |
| LOW | seo/seo-analysis/scripts/fetch_strapi_content.py | 56 | except Exception: | CODE |
| MEDIUM | seo/seo-analysis/scripts/fetch_strapi_content.py | 44 | def _is_private_ip(ip_str): | CODE |
| LOW | seo/seo-analysis/scripts/preflight_strapi.py | 103 | except Exception: | CODE |
| LOW | seo/seo-analysis/scripts/preflight_strapi.py | 251 | except Exception: | CODE |
| LOW | seo/seo-analysis/scripts/fetch_wordpress_content.py | 54 | except Exception: | CODE |
| MEDIUM | seo/seo-analysis/scripts/fetch_wordpress_content.py | 43 | def _is_private_ip(ip_str): | CODE |
| LOW | seo/seo-analysis/scripts/preflight.py | 189 | except Exception: | CODE |
| LOW | seo/broken-link-checker/scripts/checker.py | 59 | except Exception as e2: | CODE |
| LOW | seo/broken-link-checker/scripts/checker.py | 64 | except Exception as e: | CODE |
| LOW | seo/broken-link-checker/scripts/checker.py | 77 | except Exception as e: | CODE |
| LOW | seo/broken-link-checker/scripts/checker.py | 127 | except Exception as e: | CODE |
| LOW | seo/broken-link-checker/scripts/checker.py | 142 | except Exception as e: | CODE |
| MEDIUM | seo/broken-link-checker/scripts/checker.py | 143 | print(f"Error crawling {current_url}: {e}", file=sys.stderr) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | seo/seo-analysis/scripts/url_inspection.py | 0 | return the quota_project_id from the adc json file, or none. | STRING |
| HIGH | seo/seo-analysis/scripts/analyze_gsc.py | 0 | return the quota_project_id from the adc json file, or none. | STRING |
| HIGH | seo/seo-analysis/scripts/list_gsc_sites.py | 0 | return the quota_project_id from the adc json file, or none. | STRING |
| HIGH | seo/seo-analysis/scripts/fetch_ghost_content.py | 0 | paginate through all entries. returns list of normalised entries. | STRING |
| HIGH | seo/seo-analysis/scripts/fetch_wordpress_content.py | 0 | paginate through all entries. returns list of normalised entries. | STRING |
| HIGH | seo/seo-analysis/scripts/fetch_contentful_content.py | 0 | paginate through all entries. returns list of normalised entries. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/unit/test_broken_link_checker.py | 23 | CODE | |
| LOW | test/unit/test_broken_link_checker.py | 34 | CODE | |
| LOW | test/helpers/session_runner.py | 49 | CODE | |
| LOW | seo/seo-analysis/scripts/push_strapi_seo.py | 103 | CODE | |
| LOW | seo/seo-analysis/scripts/push_strapi_seo.py | 417 | CODE | |
| LOW | seo/seo-analysis/scripts/url_inspection.py | 217 | CODE | |
| LOW | seo/seo-analysis/scripts/url_inspection.py | 256 | CODE | |
| LOW | seo/seo-analysis/scripts/preflight_wordpress.py | 34 | CODE | |
| LOW | seo/seo-analysis/scripts/preflight_wordpress.py | 198 | CODE | |
| LOW | seo/seo-analysis/scripts/analyze_gsc.py | 156 | CODE | |
| LOW | seo/seo-analysis/scripts/show_pagespeed.py | 78 | CODE | |
| LOW | seo/seo-analysis/scripts/preflight_contentful.py | 31 | CODE | |
| LOW | seo/seo-analysis/scripts/pagespeed.py | 29 | CODE | |
| LOW | seo/seo-analysis/scripts/fetch_ghost_content.py | 48 | CODE | |
| LOW | seo/seo-analysis/scripts/preflight_ghost.py | 34 | CODE | |
| LOW | seo/seo-analysis/scripts/fetch_strapi_content.py | 84 | CODE | |
| LOW | seo/seo-analysis/scripts/preflight_strapi.py | 29 | CODE | |
| LOW | seo/seo-analysis/scripts/fetch_wordpress_content.py | 81 | CODE | |
| LOW | seo/seo-analysis/scripts/cms_detect.py | 18 | CODE | |
| LOW | seo/seo-analysis/scripts/fetch_contentful_content.py | 41 | CODE | |
| LOW | seo/seo-analysis/scripts/preflight.py | 31 | CODE | |
| LOW | seo/seo-analysis/scripts/preflight.py | 362 | CODE | |
| LOW | seo/broken-link-checker/scripts/checker.py | 40 | CODE | |
| LOW | seo/broken-link-checker/scripts/checker.py | 68 | CODE | |
| LOW | seo/broken-link-checker/scripts/checker.py | 29 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | notfair/src/server/db/projects.test.ts | 43 | expect(result.project.display_name).toBe("Acme Corp"); | CODE |
| LOW | notfair/src/server/db/projects.test.ts | 50 | display_name: "Acme Corp", | CODE |
| LOW | notfair/src/components/onboarding-flow.tsx | 264 | placeholder="Acme Inc" | CODE |
| LOW⚡ | test/unit/test_analyze_gsc.py | 363 | result = gsc.gsc_query('fake-token', 'sc-domain:test.com', {'dimensions': ['query']}) | CODE |
| LOW⚡ | test/unit/test_analyze_gsc.py | 369 | result = gsc.gsc_query('fake-token', 'sc-domain:test.com', {'dimensions': ['query']}) | CODE |
| LOW⚡ | test/unit/test_analyze_gsc.py | 391 | result = gsc.gsc_query('fake-token', 'sc-domain:test.com', {'dimensions': ['query']}) | CODE |
| LOW | test/unit/test_analyze_gsc.py | 77 | token = 'fake-token' | CODE |
| LOW | test/unit/test_analyze_gsc.py | 247 | return gsc.pull_period_comparison('fake-token', 'sc-domain:test.com', 28) | CODE |
| LOW | seo/shared/business-context.md | 259 | "business_name": "Acme Corp", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | notfair/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | notfair/src/server/mcp/state.ts | 61 | COMMENT | |
| LOW | notfair/src/server/adapters/codex-local/execute.ts | 61 | COMMENT | |
| LOW | notfair/src/server/actions/mcp.ts | 561 | // require a confidential client; for those we register as | COMMENT |
| LOW | notfair/src/server/onboarding/accounts.ts | 461 | // | COMMENT |
| LOW | notfair/src/components/chat/use-chat-stream.ts | 161 | timer = setTimeout(tick, pollIntervalMs); | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | notfair/PLAN.md | 510 | ### CMO ↔ specialist orchestration (no custom protocol; uses MCP) | COMMENT |
| MEDIUM | notfair/PLAN.md | 544 | # Stored as JSON in SQLite guardrails table | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/unit/test_strapi_scripts.py | 12 | CODE | |
| LOW | test/unit/test_broken_link_checker.py | 5 | CODE | |
| LOW | test/helpers/touchfiles.py | 11 | CODE | |
| LOW | seo/seo-analysis/scripts/_uid.py | 28 | CODE | |
| LOW | seo/broken-link-checker/scripts/checker.py | 12 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/test_skill_routing_e2e.py | 103 | # Hard harness failure (timeout/crash) must not silently pass "should not trigger" tests | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/install.test.sh | 4 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/unit/test_broken_link_checker.py | 112 | # We need to check if /private is skipped. | COMMENT |