AI Slop Code RIsk Monitor

postalserver/postal

📮 A fully featured open source mail delivery platform for incoming & outgoing e-mail

5.2 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for postalserver/postal, a Ruby project with 16,859 GitHub stars. SynthScan examined 29,281 lines of code across 369 source files, recording 126 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 5.2 (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.

5.2
Adjusted Signal
5.2
Raw Pattern Score
100%
Time Factor
2026-10-06
Last Push
16.9K
Stars
Ruby
Language
29.3K
Lines of Code
369
Files
126
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 22.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.7/100 · LOW

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

Agent Over-Engineering Ratio 4.0/100 · LOW

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

PR Review Velocity Impact 22.6/100 · LOW

Which changes need focused human review? 126 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 0HIGH 0MEDIUM 12LOW 114

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 126 distinct pattern matches across 5 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.

Over-Commented Block85 hits · 85 pts
SeverityFileLineSnippetContext
LOW.rubocop.yml21# There should always be empty lines inside a class. For exampleCOMMENT
LOW.rubocop.yml101Lint/BooleanSymbol:COMMENT
LOWapp/models/user_invite.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/organization_user.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/track_domain.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/credential.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/smtp_endpoint.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/ip_address.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/ip_pool_rule.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/address_endpoint.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/http_endpoint.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/webhook_event.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/worker_role.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/organization.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/route.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/queued_message.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/webhook.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/ip_pool.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/webhook_request.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/domain.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/domain.rb21# return_path_error :string(255)COMMENT
LOWapp/models/organization_ip_pool.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/scheduled_task.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/server.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/server.rb21# send_limit :integerCOMMENT
LOWapp/models/user.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/additional_route_endpoint.rb1# frozen_string_literal: trueCOMMENT
LOWapp/models/concerns/has_locking.rb1# frozen_string_literal: trueCOMMENT
LOWapp/senders/smtp_sender.rb161 # Return an array of server hostnames which should receive this messageCOMMENT
LOWapp/lib/worker/process.rb1# frozen_string_literal: trueCOMMENT
LOWapp/controllers/legacy_api/messages_controller.rb1# frozen_string_literal: trueCOMMENT
LOWapp/controllers/legacy_api/base_controller.rb1# frozen_string_literal: trueCOMMENT
LOWapp/controllers/legacy_api/send_controller.rb21 #COMMENT
LOWapp/assets/config/manifest.js1//= link_tree ../imagesCOMMENT
LOWconfig/locales/en.yml1# Files in the config/locales directory are used for internationalizationCOMMENT
LOWconfig/environments/production.rb21 config.public_file_server.enabled = trueCOMMENT
LOWconfig/environments/development.rb41COMMENT
LOWconfig/initializers/application_controller_renderer.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/backtrace_silencers.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/mime_types.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/wrap_parameters.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/assets.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/permissions_policy.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/content_security_policy.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/content_security_policy.rb21# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }COMMENT
LOWconfig/initializers/inflections.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb1# frozen_string_literal: trueCOMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb21# Changing this default means invalidate all encrypted messages generated byCOMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb41# and asynchronous queries will then be enabled.COMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb61# regardless of whether they have a default or not.COMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb81#COMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb101# and you have no plans to rollback.COMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb121#COMMENT
LOWconfig/initializers/new_framework_defaults_7_0.rb141# See https://guides.rubyonrails.org/configuring.html#config-active-support-disable-to-s-conversion for more informationCOMMENT
LOWspec/models/server_spec.rb1# frozen_string_literal: trueCOMMENT
LOWspec/models/server_spec.rb21# send_limit :integerCOMMENT
LOWspec/models/queued_message_spec.rb1# frozen_string_literal: trueCOMMENT
LOWspec/models/organization_spec.rb1# frozen_string_literal: trueCOMMENT
LOWspec/models/domain_spec.rb1# frozen_string_literal: trueCOMMENT
LOWspec/models/domain_spec.rb21# return_path_error :string(255)COMMENT
25 more matches not shown…
Self-Referential Comments12 hits · 36 pts
SeverityFileLineSnippetContext
MEDIUMapp/senders/smtp_sender.rb212 # Create a new result objectCOMMENT
MEDIUMapp/lib/smtp_server/server.rb102 # Create a hash to contain a buffer for each client.COMMENT
MEDIUMconfig/initializers/wrap_parameters.rb5# This file contains settings for ActionController::ParamsWrapper whichCOMMENT
MEDIUMconfig/initializers/permissions_policy.rb2# Define an application-wide HTTP permissions policy. For furtherCOMMENT
MEDIUMconfig/initializers/content_security_policy.rb4# Define an application-wide content security policy.COMMENT
MEDIUMlib/postal/signer.rb7 # Create a new SignerCOMMENT
MEDIUMlib/postal/message_db/provisioner.rb55 # Create a new tableCOMMENT
MEDIUMlib/postal/message_db/message.rb351 # Create a new item in the message queue for this messageCOMMENT
MEDIUMlib/postal/message_db/message.rb487 # Create a new linkCOMMENT
MEDIUMlib/postal/message_db/database.rb62 # Create a new message with the given attributes. This won't be saved to the databaseCOMMENT
MEDIUMdb/schema.rb1# This file is auto-generated from the current state of the database. InsteadCOMMENT
MEDIUMdb/schema.rb5# This file is the source Rails uses to define your schema when running `bin/railsCOMMENT
Hyper-Verbose Identifiers22 hits · 24 pts
SeverityFileLineSnippetContext
LOW⚡app/util/has_prometheus_metrics.rb5 def register_prometheus_counter(name, **kwargs)CODE
LOW⚡app/util/has_prometheus_metrics.rb10 def register_prometheus_histogram(name, **kwargs)CODE
LOW⚡app/util/has_prometheus_metrics.rb15 def increment_prometheus_counter(name, labels: {})CODE
LOW⚡app/util/has_prometheus_metrics.rb22 def observe_prometheus_histogram(name, time, labels: {})CODE
LOWapp/mailers/app_mailer.rb18 def server_send_limit_approaching(server)CODE
LOWapp/mailers/app_mailer.rb23 def server_send_limit_exceeded(server)CODE
LOWapp/models/server.rb223 def authenticated_domain_for_address(address)CODE
LOWapp/models/server.rb251 def find_authenticated_domain_from_headers(headers)CODE
LOWapp/models/concerns/has_authentication.rb29 def authenticate_with_previous_password_first(unencrypted_password)CODE
LOWapp/senders/smtp_sender.rb87 def send_message_to_smtp_client(raw_message, mail_from, rcpt_to, retry_on_connection_error: true)CODE
LOWapp/senders/smtp_sender.rb139 def determine_mail_from_for_message(message)CODE
LOWapp/senders/smtp_sender.rb155 def determine_rcpt_to_for_message(message)CODE
LOWapp/controllers/application_controller.rb50 def redirect_to_with_return_to(url, *args)CODE
LOWapp/helpers/application_helper.rb28 def domain_options_for_select(server, selected_domain = nil, options = {})CODE
LOWapp/helpers/application_helper.rb53 def endpoint_options_for_select(server, selected_value = nil, options = {})CODE
LOWspec/helpers/general_helpers.rb5 def create_plain_text_message(server, text, to = "test@example.com", override_attributes = {})CODE
LOWlib/tracking_middleware.rb61 def dispatch_redirect_request(request, server_token, link_token)CODE
LOWlib/tracking_middleware.rb101 def get_message_db_from_server_token(token)CODE
LOWlib/postal/config_schema.rb631 def substitute_config_file_root(string)CODE
LOWlib/postal/config.rb150 def change_database_connection_pool_size(new_size)CODE
LOWlib/postal/message_db/provisioner.rb114 def remove_raw_tables_older_than(max_age = 30)CODE
LOWlib/postal/message_db/provisioner.rb147 def remove_raw_tables_until_less_than_size(size)CODE
Redundant / Tautological Comments3 hits · 4 pts
SeverityFileLineSnippetContext
LOWapp/lib/smtp_server/server.rb171 # Increment prometheusCOMMENT
LOWconfig/environments/production.rb58 # Set this to true and configure the email server for immediate delivery to raise delivery errors.COMMENT
LOWlib/postal/message_db/message.rb529 # Return the resultCOMMENT
Fake / Example Data4 hits · 4 pts
SeverityFileLineSnippetContext
LOWspec/models/domain_spec.rb360 "admin@example.com",CODE
LOWspec/models/user_spec.rb95 expect(user.name).to eq "John Doe"CODE
LOWspec/factories/organization_factory.rb28 name { "Acme Inc" }CODE
LOWspec/lib/smtp_server/client/data_spec.rb64 expect(client.headers["from"]).to eq ["test@test.com"]CODE