AI Slop Code Risk Monitor

rmyndharis/OpenWA

SlopCodeMonitor badge for rmyndharis/OpenWA Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Free, Open Source, Self-Hosted WhatsApp API Gateway

2.9 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for rmyndharis/OpenWA, a TypeScript project with 16,420 GitHub stars. SynthScan examined 572,554 lines of code across 2093 source files, recording 1038 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 2.9 (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.

2.9
Adjusted Signal
2.9
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
16.4K
Stars
TypeScript
Language
572.6K
Lines of Code
2.1K
Files
1.0K
Pattern Hits
2026-10-31
Scan Date
0.01
HC Hit Rate

Risk Review · Payload v1

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.

Cognitive Ownership Risk 5.4/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 629 finding(s).

Hallucinated Dependency & Supply Chain Risk 2.6/100 · LOW

Are imports declared and package/API names verified? 154 finding(s).

Agent Over-Engineering Ratio 8.6/100 · LOW

Are wrappers, guards, and repeated structures necessary? 566 finding(s).

PR Review Velocity Impact 13.8/100 · LOW

Which changes need focused human review? 1038 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 6HIGH 18MEDIUM 256LOW 758

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 1038 distinct pattern matches across 16 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.

Decorative Section Separators251 hits · 741 pts
SeverityFileLineSnippetContext
MEDIUMtest/webhooks.e2e-spec.ts128 // ── CRUD over the REST surface ────────────────────────────────────COMMENT
MEDIUMtest/webhooks.e2e-spec.ts229 // ── auth boundaries ───────────────────────────────────────────────COMMENT
MEDIUMtest/webhooks.e2e-spec.ts247 // ── registration validation ───────────────────────────────────────COMMENT
MEDIUMtest/webhooks.e2e-spec.ts283 // ── dispatch over real HTTP ───────────────────────────────────────COMMENT
MEDIUMtest/webhooks.e2e-spec.ts401 // ── payload bounds (per-session cap + inline-media shedding) ──────COMMENT
MEDIUMtest/webhooks.e2e-spec.ts463 // ── the test endpoint ─────────────────────────────────────────────COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md360# ===========================================COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md362# ===========================================COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md369# ===========================================COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md371# ===========================================COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md476# ===========================================COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md478# ===========================================COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md486# ===========================================COMMENT
MEDIUM⚡docs/10-devops-infrastructure.md488# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md387# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md389# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md430# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md432# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md458# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md460# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md523# ===========================================COMMENT
MEDIUMdocs/10-devops-infrastructure.md525# ===========================================COMMENT
MEDIUMdashboard/src/utils/authLifecycle.test.ts87// ── App-level auth flow: exactly one /auth/validate per sign-in ──────────────COMMENT
MEDIUMdashboard/src/utils/sessionActions.test.ts100// ── replaceSession ────────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/utils/sessionActions.test.ts157// ── classifyUnlinkError ───────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts21// ── Query Keys ────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts41// ── Session Queries ───────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts88// ── Webhook Queries ───────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts135// ── Template Queries ─────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts183// ── API Key Queries ───────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts253// ── Logs Queries ──────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts268// ── Infrastructure Queries ────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts286// ── Plugin Queries ────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/hooks/queries.ts362// ── Stats Queries ─────────────────────────────────────────────────────COMMENT
MEDIUM…shboard/src/hooks/useChatScrollPosition.render.test.ts223// ── Live messages and the per-chat position memory ───────────────────────────COMMENT
MEDIUM…shboard/src/hooks/useChatScrollPosition.render.test.ts395// ── Which scroll events are the reader's ─────────────────────────────────────COMMENT
MEDIUM…shboard/src/hooks/useChatScrollPosition.render.test.ts484// ── Following a live message ─────────────────────────────────────────────────COMMENT
MEDIUM…shboard/src/hooks/useChatScrollPosition.render.test.ts673// ── Media decoding ───────────────────────────────────────────────────────────COMMENT
MEDIUM…shboard/src/hooks/useChatScrollPosition.render.test.ts944// ── Older pages landing under a position the memory holds ────────────────────COMMENT
MEDIUM…shboard/src/hooks/useChatScrollPosition.render.test.ts1042// ── A thread of message rows ─────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts29// ── Fixtures + fetch stub ────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts220// ── DOM helpers ──────────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts241// ── Harness bootstrap ────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts287// ── Smoke tests ──────────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts568// ── The engine radio's seed source (#1082) ───────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts568// ── The engine radio's seed source (#1082) ───────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts641// ── A switch saved and not restarted for ─────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts744// ── A built-in switch saved and not restarted for ────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts1391// ── One rule for every saved and pinned state ────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts2153// ── Built-in containers the restart stops ────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts2943// ── Restart-flow timer cleanup on unmount ────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Infrastructure.test.ts2969// ── Restart outcomes the server reports ──────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Plugins.tsx397 // ── Activation ────────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Plugins.tsx415 // ── Per-session config override ───────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Sessions.test.ts24// ── Fixtures + fetch stub ────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Sessions.test.ts336// ── Harness bootstrap ────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Sessions.test.ts391// ── Smoke tests ──────────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Sessions.test.ts1901// ── Live feed banner ─────────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Sessions.test.ts2049// ── Auto-reject toggle ───────────────────────────────────────────────────────COMMENT
MEDIUMdashboard/src/pages/Sessions.test.ts2378// ── Live feed subscription ───────────────────────────────────────────────────COMMENT
191 more matches not shown…
Hyper-Verbose Identifiers311 hits · 284 pts
SeverityFileLineSnippetContext
LOWdashboard/src/utils/importRefusal.ts24export function shouldOfferStopOrphansRetry(CODE
LOWdashboard/src/utils/chatMessages.ts490export function unacknowledgedIncomingIds(CODE
LOWdashboard/src/utils/sessionScope.ts13export function sessionPickerStartsExpanded(selectedIds: readonly string[]): boolean {CODE
LOWdashboard/src/hooks/queries.ts146export function useCreateTemplateMutation() {CODE
LOWdashboard/src/hooks/queries.ts157export function useUpdateTemplateMutation() {CODE
LOWdashboard/src/hooks/queries.ts173export function useDeleteTemplateMutation() {CODE
LOW⚡dashboard/src/hooks/queries.ts305export function useCreateInstanceMutation(pluginId: string) {CODE
LOW⚡dashboard/src/hooks/queries.ts315export function useRegenerateInstanceSecretMutation(pluginId: string) {CODE
LOW⚡dashboard/src/hooks/queries.ts325export function useUpdateInstanceMutation(pluginId: string) {CODE
LOWdashboard/src/hooks/queries.ts336export function useDeleteInstanceMutation(pluginId: string) {CODE
LOWdashboard/src/pages/Chats.test.ts215function countPagedMessagesFetches(): number {CODE
LOW⚡sdk/python/tests/test_webhook.py20def test_accepts_the_gateway_signature_over_text_or_bytes():CODE
LOW⚡sdk/python/tests/test_webhook.py30def test_rejects_a_malformed_header(header):CODE
LOW⚡sdk/python/tests/test_webhook.py34def test_rejects_a_changed_body_a_wrong_secret_and_an_empty_secret():CODE
LOW⚡sdk/python/tests/test_webhook.py42def test_delivery_type_accepts_the_test_event():CODE
LOW⚡sdk/python/tests/test_sdk.py55 def test_requires_base_url_and_api_key(self):CODE
LOW⚡sdk/python/tests/test_sdk.py61 def test_sends_api_key_header(self):CODE
LOW⚡sdk/python/tests/test_sdk.py68 def test_default_headers_cannot_override_api_key(self):CODE
LOW⚡sdk/python/tests/test_sdk.py211 def test_strips_trailing_slash(self):CODE
LOW⚡sdk/python/tests/test_sdk.py217 def test_sessions_list_sends_name(self):CODE
LOW⚡sdk/python/tests/test_sdk.py222 def test_query_params_skip_none(self):CODE
LOW⚡sdk/python/tests/test_sdk.py235 def test_build_url_escapes_a_literal_percent_in_a_query_value(self):CODE
LOW⚡sdk/python/tests/test_sdk.py241 def test_build_url_refuses_a_path_without_a_leading_slash(self, path):CODE
LOW⚡sdk/python/tests/test_sdk.py250 def test_build_url_omits_none_valued_params(self):CODE
LOW⚡sdk/python/tests/test_sdk.py349 def test_the_api_key_loses_a_trailing_newline_and_an_illegal_one_is_refused_without_being_quoted(self):CODE
LOW⚡sdk/python/tests/test_sdk.py359 def test_a_key_with_an_inner_space_is_accepted_as_the_gateway_and_other_clients_take_it(self):CODE
LOW⚡sdk/python/tests/test_sdk.py363 def test_a_default_header_the_stack_would_refuse_is_refused_without_quoting_its_value(self):CODE
LOW⚡sdk/python/tests/test_sdk.py502 def test_a_remote_http_base_url_warns_and_a_local_or_https_one_does_not(self) -> None:CODE
LOW⚡sdk/python/tests/test_sdk.py512 def test_the_context_manager_closes_the_client(self) -> None:CODE
LOW⚡sdk/python/tests/test_sdk.py521 def test_exposes_all_resources(self):CODE
LOW⚡sdk/python/tests/test_sdk.py532 def test_send_methods_forward_keys_without_changing_json(self, key: str | None) -> None:CODE
LOW⚡sdk/python/tests/test_sdk.py600 def test_invalid_send_keys_are_refused_before_transport(self, key: str) -> None:CODE
LOW⚡sdk/python/tests/test_sdk.py607 def test_send_text_uses_send_text_path(self):CODE
LOW⚡sdk/python/tests/test_sdk.py613 def test_send_text_forwards_mentions_verbatim(self):CODE
LOW⚡sdk/python/tests/test_sdk.py618 def test_send_poll_uses_send_poll_path(self):CODE
LOW⚡sdk/python/tests/test_sdk.py657 def test_send_template_accepts_template_name(self):CODE
LOW⚡sdk/python/tests/test_sdk.py662 def test_list_returns_messages_total_wrapper(self):CODE
LOW⚡sdk/python/tests/test_sdk.py668 def test_quoted_message_id_reaches_the_body_on_every_send(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1127 def test_vote_poll_posts_option_texts(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1133 def test_star_posts_the_boolean_through(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1139 def test_pin_and_unpin_post_to_their_routes(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1149 def test_message_media_fetches_archived_bytes(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1157 def test_media_fetches_stored_status_bytes(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1241 def test_chats_pin_reports_refusal(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1245 def test_chats_mute_sends_epoch_milliseconds_unchanged(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1253 def test_chats_mute_sends_explicit_null_to_unmute(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1376 def test_client_exposes_all_resources(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1386 def test_search_minimal_required_q(self):CODE
LOW⚡sdk/python/tests/test_sdk.py1395 def test_search_forwards_all_optional_filters(self):CODE
LOWsdk/python/tests/test_sdk.py82 def test_default_headers_cannot_override_api_key_in_another_case(self):CODE
LOWsdk/python/tests/test_sdk.py105 def test_path_segments_are_encoded(self):CODE
LOWsdk/python/tests/test_sdk.py113 def test_empty_or_dot_ids_are_refused_before_sending(self):CODE
LOWsdk/python/tests/test_sdk.py129 def test_raw_request_escape_hatch(self):CODE
LOWsdk/python/tests/test_sdk.py135 def test_treats_unfollowed_redirect_as_error(self):CODE
LOWsdk/python/tests/test_sdk.py174 def test_a_retry_after_too_long_to_parse_keeps_the_api_error(self, binary: bool) -> None:CODE
LOWsdk/python/tests/test_sdk.py190 def test_errors_survive_pickle_and_copy(self) -> None:CODE
LOWsdk/python/tests/test_sdk.py261 def test_raw_request_keeps_a_query_string_in_the_path(self):CODE
LOWsdk/python/tests/test_sdk.py281 def test_error_exposes_code_retry_after_and_headers(self):CODE
LOWsdk/python/tests/test_sdk.py325 def test_an_error_with_no_body_names_the_status_text_not_none(self):CODE
LOWsdk/python/tests/test_sdk.py334 def test_an_httpx_timeout_or_a_tuple_is_taken_as_given(self):CODE
251 more matches not shown…
Over-Commented Block284 hits · 279 pts
SeverityFileLineSnippetContext
LOWdocker-compose.dev.yml1# OpenWA - Local smoke / quick-start composeCOMMENT
LOWdocker-compose.dev.yml41 - '${BIND_HOST:-127.0.0.1}:${API_PORT:-2785}:2785'COMMENT
LOWdocker-entrypoint.sh41if [ "$(id -u)" != 0 ]; thenCOMMENT
LOWdocker-entrypoint.sh61# "$@" = CMD from Dockerfile (default: node dist/main).COMMENT
LOWdocker-compose.yml21 # PING (health), CONTAINERS (list/inspect/create/start/stop),COMMENT
LOWdocker-compose.yml121 # Database. Forwarded blank by default (`${VAR:-}`) so a dashboard switch saved toCOMMENT
LOWdocker-compose.yml141 - DATABASE_SSL=${DATABASE_SSL:-}COMMENT
LOWdocker-compose.yml161 # and use the first-party build served by WhatsApp, or an exact version to pin a specific build.COMMENT
LOWtest/setup-e2e.ts1// e2e boot environment. Set BEFORE AppModule is imported (setupFiles phase) so theCOMMENT
LOWtest/setup-e2e.ts21// Restoring parallelism means giving each worker its own data root, not just its own database.COMMENT
LOWcharts/openwa/values.yaml1# replicaCount MUST stay 1. A session lease now stops two pods from launching the sameCOMMENT
LOWcharts/openwa/values.yaml21# Non-secret application config, rendered into a ConfigMap and loaded via envFrom.COMMENT
LOWcharts/openwa/values.yaml41 API_MASTER_KEY: ""COMMENT
LOWcharts/openwa/values.yaml81# enabled), where the bounded teardown stages add up to 63s: drain 3 + ingress reconciler 5 + enginesCOMMENT
LOWcharts/openwa/values.yaml101# openwa user (uid/gid 997) via gosu, which needs the capabilities added below.COMMENT
LOWcharts/openwa/values.yaml121# The entrypoint then skips its chown and privilege drop and runs as that uid;COMMENT
LOWcharts/openwa/templates/statefulset.yaml61 # Budget here is periodSeconds x (failureThreshold - 1) = 5s x (60-1) = 295s — the sameCOMMENT
LOWdocs/12-troubleshooting-faq.md861COMMENT
LOWdocs/08-development-guidelines.md681# Keys the dashboard manages (Dashboard > Infrastructure) are commented out with their defaults:COMMENT
LOWdocs/08-development-guidelines.md701# Redis and queue disabled by defaultCOMMENT
LOWdocs/08-development-guidelines.md721COMMENT
LOWdocs/08-development-guidelines.md741# DATABASE_POOL_SIZE=10COMMENT
LOWdocs/13-horizontal-scaling.md481 # it limits the privileges the API process holds, not what a plugin inside that process can reach.COMMENT
LOWdocs/03-system-architecture.md1581#### Standard Profile (.env)COMMENT
LOWdocs/03-system-architecture.md1601COMMENT
LOWdocs/14-migration-guide.md101# Step 2: Change the database configurationCOMMENT
LOWdocs/14-migration-guide.md261# Response: { "storageType": "local", "count": 150, "sizeBytes": 15000000 }COMMENT
LOWdocs/14-migration-guide.md281# S3_ENDPOINT=http://minio:9000COMMENT
LOWdocs/14-migration-guide.md621```bashCOMMENT
LOWdocs/14-migration-guide.md821source checkout, or `docker compose run --rm openwa-api npm run migration:run:main:prod` in the image.COMMENT
LOWdocs/14-migration-guide.md1001COMMENT
LOWdocs/11-operational-runbooks.md221COMMENT
LOWdocs/11-operational-runbooks.md241# every slot they or its own message took, for the life of the process. A reconnect does not freeCOMMENT
LOWdocs/11-operational-runbooks.md301# shutdown drain), or, with the queue disabled, stopped by shutdown in a retry backoff thatCOMMENT
LOWdocs/11-operational-runbooks.md361# it. The outbox sweep runs only while WEBHOOK_RECONCILE_INTERVAL_MS > 0 (default 60000). ItCOMMENT
LOWdocs/11-operational-runbooks.md381# failed > 0: the replay did not deliver, most often because the receiver still rejects it (theCOMMENT
LOWdocs/11-operational-runbooks.md441# BACKUP_DIR defaults to ./backups — it creates no dated subdirectories)COMMENT
LOWdocs/11-operational-runbooks.md621# the checkout below because an image older than 0.23.7 cannot move its safety snapshot off theCOMMENT
LOWdocs/11-operational-runbooks.md661# a load that fails leaves nothing behind. An archive holding database.schema (a POSTGRES_SCHEMA otherCOMMENT
LOWdocs/11-operational-runbooks.md761# - openwa.sqlite — user data (DATABASE_NAME, default ./data/openwa.sqlite;COMMENT
LOWdocs/11-operational-runbooks.md781# (default: <OPENWA_DATA_DIR>/plugins)COMMENT
LOWdocs/11-operational-runbooks.md961# defaults and a ./data/... path from ./.env or .env.generated are read under OPENWA_DATA_DIR,COMMENT
LOWdocs/11-operational-runbooks.md1001# sslmode=prefer accepts any certificate. verify-full also needs PGSSLROOTCERT set to the server'sCOMMENT
LOWdocs/11-operational-runbooks.md1201COMMENT
LOWdocs/10-devops-infrastructure.md361# APPLICATIONCOMMENT
LOWdocs/10-devops-infrastructure.md381# DATABASE_NAME=openwaCOMMENT
LOWdocs/10-devops-infrastructure.md401# STORAGE_TYPE accepts only `local` or `s3` — env validation rejects anything else and the appCOMMENT
LOWdocs/10-devops-infrastructure.md421COMMENT
LOWdocs/10-devops-infrastructure.md441# # (cache, rate limits, queue, WebSocket fan-out) uses it. Private CA: NODE_EXTRA_CA_CERTS in the COMMENT
LOWdocs/10-devops-infrastructure.md461# ENGINE_TYPE=baileys # whatsapp-web.js (default) | baileys; omit to use the dashboard selectionCOMMENT
LOWdocs/10-devops-infrastructure.md481# API_MASTER_KEY=COMMENT
LOWdocs/10-devops-infrastructure.md501# used when Redis rejects an enqueue is not capped. Queued, it applies to every job attemptCOMMENT
LOWdashboard/src/a11y-controls.test.ts1import { test } from 'node:test';COMMENT
LOWdashboard/src/a11y-controls.test.ts21// `className="toggle-switch toggle-switch-sm"` modifier fell out of the sweep; `accept="image/*"`COMMENT
LOWdashboard/src/utils/reloadCoalescer.ts1// Single-flight reloads with one trailing run: while a reload is out, every call shares ONE follow-upCOMMENT
LOWdashboard/src/utils/sessionActions.ts1// Which lifecycle actions a session card offers, extracted for direct unit testing (dashboard testsCOMMENT
LOWdashboard/src/utils/sessionActions.ts21COMMENT
LOWdashboard/src/utils/mediaUpload.ts1// Client pre-check before base64-encoding an upload. Aligned with the default request-body limit: base64COMMENT
LOWdashboard/src/utils/phoneCountry.ts1// The country a phone number dials into, for a flag beside it. Like formatPhone, this reads the E.164COMMENT
LOWdashboard/src/components/chats/ChatThread.tsx161 ? stops[stops.length - 1]COMMENT
224 more matches not shown…
Magic Placeholder Names15 hits · 98 pts
SeverityFileLineSnippetContext
HIGHREADME.md196`YOUR_API_KEY`. Later boots log only a masked prefix. See [API Key](docs/README.md#api-key).CODE
HIGH⚡README.md356Replace `YOUR_API_KEY` with your admin key (see [Quick Start](#-quick-start) for where to find it).CODE
HIGH⚡README.md363 -H "X-API-Key: YOUR_API_KEY" \CODE
HIGH⚡README.md372 -H "X-API-Key: YOUR_API_KEY"CODE
HIGH⚡README.md376 -H "X-API-Key: YOUR_API_KEY"CODE
HIGH⚡README.md384 -H "X-API-Key: YOUR_API_KEY" \CODE
HIGHREADME.md396 -H "X-API-Key: YOUR_API_KEY" \CODE
HIGHREADME.md429 "headers": { "Authorization": "Bearer YOUR_API_KEY" }CODE
HIGHdocs/24-mcp-integration.md252(gitignored; replace `YOUR_API_KEY` with a dedicated key scoped to the sessions the agentCODE
HIGHdocs/24-mcp-integration.md263 "headers": { "Authorization": "Bearer YOUR_API_KEY" }CODE
HIGH⚡docs/README.md142 -H "X-API-Key: your-api-key" \CODE
HIGH⚡docs/README.md148 -H "X-API-Key: your-api-key"CODE
HIGH⚡docs/README.md152 -H "X-API-Key: your-api-key"CODE
HIGH⚡docs/README.md156 -H "X-API-Key: your-api-key" \CODE
HIGHdocs/README.md167 extraHeaders: { 'X-API-Key': 'your-api-key' },CODE
Unused Imports74 hits · 74 pts
SeverityFileLineSnippetContext
LOWsdk/python/tests/conftest.py8CODE
LOWsdk/python/tests/test_webhook.py3CODE
LOWsdk/python/tests/test_sdk.py3CODE
LOWsdk/python/openwa/webhook.py3CODE
LOWsdk/python/openwa/_http.py10CODE
LOWsdk/python/openwa/_http.py18CODE
LOWsdk/python/openwa/client.py28CODE
LOWsdk/python/openwa/client.py31CODE
LOWsdk/python/openwa/client.py37CODE
LOWsdk/python/openwa/__init__.py27CODE
LOWsdk/python/openwa/__init__.py29CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py30CODE
LOWsdk/python/openwa/__init__.py42CODE
LOWsdk/python/openwa/types.py11CODE
LOWsdk/python/openwa/types.py13CODE
LOWsdk/python/openwa/errors.py11CODE
LOWsdk/python/openwa/resources/catalog.py10CODE
LOWsdk/python/openwa/resources/catalog.py25CODE
LOWsdk/python/openwa/resources/labels.py8CODE
LOWsdk/python/openwa/resources/labels.py16CODE
LOWsdk/python/openwa/resources/sessions.py6CODE
LOWsdk/python/openwa/resources/sessions.py27CODE
LOWsdk/python/openwa/resources/media.py6CODE
LOWsdk/python/openwa/resources/media.py14CODE
LOWsdk/python/openwa/resources/contacts.py6CODE
LOWsdk/python/openwa/resources/contacts.py22CODE
LOWsdk/python/openwa/resources/health.py6CODE
LOWsdk/python/openwa/resources/health.py13CODE
LOWsdk/python/openwa/resources/profile.py6CODE
LOWsdk/python/openwa/resources/profile.py19CODE
LOWsdk/python/openwa/resources/__init__.py7CODE
LOWsdk/python/openwa/resources/__init__.py9CODE
LOWsdk/python/openwa/resources/__init__.py10CODE
LOWsdk/python/openwa/resources/__init__.py11CODE
LOWsdk/python/openwa/resources/__init__.py12CODE
LOWsdk/python/openwa/resources/__init__.py13CODE
LOWsdk/python/openwa/resources/__init__.py14CODE
LOWsdk/python/openwa/resources/__init__.py15CODE
LOWsdk/python/openwa/resources/__init__.py16CODE
LOWsdk/python/openwa/resources/__init__.py17CODE
LOWsdk/python/openwa/resources/__init__.py18CODE
LOWsdk/python/openwa/resources/__init__.py19CODE
LOWsdk/python/openwa/resources/__init__.py20CODE
LOWsdk/python/openwa/resources/__init__.py21CODE
LOWsdk/python/openwa/resources/__init__.py22CODE
LOWsdk/python/openwa/resources/__init__.py23CODE
LOWsdk/python/openwa/resources/__init__.py24CODE
LOWsdk/python/openwa/resources/groups.py6CODE
LOWsdk/python/openwa/resources/groups.py27CODE
LOWsdk/python/openwa/resources/templates.py6CODE
LOWsdk/python/openwa/resources/templates.py14CODE
14 more matches not shown…
Hallucination Indicators6 hits · 60 pts
SeverityFileLineSnippetContext
CRITICAL…ules/takeover/session-takeover-failed-adoption.spec.ts215 const announced = b.events.emitSessionStatus.mock.calls.filter(CODE
CRITICALsrc/modules/session/session-push-name-sync.spec.ts90 expect(f.hooks.execute.mock.calls.filter(([hook]) => hook === 'session:ready')).toHaveLength(1);CODE
CRITICALsrc/modules/session/session-delete-claim.spec.ts431 expect(a.hooks.execute.mock.calls.some(([event]: [string]) => event === 'session:starting')).toBe(false);CODE
CRITICALsrc/modules/session/session-delete-claim.spec.ts498 expect(a.hooks.execute.mock.calls.some(([event]: [string]) => event === 'session:starting')).toBe(false);CODE
CRITICALsrc/modules/session/session-delete-claim.spec.ts2844 expect(a.hooks.execute.mock.calls.some(([event]) => event === 'session:deleted')).toBe(false);CODE
CRITICALsrc/engine/adapters/baileys.adapter.spec.ts7653 fakeSock.authState.keys.set.mock.calls.filter(CODE
Fake / Example Data57 hits · 58 pts
SeverityFileLineSnippetContext
LOWopenapi.json1457 "pushName": "John Doe",CODE
LOWopenapi.json18976 "example": "John Doe",CODE
LOWdocs/06-api-specification.md2159{ "chatId": "628123456789@c.us", "contactName": "John Doe", "contactNumber": "628987654321" }CODE
LOWdocs/06-api-specification.md2551 "name": "Jane Doe",CODE
LOWdocs/06-api-specification.md2589 "name": "Jane Doe",CODE
LOWdocs/06-api-specification.md2668 "name": "Jane Doe",CODE
LOWdocs/07-api-collection.md505 -d '{ "chatId": "628123456789@c.us", "contactName": "John Doe", "contactNumber": "628987654321" }'CODE
LOWdashboard/src/a11y-controls.test.ts372 attr(node, 'placeholder') !== undefined ||CODE
LOWdashboard/src/i18n/locales/tr.json450 "placeholder": "ör. pazarlama-botu",CODE
LOWdashboard/src/i18n/locales/tr.json1445 "placeholder": "Mesajlarda ara…",CODE
LOWdashboard/src/i18n/locales/de.json450 "placeholder": "z. B. marketing-bot",CODE
LOWdashboard/src/i18n/locales/de.json1445 "placeholder": "Nachrichten durchsuchen…",CODE
LOWdashboard/src/i18n/locales/zh-CN.json450 "placeholder": "例如:marketing-bot",CODE
LOWdashboard/src/i18n/locales/zh-CN.json1445 "placeholder": "搜索消息…",CODE
LOWdashboard/src/i18n/locales/en.json450 "placeholder": "e.g., marketing-bot",CODE
LOWdashboard/src/i18n/locales/en.json963 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/en.json1445 "placeholder": "Search messages…",CODE
LOWdashboard/src/i18n/locales/zh-HK.json450 "placeholder": "例如:marketing-bot",CODE
LOWdashboard/src/i18n/locales/zh-HK.json1445 "placeholder": "搜尋訊息…",CODE
LOWdashboard/src/i18n/locales/it.json455 "placeholder": "es., marketing-bot",CODE
LOWdashboard/src/i18n/locales/it.json969 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/it.json1454 "placeholder": "Cerca messaggi…",CODE
LOWdashboard/src/i18n/locales/fr.json455 "placeholder": "ex : marketing-bot",CODE
LOWdashboard/src/i18n/locales/fr.json969 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/fr.json1454 "placeholder": "Rechercher des messages…",CODE
LOWdashboard/src/i18n/locales/hi.json450 "placeholder": "उदा. marketing-bot",CODE
LOWdashboard/src/i18n/locales/hi.json963 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/hi.json1445 "placeholder": "संदेश खोजें…",CODE
LOWdashboard/src/i18n/locales/pt-BR.json455 "placeholder": "ex.: bot-marketing",CODE
LOWdashboard/src/i18n/locales/pt-BR.json919 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/pt-BR.json1454 "placeholder": "Pesquisar mensagens…",CODE
LOWdashboard/src/i18n/locales/ko.json450 "placeholder": "예: marketing-bot",CODE
LOWdashboard/src/i18n/locales/ko.json1445 "placeholder": "메시지 검색…",CODE
LOWdashboard/src/i18n/locales/he.json461 "placeholder": "לדוגמה: marketing-bot",CODE
LOWdashboard/src/i18n/locales/he.json1464 "placeholder": "חיפוש הודעות…",CODE
LOWdashboard/src/i18n/locales/te.json450 "placeholder": "ఉదాహరణకు, marketing-bot",CODE
LOWdashboard/src/i18n/locales/te.json963 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/te.json1445 "placeholder": "సందేశాలను శోధించండి…",CODE
LOWdashboard/src/i18n/locales/id.json450 "placeholder": "mis. marketing-bot",CODE
LOWdashboard/src/i18n/locales/id.json1445 "placeholder": "Cari pesan…",CODE
LOWdashboard/src/i18n/locales/es.json455 "placeholder": "ej., bot-marketing",CODE
LOWdashboard/src/i18n/locales/es.json919 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/es.json1454 "placeholder": "Buscar mensajes…",CODE
LOWdashboard/src/i18n/locales/ar.json471 "placeholder": "مثال: marketing-bot",CODE
LOWdashboard/src/i18n/locales/ar.json988 "contactNamePlaceholder": "Jane Doe",CODE
LOWdashboard/src/i18n/locales/ar.json1482 "placeholder": "ابحث في الرسائل…",CODE
LOWdashboard/src/pages/Chats.test.ts4407 document.activeElement?.getAttribute('placeholder'),CODE
LOWdashboard/src/pages/Chats.test.ts4723 document.activeElement?.getAttribute('placeholder') ?? 'body',CODE
LOWdashboard/src/pages/Chats.test.ts4751 return document.activeElement?.getAttribute('placeholder') ?? 'body';CODE
LOWsrc/modules/message/bulk-message.service.spec.ts840 repo.findOne.mockResolvedValue(imageBatch('https://cdn.example.com/{{name}}.jpg', { name: 'John Doe' }));CODE
LOW⚡src/modules/message/message-send.service.spec.ts1141 contactName: 'John Doe',CODE
LOW⚡src/modules/message/message-send.service.spec.ts1148 expect.objectContaining({ name: 'John Doe', number: '+628123456789' }),CODE
LOWsrc/modules/search/search-terms.spec.ts12 expect(searchTermCount('user@example.com')).toBe(3);CODE
LOWsrc/modules/session/session.controller.ts442 pushName: 'John Doe',CODE
LOWsrc/modules/session/dto/session-response.dto.ts50 @ApiPropertyOptional({ type: String, example: 'John Doe', nullable: true })CODE
LOWsrc/engine/adapters/baileys.adapter.spec.ts1897 await adapter.sendContactMessage('628111@s.whatsapp.net', { name: 'John Doe', number: '+1 234-567' });CODE
LOWsrc/engine/adapters/baileys.adapter.spec.ts1902 expect(call.contacts.displayName).toBe('John Doe');CODE
Structural Annotation Overuse24 hits · 50 pts
SeverityFileLineSnippetContext
LOW⚡docs/14-migration-guide.md97# Step 1: Export all Data DB tablesCOMMENT
LOW⚡docs/14-migration-guide.md101# Step 2: Change the database configurationCOMMENT
LOW⚡docs/14-migration-guide.md111# Step 3: Restart with the new configuration (.env route)COMMENT
LOW⚡docs/14-migration-guide.md114# Step 4: Import data to new databaseCOMMENT
LOW⚡docs/14-migration-guide.md258# Step 1: Check current storage file countCOMMENT
LOW⚡docs/14-migration-guide.md265# Step 2: Export all files as tar.gzCOMMENT
LOW⚡docs/14-migration-guide.md275# Step 3: Change the storage configurationCOMMENT
LOW⚡docs/14-migration-guide.md374# Step 1: Read both queues' depth from Bull Board's JSON route. Bull Board takes an ADMIN key only inCOMMENT
LOW⚡docs/14-migration-guide.md380# Step 2: Wait until waiting, active and delayed are 0 for both webhook-queue and ingress-queueCOMMENT
LOW⚡docs/14-migration-guide.md387# Step 3: Change Redis configurationCOMMENT
LOW⚡docs/14-migration-guide.md390# Step 4: Restart applicationCOMMENT
LOW⚡docs/14-migration-guide.md622# Step 1: Stop OpenWACOMMENT
LOW⚡docs/14-migration-guide.md625# Step 2: Backup current data (both databases + session auth + media)COMMENT
LOW⚡docs/14-migration-guide.md628# Step 3: Point OpenWA at PostgreSQL in the project's .env. docker-compose.dev.yml forwards theseCOMMENT
LOW⚡docs/14-migration-guide.md639# Step 4: Start OpenWA once so its migrations create the schema the script writes into, then stop itCOMMENT
LOW⚡docs/14-migration-guide.md644# Step 5: Copy the rows. Save the "Migration Script (Legacy)" example above asCOMMENT
LOW⚡docs/14-migration-guide.md650# Step 6: Verify migrationCOMMENT
LOW⚡docs/14-migration-guide.md654# Step 7: Start with PostgreSQLCOMMENT
LOW⚡docs/14-migration-guide.md657# Step 8: Verify functionalityCOMMENT
LOWdocs/14-migration-guide.md287# Step 4: Restart with the new configuration (.env route)COMMENT
LOWdocs/14-migration-guide.md290# Step 5: Import files to new storageCOMMENT
LOWdashboard/src/utils/messageFormatter.ts56 // Step 1: peel off code segments, emit nodes between them.COMMENT
LOW⚡src/common/docs-governance.spec.ts279 const step1 = between(guide, '# Step 1: Check current storage file count', '# Step 2').replace(/\s+/g, ' ');CODE
LOW⚡src/common/docs-governance.spec.ts283 const step2 = between(guide, '# Step 2: Export all files as tar.gz', '# Step 3').replace(/\s+/g, ' ');CODE
Cross-Language Confusion2 hits · 15 pts
SeverityFileLineSnippetContext
HIGHsdk/python/tests/test_sdk.py692 # Known-negative control: without it an implementation that always emitted the key — as null,COMMENT
HIGHsdk/python/openwa/types.py1509# provider returns waMessageId/snippet as "" when absent (always str, never null);COMMENT
Modern AI Meta-Vocabulary4 hits · 12 pts
SeverityFileLineSnippetContext
MEDIUMdocker-compose.yml30 # datastore orchestration (Dashboard > Infrastructure built-in toggles), disableCOMMENT
MEDIUMdocker-compose.yml35 # DockerService then reports Docker unavailable and orchestration degrades gracefully.COMMENT
MEDIUMdocker-compose.yml535 # Pin explicit volume names so the compose path and the Docker-API orchestration path (which usesCOMMENT
MEDIUMscripts/smoke-test-docker-proxy.sh43# the proxy admits what orchestration needs is checked from inside openwa-api below.COMMENT
Empty Error Handlers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHsdk/python/openwa/client.py78except Exception:CODE
Verbosity Indicators3 hits · 4 pts
SeverityFileLineSnippetContext
LOWdashboard/src/utils/messageFormatter.ts56 // Step 1: peel off code segments, emit nodes between them.COMMENT
LOW⚡src/common/docs-governance.spec.ts279 const step1 = between(guide, '# Step 1: Check current storage file count', '# Step 2').replace(/\s+/g, ' ');CODE
LOW⚡src/common/docs-governance.spec.ts283 const step2 = between(guide, '# Step 2: Export all files as tar.gz', '# Step 3').replace(/\s+/g, ' ');CODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMdashboard/src/components/chats/ChatThread.test.ts1390// The button is a child of the scroller. Absolutely positioned there it moves with the content, which put itCOMMENT
Example Usage Blocks2 hits · 3 pts
SeverityFileLineSnippetContext
LOWscripts/restore.sh9# Usage:COMMENT
LOWscripts/backup.sh23# Usage:COMMENT
Modern Structural Boilerplate2 hits · 2 pts
SeverityFileLineSnippetContext
LOWsdk/python/openwa/__init__.py44__all__ = [CODE
LOWsdk/python/openwa/resources/__init__.py26__all__ = [CODE
Excessive Try-Catch Wrapping1 hit · 1 pts
SeverityFileLineSnippetContext
LOWsdk/python/openwa/client.py78 except Exception:CODE