Repository Analysis

simonw/datasette

An open source multi-tool for exploring and publishing data

15.4 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of simonw/datasette, a Python project with 11,415 GitHub stars. SynthScan v2.0 examined 92,926 lines of code across 278 source files, recording 1557 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 15.4 places this repository in the Moderate 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).

15.4
Adjusted Score
15.4
Raw Score
100%
Time Factor
2026-08-14
Last Push
11.4K
Stars
Python
Language
92.9K
Lines of Code
278
Files
1.6K
Pattern Hits
2026-08-29
Scan Date
0.11
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 1HIGH 30MEDIUM 30LOW 1496

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 1557 distinct pattern matches across 16 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.

Hyper-Verbose Identifiers1278 hits · 1012 pts
SeverityFileLineSnippetContext
LOWtests/test_column_types.py129async def test_column_types_table_created(ds_ct):CODE
LOWtests/test_column_types.py139async def test_config_loaded_into_internal_db(ds_ct):CODE
LOWtests/test_column_types.py151async def test_config_with_type_and_config(tmp_path_factory):CODE
LOWtests/test_column_types.py213async def test_get_column_type_missing(ds_ct):CODE
LOWtests/test_column_types.py220async def test_set_and_remove_column_type(ds_ct):CODE
LOWtests/test_column_types.py233async def test_set_column_type_with_config(ds_ct):CODE
LOWtests/test_column_types.py264async def test_set_column_type_api_with_config(ds_ct):CODE
LOWtests/test_column_types.py286async def test_clear_column_type_api(ds_ct):CODE
LOWtests/test_column_types.py399async def test_set_column_type_api_errors(CODE
LOWtests/test_column_types.py423async def test_set_column_type_api_works_for_immutable_database(tmp_path_factory):CODE
LOWtests/test_column_types.py452async def test_set_column_type_rejects_incompatible_sqlite_type(ds_ct):CODE
LOWtests/test_column_types.py459async def test_set_column_type_allows_varchar_for_text_only_type(tmp_path_factory):CODE
LOWtests/test_column_types.py481async def test_builtin_column_types_registered(ds_ct):CODE
LOWtests/test_column_types.py492async def test_column_type_class_attributes(ds_ct):CODE
LOWtests/test_column_types.py510def test_sqlite_type_from_declared_type():CODE
LOWtests/test_column_types.py545async def test_display_columns_include_column_type(ds_ct):CODE
LOWtests/test_column_types.py596async def test_email_validation_on_insert(ds_ct):CODE
LOWtests/test_column_types.py609async def test_email_validation_passes_valid(ds_ct):CODE
LOWtests/test_column_types.py621async def test_url_validation_on_insert(ds_ct):CODE
LOWtests/test_column_types.py634async def test_json_validation_on_insert(ds_ct):CODE
LOWtests/test_column_types.py647async def test_validation_on_update(ds_ct):CODE
LOWtests/test_column_types.py660async def test_validation_allows_null(ds_ct):CODE
LOWtests/test_column_types.py672async def test_validation_allows_empty_string(ds_ct):CODE
LOWtests/test_column_types.py687async def test_column_type_base_defaults():CODE
LOWtests/test_column_types.py703async def test_render_cell_extra_with_column_types(ds_ct):CODE
LOWtests/test_column_types.py717async def test_duplicate_column_type_name_raises_error():CODE
LOWtests/test_column_types.py744async def test_row_endpoint_render_cell_with_column_types(ds_ct):CODE
LOWtests/test_column_types.py758async def test_transform_value_in_json_output(tmp_path_factory):CODE
LOWtests/test_column_types.py810async def test_column_type_render_cell_has_priority_over_plugins(tmp_path_factory):CODE
LOWtests/test_column_types.py889async def test_row_detail_page_html_rendering(ds_ct):CODE
LOWtests/test_column_types.py905async def test_html_table_page_rendering(ds_ct):CODE
LOWtests/test_column_types.py916async def test_set_column_type_ui_data_hidden_without_permission(ds_ct):CODE
LOWtests/test_column_types.py924async def test_set_column_type_ui_data_includes_applicable_types(CODE
LOWtests/test_column_types.py963async def test_validation_on_upsert(ds_ct):CODE
LOWtests/test_column_types.py978async def test_validation_on_upsert_passes_valid(ds_ct):CODE
LOWtests/test_column_types.py995async def test_unknown_type_warning_logged(tmp_path_factory, caplog):CODE
LOWtests/test_column_types.py1021async def test_incompatible_sqlite_type_warning_logged(tmp_path_factory, caplog):CODE
LOWtests/test_column_types.py1048async def test_config_overwrites_on_restart(tmp_path_factory):CODE
LOWtests/test_column_types.py1086async def test_no_column_types_in_config(tmp_path_factory):CODE
LOWtests/test_table_api.py125async def test_html_only_extras_are_not_available_via_json(ds_client, extra):CODE
LOWtests/test_table_api.py134async def test_html_only_extras_are_not_advertised(ds_client):CODE
LOWtests/test_table_api.py141def test_query_extra_private_for_arbitrary_sql():CODE
LOWtests/test_table_api.py268async def test_table_shape_object_compound_primary_key(ds_client):CODE
LOWtests/test_table_api.py278async def test_table_with_slashes_in_name(ds_client):CODE
LOWtests/test_table_api.py288async def test_table_with_reserved_word_name(ds_client):CODE
LOWtests/test_table_api.py33async def test_table_not_exists_json(ds_client):CODE
LOWtests/test_table_api.py55async def test_table_shape_arrayfirst(ds_client):CODE
LOWtests/test_table_api.py75async def test_query_extras_for_arbitrary_sql(ds_client):CODE
LOWtests/test_table_api.py99async def test_query_extras_for_stored_query(ds_client):CODE
LOWtests/test_table_api.py155def test_query_extra_query_reports_bound_params():CODE
LOWtests/test_table_api.py186def test_query_extra_query_does_not_echo_querystring():CODE
LOWtests/test_table_api.py195def test_query_extra_private_false_when_sql_is_public():CODE
LOWtests/test_table_api.py229async def test_table_shape_array_nl(ds_client):CODE
LOWtests/test_table_api.py323async def test_paginate_tables_and_views(CODE
LOWtests/test_table_api.py370async def test_paginate_compound_keys(ds_client):CODE
LOWtests/test_table_api.py391async def test_paginate_compound_keys_with_extra_filters(ds_client):CODE
LOWtests/test_table_api.py467async def test_sortable_and_filtered(ds_client):CODE
LOWtests/test_table_api.py486async def test_sortable_argument_errors(ds_client):CODE
LOWtests/test_table_api.py500async def test_sortable_columns_metadata(ds_client):CODE
LOWtests/test_table_api.py633async def test_searchable_invalid_column(ds_client):CODE
1218 more matches not shown…
Cross-Language Confusion28 hits · 109 pts
SeverityFileLineSnippetContext
HIGHtests/test_table_api.py1355 '{"rowid": 3, "data": null}'STRING
HIGHtests/test_queries.py1786 assert "window.location.href = url.toString();" not in response.textSTRING
HIGHtests/test_table_html.py1176 name text not null,CODE
HIGHtests/test_table_html.py1331 name text not null,CODE
HIGHtests/test_write_wrapper.py365 await db.execute_write("insert into groups (id, current) values (1, null)")CODE
HIGHtests/test_api_write.py1311 "(1, 'one', 1.5, 1), (2, 'two', 999.5, 2), (3, null, null, null)"STRING
HIGHtests/test_playwright.py113 title text not null,CODE
HIGHtests/test_playwright.py125 name text not null,CODE
HIGHtests/test_playwright.py130 title text not null,CODE
HIGHtests/test_playwright.py280 if (!context.columnType || context.columnType.type !== "asset") {CODE
HIGHtests/test_playwright.py1014 window.__discardConfirmMessages.push(message);CODE
HIGHtests/test_playwright.py1347 "node => node.hidden && node.disabled"CODE
HIGHdatasette/fixtures.py235 ("2019-01-14 08:00:00", 1, 1, 'CA', 1, 'SOMA', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py236 ("2019-01-14 08:00:00", 1, 1, 'CA', 1, 'Tenderloin', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py237 ("2019-01-15 08:00:00", 1, 1, 'CA', 1, 'Bernal Heights', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py238 ("2019-01-15 08:00:00", 1, 1, 'CA', 1, 'Hayes Valley', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py239 ("2019-01-15 08:00:00", 1, 1, 'CA', 2, 'Hollywood', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py240 ("2019-01-15 08:00:00", 1, 1, 'CA', 2, 'Downtown', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py241 ("2019-01-16 08:00:00", 1, 1, 'CA', 2, 'Los Feliz', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py242 ("2019-01-16 08:00:00", 1, 1, 'CA', 2, 'Koreatown', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py243 ("2019-01-16 08:00:00", 1, 1, 'MI', 3, 'Downtown', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py244 ("2019-01-17 08:00:00", 1, 1, 'MI', 3, 'Greektown', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py245 ("2019-01-17 08:00:00", 1, 1, 'MI', 3, 'Corktown', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py246 ("2019-01-17 08:00:00", 1, 1, 'MI', 3, 'Mexicantown', '[]', '[]', null, null),STRING
HIGHdatasette/fixtures.py247 ("2019-01-17 08:00:00", 2, 0, 'MC', 4, 'Arcadia Planitia', '[]', '[]', null, null)STRING
HIGHdatasette/fixtures.py273 3, "Burlingame Museum of PEZ Memorabilia", "214 California Drive, Burlingame, CA 94010", null,STRING
HIGHdatasette/fixtures.py322INSERT INTO foreign_key_references VALUES (2, null, null, null, null, null);STRING
HIGHdatasette/fixtures.py363 ("insert into binary_data (data) values (null);", []),STRING
Deep Nesting79 hits · 75 pts
SeverityFileLineSnippetContext
LOWtests/test_auth.py278CODE
LOWtests/test_docs.py176CODE
LOWtests/test_html.py918CODE
LOWtests/test_queries.py3385CODE
LOWtests/test_multipart.py997CODE
LOWtests/test_multipart.py1057CODE
LOWtests/test_permissions.py956CODE
LOWtests/fixtures.py108CODE
LOWtests/plugins/my_plugin.py552CODE
LOWdocs/json_api_doc.py8CODE
LOWdocs/json_api_doc.py85CODE
LOWdatasette/plugins.py91CODE
LOWdatasette/stored_queries.py242CODE
LOWdatasette/renderer.py15CODE
LOWdatasette/renderer.py33CODE
LOWdatasette/database.py439CODE
LOWdatasette/database.py587CODE
LOWdatasette/database.py918CODE
LOWdatasette/cli.py73CODE
LOWdatasette/app.py400CODE
LOWdatasette/app.py639CODE
LOWdatasette/app.py774CODE
LOWdatasette/app.py1329CODE
LOWdatasette/app.py2941CODE
LOWdatasette/facets.py15CODE
LOWdatasette/facets.py215CODE
LOWdatasette/facets.py306CODE
LOWdatasette/facets.py376CODE
LOWdatasette/facets.py505CODE
LOWdatasette/tracer.py90CODE
LOWdatasette/tracer.py101CODE
LOWdatasette/filters.py46CODE
LOWdatasette/filters.py48CODE
LOWdatasette/filters.py424CODE
LOWdatasette/default_permissions/config.py105CODE
LOWdatasette/default_permissions/config.py203CODE
LOWdatasette/utils/multipart.py186CODE
LOWdatasette/utils/multipart.py635CODE
LOWdatasette/utils/multipart.py361CODE
LOWdatasette/utils/asgi.py298CODE
LOWdatasette/utils/actions_sql.py505CODE
LOWdatasette/utils/__init__.py1312CODE
LOWdatasette/utils/__init__.py1645CODE
LOWdatasette/utils/__init__.py1693CODE
LOWdatasette/utils/__init__.py1373CODE
LOWdatasette/utils/__init__.py1654CODE
LOWdatasette/utils/shutil_backport.py12CODE
LOWdatasette/utils/sql_analysis.py198CODE
LOWdatasette/publish/heroku.py22CODE
LOWdatasette/publish/heroku.py40CODE
LOWdatasette/publish/cloudrun.py18CODE
LOWdatasette/publish/cloudrun.py88CODE
LOWdatasette/views/index.py26CODE
LOWdatasette/views/query_helpers.py249CODE
LOWdatasette/views/database.py1188CODE
LOWdatasette/views/database.py576CODE
LOWdatasette/views/database.py707CODE
LOWdatasette/views/table_extras.py222CODE
LOWdatasette/views/table_extras.py678CODE
LOWdatasette/views/table_extras.py1053CODE
19 more matches not shown…
Unused Imports61 hits · 60 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/conftest.py305CODE
LOWtests/test_docs.py10CODE
LOWdatasette/stored_queries.py1CODE
LOWdatasette/csrf.py10CODE
LOWdatasette/_pytest_plugin.py15CODE
LOWdatasette/jump.py1CODE
LOWdatasette/__init__.py1CODE
LOWdatasette/__init__.py2CODE
LOWdatasette/__init__.py2CODE
LOWdatasette/__init__.py3CODE
LOWdatasette/__init__.py4CODE
LOWdatasette/__init__.py4CODE
LOWdatasette/__init__.py4CODE
LOWdatasette/__init__.py5CODE
LOWdatasette/__init__.py5CODE
LOWdatasette/__init__.py5CODE
LOWdatasette/__init__.py5CODE
LOWdatasette/__init__.py5CODE
LOWdatasette/__init__.py12CODE
LOWdatasette/__init__.py13CODE
LOWdatasette/__init__.py14CODE
LOWdatasette/__init__.py15CODE
LOWdatasette/tokens.py9CODE
LOWdatasette/app.py1CODE
LOWdatasette/write_sql.py1CODE
LOWdatasette/default_permissions/config.py7CODE
LOWdatasette/default_permissions/__init__.py18CODE
LOWdatasette/default_permissions/__init__.py20CODE
LOWdatasette/default_permissions/__init__.py21CODE
LOWdatasette/default_permissions/__init__.py24CODE
LOWdatasette/default_permissions/__init__.py27CODE
LOWdatasette/default_permissions/__init__.py31CODE
LOWdatasette/default_permissions/__init__.py34CODE
LOWdatasette/default_permissions/__init__.py39CODE
LOWdatasette/default_permissions/__init__.py42CODE
LOWdatasette/default_permissions/__init__.py45CODE
LOWdatasette/default_permissions/tokens.py8CODE
LOWdatasette/default_permissions/defaults.py7CODE
LOWdatasette/default_permissions/root.py7CODE
LOWdatasette/default_permissions/helpers.py5CODE
LOWdatasette/default_permissions/restrictions.py8CODE
LOWdatasette/utils/actions_sql.py31CODE
LOWdatasette/utils/__init__.py33CODE
LOWdatasette/utils/__init__.py34CODE
1 more matches not shown…
Excessive Try-Catch Wrapping37 hits · 38 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_write_wrapper.py115def wrapper(conn):CODE
LOWtests/test_write_wrapper.py118 except Exception as e: # noqa: BLE001CODE
LOWtests/test_api_write.py1413 except Exception: # noqa: BLE001, S110STRING
LOWdatasette/csrf.py164 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/_pytest_plugin.py92 except Exception as e: # noqa: BLE001CODE
LOWdatasette/database.py201 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/database.py208 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/database.py220 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/database.py226 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/database.py372 except Exception: # noqa: BLE001CODE
LOWdatasette/database.py447 except Exception as e: # noqa: BLE001CODE
LOWdatasette/database.py456 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/database.py476 except Exception as e: # noqa: BLE001CODE
LOWdatasette/database.py489 except Exception as e: # noqa: BLE001CODE
LOWdatasette/database.py836 except Exception as e:STRING
MEDIUMdatasette/database.py369def _dispatch_events_after_write():CODE
LOWdatasette/app.py966 except Exception as e: # noqa: BLE001CODE
LOWdatasette/app.py973 except Exception as e: # noqa: BLE001CODE
LOWdatasette/app.py2928 except Exception as exception: # noqa: BLE001CODE
LOWdatasette/app.py2180 except Exception: # noqa: BLE001, S110STRING
LOWdatasette/tracer.py54 except Exception as ex:CODE
LOWdatasette/utils/multipart.py82 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/utils/multipart.py160 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/utils/multipart.py169 except Exception: # noqa: BLE001, S110CODE
LOWdatasette/utils/multipart.py235 except Exception: # noqa: BLE001, S110CODE
MEDIUMdatasette/utils/multipart.py79def __del__(self):CODE
LOWdatasette/views/database.py668 except Exception as ex: # noqa: BLE001CODE
LOWdatasette/views/database.py684 except Exception as ex: # noqa: BLE001CODE
LOWdatasette/views/table.py1156 except Exception as e: # noqa: BLE001CODE
MEDIUMdatasette/views/table.py1021def post(self, request, upsert=False):CODE
MEDIUMdatasette/views/table_create_alter.py1030def get(self, request):CODE
LOWdatasette/views/table_create_alter.py928 except Exception as e: # noqa: BLE001STRING
LOWdatasette/views/table_create_alter.py1330 except Exception as e: # noqa: BLE001STRING
LOWdatasette/views/row.py751 except Exception as e: # noqa: BLE001STRING
LOWdatasette/views/row.py835 except Exception as e: # noqa: BLE001STRING
LOWdatasette/views/special.py423 except Exception: # noqa: BLE001CODE
LOWdatasette/views/base.py319 except Exception as ex: # noqa: BLE001CODE
Self-Referential Comments13 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUMtest-in-pyodide-with-shot-scraper.sh13# Create a blank index pageCOMMENT
MEDIUMtests/test_schema_endpoints.py30 # Create a database with restricted access (requires root permission)COMMENT
MEDIUMtests/test_schema_endpoints.py36 # Create an empty databaseCOMMENT
MEDIUMtests/test_plugins.py1674 # Create a token using the hardcoded handler (first registered from plugins dir)STRING
MEDIUMtests/test_plugins.py1683 # Create a token by explicitly requesting the hardcoded handler by nameSTRING
MEDIUMtests/test_plugins.py1689 # Create a token by explicitly requesting the signed handler by nameSTRING
MEDIUMtests/test_plugins.py1786 # Define a test plugin that registers these actionsSTRING
MEDIUMtests/test_multipart.py393 # Create a body larger than the in-memory threshold (1MB)COMMENT
MEDIUMtests/test_allowed_resources.py346 # Create a database with 105 tablesCOMMENT
MEDIUMtests/test_internal_db.py204 # Create a data database fileSTRING
MEDIUMdocs/conf.py5# This file is execfile()d with the current directory set to itsCOMMENT
MEDIUMdatasette/publish/heroku.py142 # Create a new appCOMMENT
MEDIUMdemos/plugins/example_js_manager_plugins.py7# Create a set with view names that qualify for this JS, since plugins won't do anything on other pagesCOMMENT
Decorative Section Separators10 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_allowed_many.py73# ----------------------------------------------------------------------COMMENT
MEDIUMtests/test_allowed_many.py75# ----------------------------------------------------------------------COMMENT
MEDIUMtests/test_allowed_many.py206# ----------------------------------------------------------------------COMMENT
MEDIUMtests/test_allowed_many.py208# ----------------------------------------------------------------------COMMENT
MEDIUMtests/test_allowed_many.py583# ----------------------------------------------------------------------COMMENT
MEDIUMtests/test_allowed_many.py585# ----------------------------------------------------------------------COMMENT
MEDIUMdatasette/utils/permissions.py87# -----------------------------COMMENT
MEDIUMdatasette/utils/permissions.py89# -----------------------------COMMENT
MEDIUMdatasette/utils/permissions.py134# -----------------------------------------------STRING
MEDIUMdatasette/utils/permissions.py136# -----------------------------------------------STRING
Redundant / Tautological Comments14 hits · 19 pts
SeverityFileLineSnippetContext
LOWtests/test_auth.py367 # Set root_enabled to simulate --root flagCOMMENT
LOWtests/test_docs.py191 # Check if next line is entirely made of a single underline characterCOMMENT
LOWtests/test_docs.py203 # Check if this is an overline+underline style headingCOMMENT
LOWtests/plugins/my_plugin.py521 # Check if this is a global action (no resource_class specified)STRING
LOW.github/workflows/stable-docs.yml64 # Check if the list of files is non-emptyCOMMENT
LOWdatasette/app.py1683 # Check if actor can see itCOMMENT
LOWdatasette/app.py1687 # Check if anonymous user can see it (for "private" flag)COMMENT
LOWdatasette/app.py1834 # Check if truncated (got more than limit rows)STRING
LOWdatasette/permissions.py114 # Check if our parent has a parent - that would create 3 levelsCOMMENT
LOWdatasette/utils/permissions.py29 # Check if we should skip permission checks BEFORE calling hooksCOMMENT
LOWdatasette/views/index.py82 # Check if table is in allowed setCOMMENT
LOWdatasette/views/special.py316 # Check if user has permissions-debug (to show sensitive fields)COMMENT
LOWdatasette/views/special.py321 # Check if this is a request for JSON (has .json extension)COMMENT
LOWdatasette/views/special.py490 # Check if this is a request for JSON (has .json extension)COMMENT
AI Structural Patterns19 hits · 16 pts
SeverityFileLineSnippetContext
LOWtests/fixtures.py108CODE
LOWdatasette/stored_queries.py164CODE
LOWdatasette/stored_queries.py242CODE
LOWdatasette/stored_queries.py358CODE
LOWdatasette/stored_queries.py428CODE
LOWdatasette/app.py400CODE
LOWdatasette/app.py1111CODE
LOWdatasette/app.py1159CODE
LOWdatasette/app.py1215CODE
LOWdatasette/app.py1239CODE
LOWdatasette/app.py1626CODE
LOWdatasette/utils/multipart.py635CODE
LOWdatasette/utils/multipart.py297CODE
LOWdatasette/utils/asgi.py203CODE
LOWdatasette/utils/asgi.py521CODE
LOWdatasette/utils/testing.py84CODE
LOWdatasette/utils/testing.py115CODE
LOWdatasette/utils/testing.py139CODE
LOWdatasette/views/execute_write.py222CODE
Docstring Block Structure2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHdatasette/app.py1636 Create a Resource instance for the given action with parent/child values. Looks up the action's resourSTRING
HIGHdatasette/utils/asgi.py217 Parse form data from the request body. Supports both application/x-www-form-urlencoded and multipart/fSTRING
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALdatasette/static/cm-editor-6.0.1.bundle.js1var cm=function(t){"use strict";class e{constructor(){}lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid posCODE
Modern AI Meta-Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_internals_database.py783 # via dependency injection.COMMENT
MEDIUMdatasette/database.py389 # switching to keyword dependency injection when the callbackCOMMENT
Fake / Example Data5 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/test_playwright.py791 dialog.locator(".table-alter-column-name").first.get_attribute("placeholder")CODE
LOWtests/test_playwright.py942 assert table_name.get_attribute("placeholder") == "table name"CODE
LOWtests/test_playwright.py429 dialog.locator(".table-create-column-name").nth(0).get_attribute("placeholder")STRING
LOWdatasette/static/sql-formatter-2.3.3.min.js4!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amCODE
LOWdatasette/templates/create_token.html95 expireDuration.setAttribute("placeholder", expireType.value.replace("Expires after X ", ""));CODE
Over-Commented Block4 hits · 4 pts
SeverityFileLineSnippetContext
LOWdocs/conf.py1#COMMENT
LOWdocs/conf.py81#COMMENT
LOWdocs/conf.py141latex_elements = {COMMENT
LOWdatasette/static/datasette-manager.js221 // Future API ideasCOMMENT
Modern Structural Boilerplate3 hits · 3 pts
SeverityFileLineSnippetContext
LOWdatasette/app.py164logger = logging.getLogger(__name__)CODE
LOWdatasette/fixtures.py8__all__ = [CODE
LOWdatasette/views/special.py24logger = logging.getLogger(__name__)CODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWdatasette/utils/permissions.py112 # No namespacing - just use plugin params as-isCOMMENT