Language Savant. If your repository's language is being reported incorrectly, send us a pull request!
This report summarizes scanner evidence for github-linguist/linguist, a Ruby project with 13,759 GitHub stars. SynthScan examined 217,219 lines of code across 590 source files, recording 527 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 2.9 (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? 490 finding(s).
Are imports declared and package/API names verified? 15 finding(s).
Are wrappers, guards, and repeated structures necessary? 38 finding(s).
Which changes need focused human review? 527 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 527 distinct pattern matches across 16 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 | test/test_repository.rb | 41 | new_repo = Linguist::Repository.incremental(source_repository, master_oid, old_commit, old_repo.cache) | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 1 | #ifndef linguist_yyHEADER_H | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 21 | #else | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 41 | #endif | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 61 | #ifdef yy_load_buffer_state | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 81 | #else | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 101 | #endif | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 121 | #ifdef yyget_debug | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 141 | #else | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 161 | #endif | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 181 | #ifdef yyget_lineno | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 201 | #else | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 261 | typedef uint32_t flex_uint32_t; | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 281 | #define INT8_MAX (127) | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 301 | #endif | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 321 | typedef void* yyscan_t; | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 341 | */ | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 421 | void *yyalloc ( yy_size_t , yyscan_t yyscanner ); | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 501 | #ifndef yytext_ptr | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 541 | #undef YY_NEW_FILE | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 561 | #endif | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 581 | #undef yypush_buffer_state | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 601 | #ifndef linguist_yylex_destroy_ALREADY_DEFINED | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 621 | #endif | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 641 | #undef yyget_column | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 661 | #ifndef linguist_yyalloc_ALREADY_DEFINED | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 681 | #endif | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.h | 701 | #line 702 "lex.linguist_yy.h" | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 1 | COMMENT | |
| LOW | ext/linguist/lex.linguist_yy.c | 21 | COMMENT | |
| LOW | ext/linguist/lex.linguist_yy.c | 41 | #define linguist_yy_scan_bytes_ALREADY_DEFINED | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 61 | #define yy_load_buffer_state linguist_yy_load_buffer_state | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 81 | COMMENT | |
| LOW | ext/linguist/lex.linguist_yy.c | 101 | #define linguist_yylex_init_ALREADY_DEFINED | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 121 | #define yyget_debug linguist_yyget_debug | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 141 | COMMENT | |
| LOW | ext/linguist/lex.linguist_yy.c | 161 | #define linguist_yyset_out_ALREADY_DEFINED | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 181 | #define yyget_lineno linguist_yyget_lineno | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 201 | COMMENT | |
| LOW | ext/linguist/lex.linguist_yy.c | 261 | typedef short int flex_int16_t; | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 281 | #define INT16_MAX (32767) | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 321 | #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) | COMMENT |
| LOW | ext/linguist/lex.linguist_yy.c | 361 | * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. | COMMENT |
| LOW | samples/Rez/Rezilla_DITL.r | 1 | // =========================================================================== | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 1 | # This file was autogenerated by uv via the following command: | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 21 | colorama==0.4.6 | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 41 | # torch | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 61 | jinja2==3.1.6 | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 81 | # via torch | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 101 | # scikit-learn | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 121 | # via diffusers | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 141 | # via pyside6 | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 161 | # diffusers | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 181 | # librosa | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 201 | # via | COMMENT |
| LOW | …mples/Pip Requirements/filenames/requirements.lock.txt | 221 | # chatterbox-tts | COMMENT |
| LOW | samples/C++/json_writer.cpp | 21 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | COMMENT |
| LOW | samples/C++/protocol-buffer.pb.h | 1 | // Generated by the protocol buffer compiler. DO NOT EDIT! | COMMENT |
| LOW | samples/C++/v8.h | 1 | // Copyright 2011 the V8 project authors. All rights reserved. | COMMENT |
| LOW | samples/C++/v8.h | 21 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | COMMENT |
| 375 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/test_cli_integration.rb | 27 | # Create a test file with a non-Ruby extension but Ruby content | COMMENT |
| MEDIUM | test/test_cli_integration.rb | 46 | # Create a normal Ruby file | COMMENT |
| MEDIUM | test/test_cli_integration.rb | 92 | # Create a simple test file | COMMENT |
| MEDIUM | test/test_cli_integration.rb | 117 | # Create a more complex repository structure | COMMENT |
| MEDIUM | test/test_basic_instrumenter.rb | 99 | # This file is overridden by .gitattributes to be detectable and language Markdown | COMMENT |
| MEDIUM | test/test_repository.rb | 251 | # Create a minimal git bomb in a temp directory | COMMENT |
| MEDIUM | samples/Python/django-models-base.py | 41 | # Create the class. | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1094 | # Define a custom error handler. Optionally takes either an Exception | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1109 | # Define a named template. The block must return the template source. | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1115 | # Define the layout template. The block must return the template source. | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1169 | # Define a before filter; runs before all requests within the same | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1176 | # Define an after filter; runs after all requests within the same | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1407 | # Create a new instance without middleware in front of it. | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1410 | # Create a new instance of the class fronted by its middleware | COMMENT |
| MEDIUM | samples/Ruby/sinatra.rb | 1753 | # Create a new Sinatra application. The block is evaluated in the new app's | COMMENT |
| MEDIUM | samples/Ruby/racc.rb | 3 | # This file is automatically generated by Racc 1.4.7 | COMMENT |
| MEDIUM | samples/Ruby/inflector.rb | 114 | # Create the name of a table like Rails does for models to table names. This method | COMMENT |
| MEDIUM | samples/Ruby/inflector.rb | 124 | # Create a class name from a plural table name like Rails does for table names to models. | COMMENT |
| MEDIUM | samples/Ruby/resque.rb | 233 | # This method is considered part of the `stable` API. | COMMENT |
| MEDIUM | samples/Ruby/resque.rb | 246 | # This method is considered part of the `stable` API. | COMMENT |
| MEDIUM | samples/Ruby/resque.rb | 289 | # This method is considered part of the `stable` API. | COMMENT |
| MEDIUM | samples/Ruby/resque.rb | 315 | # This method is considered part of the `stable` API. | COMMENT |
| MEDIUM | lib/linguist/generated.rb | 705 | # # This file is automatically generated by Racc x.y.z | COMMENT |
| MEDIUM | lib/linguist/generated.rb | 712 | return lines[2].start_with?("# This file is automatically generated by Racc") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | samples/TypeScript/demo.ts | 25 | // ═══════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 27 | // ═══════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 38 | // ═══════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 40 | // ═══════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 77 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 79 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 94 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 96 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 111 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 113 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 133 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/TypeScript/demo.ts | 135 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | samples/TypeScript/demo.ts | 146 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | samples/TypeScript/demo.ts | 148 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | samples/TypeScript/demo.ts | 156 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | samples/TypeScript/demo.ts | 158 | // ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | samples/Raku/Simple.pm | 1 | # ---------------------- | COMMENT |
| MEDIUM | samples/Raku/Simple.pm | 3 | # ---------------------- | COMMENT |
| MEDIUM | samples/C/sgd_fast.c | 725 | * # ---------------------------------------- | COMMENT |
| MEDIUM | samples/C/sgd_fast.c | 941 | * # ---------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | samples/Java/JFlexLexer.java | 257 | zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); | CODE |
| CRITICAL | samples/Java/gen-java-linguist-thrift.java | 114 | org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(PullRequest.class, metaDataMap); | CODE |
| CRITICAL | samples/Java/gen-java-linguist-thrift.java | 334 | org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); | CODE |
| CRITICAL | samples/Java/gen-java-linguist-thrift.java | 338 | org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); | CODE |
| CRITICAL | samples/Java/ProtocolBuffer.java | 508 | new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/test_generated.rb | 16 | def generated_without_loading_data(blob, negate = false) | CODE |
| LOW⚡ | test/test_generated.rb | 35 | def generated_fixture_without_loading_data(name, negate = false) | CODE |
| LOW⚡ | test/test_generated.rb | 39 | def generated_fixture_loading_data(name, negate = false) | CODE |
| LOW⚡ | test/test_generated.rb | 43 | def generated_sample_without_loading_data(name, negate = false) | CODE |
| LOW⚡ | test/test_generated.rb | 47 | def generated_sample_loading_data(name, negate = false) | CODE |
| LOW | samples/Python/django-models-base.py | 237 | def make_foreign_order_accessors(field, model, cls): | CODE |
| LOW | samples/Python/django-models-base.py | 621 | def _get_next_or_previous_in_order(self, is_next): | CODE |
| LOW | samples/PHP/Application.php | 879 | protected function getDefaultInputDefinition() | CODE |
| LOW | samples/PHP/Application.php | 974 | private function getAbbreviationSuggestions($abbrevs) | CODE |
| LOW | samples/JavaScript/ccalc-parse.js | 1072 | function locateNearestErrorRecoveryRule(state) { | CODE |
| LOW | samples/JavaScript/jquery-1.7.2.js | 7034 | function addToPrefiltersOrTransports( structure ) { | CODE |
| LOW | samples/JavaScript/jquery-1.7.2.js | 7070 | function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, | CODE |
| LOW | samples/JavaScript/jquery-1.6.1.js | 6643 | function addToPrefiltersOrTransports( structure ) { | CODE |
| LOW | samples/JavaScript/jquery-1.6.1.js | 6679 | function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, | CODE |
| LOW | samples/JavaScript/http.js | 1644 | function serverSocketCloseListener() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | samples/JavaScript/jquery-1.7.2.js | 9393 | // AMD modules. A named AMD is safest and most robust way to register. | COMMENT |
| MEDIUM | samples/Ruby/formula.rb | 241 | # libraries before trying to utilize Frameworks, many of which will be from | COMMENT |
| LOW | samples/Ruby/formula.rb | 321 | # If an instance of Formula is passed, just return it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Python/gen-py-linguist-thrift.py | 9 | CODE | |
| LOW | samples/Python/gen-py-linguist-thrift.py | 9 | CODE | |
| LOW | samples/Python/gen-py-linguist-thrift.py | 9 | CODE | |
| LOW | samples/Python/gen-py-linguist-thrift.py | 12 | CODE | |
| LOW | samples/Python/django-models-base.py | 1 | CODE | |
| LOW | samples/Python/django-models-base.py | 8 | CODE | |
| LOW | samples/Python/protocol_buffer_pb2.py | 7 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | samples/Python/django-models-base.py | 366 | except AttributeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Rust/task.rs | 403 | * # Return value | COMMENT |
| LOW | lib/linguist/classifier.rb | 49 | # Set hash to autoincremented index value | COMMENT |
| LOW | lib/linguist/strategy/modeline.rb | 60 | # Check if specific Vim version(s) are requested (won't work in vi/ex) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Mercury/options.m | 3504 | % don't forget to update the user_guide.texi | CODE |
| LOW | samples/Objective-C/ASIHTTPRequest.m | 2004 | // If you do this, don't forget to call [super requestFinished] to let the queue / delegate know we're done | COMMENT |
| LOW | samples/Objective-C/ASIHTTPRequest.m | 2071 | // If you do this, don't forget to call [super failWithError:] to let the queue / delegate know we're done | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Python/django-models-base.py | 34 | CODE | |
| LOW | samples/Python/django-models-base.py | 280 | CODE | |
| LOW | samples/Python/django-models-base.py | 482 | CODE | |
| LOW | samples/Python/django-models-base.py | 665 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/test_repository.rb | 255 | system("git", "-C", dir, "config", "user.email", "test@test.com") | CODE |
| LOW | samples/SQL/db.sql | 23 | ('Welcome', '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed interdum, felis ac pellentesque feugiat, ma | CODE |
| LOW | samples/SQL/db.sql | 23 | ('Welcome', '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed interdum, felis ac pellentesque feugiat, ma | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Raku/Win32.pm | 142 | # TODO: implement _getdcwd call ( Windows maintains separate CWD for each volume ) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Python/tornado-httpserver.py | 60 | def handle_request(request): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Python/tornado-httpserver.py | 422 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | samples/Python/gen-py-linguist-thrift.py | 72 | CODE |