Create agents that monitor and act on your behalf. Your agents are standing by!
This report summarizes scanner evidence for huginn/huginn, a Ruby project with 50,231 GitHub stars. SynthScan examined 64,425 lines of code across 586 source files, recording 95 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 2.0 (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? 76 finding(s).
Are imports declared and package/API names verified? 19 finding(s).
Are wrappers, guards, and repeated structures necessary? 20 finding(s).
Which changes need focused human review? 95 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 95 distinct pattern matches across 9 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 | app/controllers/web_requests_controller.rb | 1 | # This controller is designed to allow your Agents to receive cross-site Webhooks (POSTs), or to output data streams. | COMMENT |
| LOW | app/assets/config/manifest.js | 1 | //= link_tree ../images | COMMENT |
| LOW | app/assets/javascripts/application.js | 1 | //= require jquery2 | COMMENT |
| LOW | app/concerns/liquid_interpolatable.rb | 21 | errors.add(:options, "has an error with Liquid templating: #{e.message}") | COMMENT |
| LOW | app/concerns/liquid_interpolatable.rb | 41 | end | COMMENT |
| LOW | app/concerns/liquid_interpolatable.rb | 301 | # It can be used as a JSONPath replacement for Agents that only support Liquid: | COMMENT |
| LOW | app/concerns/liquid_interpolatable.rb | 361 | "t" => "\t", | COMMENT |
| LOW | app/concerns/liquid_interpolatable.rb | 441 | # variable `match` is set for each iteration, which can be used as | COMMENT |
| LOW | config/environments/production.rb | 41 | COMMENT | |
| LOW | config/environments/production.rb | 121 | COMMENT | |
| LOW | config/environments/production.rb | 141 | # these configuration options. | COMMENT |
| LOW | config/initializers/application_controller_renderer.rb | 1 | # Be sure to restart your server when you modify this file. | COMMENT |
| LOW | config/initializers/backtrace_silencers.rb | 1 | # Be sure to restart your server when you modify this file. | COMMENT |
| LOW | config/initializers/mime_types.rb | 1 | # Be sure to restart your server when you modify this file. | COMMENT |
| LOW | config/initializers/wrap_parameters.rb | 1 | # Be sure to restart your server when you modify this file. | COMMENT |
| LOW | config/initializers/devise.rb | 21 | # ==> ORM configuration | COMMENT |
| LOW | config/initializers/devise.rb | 41 | # The same considerations mentioned for authentication_keys also apply to request_keys. | COMMENT |
| LOW | config/initializers/devise.rb | 61 | # It can be set to an array that will enable http authentication only for the | COMMENT |
| LOW | config/initializers/devise.rb | 81 | # may want to disable generating routes to Devise's sessions controller by | COMMENT |
| LOW | config/initializers/devise.rb | 101 | COMMENT | |
| LOW | config/initializers/devise.rb | 161 | # The time you want to timeout the user session without activity. After this | COMMENT |
| LOW | config/initializers/devise.rb | 181 | # Number of authentication tries before locking an account if lock_strategy | COMMENT |
| LOW | config/initializers/devise.rb | 201 | # ==> Configuration for :encryptable | COMMENT |
| LOW | config/initializers/devise.rb | 221 | # Set this configuration to false if you want /users/sign_out to sign out | COMMENT |
| LOW | config/initializers/devise.rb | 321 | # end | COMMENT |
| LOW | config/initializers/permissions_policy.rb | 1 | # Define an application-wide HTTP permissions policy. For further | COMMENT |
| LOW | config/initializers/content_security_policy.rb | 1 | # Be sure to restart your server when you modify this file. | COMMENT |
| LOW | config/initializers/content_security_policy.rb | 21 | COMMENT | |
| LOW | config/initializers/inflections.rb | 1 | # Be sure to restart your server when you modify this file. | COMMENT |
| LOW | spec/spec_helper.rb | 1 | # This file was generated by the `rails generate rspec:install` command. Conventionally, all | COMMENT |
| LOW | spec/spec_helper.rb | 21 | # This option will default to `true` in RSpec 4. It makes the `description` | COMMENT |
| LOW | spec/spec_helper.rb | 41 | # have no way to turn it off -- the option exists only for backwards | COMMENT |
| LOW | spec/spec_helper.rb | 61 | COMMENT | |
| LOW | spec/spec_helper.rb | 81 | COMMENT | |
| LOW | spec/rails_helper.rb | 41 | # instead of true. | COMMENT |
| LOW | spec/support/fake_mqtt_server.rb | 1 | #!/usr/bin/env ruby | COMMENT |
| LOW | public/robots.txt | 1 | # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file | COMMENT |
| LOW | lib/jsonpath_safety.rb | 1 | # Adapted from jsonpath 1.1.5's Dig and Parser under the MIT License: | COMMENT |
| LOW | lib/capistrano/sync.rb | 1 | require 'yaml' | COMMENT |
| LOW | db/migrate/20120728210244_devise_create_users.rb | 21 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/importers/scenario_import.rb | 247 | def translate_keep_events_for(old_value) | CODE |
| LOW⚡ | app/models/agents/attribute_difference_agent.rb | 90 | def calculate_integer_difference(new_value) | CODE |
| LOW⚡ | app/models/agents/attribute_difference_agent.rb | 96 | def calculate_decimal_difference(new_value, dec_pre) | CODE |
| LOW⚡ | app/models/agents/attribute_difference_agent.rb | 102 | def calculate_percentage_change(new_value, dec_pre) | CODE |
| LOW | app/controllers/application_controller.rb | 36 | def filtered_agent_return_link(options = {}) | CODE |
| LOW | app/controllers/omniauth_callbacks_controller.rb | 21 | def reauthorization_service_for(provider) | CODE |
| LOW | app/controllers/web_requests_controller.rb | 79 | def normalize_redirect_target(target) | CODE |
| LOW | app/helpers/agent_helper.rb | 9 | def agent_filter_service_label(service) | CODE |
| LOW | app/helpers/agent_helper.rb | 68 | def agent_dry_run_with_event_mode(agent) | CODE |
| LOW | app/helpers/jobs_helper.rb | 13 | def relative_distance_of_time_in_words(time) | CODE |
| LOW | app/helpers/application_helper.rb | 128 | def user_omniauth_authorize_path(provider) | CODE |
| LOW | app/concerns/file_handling.rb | 70 | def file_pointer_signature_payload(pointer) | CODE |
| LOW | app/concerns/json_serialized_field.rb | 107 | def configure_json_serialized_field(field) | CODE |
| LOW | app/concerns/markdown_class_attributes.rb | 5 | def markdown_class_attributes(*attributes) | CODE |
| LOW | spec/models/agents/s3_agent_spec.rb | 231 | def expect_file_pointer_event(file, event_type = nil) | CODE |
| LOW | spec/models/agents/ftpsite_agent_spec.rb | 278 | def expect_file_pointer_event(event, payload) | CODE |
| LOW | lib/utils.rb | 74 | def escape_uri_unsafe_characters(string) | CODE |
| LOW | …0525150140_migrate_agents_to_service_authentication.rb | 14 | def twitter_oauth_token_secret(agent) | CODE |
| LOW | …29000000_retire_coffeescript_from_javascript_agents.rb | 41 | def each_legacy_coffeescript_agent(&) | CODE |
| LOW | …29000000_retire_coffeescript_from_javascript_agents.rb | 54 | def credential_referenced_by_code(code) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/models/agents/website_agent.rb | 82 | "title": "Lorem ipsum 1", | CODE |
| LOW⚡ | app/models/agents/website_agent.rb | 87 | "title": "Lorem ipsum 2", | CODE |
| LOW⚡ | app/models/agents/website_agent.rb | 92 | "title": "Lorem ipsum 3", | CODE |
| LOW⚡ | app/models/agents/website_agent.rb | 113 | "title": "Lorem ipsum 1", | CODE |
| LOW⚡ | app/models/agents/website_agent.rb | 117 | "title": "Lorem ipsum 2", | CODE |
| LOW⚡ | app/models/agents/website_agent.rb | 121 | "title": "Lorem ipsum 3", | CODE |
| LOW⚡ | spec/features/admin_users_spec.rb | 33 | fill_in 'Email', with: 'test@test.com' | CODE |
| LOW⚡ | spec/features/admin_users_spec.rb | 39 | expect(page).to have_text('test@test.com') | CODE |
| LOW⚡ | spec/features/admin_users_spec.rb | 44 | fill_in 'Email', with: 'test@test.com' | CODE |
| LOW | spec/models/agents/event_formatting_agent_spec.rb | 39 | :text => "Some Lorem Ipsum", | CODE |
| LOW | spec/models/agents/event_formatting_agent_spec.rb | 54 | :text => "Some Lorem Ipsum 2", | CODE |
| LOW | spec/models/agents/event_formatting_agent_spec.rb | 81 | expect(Event.last.payload[:message]).to eq("Received Some Lorem Ipsum from somevalue .") | CODE |
| LOW | spec/models/agents/rss_agent_spec.rb | 338 | "John Doe" | CODE |
| LOW | spec/models/agents/rss_agent_spec.rb | 403 | "authors" => ["Jane Doe"], | CODE |
| LOW | spec/models/agents/rss_agent_spec.rb | 429 | "authors" => ["Jane Doe"], | CODE |
| LOW | spec/models/agents/rss_agent_spec.rb | 454 | "authors" => ["John Doe"], | CODE |
| LOW | db/seeds/seeder.rb | 12 | user = User.find_or_initialize_by(:email => ENV['SEED_EMAIL'].presence || "admin@example.com") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/concerns/liquid_interpolatable.rb | 32 | # # Create a new scope to define variables in: | COMMENT |
| MEDIUM | config/initializers/wrap_parameters.rb | 3 | # This file contains settings for ActionController::ParamsWrapper which | COMMENT |
| MEDIUM | config/initializers/permissions_policy.rb | 1 | # Define an application-wide HTTP permissions policy. For further | COMMENT |
| MEDIUM | config/initializers/content_security_policy.rb | 3 | # Define an application-wide content security policy | COMMENT |
| MEDIUM | spec/support/fake_mqtt_server.rb | 34 | # Create a new fake MQTT server | COMMENT |
| MEDIUM | spec/data_fixtures/jira.json | 1 | {"expand":"schema,names","startAt":0,"maxResults":50,"total":50,"issues":[{"expand":"editmeta,renderedFields,transitions | CODE |
| MEDIUM | doc/deployment/backup/example_backup.rb | 1 | # This file contains an example template for using the Backup gem for backing up your Huginn installation to S3. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/models/agents/aftership_agent.rb | 25 | * `api_key` - YOUR_API_KEY. | COMMENT |
| HIGH | app/models/agents/aftership_agent.rb | 90 | 'api_key' => 'YOUR_API_KEY', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/agents/webhook_agent.rb | 36 | * `recaptcha_secret` - Setting this to a reCAPTCHA "secret" key makes your agent verify incoming requests with r | COMMENT |
| MEDIUM | bin/decrypt_backup.rb | 3 | # If you're using the backup gem, described on the Huginn wiki and at doc/deployment/backup, then you can use this | COMMENT |
| MEDIUM | spec/spec_helper.rb | 48 | # with RSpec, but feel free to customize to your heart's content. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/concerns/liquid_interpolatable.rb | 320 | # Example usage: | COMMENT |
| LOW | app/concerns/liquid_interpolatable.rb | 458 | # Example usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config/application.rb | 62 | # Set LOCALE to use another locale provided by a translation gem. | COMMENT |
| LOW | config/environments/production.rb | 83 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/agents/website_agent.rb | 65 | You can also use [XPath functions](https://www.w3.org/TR/xpath/#section-String-Functions) like `normalize-space` t | CODE |
| LOW | lib/utils.rb | 127 | # Output JSON that is ready for inclusion into HTML. If you simply use to_json on an object, the | COMMENT |