:star2: Wiki of OI / ICPC for everyone. (某大型游戏线上攻略,内含炫酷算术魔法)
This report summarizes scanner evidence for OI-wiki/OI-wiki, a TypeScript project with 27,071 GitHub stars. SynthScan examined 174,771 lines of code across 1096 source files, recording 143 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.0 (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? 130 finding(s).
Are imports declared and package/API names verified? 9 finding(s).
Are wrappers, guards, and repeated structures necessary? 74 finding(s).
Which changes need focused human review? 143 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 143 distinct pattern matches across 10 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⚡ | test/test_linter_patch.py | 34 | def test_preprocess_applies_indentation_fixes(self): | CODE |
| LOW⚡ | test/test_linter_patch.py | 44 | def test_postprocess_applies_fullstop_fixes(self): | CODE |
| LOW⚡ | test/test_linter_patch.py | 54 | def test_file_unchanged_when_no_fixes_needed(self): | CODE |
| LOW⚡ | test/test_linter_patch.py | 63 | def test_file_not_found_raises_error(self): | CODE |
| LOW | test/test_linter_patch.py | 77 | def test_skip_blocks_preserved(self): | CODE |
| LOW | test/linter/test_utils.py | 14 | def test_finds_first_different_element(self): | CODE |
| LOW | test/linter/test_utils.py | 27 | def test_raises_stop_iteration_when_not_found(self): | CODE |
| LOW⚡ | test/linter/test_utils.py | 44 | def test_logs_when_runner_debug_set(self, mock_print): | CODE |
| LOW⚡ | test/linter/test_utils.py | 51 | def test_silent_when_runner_debug_not_set(self, mock_print): | CODE |
| LOW⚡ | test/linter/test_utils.py | 58 | def test_non_debug_types_print_without_runner_debug(self, mock_print): | CODE |
| LOW⚡ | test/linter/test_utils.py | 94 | def test_grouping_with_runner_debug(self, mock_print): | CODE |
| LOW⚡ | test/linter/test_utils.py | 104 | def test_grouping_without_runner_debug_disabled(self, mock_print): | CODE |
| LOW⚡ | test/linter/test_utils.py | 113 | def test_grouping_force_enabled(self, mock_print): | CODE |
| LOW⚡ | test/linter/test_utils.py | 122 | def test_grouping_does_not_suppress_exceptions(self): | CODE |
| LOW | test/linter/test_decorators.py | 22 | def test_content_gets_trailing_newline(self): | CODE |
| LOW | test/linter/test_decorators.py | 31 | def test_tabs_replaced_with_spaces(self): | CODE |
| LOW | test/linter/test_decorators.py | 83 | def test_tabs_in_skip_blocks_preserved(self): | CODE |
| LOW⚡ | test/linter/test_decorators.py | 102 | def test_unclosed_skip_block_raises_error(self): | CODE |
| LOW⚡ | test/linter/test_decorators.py | 110 | def test_unopened_skip_block_raises_error(self): | CODE |
| LOW⚡ | test/linter/test_decorators.py | 118 | def test_content_modification_preserved(self): | CODE |
| LOW⚡ | test/linter/test_decorators.py | 127 | def test_skip_block_content_not_modified(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 277 | def test_curly_apostrophe_between_ascii_unchanged(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 283 | def test_left_single_as_apostrophe_between_ascii(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 289 | def test_left_single_with_space_not_apostrophe(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 295 | def test_left_single_at_line_end_converted_to_right(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 301 | def test_apostrophe_when_only_spaces_to_right_triggers_except(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 307 | def test_apostrophe_after_digit(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 435 | def test_single_quotes_after_non_alpha_ascii_not_apostrophe(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 441 | def test_single_quotes_after_non_alpha_ascii_is_apostrophe(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 447 | def test_deeply_nested_mixed_quotes(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 453 | def test_crossed_nested_mixed_quotes(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 458 | def test_extra_left_double_treated_as_right(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 464 | def test_extra_left_single_treated_as_right(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 470 | def test_extra_right_double_treated_as_left(self): | CODE |
| LOW⚡ | test/linter/test_postprocess.py | 476 | def test_extra_right_single_treated_as_left(self): | CODE |
| LOW | test/linter/test_postprocess.py | 8 | def test_replaces_chinese_fullstop(self): | CODE |
| LOW | test/linter/test_postprocess.py | 38 | def test_skip_block_content_not_modified(self): | CODE |
| LOW | test/linter/test_postprocess.py | 89 | def test_mixed_content_with_skip_blocks(self): | CODE |
| LOW | test/linter/test_postprocess.py | 121 | def test_replaces_left_double_quote(self): | CODE |
| LOW | test/linter/test_postprocess.py | 127 | def test_replaces_right_double_quote(self): | CODE |
| LOW | test/linter/test_postprocess.py | 139 | def test_mixed_quotes_in_sentence(self): | CODE |
| LOW | test/linter/test_postprocess.py | 163 | def test_quotes_in_code_block(self): | CODE |
| LOW | test/linter/test_postprocess.py | 176 | def test_skip_block_content_not_modified(self): | CODE |
| LOW | test/linter/test_postprocess.py | 227 | def test_mixed_content_with_skip_blocks(self): | CODE |
| LOW | test/linter/test_postprocess.py | 255 | def test_single_right_double_on_line_treated_as_left(self): | CODE |
| LOW | test/linter/test_postprocess.py | 260 | def test_single_right_single_on_line_treated_as_left(self): | CODE |
| LOW | test/linter/test_postprocess.py | 319 | def test_apostrophe_after_non_ascii_letter(self): | CODE |
| LOW | test/linter/test_postprocess.py | 325 | def test_cjk_prev_char_not_apostrophe(self): | CODE |
| LOW | test/linter/test_postprocess.py | 355 | def test_leading_curly_apostrophe(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 11 | def test_multiple_skip_block_types_in_sequence(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 55 | def test_interleaved_skip_blocks(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 99 | def test_nested_different_skip_block_types(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 143 | def test_all_three_skip_block_types(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 218 | def test_single_quotes_with_skip_blocks(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 238 | def test_mixed_quotes_with_skip_blocks(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 258 | def test_adjacent_different_skip_blocks(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 293 | def test_complex_real_world_markdown(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 396 | def test_empty_skip_blocks_different_types(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 426 | def test_same_content_multiple_skip_types(self): | CODE |
| LOW | test/linter/test_skipblocks.py | 470 | def test_deeply_nested_multiple_types_skip_blocks(self): | CODE |
| 10 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 41 | pip install uv | COMMENT |
| LOW | docs/misc/code/fsm/fsm_1.cpp | 1 | #include "dfa.hpp" | COMMENT |
| LOW | docs/tools/editor/xcode.md | 121 | COMMENT | |
| LOW | docs/tools/editor/xcode.md | 141 | COMMENT | |
| LOW | docs/tools/editor/xcode.md | 161 | #include <cwchar> | COMMENT |
| LOW | docs/tools/editor/xcode.md | 181 | #include <complex> | COMMENT |
| LOW | docs/tools/editor/xcode.md | 201 | #include <set> | COMMENT |
| LOW | docs/tools/editor/xcode.md | 221 | #include <mutex> | COMMENT |
| LOW | docs/tools/editor/xcode.md | 241 | #include <charconv> | COMMENT |
| LOW | docs/ds/sbt.md | 241 | node = nullptr; | COMMENT |
| LOW | docs/ds/sbt.md | 261 | node = node->right; | COMMENT |
| LOW | docs/ds/sbt.md | 281 | // Step 2. swap S and N | COMMENT |
| LOW | docs/ds/code/avl-tree/AvlTreeMap.hpp | 641 | // Left-Right Case | COMMENT |
| LOW | docs/ds/code/avl-tree/AvlTreeMap.hpp | 661 | // A | COMMENT |
| LOW | docs/ds/code/avl-tree/AvlTreeMap.hpp | 801 | if (node->isLeaf()) { | COMMENT |
| LOW | docs/ds/code/avl-tree/AvlTreeMap.hpp | 841 | // clang-format off | COMMENT |
| LOW | docs/ds/code/rbtree/rbtree.hpp | 301 | // --8<-- [end:insert-fixup1] | COMMENT |
| LOW | docs/ds/code/rbtree/rbtree.hpp | 321 | // --8<-- [start:insert-case2] | COMMENT |
| LOW | docs/ds/code/rbtree/rbtree.hpp | 381 | // |n| [s] ==> [p] d | COMMENT |
| LOW | docs/ds/code/rbtree/rbtree.hpp | 401 | // p will be colored black in the end | COMMENT |
| LOW | docs/ds/code/rbtree/rbtree.hpp | 421 | } | COMMENT |
| LOW | docs/ds/code/rbtree/rbtree.hpp | 441 | // Post process: see case 2 & case 4 | COMMENT |
| LOW | docs/ds/code/size-balanced-tree/SizeBalancedTreeMap.hpp | 681 | COMMENT | |
| LOW | docs/ds/code/size-balanced-tree/SizeBalancedTreeMap.hpp | 841 | // / L | COMMENT |
| LOW | docs/ds/code/size-balanced-tree/SizeBalancedTreeMap.hpp | 861 | // L R L | COMMENT |
| LOW | docs/graph/code/dsu-on-tree/dsu-on-tree_1.cpp | 1 | #include <cstdio> | COMMENT |
| LOW | docs/graph/code/dsu-on-tree/dsu-on-tree_2.cpp | 1 | #include <cstdio> | COMMENT |
| LOW | docs/basic/code/quick-sort/quick-sort_3.cpp | 1 | #include <algorithm> | COMMENT |
| LOW | docs/basic/code/quick-sort/quick-sort_4.cpp | 1 | #include <algorithm> | COMMENT |
| LOW | docs/math/code/bit/bit_2.cpp | 41 | COMMENT | |
| LOW | docs/math/code/impartial-game/impartial-game-3.cpp | 21 | COMMENT | |
| LOW | docs/math/code/prime-counting/lmo-offline.cpp | 1 | #include <algorithm> | COMMENT |
| LOW | docs/math/code/prime-counting/lucy-opt.cpp | 1 | #include <algorithm> | COMMENT |
| LOW | docs/math/code/prime-counting/lmo-online.cpp | 1 | #include <algorithm> | COMMENT |
| LOW | docs/math/code/prime-counting/lucy.cpp | 1 | #include <cmath> | COMMENT |
| LOW | docs/math/code/simplex/simplex_2.cpp | 1 | // Verified by https://uoj.ac/submission/779760 | COMMENT |
| LOW | docs/math/code/simplex/simplex_0.cpp | 1 | // --8<-- [start:full-text] | COMMENT |
| LOW | docs/math/code/mod-arithmetic/i32-mul.cpp | 1 | #include <cstdint> | COMMENT |
| LOW | docs/math/code/mod-arithmetic/i64-mul.cpp | 1 | #include <cfloat> | COMMENT |
| LOW | docs/contest/interaction.md | 301 | ```cpp | COMMENT |
| LOW | docs/contest/code/io/io_2.cpp | 1 | #include <cctype> | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/graph/flow/images/max-flow-push-relabel.py | 135 | if not network.push(u): | CODE |
| HIGH | docs/graph/flow/images/max-flow-push-relabel.py | 175 | network.push(u) | CODE |
| HIGH | scripts/ub-check.py | 169 | sanitizers=[("-fsanitize=undefined,address", ".UBSAN-ASAN")], | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/graph/flow/images/max-flow-push-relabel.py | 281 | CODE | |
| LOW | docs/graph/flow/images/max-flow-push-relabel.py | 77 | CODE | |
| LOW | docs/math/code/continued-fraction/sum-floor-axbc.py | 24 | CODE | |
| LOW | docs/math/code/continued-fraction/gcj-2019.py | 67 | CODE | |
| LOW | docs/math/code/continued-fraction/closest-dio.py | 25 | CODE | |
| LOW | docs/geometry/images/andrew.py | 53 | CODE | |
| LOW | docs/geometry/images/andrew.py | 254 | CODE | |
| LOW | scripts/ub-check.py | 69 | CODE | |
| LOW | scripts/get_files_to_test.py | 8 | CODE | |
| LOW | scripts/linter/decorators.py | 130 | CODE | |
| LOW | scripts/linter/decorators.py | 148 | CODE | |
| LOW | scripts/utils/find_jk.py | 41 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/math/code/continued-fraction/gcj-2019.py | 30 | # Check if a is smaller than b. | COMMENT |
| LOW | docs/math/code/continued-fraction/inner-point.py | 30 | # Check if a is smaller than b. | COMMENT |
| LOW | docs/math/code/continued-fraction/compare.py | 11 | # Check if a is smaller than b. | COMMENT |
| LOW | docs/math/code/mobius/mobius-func-1.py | 8 | # Check if square-free | COMMENT |
| LOW | scripts/linter/decorators.py | 152 | # Read file content | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/math/images/linear-programming.py | 2 | CODE | |
| LOW | docs/math/number-theory/images/dirichlet-hyperbola.py | 2 | CODE | |
| LOW | docs/math/number-theory/images/sqrt-decomposition.py | 2 | CODE | |
| LOW | docs/math/linear-algebra/images/basis.py | 2 | CODE | |
| LOW | docs/math/linear-algebra/images/basis.py | 4 | CODE | |
| LOW | docs/string/images/ac-automaton.py | 14 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/geometry/images/andrew.py | 387 | except AttributeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/linter/utils.py | 9 | Find the index of the first element in an iterable that is not equal to the given value. Args: l: The | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/linter_patch.py | 135 | except Exception as e: | CODE |
| MEDIUM | scripts/linter_patch.py | 136 | print(f"Error processing {file}: {str(e)}") | CODE |
| LOW | scripts/linter/decorators.py | 169 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/math/code/continued-fraction/flt-presum.cpp | 8 | // FLTs. Essentially 2x2 matrix. | COMMENT |