Log file navigator
This report presents the forensic synthetic code analysis of tstack/lnav, a C++ project with 10,441 GitHub stars. SynthScan v2.0 examined 249,845 lines of code across 653 source files, recording 651 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 2.5 places this repository in the Likely human-written 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 651 distinct pattern matches across 16 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 | tools/bin2c.c | 1 | // bin2c.c | 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.14.1' | 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/format-inl.h | 1 | // Formatting library for C++ - implementation | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 201 | } div_small_pow10_infos[] = {{10, 16}, {100, 16}}; | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1281 | // 29711844 * 2^-82 | COMMENT |
| LOW | src/fmtlib/fmt/ranges.h | 1 | // Formatting library for C++ - experimental range 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++ - the core API for char/UTF-8 | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 21 | #define FMT_VERSION 100101 | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 41 | # define FMT_GCC_PRAGMA(arg) | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 61 | #ifdef _MSVC_LANG | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 81 | #else | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 101 | #endif | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 121 | # endif | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 141 | COMMENT | |
| LOW | src/fmtlib/fmt/core.h | 161 | # else | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 181 | COMMENT | |
| LOW | src/fmtlib/fmt/core.h | 201 | #ifndef FMT_API | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 221 | (!defined(__apple_build_version__) || \ | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 281 | // shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed | COMMENT |
| LOW | src/fmtlib/fmt/core.h | 2921 | #endif | COMMENT |
| LOW | src/fmtlib/fmt/locale.h | 1 | #include "xchar.h" | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 1 | // Formatting library for C++ - chrono support | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 21 | #include "format.h" | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 41 | #endif | COMMENT |
| LOW | src/fmtlib/fmt/chrono.h | 541 | a | (b << 24) | (static_cast<unsigned long long>(c) << 48); | COMMENT |
| LOW | src/fmtlib/fmt/os.h | 1 | // Formatting library for C++ - optional OS-specific functionality | COMMENT |
| LOW | src/fmtlib/fmt/os.h | 21 | COMMENT | |
| LOW | src/fmtlib/fmt/os.h | 41 | # define FMT_POSIX(call) _##call | 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/format.h | 41 | #include <memory> // std::uninitialized_copy | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 61 | #elif FMT_GCC_VERSION >= 700 && \ | COMMENT |
| LOW | src/fmtlib/fmt/format.h | 81 | COMMENT | |
| LOW | src/fmtlib/fmt/format.h | 101 | COMMENT | |
| 522 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | src/third-party/notcurses/include/notcurses/notcurses.h | 3921 | // ╭──────────────────────────╮ | COMMENT |
| MEDIUM⚡ | src/third-party/notcurses/include/notcurses/notcurses.h | 3923 | // ╭──────────────────────this is the secondary header──────╮ | COMMENT |
| MEDIUM⚡ | src/third-party/notcurses/include/notcurses/notcurses.h | 3932 | // ╰────────────────────────────────────here's the footer───╯ | COMMENT |
| MEDIUM | src/third-party/notcurses/include/notcurses/notcurses.h | 4004 | // ╭───────────────────╮ | COMMENT |
| MEDIUM | src/third-party/notcurses/include/notcurses/notcurses.h | 4019 | //╰────────────────────────press q to exit (there is sartrev("no exit"))─╯ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/fmtlib/fmt/format.h | 3503 | // Compilers are not aware of how to leverage the maximum value of | 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 |
|---|---|---|---|---|
| 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 | 259 | except Exception as e: | CODE |
| LOW | src/tailer/tailer.main.py | 483 | except Exception: | CODE |
| LOW | src/tailer/tailer.main.py | 502 | except Exception as e: | CODE |
| LOW | src/tailer/tailer.main.py | 634 | 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 | 220 | CODE | |
| LOW | src/tailer/tailer.main.py | 486 | CODE | |
| LOW | src/tailer/tailer.main.py | 626 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/test_sql.sh | 698 | # 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 | 1238 | // Step 1: integer promotion & Schubfach multiplier calculation. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1293 | // Step 2: Try larger divisor; remove trailing zeros if necessary. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1325 | // Step 3: Find the significand with the smaller divisor. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/fmtlib/fmt/format-inl.h | 1238 | // Step 1: integer promotion & Schubfach multiplier calculation. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1293 | // Step 2: Try larger divisor; remove trailing zeros if necessary. | COMMENT |
| LOW | src/fmtlib/fmt/format-inl.h | 1325 | // 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 | 486 | def handle_load_preview_request(self, path: str, preview_id: int): | CODE |
| LOW | src/tailer/tailer.main.py | 557 | 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 |