Repository Analysis

Agents365-ai/drawio-skill

Generate draw.io diagrams from natural language — 11 presets (UML, SysML/MBSE, BPMN, network, C4…), 36 tools: codebase/CI/infra-to-diagram, image→editable diagram, 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.7 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 5,770 GitHub stars. SynthScan v2.0 examined 16,677 lines of code across 93 source files, recording 132 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 12.7 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.7
Adjusted Score
12.7
Raw Score
100%
Time Factor
2026-07-14
Last Push
5.8K
Stars
Python
Language
16.7K
Lines of Code
93
Files
132
Pattern Hits
2026-07-14
Scan Date
0.18
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 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 132 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 Identifiers79 hits · 86 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_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.py84 def test_families_group_variants(self):CODE
LOWtests/test_scripts.py92 def test_search_matches_brand(self):CODE
LOWtests/test_scripts.py98 def test_search_does_not_return_variant_brands(self):CODE
LOWtests/test_scripts.py183 def test_node_link_wraps_userobject(self):CODE
LOWtests/test_scripts.py191 def test_edge_style_passthrough(self):CODE
LOWtests/test_scripts.py199 def test_label_newline_becomes_entity(self):CODE
LOWtests/test_scripts.py205 def test_escapes_special_chars(self):CODE
LOWtests/test_scripts.py420 def test_edge_crossing_strict_fails(self):CODE
LOWtests/test_scripts.py429 def test_edge_through_vertex_warns(self):CODE
LOWtests/test_scripts.py433 def test_autorouted_edge_not_checked(self):CODE
LOWtests/test_scripts.py1099 def test_set_style_replaces_colours_once(self):CODE
LOWtests/test_scripts.py1107 def test_load_metrics_csv_and_json(self):CODE
LOWtests/test_scripts.py1116 def test_recolors_matched_nodes(self):CODE
LOWtests/test_scripts.py128 def test_roundtrip_cjk_and_percent(self):CODE
LOWtests/test_scripts.py134 def test_viewer_and_editor_urls(self):CODE
LOWtests/test_scripts.py148 def test_palette_from_design_file(self):CODE
LOWtests/test_scripts.py163 def test_grouped_nodes_coloured(self):CODE
LOWtests/test_scripts.py169 def test_mono_disables_colour(self):CODE
LOWtests/test_scripts.py312 def test_userobject_wrapper_resolves(self):CODE
LOWtests/test_scripts.py351 def test_abs_rect_resolves_container_offset(self):CODE
LOWtests/test_scripts.py361 def test_endpoint_honours_exit_point(self):CODE
LOWtests/test_scripts.py456 def test_pyclasses_inheritance(self):CODE
LOWtests/test_scripts.py497 def test_tfimports_edge_and_icons(self):CODE
LOWtests/test_scripts.py561 def test_composeimports_edges(self):CODE
LOWtests/test_scripts.py611 def test_dockerimports_group_by_project(self):CODE
LOWtests/test_scripts.py713 def test_timelapse_sample_indices(self):CODE
LOWtests/test_scripts.py723 def test_timelapse_build_html_self_contained(self):CODE
LOWtests/test_scripts.py751 def test_explain_groups_shapes_relations(self):CODE
LOWtests/test_scripts.py834 def test_svgflow_animates_only_edges(self):CODE
LOWtests/test_scripts.py846 def test_svgflow_reverse_flips_offset(self):CODE
LOWtests/test_scripts.py894 def test_sqlerd_tables_and_fks(self):CODE
LOWtests/test_scripts.py973 def test_openapiimports_operations_and_schemas(self):CODE
LOWtests/test_scripts.py1008 def test_openapiimports_no_schemas(self):CODE
LOWtests/test_scripts.py1052 def test_build_html_self_contained(self):CODE
LOWtests/test_scripts.py1160 def test_extract_and_apply_roundtrip(self):CODE
19 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.py169let i=0,timer=null;CODE
HIGHskills/drawio-skill/scripts/timelapse.py179function 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.py141let drag=null;CODE
HIGHskills/drawio-skill/scripts/drawiohtml.py148stage.addEventListener('pointerup',()=>{{drag=null;stage.classList.remove('drag');}});CODE
HIGHskills/drawio-skill/scripts/runbook.py197 b.onclick=()=>{{path.push(c.target);render();}};CODE
Deep Nesting25 hits · 25 pts
SeverityFileLineSnippetContext
LOWskills/drawio-skill/scripts/c4.py110CODE
LOWskills/drawio-skill/scripts/aiicons.py77CODE
LOWskills/drawio-skill/scripts/aiicons.py127CODE
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/drawiodiff.py51CODE
LOWskills/drawio-skill/scripts/drawiodiff.py96CODE
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.py241CODE
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.md139### Step 5: Self-CheckCOMMENT
LOWskills/drawio-skill/SKILL.md158### Step 6: Review LoopCOMMENT
LOWskills/drawio-skill/SKILL.md183### 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
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
Excessive Try-Catch Wrapping2 hits · 2 pts
SeverityFileLineSnippetContext
LOWskills/drawio-skill/scripts/aiicons.py162 except Exception as exc: # noqa: BLE001 - report and skipCODE
LOWskills/drawio-skill/scripts/aiicons.py186 except Exception as exc: # noqa: BLE001 - keep the CDN URLCODE
Unused Imports3 hits · 2 pts
SeverityFileLineSnippetContext
LOWtests/test_scripts.py563CODE
LOWtests/test_scripts.py806CODE
LOWtests/test_scripts.py1261CODE
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOW.github/workflows/drawio-pr-diff.example.yml1# TEMPLATE — not a live workflow in this repo.COMMENT