Open-source e-reader firmware
This report summarizes scanner evidence for crosspoint-reader/crosspoint-reader, a C project with 8,593 GitHub stars. SynthScan examined 318,002 lines of code across 865 source files, recording 678 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 3.8 (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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 508 finding(s).
Are imports declared and package/API names verified? 85 finding(s).
Are wrappers, guards, and repeated structures necessary? 124 finding(s).
Which changes need focused human review? 678 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 678 distinct pattern matches across 17 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 |
|---|---|---|---|---|
| HIGH⚡ | test/test_trusted_time.py | 83 | if (live >= 1735689600LL + 86400 && live <= 4102444800LL - 86400) { | CODE |
| HIGH⚡ | test/test_trusted_time.py | 88 | if (after >= 1735689600LL && after <= 4102444800LL) { | CODE |
| HIGH⚡ | test/test_trusted_time.py | 89 | assert(storedFloor >= live && storedFloor <= after); | CODE |
| HIGH | test/test_trusted_time.py | 130 | assert(configurations == 1 && strcmp(getenv("TZ"), zone) == 0); | CODE |
| HIGH | test/test_trusted_time.py | 134 | assert(configurations == 2 && strcmp(getenv("TZ"), zone) == 0); | CODE |
| HIGH | test/test_ble_learning.py | 74 | assert(noPress.saved == -1 && noPress.learnAction == bleturner::Action::None); | CODE |
| HIGH⚡ | test/test_clipping_selection_text.py | 85 | if (packedText.empty()) return prefixSpace && i == 0 ? " " : text; | CODE |
| HIGH⚡ | test/test_clipping_selection_text.py | 94 | return prefixSpace && i == 0 ? Range{range.start, range.start + 1} : range; | CODE |
| HIGH⚡ | test/test_clipping_selection_text.py | 96 | bool wordStartsParagraph(uint16_t i) const { return paragraphStart && i == 0; } | CODE |
| HIGH | test/test_clipping_selection_text.py | 299 | assert(cold.wordCount == 360 && cold.words[359].pageOffset == 2); | CODE |
| HIGH | test/test_clipping_highlight_planes.py | 39 | assert(renderer.dots == (a4 && mode != GfxRenderer::BW ? 4u : 0u)); | CODE |
| HIGH | test/test_clipping_highlight_planes.py | 40 | assert(renderer.ditherRects == (a4 && mode != GfxRenderer::BW ? 0u : 1u)); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 257 | view.content.pages.capacity() == 0 && view.content.lines.capacity() == 0 && | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 262 | assert(view.lookup->depth == 1 && view.content.text == dictionary.entries.at(20)); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 266 | assert(view.finished && view.lookup->depth == 1); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 270 | assert(view.lookup->depth == 0 && view.content.text == dictionary.entries.at(10)); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 271 | assert(view.content.currentPage == 1 && view.content.selection.valid); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 272 | assert(view.content.selection.lastPage == 1 && view.content.selection.firstWord == 2); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 275 | assert(view.lookup->depth == 0 && view.content.currentPage == 1); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 285 | assert(!view.finished && view.lookup->depth == 0 && view.content.text == dictionary.entries.at(10)); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 293 | assert(view.lookup->depth == 0 && view.content.text == dictionary.entries.at(10) && view.content.currentPage == 1); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 394 | assert(!backView.finished && backView.lookup->depth == 1 && dictionary.reads == readsBeforeBack); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 398 | assert(!backView.finished && backView.lookup->depth == 0); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 400 | assert(backView.finished && backView.result.isCancelled && dictionary.reads == readsBeforeBack); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 403 | assert(parent.finished && parent.result.isCancelled); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 437 | assert(touchView.mappedInput.contactSuppressed && dictionary.reads == readsBeforeTouch); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 438 | assert(touchView.finished == onHeader && touchView.result.isCancelled == onHeader); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 439 | assert(bool(touchView.child) == (!onHeader && controlsEnabled)); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 519 | assert(result == Dictionary::LookupResult::LowMemory && dictionary.searches == 0); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 523 | assert(result == Dictionary::LookupResult::LowMemory && dictionary.searches == 0); | CODE |
| HIGH⚡ | test/test_recursive_dictionary.py | 526 | assert(result == Dictionary::LookupResult::NotFound && dictionary.searches > 1); | CODE |
| HIGH | test/test_recursive_dictionary.py | 54 | " if (lookup && mappedInput.wasReleased(MappedInputManager::Button::Confirm))", 1 | CODE |
| HIGH | test/test_recursive_dictionary.py | 309 | assert(view.lookup->depth == 16 && view.lookup->pendingWord.empty() && dictionary.reads == reads); | CODE |
| HIGH | test/test_recursive_dictionary.py | 312 | assert(view.lookup->depth == 0 && view.content.text == dictionary.entries.at(10) && view.content.currentPage == 1); | CODE |
| HIGH | test/test_recursive_dictionary.py | 334 | assert(view.lookup->depth == 1 && view.content.headword == "alias"); | CODE |
| HIGH | test/test_recursive_dictionary.py | 361 | assert(cjk.y == 10 && cjk.block->ranges[0].start == 8 && cjk.block->ranges[1].start == 11); | CODE |
| HIGH | test/test_recursive_dictionary.py | 422 | assert(root.finished && root.result.isCancelled); | CODE |
| HIGH | test/test_recursive_dictionary.py | 475 | bool isWordByte(unsigned char c) { return c >= 0x80 || std::isalnum(c) != 0; } | CODE |
| HIGH⚡ | test/test_selection_buttons.py | 68 | assert(activity.selected == 5 && activity.pendingButtonCount == 4); | CODE |
| HIGH⚡ | test/test_selection_buttons.py | 71 | assert(activity.selected == 7 && activity.confirmed == 7); | CODE |
| HIGH⚡ | test/test_selection_buttons.py | 74 | assert(activity.selected == 6 && activity.pendingButtonCount == 0); | CODE |
| HIGH | test/test_selection_buttons.py | 85 | assert(activity.selected == 9 && activity.pendingButtonCount == 0); | CODE |
| HIGH | test/test_selection_buttons.py | 96 | assert(activity.pendingButtonCount == 16 && overflows == 1); | CODE |
| HIGH | test/test_selection_buttons.py | 99 | assert(activity.selected == 23 && activity.pendingButtonCount == 0); | CODE |
| HIGH | test/test_selection_buttons.py | 130 | if (active && input.outsideTap) { active = false; update(); return true; } | CODE |
| HIGH | test/test_text_settings_layout.py | 190 | if (rect.y < clip.y || rect.bottom() > clip.bottom()) clippedText = true; | CODE |
| HIGH | test/test_text_settings_layout.py | 222 | assert(preview.x == safe.x && preview.width == safe.width); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 249 | assert(activity.renderer.preview.x == preview.x && activity.renderer.preview.y == preview.y); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 250 | assert(activity.renderer.preview.width == preview.width && activity.renderer.preview.height == preview.height); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 256 | assert(content.x == safe.x && content.width == safe.width); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 263 | assert(tab.x >= safe.x && tab.right() <= safe.x + safe.width); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 269 | assert(rect.x >= bandLeft && rect.right() <= bandRight); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 272 | return rect.x == bandLeft && rect.right() == bandRight && rect.height == std::max(1, metrics.headerUnderlineSize); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 285 | assert(rect.x >= safe.x && rect.right() <= safe.x + safe.width); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 286 | assert(rect.y >= content.y && rect.bottom() <= content.bottom()); | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 289 | return rect.width == theme.listScrollWidth && rect.x >= safe.x && rect.right() <= safe.x + safe.width && | CODE |
| HIGH⚡ | test/test_text_settings_layout.py | 290 | rect.y == content.y && rect.bottom() == content.bottom(); | CODE |
| HIGH | test/test_text_settings_layout.py | 383 | assert(rect.y >= content.y && rect.bottom() <= content.bottom()); | CODE |
| HIGH | test/test_text_settings_layout.py | 385 | assert(activity.nav.top <= selected - 1 && selected - 1 < activity.nav.top + 3); | CODE |
| HIGH⚡ | test/test_remote_button_input.py | 27 | bool wasPressed(uint8_t b) const { return b == button && pressed; } | CODE |
| 6 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | platformio.ini | 61 | # which batches into the SPI FIFO: ~3x on SD reads, at the cost of a 512-byte stack | COMMENT |
| LOW | test/test_trusted_time.py | 61 | #include <cassert> | COMMENT |
| LOW | test/test_clipping_selection_text.py | 41 | #include <algorithm> | COMMENT |
| LOW | test/test_recursive_dictionary.py | 61 | "[this](const ActivityResult& result)") | COMMENT |
| LOW | test/book_metadata_cache/BookMetadataCacheTest.cpp | 1 | #include <HalStorage.h> | COMMENT |
| LOW | test/minibidi_arabic/MiniBidiArabicTest.cpp | 1 | // MiniBidiArabicTest — Arabic/Farsi/Urdu bidi + contextual shaping. | COMMENT |
| LOW | test/ligature_guard/LigatureGuardTest.cpp | 1 | // LigatureGuardTest — font GSUB ligatures must not re-process Arabic text. | COMMENT |
| LOW | test/clipping_sync/ClippingSyncTest.cpp | 1 | #include <ArduinoJson.h> | COMMENT |
| LOW | test/differential_rounding/DifferentialRoundingTest.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | test/differential_rounding/DifferentialRoundingTest.cpp | 301 | EXPECT_EQ(testFont().getGlyph('x')->advanceX, 136); | COMMENT |
| LOW | …chapter_html_slim_parser/ChapterHtmlSlimParserTest.cpp | 1 | #include <Epub.h> | COMMENT |
| LOW | test/sd_card_font/SdCardFontTest.cpp | 1 | #include <HalStorage.h> | COMMENT |
| LOW | test/inflate_reader/InflateReaderTest.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | test/hyphenation_eval/HyphenationEvaluationTest.cpp | 1 | #include <Utf8.h> | COMMENT |
| LOW | …phenation_eval/resources/spanish_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …phenation_eval/resources/swedish_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …phenation_eval/resources/italian_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …nation_eval/resources/portuguese_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …phenation_eval/resources/english_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …phenation_eval/resources/russian_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …yphenation_eval/resources/german_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …yphenation_eval/resources/french_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | …yphenation_eval/resources/polish_hyphenation_tests.txt | 1 | # Hyphenation Test Data | COMMENT |
| LOW | scripts/s3_nimble_psram.h | 1 | // Boards with PSRAM (BOARD_HAS_PSRAM): NimBLE's host (mbuf and HCI pools, connection and GATT structures) allocated | COMMENT |
| LOW | lib/PngToBmpConverter/PngToBmpConverter.cpp | 1 | #include "PngToBmpConverter.h" | COMMENT |
| LOW | lib/GfxRenderer/Bitmap.cpp | 1 | #include "Bitmap.h" | COMMENT |
| LOW | lib/GfxRenderer/GfxRenderer.cpp | 1 | #include "GfxRenderer.h" | COMMENT |
| LOW | lib/GfxRenderer/GfxRenderer.cpp | 401 | COMMENT | |
| LOW | lib/GfxRenderer/GlyphBitmap.h | 81 | } | COMMENT |
| LOW | lib/GfxRenderer/GfxRenderer.h | 61 | uint32_t frameBufferSize = HalDisplay::BUFFER_SIZE; | COMMENT |
| LOW | lib/GfxRenderer/GfxRenderer.h | 101 | COMMENT | |
| LOW | lib/GfxRenderer/GfxRenderer.h | 241 | // which it cannot reach directly. | COMMENT |
| LOW | lib/GfxRenderer/GfxRenderer.h | 261 | // Compatibility queries for Overlay mode. | COMMENT |
| LOW | lib/GfxRenderer/GfxRenderer.h | 421 | bool storeBwBuffer(); // Returns true if buffer was stored successfully | COMMENT |
| LOW | lib/Memory/BuildScratch.h | 1 | #pragma once | COMMENT |
| LOW | lib/Memory/Memory.h | 1 | #pragma once | COMMENT |
| LOW | lib/Txt/Txt.cpp | 1 | #include "Txt.h" | COMMENT |
| LOW | lib/Utf8/Utf8.h | 1 | #pragma once | COMMENT |
| LOW | lib/Utf8/Utf8.h | 21 | // Report absorbed input codepoint positions when requested; return empty if the callback fails. | COMMENT |
| LOW | lib/hal/HalStorage.cpp | 1 | #include "HalStorage.h" | COMMENT |
| LOW | lib/hal/HalPowerManager.cpp | 1 | #include "HalPowerManager.h" | COMMENT |
| LOW | lib/hal/HalPowerManager.cpp | 81 | xSemaphoreGive(modeMutex); | COMMENT |
| LOW | lib/hal/HalPowerManager.cpp | 101 | // GPIO13 gates the battery MOSFET on both Xteink C3 boards; driving it low | COMMENT |
| LOW | lib/hal/HalPowerManager.cpp | 121 | // XTEINK_C3_GPIO13: it IS power.latch0 on the C3 Xteink boards, where the | COMMENT |
| LOW | lib/hal/HalDisplay.h | 81 | // Lend the framebuffer's ~48 KB STORAGE to a memory-hungry phase (chapter | COMMENT |
| LOW | lib/hal/HalPowerManager.h | 41 | // Setup wake up GPIO and enter deep sleep | COMMENT |
| LOW | lib/hal/HalSystem.cpp | 1 | #include "HalSystem.h" | COMMENT |
| LOW | lib/hal/HalClock.h | 41 | // Format the local time into a caller-provided buffer. | COMMENT |
| LOW | lib/hal/HalGPIO.h | 1 | #pragma once | COMMENT |
| LOW | lib/hal/HalGPIO.h | 21 | #define X3_I2C_SDA 20 | COMMENT |
| LOW | lib/hal/HalGPIO.cpp | 1 | #include <BatteryMonitor.h> | COMMENT |
| LOW | lib/hal/HalHaptics.h | 1 | #pragma once | COMMENT |
| LOW | lib/expat/internal.h | 81 | COMMENT | |
| LOW | lib/expat/internal.h | 101 | COMMENT | |
| LOW | lib/expat/internal.h | 121 | #endif | COMMENT |
| LOW | lib/expat/xmltok.h | 61 | */ | COMMENT |
| LOW | lib/expat/xmltok.h | 81 | /* The following tokens are returned only by XmlPrologTok */ | COMMENT |
| LOW | lib/expat/xmltok.h | 101 | #define XML_TOK_NAME_PLUS 32 /* name+ */ | COMMENT |
| LOW | lib/expat/xmltok.h | 121 | #define XML_TOK_IGNORE_SECT 42 | COMMENT |
| LOW | lib/expat/xmlparse.c | 81 | #endif | COMMENT |
| 337 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/generate_kerning_ligature_epub.py | 220 | # ── XHTML content pages ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 68 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 80 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 82 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 92 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 94 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 110 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 112 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 122 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 124 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 135 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 137 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 145 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | scripts/generate_br_section_break_epub.py | 147 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | scripts/generate_br_section_break_epub.py | 160 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | scripts/generate_br_section_break_epub.py | 162 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | scripts/generate_br_section_break_epub.py | 179 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | scripts/generate_br_section_break_epub.py | 181 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | scripts/gen_i18n.py | 49 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 51 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 118 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 120 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 260 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 262 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 311 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 313 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 447 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 449 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 750 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 752 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 869 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 871 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/gen_i18n.py | 433 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | scripts/gen_i18n.py | 435 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 49 | # ── Serif ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 194 | # ── Sans-serif ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 251 | # ── Monospace ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 275 | # ── Dyslexia ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 288 | # ── Accessibility ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 312 | # ── Hebrew ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 341 | # ── Arabic ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 381 | # ── Korean ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | lib/MiniBidi/minibidi.h | 53 | /* ── Bidi character classes (UAX #9) ────────────────────────────────── */ | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 19 | // ── RequestHandler interface ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 159 | // ── OPTIONS ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 171 | // ── PROPFIND ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 298 | // ── GET ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 352 | // ── HEAD ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 386 | // ── PUT ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 410 | // ── DELETE ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 462 | // ── MKCOL ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 502 | // ── MOVE ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 574 | // ── COPY ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 669 | // ── LOCK / UNLOCK (dummy for client compatibility) ─────────────────────────── | COMMENT |
| MEDIUM | src/network/WebDAVHandler.cpp | 699 | // ── Utility functions ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/network/html/FilesPage.html | 3944 | // ═══════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | src/network/html/FilesPage.html | 3946 | // ═══════════════════════════════════════════════════════════════════ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/test_patch_animatedgif.py | 35 | def test_active_environment_and_idempotence(self): | CODE |
| LOW | test/test_patch_animatedgif.py | 48 | def test_unknown_decoder_source_fails_without_rewriting_it(self): | CODE |
| LOW | test/test_patch_animatedgif.py | 55 | def test_missing_active_dependency_cannot_be_satisfied_by_sibling(self): | CODE |
| LOW⚡ | test/test_confirmation_translations.py | 12 | def test_spanish_questions_include_both_marks(self): | CODE |
| LOW⚡ | test/test_confirmation_translations.py | 19 | def test_all_locales_have_explicit_confirmation_headings(self): | CODE |
| LOW⚡ | test/test_confirmation_translations.py | 27 | def test_partial_locales_do_not_freeze_english_button_labels(self): | CODE |
| LOW⚡ | test/test_confirmation_translations.py | 34 | def test_persian_questions_use_native_punctuation(self): | CODE |
| LOW⚡ | test/test_confirmation_translations.py | 41 | def test_callers_use_complete_question_keys(self): | CODE |
| LOW | …ation_eval/resources/generate_hyphenation_test_data.py | 56 | def generate_hyphenation_data( | CODE |
| LOW | scripts/patch_sdfat.py | 96 | def patch_selected_dependency(env): | CODE |
| LOW | scripts/generate_test_epub.py | 97 | def create_grayscale_test_image(filename, is_png=True): | CODE |
| LOW | scripts/generate_test_epub.py | 151 | def create_centering_test_image(filename, is_png=True): | CODE |
| LOW | scripts/generate_test_epub.py | 198 | def create_scaling_test_image(filename, is_png=True): | CODE |
| LOW | scripts/generate_test_epub.py | 273 | def create_wide_scaling_test_image(filename, is_png=True): | CODE |
| LOW | scripts/generate_test_epub.py | 372 | def create_gradient_test_image(filename, is_png=True): | CODE |
| LOW | scripts/gen_i18n.py | 815 | def _append_string_data_entry(lines: List[str], text: str) -> None: | CODE |
| LOW | scripts/gen_i18n.py | 376 | def format_cpp_string_literal(segments: List[str], indent: str = " ") -> List[str]: | STRING |
| LOW | scripts/patch_arduino_ble_controller.py | 19 | def filter_flash_only_bt_linkflags(linkflags): | CODE |
| LOW | scripts/patch_animatedgif.py | 157 | def patch_animatedgif_before_link(source, target, env): | STRING |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 200 | def extract_ligature_glyph_indices_fonttools(font_path): | CODE |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 245 | def _extract_pairpos_subtable(subtable, glyph_to_cp, raw_kern): | CODE |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 300 | def extract_kerning_fonttools(font_path, codepoints, ppem): | CODE |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 453 | def extract_ligatures_fonttools(font_path, codepoints): | CODE |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 823 | def style_sections_total_size(sections): | CODE |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 830 | def generate_cpfont_multistyle(style_fonts, size, intervals, output_path, | CODE |
| LOW | lib/EpdFont/scripts/fontconvert.py | 422 | def _extract_pairpos_subtable(subtable, glyph_to_cp, raw_kern): | CODE |
| LOW | lib/EpdFont/scripts/fontconvert.py | 463 | def extract_kerning_fonttools(font_path, codepoints, ppem, pnum_subs=None): | CODE |
| LOW | lib/EpdFont/scripts/fontconvert.py | 624 | def extract_ligatures_fonttools(font_path, codepoints): | CODE |
| LOW | lib/EpdFont/scripts/verify_compression.py | 71 | def compact_aligned_to_packed(aligned_data, width, height): | CODE |
| LOW | src/network/html/SettingsPage.html | 350 | function isQuickResumeSleepScreenSelected() { | CODE |
| LOW | src/network/html/SettingsPage.html | 368 | function syncQuickResumeTimeoutForSleepScreen(sleepScreenChanged, quickResumeTimeoutChanged) { | CODE |
| LOW | src/network/html/FilesPage.html | 3056 | function startConversionWithImageStates() { | CODE |
| LOW | src/network/html/FilesPage.html | 3509 | function restoreUploadSettingsFromStorage() { | CODE |
| LOW | src/network/html/FilesPage.html | 3519 | function updateUploadSettingsPersistence() { | CODE |
| LOW | src/network/html/FilesPage.html | 4018 | function sanitizeMetadataFilenamePart(value) { | CODE |
| LOW | src/network/html/FilesPage.html | 4037 | async function getMetadataFilenameForEpub(file) { | CODE |
| LOW | src/network/html/FilesPage.html | 4084 | function reserveAvailableUploadFilename(fileName, usedFileNames) { | CODE |
| LOW | src/network/html/FilesPage.html | 4318 | function stripFontEncryptionEntries(xmlText, fontPaths) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/EpdFont/FontDecompressor.cpp | 267 | // Step 1: Collect unique glyph indices needed for this page | COMMENT |
| LOW | lib/EpdFont/FontDecompressor.cpp | 338 | // Step 2: Compute total buffer size and collect unique groups | COMMENT |
| LOW | lib/EpdFont/FontDecompressor.cpp | 366 | // Step 3: Allocate page buffer and lookup table for this slot | COMMENT |
| LOW | lib/EpdFont/FontDecompressor.cpp | 469 | // Step 4: For each unique group, decompress to temp buffer and extract needed glyphs | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 464 | // Step 1: mark used left/right classes and count the page's kerned codepoints. | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 480 | // Step 2: build renumber maps (oldClassId -> newClassId, 1-based) and | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 504 | // Step 3: size the three mini buffers (reused across pages when they fit; the | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 517 | // Step 4: populate mini class tables. `codepoints` is already sorted (see | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 535 | // Step 5: read the full matrix's rows for each used left class, keep only | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 991 | // Step 1: Extract unique codepoints from the UTF-8 texts (shared across all styles). | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4853 | // Step 1: Scale WIDTH to 800px (keep aspect ratio) | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4854 | // Step 2: Rotate 90° CW or CCW based on HANDEDNESS | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4855 | // Step 3: If WIDTH > 480, split vertically with overlap | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4858 | // Step 1: Scale WIDTH to 800 (this is the key difference!) | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4979 | // Step 1: Scale HEIGHT to 800px (up or down) | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4980 | // Step 2: If WIDTH > 480, split vertically with overlap | COMMENT |
| LOW | src/network/html/FilesPage.html | 4873 | // Step 2: Rotate 90° CW or CCW | COMMENT |
| LOW | src/network/html/FilesPage.html | 4898 | // Step 3: If WIDTH > 480, split vertically | COMMENT |
| LOW | src/network/html/FilesPage.html | 5069 | // Step 1: Rotate 90° based on handedness | COMMENT |
| LOW | src/network/html/FilesPage.html | 5091 | // Step 2: Scale to fit 480x800 (if needed) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/EpdFont/FontDecompressor.cpp | 267 | // Step 1: Collect unique glyph indices needed for this page | COMMENT |
| LOW | lib/EpdFont/FontDecompressor.cpp | 338 | // Step 2: Compute total buffer size and collect unique groups | COMMENT |
| LOW | lib/EpdFont/FontDecompressor.cpp | 366 | // Step 3: Allocate page buffer and lookup table for this slot | COMMENT |
| LOW | lib/EpdFont/FontDecompressor.cpp | 469 | // Step 4: For each unique group, decompress to temp buffer and extract needed glyphs | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 464 | // Step 1: mark used left/right classes and count the page's kerned codepoints. | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 480 | // Step 2: build renumber maps (oldClassId -> newClassId, 1-based) and | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 504 | // Step 3: size the three mini buffers (reused across pages when they fit; the | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 517 | // Step 4: populate mini class tables. `codepoints` is already sorted (see | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 535 | // Step 5: read the full matrix's rows for each used left class, keep only | COMMENT |
| LOW | lib/EpdFont/SdCardFont.cpp | 991 | // Step 1: Extract unique codepoints from the UTF-8 texts (shared across all styles). | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4853 | // Step 1: Scale WIDTH to 800px (keep aspect ratio) | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4854 | // Step 2: Rotate 90° CW or CCW based on HANDEDNESS | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4855 | // Step 3: If WIDTH > 480, split vertically with overlap | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4858 | // Step 1: Scale WIDTH to 800 (this is the key difference!) | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4979 | // Step 1: Scale HEIGHT to 800px (up or down) | COMMENT |
| LOW⚡ | src/network/html/FilesPage.html | 4980 | // Step 2: If WIDTH > 480, split vertically with overlap | COMMENT |
| LOW | src/network/html/FilesPage.html | 4873 | // Step 2: Rotate 90° CW or CCW | COMMENT |
| LOW | src/network/html/FilesPage.html | 4898 | // Step 3: If WIDTH > 480, split vertically | COMMENT |
| LOW | src/network/html/FilesPage.html | 5069 | // Step 1: Rotate 90° based on handedness | COMMENT |
| LOW | src/network/html/FilesPage.html | 5091 | // Step 2: Scale to fit 480x800 (if needed) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ation_eval/resources/generate_hyphenation_test_data.py | 36 | except Exception: | CODE |
| MEDIUM | …ation_eval/resources/generate_hyphenation_test_data.py | 105 | print(f"Error: Language '{language}' not found in pyphen.") | CODE |
| LOW | scripts/git_branch.py | 42 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | scripts/git_branch.py | 19 | def run_git_value(project_dir, args, label): | CODE |
| MEDIUM | scripts/gen_i18n.py | 900 | print(f"Error: Translations directory not found: {translations_dir}") | CODE |
| MEDIUM | scripts/gen_i18n.py | 904 | print(f"Error: Output directory not found: {output_dir}") | CODE |
| LOW | scripts/gen_i18n.py | 1015 | except Exception as e: | CODE |
| LOW | lib/EpdFont/scripts/build-sd-fonts.py | 81 | except Exception as e: # noqa: BLE001 - reported via RuntimeError below | CODE |
| LOW | lib/EpdFont/scripts/build-sd-fonts.py | 143 | except Exception: | CODE |
| LOW | lib/EpdFont/scripts/build-sd-fonts.py | 282 | except Exception as e: | CODE |
| LOW | lib/EpdFont/scripts/build-sd-fonts.py | 399 | except Exception as e: | CODE |
| MEDIUM | lib/EpdFont/scripts/fontconvert_sdcard.py | 110 | print(f"Error: unknown interval preset '{name}'", file=sys.stderr) | CODE |
| MEDIUM | lib/EpdFont/scripts/fontconvert_sdcard.py | 1008 | print("Error: --intervals is required (e.g., --intervals latin-ext,greek,cyrillic)", file=sys.stderr) | CODE |
| MEDIUM | lib/EpdFont/scripts/fontconvert_sdcard.py | 1020 | print("Error: --size or --sizes is required", file=sys.stderr) | CODE |
| MEDIUM | lib/EpdFont/scripts/fontconvert_sdcard.py | 1025 | print("Error: fontfile is required in single-style mode", file=sys.stderr) | CODE |
| MEDIUM | lib/EpdFont/scripts/fontconvert_sdcard.py | 1057 | print("Error: --output can only be used with a single size", file=sys.stderr) | CODE |
| MEDIUM | lib/EpdFont/scripts/fontconvert.py | 804 | print("Error: --compress requires --2bit (byte-aligned compression only supports 2-bit format)", file=sys.stderr) | CODE |
| MEDIUM | lib/EpdFont/scripts/fontconvert.py | 1006 | print(f"Error: {len(sparse_cols)} kern entries exceed the uint16 row-offset range", file=sys.stderr) | STRING |
| MEDIUM | lib/EpdFont/scripts/fontconvert.py | 1009 | print(f"Error: {kern_right_class_count} right classes exceed the uint8 column range", file=sys.stderr) | STRING |
| MEDIUM | lib/EpdFont/scripts/verify_compression.py | 243 | print(f"Error: {font_dir} is not a directory", file=sys.stderr) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ation_eval/resources/generate_hyphenation_test_data.py | 23 | CODE | |
| LOW | scripts/generate_test_bmps.py | 63 | CODE | |
| LOW | scripts/generate_test_bmps.py | 138 | CODE | |
| LOW | scripts/generate_test_bmps.py | 190 | CODE | |
| LOW | scripts/gen_i18n.py | 54 | CODE | |
| LOW | scripts/gen_i18n.py | 123 | CODE | |
| LOW | scripts/gen_i18n.py | 316 | CODE | |
| LOW | scripts/gen_i18n.py | 376 | CODE | |
| LOW | scripts/gen_i18n.py | 623 | CODE | |
| LOW | scripts/convert_icon.py | 35 | CODE | |
| LOW | scripts/debugging_monitor.py | 239 | CODE | |
| LOW | scripts/debugging_monitor.py | 454 | CODE | |
| LOW | lib/EpdFont/scripts/build-sd-fonts.py | 318 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 200 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 245 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 300 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 453 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 571 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 925 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert.py | 422 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert.py | 463 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert.py | 624 | CODE | |
| LOW | lib/EpdFont/scripts/verify_compression.py | 99 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/patch_arduino_ble_controller.py | 79 | except NameError: | CODE |
| HIGH | scripts/debugging_monitor.py | 342 | except KeyboardInterrupt: | CODE |
| HIGH | scripts/debugging_monitor.py | 527 | except (AttributeError, ValueError): | CODE |
| HIGH | scripts/debugging_monitor.py | 228 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …chapter_html_slim_parser/ChapterHtmlSlimParserTest.cpp | 1589 | "This is the second cell. It will probably overflow into the next page. Lorem ipsum dolor sit amet, consetetur " | CODE |
| LOW⚡ | …chapter_html_slim_parser/ChapterHtmlSlimParserTest.cpp | 1589 | "This is the second cell. It will probably overflow into the next page. Lorem ipsum dolor sit amet, consetetur " | CODE |
| LOW⚡ | …chapter_html_slim_parser/ChapterHtmlSlimParserTest.cpp | 1592 | "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " | CODE |
| LOW⚡ | …chapter_html_slim_parser/ChapterHtmlSlimParserTest.cpp | 1592 | "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " | CODE |
| LOW⚡ | …chapter_html_slim_parser/ChapterHtmlSlimParserTest.cpp | 1594 | "accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum " | CODE |
| LOW⚡ | …chapter_html_slim_parser/ChapterHtmlSlimParserTest.cpp | 1595 | "dolor sit amet."}; | CODE |
| LOW | scripts/generate_br_section_break_epub.py | 35 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " | CODE |
| LOW | scripts/generate_br_section_break_epub.py | 35 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " | CODE |
| LOW | scripts/generate_test_epub.py | 646 | <p>FIRST PARAGRAPH after image. This paragraph follows an empty heading and an image-only paragraph. With the bug presen | CODE |
| LOW | scripts/generate_test_epub.py | 646 | <p>FIRST PARAGRAPH after image. This paragraph follows an empty heading and an image-only paragraph. With the bug presen | CODE |
| LOW | scripts/generate_test_epub.py | 711 | <p>FIRST PARAGRAPH after image. This paragraph follows an empty heading and an image-only paragraph. With the bug presen | CODE |
| LOW | scripts/generate_test_epub.py | 711 | <p>FIRST PARAGRAPH after image. This paragraph follows an empty heading and an image-only paragraph. With the bug presen | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | test/epubs/generate_font_prewarm_benchmark.py | 0 | \ <?xml version="1.0" encoding="utf-8"?> <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container | STRING |
| HIGH | scripts/generate_test_epub.py | 0 | \ <?xml version="1.0" encoding="utf-8"?> <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container | STRING |
| HIGH | scripts/generate_kerning_ligature_epub.py | 0 | \ <?xml version="1.0" encoding="utf-8"?> <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/contributing/architecture.md | 213 | ## Scope guardrails | COMMENT |
| MEDIUM | scripts/generate_kerning_ligature_epub.py | 291 | double-f ligatures? ‘Affixed,’ ‘baffled,’ ‘scaffolding,’ | CODE |
| MEDIUM | src/activities/reader/EpubReaderBookmarksActivity.h | 13 | // The list rides the UiListActivity scaffold (themed rows, touch routing); | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/test_recursive_dictionary.py | 50 | # The harness copies every constant but only some methods; clang's -Wall flags the unused ones. | COMMENT |
| MEDIUM | test/test_remote_button_input.py | 165 | cpp.write_text("#include <initializer_list>\n" + harness) | STRING |
| MEDIUM⚡ | test/test_list_viewport.py | 65 | cpp.write_text("#include <initializer_list>\n" + harness) | STRING |
| MEDIUM | lib/hal/HalDisplay.h | 31 | // Pass seamless=true on any path where the panel already shows the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/generate-font-manifest.py | 19 | CODE | |
| LOW | scripts/generate-font-manifest.py | 23 | CODE | |
| LOW | scripts/generate_hyphenation_trie.py | 4 | CODE | |
| LOW | scripts/generate_test_epub.py | 13 | CODE | |
| LOW | scripts/debugging_monitor.py | 26 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert_sdcard.py | 25 | CODE | |
| LOW | lib/EpdFont/scripts/fontconvert.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | lib/EpdFont/scripts/sd-fonts.yaml | 3 | # This file is the single source of truth for which fonts are generated, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/EpdFont/scripts/verify_compression.py | 104 | # Check if this is a compressed font (has Groups array) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/firmware_size_history.py | 49 | CODE |