Log file navigator
This report summarizes scanner evidence for tstack/lnav, a C++ project with 10,775 GitHub stars. SynthScan examined 277,230 lines of code across 693 source files, recording 829 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 3.1 (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? 774 finding(s).
Are imports declared and package/API names verified? 21 finding(s).
Are wrappers, guards, and repeated structures necessary? 39 finding(s).
Which changes need focused human review? 829 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 829 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 |
|---|---|---|---|---|
| LOW | tools/bin2c.c | 1 | // bin2c.c | COMMENT |
| LOW | test/test_metric_log.sh | 241 | # Negative: an unterminated quote on the header line is captured by | COMMENT |
| LOW | test/test_tabular_format.sh | 101 | -c ";SELECT log_line, log_thread_id, log_duration, log_src_file, log_src_line FROM all_logs ORDER BY log_line" \ | COMMENT |
| LOW | test/parser_debugger.py | 1 | #! /usr/bin/env python3 | COMMENT |
| LOW | docs/_config.yml | 1 | # Welcome to Jekyll! | COMMENT |
| LOW | docs/_config.yml | 41 | syntax_highlighter: rouge | COMMENT |
| LOW | docs/_config.yml | 61 | # - Gemfile.lock | COMMENT |
| LOW | docs/screenshots/generate.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docs/source/conf.py | 1 | # -*- coding: utf-8 -*- | COMMENT |
| LOW | docs/source/conf.py | 241 | # The suffix of source filenames. | COMMENT |
| LOW | docs/source/conf.py | 261 | release = '0.15.0' | COMMENT |
| LOW | docs/source/conf.py | 281 | # add_function_parentheses = True | COMMENT |
| LOW | docs/source/conf.py | 301 | html_theme = 'furo' | COMMENT |
| LOW | docs/source/conf.py | 321 | # html_logo = None | COMMENT |
| LOW | docs/source/conf.py | 341 | # ], | COMMENT |
| LOW | docs/source/conf.py | 361 | COMMENT | |
| LOW | docs/source/conf.py | 401 | # Grouping the document tree into LaTeX files. List of tuples | COMMENT |
| LOW | example-scripts/log_to_csv.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | src/tailer/tailer.main.c | 21 | * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY | COMMENT |
| LOW | src/tailer/tailer.main.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | src/spookyhash/SpookyV2.h | 1 | // | COMMENT |
| LOW | src/spookyhash/SpookyV2.h | 21 | // Google's CityHash has similar specs to SpookyHash, and CityHash is faster | COMMENT |
| LOW | src/spookyhash/SpookyV2.h | 41 | # define INLINE inline | COMMENT |
| LOW | src/spookyhash/SpookyV2.h | 121 | // Final: compute the hash for the current SpookyHash state | COMMENT |
| LOW | src/spookyhash/SpookyV2.h | 141 | // | COMMENT |
| LOW | src/spookyhash/SpookyV2.h | 181 | s1 ^= s9; s10 ^= s11; s11 = Rot64(s11,46); s10 += s0; | COMMENT |
| LOW | src/spookyhash/SpookyV2.h | 241 | COMMENT | |
| LOW | src/spookyhash/SpookyV2.cpp | 1 | // Spooky Hash | COMMENT |
| LOW | src/fmtlib/fmt/ostream.h | 1 | // Formatting library for C++ - std::ostream support | COMMENT |
| LOW | src/fmtlib/fmt/ostream.h | 21 | #endif | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1 | // Formatting library for C++ - implementation | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 21 | # include <new> // std::bad_alloc | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 241 | // Precondition: n <= pow(10, N + 1). | COMMENT |
| LOW | src/fmtlib/fmt/ranges.h | 1 | // Formatting library for C++ - range and tuple support | COMMENT |
| LOW | src/fmtlib/fmt/xchar.h | 1 | // Formatting library for C++ - optional wchar_t and exotic character support | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 1 | // Formatting library for C++ - core API | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 1 | // Formatting library for C++ - chrono support | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 21 | #endif | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 221 | } // namespace safe_duration_cast | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 241 | COMMENT | |
| LOW | src/fmtlib/fmt/chrono.h | 541 | // Writes two-digit numbers a, b and c separated by sep to buf. | COMMENT |
| LOW | src/fmtlib/fmt/os.h | 1 | // Formatting library for C++ - optional OS-specific functionality | COMMENT |
| LOW | src/fmtlib/fmt/os.h | 21 | # endif | COMMENT |
| LOW | src/fmtlib/fmt/os.h | 41 | #ifndef FMT_POSIX | COMMENT |
| LOW | src/fmtlib/fmt/os.h | 281 | // Duplicates a file descriptor with the dup function and returns | COMMENT |
| LOW | src/fmtlib/fmt/color.h | 241 | // │23│─┘ | COMMENT |
| LOW | src/fmtlib/fmt/color.h | 261 | // │62│─┬── unused | COMMENT |
| LOW | src/fmtlib/fmt/args.h | 1 | // Formatting library for C++ - dynamic argument lists | COMMENT |
| LOW | src/fmtlib/fmt/printf.h | 1 | // Formatting library for C++ - legacy printf implementation | COMMENT |
| LOW | src/fmtlib/fmt/compile.h | 1 | // Formatting library for C++ - experimental format string compilation | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 41 | #include "base.h" | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 61 | # include <string> // std::string | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 81 | # define FMT_USE_NONTYPE_TEMPLATE_ARGS 0 | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 101 | // Use the provided definition. | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 121 | #endif | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 161 | COMMENT | |
| LOW | src/fmtlib/fmt/format.h | 181 | # define FMT_REDUCE_INT_INSTANTIATIONS 0 | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 201 | #endif | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 3341 | COMMENT | |
| LOW | src/fmtlib/fmt/format.h | 4401 | COMMENT | |
| 679 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | demo/loggen.py | 20 | except OSError: | CODE |
| HIGH | demo/loggen.py | 25 | except OSError: | CODE |
| HIGH | test/naughty_files.py | 18 | except OSError as e: | CODE |
| HIGH | release/loggen.py | 17 | except OSError: | CODE |
| HIGH | release/loggen.py | 22 | except OSError: | CODE |
| HIGH | release/loggen.py | 205 | except OSError: | CODE |
| HIGH | release/loggen2.py | 17 | except OSError: | CODE |
| HIGH | release/loggen2.py | 202 | except OSError: | CODE |
| HIGH | release/loggen2.py | 213 | except OSError: | CODE |
| HIGH | docs/screenshots/animate.py | 97 | except OSError: | CODE |
| HIGH | docs/screenshots/animate.py | 111 | except (ProcessLookupError, ChildProcessError): | CODE |
| HIGH | docs/screenshots/render.py | 238 | except OSError: | CODE |
| HIGH | docs/screenshots/render.py | 170 | except OSError: | CODE |
| HIGH | docs/screenshots/render.py | 252 | except ProcessLookupError: | CODE |
| HIGH | docs/screenshots/render.py | 256 | except (ChildProcessError, OSError): | CODE |
| HIGH | src/tailer/tailer.main.py | 152 | except OSError: | CODE |
| HIGH | src/tailer/tailer.main.py | 505 | except Exception: | CODE |
| HIGH | src/tailer/tailer.main.py | 591 | except OSError: | CODE |
| HIGH | src/tailer/tailer.main.py | 656 | except Exception: | CODE |
| HIGH | src/tailer/tailer.main.py | 782 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/fmtlib/fmt/format.h | 3383 | // Compilers are not aware of how to leverage the maximum value of | COMMENT |
| MEDIUM | src/third-party/parallel_hashmap/phmap_config.h | 354 | // are not defined as such in any file). To utilize the following | COMMENT |
| MEDIUM | src/third-party/md4c/md4c.c | 2522 | #define MD_MARK_OPENER 0x04 /* Definitely opener. */ | COMMENT |
| MEDIUM | src/third-party/md4c/md4c.c | 2523 | #define MD_MARK_CLOSER 0x08 /* Definitely closer. */ | COMMENT |
| MEDIUM | src/third-party/notcurses/include/notcurses/notcurses.h | 1890 | // Essentially, the kept material does not move. It serves to anchor the | COMMENT |
| MEDIUM | src/third-party/notcurses/src/lib/render.c | 716 | // we're also in that case working with hopefully more robust terminals. | COMMENT |
| MEDIUM | src/third-party/notcurses/src/lib/render.c | 752 | // we're also in that case working with hopefully more robust terminals. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | src/third-party/notcurses/include/notcurses/notcurses.h | 3927 | // ╭──────────────────────────╮ | COMMENT |
| MEDIUM⚡ | src/third-party/notcurses/include/notcurses/notcurses.h | 3929 | // ╭──────────────────────this is the secondary header──────╮ | COMMENT |
| MEDIUM⚡ | src/third-party/notcurses/include/notcurses/notcurses.h | 3938 | // ╰────────────────────────────────────here's the footer───╯ | COMMENT |
| MEDIUM | src/third-party/notcurses/include/notcurses/notcurses.h | 4010 | // ╭───────────────────╮ | COMMENT |
| MEDIUM | src/third-party/notcurses/include/notcurses/notcurses.h | 4025 | //╰────────────────────────press q to exit (there is sartrev("no exit"))─╯ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | demo/loggen.py | 8 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna | CODE |
| LOW | demo/loggen.py | 8 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna | CODE |
| LOW⚡ | test/textfile_0.md | 45 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliq | CODE |
| LOW⚡ | test/textfile_0.md | 45 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliq | CODE |
| LOW⚡ | test/textfile_0.md | 47 | <span style="white-space: nowrap">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidid | CODE |
| LOW⚡ | test/textfile_0.md | 47 | <span style="white-space: nowrap">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidid | CODE |
| LOW | release/loggen.py | 62 | PATH_COMPS = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolor | CODE |
| LOW | release/loggen.py | 62 | PATH_COMPS = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolor | CODE |
| LOW | release/loggen2.py | 57 | PATH_COMPS = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolor | CODE |
| LOW | release/loggen2.py | 57 | PATH_COMPS = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolor | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/parser_debugger.py | 31 | CODE | |
| LOW | release/loggen.py | 4 | CODE | |
| LOW | release/loggen2.py | 4 | CODE | |
| LOW | release/loggen2.py | 7 | CODE | |
| LOW | docs/screenshots/animate.py | 5 | CODE | |
| LOW | docs/screenshots/animate.py | 8 | CODE | |
| LOW | docs/screenshots/render.py | 12 | CODE | |
| LOW | docs/source/conf.py | 32 | CODE | |
| LOW | docs/source/conf.py | 32 | CODE | |
| LOW | docs/source/conf.py | 32 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/formats/java_log.json | 192 | "line": "[2022-06-01T13:37:36,371] WARN574240[Thread-35] - com.vmware.observability.observer.Observer.ex | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/log2src/python/log_example.py | 26 | except Exception: | CODE |
| LOW | docs/screenshots/render.py | 184 | except Exception as exc: | CODE |
| LOW | crashd/app.py | 130 | except Exception as e: | STRING |
| MEDIUM | crashd/app.py | 127 | def remove_zip(response): | CODE |
| LOW | src/tailer/tailer.main.py | 276 | except Exception as e: | CODE |
| LOW | src/tailer/tailer.main.py | 505 | except Exception: | CODE |
| LOW | src/tailer/tailer.main.py | 524 | except Exception as e: | CODE |
| LOW | src/tailer/tailer.main.py | 656 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/parser_debugger.py | 97 | CODE | |
| LOW | docs/screenshots/render.py | 342 | CODE | |
| LOW | docs/screenshots/render.py | 56 | CODE | |
| LOW | src/format2csv.py | 7 | CODE | |
| LOW | src/tailer/tailer.main.py | 97 | CODE | |
| LOW | src/tailer/tailer.main.py | 237 | CODE | |
| LOW | src/tailer/tailer.main.py | 508 | CODE | |
| LOW | src/tailer/tailer.main.py | 648 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/test_sql.sh | 782 | # Create a dummy database for the next couple of tests to consume. | COMMENT |
| MEDIUM | docs/source/conf.py | 6 | # This file is execfile()d with the current directory set to its containing dir. | COMMENT |
| MEDIUM | crashd/app.py | 116 | # Create a new zip file | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/fmtlib/fmt/format-inl.h | 1275 | // Step 1: integer promotion & Schubfach multiplier calculation. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1330 | // Step 2: Try larger divisor; remove trailing zeros if necessary. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1362 | // Step 3: Find the significand with the smaller divisor. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/fmtlib/fmt/format-inl.h | 1275 | // Step 1: integer promotion & Schubfach multiplier calculation. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1330 | // Step 2: Try larger divisor; remove trailing zeros if necessary. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1362 | // Step 3: Find the significand with the smaller divisor. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tailer/tailer.main.py | 184 | def set_client_path_state_error(self, cps: ClientPathState, op: str, error_msg: Optional[str]): | CODE |
| LOW | src/tailer/tailer.main.py | 508 | def handle_load_preview_request(self, path: str, preview_id: int): | CODE |
| LOW | src/tailer/tailer.main.py | 579 | def handle_complete_path_request(self, path: str): | CODE |
| LOW | src/static-files/assets/js/lnav-markdown-magic.js | 1 | function updateElementFromResponse(element, result) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | crashd/app.py | 49 | # Check if header 'lnav-secret' exists and has the correct value | STRING |
| LOW⚡ | crashd/app.py | 51 | # Check if content length is provided | STRING |
| LOW⚡ | crashd/app.py | 58 | # Check if content length is zero | STRING |
| LOW⚡ | crashd/app.py | 62 | # Check if content length exceeds 10MB | STRING |
| LOW | crashd/app.py | 105 | # Check if header 'lnav-secret' exists and has the correct value for downloading | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/screenshots/generate.sh | 15 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/screenshots/render.py | 506 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/source/_ext/lnavlexer.py | 2 | __all__ = ['LnavCommandLexer'] | CODE |