Unsupervised text tokenizer for Neural Network-based text generation.
This report summarizes scanner evidence for google/sentencepiece, a C++ project with 12,125 GitHub stars. SynthScan examined 40,095 lines of code across 96 source files, recording 367 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 16.7 (Elevated 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.
Can maintainers explain intent, assumptions, and trade-offs? 158 finding(s).
Are imports declared and package/API names verified? 6 finding(s).
Are wrappers, guards, and repeated structures necessary? 243 finding(s).
Which changes need focused human review? 367 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 367 distinct pattern matches across 13 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 |
|---|---|---|---|---|
| MEDIUM | CMakeLists.txt | 15 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 17 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 38 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 40 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 62 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 64 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 129 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 131 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 319 | # ============================================================================== | COMMENT |
| MEDIUM | CMakeLists.txt | 321 | # ============================================================================== | COMMENT |
| MEDIUM⚡ | CMakeLists.txt | 377 | # ============================================================================== | COMMENT |
| MEDIUM⚡ | CMakeLists.txt | 379 | # ============================================================================== | COMMENT |
| MEDIUM⚡ | CMakeLists.txt | 385 | # ============================================================================== | COMMENT |
| MEDIUM⚡ | CMakeLists.txt | 387 | # ============================================================================== | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 41 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 45 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 116 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 118 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 183 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 186 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 219 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 222 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 238 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 241 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 266 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 268 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 286 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 288 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 379 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 381 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 415 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | lite/CMakeLists.txt | 417 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1383 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1391 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1401 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1410 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1418 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1515 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1524 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1531 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1540 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1546 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1583 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1591 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1598 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1605 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1613 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1649 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1656 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1662 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1669 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1680 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1686 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1696 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1804 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1813 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1821 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1828 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1902 | # ================================================ | COMMENT |
| MEDIUM⚡ | data/Scripts.txt | 1911 | # ================================================ | COMMENT |
| 126 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CMakeLists.txt | 1 | # Copyright 2018 Google Inc. | COMMENT |
| LOW | python/README.md | 61 | # Encode text to pieces as bytes | COMMENT |
| LOW | python/README.md | 81 | # Output: | COMMENT |
| LOW | python/README.md | 101 | # ['▁', 'This', '▁', 'is', '▁a', '▁', 't', 'e', 'st'] | COMMENT |
| LOW | python/README.md | 121 | ids_np = np.array([284, 47, 11, 4, 15, 400], dtype=np.int32) | COMMENT |
| LOW | python/setup.py | 1 | #!/usr/bin/env python | COMMENT |
| LOW | python/tools/gen_stubs.py | 1 | #!/usr/bin/env python | COMMENT |
| LOW | python/test/gen_stubs_test.py | 1 | # Copyright 2024 Google Sepm. | COMMENT |
| LOW | python/test/sentencepiece_test.py | 1 | #!/usr/bin/python | COMMENT |
| LOW | lite/CMakeLists.txt | 1 | # Copyright 2026 Google Inc. | COMMENT |
| LOW | lite/amalgamate.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | lite/cached_sentencepiece_lite.h | 1 | // Copyright 2026 Google LLC | COMMENT |
| LOW | lite/cached_sentencepiece_lite.h | 21 | #include <memory> | COMMENT |
| LOW | lite/cached_sentencepiece_lite.h | 81 | // - kTiny (64 KB, 2,048 slots): Minimal memory footprint. Recommended for | COMMENT |
| LOW | lite/cached_sentencepiece_lite.h | 201 | // instance into the effective hashing seed (`cache.seed() ^ | COMMENT |
| LOW | lite/cached_sentencepiece_lite.h | 221 | // std::string_view text) { | COMMENT |
| LOW | lite/sentencepiece_lite.h | 1 | // Copyright 2026 Google LLC | COMMENT |
| LOW | lite/sentencepiece_lite.h | 21 | // normalization. | COMMENT |
| LOW | lite/sentencepiece_lite.h | 41 | // std::map). | COMMENT |
| LOW | lite/sentencepiece_lite.h | 201 | // - Unigram (--model_type=unigram): | COMMENT |
| LOW | lite/sentencepiece_model_converters.h | 1 | // Copyright 2026 Google LLC | COMMENT |
| LOW | lite/sentencepiece_model_converters.h | 21 | #include <string> | COMMENT |
| LOW | lite/sentencepiece_model_converters.h | 41 | // InvalidArgument error. | COMMENT |
| LOW | lite/sentencepiece_model_converters.h | 61 | // 1. Initialization / Load Time: | COMMENT |
| LOW | lite/sentencepiece_model_converters.h | 81 | // Raw Proto: 4.5 MB | Lite FB Heap: 9.6 MB | OSS Runtime Heap: 27.7 MB | COMMENT |
| LOW | lite/sentencepiece_model_converters.h | 101 | // // 3. Initialize processor. | COMMENT |
| LOW | third_party/rapidhash/rapidhash.h | 41 | */ | COMMENT |
| LOW | third_party/rapidhash/rapidhash.h | 61 | #endif | COMMENT |
| LOW | third_party/darts_clone/darts.h | 1 | #ifndef DARTS_H_ | COMMENT |
| LOW | third_party/darts_clone/darts.h | 101 | COMMENT | |
| LOW | third_party/darts_clone/darts.h | 141 | // member variables with 0 and NULLs. | COMMENT |
| LOW | third_party/darts_clone/darts.h | 221 | COMMENT | |
| LOW | third_party/darts_clone/darts.h | 241 | Details::progress_func_type progress_func = NULL); | COMMENT |
| LOW | third_party/darts_clone/darts.h | 261 | // if it exists, its value and length are set to `result'. Otherwise, the | COMMENT |
| LOW | third_party/darts_clone/darts.h | 281 | COMMENT | |
| LOW | third_party/libsais/libsais.c | 21 | COMMENT | |
| LOW | third_party/libsais/libsais.c | 41 | typedef size_t fast_uint_t; | COMMENT |
| LOW | third_party/libsais/libsais.c | 101 | #error Your compiler, configuration or platform is not supported. | COMMENT |
| LOW | third_party/libsais/libsais.c | 121 | COMMENT | |
| LOW | third_party/libsais/libsais.c | 161 | __BYTE_ORDER == __BIG_ENDIAN) || \ | COMMENT |
| LOW | third_party/libsais/libsais.h | 21 | COMMENT | |
| LOW | .github/workflows/requirements/cibuildwheel.txt | 1 | # | COMMENT |
| LOW | .github/scripts/update_dependencies.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | doc/special_symbols.md | 141 | # Output: | COMMENT |
| LOW | data/Scripts.txt | 1 | # Scripts-9.0.0.txt | COMMENT |
| LOW | data/gen_unicode_scripts_code.pl | 1 | #!/usr/bin/perl | COMMENT |
| LOW | src/filesystem.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/freelist.h | 1 | // Copyright 2018 Google Inc. | COMMENT |
| LOW | src/unicode_script.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/model_interface.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/model_interface.h | 21 | #include <utility> | COMMENT |
| LOW | src/CMakeLists.txt | 1 | # Copyright 2018 Google Inc. | COMMENT |
| LOW | src/ret_check.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/ret_check.h | 21 | #ifndef RET_CHECK | COMMENT |
| LOW | src/bpe_model.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/word_model_trainer.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/sentencepiece_trainer.h | 1 | // Copyright 2018 Google Inc. | COMMENT |
| LOW | src/char_model_trainer.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/trainer_interface.h | 1 | // Copyright 2016 Google Inc. | COMMENT |
| LOW | src/trainer_interface.h | 21 | #include <string> | COMMENT |
| 35 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | python/test/numpy_test.py | 57 | def test_return_type_validation_and_compat(self): | CODE |
| LOW | python/test/numpy_test.py | 101 | def test_decode_numpy_batch_list(self): | CODE |
| LOW | python/test/numpy_test.py | 127 | def test_decode_numpy_non_contiguous(self): | CODE |
| LOW | python/test/numpy_test.py | 146 | def test_decode_numpy_invalid_types(self): | CODE |
| LOW | python/test/numpy_test.py | 157 | def test_parallel_encode_numpy(self): | CODE |
| LOW | python/test/numpy_test.py | 240 | def test_decode_invalid_ids_numpy(self): | CODE |
| LOW | python/test/numpy_test.py | 249 | def test_decode_numpy_batch_mixed(self): | CODE |
| LOW | python/test/numpy_test.py | 261 | def test_native_batch_id_to_piece_numpy(self): | CODE |
| LOW | python/test/numpy_test.py | 277 | def test_native_batch_other_id_methods_numpy(self): | CODE |
| LOW | python/test/gil_release_test.py | 31 | def run_heavy_op_with_gil_check(op_func, name): | CODE |
| LOW | python/test/gen_stubs_test.py | 45 | def test_committed_stub_in_sync(self): | CODE |
| LOW | python/test/gen_stubs_test.py | 101 | def test_leaked_module_level_import_ignored(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 134 | def test_decode_batch_with_leading_empty_sequence(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 308 | def test_special_tokens_combinations(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 734 | def test_classmethod_factories(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 806 | def test_word_model_user_defined_symbol(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 926 | def test_train_with_pretokenizer(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 940 | def test_inconsistent_pretokenizer(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 965 | def test_pretokenizer_exception(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 991 | def test_pretokenizer_and_delimiter_mutually_exclusive(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1004 | def test_complex_regex_pretokenizer(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1267 | def test_normalizer_default_flags_follow_spec(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1374 | def test_trainer_with_normalizer(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1426 | def test_offset_mapping_empty_batch(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1527 | def test_decode_offset_mapping(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1642 | def test_decode_return_type_bytes(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1688 | def test_legacy_out_type_compat(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1727 | def test_normalizer_model_proto(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1739 | def test_normalizer_normalizer_spec(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1752 | def test_encode_return_type_explicit(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1859 | def test_native_batch_piece_to_id(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1889 | def test_native_batch_id_to_piece(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1923 | def test_native_batch_other_id_methods(self): | CODE |
| LOW | python/test/sentencepiece_test.py | 1947 | def test_convert_to_flatbuffer(self): | CODE |
| LOW | python/src/sentencepiece/__init__.py | 841 | def serialized_normalizer_spec(self): | CODE |
| LOW | .github/scripts/update_dependencies.py | 201 | def update_module_bazel_content(content: str): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | benchmark/analyze_results.py | 7 | print("Error: 'results.json' not found.") | CODE |
| MEDIUM | benchmark/analyze_results.py | 15 | print("Error: 'results.json' is empty.") | CODE |
| LOW⚡ | benchmark/download_models.py | 11 | except Exception as e: | CODE |
| LOW⚡ | benchmark/download_models.py | 18 | except Exception as e: | CODE |
| LOW⚡ | benchmark/download_models.py | 27 | except Exception as e: | CODE |
| LOW⚡ | benchmark/download_models.py | 35 | except Exception as e: | CODE |
| MEDIUM | benchmark/run_bench.py | 139 | print(f"Error: Dataset file '{path}' not found.") | CODE |
| MEDIUM | benchmark/run_bench.py | 163 | print("Error: No tasks available to run. Please run 'python download_models.py' first.") | CODE |
| LOW | python/test/sentencepiece_test.py | 35 | except Exception: | CODE |
| LOW | python/src/sentencepiece/__init__.py | 725 | except Exception: | CODE |
| LOW | python/src/sentencepiece/__init__.py | 886 | except Exception: | CODE |
| LOW | .github/scripts/update_dependencies.py | 87 | except Exception as e: | CODE |
| LOW | .github/scripts/update_dependencies.py | 103 | except Exception as e: | CODE |
| MEDIUM | .github/scripts/update_dependencies.py | 104 | print(f"Error fetching tags for {repo_path}: {e}") | CODE |
| LOW | .github/scripts/update_dependencies.py | 140 | except Exception as e: | CODE |
| LOW | .github/scripts/update_dependencies.py | 333 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | python/test/sentencepiece_test.py | 391 | # suppress logging (redirect to /dev/null) | COMMENT |
| HIGH | python/test/sentencepiece_test.py | 432 | # suppress logging (redirect to /dev/null) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | doc/auto_character_coverage.md | 54 | #### Step 1: Extract Candidate Merge Sequence Over All Unicode Characters | COMMENT |
| LOW⚡ | doc/auto_character_coverage.md | 61 | #### Step 2: Select Top $k$ Merge Tokens and Merge Gain | COMMENT |
| LOW⚡ | doc/auto_character_coverage.md | 67 | #### Step 3: Character Gain and Full Character Closure Constraint | COMMENT |
| LOW | doc/auto_character_coverage.md | 79 | #### Step 4: Remaining Budget and Standalone Characters | COMMENT |
| LOW | doc/auto_character_coverage.md | 93 | #### Step 5: Global Objective Maximization (Equivalence to Total Token Minimization) | COMMENT |
| LOW | doc/model_proto.md | 56 | ### Step 1: Define your extension | COMMENT |
| LOW | doc/model_proto.md | 73 | ### Step 2: Compile your proto | COMMENT |
| LOW | doc/model_proto.md | 81 | ### Step 3: Read/Write Custom Metadata in Python | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | benchmark/run_bench.py | 37 | CODE | |
| LOW | benchmark/run_bench.py | 62 | CODE | |
| LOW | benchmark/run_bench.py | 122 | CODE | |
| LOW | benchmark/run_bench.py | 135 | CODE | |
| LOW | python/setup.py | 36 | CODE | |
| LOW | python/setup.py | 164 | CODE | |
| LOW | python/tools/gen_stubs.py | 345 | CODE | |
| LOW | python/src/sentencepiece/__init__.py | 739 | CODE | |
| LOW | python/src/sentencepiece/__init__.py | 794 | CODE | |
| LOW | lite/amalgamate.py | 62 | CODE | |
| LOW | .github/scripts/update_dependencies.py | 61 | CODE | |
| LOW | .github/scripts/update_dependencies.py | 111 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | python/tools/gen_stubs.py | 49 | # This file is auto-generated by python/tools/gen_stubs.py. | COMMENT |
| MEDIUM | python/test/numpy_test.py | 206 | # Create a processor local to this scope | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | python/src/sentencepiece/__init__.py | 886 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | python/src/sentencepiece/__init__.py | 204 | CODE | |
| LOW | python/src/sentencepiece/__init__.py | 281 | CODE | |
| LOW | python/src/sentencepiece/__init__.py | 481 | CODE | |
| LOW | python/src/sentencepiece/__init__.py | 794 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | python/test/sentencepiece_test.py | 23 | CODE | |
| LOW | python/test/sentencepiece_test.py | 25 | CODE | |
| LOW | python/src/sentencepiece/__init__.py | 882 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lite/cached_sentencepiece_lite.h | 215 | // Example usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | doc/model_proto.md | 95 | model_proto.Extensions[my_metadata_pb2.model_author] = "John Doe" | CODE |