{"results":[{"id":"autocomplete-blocklist-is-substring","text":"The blocklist filter removes results where any blocklisted term appears as a **substring** of the query, not just exact matches.","truth_value":"OUT","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"autocomplete-cache-consistency","text":"Every trie mutation (insert, increment, delete) immediately rebuilds `top_k_cache` for all ancestor nodes via `_update_caches_on_path`; caches are never stale between operations.","truth_value":"IN","justification_count":0,"dependent_count":2,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"autocomplete-decay-is-read-time","text":"Time decay is computed lazily at query time in `search_prefix` using `raw_freq * decay_factor^hours_elapsed`; raw frequencies stored in the trie are never modified by decay.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"autocomplete-delete-is-soft","text":"Deleting a query zeroes its frequency and unsets `is_end` but does not remove trie nodes from the tree structure — deleted queries leave structural residue.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"autocomplete-fuzzy-is-last-char-only","text":"`fuzzy_suggest()` only tries single-character edits (substitution, deletion, insertion) on the **last character** of the prefix — it is not a full edit-distance search.","truth_value":"OUT","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"autocomplete-normalize-at-boundary","text":"All public methods in `AutocompleteTrie` lowercase and truncate queries to 200 characters before any trie operation; internal methods assume normalized input.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"autocomplete-overfetch-compensates-for-filtering","text":"The autocomplete service overfetches results (`k + len(blocklist) * 2`) to compensate for blocklist removals, maintaining result count — but substring matching can remove far more results than the linear compensation formula anticipates.","truth_value":"IN","justification_count":1,"dependent_count":0,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"autocomplete-search-is-robust","text":"Autocomplete provides consistent, normalized search through boundary normalization (lowercasing, length truncation) and eagerly-rebuilt top-k caches, but fuzzy matching is limited to single-character edits on the last character only — meaning most mid-word typos produce zero results despite the system's otherwise thorough input handling.","truth_value":"IN","justification_count":1,"dependent_count":1,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"autocomplete-service-overfetches-for-blocklist","text":"`AutocompleteService` requests `k + len(blocklist) * 2` results from the trie to compensate for results that will be removed by blocklist filtering.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"autocomplete-trie-k-floor-is-10","text":"The `AutocompleteService` constructor forces `k=max(k, 10)` for the internal trie, even if the service default is smaller, to provide headroom for blocklist filtering.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"boundary-normalization-serves-defense-and-correctness","text":"Normalizing inputs once at system boundaries serves dual architectural purposes: it establishes the perimeter defense model that maintains internal data quality (enabling trusted internal callers), and it independently enables robust query behavior (autocomplete search operates on consistent normalized state with eagerly-rebuilt caches) — a single mechanism yielding both security and feature correctness.","truth_value":"IN","justification_count":1,"dependent_count":2,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"cost-model-adapts-to-access-frequency","text":"The read-heavy default cost model (reads bear increasing correctness burden as distribution complexity grows) is selectively overridden for high-read-frequency paths (autocomplete caches, leaderboard reindexing pre-compute at write time), creating an access-pattern-aware cost allocation rather than a uniform reads-pay policy.","truth_value":"IN","justification_count":1,"dependent_count":3,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"eager-rebuild-trades-write-cost-for-derived-consistency","text":"Autocomplete and leaderboard both eagerly rebuild derived data structures on every mutation rather than deferring recomputation, guaranteeing that derived state (top-k caches, sorted rankings) is always consistent at the cost of write-path performance.","truth_value":"IN","justification_count":1,"dependent_count":1,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"lazy-read-time-evaluation-trades-write-simplicity-for-read-cost","text":"Autocomplete (time decay), URL shortener (expiration), and payment (balance derivation) all defer computation to the read path, keeping writes simple and append-only at the cost of read-time complexity and latency.","truth_value":"IN","justification_count":1,"dependent_count":2,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"module-autonomy-enables-per-use-case-cost-optimization","text":"Module autonomy is the structural precondition for per-use-case cost optimization: because each module independently chooses its error conventions, eviction timing, and safety boundaries, it can also independently select the optimal write-read cost allocation for its specific access pattern — autocomplete and leaderboard pay at write time for read-heavy workloads, while payment and URL shortener defer to reads for write-heavy or low-frequency paths — without cross-cutting constraints imposing a uniform cost model.","truth_value":"OUT","justification_count":1,"dependent_count":0,"challenges":[],"last_reviewed":"2026-06-05T18:21:49","review_result":"pass","source_type":""},{"id":"normalize-once-at-system-boundary","text":"Autocomplete and web crawler both normalize inputs (query strings, URLs) exactly once at the system boundary, ensuring all internal operations work with canonical forms and preventing duplicate entries from case or format differences.","truth_value":"IN","justification_count":1,"dependent_count":2,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"soft-delete-preserves-structural-invariants","text":"Chat and autocomplete use soft delete to preserve structural invariants that physical deletion would break — sequence number contiguity and trie node connectivity — independently of the distributed-resurrection concern that motivates tombstones in replicated systems.","truth_value":"IN","justification_count":1,"dependent_count":1,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"write-cost-allocation-matches-access-pattern","text":"The codebase's default cost model pushes deferred costs to reads, but this default is selectively overridden: eagerly rebuilt derived state (such as autocomplete caches and leaderboard indexes) and lazily deferred computation (such as time decay, expiration, and balance derivation) coexist as deliberate per-use-case design choices, suggesting that access-pattern considerations influence where the cost boundary is placed.","truth_value":"IN","justification_count":1,"dependent_count":3,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"invalid","source_type":""},{"id":"write-read-cost-allocation-is-per-use-case","text":"The codebase demonstrates both strategies for derived state maintenance — eagerly rebuilding on every write (autocomplete caches, leaderboard reindexing) and lazily deferring computation to reads (time decay, expiration, balance derivation) — showing that write-vs-read cost allocation is a deliberate per-use-case design choice, not a single architectural pattern.","truth_value":"IN","justification_count":1,"dependent_count":2,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""}],"count":19,"limit":20,"offset":0}