🐱 BongoCat — A cross-platform interactive desktop pet that brings fun to your desktop!
This report summarizes scanner evidence for BongoCatPet/BongoCat, a Rust project with 24,421 GitHub stars. SynthScan examined 200,802 lines of code across 927 source files, recording 601 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 3.1 (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? 584 finding(s).
Are imports declared and package/API names verified? 16 finding(s).
Are wrappers, guards, and repeated structures necessary? 122 finding(s).
Which changes need focused human review? 601 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 601 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 | tools/tests/test_release_changelog_contract.py | 21 | WORKFLOW = ROOT / ".github" / "workflows" / "app-release.yml" | COMMENT |
| LOW | tools/tests/test_packaging_contract.py | 221 | self.assertNotIn(rejected, packager) | COMMENT |
| LOW | crates/bongocat-runtime/tests/shared_input_fixtures.rs | 421 | assert_eq!( | COMMENT |
| LOW | crates/bongocat-runtime/src/client.rs | 101 | /// reason [`Self::frame_scheduling`] exists, so a per-frame poll cannot bring | COMMENT |
| LOW | crates/bongocat-runtime/src/lib.rs | 141 | /// Upper bound of the overlay hover hide delay, in whole seconds. | COMMENT |
| LOW | crates/bongocat-runtime/src/lib.rs | 161 | /// overlay compares the delay against `MonotonicMillis`. This is the single | COMMENT |
| LOW | crates/bongocat-runtime/src/lib.rs | 201 | /// make it impossible to move. `None` means no key does this. | COMMENT |
| LOW | crates/bongocat-runtime/src/lib.rs | 281 | /// press order, instead of one image per hand. | COMMENT |
| LOW | crates/bongocat-runtime/src/lib.rs | 381 | #[derive(Clone, Debug, Eq, PartialEq)] | COMMENT |
| LOW | crates/bongocat-runtime/src/pacing.rs | 41 | } | COMMENT |
| LOW | crates/bongocat-runtime/src/tests/pacing.rs | 1 | //! Frame pacing, the frame interval and the work budget diagnostics. | COMMENT |
| LOW | crates/bongocat-runtime/src/tests/pacing.rs | 141 | const WARM_UP: Duration = Duration::from_millis(300); | COMMENT |
| LOW | crates/bongocat-runtime/src/rendering/model_input.rs | 1 | //! Turning the product's input into the model's parameters. | COMMENT |
| LOW | crates/bongocat-runtime/src/rendering/model_input.rs | 41 | } else { | COMMENT |
| LOW | crates/bongocat-runtime/src/input_state/snapshot.rs | 1 | //! What a consumer of the runtime sees. | COMMENT |
| LOW | crates/bongocat-render/src/key.rs | 21 | pub side: KeySide, | COMMENT |
| LOW | crates/bongocat-render/src/key.rs | 101 | COMMENT | |
| LOW | crates/bongocat-render/src/channel.rs | 1 | //! The bounded channel between the runtime's renderer and the overlay. | COMMENT |
| LOW | crates/bongocat-render/src/geometry.rs | 61 | /// it is authored that way — so the canvas starts `(window_width - image_width) / | COMMENT |
| LOW | crates/bongocat-render/src/validate.rs | 1 | //! The check that stands between a snapshot and a GPU upload. | COMMENT |
| LOW | crates/bongocat-live2d-render/src/lib.rs | 101 | /// | COMMENT |
| LOW | crates/bongocat-live2d-render/src/lib.rs | 241 | /// skipped, so an incomplete model simply draws nothing for that key. | COMMENT |
| LOW | crates/bongocat-live2d-render/src/lib.rs | 261 | /// | COMMENT |
| LOW | crates/bongocat-live2d-render/src/lib.rs | 281 | /// ever drew still draws something whenever its counterpart has artwork. | COMMENT |
| LOW | crates/bongocat-live2d-render/src/lib.rs | 301 | KeyIdentity::Gamepad(button) => gamepad_key_name_candidates(button), | COMMENT |
| LOW | crates/bongocat-live2d-render/src/lib.rs | 401 | if let Some(exact) = exact { | COMMENT |
| LOW | crates/bongocat-live2d-render/src/lib.rs | 421 | // one image name may only ever carry one meaning. This is the whole | COMMENT |
| LOW | crates/bongocat-storage/src/lib.rs | 1 | //! User-private storage primitives shared by every crate that writes product | COMMENT |
| LOW | crates/bongocat-storage/src/lib.rs | 61 | let _ = path; | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/lib.rs | 1 | #![forbid(unsafe_code)] | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/update.rs | 1 | //! The UI-facing update protocol. | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/settings/command.rs | 41 | }, | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/settings/command.rs | 161 | settings: SettingsGamepadAutoSwitch, | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/settings/build.rs | 21 | } | COMMENT |
| LOW | …bongocat-ui-protocol/src/settings/input_diagnostics.rs | 41 | pub transport_enqueued: u64, | COMMENT |
| LOW | …bongocat-ui-protocol/src/settings/input_diagnostics.rs | 61 | /// `administrator` on Windows. Anonymous by construction — a capability name | COMMENT |
| LOW | …ates/bongocat-ui-protocol/src/settings/model_import.rs | 1 | //! Importing a model: the request, the progress, and the cancellation. | COMMENT |
| LOW | …ates/bongocat-ui-protocol/src/settings/model_import.rs | 21 | COMMENT | |
| LOW | …ates/bongocat-ui-protocol/src/settings/model_import.rs | 81 | /// | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/settings/snapshot.rs | 61 | /// decision a user makes, and which expression each model happens to be | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/settings/snapshot.rs | 181 | pub struct SettingsGamepadAxisSettings { | COMMENT |
| LOW | crates/bongocat-ui-protocol/src/settings/snapshot.rs | 221 | /// The physical modifier key whose hold gives the pointer back to the user. | COMMENT |
| LOW | …tes/bongocat-ui-protocol/src/settings/model_catalog.rs | 21 | #[derive(Clone, Debug, Eq, PartialEq)] | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 1 | //! The project-level build, bundle and installer packaging entry point. | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 21 | //! does: the manifest shape stays owned by one place, and the release workflow only | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 41 | //! | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 61 | //! | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 101 | const APPLICATION_BINARY: &str = "bongocat-app"; | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 141 | const PROVENANCE_GENERATOR: &str = "tools/record-provenance.py"; | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 161 | /// The repair command the installer window offers next to the drop link. | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 181 | /// Ad-hoc signature used when no distribution identity is provisioned. | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 201 | /// produces bundle and installer artifacts but no update assets, which is what a | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 261 | /// bundle archive and the installer of a target are named after the same chip and | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 281 | /// which hard-codes `{main binary name}_{version}_{arch}-setup.exe` with no | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 1101 | /// Copies the preset models into the staging area the packager maps from. | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 1301 | /// a per-entry field. `notes` is the release changelog the update window shows; it is | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 1321 | COMMENT | |
| LOW | crates/bongocat-packaging/src/main.rs | 1341 | COMMENT | |
| LOW | crates/bongocat-packaging/src/main.rs | 1361 | /// project, and it is shown in the same document as the install instructions. | COMMENT |
| LOW | crates/bongocat-packaging/src/main.rs | 1381 | /// every generated section below is `##`. Without a heading of its own the entry | COMMENT |
| 392 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/inspect-cubism-sdk.py | 243 | def validate_framework_sources( | CODE |
| LOW | tools/inspect-cubism-sdk.py | 280 | def validate_redistributable_list(text: str) -> None: | CODE |
| LOW | tools/validate-json-schema.py | 171 | def validate_manifest_fixtures( | CODE |
| LOW | tools/validate-fixtures.py | 455 | def validate_behavior_manifest() -> tuple[set[str], set[str]]: | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 126 | def without_variation_selector(text): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 182 | def test_the_notes_come_from_the_changelogs_and_not_from_github(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 198 | def test_the_release_body_and_the_manifest_read_one_notes_file(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 221 | def test_the_notes_are_composed_before_they_are_consumed(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 237 | def test_the_packaging_tool_reads_the_changelogs_the_repository_has(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 256 | def test_the_bilingual_changelogs_document_the_same_releases(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 274 | def test_every_documented_release_has_notes(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 284 | def test_the_changelogs_do_not_carry_the_generated_download_block(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 346 | def test_the_english_headings_are_from_the_vocabulary(self): | CODE |
| LOW | tools/tests/test_release_changelog_contract.py | 364 | def test_the_chinese_headings_are_from_the_vocabulary(self): | CODE |
| LOW⚡ | tools/tests/test_release_changelog_contract.py | 382 | def test_both_changelogs_carry_the_same_sections_in_the_same_order(self): | CODE |
| LOW⚡ | tools/tests/test_release_changelog_contract.py | 392 | def test_the_vocabulary_does_not_repeat_a_section(self): | CODE |
| LOW⚡ | tools/tests/test_release_changelog_contract.py | 400 | def test_the_documented_vocabulary_is_the_enforced_one(self): | CODE |
| LOW | tools/tests/test_changed_paths.py | 25 | def test_documents_alone_are_documentation(self): | CODE |
| LOW | tools/tests/test_changed_paths.py | 42 | def test_a_change_set_of_only_documents_is_docs_only(self): | CODE |
| LOW | tools/tests/test_changed_paths.py | 49 | def test_one_code_path_is_enough_to_run_everything(self): | CODE |
| LOW | tools/tests/test_changed_paths.py | 74 | def test_the_gate_configuration_is_never_treated_as_a_document(self): | CODE |
| LOW⚡ | tools/tests/test_changed_paths.py | 87 | def test_an_unreadable_change_set_runs_the_whole_pipeline(self): | CODE |
| LOW⚡ | tools/tests/test_changed_paths.py | 95 | def test_the_diff_range_follows_the_event(self): | CODE |
| LOW⚡ | tools/tests/test_changed_paths.py | 104 | def test_a_pull_request_without_its_base_ref_is_an_error(self): | CODE |
| LOW | tools/tests/test_provenance.py | 14 | def test_writes_path_free_reproducible_metadata(self): | CODE |
| LOW | tools/tests/test_collect_failure_evidence.py | 14 | def test_collects_only_bounded_redacted_evidence(self): | CODE |
| LOW | tools/tests/test_collect_failure_evidence.py | 49 | def test_skips_symlinks_and_non_validation_images(self): | CODE |
| LOW | tools/tests/test_collect_failure_evidence.py | 74 | def test_unknown_log_lines_are_replaced_with_a_placeholder(self): | CODE |
| LOW | tools/tests/test_collect_failure_evidence.py | 100 | def test_output_directory_inside_input_is_not_collected(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 428 | def test_bundle_is_rejected_when_the_resources_are_missing(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 433 | def test_disk_image_wraps_the_packaged_bundle(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 443 | def test_disk_image_declares_the_window_the_installer_opens_with(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 579 | def test_version_has_exactly_one_source(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 586 | def test_the_compiled_environment_reaches_the_child_build(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 596 | def test_app_uses_a_single_production_feature(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 602 | def test_no_self_built_packaging_script_remains(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 631 | def test_release_workflow_builds_every_shipped_target(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 637 | def test_release_workflow_runs_the_same_entry_point_as_developers(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 643 | def test_update_runtime_and_dependency_policy_match_the_shipped_targets(self): | CODE |
| LOW⚡ | tools/tests/test_packaging_contract.py | 650 | def test_packaging_targets_match_the_update_runtime(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 59 | def test_exactly_three_release_targets_ship(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 77 | def test_every_release_target_publishes_the_expected_artifacts(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 91 | def test_windows_installer_stays_per_user(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 97 | def test_windows_installer_offers_exactly_the_application_languages(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 165 | def test_windows_installer_is_published_under_the_product_release_name(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 189 | def test_release_jobs_and_the_release_notes_call_a_machine_the_same_thing(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 223 | def test_every_release_job_is_named_by_the_action_it_performs(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 253 | def test_a_step_named_require_actually_fails_the_build(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 271 | def test_both_build_jobs_name_the_build_step_the_same_way(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 282 | def test_every_release_artifact_is_keyed_by_the_architecture_token(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 314 | def test_the_published_changelogs_call_a_chip_by_one_name(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 328 | def test_every_macos_artifact_is_named_after_the_same_architecture_token(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 370 | def test_product_icon_is_embedded_at_the_id_gpui_loads(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 390 | def test_bundle_identity_and_minimum_version_are_single_sourced(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 414 | def test_bundled_resources_match_the_runtime_lookup(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 478 | def test_disk_image_carries_a_repair_command_for_the_installed_copy(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 495 | def test_the_repair_command_says_what_to_do_when_there_is_nothing_to_repair(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 514 | def test_the_repair_command_closes_the_window_it_ran_in(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 542 | def test_disk_image_gives_the_volume_the_application_icon(self): | CODE |
| LOW | tools/tests/test_packaging_contract.py | 561 | def test_just_stays_a_thin_entry_point(self): | CODE |
| 61 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | crates/bongocat-overlay/src/windows/session.rs | 896 | drawable_count: self.overlay.renderer.model.meshes.len(), | CODE |
| CRITICAL | crates/bongocat-overlay/src/windows/session.rs | 898 | texture_count: self.overlay.renderer.model.textures.len(), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/validate-locales.py | 4 | CODE | |
| LOW | tools/inspect-cubism-sdk.py | 4 | CODE | |
| LOW | tools/release_notes.py | 4 | CODE | |
| LOW | tools/dev_plugins.py | 7 | CODE | |
| LOW | tools/validate-json-schema.py | 4 | CODE | |
| LOW | tools/run-input-fixtures.py | 4 | CODE | |
| LOW | tools/changed-paths.py | 18 | CODE | |
| LOW | tools/validate-fixtures.py | 4 | CODE | |
| LOW | tools/record-provenance.py | 4 | CODE | |
| LOW | tools/collect-failure-evidence.py | 4 | CODE | |
| LOW | tools/fetch_release_assets.py | 4 | CODE | |
| LOW | tools/tests/test_inspect_cubism_sdk.py | 1 | CODE | |
| LOW | tools/tests/test_product_version_contract.py | 3 | CODE | |
| LOW | plugins/key-sounds/resources/fetch_packs.py | 29 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/validate-locales.py | 38 | CODE | |
| LOW | tools/release_notes.py | 57 | CODE | |
| LOW | tools/validate-json-schema.py | 94 | CODE | |
| LOW | tools/run-input-fixtures.py | 44 | CODE | |
| LOW | tools/validate-fixtures.py | 76 | CODE | |
| LOW | tools/tests/test_release_changelog_contract.py | 149 | CODE | |
| LOW | tools/tests/test_packaging_e2e.py | 39 | CODE | |
| LOW | tools/tests/test_packaging_e2e.py | 313 | CODE | |
| LOW | plugins/key-sounds/resources/fetch_packs.py | 164 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/bongocat-app/src/product_options.rs | 17 | /// `#[cfg]`-gated availability of a harness all read this one declaration, so a flag | COMMENT |
| MEDIUM | .github/workflows/verify.yml | 282 | # A model source is recognised from its own content, so the harness takes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/bongocat-ui/src/window/tests/behavior_names.rs | 218 | // ── The inline editor ──────────────────────────────────────────────────────── | COMMENT |