Open Source Soldering Iron firmware
This report presents the forensic synthetic code analysis of Ralim/IronOS, a C project with 8,281 GitHub stars. SynthScan v2.0 examined 505,915 lines of code across 1016 source files, recording 4534 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 6.5 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).
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.
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.
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.
The scanner identified 4534 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Core/Inc/main.hpp | 41 | #endif | COMMENT |
| LOW | source/Core/Inc/settingsGUI.hpp | 1 | /* | COMMENT |
| LOW | source/Core/Inc/Types.h | 1 | #ifndef TYPES_H_ | COMMENT |
| LOW | source/Core/Inc/power.hpp | 1 | /* | COMMENT |
| LOW | source/Core/Inc/Translation_multi.h | 1 | #ifndef TRANSLATION_MULTI_H_ | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 161 | #define MAC_ADDR0 2 | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 181 | #define PHY_CONFIG_DELAY ((uint32_t)0x00000FFF) | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 221 | #ifdef HAL_GPIO_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 241 | #ifdef HAL_CORTEX_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 261 | #ifdef HAL_SRAM_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 281 | #ifdef HAL_PWR_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 301 | #ifdef HAL_NAND_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 321 | #ifdef HAL_IRDA_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Drivers/accelerometers_common.h | 1 | #ifndef CORE_DRIVERS_ACCELEROMTERS_COMMON_H_ | COMMENT |
| LOW | source/Core/Drivers/LIS2DH12_defines.hpp | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/LIS2DH12_defines.hpp | 21 | #define LIS_INT1_CFG 0xB0 | 0x80 | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 21 | #define BMA223_INT_STATUS_1 0x0A | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 41 | #define BMA223_INT_1 0x23 | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 61 | #define BMA223_OFC_OFFSET_Y 0x39 | COMMENT |
| LOW | source/Core/Drivers/FS2711.cpp | 1 | #include "configuration.h" | COMMENT |
| LOW | source/Core/Drivers/WS2812.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 1 | #ifndef _FS2711_DEFINE_HPP_ | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 21 | #define FS2711_PROTOCOL_QC2A 4 | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 41 | #define FS2711_REG_MODE_SET 0xA0 // Mode set | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 61 | #define FS2711_REG_PROTOCOL_EXISTS 0xF8 | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 21 | COMMENT | |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 41 | #define TRANSIENT_CFG_REG 0x1D // TRANSIENT_CFG Transient Configuration Register | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 61 | #define CTRL_REG5 0x2E // CTRL_REG5 Interrupt Configuration Register | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 81 | #define Y_LSB_REG 0X04 | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 101 | #define FHZ400 0x1 // 400hz | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 121 | #define INT_EN_FF_MT 1 << 2 // Freefall/Motion Interrupt Enable | COMMENT |
| LOW | source/Core/Drivers/OLED.hpp | 21 | #endif | COMMENT |
| LOW | source/Core/Drivers/OLED.hpp | 41 | COMMENT | |
| LOW | source/Core/Drivers/HUB238.hpp | 1 | #pragma once | COMMENT |
| LOW | source/Core/Drivers/HUB238.hpp | 21 | #define HUB238_REG_GO_COMMAND 0x09 | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 21 | #define SI7210_CTRL1 0xC6U | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 41 | #define MEAS_MASK 0x80U | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 61 | #define DSP_SIGM_DATA_FLAG 0x80U | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 81 | #define DF_BURSTSIZE_2 0x1U << 5 | COMMENT |
| LOW | source/Core/Drivers/MSA301_defines.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/MSA301_defines.h | 21 | #define MSA301_REG_CLICKSTATUS 0x0B ///< Register address for click/doubleclick status | COMMENT |
| LOW | source/Core/Drivers/Font.h | 501 | COMMENT | |
| LOW | source/Core/Drivers/Font.h | 581 | #endif | COMMENT |
| LOW | source/Core/Drivers/USBPD.cpp | 1 | #include "USBPD.h" | COMMENT |
| LOW | source/Core/Drivers/SC7A20_defines.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/SC7A20_defines.h | 21 | #define SC7A20_CTRL_REG5 0x24 | COMMENT |
| LOW | source/Core/Drivers/SC7A20_defines.h | 41 | #define SC7A20_INT2_DURATION 0x37 | COMMENT |
| LOW | source/Core/BSP/BSP_QC.h | 21 | // Set the DP pin to 3.3V | COMMENT |
| LOW | source/Core/BSP/BSP.h | 1 | #include "BSP_Flash.h" | COMMENT |
| LOW | source/Core/BSP/BSP.h | 101 | // preStartChecks are run until they return 0 | COMMENT |
| LOW | source/Core/BSP/Pinecil/BSP.cpp | 1 | // BSP mapping functions | COMMENT |
| LOW | source/Core/BSP/Pinecil/BSP.cpp | 21 | COMMENT | |
| LOW | source/Core/BSP/Pinecil/Pins.h | 1 | /* | COMMENT |
| LOW | source/Core/BSP/Pinecil/Pins.h | 21 | #define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_1 | COMMENT |
| LOW | source/Core/BSP/Pinecil/Pins.h | 41 | #define QC_DP_LOW_Pin BIT(7) | COMMENT |
| LOW | source/Core/BSP/Pinecil/configuration.h | 81 | #define POWER_PULSE_MAX 100 // x10 max watts | COMMENT |
| LOW | source/Core/BSP/Pinecil/configuration.h | 101 | * Detailed idle screen (off for first time users) | COMMENT |
| LOW | source/Core/BSP/Pinecil/configuration.h | 121 | #define ADC_MAX_READING (4096 * 8) // Maximum reading of the adc | COMMENT |
| LOW | source/Core/BSP/Pinecil/configuration.h | 141 | #define MAX_TEMP_C 450 // Max soldering temp selectable °C | COMMENT |
| 4365 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | source/dfuse-pack.py | 255 | print("Error: IntelHex python module could not be found") | CODE |
| LOW | source/Settings/test_config_parser.py | 61 | except Exception as e: | CODE |
| LOW | source/Settings/test_config_parser.py | 84 | except Exception as e: | CODE |
| MEDIUM | source/Settings/test_config_parser.py | 85 | print(f"Error parsing {model}: {e}", file=sys.stderr) | CODE |
| LOW | source/Settings/config_parser.py | 264 | except Exception as e: | CODE |
| MEDIUM | source/Settings/config_parser.py | 265 | print(f"Error: {e}", file=sys.stderr) | CODE |
| MEDIUM | source/Settings/test_generate_settings.py | 24 | print(f"Error importing modules: {e}") | CODE |
| LOW⚡ | source/Settings/generate_settings.py | 100 | except Exception as e: | CODE |
| MEDIUM⚡ | source/Settings/generate_settings.py | 101 | print(f"Error loading settings definitions: {e}") | CODE |
| LOW⚡ | source/Settings/generate_settings.py | 111 | except Exception as nested_e: | CODE |
| LOW | source/Settings/generate_settings.py | 122 | except Exception as e: | CODE |
| MEDIUM | source/Settings/generate_settings.py | 123 | print(f"Error reading template file: {e}") | CODE |
| LOW | source/Settings/generate_settings.py | 136 | except Exception as e: | CODE |
| MEDIUM | source/Settings/generate_settings.py | 137 | print(f"Error writing output file: {e}") | CODE |
| LOW | source/Settings/lib/settings_cli.py | 103 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_cli.py | 104 | print(f"Error loading BSP configuration: {e}") | CODE |
| MEDIUM⚡ | source/Settings/lib/settings_cli.py | 134 | print(f"Error: Settings definition file '{args.definitions}' does not exist.") | CODE |
| LOW⚡ | source/Settings/lib/settings_cli.py | 144 | except Exception as e: | CODE |
| MEDIUM⚡ | source/Settings/lib/settings_cli.py | 145 | print(f"Error loading settings definitions: {e}") | CODE |
| LOW | source/Settings/lib/settings_cli.py | 172 | except Exception as e: | CODE |
| LOW | source/Settings/lib/settings_parser.py | 107 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_util.py | 33 | print(f"Error: Model code '{model_code}' is not recognized.") | CODE |
| LOW | source/Settings/lib/settings_util.py | 88 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_util.py | 89 | print(f"Error evaluating expression '{expression}' -> '{result_expr}': {e}") | CODE |
| LOW | source/Settings/lib/settings_model.py | 165 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_model.py | 166 | print(f"Error loading settings from file: {e}") | CODE |
| LOW | source/Settings/lib/settings_model.py | 224 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_model.py | 225 | print(f"Error saving settings to file: {e}") | CODE |
| LOW | scripts/ci/generate_memory_usage_report.py | 243 | except Exception: | CODE |
| LOW | scripts/ci/generate_memory_usage_report.py | 330 | except Exception as exc: # pragma: no cover - CI utility script | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/config_parser.py | 6 | CODE | |
| LOW | source/Settings/generate_settings.py | 13 | CODE | |
| LOW | source/Settings/lib/__init__.py | 13 | CODE | |
| LOW | source/Settings/lib/__init__.py | 13 | CODE | |
| LOW | source/Settings/lib/__init__.py | 14 | CODE | |
| LOW | source/Settings/lib/__init__.py | 14 | CODE | |
| LOW | source/Settings/lib/__init__.py | 15 | CODE | |
| LOW | source/Settings/lib/__init__.py | 15 | CODE | |
| LOW | source/Settings/lib/__init__.py | 16 | CODE | |
| LOW | source/Settings/lib/__init__.py | 17 | CODE | |
| LOW | source/Settings/lib/__init__.py | 17 | CODE | |
| LOW | source/Settings/lib/__init__.py | 17 | CODE | |
| LOW | source/Settings/lib/settings_parser.py | 6 | CODE | |
| LOW | source/Settings/lib/settings_parser.py | 7 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 6 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 9 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 10 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 15 | CODE | |
| LOW | scripts/ci/generate_memory_usage_report.py | 12 | CODE | |
| LOW | Translations/migrate.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/config_parser.py | 159 | def _get_model_specific_blocks(self, content: str) -> List[tuple]: | CODE |
| LOW | source/Settings/test_edit_settings.py | 120 | def test_load_from_nonexistent_binary(self): | CODE |
| LOW | source/Settings/test_edit_settings.py | 154 | def test_save_to_binary_error_handling(self): | CODE |
| LOW | source/Settings/test_generate_settings.py | 62 | def test_load_yaml_and_convert(self): | CODE |
| LOW⚡ | source/Settings/lib/settings_cli.py | 128 | def run_editing_settings_file_cli(): | CODE |
| LOW | scripts/ci/generate_memory_usage_report.py | 233 | def load_language_local_names(translations_dir: pathlib.Path) -> Dict[str, str]: | CODE |
| LOW | Translations/brieflz.py | 48 | def _fn_blz_workmem_size_level(): | CODE |
| LOW | Translations/make_translation_test.py | 8 | def test_get_bytes_from_font_index(self): | CODE |
| LOW | Translations/make_translation_test.py | 35 | def test_no_language_id_collisions(self): | CODE |
| LOW | Translations/make_translation.py | 92 | def validate_langcode_matches_content(filename: str, content: dict) -> None: | CODE |
| LOW | Translations/make_translation.py | 228 | def description_uses_small_font(msg: str) -> bool: | CODE |
| LOW | Translations/make_translation.py | 367 | def convert_letter_counts_to_ranked_symbols_with_forced( | CODE |
| LOW | Translations/make_translation.py | 543 | def get_bytes_from_font_index(index: int) -> bytes: | CODE |
| LOW | Translations/make_translation.py | 726 | def build_symbol_conversion_map(sym_list: List[str]) -> Dict[str, bytes]: | CODE |
| LOW | Translations/make_translation.py | 758 | def make_font_table_named_cpp( | CODE |
| LOW | Translations/make_translation.py | 1173 | def get_translation_common_text( | CODE |
| LOW | Translations/make_translation.py | 1239 | def get_translation_strings_and_indices_text( | CODE |
| LOW | Translations/make_translation.py | 1479 | def get_translation_sanity_checks_text(defs: dict) -> str: | CODE |
| LOW | Translations/font_tables.py | 106 | def get_font_map_latin_extended() -> Dict[str, bytes]: | CODE |
| LOW | Translations/font_tables.py | 498 | def get_small_font_map_ascii_basic() -> Dict[str, bytes]: | CODE |
| LOW | Translations/font_tables.py | 600 | def get_small_font_map_latin_extended() -> Dict[str, bytes]: | CODE |
| LOW | Translations/font_tables.py | 881 | def get_small_font_map_cyrillic() -> Dict[str, bytes]: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/test_generate_settings.py | 105 | # Check if the script executed successfully | COMMENT |
| LOW | source/Settings/generate_settings.py | 53 | # Check if settings definitions file exists | COMMENT |
| LOW⚡ | source/Settings/lib/settings_cli.py | 132 | # Check if settings definitions file exists | COMMENT |
| LOW | source/Settings/lib/settings_cli.py | 186 | # Check if output is hex and we need intelhex module | COMMENT |
| LOW | source/Settings/lib/settings_parser.py | 113 | # Check if any values are still unresolved | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 92 | # Read the file | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 115 | # Check if file size is correct | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 263 | # Check if value is in range | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 291 | # Check if value respects the increment step | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 293 | # Check if value is min_int + n*inc_int | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | source/Settings/test_edit_settings.py | 39 | # Create a temporary YAML file for testing | COMMENT |
| MEDIUM | source/Settings/test_edit_settings.py | 65 | # Create a temporary binary file for testing | COMMENT |
| MEDIUM | source/Settings/test_generate_settings.py | 41 | # Create a simple test YAML file | COMMENT |
| MEDIUM | source/Settings/lib/settings_parser.py | 25 | # Create a dictionary of values to use for resolving expressions | COMMENT |
| MEDIUM | source/Settings/lib/settings_model.py | 209 | # Create a new Intel HEX object | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/metadata.py | 50 | CODE | |
| LOW | source/Settings/test_config_parser.py | 9 | CODE | |
| LOW | source/Settings/config_parser.py | 132 | CODE | |
| LOW | source/Settings/config_parser.py | 181 | CODE | |
| LOW | source/Settings/lib/settings_parser.py | 15 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 69 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 228 | CODE | |
| LOW | Translations/make_translation.py | 419 | CODE | |
| LOW | Translations/make_translation.py | 492 | CODE | |
| LOW | Translations/make_translation.py | 1490 | CODE | |
| LOW | Translations/make_translation.py | 1547 | CODE | |
| LOW | Translations/font_tables.py | 1007 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …omponents/ble/ble_stack/common/tinycrypt/source/hmac.c | 58 | const uint8_t dummy_key[TC_SHA256_BLOCK_SIZE]; | CODE |
| LOW | …omponents/ble/ble_stack/common/tinycrypt/source/hmac.c | 70 | (void)tc_sha256_update(&dummy_state.hash_state, dummy_key, key_size); | CODE |
| LOW | Translations/brieflz_test.py | 7 | b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW | Translations/brieflz_test.py | 7 | b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | source/Core/brieflz/brieflz_leparse.h | 46 | // Essentially, this improves the worst case for the parsing at a small cost | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/lib/__init__.py | 23 | __all__ = [ | CODE |