{
  "llm": {
    "conf": 0.035179187,
    "grade": "benign",
    "model": "Qwen/Qwen3.8-27B",
    "outcome": "benign",
    "interpretation": "Legitimate Ruby gem"
  },
  "ml": {
    "v": "7",
    "eng": "2.8.0",
    "lvl": -1,
    "conf": 0,
    "mods": [
      {
        "cls": 0,
        "raw": 0.05250625,
        "rte": "az",
        "prob": 0.05250625
      },
      {
        "cls": 0,
        "raw": 0.0030150216,
        "rte": "az/gem",
        "prob": 0.0030150216
      }
    ],
    "prob": 0.05250625,
    "files": [
      {
        "id": 0,
        "lvl": -1,
        "conf": 0,
        "prob": 0.05250624939799309,
        "type": "gem"
      },
      {
        "id": 1,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000029931465178378858,
        "type": "tar.gz"
      },
      {
        "id": 2,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000023186206817626953,
        "type": "ruby"
      },
      {
        "id": 3,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000014096498489379883,
        "type": "ruby"
      },
      {
        "id": 4,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000015954175978549756,
        "type": "ruby"
      },
      {
        "id": 5,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000015636285752407275,
        "type": "ruby"
      },
      {
        "id": 6,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000015189250007097144,
        "type": "ruby"
      },
      {
        "id": 7,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000013560056686401367,
        "type": "ruby"
      },
      {
        "id": 8,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000012367963790893555,
        "type": "ruby"
      },
      {
        "id": 9,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000015248854651872534,
        "type": "ruby"
      },
      {
        "id": 10,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000017722448319545947,
        "type": "ruby"
      },
      {
        "id": 31,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000012745459571306128,
        "type": "registry"
      },
      {
        "id": 32,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000012685854926530737,
        "type": "registry"
      },
      {
        "id": 33,
        "lvl": -1,
        "conf": 0,
        "prob": 0.000012745459571306128,
        "type": "registry"
      }
    ],
    "version": "v18.18",
    "analyzed_at": "2026-09-02T02:08:22Z"
  },
  "path": "hanami-utils-2.0.0.gem",
  "raw": {
    "files": [
      {
        "id": 0,
        "ctx": [
          {
            "b": "zdN/$wmoN*e[YFg00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fFCgmg=d2?fFCgmfFCfXfFA",
            "ln": 0
          }
        ],
        "mol": "H₄(Cm₂DbF₂Po₂)Md(Pa)",
        "sha": "8b6fc583a3f0f92b9e29799dc204b9f354981771c13df029ef4d7981e1e0be2f",
        "path": "hanami-utils-2.0.0.gem",
        "refs": [
          {
            "to": "pkg:gem/dry-transformer",
            "off": 0,
            "kind": "dependency"
          },
          {
            "to": "pkg:gem/concurrent-ruby",
            "off": 0,
            "kind": "dependency"
          }
        ],
        "risk": 7,
        "size": 36864,
        "type": "gem",
        "facts": {
          "metrics": {
            "gem": {
              "dependency_count": 6,
              "runtime_dependency_count": 2,
              "development_dependency_count": 4
            },
            "file": {
              "size": 36864,
              "entropy": 7.71
            },
            "binary": {
              "peak_region_bytes": 31744,
              "peak_region_entropy": 7.83
            },
            "archive": {
              "file_count": 3,
              "member_count": 3,
              "script_count": 0,
              "directory_count": 0,
              "executable_count": 0,
              "hidden_file_count": 0,
              "uncompressed_size": 33451,
              "max_filename_length": 17,
              "rtlo_filename_count": 0,
              "format.regular_count": 3,
              "nested_archive_count": 3,
              "path_traversal_count": 0,
              "symlink_escape_count": 0,
              "security.setgid_count": 0,
              "security.setuid_count": 0,
              "security.sticky_count": 0,
              "double_extension_count": 0,
              "security.symlink_count": 0,
              "unicode_filename_count": 0,
              "homoglyph_filename_count": 0,
              "timing.mtime_unique_count": 1,
              "misplaced_executable_count": 0,
              "timing.mtime_spread_seconds": 0,
              "security.world_writable_count": 0
            }
          }
        },
        "ident": {
          "name": {
            "value": "hanami-utils",
            "source": "gem.name",
            "verified": false
          },
          "urls": [
            {
              "url": "http://hanamirb.org",
              "kind": "homepage",
              "source": "gem.homepage"
            }
          ],
          "trust": "unsigned",
          "authors": [
            {
              "name": "Luca Guidi",
              "role": "author",
              "source": "gem.authors"
            }
          ],
          "version": {
            "value": "2.0.0",
            "source": "gem.version",
            "verified": false
          }
        },
        "traits": [
          {
            "id": "metadata/file/profile/language::lang-english--atom-7",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"this\""
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-3",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"that\""
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-1",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"the\""
          },
          {
            "id": "micro-behaviors/fs/directory/mkdir::ruby-fileutils-mkdir-p",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby creates a directory tree"
          },
          {
            "id": "micro-behaviors/process/interpreter/eval::ruby-class-eval",
            "atk": "T1059",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby class_eval call"
          },
          {
            "id": "micro-behaviors/fs/file/copy::ruby-fileutils-copy",
            "conf": 0.9,
            "crit": 3,
            "desc": "Copies a file with Ruby FileUtils"
          },
          {
            "id": "metadata/package/config::gemspec-name-assignment",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby gemspec assigns package name"
          },
          {
            "id": "micro-behaviors/data/source/dynamic/reflect::ruby-const-get",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby dynamically resolves a constant"
          },
          {
            "id": "micro-behaviors/communications/http/message::http-prefix",
            "conf": 0.9,
            "crit": 2,
            "desc": "HTTP protocol prefix"
          },
          {
            "id": "micro-behaviors/communications/http/url/scheme::cleartext-http-url-code-literal",
            "atk": "T1071.001",
            "mbc": "C0002",
            "conf": 0.9,
            "crit": 3,
            "desc": "Code embeds cleartext HTTP URL literal"
          },
          {
            "id": "micro-behaviors/process/create/shell/lang::ruby-subshell-command",
            "conf": 0.93,
            "crit": 3,
            "desc": "Ruby subshell command execution"
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-5",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"for\""
          },
          {
            "id": "micro-behaviors/communications/http/url/forge::public-code-forge-url",
            "conf": 0.9,
            "crit": 3,
            "desc": "References a public code-forge URL"
          },
          {
            "id": "micro-behaviors/data/source/dynamic/reflect::ruby-public-send-call",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby public_send method dispatch"
          },
          {
            "id": "micro-behaviors/data/source/dynamic/reflect::ruby-alias-method",
            "atk": "T1059",
            "conf": 0.7,
            "crit": 3,
            "desc": "Ruby rebinds a method with alias_method"
          },
          {
            "id": "micro-behaviors/communications/http/message::http-url-literal",
            "conf": 0.75,
            "crit": 2,
            "desc": "HTTP URL string literal"
          }
        ]
      },
      {
        "depth": 1,
        "facts": {
          "metrics": {
            "file": {
              "size": 32340,
              "entropy": 7.99
            },
            "parse": {
              "error_count": 1
            },
            "binary": {
              "peak_region_bytes": 32340,
              "peak_region_entropy": 7.83
            }
          }
        },
        "id": 1,
        "mol": "H₄(Cm₂DbF₂Po₂)Md(Pa)",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz",
        "pid": 0,
        "risk": 7,
        "sha": "70fbfe55f826d940c0f5decad39840990925e061de975e53d2b672fdae9873df",
        "size": 32340,
        "traits": [
          {
            "id": "micro-behaviors/data/source/dynamic/reflect::ruby-public-send-call",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby public_send method dispatch"
          },
          {
            "id": "micro-behaviors/data/source/dynamic/reflect::ruby-alias-method",
            "atk": "T1059",
            "conf": 0.7,
            "crit": 3,
            "desc": "Ruby rebinds a method with alias_method"
          },
          {
            "id": "micro-behaviors/data/source/dynamic/reflect::ruby-const-get",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby dynamically resolves a constant"
          },
          {
            "id": "micro-behaviors/process/interpreter/eval::ruby-class-eval",
            "atk": "T1059",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby class_eval call"
          },
          {
            "id": "micro-behaviors/fs/directory/mkdir::ruby-fileutils-mkdir-p",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby creates a directory tree"
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-5",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"for\""
          },
          {
            "id": "micro-behaviors/process/create/shell/lang::ruby-subshell-command",
            "conf": 0.93,
            "crit": 3,
            "desc": "Ruby subshell command execution"
          },
          {
            "id": "micro-behaviors/communications/http/message::http-url-literal",
            "conf": 0.75,
            "crit": 2,
            "desc": "HTTP URL string literal"
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-7",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"this\""
          },
          {
            "id": "micro-behaviors/fs/file/copy::ruby-fileutils-copy",
            "conf": 0.9,
            "crit": 3,
            "desc": "Copies a file with Ruby FileUtils"
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-3",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"that\""
          },
          {
            "id": "metadata/package/config::gemspec-name-assignment",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby gemspec assigns package name"
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-1",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"the\""
          },
          {
            "id": "micro-behaviors/communications/http/message::http-prefix",
            "conf": 0.9,
            "crit": 2,
            "desc": "HTTP protocol prefix"
          },
          {
            "id": "micro-behaviors/communications/http/url/forge::public-code-forge-url",
            "conf": 0.9,
            "crit": 3,
            "desc": "References a public code-forge URL"
          },
          {
            "id": "micro-behaviors/communications/http/url/scheme::cleartext-http-url-code-literal",
            "atk": "T1071.001",
            "mbc": "C0002",
            "conf": 0.9,
            "crit": 3,
            "desc": "Code embeds cleartext HTTP URL literal"
          }
        ],
        "type": "tar.gz"
      },
      {
        "ctx": [
          {
            "b": "boQPsz*C#juVQsfx(mM\u003cy?X05A:-=BaARTDwEn=Xx\u003c@hFavZ6YwIdLsAa9S{uVoB}xEC5Se?.3PvJ)uCuTDn]oHSq}dgds]pEdxQp^F5Ke{h5MxLz72c#rQbdiJ+Jy?mWeas6SRk$26Rk#Zxcx(mA%B.25Fc#rQbdgg9bADL#owGSggvqYH\u003cx!KQJx(4\u0026zC4CYnx(v(k3jopmz8%ZRAaJJ[w[+:-BzkVhe]ClAay]ykD#\u003cmrv%!RaaAIHkv\u003eIUczdK?jarR^HarR^HjS\u003e}ZvqYH\u003cx!sEHx(4\u0026m3lQEjAaJJiC4CYnx(v(iarR^HarS/\u0026nmuyAzd#3(rDI}\u003eB2(u.mn^5QpFIltaAIHkv\u003eIhjBzbPkB08OFarR^HjS)@MoM:\u0026Nav*M*wn9k[3lQEjAaJJiwO\u003e\u003c\u0026y-\u003c\u0026yarR^HarS/\u0026toW]}kM",
            "ln": 0,
            "col": 1,
            "line": 1
          },
          {
            "b": "B0p@laAIHkv\u003eI?BzeAZ4C{1jLarR^HjS\u003e}DBZ/Rsv@Dy0az2!twO#Q7z/fRsvqYP#nmuyAzd$bnBzkM9Bzkrca{]CnB8UY2e[/fuwPh6\u003cwGS9rarR^\u0026ar\u003eGvBz%n]fka^ivqP.0vLhOtxcEW9aAIHkv\u003eIOiv}xL0wGS9rarR^HjS\u003e}ynMl(v3lQEjAaJJiw[=6)B08OFarR^HarS/\u0026u$Tg}az=9Jw[=6)B094^az++3fdF8ini{0vmncGEe]tbwoI4Pupe:OlzdB+!ml%somj@B/azth3vqPZgB-.tlB1R9pzf6Vcv{*{gAbolgc)QC{3lQEjAaJJiwQ4=@B-.53y?mVgarS/\u0026B8UY2e[O*lwPGFpA+fhrc31usvRGZkEjlp=aBE^GavZ6YwIdC2B7Gk$zdLbcdiK3CarU-AwN^ukwPq\u003cbA+eP%vrug7auZ\u0026Kb5y$5b3+J#aAIHkv\u003eIRfByt",
            "ln": 400,
            "col": 40,
            "line": 12
          },
          {
            "b": "wPhi#wmYT*C{1qKvqxA#efD5Tar(m#atCU@3lQEjAaJJivpS[QwmY{}y\u0026sofwO#P%wmYZ\u003ezE^r@v%GgvA=Vhhv\u003ciDDarR\u003eSj%hTliu!!MaAIHkv\u003eIh2wm5\u003eUC4CGdAbxf7ByeM\u0026AaJ]$wO#16ar\u003e\u0026GvSb:{A3u?Qb7qY#f!Ld73t19=3i",
            "ln": 1047,
            "col": 25,
            "line": 27
          }
        ],
        "depth": 2,
        "facts": {
          "imp": [
            [
              "",
              "expand_path"
            ],
            [
              "",
              "unshift"
            ],
            [
              "",
              "include?"
            ],
            [
              "",
              "require"
            ],
            [
              "",
              "new"
            ],
            [
              "",
              "name"
            ],
            [
              "",
              "version"
            ],
            [
              "",
              "authors"
            ],
            [
              "",
              "email"
            ],
            [
              "",
              "description"
            ],
            [
              "",
              "summary"
            ],
            [
              "",
              "homepage"
            ],
            [
              "",
              "license"
            ],
            [
              "",
              "files"
            ],
            [
              "",
              "split"
            ],
            [
              "",
              "executables"
            ],
            [
              "",
              "grep"
            ],
            [
              "",
              "files"
            ],
            [
              "",
              "basename"
            ],
            [
              "",
              "require_paths"
            ],
            [
              "",
              "metadata"
            ],
            [
              "",
              "required_ruby_version"
            ],
            [
              "",
              "add_dependency"
            ],
            [
              "",
              "add_dependency"
            ],
            [
              "",
              "add_development_dependency"
            ],
            [
              "",
              "add_development_dependency"
            ],
            [
              "",
              "add_development_dependency"
            ],
            [
              "",
              "add_development_dependency"
            ],
            [
              "",
              "hanami/utils/version"
            ]
          ],
          "mbr": [
            "File.basename",
            "File.expand_path",
            "spec.add_dependency",
            "spec.add_development_dependency",
            "spec.authors",
            "spec.description",
            "spec.email",
            "spec.executables",
            "spec.files",
            "spec.files.grep",
            "spec.homepage",
            "spec.license",
            "spec.metadata",
            "spec.name",
            "spec.require_paths",
            "spec.required_ruby_version",
            "spec.summary",
            "spec.version"
          ],
          "tgt": [
            "add_dependency",
            "add_development_dependency",
            "authors",
            "basename",
            "description",
            "email",
            "executables",
            "expand_path",
            "files",
            "grep",
            "homepage",
            "include?",
            "license",
            "metadata",
            "name",
            "new",
            "require",
            "require_paths",
            "required_ruby_version",
            "split",
            "summary",
            "unshift",
            "version"
          ],
          "metrics": {
            "ast": {
              "max_depth": 10,
              "op.concat": 27,
              "call_count": 28,
              "node_count": 334,
              "member_count": 18,
              "max_array_len": 1,
              "member_depth_max": 3,
              "op_density.concat": 0.08
            },
            "file": {
              "size": 1188,
              "entropy": 5.04
            },
            "text": {
              "lines": 30,
              "top_char": 101,
              "max_ws_run": 10,
              "digit_ratio": 0.02,
              "space_count": 178,
              "char_entropy": 5.04,
              "unique_chars": 77,
              "top_char_null": 0,
              "string_density": 0.9,
              "top_char_ratio": 0.09,
              "avg_line_length": 38.6,
              "max_line_length": 111,
              "empty_line_ratio": 0.17,
              "last_line_length": 3,
              "whitespace_ratio": 0.18,
              "identifier_density": 2.07,
              "line_length_stddev": 24.71,
              "normalized_string_count": 4.93,
              "repeated_char_sequences": 1,
              "suspicious_identifier_ratio": 0.03,
              "normalized_unique_identifiers": 6.73
            },
            "binds": {
              "count": 13
            },
            "binary": {
              "peak_region_bytes": 1024,
              "peak_region_entropy": 5.06
            },
            "imports": {
              "count": 1,
              "third_party_count": 1,
              "third_party_ratio": 1
            },
            "strings": {
              "bytes": 271,
              "count": 27,
              "url_count": 1,
              "avg_length": 10.04,
              "max_length": 41,
              "path_count": 6,
              "avg_entropy": 2.69,
              "email_count": 1,
              "entropy_stddev": 0.69
            },
            "comments": {
              "chars": 28,
              "count": 1,
              "lines": 1,
              "to_code_ratio": 0.03
            },
            "identifiers": {
              "count": 62,
              "unique": 33,
              "avg_length": 7.91,
              "max_length": 26,
              "min_length": 1,
              "avg_entropy": 2.45,
              "reuse_ratio": 0.53,
              "length_stddev": 5.05,
              "sequential_names": 1,
              "single_char_count": 1,
              "single_char_ratio": 0.03,
              "all_lowercase_ratio": 0.76,
              "all_uppercase_ratio": 0.06,
              "double_underscore_count": 1,
              "underscore_prefix_count": 1
            }
          }
        },
        "id": 2,
        "mol": "H₂(CmPo)Md(Pa)",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!hanami-utils.gemspec",
        "risk": 3,
        "sha": "97001b7e2a1b4ad3a8e38090e1d815571f8189a944ec37167d1764f595c6ddd5",
        "size": 1188,
        "traits": [
          {
            "id": "metadata/package/config::gemspec-name-assignment",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby gemspec assigns package name",
            "spans": [
              [
                162,
                55
              ]
            ]
          },
          {
            "id": "micro-behaviors/communications/http/message::http-prefix",
            "conf": 0.9,
            "crit": 2,
            "desc": "HTTP protocol prefix",
            "spans": [
              [
                494,
                0
              ]
            ]
          },
          {
            "id": "micro-behaviors/process/create/shell/lang::ruby-subshell-command",
            "conf": 0.93,
            "crit": 3,
            "desc": "Ruby subshell command execution",
            "spans": [
              [
                568,
                78
              ]
            ]
          },
          {
            "id": "micro-behaviors/communications/http/message::http-url-literal",
            "conf": 0.75,
            "crit": 2,
            "desc": "HTTP URL string literal",
            "spans": [
              [
                494,
                0
              ]
            ]
          },
          {
            "id": "micro-behaviors/communications/http/url/scheme::cleartext-http-url-code-literal",
            "atk": "T1071.001",
            "mbc": "C0002",
            "conf": 0.9,
            "crit": 3,
            "desc": "Code embeds cleartext HTTP URL literal",
            "spans": [
              [
                494,
                19
              ]
            ]
          }
        ],
        "type": "ruby"
      },
      {
        "ctx": [
          {
            "b": "boQPsz*C#juVQsfx(mM\u003cy?X05A:-=BaARTDwEn=Yz!a0bwGTJLzEEx@3lQEdz!a0bwGT#{x(4?$arR^HboPu\u0026vrlGjB-.tlx([62A%:3jarR)KkYZTSv}u=pe?[$j3lQDlay/j@B8@D\u003ey*?ya3lQDlarR^KawuYZwoe(4ay/j@B8@Eoz/M$xxK@r0x)a69az$R8wIarjarR^Har}joarR^Har@0]Aa9=}z6i.8zdK?]q/)4]zF7HylU{gLB6P]gxK@rcAaJJ[w[+-$v@bN{B0bvezdK4%arR^Har@0]Aa9=}z6e",
            "ln": 0,
            "col": 1,
            "line": 1
          },
          {
            "b": "wPz%dv}v8iarR)KjW6#OAbW\u003c0q!o#)x\u003e7YYarR^HarR)oarR^HarR)KarR)KCwhejaz2!py?Wx[BrCEfzdN^cvpJ\u003cQarR^HarR)KarTi-zEEx@iYZn.x(4\u0026KiZWZ(B8@%Iz^^f1c)}@8A=#ebwHx2Kl2Z=(ar@0(j%idgA5{3UwPz%dv}t#\u0026arR^H",
            "ln": 875,
            "col": 44,
            "line": 33
          },
          {
            "b": "vqPNAA=M8s3lQDlarR!qwO96awO+%hy\u0026r-)aT?kpzdLmvzEEx[B8UL$wGTbUpHX6Iv@%dbarR^HarR^HzEEx[B8UL$wIdFhzGx]bxjVfkzEEx[e{82sB1wCCvqH0@dgdguarR^HwO#2=3lQDlarR^KawuYZwoe(4ay/j@B8@Eoz/M$xxK@r0x)a69az$R8wH[%xzFTOvx\u003ewG4BshbLwmYv!zE)uh3lQDlarR^K3lQDlarR^Kav6)OA:-/czu",
            "ln": 1121,
            "col": 62,
            "line": 39
          }
        ],
        "depth": 2,
        "facts": {
          "imp": [
            [
              "",
              "const_get"
            ],
            [
              "",
              "to_s"
            ],
            [
              "",
              "load!"
            ],
            [
              "",
              "const_defined?"
            ],
            [
              "",
              "to_s"
            ]
          ],
          "mbr": [
            "name.to_s",
            "namespace.const_defined?",
            "namespace.const_get"
          ],
          "tgt": [
            "const_defined?",
            "const_get",
            "load!",
            "to_s"
          ],
          "funcs": [
            [
              "load!",
              1136
            ],
            [
              "load",
              2121
            ]
          ],
          "metrics": {
            "ast": {
              "max_depth": 13,
              "op.concat": 4,
              "call_count": 5,
              "node_count": 146,
              "member_count": 3,
              "member_depth_max": 2,
              "op_density.concat": 0.03
            },
            "file": {
              "size": 2266,
              "entropy": 4.3
            },
            "text": {
              "lines": 76,
              "top_char": 101,
              "max_ws_run": 7,
              "digit_ratio": 0.01,
              "space_count": 704,
              "char_entropy": 4.3,
              "unique_chars": 58,
              "top_char_null": 0,
              "top_char_ratio": 0.07,
              "avg_line_length": 28.82,
              "max_line_length": 96,
              "empty_line_ratio": 0.03,
              "last_line_length": 3,
              "whitespace_ratio": 0.34,
              "identifier_density": 0.29,
              "line_length_stddev": 24.62,
              "suspicious_comment_ratio": 0.06,
              "normalized_unique_identifiers": 1.76
            },
            "binary": {
              "peak_region_bytes": 2266,
              "peak_region_entropy": 4.41
            },
            "source": {
              "class_count": 3,
              "function_count": 2
            },
            "comments": {
              "chars": 1479,
              "count": 62,
              "empty": 16,
              "lines": 46,
              "high_entropy": 4,
              "to_code_ratio": 1.53
            },
            "functions": {
              "count": 5
            },
            "identifiers": {
              "count": 22,
              "unique": 11,
              "avg_length": 6.45,
              "max_length": 14,
              "min_length": 4,
              "avg_entropy": 2.4,
              "reuse_ratio": 0.5,
              "length_stddev": 2.93,
              "all_lowercase_ratio": 0.45
            }
          }
        },
        "id": 3,
        "mol": "H(Db)",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/class.rb",
        "pid": 0,
        "rel": "fetched",
        "risk": 2,
        "sha": "ce2d0b5a36155eff09ccc89c62c118a3ed04021d9b6f074d9b50d1fdbac57baf",
        "size": 2266,
        "traits": [
          {
            "id": "metadata/file/profile/language::lang-english--atom-1",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"the\"",
            "spans": [
              [
                143,
                0
              ]
            ]
          },
          {
            "id": "micro-behaviors/data/source/dynamic/reflect::ruby-const-get",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby dynamically resolves a constant",
            "spans": [
              [
                1185,
                9
              ]
            ]
          }
        ],
        "type": "ruby",
        "via": "https://rubygems.org/downloads/hanami-utils-3.0.1.gem"
      },
      {
        "ctx": [
          {
            "b": "boQPsz*C#juVQsfx(mM\u003cy?X05A:-=BaARTDwEn=Yz!a0bwGTJLzEEx@3lQEdz!a0bwGT#{x(4?$arR^HboPM}xK#i#BywS{wGUG0vrlGjy?m^3y-)[fA+O@\u003ey?j.$v}f7\u003eB8M8ue^-ZzarR)",
            "ln": 0,
            "col": 1,
            "line": 1
          },
          {
            "b": "arUJtwozZ1avx%NB8$5!BzbP6A%:3jarR^HarUiaw/#eay?tqhCYWImwmYp1vQTs?dgdguarR^HarR^HvQTs?e[nZaB8$Y1C42hfwn.!$arR^HarR^HarR^(uTEqVvrlG%vruQix\u003c#jbwPF$Savg9\u003eA+P09By/ICzE[2mB-82bB8@EmwObT]wN[1NkWN(dy*?yauTX4#A+P09By/Ix3lQDlarR^HarR!rzE:7%arR^HarR!rzE:7YarR^HarR^HboPx=w[=c]B0a)lv@bN{B0bpgC4CFjvpJ!UB8#nuazbLjaARpdazkziwO@S0BAzLqvS=^7d03*\u00263lQDlarR^Har}joarR^HarR^Kavdb[vqH6$aAIaoazbLjayMylB-p]jv@bN{B0bgrayPzmz/5{8x\u003e7N/y\u003cvdiC4293vpB4:",
            "ln": 414,
            "col": 5,
            "line": 19
          },
          {
            "b": "arR^HarR^HarR^HarR^HarR^HarR^HarR^Kaz2C33lQDlarR^HarR^HasO\u0026:uTDn]oHSq}efFqboI4#FuTB{caufYJarR^HarR^Haz2C33lQDlarR^Haz2C33jm)#arR^HarUSzz//M2By!$\u00263lQDlarR^Har@0]B7F]9lU{gLB0CypxK#i#By!$\u0026arR^H",
            "ln": 2593,
            "col": 26,
            "line": 84
          }
        ],
        "depth": 2,
        "facts": {
          "imp": [
            [
              "",
              "require"
            ],
            [
              "",
              "extend"
            ],
            [
              "",
              "class_eval"
            ],
            [
              "",
              "new"
            ],
            [
              "",
              "each"
            ],
            [
              "",
              "class_eval"
            ],
            [
              "",
              "dup"
            ],
            [
              "",
              "class_eval"
            ],
            [
              "",
              "hanami/utils/class_attribute/attributes"
            ]
          ],
          "mbr": [
            "Attributes.new",
            "attributes.each",
            "base.class_eval",
            "base.extend",
            "class_attributes.dup",
            "singleton_class.class_eval",
            "subclass.class_eval"
          ],
          "tgt": [
            "class_eval",
            "dup",
            "each",
            "extend",
            "new",
            "require"
          ],
          "funcs": [
            [
              "included",
              300
            ],
            [
              "extended",
              444
            ],
            [
              "class_attribute",
              2047
            ],
            [
              "inherited",
              2772
            ],
            [
              "class_attributes",
              3041
            ]
          ],
          "metrics": {
            "ast": {
              "op.sub": 1,
              "max_depth": 18,
              "op.concat": 7,
              "call_count": 8,
              "node_count": 236,
              "member_count": 7,
              "op_density.sub": 0,
              "member_depth_max": 2,
              "op_density.concat": 0.03
            },
            "file": {
              "size": 3132,
              "entropy": 3.83
            },
            "text": {
              "lines": 112,
              "top_char": 101,
              "max_ws_run": 35,
              "digit_ratio": 0.02,
              "space_count": 1277,
              "char_entropy": 3.83,
              "unique_chars": 68,
              "top_char_null": 0,
              "string_density": 0.02,
              "top_char_ratio": 0.07,
              "avg_line_length": 26.96,
              "max_line_length": 86,
              "empty_line_ratio": 0.08,
              "last_line_length": 3,
              "whitespace_ratio": 0.44,
              "identifier_density": 0.39,
              "line_length_stddev": 20.45,
              "normalized_string_count": 0.19,
              "repeated_char_sequences": 25,
              "suspicious_string_ratio": 0.5,
              "suspicious_comment_ratio": 0.03,
              "normalized_unique_identifiers": 3.97
            },
            "binds": {
              "count": 3
            },
            "binary": {
              "peak_region_bytes": 1024,
              "peak_region_entropy": 4.24
            },
            "source": {
              "class_count": 4,
              "function_count": 5
            },
            "imports": {
              "count": 1,
              "third_party_count": 1,
              "third_party_ratio": 1
            },
            "strings": {
              "bytes": 523,
              "count": 2,
              "avg_length": 261.5,
              "max_length": 484,
              "avg_entropy": 3.15,
              "entropy_stddev": 0.47,
              "embedded_code_candidates": 1
            },
            "comments": {
              "chars": 1390,
              "count": 68,
              "empty": 16,
              "lines": 52,
              "base64": 2,
              "to_code_ratio": 0.87
            },
            "functions": {
              "count": 9
            },
            "identifiers": {
              "count": 44,
              "unique": 27,
              "avg_length": 8.52,
              "max_length": 19,
              "min_length": 2,
              "avg_entropy": 2.46,
              "reuse_ratio": 0.61,
              "length_stddev": 4.28,
              "all_lowercase_ratio": 0.7,
              "all_uppercase_ratio": 0.07,
              "double_underscore_count": 2,
              "underscore_prefix_count": 2
            }
          }
        },
        "id": 4,
        "mol": "H(Po)",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/class_attribute.rb",
        "pid": 0,
        "rel": "fetched",
        "risk": 2,
        "sha": "6ed7c73223f0f4bc6e8d8e58a2a6524dfd700e2a41961b568bac8867d81441c2",
        "size": 3132,
        "traits": [
          {
            "id": "metadata/file/profile/language::lang-english--atom-1",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"the\"",
            "spans": [
              [
                655,
                0
              ]
            ]
          },
          {
            "id": "micro-behaviors/process/interpreter/eval/direct::ruby-class-eval",
            "atk": "T1059",
            "conf": 0.9,
            "crit": 3,
            "desc": "Ruby class_eval call",
            "spans": [
              [
                478,
                10
              ]
            ]
          }
        ],
        "type": "ruby",
        "via": "https://rubygems.org/downloads/hanami-utils-3.0.1.gem"
      },
      {
        "ctx": [
          {
            "b": "boQPsz*C#juVQsfx(mM\u003cy?X05A:-=BaARTDwEn=Yz!a0bwGTJLzEEx@3lQEdz!a0bwGT#{x(4?$arR^HboPJRo?VWvB7nS$wGVbqx(4H9x\u003eqt)arR^HbmkLoarR)KlsB}Dwft/dawV68q=1PSwPIA\u003eA:@=9vqYP#pGG?Xp-@h9k#pb}v@C)?3lQDlar}joarR^Kav70ZzEWl2fFkgmfBw{BarR)oarR^HboPl)wN##$BAzFyiXJdgCxUVTCvtMie]L=y3lQDlar@0]B7F]9xMOs",
            "ln": 0,
            "col": 1,
            "line": 1
          },
          {
            "b": "wO2@\u003carR^HboPl)wN##$BAzFyiXJdgCxUVTCvtMie]L=yfkkrmwQ2?DxMbQ[q:BkK3lQDlar@0]B7F]9xMOunB2\u003e%cxk8E3BZ=$kz/4c@q:BkKfj/ikAa{[svrM6hy?ml/v%Fz7arR!zz!a0bwGTA.v{%s/ar@1HBZ/o0z/v:Fx(^Y(y?j.-wPR%bv@\u003cp$z!a0bwLuVMxlm!]arR^HarR)Knm^2*vQTs?azbLjayX=2wGSYYazC.nwOkN{ay/tcC4CYnx(v\u003e@arR^HarR)oarR^HarR)KkYZTSv}u=pe\u0026kgm3lQDlarR^Kav6vOx=}wnx)9{bwEoL5arR^HbmkLoarR^HboPl)",
            "ln": 372,
            "col": 90,
            "line": 13
          },
          {
            "b": "DsWA\u003carR^HarR)Kph+1)Ab]VgBywS{wGUF@vrcz@arR^HarR)oarR^HarR)Kra]#!azC)tviw9HB7=XgzGx]hvpQH0w/$I8q!p54aARJAzddi\u003eaz+$myJTOsw)]+5wPxygarR^HarR)oarR^HarR)KkYZTSv}u=pe\u0026kgm3lQDlarR^Kav6vOx=}wn",
            "ln": 1338,
            "col": 15,
            "line": 47
          },
          {
            "b": "arR^Hf/.0ijW6#jl1+jDC4z\u003cGarR^Kawui=x(k56vq]}5vqE65wPS39AV!^kCwhejazk.6C4z16arR^HarR^YiwR^vj%h4nvpKC4wG\u0026VFarR)KoKS3SzxJB$Aa%A5y-)L9BAz8mayMypx([2hvpKC4wEoL5arR^HarSy0g:1}Bar\u003c9Yx(WYcefD5T",
            "ln": 5059,
            "col": 5,
            "line": 143
          },
          {
            "b": "q:T8Ao*}#6jS(4{tweb2A3e?oBz#pzzddc{Bz\u003eCqw].D]DsWA\u003carR^HarR)Kra]?=z/{evB-X:Aw/$J1az2R7vq]^g3lQDlarR^K3lQDlarR^Kaw3V5B0bsdA+/k%aA}KwxDRzgx(+zrAaJJ[vqE5@y*?yaazbLjaAR*CaAz44B8L@qiTM#LarR^",
            "ln": 16821,
            "col": 19,
            "line": 367
          },
          {
            "b": "zG6-ue[]xlvlVesvp\u003c7HBAh8kxdje{arR^HarR^HA+frmy\u0026*^.ax8YXwM9X\u003ex(mMozE[203lQDlarR^HazC.jB-YlEvpJ$Tv}Yp\u003eay]ykD$c\u0026gD\u003cQ#sarR^HarR^HA+frm",
            "ln": 18729,
            "col": 26,
            "line": 426
          },
          {
            "b": "o?VWrBAzLqvS=^7B0a[ewftx2zGGDcBAo5warR^HarR)Kp\u00266YKB7DFiz//LkBzb98aARphB0bgraz(4qwGUG3ze:Stvruj4zEEu7wQ5f9zGxJnwIarjarR^Har@12w/#wqBS+NkwN({9zY\u0026Rjv{%s/aA8dlC{2TSo?VWtz/fVdzGG}JaAhddvrl05",
            "ln": 18981,
            "col": 37,
            "line": 439
          }
        ],
        "depth": 2,
        "facts": {
          "imp": [
            [
              "",
              "freeze"
            ],
            [
              "",
              "each_with_object"
            ],
            [
              "",
              "to_s"
            ],
            [
              "",
              "freeze"
            ],
            [
              "",
              "freeze"
            ],
            [
              "",
              "freeze"
            ],
            [
              "",
              "freeze"
            ],
            [
              "",
              "freeze"
            ],
            [
              "",
              "new"
            ],
            [
              "",
              "class"
            ],
            [
              "",
              "encode"
            ],
            [
              "",
              "is_a?"
            ],
            [
              "",
              "new"
            ],
            [
              "",
              "each_char"
            ],
            [
              "",
              "fetch"
            ],
            [
              "",
              "encode"
            ],
            [
              "",
              "is_a?"
            ],
            [
              "",
              "new"
            ],
            [
              "",
              "each_char"
            ],
            [
              "",
              "encode_char"
            ],
            [
              "",
              "encode"
            ],
            [
              "",
              "is_a?"
            ],
            [
              "",
              "new"
            ],
            [
              "",
              "to_s"
            ],
            [
              "",
              "first"
            ],
            [
              "",
              "extract"
            ],
            [
              "",
              "decode_www_form_component"
            ],
            [
              "",
              "nil?"
            ],
            [
              "",
              "encode"
            ],
            [
              "",
              "to_s"
            ],
            [
              "",
              "force_encoding"
            ],
            [
              "",
              "dup"
            ],
            [
              "",
              "ord"
            ],
            [
              "",
              "hex_for_non_alphanumeric_code"
            ],
            [
              "",
              "nil?"
            ],
            [
              "",
              "to_s"
            ]
          ],
          "mbr": [
            "HTML_CHARS.fetch",
            "SafeString.new",
            "URI.decode_www_form_component",
            "c.to_s",
            "char.ord",
            "hex.nil?",
            "input.dup",
            "input.dup.force_encoding",
            "input.each_char",
            "input.is_a?",
            "input.nil?",
            "input.to_s",
            "input.to_s.encode"
          ],
          "tgt": [
            "class",
            "decode_www_form_component",
            "dup",
            "each_char",
            "each_with_object",
            "encode",
            "encode_char",
            "extract",
            "fetch",
            "first",
            "force_encoding",
            "freeze",
            "hex_for_non_alphanumeric_code",
            "is_a?",
            "new",
            "nil?",
            "ord",
            "to_s"
          ],
          "funcs": [
            [
              "to_s",
              17514
            ],
            [
              "encode",
              17806
            ],
            [
              "html",
              18653
            ],
            [
              "html_attribute",
              19705
            ],
            [
              "url",
              21640
            ],
            [
              "encode",
              22207
            ],
            [
              "encode_char",
              22695
            ],
            [
              "hex_for_non_alphanumeric_code",
              23193
            ]
          ],
          "metrics": {
            "ast": {
              "op.ge": 3,
              "op.le": 3,
              "op.lt": 1,
              "op.lor": 2,
              "op.shl": 2,
              "op.land": 3,
              "max_depth": 18,
              "op.concat": 31,
              "call_count": 36,
              "node_count": 3456,
              "member_count": 13,
              "op_density.ge": 0,
              "op_density.le": 0,
              "op_density.lt": 0,
              "op_density.lor": 0,
              "op_density.shl": 0,
              "op_density.land": 0,
              "member_depth_max": 3,
              "op_density.concat": 0.01
            },
            "file": {
              "size": 23405,
              "entropy": 4.52
            },
            "text": {
              "lines": 583,
              "top_char": 101,
              "max_ws_run": 11,
              "digit_ratio": 0.09,
              "space_count": 7563,
              "char_entropy": 4.52,
              "unique_chars": 88,
              "top_char_null": 0,
              "string_density": 0.47,
              "top_char_ratio": 0.06,
              "avg_line_length": 39.15,
              "max_line_length": 128,
              "empty_line_ratio": 0.05,
              "last_line_length": 3,
              "whitespace_ratio": 0.35,
              "identifier_density": 0.27,
              "line_length_stddev": 22.7,
              "normalized_string_count": 11.31,
              "repeated_char_sequences": 29,
              "suspicious_comment_ratio": 0.04,
              "suspicious_identifier_ratio": 0.04,
              "normalized_unique_identifiers": 5.77
            },
            "binds": {
              "count": 18
            },
            "binary": {
              "peak_region_bytes": 10240,
              "peak_region_entropy": 4.8
            },
            "source": {
              "class_count": 4,
              "function_count": 7
            },
            "strings": {
              "bytes": 1251,
              "count": 273,
              "avg_length": 4.58,
              "max_length": 21,
              "avg_entropy": 1.96,
              "empty_count": 1,
              "entropy_stddev": 0.61
            },
            "comments": {
              "chars": 10803,
              "count": 447,
              "empty": 62,
              "lines": 385,
              "base64": 3,
              "high_entropy": 14,
              "to_code_ratio": 1.94,
              "url_in_comments": 16
            },
            "functions": {
              "count": 11
            },
            "identifiers": {
              "count": 155,
              "unique": 53,
              "avg_length": 8.85,
              "max_length": 29,
              "min_length": 1,
              "avg_entropy": 2.51,
              "reuse_ratio": 0.34,
              "length_stddev": 6.55,
              "has_digit_ratio": 0.02,
              "sequential_names": 1,
              "single_char_count": 1,
              "single_char_ratio": 0.02,
              "high_entropy_count": 4,
              "high_entropy_ratio": 0.08,
              "all_lowercase_ratio": 0.6,
              "all_uppercase_ratio": 0.21,
              "numeric_suffix_count": 1,
              "keyboard_pattern_names": 1
            }
          }
        },
        "id": 5,
        "mol": "H(Cm)",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/escape.rb",
        "risk": 2,
        "sha": "24b58e0b03aea9a33d24c1accd2e663c3809e5844698040111564e986f03cad1",
        "size": 23405,
        "traits": [
          {
            "id": "metadata/file/profile/language::lang-english--atom-1",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"the\"",
            "spans": [
              [
                16869,
                0
              ]
            ]
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-3",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"that\"",
            "spans": [
              [
                19029,
                0
              ]
            ]
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-5",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"for\"",
            "spans": [
              [
                553,
                0
              ]
            ]
          },
          {
            "id": "metadata/file/profile/language::lang-english--atom-7",
            "conf": 0.8,
            "crit": 2,
            "desc": "English function-word token \"this\"",
            "spans": [
              [
                1386,
                0
              ]
            ]
          },
          {
            "id": "micro-behaviors/communications/http/url/forge::public-code-forge-url",
            "conf": 0.9,
            "crit": 3,
            "desc": "References a public code-forge URL",
            "spans": [
              [
                436,
                19
              ]
            ]
          }
        ],
        "type": "ruby"
      },
      {
        "id": 6,
        "mol": "H(F₂)",
        "sha": "d2e0123660d7967e62e62c44cae33493df3838bba2a56cef9da64460d1fedf80",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/files.rb",
        "risk": 2,
        "size": 13698,
        "type": "ruby",
        "depth": 2
      },
      {
        "id": 7,
        "mol": "H(Cm)",
        "sha": "f884f170b103d499361e337664256c68667d886b489946b99dc9eb7a07eeec9f",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/io.rb",
        "risk": 2,
        "size": 960,
        "type": "ruby",
        "depth": 2
      },
      {
        "id": 8,
        "mol": "H(Db)",
        "sha": "dab09151f64146fbb99d455f326912bc1efc03ef743a782aa4daea7b21fa27bd",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/load_paths.rb",
        "risk": 1,
        "size": 4617,
        "type": "ruby",
        "depth": 2
      },
      {
        "id": 9,
        "mol": "H(Db)",
        "sha": "69a51554fcaaae5ac0eaab3b2564a86dfe5a4b9f12a1dc07ecba6c56dbae046a",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/path_prefix.rb",
        "risk": 1,
        "size": 4594,
        "type": "ruby",
        "depth": 2
      },
      {
        "id": 10,
        "mol": "H₂(CmDb)",
        "sha": "af362ef1928eeef5e4103332f9c51bd7a59ff2091f9c441859a3d385bfe5833b",
        "path": "hanami-utils-2.0.0.gem!!data.tar.gz!!lib/hanami/utils/string.rb",
        "risk": 2,
        "size": 10371,
        "type": "ruby",
        "depth": 2
      },
      {
        "id": 31,
        "sha": "b6fdf319eefc9f31c9f562a60a0542fa9d3ebb58ac66ed896b8bbe50c71b9a9c",
        "path": "dry-transformer@1.1.0.registry.json",
        "size": 861,
        "type": "registry",
        "depth": 1
      },
      {
        "id": 32,
        "sha": "24bd0b706026d2f6f22bf338075d4354acf9a531040f1cc07cab87239a4b5b4a",
        "path": "concurrent-ruby@1.3.8.registry.json",
        "size": 1079,
        "type": "registry",
        "depth": 1
      },
      {
        "id": 33,
        "sha": "48e518111c66ff62234ad930e43bb937002abcc7a9bb813c580e5601243cb09f",
        "path": "hanami-utils@2.0.0.registry.json",
        "size": 850,
        "type": "registry",
        "depth": 1
      }
    ],
    "omitted_files": 8,
    "rev": "479f3",
    "v": "8"
  }
}