Repository Analysis

BIT-DataLab/Edit-Banana

Edit Banana: A framework for converting statistical formats into editable.

14.1 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of BIT-DataLab/Edit-Banana, a Python project with 5,413 GitHub stars. SynthScan v2.0 examined 12,725 lines of code across 55 source files, recording 162 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 14.1 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).

14.1
Adjusted Score
14.1
Raw Score
100%
Time Factor
2026-07-12
Last Push
5.4K
Stars
Python
Language
12.7K
Lines of Code
55
Files
162
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 0MEDIUM 5LOW 157

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 162 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.

Unused Imports66 hits · 66 pts
SeverityFileLineSnippetContext
LOWmain.py34CODE
LOWmain.py34CODE
LOWmain.py34CODE
LOWsam3_service/__init__.py1CODE
LOWsam3_service/__init__.py1CODE
LOWmodules/xml_merger.py42CODE
LOWmodules/xml_merger.py42CODE
LOWmodules/xml_merger.py46CODE
LOWmodules/__init__.py6CODE
LOWmodules/__init__.py6CODE
LOWmodules/__init__.py7CODE
LOWmodules/__init__.py7CODE
LOWmodules/__init__.py7CODE
LOWmodules/__init__.py7CODE
LOWmodules/__init__.py7CODE
LOWmodules/__init__.py7CODE
LOWmodules/__init__.py15CODE
LOWmodules/__init__.py16CODE
LOWmodules/__init__.py19CODE
LOWmodules/__init__.py20CODE
LOWmodules/__init__.py21CODE
LOWmodules/__init__.py22CODE
LOWmodules/metric_evaluator.py133CODE
LOWmodules/metric_evaluator.py139CODE
LOWmodules/sam3_info_extractor.py13CODE
LOWmodules/sam3_info_extractor.py14CODE
LOWmodules/basic_shape_processor.py43CODE
LOWmodules/basic_shape_processor.py43CODE
LOWmodules/basic_shape_processor.py43CODE
LOWmodules/basic_shape_processor.py43CODE
LOWmodules/basic_shape_processor.py44CODE
LOWmodules/basic_shape_processor.py47CODE
LOWmodules/base.py20CODE
LOWmodules/base.py20CODE
LOWmodules/base.py20CODE
LOWmodules/utils/__init__.py3CODE
LOWmodules/utils/__init__.py3CODE
LOWmodules/utils/__init__.py8CODE
LOWmodules/utils/__init__.py8CODE
LOWmodules/utils/__init__.py8CODE
LOWmodules/utils/__init__.py8CODE
LOWmodules/utils/__init__.py15CODE
LOWmodules/utils/__init__.py19CODE
LOWmodules/utils/__init__.py19CODE
LOWmodules/utils/__init__.py19CODE
LOWmodules/utils/__init__.py19CODE
LOWmodules/utils/__init__.py19CODE
LOWmodules/utils/xml_utils.py7CODE
LOWmodules/utils/xml_utils.py7CODE
LOWmodules/text/__init__.py16CODE
LOWmodules/text/__init__.py17CODE
LOWmodules/text/__init__.py18CODE
LOWmodules/text/__init__.py18CODE
LOWmodules/text/restorer.py14CODE
LOWmodules/text/ocr/__init__.py6CODE
LOWmodules/text/ocr/__init__.py6CODE
LOWmodules/text/ocr/__init__.py7CODE
LOWmodules/text/ocr/pix2text.py174CODE
LOWmodules/text/ocr/local_ocr.py9CODE
LOWmodules/text/ocr/local_ocr.py9CODE
6 more matches not shown…
Excessive Try-Catch Wrapping31 hits · 34 pts
SeverityFileLineSnippetContext
LOWserver_pa.py76 except Exception:CODE
LOWserver_pa.py80 except Exception as e:CODE
LOWmain.py180 except Exception as e:CODE
LOWmain.py271 except Exception as e:CODE
MEDIUMmain.py388 print(f"Error: file not found {args.input}")STRING
MEDIUMmain.py396 print(f"Error: input directory does not exist: {input_dir}")STRING
MEDIUMmain.py406 print(f"Error: no supported image files in {input_dir}")STRING
LOWsam3_service/server.py262 except Exception as exc: # pragma: no cover - defensive log pathCODE
LOWsam3_service/rmbg_client.py31 except Exception as exc: # pragma: no coverCODE
LOWsam3_service/rmbg_client.py63 except Exception:CODE
LOWsam3_service/client.py63 except Exception:CODE
LOWsam3_service/rmbg_server.py90 except Exception as exc: # pragma: no coverCODE
MEDIUMscripts/merge_xml.py32 print(f"Error: file not found {args.input}")CODE
LOWmodules/icon_picture_processor.py114 except Exception as e:CODE
LOWmodules/icon_picture_processor.py177 except Exception as e:CODE
LOWmodules/icon_picture_processor.py201 except Exception as e2:CODE
LOWmodules/icon_picture_processor.py298 except Exception as e:CODE
LOWmodules/xml_merger.py258 except Exception as e:CODE
LOWmodules/xml_merger.py333 except Exception as e:CODE
LOWmodules/xml_merger.py497 except Exception as e:CODE
LOWmodules/xml_merger.py614 except Exception as e:CODE
LOWmodules/refinement_processor.py224 except Exception as e:CODE
LOWmodules/__init__.py27except Exception as e:CODE
LOWmodules/sam3_info_extractor.py745 except Exception as e:CODE
LOWmodules/basic_shape_processor.py1405 except Exception as e:CODE
LOWmodules/utils/xml_utils.py54 except Exception:CODE
LOWmodules/text/restorer.py70 except Exception as e:CODE
LOWmodules/text/restorer.py270 except Exception as e:CODE
LOWmodules/text/restorer.py558 except Exception as e:CODE
LOWmodules/text/ocr/pix2text.py216 except Exception as e:CODE
MEDIUMflowchart_text/main.py35 print(f"Error: file not found {args.input}")CODE
Deep Nesting27 hits · 27 pts
SeverityFileLineSnippetContext
LOWmain.py142CODE
LOWmain.py277CODE
LOWsam3_service/server.py177CODE
LOWscripts/setup_rmbg.py16CODE
LOWmodules/xml_merger.py152CODE
LOWmodules/xml_merger.py224CODE
LOWmodules/xml_merger.py285CODE
LOWmodules/xml_merger.py459CODE
LOWmodules/xml_merger.py527CODE
LOWmodules/metric_evaluator.py345CODE
LOWmodules/metric_evaluator.py613CODE
LOWmodules/metric_evaluator.py1160CODE
LOWmodules/metric_evaluator.py1243CODE
LOWmodules/metric_evaluator.py1262CODE
LOWmodules/sam3_info_extractor.py677CODE
LOWmodules/sam3_info_extractor.py748CODE
LOWmodules/sam3_info_extractor.py889CODE
LOWmodules/basic_shape_processor.py82CODE
LOWmodules/basic_shape_processor.py393CODE
LOWmodules/basic_shape_processor.py456CODE
LOWmodules/basic_shape_processor.py818CODE
LOWmodules/basic_shape_processor.py1601CODE
LOWmodules/basic_shape_processor.py1700CODE
LOWmodules/text/restorer.py263CODE
LOWmodules/text/ocr/paddle_ocr.py50CODE
LOWmodules/text/processors/style.py86CODE
LOWmodules/text/processors/font_family.py172CODE
Hyper-Verbose Identifiers15 hits · 15 pts
SeverityFileLineSnippetContext
LOWmodules/icon_picture_processor.py415def calculate_image_complexity(image_arr: np.ndarray) -> tuple:CODE
LOWmodules/xml_merger.py262 def _scale_fragment_coordinates(self, fragment: XMLFragment, scale: float) -> XMLFragment:CODE
LOWmodules/xml_merger.py285 def _extract_text_fragments_from_xml(self, text_xml: str) -> List[XMLFragment]:CODE
LOWmodules/refinement_processor.py532def refine_from_rendered_comparison(elements: List[ElementInfo],CODE
LOWmodules/metric_evaluator.py510 def _extract_text_bboxes_from_xml(self, text_xml: str, img_width: int, img_height: int) -> List[List[int]]:CODE
LOWmodules/metric_evaluator.py613 def _detect_complex_image_regions(self,CODE
LOWmodules/metric_evaluator.py1160 def _save_uncovered_visualization(self,CODE
LOWmodules/metric_evaluator.py1628def detect_missing_from_rendered_diff(original_path: str,CODE
LOWmodules/sam3_info_extractor.py541 def extract_with_custom_prompts(self, context: ProcessingContext,CODE
LOWmodules/sam3_info_extractor.py640 def _deduplicate_within_group(self, elements: List[ElementInfo],CODE
LOWmodules/sam3_info_extractor.py677 def _analyze_region_complexity(self, image_path: str, bbox: List[int]) -> dict:CODE
LOWmodules/sam3_info_extractor.py748 def _deduplicate_cross_groups(self, elements: List[ElementInfo]) -> List[ElementInfo]:CODE
LOWmodules/sam3_info_extractor.py889 def _filter_contained_elements(self, elements: List[ElementInfo]) -> List[ElementInfo]:CODE
LOWmodules/sam3_info_extractor.py1054 def remove_prompts_from_group(self, group_type: PromptGroup, prompts: List[str]):CODE
LOWmodules/text/restorer.py407 def _is_refinement_meaningful(self, original: str, new_latex: str) -> bool:CODE
Verbosity Indicators6 hits · 13 pts
SeverityFileLineSnippetContext
LOWmodules/text/restorer.py143 # Step 1: OCRCOMMENT
LOWmodules/text/restorer.py146 # Step 2: Formula (layout OCR + Pix2Text)COMMENT
LOWmodules/text/restorer.py158 # Step 3: Coord transformCOMMENT
LOWmodules/text/restorer.py173 # Step 4: Font sizeCOMMENT
LOWmodules/text/restorer.py177 # Step 5: Font familyCOMMENT
LOWmodules/text/restorer.py182 # Step 6: Style (bold/color)COMMENT
Structural Annotation Overuse6 hits · 13 pts
SeverityFileLineSnippetContext
LOWmodules/text/restorer.py143 # Step 1: OCRCOMMENT
LOWmodules/text/restorer.py146 # Step 2: Formula (layout OCR + Pix2Text)COMMENT
LOWmodules/text/restorer.py158 # Step 3: Coord transformCOMMENT
LOWmodules/text/restorer.py173 # Step 4: Font sizeCOMMENT
LOWmodules/text/restorer.py177 # Step 5: Font familyCOMMENT
LOWmodules/text/restorer.py182 # Step 6: Style (bold/color)COMMENT
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWsam3_service/__init__.py3__all__ = ["Sam3ServiceClient", "Sam3ServicePool"]CODE
LOWmodules/__init__.py32__all__ = [CODE
LOWmodules/utils/__init__.py27__all__ = [CODE
LOWmodules/text/__init__.py20__all__ = [CODE
LOWmodules/text/ocr/__init__.py19__all__ = [CODE
LOWmodules/text/processors/__init__.py18__all__ = [CODE
Over-Commented Block4 hits · 4 pts
SeverityFileLineSnippetContext
LOWrequirements.txt21# pip install onnxruntime # or onnxruntime-gpuCOMMENT
LOWmodules/sam3_info_extractor.py801 # 【新增】基础图形和图片类重叠的智能判断COMMENT
LOWmodules/sam3_info_extractor.py821 # keep.append(elem_j)COMMENT
LOWflowchart_text/src/__init__.py1# OCR & text extraction — source layer for alignment and config.COMMENT
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWmodules/text/xml_generator.py235CODE