Warcraft III Peon voice notifications (+ more!) for Claude Code, Codex, IDEs, and any AI agent. Stop babysitting your terminal. Employ a Peon today.
This report summarizes scanner evidence for PeonPing/peon-ping, a Shell project with 5,070 GitHub stars. SynthScan examined 84,193 lines of code across 456 source files, recording 387 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 5.9 (Moderate 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? 156 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 295 finding(s).
Which changes need focused human review? 387 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 387 distinct pattern matches across 11 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 | relay.sh | 236 | except Exception: | CODE |
| LOW | relay.sh | 245 | except Exception: | CODE |
| LOW | relay.sh | 259 | except Exception: | CODE |
| LOW | relay.sh | 262 | except Exception: | CODE |
| LOW | relay.sh | 289 | except Exception: | CODE |
| LOW | relay.sh | 534 | except Exception: | CODE |
| LOW | install.sh | 536 | except Exception: | STRING |
| LOW | install.sh | 720 | except Exception: | STRING |
| LOW | install.sh | 1633 | except Exception: | STRING |
| LOW | install.sh | 1679 | except Exception: | STRING |
| LOW | install.sh | 1691 | except Exception: | STRING |
| MEDIUM⚡ | peon.sh | 2599 | print(f'Error: pack \"{pack_arg}\" not found.', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 2609 | print(f'Error: pack \"{pack_arg}\" is an unapproved draft — run: peon eval {pack_arg}', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 2622 | print(f'Error: Cannot write to {config_path} — it is managed by Nix/Home Manager.', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 2630 | print(f'Error: Cannot write to {config_path} — permission denied.', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 2883 | print(f'Error: pack \"{pack_arg}\" not found.', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 2889 | print('Error: IDE id must not be empty.', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 3654 | print(f'Error: pack \"{pack}\" not found.', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 3658 | print(f'Error: category \"{category}\" has no sounds in pack \"{pack}\".', file=sys.stderr) | CODE |
| MEDIUM⚡ | peon.sh | 3662 | print(f'Error: sound \"{fname}\" not found in {pack}/{category}.', file=sys.stderr) | CODE |
| MEDIUM | peon.sh | 2689 | print(f'Error: pack \"{pack_arg}\" not found.', file=sys.stderr) | CODE |
| MEDIUM | peon.sh | 3105 | print('Error: no packs found', flush=True) | CODE |
| MEDIUM | peon.sh | 3301 | print('Error: no openpeon.json or manifest.json found in ' + src, file=sys.stderr) | CODE |
| MEDIUM | peon.sh | 3479 | print(f'Error: could not fetch registry: {e}', flush=True) | CODE |
| MEDIUM | peon.sh | 3534 | print(f'Error: could not fetch registry: {e}', flush=True) | CODE |
| MEDIUM | peon.sh | 3592 | print(f'Error: pack \"{pack}\" not found.', file=sys.stderr) | CODE |
| MEDIUM | peon.sh | 4176 | print(f'Error: a draft named \"{os.path.basename(dest)}\" already exists at {dest}', file=sys.stderr) | CODE |
| MEDIUM | peon.sh | 4889 | def is_number(s): | CODE |
| LOW⚡ | peon.sh | 2606 | except Exception: | CODE |
| LOW⚡ | peon.sh | 2613 | except Exception: | CODE |
| LOW⚡ | peon.sh | 2894 | except Exception: | CODE |
| LOW | peon.sh | 151 | except Exception: | CODE |
| LOW | peon.sh | 248 | except Exception: | CODE |
| LOW | peon.sh | 899 | except Exception: | CODE |
| LOW | peon.sh | 1308 | except Exception: | CODE |
| LOW | peon.sh | 1450 | except Exception: | CODE |
| LOW | peon.sh | 1455 | except Exception: | CODE |
| LOW | peon.sh | 1609 | except Exception: | CODE |
| LOW | peon.sh | 1615 | except Exception: | CODE |
| LOW | peon.sh | 1642 | except Exception: | CODE |
| LOW | peon.sh | 1772 | except Exception: | CODE |
| LOW | peon.sh | 1975 | except Exception: | CODE |
| LOW | peon.sh | 1991 | except Exception: | CODE |
| LOW | peon.sh | 2006 | except Exception: | CODE |
| LOW | peon.sh | 2021 | except Exception: | CODE |
| LOW | peon.sh | 2064 | except Exception: | CODE |
| LOW | peon.sh | 2077 | except Exception: | CODE |
| LOW | peon.sh | 2090 | except Exception: | CODE |
| LOW | peon.sh | 2103 | except Exception: | CODE |
| LOW | peon.sh | 2119 | except Exception: | CODE |
| LOW | peon.sh | 2134 | except Exception: | CODE |
| LOW | peon.sh | 2155 | except Exception: | CODE |
| LOW | peon.sh | 2174 | except Exception: | CODE |
| LOW | peon.sh | 2203 | except Exception: | CODE |
| LOW | peon.sh | 2214 | except Exception: | CODE |
| LOW | peon.sh | 2228 | except Exception: | CODE |
| LOW | peon.sh | 2252 | except Exception: | CODE |
| LOW | peon.sh | 2264 | except Exception: | CODE |
| LOW | peon.sh | 2285 | except Exception: | CODE |
| LOW | peon.sh | 2317 | except Exception: | CODE |
| 125 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/plans/2026-05-09-omp-adapter-plan.md | 53 | # ============================================================ | COMMENT |
| MEDIUM | docs/plans/2026-05-09-omp-adapter-plan.md | 55 | # ============================================================ | COMMENT |
| MEDIUM | docs/plans/2026-05-09-omp-adapter-plan.md | 335 | # ============================================================ | COMMENT |
| MEDIUM | docs/plans/2026-05-09-omp-adapter-plan.md | 337 | # ============================================================ | COMMENT |
| MEDIUM | docs/plans/2026-02-24-notification-templates-plan.md | 232 | # ============================================================ | COMMENT |
| MEDIUM | docs/plans/2026-02-24-notification-templates-plan.md | 234 | # ============================================================ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 136 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 138 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 179 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 181 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 193 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 195 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 268 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 270 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 315 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-glass.js | 317 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 223 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 225 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 287 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 289 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 331 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 333 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 366 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 368 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 403 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 405 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 434 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 436 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 559 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-jarvis.js | 561 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 144 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 146 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 370 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 372 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 453 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 455 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 500 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/mac-overlay-sakura.js | 502 | // ══════════════════════════════════════════════ | COMMENT |
| MEDIUM | scripts/notify.sh | 297 | # ── Platform dispatch ──────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | relay.sh | 471 | def send_notification_on_host(title, message, color="red", focus=None): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 432 | def test_user_input_emits_prompt_submit(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 442 | def test_planner_response_with_tool_calls_emits_nothing(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 451 | def test_tool_result_does_not_emit_prompt_submit(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 463 | def test_final_planner_response_emits_stop(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 473 | def test_error_message_emits_tool_failure(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 483 | def test_full_turn_emits_exactly_two_events(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 600 | def test_surfacing_emits_permission_request(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 608 | def test_repeated_surfacing_only_sounds_once(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 616 | def test_responding_clears_pending(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 647 | def test_exit_code_field_is_read(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 656 | def test_exit_code_is_read_from_content(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 665 | def test_no_exit_code_returns_none(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 670 | def test_emit_event_carries_extra_fields(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 799 | def test_symlinked_log_resolves_to_its_target(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 807 | def test_symlink_and_target_are_not_double_counted(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 813 | def test_rotation_exposes_the_new_target(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 820 | def test_is_log_matches_rotated_names(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 829 | def test_batch_of_answered_prompts_is_silent(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 838 | def test_batch_ending_unanswered_sounds_once(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 912 | def test_conversation_db_beats_the_recent_cache(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 921 | def test_resumed_conversation_absent_from_cache_still_resolves(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 930 | def test_cache_covers_a_conversation_with_no_db_yet(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 936 | def test_unreadable_db_falls_through(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 947 | def test_maps_conversation_to_its_workspace(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 953 | def test_unknown_conversation_falls_back(self): | CODE |
| LOW⚡ | tests/test_antigravity_watcher.py | 960 | def test_legacy_completion_keeps_the_conversation_workspace(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 28 | def test_emit_event_produces_valid_json(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 46 | def test_emit_event_session_start(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 94 | def test_new_conversation_emits_session_start(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 112 | def test_new_db_conversation_emits_session_start(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 128 | def test_transcript_path_extracts_brain_guid(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 151 | def test_known_idle_guid_emits_prompt_submit(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 173 | def test_active_guid_no_event(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 193 | def test_idle_timeout_emits_stop(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 213 | def test_cooldown_suppresses_duplicate_stop(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 233 | def test_startup_grace_suppresses_events(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 251 | def test_pre_registers_existing_pb_files(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 262 | def test_pre_registers_existing_db_files(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 273 | def test_pre_registers_existing_transcript_files(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 290 | def test_non_pb_files_ignored(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 323 | def test_reads_only_new_lines(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 333 | def test_partial_line_is_withheld_until_complete(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 346 | def test_truncation_resets_offset(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 359 | def test_missing_file_returns_empty(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 502 | def test_transcript_full_is_ignored(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 513 | def test_transcript_conversation_ignores_idle_timeout(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 534 | def test_startup_seeds_last_active_from_newest_transcript(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 540 | def test_startup_does_not_replay_existing_transcript(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 628 | def test_no_active_conversation_emits_nothing(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 635 | def test_unrelated_log_lines_ignored(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 687 | def test_failed_command_emits_tool_failure(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 698 | def test_successful_command_is_silent(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 706 | def test_turn_with_one_failure_sounds_three_times(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 728 | def test_empty_planner_response_is_not_completion(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 736 | def test_rate_limit_retry_loop_sounds_once(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 751 | def test_error_sounds_again_after_progress(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 850 | def test_already_pending_batch_does_not_re_sound(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 857 | def test_poll_logs_skips_backlog_on_first_sight(self): | CODE |
| LOW | tests/test_antigravity_watcher.py | 986 | def test_missing_or_corrupt_cache_falls_back(self): | CODE |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | relay.sh | 1 | #!/bin/bash | COMMENT |
| LOW | peon.sh | 121 | COMMENT | |
| LOW | peon.sh | 1101 | local relay_port="${PEON_RELAY_PORT:-19998}" | COMMENT |
| LOW | peon.sh | 6901 | COMMENT | |
| LOW | plans/2026-02-12-antigravity-adapter.md | 21 | #!/bin/bash | COMMENT |
| LOW | docs/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | docs/plans/2026-05-09-omp-adapter-plan.md | 481 | # Requires peon-ping installed first: | COMMENT |
| LOW | adapters/windsurf.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/kimi.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/kiro.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/eca.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/omp.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/qwen.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/deepagents.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/antigravity.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/iflow.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/cursor.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/kiro-ide.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/openclaw.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/codex.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/trae.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/rovodev.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/rovodev.sh | 21 | # commands: | COMMENT |
| LOW | adapters/grok.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/copilot.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/antigravity-py.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/kilo.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/opencode.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/amp.sh | 1 | #!/bin/bash | COMMENT |
| LOW | adapters/opencode/setup-icon.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .gitban/scaffold.example.yaml | 1 | # .gitban/scaffold.yaml | COMMENT |
| LOW | .gitban/hooks/agent-watchdog.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .gitban/hooks/agent-log.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .gitban/hooks/agent-log.sh | 21 | # | COMMENT |
| LOW | .gitban/hooks/post-bash-log.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .gitban/hooks/agent-trace.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .gitban/hooks/pre-bash-log.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/tts-native.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/tts-native.sh | 21 | # | COMMENT |
| LOW | scripts/remote-hook.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/local-focus.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/local-focus.sh | 21 | # - kitty and alacritty export no such var at all, so the identity comes out | COMMENT |
| LOW | scripts/tts-minimax.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/tts-minimax.sh | 21 | # Stdin: one line of text to speak (read verbatim, no interpolation). | COMMENT |
| LOW | scripts/lint-python-quoting.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/ssh-focus.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/ssh-focus.sh | 21 | # - Always exits 0. | COMMENT |
| LOW | scripts/notify.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/notify.sh | 321 | # works from the overlay's detached env) targeting this agent's pane. Tried | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/pack-render.py | 116 | except OSError: | CODE |
| HIGH | scripts/eval-server.py | 233 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | scripts/eval-server.py | 488 | except OSError: | CODE |
| HIGH | scripts/eval-server.py | 55 | except Exception: | CODE |
| HIGH | scripts/eval-server.py | 401 | except OSError: | CODE |
| HIGH | scripts/eval-server.py | 397 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 248 | peon-ping implements the [Coding Event Sound Pack Specification (CESP)](https://github.com/PeonPing/openpeon) — an open | CODE |
| MEDIUM | docs/plans/2026-02-16-trainer-mode-plan.md | 17 | ### Task 1: Create branch and trainer sound directory scaffold | COMMENT |
| MEDIUM | docs/prds/PRD-002-hook-observability.md | 49 | ### Sprint dispatcher operator (multi-agent) | COMMENT |
| MEDIUM⚡ | .gitban/scaffold.example.yaml | 1 | # .gitban/scaffold.yaml | COMMENT |
| MEDIUM⚡ | .gitban/scaffold.example.yaml | 2 | # Copy this file to .gitban/scaffold.yaml and uncomment what you want to customize. | COMMENT |
| MEDIUM⚡ | .gitban/scaffold.example.yaml | 5 | # docs/adr/ADR-037-scaffold-configuration-override-semantics.md | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | relay.sh | 5 | # Usage: | COMMENT |
| LOW | adapters/kimi.sh | 14 | # Usage: | COMMENT |
| LOW | adapters/antigravity.sh | 13 | # Usage: | COMMENT |
| LOW | adapters/trae.sh | 22 | # Usage: | COMMENT |
| LOW | adapters/antigravity-py.sh | 16 | # Usage: | COMMENT |
| LOW | adapters/amp.sh | 15 | # Usage: | COMMENT |
| LOW | adapters/opencode/setup-icon.sh | 4 | # Usage: | COMMENT |
| LOW | .gitban/hooks/agent-watchdog.sh | 4 | # Usage: | COMMENT |
| LOW | .gitban/hooks/agent-log.sh | 22 | # Example usage: | COMMENT |
| LOW | scripts/cmux-status-presentation.sh | 3 | # Usage: | COMMENT |
| LOW | scripts/tts-native.sh | 10 | # Usage: | COMMENT |
| LOW | scripts/local-focus.sh | 4 | # Usage: | COMMENT |
| LOW | scripts/tts-minimax.sh | 10 | # Usage: | COMMENT |
| LOW | scripts/lint-python-quoting.sh | 18 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | relay.sh | 155 | # Check if already running | COMMENT |
| LOW | peon.sh | 42 | # Check if this section has built-in transport AND speaker in the name | COMMENT |
| LOW | peon.sh | 85 | # Check if any microphone is in use (CoreAudio) | COMMENT |
| LOW | peon.sh | 2573 | # Check if pack exists locally | COMMENT |
| LOW | peon.sh | 6409 | # Check if all exercises with goal > 0 are done | COMMENT |
| LOW | tests/setup.bash | 386 | # Check if this is a relay request (devcontainer/SSH audio/notification/health) | COMMENT |
| LOW | adapters/kimi.sh | 277 | # Set offset to end of file so we don't replay old events | COMMENT |
| LOW | adapters/amp.sh | 207 | # Check if the agent actually finished (last message is assistant text) | COMMENT |
| LOW | .gitban/hooks/agent-watchdog.sh | 82 | # Check if trace file still exists | COMMENT |
| LOW | scripts/hook-handle-use.sh | 39 | # Check if this is a /peon-ping-use command | COMMENT |
| LOW | scripts/hook-handle-rename.sh | 68 | # Check if this is a /peon-ping-rename command | COMMENT |
| LOW | scripts/pack-download.sh | 93 | # Check if a downloaded sound file matches its stored checksum | COMMENT |
| LOW | scripts/lint-python-quoting.sh | 66 | # Check if the content just before it indicates a quoting hazard. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | adapters/antigravity-watcher.py | 183 | CODE | |
| LOW | scripts/codex-config.py | 122 | CODE | |
| LOW | scripts/codex-config.py | 233 | CODE | |
| LOW | scripts/pack-render.py | 13 | CODE | |
| LOW | scripts/eval-server.py | 71 | CODE | |
| LOW | scripts/eval-server.py | 116 | CODE | |
| LOW | scripts/eval-server.py | 337 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/setup.bash | 4 | # harness works on macOS, Linux, and Git Bash for Windows without | COMMENT |
| MEDIUM | scripts/tts-minimax.sh | 219 | # before any network call. Powers the test harness. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/codex-config.py | 319 | command = 'if [ -f {adapter} ]; then CLAUDE_PEON_DIR={install_dir} bash {adapter} >/dev/null 2>&1 || true; fi'.forma | CODE |