Repository Analysis

jekyll/jekyll

:globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby

4.8 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of jekyll/jekyll, a Ruby project with 51,558 GitHub stars. SynthScan v2.0 examined 49,176 lines of code across 480 source files, recording 147 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 4.8 places this repository in the Likely human-written 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).

4.8
Adjusted Score
4.8
Raw Score
100%
Time Factor
2026-06-22
Last Push
51.6K
Stars
Ruby
Language
49.2K
Lines of Code
480
Files
147
Pattern Hits
2026-07-14
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

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.

CRITICAL 0HIGH 1MEDIUM 33LOW 113

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 147 distinct pattern matches across 9 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.

Decorative Section Separators19 hits · 62 pts
SeverityFileLineSnippetContext
MEDIUM.rubocop.yml1# -----------------------------------------------------------------------------COMMENT
MEDIUM.rubocop.yml7# -----------------------------------------------------------------------------COMMENT
MEDIUM.rubocop.yml38# =======================COMMENT
MEDIUM.rubocop.yml41# ----------------------------------------COMMENT
MEDIUM.rubocop.yml50# ----------------------------------------COMMENT
MEDIUM.rubocop.yml97# ----------------------------------------COMMENT
MEDIUM.rubocop.yml210# ----------------------------------------COMMENT
MEDIUM.rubocop.yml248# ----------------------------------------COMMENT
MEDIUM.rubocop.yml321# ----------------------------------------COMMENT
MEDIUM.rubocop.yml335# ----------------------------------------COMMENT
MEDIUM.rubocop.yml380# ----------------------------------------COMMENT
MEDIUM.rubocop.yml395# ----------------------------------------COMMENT
MEDIUMbenchmark/conditional_liquid.rb76# ------------------------------------------------------------------------COMMENT
MEDIUMbenchmark/conditional_liquid.rb92# ------------------------------------------------------------------------COMMENT
MEDIUMrake/task_utils/rubocop_config_formatter.rb33 # -----------------------------------------------------------------------------COMMENT
MEDIUMrake/task_utils/rubocop_config_formatter.rb39 # -----------------------------------------------------------------------------COMMENT
MEDIUMrake/task_utils/rubocop_config_formatter.rb60 # =======================COMMENT
MEDIUMdocs/_data/jekyll_filters.yml2# ---------------------------------------------------------------------------------------COMMENT
MEDIUMdocs/_data/jekyll_filters.yml17# ---------------------------------------------------------------------------------------COMMENT
Over-Commented Block60 hits · 60 pts
SeverityFileLineSnippetContext
LOW.rubocop_todo.yml1# This configuration was generated byCOMMENT
LOWbenchmark/schwartzian_transform.rb1#!/usr/bin/env rubyCOMMENT
LOWtest/helper.rb101 # file `test/source/symlink-test/symlinked-file-outside-source` but errors out since the linkedCOMMENT
LOWdocs/_data/jekyll_filters.yml1#COMMENT
LOWrubocop/jekyll/assert_equal_literal_actual.rb1# frozen_string_literal: trueCOMMENT
LOW.github/workflows/codeql.yml41 # Prefix the list here with "+" to use these queries and those in the config file.COMMENT
LOW.github/workflows/spelling.yml1name: Spell CheckCOMMENT
LOW.github/workflows/spelling.yml21#COMMENT
LOWlib/jekyll.rb141COMMENT
LOWlib/site_template/_config.yml1# Welcome to Jekyll!COMMENT
LOWlib/site_template/_config.yml41#COMMENT
LOWlib/jekyll/convertible.rb1# frozen_string_literal: trueCOMMENT
LOWlib/jekyll/static_file.rb141 # and additionally removes any multiple periods in the string.COMMENT
LOWlib/jekyll/filters.rb41 ).convert(input)COMMENT
LOWlib/jekyll/filters.rb61 # See Utils.slugify for more detail.COMMENT
LOWlib/jekyll/filters.rb81 # CGI escape a string for use in a URL. Replaces any special charactersCOMMENT
LOWlib/jekyll/filters.rb101 #COMMENT
LOWlib/jekyll/filters.rb141 # word "and" for the last one.COMMENT
LOWlib/jekyll/filters.rb161 "#{array[0...-1].join(", ")}, #{connector} #{array[-1]}"COMMENT
LOWlib/jekyll/filters.rb221 endCOMMENT
LOWlib/jekyll/filters.rb281COMMENT
LOWlib/jekyll/log_adapter.rb61 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.COMMENT
LOWlib/jekyll/log_adapter.rb81 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.COMMENT
LOWlib/jekyll/log_adapter.rb121 #COMMENT
LOWlib/jekyll/excerpt.rb101 # the first two new lines:COMMENT
LOWlib/jekyll/excerpt.rb121 #COMMENT
LOWlib/jekyll/document.rb21COMMENT
LOWlib/jekyll/document.rb81COMMENT
LOWlib/jekyll/document.rb141 # The "cleaned" relative path is the relative path without the extnameCOMMENT
LOWlib/jekyll/document.rb321COMMENT
LOWlib/jekyll/path_manager.rb1# frozen_string_literal: trueCOMMENT
LOWlib/jekyll/frontmatter_defaults.rb141 collections_dir = @site.config["collections_dir"]COMMENT
LOWlib/jekyll/frontmatter_defaults.rb161 endCOMMENT
LOWlib/jekyll/plugin.rb41 # set the priority.COMMENT
LOWlib/jekyll/collection.rb121 endCOMMENT
LOWlib/jekyll/collection.rb161COMMENT
LOWlib/jekyll/reader.rb81COMMENT
LOWlib/jekyll/reader.rb121 # Retrieve all the static files from the current directory,COMMENT
LOWlib/jekyll/url.rb1# frozen_string_literal: trueCOMMENT
LOWlib/jekyll/url.rb121 endCOMMENT
LOWlib/jekyll/url.rb141 # segment = *pcharCOMMENT
LOWlib/jekyll/utils.rb21 def titleize_slug(slug)COMMENT
LOWlib/jekyll/utils.rb121 endCOMMENT
LOWlib/jekyll/utils.rb161 # cased - whether to replace all uppercase letters with theirCOMMENT
LOWlib/jekyll/utils.rb181 #COMMENT
LOWlib/jekyll/utils.rb221 slug.downcase! unless casedCOMMENT
LOWlib/jekyll/utils.rb241 # # => "/:basename/"COMMENT
LOWlib/jekyll/utils.rb261 elseCOMMENT
LOWlib/jekyll/utils.rb281 # # => ["path/.", "path/..", "path/file1"]COMMENT
LOWlib/jekyll/site.rb241COMMENT
LOWlib/jekyll/site.rb281 @site_data ||= (config["data"] || data)COMMENT
LOWlib/jekyll/filters/date_filters.rb1# frozen_string_literal: trueCOMMENT
LOWlib/jekyll/filters/date_filters.rb21 # Format a date in long format e.g. "27 January 2011".COMMENT
LOWlib/jekyll/filters/date_filters.rb41 #COMMENT
LOWlib/jekyll/drops/drop.rb101 list.reject! { |item| item.end_with?("=") }COMMENT
LOWlib/jekyll/drops/drop.rb221 # Returns a Hash ready for JSON generation.COMMENT
LOWlib/jekyll/converters/markdown.rb61 #COMMENT
LOWlib/jekyll/utils/internet.rb1# frozen_string_literal: trueCOMMENT
LOWlib/jekyll/commands/new.rb61 # Internal: Gets the filename of the sample post to be createdCOMMENT
LOWlib/jekyll/readers/post_reader.rb21 # Read all the files in <source>/<dir>/_posts and create a new DocumentCOMMENT
Self-Referential Comments13 hits · 39 pts
SeverityFileLineSnippetContext
MEDIUMlib/jekyll/plugin_manager.rb7 # Create an instance of this class.COMMENT
MEDIUMlib/jekyll/document.rb34 # Create a new Document.COMMENT
MEDIUMlib/jekyll/document.rb143 # This method is useful when building the URL of the document.COMMENT
MEDIUMlib/jekyll/document.rb315 # Create a Liquid-understandable version of this Document.COMMENT
MEDIUMlib/jekyll/frontmatter_defaults.rb4 # This class handles custom defaults for YAML frontmatter settings.COMMENT
MEDIUMlib/jekyll/collection.rb8 # Create a new Collection.COMMENT
MEDIUMlib/jekyll/reader.rb174 # Create a single PostReader instance to retrieve drafts and posts from all validCOMMENT
MEDIUMlib/jekyll/command.rb36 # Create a full Jekyll configuration with the options passed in as overridesCOMMENT
MEDIUMlib/jekyll/drops/drop.rb106 # Create a new DropCOMMENT
MEDIUMlib/jekyll/commands/build.rb7 # Create the Mercenary command for the Jekyll CLI for this CommandCOMMENT
MEDIUMlib/jekyll/commands/serve/servlet.rb8 # This class is used to determine if the Servlet should modify a served fileCOMMENT
MEDIUMlib/jekyll/readers/page_reader.rb13 # Create a new `Jekyll::Page` object for each entry in a given array.COMMENT
MEDIUMlib/jekyll/readers/static_file_reader.rb13 # Create a new StaticFile object for every entry in a given list of basenames.COMMENT
Hyper-Verbose Identifiers27 hits · 27 pts
SeverityFileLineSnippetContext
LOWbenchmark/schwartzian_transform.rb33def sort_by_property_directly(docs, meta_key)CODE
LOWtest/test_document.rb18 def setup_document_with_dates(filename)CODE
LOWtest/test_tag_highlight.rb6 def render_content_with_text_to_highlight(code)CODE
LOWtest/test_tag_highlight.rb29 def highlight_block_with_markup(markup)CODE
LOWtest/test_static_file.rb24 def setup_static_file_with_collection(base, dir, name, metadata)CODE
LOWtest/test_static_file.rb31 def setup_static_file_with_defaults(base, dir, name, defaults)CODE
LOWtest/test_tag_link.rb6 def render_content_with_collection(content, collection_label)CODE
LOWtest/test_theme_assets_reader.rb14 def assert_file_with_relative_path(haystack, relative_path)CODE
LOWtest/test_theme_assets_reader.rb20 def refute_file_with_relative_path(haystack, relative_path)CODE
LOWrubocop/jekyll/assert_equal_literal_actual.rb111 def replace_based_on_line_length(first_expression, second_expression)CODE
LOWrubocop/jekyll/assert_equal_literal_actual.rb124 def replace_hash_with_variable(first_expression, second_expression)CODE
LOWrubocop/jekyll/assert_equal_literal_actual.rb136 def replace_array_with_variable(first_expression, second_expression)CODE
LOWlib/jekyll/filters.rb400 def compare_property_vs_target(property, target)CODE
LOWlib/jekyll/external.rb54 def require_with_graceful_fail(names)CODE
LOWlib/jekyll/excerpt.rb167 def extract_markdown_link_reference_definitions(head, tail)CODE
LOWlib/jekyll/reader.rb200 def conditionally_generate_entry(entry_path, container, reader)CODE
LOWlib/jekyll/utils.rb70 def pluralized_array_from_hash(hash, singular_key, plural_key)CODE
LOWlib/jekyll/utils.rb349 def replace_character_sequence_with_hyphen(string, mode: "default")CODE
LOWlib/jekyll/renderer.rb200 def add_regenerator_dependencies(layout)CODE
LOWlib/jekyll/command.rb41 def configuration_from_options(options)CODE
LOWlib/jekyll/command.rb90 def process_with_graceful_fail(cmd, options, *klass)CODE
LOWlib/jekyll/configuration.rb100 def get_config_value_with_override(config_key, override)CODE
LOWlib/jekyll/tags/highlight.rb93 def line_highlighter_formatter(formatter)CODE
LOWlib/jekyll/tags/include.rb131 def add_include_to_dependency(site, path, context)CODE
LOWlib/jekyll/tags/include.rb236 def add_include_to_dependency(inclusion, context)CODE
LOWlib/jekyll/commands/doctor.rb60 def deprecated_relative_permalinks(site)CODE
LOWlib/jekyll/commands/serve/servlet.rb187 def conditionally_inject_charset(res)CODE
Fake / Example Data15 hits · 18 pts
SeverityFileLineSnippetContext
LOWbenchmark/conditional_liquid.rb15Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero atCODE
LOWbenchmark/conditional_liquid.rb15Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero atCODE
LOWbenchmark/conditional_liquid.rb27Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero atCODE
LOWbenchmark/conditional_liquid.rb27Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero atCODE
LOWbenchmark/conditional_liquid.rb32ligula, {% if author == "Jane Doe" %} at finibus eros laoreet id. {% else %}CODE
LOWbenchmark/conditional_liquid.rb40Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero atCODE
LOWbenchmark/conditional_liquid.rb40Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero atCODE
LOWbenchmark/conditional_liquid.rb62 "author" => "John Doe",CODE
LOWtest/test_page_without_a_file.rb37 %w(lorem ipsum) => "lorem/ipsum",CODE
LOWtest/test_page_without_a_file.rb117 "author" => "John Doe",CODE
LOWtest/test_page_without_a_file.rb127 assert_equal "John Doe", @page.data["author"]CODE
LOWtest/test_page_without_a_file.rb157 @page.content = "Lorem ipsum dolor sit amet"CODE
LOWtest/test_page_without_a_file.rb157 @page.content = "Lorem ipsum dolor sit amet"CODE
LOWlib/theme_template/example/index.html5Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. AgaCODE
LOWlib/theme_template/example/index.html5Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. AgaCODE
Redundant / Tautological Comments9 hits · 16 pts
SeverityFileLineSnippetContext
LOWlib/jekyll/regenerator.rb133 # Check if metadata has been disabledCOMMENT
LOWlib/jekyll/entry_filter.rb37 # Check if the current entry is explicitly included and cache the resultCOMMENT
LOWlib/jekyll/entry_filter.rb80 # Check if a file is a symlink.COMMENT
LOWlib/jekyll/entry_filter.rb89 # Check if given path is outside of current site's configured source directory.COMMENT
LOWlib/jekyll/entry_filter.rb95 # Check if an entry matches a specific pattern.COMMENT
LOWlib/jekyll/excerpt.rb54 # Check if excerpt includes a stringCOMMENT
LOWlib/jekyll/cache.rb120 # Check if `key` already exists in this cacheCOMMENT
LOWlib/jekyll/drops/drop.rb174 # Check if key exists in DropCOMMENT
LOWlib/jekyll/commands/serve.rb302 # Add SSL to the stack if the user triggers --enable-ssl and theyCOMMENT
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHlib/jekyll/commands/serve.rb269 # Keep in our area with a thread or detach the server as requestedCOMMENT
Structural Annotation Overuse2 hits · 3 pts
SeverityFileLineSnippetContext
LOWdocs/_docs/installation/macos.md36### Step 1: Install HomebrewCOMMENT
LOWdocs/_docs/installation/macos.md44### Step 2: Install chruby and the latest Ruby with ruby-installCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMlib/jekyll/filters.rb380 # We also utilize the Schwartzian transform to make this more efficient.COMMENT