Repository Analysis

Agents365-ai/drawio-skill

Generate draw.io diagrams from natural language — 11 presets (UML, SysML/MBSE, BPMN, network, C4…), 39 tools: codebase/CI/infra-to-diagram, image→editable diagram, Databricks product icons, mind maps, build-up animation, exec-view compression, click-through runbooks, PR diff bot. Vision self-check, 10,000+ shapes. Exports PNG/SVG/PDF/JPG.

12.0 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of Agents365-ai/drawio-skill, a Python project with 8,185 GitHub stars. SynthScan v2.0 examined 18,325 lines of code across 98 source files, recording 144 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 12.0 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).

12.0
Adjusted Score
12.0
Raw Score
100%
Time Factor
2026-08-28
Last Push
8.2K
Stars
Python
Language
18.3K
Lines of Code
98
Files
144
Pattern Hits
2026-08-29
Scan Date
0.17
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 17MEDIUM 2LOW 125

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 144 distinct pattern matches across 10 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 Identifiers86 hits · 91 pts
SeverityFileLineSnippetContext
LOWtests/test_prdiff.py93 def test_non_drawio_files_ignored(self):STRING
LOWtests/test_prdiff.py106 def test_sections_statuses_and_links(self):STRING
LOWtests/test_prdiff.py146 def test_build_entry_exports_base_head_diff_pngs(self):CODE
LOWtests/test_dbxicons.py46 def test_every_category_exists(self):CODE
LOWtests/test_dbxicons.py52 def test_manifest_carries_facts_only(self):CODE
LOWtests/test_dbxicons.py71 def test_search_ranks_substring(self):CODE
LOWtests/test_tubemap.py48 def test_horizontal_needs_no_bend(self):CODE
LOWtests/test_tubemap.py51 def test_vertical_needs_no_bend(self):CODE
LOWtests/test_tubemap.py54 def test_exact_diagonal_needs_no_bend(self):CODE
LOWtests/test_tubemap.py58 def test_wide_delta_goes_diagonal_then_horizontal(self):CODE
LOWtests/test_tubemap.py62 def test_tall_delta_goes_diagonal_then_vertical(self):CODE
LOWtests/test_tubemap.py66 def test_bend_lands_on_the_target_axis(self):CODE
LOWtests/test_tubemap.py77 def test_counts_and_wellformed(self):CODE
LOWtests/test_tubemap.py83 def test_interchange_marker_distinct(self):CODE
LOWtests/test_tubemap.py89 def test_line_colour_and_palette_fallback(self):CODE
LOWtests/test_tubemap.py99 def test_unknown_station_id_errors(self):CODE
LOWtests/test_buildup.py60 def test_classify_leaves_and_edges(self):CODE
LOWtests/test_buildup.py70 def test_bounding_box_from_full_diagram(self):CODE
LOWtests/test_buildup.py86 def test_sources_precede_targets(self):CODE
LOWtests/test_buildup.py95 def test_cycle_falls_back_to_document_order(self):CODE
LOWtests/test_buildup.py99 def test_edge_step_is_at_or_after_both_endpoints(self):CODE
LOWtests/test_buildup.py116 def test_build_html_self_contained(self):CODE
LOWtests/test_buildup.py132 def test_full_run_produces_one_frame_per_node(self):CODE
LOWtests/test_skill_metadata.py15 def test_declared_versions_match(self):CODE
LOWtests/test_derasterize.py41 def test_positioned_nodes_and_shapes(self):CODE
LOWtests/test_derasterize.py62 def test_default_shape_size_and_fill(self):CODE
LOWtests/test_derasterize.py74 def test_edge_dashed_and_no_arrow(self):CODE
LOWtests/test_derasterize.py103 def test_missing_position_autoplace(self):CODE
LOWtests/test_scripts.py85 def test_families_group_variants(self):CODE
LOWtests/test_scripts.py93 def test_search_matches_brand(self):CODE
LOWtests/test_scripts.py99 def test_search_does_not_return_variant_brands(self):CODE
LOWtests/test_scripts.py184 def test_node_link_wraps_userobject(self):CODE
LOWtests/test_scripts.py192 def test_edge_style_passthrough(self):CODE
LOWtests/test_scripts.py200 def test_label_newline_becomes_entity(self):CODE
LOWtests/test_scripts.py206 def test_escapes_special_chars(self):CODE
LOWtests/test_scripts.py445 def test_edge_crossing_strict_fails(self):CODE
LOWtests/test_scripts.py454 def test_edge_through_vertex_warns(self):CODE
LOWtests/test_scripts.py458 def test_autorouted_edge_not_checked(self):CODE
LOWtests/test_scripts.py1212 def test_set_style_replaces_colours_once(self):CODE
LOWtests/test_scripts.py1220 def test_load_metrics_csv_and_json(self):CODE
LOWtests/test_scripts.py1229 def test_recolors_matched_nodes(self):CODE
LOWtests/test_scripts.py129 def test_roundtrip_cjk_and_percent(self):CODE
LOWtests/test_scripts.py135 def test_viewer_and_editor_urls(self):CODE
LOWtests/test_scripts.py149 def test_palette_from_design_file(self):CODE
LOWtests/test_scripts.py164 def test_grouped_nodes_coloured(self):CODE
LOWtests/test_scripts.py170 def test_mono_disables_colour(self):CODE
LOWtests/test_scripts.py300 def test_findings_carry_code_and_fix(self):CODE
LOWtests/test_scripts.py337 def test_userobject_wrapper_resolves(self):CODE
LOWtests/test_scripts.py376 def test_abs_rect_resolves_container_offset(self):CODE
LOWtests/test_scripts.py386 def test_endpoint_honours_exit_point(self):CODE
LOWtests/test_scripts.py481 def test_pyclasses_inheritance(self):CODE
LOWtests/test_scripts.py522 def test_tfimports_edge_and_icons(self):CODE
LOWtests/test_scripts.py586 def test_composeimports_edges(self):CODE
LOWtests/test_scripts.py636 def test_dockerimports_group_by_project(self):CODE
LOWtests/test_scripts.py750 def test_drawiodiff_relayout_is_not_movement(self):CODE
LOWtests/test_scripts.py764 def test_drawiodiff_flip_is_rerouted(self):CODE
LOWtests/test_scripts.py796 def test_timelapse_sample_indices(self):CODE
LOWtests/test_scripts.py806 def test_timelapse_build_html_self_contained(self):CODE
LOWtests/test_scripts.py834 def test_explain_groups_shapes_relations(self):CODE
LOWtests/test_scripts.py917 def test_svgflow_animates_only_edges(self):CODE
26 more matches not shown…
Cross-File Repetition10 hits · 50 pts
SeverityFileLineSnippetContext
HIGHtests/test_buildup.py0run a script as a subprocess; return completedprocess.STRING
HIGHtests/test_derasterize.py0run a script as a subprocess; return completedprocess.STRING
HIGHtests/test_scripts.py0run a script as a subprocess; return completedprocess.STRING
HIGHtests/test_compress.py0run a script as a subprocess; return completedprocess.STRING
HIGHskills/drawio-skill/scripts/pyclasses.py0drop edges implied by a longer path, via graphviz `tred`.STRING
HIGHskills/drawio-skill/scripts/jsimports.py0drop edges implied by a longer path, via graphviz `tred`.STRING
HIGHskills/drawio-skill/scripts/tfimports.py0drop edges implied by a longer path, via graphviz `tred`.STRING
HIGHskills/drawio-skill/scripts/rustimports.py0drop edges implied by a longer path, via graphviz `tred`.STRING
HIGHskills/drawio-skill/scripts/pyimports.py0drop edges implied by a longer path, via graphviz `tred`.STRING
HIGHskills/drawio-skill/scripts/goimports.py0drop edges implied by a longer path, via graphviz `tred`.STRING
Cross-Language Confusion7 hits · 35 pts
SeverityFileLineSnippetContext
HIGHskills/drawio-skill/scripts/timelapse.py173let i=0,timer=null;CODE
HIGHskills/drawio-skill/scripts/timelapse.py183function stop(){{clearInterval(timer);timer=null;$("play").textContent="▶ Play";}}CODE
HIGHskills/drawio-skill/scripts/buildup.py218let i=0,timer=null;CODE
HIGHskills/drawio-skill/scripts/buildup.py227function stop(){{clearInterval(timer);timer=null;$("play").textContent="▶ Play";}}CODE
HIGHskills/drawio-skill/scripts/drawiohtml.py142let drag=null;CODE
HIGHskills/drawio-skill/scripts/drawiohtml.py149stage.addEventListener('pointerup',()=>{{drag=null;stage.classList.remove('drag');}});CODE
HIGHskills/drawio-skill/scripts/runbook.py197 b.onclick=()=>{{path.push(c.target);render();}};CODE
Deep Nesting29 hits · 28 pts
SeverityFileLineSnippetContext
LOWtests/test_scripts.py934CODE
LOWskills/drawio-skill/scripts/c4.py110CODE
LOWskills/drawio-skill/scripts/aiicons.py77CODE
LOWskills/drawio-skill/scripts/aiicons.py127CODE
LOWskills/drawio-skill/scripts/timelapse.py196CODE
LOWskills/drawio-skill/scripts/heatmap.py102CODE
LOWskills/drawio-skill/scripts/drawio2mermaid.py55CODE
LOWskills/drawio-skill/scripts/shapesearch.py32CODE
LOWskills/drawio-skill/scripts/relabel.py27CODE
LOWskills/drawio-skill/scripts/tfimports.py101CODE
LOWskills/drawio-skill/scripts/dbxicons.py96CODE
LOWskills/drawio-skill/scripts/drawiodiff.py66CODE
LOWskills/drawio-skill/scripts/drawiodiff.py118CODE
LOWskills/drawio-skill/scripts/drawiodiff.py143CODE
LOWskills/drawio-skill/scripts/rustimports.py116CODE
LOWskills/drawio-skill/scripts/buildup.py85CODE
LOWskills/drawio-skill/scripts/buildup.py255CODE
LOWskills/drawio-skill/scripts/sqlerd.py73CODE
LOWskills/drawio-skill/scripts/openapiimports.py79CODE
LOWskills/drawio-skill/scripts/validate.py266CODE
LOWskills/drawio-skill/scripts/pyimports.py59CODE
LOWskills/drawio-skill/scripts/compress.py39CODE
LOWskills/drawio-skill/scripts/autolayout.py152CODE
LOWskills/drawio-skill/scripts/runbook.py27CODE
LOWskills/drawio-skill/scripts/restyle.py87CODE
LOWskills/drawio-skill/scripts/k8simports.py69CODE
LOWskills/drawio-skill/scripts/k8simports.py122CODE
LOWskills/drawio-skill/scripts/k8simports.py162CODE
LOWskills/drawio-skill/scripts/explain.py55CODE
Structural Annotation Overuse3 hits · 4 pts
SeverityFileLineSnippetContext
LOWskills/drawio-skill/SKILL.md146### Step 5: Self-CheckCOMMENT
LOWskills/drawio-skill/SKILL.md165### Step 6: Review LoopCOMMENT
LOWskills/drawio-skill/SKILL.md191### Step 7: Final ExportCOMMENT
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMskills/drawio-skill/scripts/aiicons.py38# Common RAG/LLM data stores that lobe-icons lacks, mapped to simple-iconsCOMMENT
Excessive Try-Catch Wrapping3 hits · 3 pts
SeverityFileLineSnippetContext
LOWskills/drawio-skill/scripts/aiicons.py163 except Exception as exc: # noqa: BLE001 - report and skipCODE
LOWskills/drawio-skill/scripts/aiicons.py187 except Exception as exc: # noqa: BLE001 - keep the CDN URLCODE
LOWskills/drawio-skill/scripts/dbxicons.py261 except Exception as exc: # noqa: BLE001 - report and skipCODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMskills/drawio-skill/scripts/svgflow.py49 # One dash+gap of travel per cycle => seamless loop. Reverse flips the sign.COMMENT
Unused Imports3 hits · 2 pts
SeverityFileLineSnippetContext
LOWtests/test_scripts.py588CODE
LOWtests/test_scripts.py889CODE
LOWtests/test_scripts.py1374CODE
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOW.github/workflows/drawio-pr-diff.example.yml1# TEMPLATE — not a live workflow in this repo.COMMENT