Tantivy is a full-text search engine library inspired by Apache Lucene and written in Rust
This report summarizes scanner evidence for quickwit-oss/tantivy, a Rust project with 16,367 GitHub stars. SynthScan examined 190,162 lines of code across 587 source files, recording 558 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 3.2 (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? 547 finding(s).
Are imports declared and package/API names verified? 10 finding(s).
Are wrappers, guards, and repeated structures necessary? 1 finding(s).
Which changes need focused human review? 558 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 558 distinct pattern matches across 7 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 | cliff.toml | 61 | COMMENT | |
| LOW | columnar/src/dynamic_column.rs | 321 | #[doc(hidden)] | COMMENT |
| LOW | columnar/src/lib.rs | 1 | //! # Tantivy-Columnar | COMMENT |
| LOW | columnar/src/value.rs | 101 | 1 => Ok(NumericalType::U64), | COMMENT |
| LOW | columnar/src/dictionary.rs | 21 | COMMENT | |
| LOW | columnar/src/columnar/merge/mod.rs | 61 | /// If several columns with the same name are conflicting with the numerical types in the | COMMENT |
| LOW | columnar/src/columnar/merge/tests.rs | 41 | let columnar2 = make_columnar("numbers", &[2u64]); | COMMENT |
| LOW | columnar/src/columnar/writer/mod.rs | 41 | /// | COMMENT |
| LOW | columnar/src/columnar/writer/mod.rs | 81 | /// Returns the list of doc ids from 0..num_docs sorted by the `sort_field` | COMMENT |
| LOW | columnar/src/column_index/multivalued_index.rs | 101 | } | COMMENT |
| LOW | columnar/src/column_index/multivalued_index.rs | 301 | /// Converts a list of ranks (row ids of values) in a 1:n index to the corresponding list of | COMMENT |
| LOW | columnar/src/column_index/mod.rs | 161 | // * doc_id_range.start and doc_id_range.end may not exist, but docids in | COMMENT |
| LOW | columnar/src/column_index/optional_index/mod.rs | 41 | pub fn num_bytes_in_block(&self) -> u32 { | COMMENT |
| LOW | columnar/src/column_index/optional_index/mod.rs | 61 | /// block] | COMMENT |
| LOW | …ar/src/column_index/optional_index/set_block/sparse.rs | 201 | } | COMMENT |
| LOW | columnar/src/column/plain/mod.rs | 1 | //! Plain-encoded `Str` and `Bytes` columns. | COMMENT |
| LOW | columnar/src/column/plain/block/onpair16_block.rs | 1 | //! Blocks compressed with OnPair16. | COMMENT |
| LOW | columnar/src/column/plain/block/onpair16_block.rs | 41 | /// Maximum dictionary budget, in bits: a dictionary has at most `2^MAX_CODE_BITS` tokens. | COMMENT |
| LOW | columnar/src/column/plain/block/raw_block.rs | 1 | //! Blocks storing their values as is. | COMMENT |
| LOW | columnar/src/column_values/monotonic_mapping.rs | 21 | /// | COMMENT |
| LOW | columnar/src/column_values/mod.rs | 41 | COMMENT | |
| LOW | columnar/src/column_values/mod.rs | 141 | if value_range.contains(&val) { | COMMENT |
| LOW | …values/u128_based/compact_space/build_compact_space.rs | 101 | let saved_bits = (amplitude_bits - amplitude_new_bits) as usize * total_num_values as usize; | COMMENT |
| LOW | …mnar/src/column_values/u128_based/compact_space/mod.rs | 1 | /// This codec takes a large number space (u128) and reduces it to a compact number space. | COMMENT |
| LOW | columnar/src/column_values/u64_based/line.rs | 41 | // This is outside of realm we handle. | COMMENT |
| LOW | columnar/src/column_values/u64_based/line.rs | 81 | return Line::default(); | COMMENT |
| LOW | columnar/src/column_values/u64_based/line.rs | 101 | // Without sorting our values, this is a difficult problem. | COMMENT |
| LOW | columnar/src/column_values/u64_based/mod.rs | 21 | use crate::iterable::Iterable; | COMMENT |
| LOW | sstable/src/block_match_automaton.rs | 41 | for kb in &start_key[0..common_prefix_len] { | COMMENT |
| LOW | sstable/src/block_match_automaton.rs | 61 | // e.* | | COMMENT |
| LOW | sstable/src/block_match_automaton.rs | 81 | // p | COMMENT |
| LOW | sstable/src/lib.rs | 1 | //! `tantivy_sstable` is a crate that provides a sorted string table data structure. | COMMENT |
| LOW | sstable/src/lib.rs | 21 | //! builder.insert(b"banana", &2).unwrap(); | COMMENT |
| LOW | sstable/src/lib.rs | 261 | /// Returns the last inserted key. | COMMENT |
| LOW | sstable/src/dictionary.rs | 21 | /// An SSTable is a sorted map that associates sorted `&[u8]` keys | COMMENT |
| LOW | sstable/src/dictionary.rs | 181 | COMMENT | |
| LOW | sstable/src/dictionary.rs | 401 | COMMENT | |
| LOW | sstable/src/index/v3.rs | 561 | max_slope_idx = index; | COMMENT |
| LOW | stacker/src/fastcmp.rs | 1 | /// fastcmp employs a trick to speed up the comparison of two slices of bytes. | COMMENT |
| LOW | stacker/src/arena_hashmap.rs | 1 | use super::{Addr, MemoryArena}; | COMMENT |
| LOW | stacker/src/arena_hashmap.rs | 61 | } | COMMENT |
| LOW | stacker/src/expull.rs | 1 | use std::mem; | COMMENT |
| LOW | stacker/src/expull.rs | 21 | /// It combines the idea of the unrolled linked list and tries to address the | COMMENT |
| LOW | stacker/src/shared_arena_hashmap.rs | 41 | fn is_empty(&self) -> bool { | COMMENT |
| LOW | stacker/src/shared_arena_hashmap.rs | 281 | let v = memory_arena.read(val_addr); | COMMENT |
| LOW | stacker/src/memory_arena.rs | 1 | //! 32-bits Memory arena for types implementing `Copy`. | COMMENT |
| LOW | stacker/src/memory_arena.rs | 21 | //! access them as references. | COMMENT |
| LOW | tokenizer-api/src/lib.rs | 1 | //! Tokenizer are in charge of chopping text into a stream of tokens | COMMENT |
| LOW | common/src/group_by.rs | 1 | use std::cell::RefCell; | COMMENT |
| LOW | common/src/key_tracking.rs | 1 | /// Initial capacity of the `Vec<u8>` key buffer, large enough for most keys. | COMMENT |
| LOW | common/src/lib.rs | 61 | /// in that order. | COMMENT |
| LOW | common/src/lib.rs | 81 | } | COMMENT |
| LOW | common/src/file_slice.rs | 281 | COMMENT | |
| LOW | common/src/datetime.rs | 21 | Milliseconds, | COMMENT |
| LOW | common/src/datetime.rs | 81 | } | COMMENT |
| LOW | common/src/bitset.rs | 161 | // `trailing_zeros` and the bit-clear in parallel instead of | COMMENT |
| LOW | examples/index_from_multiple_threads.rs | 1 | // # Indexing from different threads. | COMMENT |
| LOW | examples/iterating_docs_and_positions.rs | 1 | // # Iterating docs and positions. | COMMENT |
| LOW | examples/iterating_docs_and_positions.rs | 41 | // (Because we indexed a very small number of documents over one thread | COMMENT |
| LOW | examples/iterating_docs_and_positions.rs | 101 | // and the [`Postings`](https://docs.rs/tantivy/~0/tantivy/trait.Postings.html) trait | COMMENT |
| 450 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | .claude/skills/simple-pr/SKILL.md | 11 | ## Step 1: Check workspace state | COMMENT |
| LOW⚡ | .claude/skills/simple-pr/SKILL.md | 19 | ## Step 2: Ensure main is up to date | COMMENT |
| LOW⚡ | .claude/skills/simple-pr/SKILL.md | 25 | ## Step 3: Review staged changes | COMMENT |
| LOW⚡ | .claude/skills/simple-pr/SKILL.md | 31 | ## Step 4: Generate commit message | COMMENT |
| LOW⚡ | .claude/skills/simple-pr/SKILL.md | 37 | ## Step 5: Create a new branch | COMMENT |
| LOW⚡ | .claude/skills/simple-pr/SKILL.md | 45 | ## Step 6: Commit changes | COMMENT |
| LOW⚡ | .claude/skills/simple-pr/SKILL.md | 52 | ## Step 7: Push and open a PR | COMMENT |
| LOW⚡ | .claude/skills/rationalize-deps/SKILL.md | 18 | ## Step 1: Identify the target | COMMENT |
| LOW⚡ | .claude/skills/rationalize-deps/SKILL.md | 25 | ## Step 2: Analyze current dependencies | COMMENT |
| LOW⚡ | .claude/skills/rationalize-deps/SKILL.md | 33 | ## Step 3: For each candidate dependency | COMMENT |
| LOW | .claude/skills/rationalize-deps/SKILL.md | 76 | ## Step 4: Document findings | COMMENT |
| LOW | .claude/skills/rationalize-deps/SKILL.md | 84 | ## Step 5: Verify full build | COMMENT |
| LOW⚡ | .claude/skills/update-changelog/SKILL.md | 10 | ## Step 1: Determine the changelog scope | COMMENT |
| LOW⚡ | .claude/skills/update-changelog/SKILL.md | 16 | ## Step 2: Find merged PRs not yet in the changelog | COMMENT |
| LOW⚡ | .claude/skills/update-changelog/SKILL.md | 26 | ## Step 3: Consolidate related PRs | COMMENT |
| LOW | .claude/skills/update-changelog/SKILL.md | 38 | ## Step 4: Review the actual code diff | COMMENT |
| LOW | .claude/skills/update-changelog/SKILL.md | 49 | ## Step 5: Categorize each PR group | COMMENT |
| LOW | .claude/skills/update-changelog/SKILL.md | 61 | ## Step 6: Format entries | COMMENT |
| LOW⚡ | .claude/skills/update-changelog/SKILL.md | 75 | ## Step 7: Present changes to the user | COMMENT |
| LOW⚡ | .claude/skills/update-changelog/SKILL.md | 79 | ## Step 8: Update CHANGELOG.md | COMMENT |
| LOW⚡ | .claude/skills/update-changelog/SKILL.md | 85 | ## Step 9: Verify | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/snippet.rs | 22 | // # Defining the schema | COMMENT |
| MEDIUM | examples/json_field.rs | 13 | // # Defining the schema | COMMENT |
| MEDIUM | examples/index_from_multiple_threads.rs | 36 | // # Defining the schema | COMMENT |
| MEDIUM | examples/deleting_updating_documents.rs | 43 | // # Defining the schema | COMMENT |
| MEDIUM | examples/basic_search.rs | 26 | // # Defining the schema | COMMENT |
| MEDIUM | examples/ip_field.rs | 12 | // # Defining the schema | COMMENT |
| MEDIUM | examples/custom_collector.rs | 123 | // # Defining the schema | COMMENT |
| MEDIUM | examples/custom_tokenizer.rs | 1 | // # Defining a tokenizer pipeline | COMMENT |
| MEDIUM | examples/custom_tokenizer.rs | 12 | // # Defining the schema | COMMENT |
| MEDIUM | examples/fuzzy_search.rs | 25 | // # Defining the schema | COMMENT |
| MEDIUM | examples/date_time_field.rs | 11 | // # Defining the schema | COMMENT |
| MEDIUM | src/query/fuzzy_query.rs | 237 | // # Defining the schema | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/functional_test.rs | 132 | const LOREM: &str = "Doc Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod \ | CODE |
| LOW | src/functional_test.rs | 132 | const LOREM: &str = "Doc Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod \ | CODE |
| LOW | src/indexer/index_writer.rs | 858 | const LOREM: &str = "Doc Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do \ | CODE |
| LOW | src/indexer/index_writer.rs | 858 | const LOREM: &str = "Doc Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do \ | CODE |
| LOW | src/store/compression_lz4_block.rs | 121 | let input = b"lorem ipsum dolor sit amet ".repeat(100); | CODE |
| LOW | src/store/compression_lz4_block.rs | 121 | let input = b"lorem ipsum dolor sit amet ".repeat(100); | CODE |
| LOW | src/store/compression_lz4_block.rs | 134 | let input = b"lorem ipsum dolor sit amet ".repeat(100); | CODE |
| LOW | src/store/compression_lz4_block.rs | 134 | let input = b"lorem ipsum dolor sit amet ".repeat(100); | CODE |
| LOW | src/store/mod.rs | 70 | const LOREM: &str = "Doc Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do \ | CODE |
| LOW | src/store/mod.rs | 70 | const LOREM: &str = "Doc Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do \ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ggregation/bucket/term_agg/flattened_term_histogram.rs | 561 | // column's value count. (Essentially always true here: the column is full, so its | COMMENT |
| MEDIUM | src/schema/mod.rs | 101 | //! Some queries may leverage Fast fields when run on a field that is not indexed. This can be | COMMENT |
| MEDIUM | src/schema/text_options.rs | 185 | /// Essentially, should we store the term frequency and/or the positions (See | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/postings/recorder.rs | 408 | // ── TermFrequencyRecorder ───────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/query/phrase_query/phrase_scorer.rs | 625 | // So the cost estimation would be the number of times we need to check if a doc is a hit * | COMMENT |