🗂 The essential checklist for modern web development, for humans and AI agents
This report summarizes scanner evidence for thedaviddias/Front-End-Checklist, a MDX project with 74,613 GitHub stars. SynthScan examined 194,479 lines of code across 1507 source files, recording 151 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 1.2 (Low 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.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 105 finding(s).
Are imports declared and package/API names verified? 24 finding(s).
Are wrappers, guards, and repeated structures necessary? 106 finding(s).
Which changes need focused human review? 151 finding(s).
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.
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.
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.
The scanner identified 151 distinct pattern matches across 11 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/generate/generate-readme.ts | 174 | function buildPriorityImageReferences( | CODE |
| LOW | scripts/generate/generate-readme.ts | 271 | export function buildRulesCatalogMarkdown(rules: RuleEntry[]): string { | CODE |
| LOW | scripts/generate/generate-readme.ts | 317 | export function buildReadmeCatalogMarkdown(rules: RuleEntry[]): string { | CODE |
| LOW⚡ | scripts/lib/rule-structure.ts | 190 | export function isCanonicalVerificationHeading(text: string): boolean { | CODE |
| LOW⚡ | scripts/lib/rule-structure.ts | 194 | export function isVerificationAliasHeading(text: string): boolean { | CODE |
| LOW⚡ | scripts/lib/rule-structure.ts | 198 | export function hasVerificationLikeSection(body: string): boolean { | CODE |
| LOW | scripts/lib/rule-structure.ts | 434 | function getVerificationSectionRaw(body: string): string | null { | CODE |
| LOW | scripts/lib/rule-structure.ts | 602 | export function normalizeRuleStructureBody(body: string): RuleStructureNormalization { | CODE |
| LOW | scripts/lib/rule-inline-links.ts | 157 | function detectFormulaicMetadataParagraph(text: string): boolean { | CODE |
| LOW | scripts/lib/rule-inline-links.ts | 525 | export function buildExternalLinkCandidates(input: ExternalLinkCandidateInput): CandidateLink[] { | CODE |
| LOW | scripts/lib/rule-inline-links.ts | 622 | export function buildInternalLinkCandidates(input: InternalLinkCandidateInput): CandidateLink[] { | CODE |
| LOW | scripts/lib/rule-support-data.ts | 97 | export function getProjectSupportedBrowsers(cwd = process.cwd()): string[] { | CODE |
| LOW | scripts/validation/check-directory-structure.js | 115 | function validateComponentStructure(componentsDir) { | CODE |
| LOW | scripts/validation/check-directory-structure.js | 179 | function validateDirectoryStructure() { | CODE |
| LOW | scripts/validation/check-file-complexity.js | 155 | function estimateCognitiveComplexity(content) { | CODE |
| LOW | packages/auth/src/profile.ts | 173 | function getNonNegativeIntegerProperty(source: unknown, key: string): number | undefined { | CODE |
| LOW | packages/emails/emails/transactional-starter.tsx | 78 | export function TransactionalStarterEmail({ | CODE |
| LOW | packages/emails/src/server.ts | 79 | export function createResendContactProperties(kind: ResendContactKind): ResendContactProperties { | CODE |
| LOW | packages/emails/src/server.ts | 92 | export function createResendContactPayload( | CODE |
| LOW | packages/mcp/tests/quality/rule-loader.ts | 84 | function readFrontmatterCategories(frontmatter: string, fallbackCategory: string): Category[] { | CODE |
| LOW | packages/mcp/tests/quality/mcp-quality.test.ts | 314 | function calculateRetrievalMetrics(rules: Rule[]): QualityReport['retrieval'] { | CODE |
| LOW | packages/mcp/tests/quality/mcp-quality.test.ts | 375 | function calculateImprovementImpact(rules: Rule[]): QualityReport['improvementImpact'] { | CODE |
| LOW | packages/mcp/src/server-resources.ts | 26 | function buildChecklistResourceUri(slug: string): string { | CODE |
| LOW | packages/mcp/src/tools/audit-url.ts | 296 | async function fetchWithValidatedRedirects( | CODE |
| LOW | packages/mcp/src/tools/get-workflow.ts | 47 | export function buildGetWorkflowDefinition(checklists: CuratedChecklist[]) { | CODE |
| LOW | packages/mcp/src/tools/get-checklist-rules.ts | 54 | export function buildGetChecklistRulesDefinition(checklists: CuratedChecklist[]) { | CODE |
| LOW | packages/mcp/src/tools/review-code.ts | 127 | function formatFormControlForIssue(tagName: string, inputType: string): string { | CODE |
| LOW | packages/mcp/src/tools/review-code.ts | 214 | function isLikelyFrameworkDocumentShell(code: string): boolean { | CODE |
| LOW | packages/mcp/src/tools/review-code.ts | 224 | function isLikelyMetadataDrivenSource(code: string): boolean { | CODE |
| LOW | packages/mcp/src/tools/review-code.ts | 236 | function isLikelyAsyncReactComponentSource(code: string): boolean { | CODE |
| LOW | packages/mcp/src/tools/review-code.ts | 334 | function shouldSuppressIssueForSourceContext(code: string, ruleSlug: string): boolean { | CODE |
| LOW | packages/mcp/src/utils/mdx-to-markdown.ts | 124 | function removeUnhandledComponents(content: string): string { | CODE |
| LOW | packages/storage/src/indexeddb-storage.ts | 11 | export async function initializeStorageDatabase(): Promise<IDBPDatabase<FECDatabase> | null> { | CODE |
| LOW | packages/storage/src/storage-helpers.ts | 21 | export function shouldSuppressStorageErrors(): boolean { | CODE |
| LOW | packages/storage/src/storage-helpers.ts | 86 | export function collectProjectLocalStorage(): Record<string, unknown> { | CODE |
| LOW | packages/seo/src/structured-data.ts | 26 | export function generateWebsiteStructuredData(): StructuredData { | CODE |
| LOW | packages/seo/src/structured-data.ts | 49 | export function generateRuleStructuredData(rule: Rule): StructuredData { | CODE |
| LOW | packages/seo/src/structured-data.ts | 84 | export function generateBreadcrumbStructuredData( | CODE |
| LOW | packages/seo/src/structured-data.ts | 105 | export function generateFAQStructuredData( | CODE |
| LOW | …design-system/src/motion/reduced-motion-preference.tsx | 33 | function getServerReducedMotionSnapshot() { | CODE |
| LOW | …design-system/src/motion/reduced-motion-preference.tsx | 42 | export function useReducedMotionPreference() { | CODE |
| LOW | skills/javascript-inline/references/rule.md | 140 | function initializeInputValidation() { | CODE |
| LOW | skills/webpagetest/references/rule.md | 808 | async function performanceRegressionCheck(url) { | CODE |
| LOW | skills/audio-descriptions/references/rule.md | 118 | function VideoWithDescriptionChoice({ standardSrc, extendedSrc }: { | CODE |
| LOW | skills/css-critical/references/rule.md | 476 | function measureCriticalCSSPerformance() { | CODE |
| LOW | skills/css-critical/references/rule.md | 513 | function initializeCriticalCSSTest() { | CODE |
| LOW | skills/javascript-minification/references/rule.md | 615 | function measureJavaScriptPerformance() { | CODE |
| LOW | skills/back-forward-cache/references/rule.md | 67 | function toggleUnsavedChangesProtection(isDirty) { | CODE |
| LOW | apps/web/next.config.js | 5 | function buildContentSecurityPolicy() { | CODE |
| LOW | apps/web/app/(site)/page.tsx | 103 | function normalizeChecklistDifficulty(value: string | undefined): ChecklistDifficulty { | CODE |
| LOW | apps/web/app/(site)/(account)/layout.tsx | 29 | async function AuthenticatedAccountLayout({ children }: AccountLayoutProps) { | CODE |
| LOW | apps/web/app/(site)/lists/[id]/page-client.tsx | 51 | function UserChecklistDetailContent() { | CODE |
| LOW | apps/web/app/(site)/list/[publicId]/page.tsx | 41 | async function SharedChecklistPageContent({ params }: PageProps) { | CODE |
| LOW | apps/web/app/api/mcp/route.ts | 122 | function cachedMcpResponseToResponse(cached: CachedMcpResponse): Response { | CODE |
| LOW | apps/web/app/api/mcp/content-helpers.ts | 97 | function describeOpenFileDescriptors(): Record<string, number> | string { | CODE |
| LOW | apps/web/app/api/rules/[ruleId]/feedback/route.ts | 23 | function emptyRuleFeedbackResponse(): RuleFeedbackResponse { | CODE |
| LOW | apps/web/app/api/rules/[ruleId]/feedback/route.ts | 39 | function isMissingRuleFeedbackTableError( | CODE |
| LOW | apps/web/app/api/rules/[ruleId]/feedback/route.ts | 100 | async function buildRuleFeedbackResponse( | CODE |
| LOW⚡ | apps/web/components/homepage/features-bento.tsx | 31 | function subscribeToMobileViewport(onStoreChange: () => void) { | CODE |
| LOW⚡ | apps/web/components/homepage/features-bento.tsx | 41 | function getMobileViewportSnapshot() { | CODE |
| 24 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/config/src/routes.ts | 9 | // ── Site & service base URLs ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/config/src/routes.ts | 14 | // ── GitHub ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/config/src/routes.ts | 34 | // ── Social / author ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/config/src/routes.ts | 43 | // ── Internal route segments ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/config/src/routes.ts | 65 | // ── Route builders ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/config/src/routes.ts | 148 | // ── Absolute URL builders (for SEO, sitemap, llms.txt, etc.) ──────────────── | COMMENT |
| MEDIUM | packages/config/src/routes.ts | 158 | // ── User-Agent string (used by crawler and audit-url tool) ────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/review-code-detection.test.ts | 152 | // ─── TRUE POSITIVE tests — bad HTML MUST trigger the rule ─────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/review-code-detection.test.ts | 607 | // ── AST-based structural checks (node-html-parser) ────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/review-code-detection.test.ts | 649 | // ─── TRUE NEGATIVE tests — good HTML MUST NOT trigger the rule ────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/review-code-detection.test.ts | 1015 | // ─── Coverage summary ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/tool-performance.test.ts | 21 | // ─── Test data ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/tool-performance.test.ts | 110 | // ─── Benchmark helper ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/tool-performance.test.ts | 134 | // ─── Performance budget assertions ──────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/tool-performance.test.ts | 146 | // ─── Tests ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/false-positive-audit.test.ts | 141 | // ─── Exemplary HTML page ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/false-positive-audit.test.ts | 220 | // ─── Exemplary CSS ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/false-positive-audit.test.ts | 266 | // ─── Exemplary JavaScript ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/tests/unit/false-positive-audit.test.ts | 312 | // ─── FALSE POSITIVE tests ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | skills/service-worker/references/rule.md | 81 | // ─── Install: pre-cache static assets ──────────────────────────────────────── | COMMENT |
| MEDIUM | skills/service-worker/references/rule.md | 91 | // ─── Activate: remove old caches ───────────────────────────────────────────── | COMMENT |
| MEDIUM | skills/service-worker/references/rule.md | 109 | // ─── Fetch: serve from cache, fall back to network ─────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ges/design-system/src/__tests__/design-system.test.tsx | 183 | <Input type="email" defaultValue="user@example.com" /> | CODE |
| LOW | …ges/design-system/src/__tests__/design-system.test.tsx | 188 | expect(screen.getByDisplayValue('user@example.com').getAttribute('type')).toBe('email') | CODE |
| LOW | skills/srcset/references/rule.md | 50 | alt="Jane Doe" | CODE |
| LOW | skills/contract-testing/references/rule.md | 84 | name: string('Jane Doe'), | CODE |
| LOW | skills/contract-testing/references/rule.md | 98 | expect(user.name).toBe('Jane Doe') | CODE |
| LOW | skills/contract-testing/references/rule.md | 147 | email: string('user@example.com'), | CODE |
| LOW | skills/contract-testing/references/rule.md | 261 | await db.seed({ users: [{ id: 42, name: 'Jane Doe', email: 'jane@example.com', role: 'admin' }] }) | CODE |
| LOW | skills/svg-inline/references/rule.md | 58 | alt="Acme Corp" | CODE |
| LOW | skills/link-checker/references/rule.md | 930 | alerts: 'admin@example.com' | CODE |
| LOW | skills/link-checker/references/rule.md | 946 | defaultTo: 'admin@example.com' | CODE |
| LOW | skills/mock-best-practices/references/rule.md | 88 | expect(validateEmail('test@test.com')).toBe(true) | CODE |
| LOW | skills/mock-best-practices/references/rule.md | 93 | expect(validateEmail('test@test.com')).toBe(true) | CODE |
| LOW | skills/author-byline/references/rule.md | 17 | <img src="/images/authors/jane-doe.jpg" alt="Jane Doe" width="40" height="40" style="border-radius: 50%;"> | CODE |
| LOW | skills/alt-text/references/rule.md | 77 | <img src="logo.svg" alt="Acme Corp"> | CODE |
| LOW | skills/e2e-testing/references/rule.md | 20 | await page.fill('[data-testid="email"]', 'user@example.com') | CODE |
| LOW | skills/e2e-testing/references/rule.md | 58 | cy.login('user@example.com', 'password') | CODE |
| LOW | skills/e2e-testing/references/rule.md | 72 | cy.get('#address').type('123 Main St') | CODE |
| LOW | skills/e2e-testing/references/rule.md | 126 | await loginPage.login('user@example.com', 'password') | CODE |
| LOW | skills/local-business/references/rule.md | 25 | "streetAddress": "123 Main Street", | CODE |
| LOW | skills/local-business/references/rule.md | 106 | streetAddress: '123 Main St', | CODE |
| LOW | skills/article/references/rule.md | 23 | "name": "Jane Doe", | CODE |
| LOW | skills/test-coverage/references/rule.md | 117 | expect(isValidEmail('user@example.com')).toBe(true) | CODE |
| LOW | skills/test-coverage/references/rule.md | 125 | isValidEmail('test@test.com') | CODE |
| LOW | skills/nap-consistency/SKILL.md | 26 | Search the site for all instances of the business name, street address, and phone number. Compare each occurrence for ex | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 438 | - [ ] [Audit and refine AI-generated content](https://frontendchecklist.io/rules/seo/ai-content) ![Medium][medium_img]: | CODE |
| HIGH | skills/ai-content/SKILL.md | 13 | # Audit and refine AI-generated content | COMMENT |
| HIGH | skills/ai-content/references/rule.md | 1 | # Audit and refine AI-generated content | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | .codex/agents/context-gathering.toml | 14 | ### Step 1: Understand the Task | COMMENT |
| LOW⚡ | .codex/agents/context-gathering.toml | 20 | ### Step 2: Research Everything (SPARE NO TOKENS) | COMMENT |
| LOW | .codex/agents/context-gathering.toml | 33 | ### Step 3: Write the Narrative Context Manifest | COMMENT |
| LOW⚡ | skills/unused-css/references/rule.md | 234 | // Step 1: Extract critical CSS | COMMENT |
| LOW⚡ | skills/unused-css/references/rule.md | 243 | // Step 2: Purge unused CSS from main stylesheet | COMMENT |
| LOW⚡ | skills/unused-css/references/rule.md | 249 | // Step 3: Write optimized CSS files | COMMENT |
| LOW | skills/offline-fallback/references/rule.md | 90 | ## Step 2: Pre-cache the Offline Page | COMMENT |
| LOW | skills/offline-fallback/references/rule.md | 116 | ## Step 3: Serve the Fallback on Navigation Failure | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | .codex/agents/context-gathering.toml | 14 | ### Step 1: Understand the Task | COMMENT |
| LOW⚡ | .codex/agents/context-gathering.toml | 20 | ### Step 2: Research Everything (SPARE NO TOKENS) | COMMENT |
| LOW | .codex/agents/context-gathering.toml | 33 | ### Step 3: Write the Narrative Context Manifest | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/mcp/tests/unit/review-code-detection.test.ts | 260 | const js = 'async function getData() { const data = await fetch("/api"); return data.json(); }' | CODE |
| LOW | packages/mcp/tests/unit/review-code-detection.test.ts | 720 | 'async function getData() { try { const data = await fetch("/api"); return data.json(); } catch(e) { console.error | CODE |
| LOW | packages/mcp/tests/unit/false-positive-audit.test.ts | 282 | function getData() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/design-system/src/motion/marquee.tsx | 16 | // Triple items for seamless loop | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/web/data/mentions.json | 279 | "content": "Check the 🔥 Front-End Checklist Application 🔥 for modern websites and meticulous developers! With more | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/pr.yml | 75 | # Check if commits follow conventional commits | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/clean-up-comments/references/rule.md | 131 | // TODO: Add error boundary | COMMENT |