The next generation of motion control firmware
This report summarizes scanner evidence for bdring/FluidNC, a C++ project with 2,593 GitHub stars. SynthScan examined 150,475 lines of code across 813 source files, recording 595 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 4.5 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 550 finding(s).
Are imports declared and package/API names verified? 13 finding(s).
Are wrappers, guards, and repeated structures necessary? 35 finding(s).
Which changes need focused human review? 595 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 595 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build-release.py | 461 | # build still boots fine (without PSRAM) on none/Octal modules, same as | COMMENT |
| LOW | platformio.ini | 601 | # Hijacks the "native" platform (same one macos/linux/windows_x86 use) and | COMMENT |
| LOW | platformio.ini | 721 | build_flags = ${tests_common.build_flags} -DVARIANT="coverage" -O0 --coverage | COMMENT |
| LOW | tools/gen_config_docs.py | 61 | # concrete type. | COMMENT |
| LOW | tools/gen_config_docs.py | 81 | # (spi/i2s/uart/i2c) stands alone for a field that IS one of that bus's own | COMMENT |
| LOW | tools/gen_config_docs.py | 481 | if member: | COMMENT |
| LOW | tools/gen_config_docs.py | 521 | elif len(extra) == 1: | COMMENT |
| LOW | tools/gen_config_docs.py | 581 | # when @ignore_drift is present: a human has already looked at | COMMENT |
| LOW | tools/build_config_docs.py | 261 | # SECTIONS entry has an empty contributor list by design (it defines zero | COMMENT |
| LOW | FluidNC/posix/SimulatorWebSocketServer.h | 1 | #pragma once | COMMENT |
| LOW | FluidNC/posix/SimulatorWebSocketServer.h | 21 | COMMENT | |
| LOW | FluidNC/posix/Console.cpp | 1 | #include <iostream> | COMMENT |
| LOW | FluidNC/posix/Console.cpp | 21 | # undef B110 | COMMENT |
| LOW | FluidNC/posix/Console.cpp | 41 | #ifdef B1800 | COMMENT |
| LOW | FluidNC/posix/Console.cpp | 61 | #endif | COMMENT |
| LOW | FluidNC/posix/Console.cpp | 81 | # undef B1000000 | COMMENT |
| LOW | FluidNC/posix/Console.cpp | 101 | #ifdef B4000000 | COMMENT |
| LOW | FluidNC/posix/simulator_engine.cpp | 1 | // Simulator stepping engine - tracks motion and sends position updates via WebSocket | COMMENT |
| LOW | FluidNC/posix/Platform.h | 1 | #pragma once | COMMENT |
| LOW | FluidNC/rp2040/StepTimer.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/AsyncTCP.h | 1 | #pragma once | COMMENT |
| LOW | FluidNC/rp2040/nvs.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/FreeRTOS_Compat.cpp | 1 | // FreeRTOS compatibility for RP2040 | COMMENT |
| LOW | FluidNC/rp2040/WifiImpl.cpp | 1 | #ifdef PICO_RP2350 | COMMENT |
| LOW | FluidNC/rp2040/tud_cdc_line_coding_wrapper.cpp | 1 | /* | COMMENT |
| LOW | FluidNC/rp2040/tud_cdc_line_coding_wrapper.cpp | 41 | #endif | COMMENT |
| LOW | FluidNC/rp2040/littlefs.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/localfs.cpp | 1 | // Copyright 2025 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/ws2812.h | 1 | // --------- // | COMMENT |
| LOW | FluidNC/rp2040/gpio.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/pio_engine_delayed.cpp | 1 | // Copyright (c) 2024 - Mitch Bradley | COMMENT |
| LOW | FluidNC/rp2040/pio_engine_delayed.cpp | 161 | if (ticks) { | COMMENT |
| LOW | FluidNC/rp2040/spi.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/timed_engine.cpp | 1 | // Copyright (c) 2024 - Mitch Bradley | COMMENT |
| LOW | FluidNC/rp2040/StepTimer.h | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/rp2040.h | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/sdspi.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/uart.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/delay_usecs.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/Platform.h | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port - Platform Definition | COMMENT |
| LOW | FluidNC/rp2040/Platform.h | 21 | COMMENT | |
| LOW | FluidNC/rp2040/Platform.h | 41 | inline bool should_exit() { | COMMENT |
| LOW | FluidNC/rp2040/fnc_uart.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/VFS.cpp | 21 | COMMENT | |
| LOW | FluidNC/rp2040/pio_engine.cpp | 1 | // Copyright (c) 2024 - Mitch Bradley | COMMENT |
| LOW | FluidNC/rp2040/rp2040.cpp | 1 | // Copyright (c) 2024 - FluidNC RP2040 Port | COMMENT |
| LOW | FluidNC/rp2040/sys/statvfs.h | 1 | #pragma once | COMMENT |
| LOW | FluidNC/stdfs/std-path.cpp | 1 | // Class filesystem::path -*- C++ -*- | COMMENT |
| LOW | FluidNC/stdfs/std-dir.cpp | 1 | // Class filesystem::directory_entry etc. -*- C++ -*- | COMMENT |
| LOW | FluidNC/stdfs/std-dir.cpp | 21 | # define _GLIBCXX_USE_CXX11_ABI 1 | COMMENT |
| LOW | FluidNC/stdfs/ops-common.h | 1 | // Filesystem operation utilities -*- C++ -*- | COMMENT |
| LOW | FluidNC/stdfs/std-ops.cpp | 1 | // Filesystem operations -*- C++ -*- | COMMENT |
| LOW | FluidNC/stdfs/std-ops.cpp | 21 | # include "fluidnc_vfs_ops.h" | COMMENT |
| LOW | FluidNC/stdfs/std-ops.cpp | 41 | # include <sys/stat.h> // stat, utimensat, fchmodat | COMMENT |
| LOW | FluidNC/stdfs/dir-common.h | 1 | // Filesystem directory iterator utilities -*- C++ -*- | COMMENT |
| LOW | FluidNC/stdfs/dir-common.h | 21 | // a copy of the GCC Runtime Library Exception along with this program; | COMMENT |
| LOW | FluidNC/stdfs/include/bits/fs_path.h | 1 | // Class filesystem::path -*- C++ -*- | COMMENT |
| LOW | FluidNC/stdfs/include/bits/fs_path.h | 21 | // a copy of the GCC Runtime Library Exception along with this program; | COMMENT |
| LOW | FluidNC/stdfs/include/bits/fs_fwd.h | 1 | // Filesystem declarations -*- C++ -*- | COMMENT |
| LOW | FluidNC/stdfs/include/bits/fs_ops.h | 1 | // Filesystem operational functions -*- C++ -*- | COMMENT |
| 448 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | stack-trace-decoder.html | 282 | // ── State ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 299 | // ── Address extraction ───────────────────────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 335 | // ── Binary search in sorted symbol table ─────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 374 | // ── Decode ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 463 | // ── Load .addrinfo from GitHub release ───────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 515 | // ── Load local .addrinfo file ────────────────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 538 | // ── Load GitHub releases list ────────────────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 569 | // ── Helpers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | stack-trace-decoder.html | 595 | // ── Init ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | platformio.ini | 329 | # ========================================== | COMMENT |
| MEDIUM | platformio.ini | 331 | # ========================================== | COMMENT |
| MEDIUM | platformio.ini | 598 | # ========================================== | COMMENT |
| MEDIUM | platformio.ini | 600 | # ========================================== | COMMENT |
| MEDIUM | tools/build_config_docs.py | 370 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/build_config_docs.py | 375 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/gen_config_docs.py | 712 | except ValueError: | CODE |
| HIGH | tools/gen_config_docs.py | 716 | except ValueError: | CODE |
| HIGH | tools/gen_config_docs.py | 462 | except ValueError: | CODE |
| HIGH | tools/gen_config_docs.py | 600 | except ValueError: | CODE |
| HIGH | tools/stack_trace_decoder/generate_addrinfo.py | 93 | except FileNotFoundError: | CODE |
| HIGH | fluidterm/fluidterm.py | 30 | except: | CODE |
| HIGH | fluidterm/fluidterm.py | 514 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | generate_vcxproj.py | 132 | CODE | |
| LOW | tools/gen_config_docs.py | 138 | CODE | |
| LOW | tools/gen_config_docs.py | 468 | CODE | |
| LOW | tools/build_config_docs.py | 408 | CODE | |
| LOW | tools/build_config_docs.py | 511 | CODE | |
| LOW | tools/fluidnc_validate_core.py | 98 | CODE | |
| LOW | tools/fluidnc_validate_core.py | 242 | CODE | |
| LOW | tools/fluidnc_validate_core.py | 180 | CODE | |
| LOW | tools/testing/test_pin_numbers.py | 22 | CODE | |
| LOW | tools/stack_trace_decoder/server.py | 76 | CODE | |
| LOW | tools/stack_trace_decoder/generate_addrinfo.py | 30 | CODE | |
| LOW | tools/stack_trace_decoder/generate_addrinfo.py | 135 | CODE | |
| LOW | fixture_tests/tool/op_entries.py | 8 | CODE | |
| LOW | examples/http_command/http_command_server.py | 44 | CODE | |
| LOW | fluidterm/fluidterm.py | 1131 | CODE | |
| LOW | fluidterm/fluidterm.py | 628 | CODE | |
| LOW | fluidterm/fluidterm.py | 671 | CODE | |
| LOW | fluidterm/fluidterm.py | 718 | CODE | |
| LOW | fluidterm/fluidterm.py | 949 | CODE | |
| LOW | fluidterm/fluidterm.py | 202 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | coverage.py | 50 | # Step 1: Clean previous coverage data | COMMENT |
| LOW⚡ | coverage.py | 55 | # Step 2: Build and run tests | COMMENT |
| LOW⚡ | coverage.py | 61 | # Step 3: Generate coverage report | COMMENT |
| LOW⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 237 | # Step 1: Get all text symbols | COMMENT |
| LOW⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 244 | # Step 2: Get source info for all symbol addresses | COMMENT |
| LOW⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 253 | # Step 3: Build the addrinfo structure | COMMENT |
| LOW | tools/stack_trace_decoder/generate_addrinfo.py | 276 | # Step 4: Write output | COMMENT |
| LOW | FluidNC/src/GCode.cpp | 428 | // Step 0 - remove whitespace and comments and convert to upper case | COMMENT |
| LOW | FluidNC/src/Protocol.cpp | 633 | // NOTE: This function is called from the main loop, buffer sync, and mc_move_motors() only and executes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | build-release.py | 275 | print("Error: failed to generate config_items.yaml", file=sys.stderr) | CODE |
| LOW | tools/validate_fluidnc_config.py | 191 | except Exception as e: | CODE |
| LOW | tools/stack_trace_decoder/server.py | 125 | except Exception as exc: | CODE |
| MEDIUM | tools/stack_trace_decoder/generate_addrinfo.py | 107 | print(f"Error running nm: {result.stderr}", file=sys.stderr) | CODE |
| MEDIUM⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 216 | print(f"Error: ELF file not found: {elf_path}", file=sys.stderr) | CODE |
| MEDIUM⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 226 | print("Error: Could not find 'nm' tool. Install ESP toolchain or use --toolchain-prefix.", file=sys.stderr) | CODE |
| MEDIUM⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 229 | print("Error: Could not find 'addr2line' tool. Install ESP toolchain or use --toolchain-prefix.", file=sys.stder | CODE |
| LOW | FluidNC/wasm/pio_toolchain_wasm.py | 15 | except Exception: | CODE |
| LOW | fluidterm/fluidterm.py | 1043 | except Exception as e: | STRING |
| LOW | fluidterm/fluidterm.py | 1075 | except Exception as e: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | coverage.py | 50 | # Step 1: Clean previous coverage data | COMMENT |
| LOW⚡ | coverage.py | 55 | # Step 2: Build and run tests | COMMENT |
| LOW⚡ | coverage.py | 61 | # Step 3: Generate coverage report | COMMENT |
| LOW⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 237 | # Step 1: Get all text symbols | COMMENT |
| LOW⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 244 | # Step 2: Get source info for all symbol addresses | COMMENT |
| LOW⚡ | tools/stack_trace_decoder/generate_addrinfo.py | 253 | # Step 3: Build the addrinfo structure | COMMENT |
| LOW | tools/stack_trace_decoder/generate_addrinfo.py | 276 | # Step 4: Write output | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build-release.py | 9 | CODE | |
| LOW | build-release.py | 10 | CODE | |
| LOW | coverage.py | 20 | CODE | |
| LOW | git-version.py | 2 | CODE | |
| LOW | git-version.py | 2 | CODE | |
| LOW | tools/fluidnc_config_mcp_server.py | 71 | CODE | |
| LOW | tools/stack_trace_decoder/server.py | 2 | CODE | |
| LOW | tools/stack_trace_decoder/generate_addrinfo.py | 22 | CODE | |
| LOW | fixture_tests/tool/controller.py | 2 | CODE | |
| LOW | fluidterm/fluidterm.py | 10 | CODE | |
| LOW | fluidterm/fluidterm.py | 20 | CODE | |
| LOW | fluidterm/fluidterm.py | 27 | CODE | |
| LOW | embedded/build.py | 5 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/fluidnc_config_mcp_server.py | 156 | def validate_fluidnc_config_file(path: str, permissive: bool = False) -> dict: | CODE |
| LOW | tools/validate_fluidnc_config.py | 144 | def find_default_config_items(config_path: Path) -> Path: | CODE |
| LOW | examples/http_command/http_command_server.py | 185 | def handle_home_assistant_state(self, path): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | FluidNC/src/Planner.cpp | 377 | // from path, but used as a robust way to compute cornering speeds, as it takes into account the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | fluidterm/fluidterm.py | 5 | # This file is part of pySerial. https://github.com/pyserial/pyserial | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | platformio.ini | 716 | # Usage: | COMMENT |