公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-22 23:52 UTC

BurntSushi / aho-corasick

A fast implementation of Aho-Corasick in Rust.

RustUnlicense★ 1,269 星标⑂ 116 复刻始于 2015年6月在 GitHub 上查看 ↗

BurntSushi/aho-corasick 的健康指数为 100 分中的 55 分,处于「中等」区间。 其得分最高的类别是Community & Adoption(72/100),最低的是Vitality(36/100)。 最近一次更新在 92 天前。 近期的大部分工作由 1 位贡献者完成。

55
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

55
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Andrew Gallant个人账户
12,664 关注者182 个公开仓库始于 2010年10月@openai

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
crates.ioaho-corasick1.1.467,322,38062267 天前textsearchstringmultipatterntext-processing

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

36存在风险 · 占总体的 22%
评分方式
9.9/36推送新近度 — 最近一次推送于 92 天前
2.8/36提交节奏 — 52 周中有 4 周有提交
8.1/18提交量 — 最近一年 7 次提交
1/10OpenSSF Scorecard:Maintained — 0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1
所用输入
commits_last_year7
human_commit_share0.99
days_since_last_push92
active_weeks_last_year4

发布纪律

58中等
评分方式
16.2/27有发布版本 — 61 个版本标签(无 GitHub 发布版本)
16.2/36发布时效 — 最近一次发布版本于 267 天前
19.8/27发布节奏 — 约每 102.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count61
latest_release_tag1.1.4
releases_from_tags
days_since_latest_release267
mean_days_between_releases102.4
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

72良好 · 占总体的 18%
评分方式
50.3/60星标 — 1,269 个星标
17.2/25复刻 — 116 个复刻
6.4/15关注者 — 15 位关注者
所用输入
forks116
stars1,269
watchers15
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Unlicense)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
80/80月度下载量 — crates 合计每月 67,322,380 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesaho-corasick
dependents
ecosystemscrates
total_downloads975,017,109
monthly_downloads67,322,380
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

67中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
3.7/22.5提交分布 — 头号贡献者编写了 84% 的提交
13.5/13.5贡献者广度 — 31 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 6 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled31
top_contributor_share0.837
评分方式
42.7/46.8议题解决 — 91% 的议题已关闭
31.7/38.3PR 接受 — 已裁定的 PR 中 63/76 已合并
1.5/15OpenSSF Scorecard:Code-Review — Found 4/26 approved changesets -- score normalized to 1
所用输入
merged_prs63
open_issues7
closed_issues74
issue_closed_ratio0.914
closed_unmerged_prs13
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
25/25所有者影响力 — BurntSushi 有 12,664 位关注者
25/25既往记录 — 182 个公开仓库,账户约 15 年
所用输入
followers12,664
owner_typeUser
is_verified
owner_loginBurntSushi
public_repos182
account_age_days5,747
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — crates 上有 1 个软件包
26/35发布时效 — 最近一次发布于 267 天前
20/20版本历史 — 62 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesaho-corasick
ecosystemscrates
any_deprecated
min_days_since_publish267

工程质量

基础的工程与文档实践是否到位?

38存在风险 · 占总体的 20%

工程实践

30存在风险
评分方式
24/24CI 工作流 — 1 个工作流
0/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
6/20OpenSSF Scorecard:CI-Tests — 3 out of 9 merged PRs checked by a CI test -- score normalized to 3
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

50中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 5 个主题标签
0/10Wiki
所用输入
topicsaho-corasick, substring-matching, finite-state-machine, text-processing, search
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

68中等 · 占总体的 16%

安全态势

60中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0.8/2.5CI-Tests — 3 out of 9 merged PRs checked by a CI test -- score normalized to 3
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0.8/7.5Code-Review — Found 4/26 approved changesets -- score normalized to 1
2.5/2.5Contributors — project has 6 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5许可证 — license file detected
0.8/7.5Maintained — 0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1
0/5Packaging — 无数据
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5.9
已排除计分(无数据或不适用):packaging, signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages3
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 crates:aho-corasick@1.1.4 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 3 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

56中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 99 次人类提交中有 89 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.899
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — Cargo.toml, aho-corasick-debug/Cargo.toml, benchmarks/engines/naive/Cargo.toml(工具链约定,无任务运行器)
0/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Rust(静态类型)
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
8/8自动化维护 — 最近 100 次提交中有 1 次为自动依赖更新
10/10OpenSSF Scorecard:Pinned-Dependencies — all dependencies are pinned
所用输入
has_nix
has_tests
lockfilesCargo.lock
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml, aho-corasick-debug/Cargo.toml, benchmarks/engines/naive/Cargo.toml, benchmarks/engines/rust-aho-corasick/Cargo.toml, benchmarks/engines/rust-daachorse/Cargo.toml, benchmarks/engines/rust-jetscii/Cargo.toml, benchmarks/engines/rust-old-aho-corasick/Cargo.toml, benchmarks/shared/Cargo.toml, fuzz/Cargo.toml
dependency_bot_commit_share0.01
评分方式
45/45可类型检查的代码 — Rust(静态类型)
50.9/55可控的文件大小 — 采样的 40 个源文件中有 3 个超过 60KB
所用输入
primary_languageRust
largest_source_bytes107,521
source_files_sampled40
oversized_source_files3

关键数据

1,269GitHub 星标
31贡献者
7最近 12 个月提交数
92距最近推送天数
61发布版本数
1巴士系数(bus factor)
7开放议题
crates.io软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch crates package 'aho-corasick-debug' from its registry

更多细节

Star 与 Fork 历史 0 ★ / 116 ⇿
0Star
116Fork
53发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

02040608010012011132015-072021-012026-07
主版本 1次版本 6修订 46

每个点涵盖 11 天。

OpenSSF Scorecard 5.9 / 10
5.9综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-22 23:51 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
3CI-Tests3 out of 9 merged PRs checked by a CI test -- score normalized to 3
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
1Code-ReviewFound 4/26 approved changesets -- score normalized to 1
10Contributorsproject has 6 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
1Maintained0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1
不适用Packagingpackaging workflow not detected
10Pinned-Dependenciesall dependencies are pinned
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
7Vulnerabilities3 existing vulnerabilities detected
直接依赖 7
注册表软件包版本约束清单文件
crates.iolog0.4.17Cargo.toml
crates.iomemchr2.4.0Cargo.toml
crates.ioaho-corasick*aho-corasick-debug/Cargo.toml
crates.ioanyhow1.0.68aho-corasick-debug/Cargo.toml
crates.iomemmap20.5.8aho-corasick-debug/Cargo.toml
crates.ioenv_logger0.9.3aho-corasick-debug/Cargo.toml
crates.ioclap2.34.0aho-corasick-debug/Cargo.toml
全部依赖 43

来自 GitHub 依赖图的完整解析依赖集合:15 个直接依赖与 28 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
crates.ioaho-corasick直接
crates.ioaho-corasick1.0.5直接
crates.ioanyhow直接
crates.ioanyhow1.0.69直接
crates.ioanyhow1.0.72直接
crates.ioanyhow1.0.75直接
crates.ioclap直接
crates.ioenv_logger直接
crates.ioenv_logger0.9.3直接
crates.iolog直接
crates.iolog0.4.20直接
crates.iomemchr直接
crates.iomemchr2.5.0直接
crates.iomemchr2.6.3直接
crates.iomemmap2直接
crates.ioatty0.2.14间接
crates.iobstr1.6.0间接
crates.iobstr1.6.2间接
crates.iodaachorse1.0.0间接
crates.iodoc-comment间接
crates.iohermit-abi0.1.19间接
crates.iohumantime2.1.0间接
crates.iojetscii0.5.3间接
crates.iolexopt0.3.0间接
crates.iolibc0.2.148间接
crates.iolibfuzzer-sys间接
crates.ioproc-macro21.0.66间接
crates.ioquote1.0.33间接
crates.ioregex1.9.5间接
crates.ioregex-automata0.3.8间接
crates.ioregex-syntax0.7.5间接
crates.ioserde1.0.152间接
crates.ioserde1.0.177间接
crates.ioserde1.0.178间接
crates.ioserde1.0.188间接
crates.ioserde_derive1.0.188间接
crates.iosyn2.0.31间接
crates.iotermcolor1.2.0间接
crates.iounicode-ident1.0.11间接
crates.iowinapi0.3.9间接
crates.iowinapi-i686-pc-windows-gnu0.4.0间接
crates.iowinapi-util0.1.5间接
crates.iowinapi-x86_64-pc-windows-gnu0.4.0间接
依赖安全公告 0

安装 crates:aho-corasick@1.1.4 会引入 3 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "aho-corasick",
        "substring-matching",
        "finite-state-machine",
        "text-processing",
        "search"
      ],
      "is_fork": false,
      "size_kb": 4959,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Rust": 816302
      },
      "pushed_at": "2026-04-21T20:54:23Z",
      "created_at": "2015-06-11T23:02:10Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T04:31:52Z",
      "description": "A fast implementation of Aho-Corasick in Rust.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Unlicense",
      "default_branch": "master",
      "license_spdx_raw": "Unlicense",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://burntsushi.net",
      "name": "Andrew Gallant",
      "type": "User",
      "login": "BurntSushi",
      "company": "@openai",
      "location": "Marlborough, MA",
      "followers": 12664,
      "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
      "created_at": "2010-10-27T16:54:30Z",
      "is_verified": null,
      "public_repos": 182,
      "account_age_days": 5747
    },
    "license": {
      "state": "standard",
      "spdx_id": "Unlicense",
      "raw_spdx": "Unlicense",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "1.1.4",
          "kind": "patch",
          "published_at": "2025-10-28T21:09:41Z"
        },
        {
          "tag": "1.1.3",
          "kind": "patch",
          "published_at": "2024-03-20T00:06:09Z"
        },
        {
          "tag": "1.1.2",
          "kind": "patch",
          "published_at": "2023-10-09T14:20:19Z"
        },
        {
          "tag": "1.1.1",
          "kind": "patch",
          "published_at": "2023-09-20T13:35:35Z"
        },
        {
          "tag": "1.1.0",
          "kind": "minor",
          "published_at": "2023-09-18T13:33:02Z"
        },
        {
          "tag": "1.0.5",
          "kind": "patch",
          "published_at": "2023-08-29T18:01:54Z"
        },
        {
          "tag": "1.0.4",
          "kind": "patch",
          "published_at": "2023-08-14T16:13:10Z"
        },
        {
          "tag": "1.0.3",
          "kind": "patch",
          "published_at": "2023-08-10T02:37:44Z"
        },
        {
          "tag": "1.0.2",
          "kind": "patch",
          "published_at": "2023-06-04T13:44:12Z"
        },
        {
          "tag": "1.0.1",
          "kind": "patch",
          "published_at": "2023-04-21T00:26:29Z"
        },
        {
          "tag": "1.0.0",
          "kind": "major",
          "published_at": "2023-04-17T18:20:32Z"
        },
        {
          "tag": "0.7.20",
          "kind": "patch",
          "published_at": "2022-11-22T03:35:53Z"
        },
        {
          "tag": "0.7.19",
          "kind": "patch",
          "published_at": "2022-09-03T17:30:50Z"
        },
        {
          "tag": "0.7.18",
          "kind": "patch",
          "published_at": "2021-04-30T23:53:19Z"
        },
        {
          "tag": "0.7.17",
          "kind": "patch",
          "published_at": "2021-04-30T23:38:02Z"
        },
        {
          "tag": "0.7.15",
          "kind": "patch",
          "published_at": "2020-11-03T17:20:49Z"
        },
        {
          "tag": "0.7.14",
          "kind": "patch",
          "published_at": "2020-10-12T23:34:57Z"
        },
        {
          "tag": "0.7.13",
          "kind": "patch",
          "published_at": "2020-06-23T12:27:48Z"
        },
        {
          "tag": "0.7.12",
          "kind": "patch",
          "published_at": "2020-06-22T17:33:20Z"
        },
        {
          "tag": "0.7.11",
          "kind": "patch",
          "published_at": "2020-06-22T16:58:37Z"
        },
        {
          "tag": "0.7.10",
          "kind": "patch",
          "published_at": "2020-03-08T23:56:29Z"
        },
        {
          "tag": "0.7.9",
          "kind": "patch",
          "published_at": "2020-02-27T01:25:46Z"
        },
        {
          "tag": "0.7.8",
          "kind": "patch",
          "published_at": "2020-02-04T14:02:13Z"
        },
        {
          "tag": "0.7.7",
          "kind": "patch",
          "published_at": "2020-01-29T14:12:12Z"
        },
        {
          "tag": "0.7.6",
          "kind": "patch",
          "published_at": "2019-08-03T15:31:28Z"
        },
        {
          "tag": "0.7.5",
          "kind": "patch",
          "published_at": "2019-08-03T13:48:17Z"
        },
        {
          "tag": "0.7.4",
          "kind": "patch",
          "published_at": "2019-07-02T14:05:10Z"
        },
        {
          "tag": "0.7.3",
          "kind": "patch",
          "published_at": "2019-03-31T11:41:19Z"
        },
        {
          "tag": "0.7.2",
          "kind": "patch",
          "published_at": "2019-03-31T11:35:53Z"
        },
        {
          "tag": "0.7.1",
          "kind": "patch",
          "published_at": "2019-03-28T23:40:35Z"
        },
        {
          "tag": "0.7.0",
          "kind": "minor",
          "published_at": "2019-03-28T02:17:59Z"
        },
        {
          "tag": "0.6.10",
          "kind": "patch",
          "published_at": "2019-02-16T16:38:28Z"
        },
        {
          "tag": "0.6.9",
          "kind": "patch",
          "published_at": "2018-10-29T11:00:50Z"
        },
        {
          "tag": "0.6.8",
          "kind": "patch",
          "published_at": "2018-08-27T00:03:35Z"
        },
        {
          "tag": "0.6.7",
          "kind": "patch",
          "published_at": "2018-08-25T15:10:27Z"
        },
        {
          "tag": "0.6.6",
          "kind": "patch",
          "published_at": "2018-07-12T20:42:56Z"
        },
        {
          "tag": "0.6.5",
          "kind": "patch",
          "published_at": "2018-06-27T18:52:56Z"
        },
        {
          "tag": "0.6.4",
          "kind": "patch",
          "published_at": "2017-11-30T14:39:42Z"
        },
        {
          "tag": "0.6.3",
          "kind": "patch",
          "published_at": "2017-03-17T00:43:22Z"
        },
        {
          "tag": "0.6.2",
          "kind": "patch",
          "published_at": "2017-02-08T17:33:49Z"
        },
        {
          "tag": "0.6.1",
          "kind": "patch",
          "published_at": "2017-01-03T01:11:41Z"
        },
        {
          "tag": "0.6.0",
          "kind": "minor",
          "published_at": "2017-01-02T22:13:44Z"
        },
        {
          "tag": "0.5.3",
          "kind": "patch",
          "published_at": "2016-09-11T18:33:02Z"
        },
        {
          "tag": "0.5.2",
          "kind": "patch",
          "published_at": "2016-05-01T03:49:06Z"
        },
        {
          "tag": "0.5.1",
          "kind": "patch",
          "published_at": "2016-02-16T12:03:32Z"
        },
        {
          "tag": "0.5.0",
          "kind": "minor",
          "published_at": "2016-02-14T22:11:58Z"
        },
        {
          "tag": "0.4.1",
          "kind": "patch",
          "published_at": "2016-01-31T15:18:11Z"
        },
        {
          "tag": "0.4.0",
          "kind": "minor",
          "published_at": "2015-10-21T20:57:41Z"
        },
        {
          "tag": "0.3.4",
          "kind": "patch",
          "published_at": "2015-10-17T03:58:22Z"
        },
        {
          "tag": "0.3.3",
          "kind": "patch",
          "published_at": "2015-10-17T03:58:13Z"
        },
        {
          "tag": "0.3.2",
          "kind": "patch",
          "published_at": "2015-08-30T15:02:04Z"
        },
        {
          "tag": "0.3.1",
          "kind": "patch",
          "published_at": "2015-08-30T15:01:11Z"
        },
        {
          "tag": "0.3.0",
          "kind": "minor",
          "published_at": "2015-07-14T22:03:46Z"
        },
        {
          "tag": "0.2.2",
          "kind": "patch",
          "published_at": "2015-07-03T14:10:40Z"
        },
        {
          "tag": "0.2.1",
          "kind": "patch",
          "published_at": "2015-06-20T04:53:51Z"
        },
        {
          "tag": "0.2.0",
          "kind": "minor",
          "published_at": "2015-06-20T04:42:23Z"
        },
        {
          "tag": "0.1.5",
          "kind": "patch",
          "published_at": "2015-06-18T10:48:32Z"
        },
        {
          "tag": "0.1.4",
          "kind": "patch",
          "published_at": "2015-06-17T23:33:54Z"
        },
        {
          "tag": "0.1.3",
          "kind": "patch",
          "published_at": "2015-06-16T23:06:38Z"
        },
        {
          "tag": "0.1.2",
          "kind": "patch",
          "published_at": "2015-06-14T22:42:17Z"
        },
        {
          "tag": "0.1.1",
          "kind": "patch",
          "published_at": "2015-06-14T06:30:10Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "c82178696b9ddc18b56c3c74853529e7926ff329",
          "body": "Bumps the actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\n\nUpdates `actions/checkout` from 3.6.0 to 6.0.2\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https\n[…]\npe: version-update:semver-major\n  dependency-group: actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout in the actions group (#171)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-21T20:54:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8209bb9d614ccdddec1c5e60f4b4d683a4c7788a",
          "body": "* Hash-pin all actions with `pinact run -v`\n\nSigned-off-by: William Woodruff <william@yossarian.net>\n\n* Avoid credential persistence in actions/checkout\n\nSigned-off-by: William Woodruff <william@yossarian.net>\n\n* Add a Dependabot config\n\nSigned-off-by: William Woodruff <william@yossarian.net>\n\n---------\n\nSigned-off-by: William Woodruff <william@yossarian.net>",
          "is_bot": false,
          "headline": "Hash-pin all actions, drop persisted credentials (#170)",
          "author_name": "William Woodruff",
          "author_login": "woodruffw",
          "committed_at": "2026-04-21T19:36:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f3f5da9bdec0d811f9a344e3cb9c033b15df20b",
          "body": "This brings the API documentation for `Span::offset` and\n`packed::Searcher::find_in` into consistency with `Input::span`. That\nis, if you try to set offsets that are incorrect for the provided\nhaystack (or are pathologically invalid), then you get a panic. This\nmimics how, e.g., `&slice[range]` work\n[…]\noffsets are usually _trusted_ information, which is why\nit's reasonable to establish their correctness as a precondition.\n\n[RUSTSEC advisory proposal]: https://github.com/rustsec/advisory-db/pull/2684",
          "is_bot": false,
          "headline": "api: document a couple panicking preconditions",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2026-02-27T14:52:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e88e1fce8f7c2073488842cf8cd3d322329e012b",
          "body": null,
          "is_bot": false,
          "headline": "benchmarks: bump dependencies",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2026-02-11T17:04:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e4966516aa4427d717578671353bb8969a048f",
          "body": null,
          "is_bot": false,
          "headline": "ci: use older version of `log` on pinned build",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2025-10-28T21:24:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17f8b32e3b7c845ef3c5429b823804f552f14ec9",
          "body": null,
          "is_bot": false,
          "headline": "1.1.4",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2025-10-28T21:09:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b58556ea5aac5a61a6094f93c3a2398198cb907e",
          "body": "The feature was renamed.\n\nPR #165",
          "is_bot": false,
          "headline": "doc: switch from `doc_auto_cfg` to `doc_cfg`",
          "author_name": "Joshua Barretto",
          "author_login": "zesterer",
          "committed_at": "2025-10-28T21:09:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "948d2e1f8e4b6b0aff13075176922e158c8bed46",
          "body": null,
          "is_bot": false,
          "headline": "github: add FUNDING",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2024-09-25T20:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1adf588b6aa778dcd97faa4e3752d569ebf5b4f7",
          "body": null,
          "is_bot": false,
          "headline": "benchmarks: update deps",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2024-09-25T20:44:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd400ad792d6888cc8fa4c1f9e2493b519961b3c",
          "body": "These changes only reflect a subset that I agreed with.\r\n\r\nPR #135",
          "is_bot": false,
          "headline": "lint: resolve a few Clippy warnings",
          "author_name": "Akmal",
          "author_login": "allaboutevemirolive",
          "committed_at": "2024-03-27T20:37:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56256dca1bcd2365fd1dc987c1c06195429a2e2c",
          "body": null,
          "is_bot": false,
          "headline": "1.1.3",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2024-03-20T00:06:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b64b2251c684ebf37d1dfffe61440d98ff048d5",
          "body": "If I've understood correctly, the \"neon\" feature is not available\r\nin big-endian mode on aarch64.  Despite this, I need to test for\r\nboth \"neon\" feature and endian-ness to make this build.\r\n\r\nThis overall feels like a suspicious change to me. It would also\r\nbe better if we could test this in CI, but for now I'm fine relying\r\non users of these niche targets submitting patches to fix\r\nbreakages as they arise.",
          "is_bot": false,
          "headline": "simd: fix big-endian aarch64 build",
          "author_name": "he32",
          "author_login": "he32",
          "committed_at": "2024-03-20T00:05:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59b365543d01409959bb93a20a28fb34ff532c03",
          "body": null,
          "is_bot": false,
          "headline": "style: clean up lint violations",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2024-02-26T01:39:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f227162f7c56b3f28e9dd69a655316af0107b29b",
          "body": "There was some discussion about how to compare jetscii with Teddy and\nsome interesting benchmark results[1]. I decided to import the\nbenchmarks and see what things look like here.\n\n[1]: https://github.com/shepmaster/jetscii/pull/57",
          "is_bot": false,
          "headline": "benchmarks: import jetscii's benchmarks",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-10-20T16:26:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "964a2d5431d099d70e770fd4c19e51dfbb389252",
          "body": null,
          "is_bot": false,
          "headline": "benchmarks: update aho-corasick engine lock file",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-10-09T14:21:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d84a5073d5108fce1774b375105dfdb13fe4e81c",
          "body": null,
          "is_bot": false,
          "headline": "1.1.2",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-10-09T14:20:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c3802f2c8164bb77be216cd8dcd316ec9e1a331",
          "body": "This bug has existed since the 1.0 release (I believe), but was\nexacerbated when I changed the non-contiguous NFA to use a linked list\nfor its sparse transitions. In that change, I made it so the special\nsentinel DEAD and FAIL states didn't get densified to save on memory. I\ndid this because you gen\n[…]\non of the DEAD state: once you\nenter it, you can never leave.)\n\nI discovered this through some ad hoc benchmarking with rebar. I noticed\nthat one of the DFA compilation benchmarks had slowed way down.",
          "is_bot": false,
          "headline": "dfa: fix performance bug when building a DFA",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-10-09T14:16:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12025c561af747fd74c7a745e03d7e21c15f5584",
          "body": "I noticed this when running the rebar benchmarks. Some of the DFA\ncompilation benchmarks seem to have regressed.",
          "is_bot": false,
          "headline": "doc: add a FIXME about a perf problem",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-10-09T02:01:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c475c593c114229cc79512d43221c896a6fd3a6",
          "body": null,
          "is_bot": false,
          "headline": "1.1.1",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-20T13:35:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c811c294e09880ded4edc4e35bf9f923e8979af",
          "body": "It turns out that _mm_extract_epi64 requires SSE 4.1. While it would be\nfine to just require that (virtually all CPUs have it available), the\nrest of Teddy only requires SSSE3. I don't love bumping the mininum\nrequired just to get the lanes out of a vector. So just replace it with\na transmute.\n\nThe AVX2 variant isn't impacted by this since AVX2 came with\n_mm256_extract_epi64.\n\nKudos to https://github.com/llogiq/bytecount/issues/85 for making me\ncheck this.",
          "is_bot": false,
          "headline": "teddy: replace _mm_extract_epi64 with transmute",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-20T13:35:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ed2c389908163c7e253f59dfb15a155db219e8c",
          "body": "This is a WIP for now.",
          "is_bot": false,
          "headline": "benchmarks: start work on a more curated set of benchmarks",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T14:56:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd84b6d85041f47364a439567ced6bc67e03cbb7",
          "body": "This reflects the fact that these come from rebar's primary regex\nbenchmark and aren't necessarily curated with respect to Aho-Corasick\nspecifically.",
          "is_bot": false,
          "headline": "benchmarks: rename 'curated' to 'regexcurated'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T14:30:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "081a22f5d0c4845e56c324dd4f6088f23cfb7ebc",
          "body": null,
          "is_bot": false,
          "headline": "1.1.0",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:33:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "483b8a5ba4b1303a69834a8d7d2b0f3dbc670059",
          "body": "Now that we have support for aarch64, we should be a little more\ncareful.\n\nWe also add a check for target endianness and bail out if it isn't\nlittle endian. I'm pretty sure Teddy can be very easily adapted for\nbig-endian, but I don't know how to test it. That is, I don't know how\nto run Teddy on aarch64 with big-endian.",
          "is_bot": false,
          "headline": "doc: fix wording that used to only refer to x86-64",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9d633f970bbb3dcf038919023fbc6b559753092",
          "body": null,
          "is_bot": false,
          "headline": "benchmarks: add x86_64 measurements",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:22:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0820667dade1a58a066354054d371df24f13c9d",
          "body": null,
          "is_bot": false,
          "headline": "benchmarks: add aarch64 measurements",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:21:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0be6fe43822aeb193d8894fd1400c8b843320ef0",
          "body": "While this does technically rewrite Teddy, we don't really do any core\nchanges to how it previously worked. We mostly just shuffle and\nre-organize code so that it's written to use a generic vector type\ninstead of explicitly specialized to __m128i and __m256i. We also use\nthis opportunity to introduc\n[…]\nan\nimplementation of the Vector trait for `u8x16_t` on `aarch64`. Kudos to\nthe sse2neon[1] project for making that port much faster than it would\nhave been.\n\n[1]: https://github.com/DLTcollab/sse2neon",
          "is_bot": false,
          "headline": "packed: rewrite Teddy to use generic Vector interface",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:20:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9c2d30aa2010cbe58a5b9ae1179a8174a54820f6",
          "body": "We're going to replace it with a Vector trait that can be implemented\nfor multiple vector types. Similar to what was done with memchr[1].\n\nBefore doing that, we move the old stuff aside.\n\n[1]: https://github.com/BurntSushi/memchr/blob/f6188dbbca2b529100852e4509d48d2d002a674a/src/vector.rs",
          "is_bot": false,
          "headline": "packed: move old vector helpers aside",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:20:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e34ae00eca25e61a8e26fb0cf8280edb33eb3d26",
          "body": null,
          "is_bot": false,
          "headline": "benchmarks: add initial x86_64 measurements",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:20:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2747579200a90d4e2b852552423738d6c1d147cb",
          "body": null,
          "is_bot": false,
          "headline": "benchmarks: add initial aarch64 measurements",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:20:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a9cac2c3e2ae7f399bcb2e9a8cf9994e01ca326",
          "body": "We have switched to rebar.",
          "is_bot": false,
          "headline": "bench: remove Criterion benchmarks",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:20:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55dd2fc525f3dd6d09ff84dc5ccaf67a05036ba3",
          "body": "A subsequent commit will remove the Criterion benchmarks.\n\nThis essentially makes benchmarking homogenous now between the regex,\naho-corasick and memchr crates.\n\nFor now, we start with the benchmarks that were defined for Criterion.\nWill refine these over time. We also start with a naive multi-substring\nalgorithm and the daachorse crate too.",
          "is_bot": false,
          "headline": "benchmarks: switch to rebar",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:20:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a081ab459a696043c512c7b1154dedd0895dd8b",
          "body": "I botched the memchr 2.6 MSRV because it actually requires Rust 1.61\nand not Rust 1.60. This crate's MSRV is Rust 1.60, so pin memchr to a\nversion that works on Rust 1.60 (for x86-64 at least).\n\nRef https://github.com/rust-lang/regex/pull/1081",
          "is_bot": false,
          "headline": "ci: pin to memchr 2.6.2 for MSRV CI job",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-09-18T13:20:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "865932205d5d78a3c7e7e1a7033bc63a52a320ba",
          "body": "Closes #125 \r\n\r\nPR #127",
          "is_bot": false,
          "headline": "doc: add link to tmikus/ahocorasick_rs",
          "author_name": "Tomasz Mikuś",
          "author_login": null,
          "committed_at": "2023-08-30T15:53:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea0e5589794557e87661d2c8be5eb058d8ca1afc",
          "body": null,
          "is_bot": false,
          "headline": "1.0.5",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-29T18:01:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ae537cd1ca7de6897984cb7b666935c19c8c0fb",
          "body": "I added this while hacking around in the non-contiguous NFA for the\n1.0.4 release and forgot to remove it. So we do a little clean-up.",
          "is_bot": false,
          "headline": "lint: get rid of 'allow(warnings)' and fix fallout",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-29T18:01:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed6e2ffef7c1c51004dbc3f5c0a20d17d0028aa6",
          "body": "This mirrors the same change made for the regex crate.[1]\n\n[1]: https://github.com/rust-lang/regex/commit/c788378d6fe407f4774df98a78436cea5d98525b",
          "is_bot": false,
          "headline": "ci: replace mips with powerpc64 and s390x",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-29T18:01:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "776b0910a5061213815b0c18c08a173b909c744a",
          "body": "It turns out that #121 introduced a relatively sizeable performance\nregression when building very small automatons. Namely, several of the\nsteps in the construction process took worst case `O(n^2)` time, where\n`n` corresponds to the alphabet size (255 in this case). This ends up\nnot being too awful \n[…]\nead. This makes\nthings a little more complicated, and perhaps there is a better\nabstraction to make this simpler.\n\nThis was found by Ruff's benchmark suite:\nhttps://github.com/astral-sh/ruff/pull/6964",
          "is_bot": false,
          "headline": "nfa: improve construction times for small automatons",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-29T18:01:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "feda22857e1d0dd069b9c8941f0caf47a19ad078",
          "body": null,
          "is_bot": false,
          "headline": "1.0.4",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-14T16:13:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31bb1fc30da69ab8575483c55e15384d09f4c88d",
          "body": "This completely re-works how transitions are represented in a\nnon-contiguous NFA. As a result, we improve search times, decrease heap\nrequirements for an NFA by about half and decrease peak memory usage by\nabout two thirds.\n\nThe essential difference here is to move `State::trans` and\n`State::matches\n[…]\nmore games and leave that to the domain of the contiguous NFA.\n\nSee also [1] as a kick-in-the-ass to follow this thread and improve\nthings.\n\n[1]: https://github.com/G-Research/ahocorasick_rs/issues/62",
          "is_bot": false,
          "headline": "nfa/noncontiguous: use a linked list to represent transitions",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-14T16:12:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ba085aa97980750456700c84443304c119f9e783",
          "body": "The issue here is that now both the non-contiguous and contiguous NFAs\nsupport a dense depth option, but they want different default values. I\nended up increasing this by 1 to match the default value for the\nnon-contiguous NFA because it can imporve search times quite a bit. This\ndoes modestly increase memory usage of a contiguous NFA (its default\nvalue is 2), but of course, CLI users can always tweak this explicitly\nwith --dense-depth.",
          "is_bot": false,
          "headline": "aho-corasick-debug: tweak default dense depth value",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-14T16:12:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b5481576432884df09a54ec23469c69ef1f8582",
          "body": "This winds up being a modest savings in heap memory usage. If we fail in\nour experiment to change how transitions are represented, we can at\nleast bank this more modest win.\n\nInterestingly, the 'repr(packed)' attribute could be applied without any\nchanges. We just never happened to try and take a reference to any of\nthe fields on 'Transition'. (Which isn't allowed because the fields on a\npacked struct need to do unaligned loads and references must be\naligned.)",
          "is_bot": false,
          "headline": "nfa/noncontiguous: use 'repr(packed)' on 'Transition'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-14T16:12:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25327243d2e597b79eaf927189ce7546c2a1d45d",
          "body": "This commit refactors the non-contiguous NFA such that its state\ntransitions must be computed by using the NFA itself and not by using a\n`State` directly.\n\nConstruction and search time remain roughly the same here. No obvious\ndifference could be seen in ad hoc benchmarking.\n\nThe main idea here is to\n[…]\nthon\npackage. (The contiguous NFA uses far less memory, but you still need to\nbuild a non-contiguous NFA in order to get a contiguous NFA.)\n\n[1]: https://github.com/G-Research/ahocorasick_rs/issues/62",
          "is_bot": false,
          "headline": "nfa/noncontiguous: refactor to encapsulate state transitions",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-14T16:12:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "651484deb82fe0ba029e963fd62e420550726d8d",
          "body": null,
          "is_bot": false,
          "headline": "1.0.3",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-10T02:37:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "474393be8d6be7418699e0a9ef8e00fe2fd9cd75",
          "body": "This commit reduces the *actual* heap memory used by noncontiguous\nNFAs, contiguous NFAs and DFAs. Previously, all three would report\nmemory usage that only included what was actually being used within\neach Vec. But each Vec might actually have a lot more heap memory\ninside of it in the form of unus\n[…]\nnested Vecs. It turns out that they end up\npenalizing us quite a bit.\n\nThis commit was inspired by the investigation I did as part of this\nissue: https://github.com/G-Research/ahocorasick_rs/issues/62",
          "is_bot": false,
          "headline": "nfa,dfa: call shrink_to_vec in places",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-10T02:37:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e27da6435c629c502fda8c5099aff6e6ce7c9b72",
          "body": "Previously the heap usage required for storing the lengths of each\npattern was not included in the memory usage reported.",
          "is_bot": false,
          "headline": "nfa/noncontiguous: fix memory usage reporting",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-10T02:37:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcfef4114681b09ecc1d187ecfc0b96c9bdc27c1",
          "body": "I think I started with a contiguous representation but switched to\nnested allocs. Which is kind of unfortunate, and I'd like to fix that,\nbut for now we should document reality.",
          "is_bot": false,
          "headline": "dfa: fix docs for memory representation",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-08-10T02:37:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d735471fc12f0ca570cead8e17342274fae6331",
          "body": "This enables \"jump to definition\" functionality in the\r\nsource code view of rustdoc.\r\n\r\nPR #119",
          "is_bot": false,
          "headline": "docs.rs: add --generate-link-to-definition flag",
          "author_name": "Guillaume Gomez",
          "author_login": "GuillaumeGomez",
          "committed_at": "2023-07-14T18:37:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97e48b6dbdf9ebd50168540276fa3f14f403d42b",
          "body": null,
          "is_bot": false,
          "headline": "1.0.2",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-06-04T13:44:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fa9083dd1f0ce94b8608bd52bbd6bce2991a9f2",
          "body": "The specific values can change depending on pointer size, so we just\nskip them for non-64-bit targets.\n\nFixes #116",
          "is_bot": false,
          "headline": "test: fix memory usage tests",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-06-04T13:43:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "844b7742a1b064b251596db09a67c36e85dcdf18",
          "body": "OK, so it wasn't cross' fault. It was just me being dumb. Sigh.",
          "is_bot": false,
          "headline": "ci: add $TARGET to cargo commands",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-06-04T13:43:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be1d02522da72dad96f0d78c79aa7b1a1a271d5d",
          "body": "It looks like cross 0.2.1 might not be running tests correctly. Ug.",
          "is_bot": false,
          "headline": "ci: update to cross 0.2.5",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-06-04T13:43:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21389ff40e5a76167432ac807547de3188161aec",
          "body": null,
          "is_bot": false,
          "headline": "ci: move to 'actions/checkout@v3'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-06-04T13:43:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b91b78560d4f271426e9ce5c26681ef3b32aec76",
          "body": "The 'swar' test is apparently sensitive to endianness. The test is just\nabout demonstrating a technique I had tried but didn't work out for perf\nreasons. It's good to keep it, but let's just gate it on little-endian\ntargets.\n\nFixes #117",
          "is_bot": false,
          "headline": "nfa/contiguous: gate 'swar' test",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-06-04T13:43:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e6bd90740e9fea6b2124778dddb8bded88e0f4",
          "body": "It looks like rustc didn't detect this before.",
          "is_bot": false,
          "headline": "lint: remove unnecessary 'mut' binding",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-05-25T14:48:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc69ed642b4d340d5db234a49cb4609e731f18cc",
          "body": null,
          "is_bot": false,
          "headline": "1.0.1",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-21T00:26:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "301fc372baaab038109260afbe1b47fa36b4bd55",
          "body": "And also replace specific instructions to edit the `Cargo.toml` with\nrunning the `cargo add` command.",
          "is_bot": false,
          "headline": "doc: remove note about 1.0 being unpublished",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-17T18:54:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8eb6f5a3e8348ad80f16d2174c3d387064a1cc2e",
          "body": "Brief changelog from the `0.7.x` version:\n\n* A new crate feature, `std`, has been added and is enabled by\ndefault. This makes the standard library optional and permits using\n`aho-corasick` in core/alloc-only contexts. But you do need `alloc`.\n* The top-level `AhoCorasick` will mostly behave the same\n[…]\nite your own search routines. This might unlock more interesting\nstreaming use cases.\n* The `packed` submodule remains largely unchanged.\n* Increases the MSRV to Rust 1.60.0.\n\nCloses #101, Closes #108",
          "is_bot": false,
          "headline": "1.0.0",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-17T18:20:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "beb163a62eaa5a4d1cf71054451371668e1e7654",
          "body": null,
          "is_bot": false,
          "headline": "cargo: add note about plans for 'fst' integration",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-17T15:43:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7edd3498722231f5c601ef5ae77e57233b071947",
          "body": "I originally didn't intend to do this, but the Automaton trait has grown\nquite large. It seems unlikely/impractical for others to meaningfully\nimplement it. In exchange, sealing the trait means we can add new\nrequired methods while retaining backwards compatibility.\n\nFor the most part, this is an exercise in conservatism. We can always\nunseal it if it turns out people really want to implement it themselves.",
          "is_bot": false,
          "headline": "api: seal the Automaton trait",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-15T13:03:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72e0f659c59e5388899f9eb2ae15854193bef71b",
          "body": "I think this is what was preventing CI from running? Terrible failure\nmodes. Just fails due to an \"internal error.\"",
          "is_bot": false,
          "headline": "ci: update OS versions",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-05T13:18:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f59744598b8cef44d38053750700990ba30f0828",
          "body": "Ref https://github.com/BurntSushi/aho-corasick/issues/108#issuecomment-1492823546",
          "is_bot": false,
          "headline": "doc: tweak docs for perf-literal crate feature",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-05T13:18:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b99c36e2f39431f54c557f36a04111bebb769d58",
          "body": "Ref https://github.com/BurntSushi/aho-corasick/issues/108#issuecomment-1489239160",
          "is_bot": false,
          "headline": "doc: a variety of improvements",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-05T13:18:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1004246d56a1c6354d0267a99cff7d0915c81d8f",
          "body": "Ref https://github.com/BurntSushi/aho-corasick/issues/108#issuecomment-1489239160",
          "is_bot": false,
          "headline": "doc: 'std' also enables the stream search APIs",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-05T13:18:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ffc20336e4169f58c3d686c06c679ae43ca0371",
          "body": "Basically, we now make AhoCorasickBuilder::kind ask for an\nOption<AhoCorasickKind>. When None (the default), it will behave the\nsame as the old AhoCorasickKind::Auto variant.\n\nThis change then opens the door to adding a AhoCorasick::kind method\nwhich reports what kind of automaton is actually used. \n[…]\nlated into some\nother specific variant and would never be returned by AhoCorasick::kind.\n\nThis suggestion was taken from the feedback given here:\nhttps://github.com/G-Research/ahocorasick_rs/issues/50",
          "is_bot": false,
          "headline": "api: drop AhoCorasickKind::auto and add AhoCorasick::kind",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-04-05T13:18:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "070de2a99c2dfd666dc8a071588ca3579d9ef7ee",
          "body": null,
          "is_bot": false,
          "headline": "ci: add a test run with the 'logging' feature",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-28T11:38:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74afa893e1f0723cbda9774d2fd135a93d9130bf",
          "body": null,
          "is_bot": false,
          "headline": "impl: clean up some of the 'allow' directives",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-28T11:36:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c88cf359f9c853986d7c182b013f5c6d81af10c3",
          "body": "This commit does some surgery on the in memory representation of\nthe contiguous NFA. Previously, we had been packing both the next\ntransition ID and the byte corresponding to that transition into a\nsingle u32. In order to achieve that, we placed a restriction on the\nallowable state IDs: they must be\n[…]\nGB of memory, but it\ncan now actually be done. (The non-contiguous NFA is about 10GB of\nmemory, which does still need to be built first, but then it can be\ndiscarded once the contiguous NFA is built.)",
          "is_bot": false,
          "headline": "nfa/contiguous: expand utility of contiguous NFA at cost of memory",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-23T01:58:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "05d8b0ebbc89be6dad297503ba7c6dd0e5607d45",
          "body": null,
          "is_bot": false,
          "headline": "vim: cause rust-analyzer to see aho-corasick-debug",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-23T01:58:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b26ce9054485ec5ad28f6ced10d3303335bcf274",
          "body": "I never meant to export this. Thank goodness I caught it before 1.0.\nSheesh.",
          "is_bot": false,
          "headline": "api: un-export StreamChunkIter",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-21T01:20:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f91b5011ff08e243fa7e523998a65c81ee98c92",
          "body": "Basically, we:\n\n1. Add 'min_pattern_len' to complement 'max_pattern_len'.\n2. Rewrite stream search to be less convuleted by just walking the\n   automaton ourselves.\n3. Ban stream searching when the automaton contains an empty pattern.\n\nI did (3) because it greatly simplifies the implementation and it\nhonestly seems like a footgun to support it anyway.",
          "is_bot": false,
          "headline": "impl: rework stream searching",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-10T16:44:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86fdfecaf66330b2cebb4ad6b47d0ff7ece60674",
          "body": "I think it was probably a little silly to try and use 'Input'\nhere. I think I was trying to copy regex-automata too much. In\naho-corasick, all we need is the anchor mode since we don't care\nabout look-around here.\n\nThis also makes a lot of the calls more sensible, since we were\njust materializing dummy 'Input' values just to get the start\nstate.",
          "is_bot": false,
          "headline": "api: use 'Anchored' instead of 'Input' for 'start_state'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-10T16:44:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0317ac8a366106608acc76c3aa73ae3b72039ab3",
          "body": "I'm expecting that I'll move this stuff to the 'fst' crate and make\n'aho-corasick' an optional dependency there. And do the same for\n'regex-automata'. Basically, I'd just prefer not to depend on 'fst' from\nthese core crates.\n\nI think the reason why I did this historically was on the off chance\nthat I used 'fst' from aho-corasick (or more likely, regex-syntax) for\nparsing Unicode character names. But I think that's very unlikely to\never happen.",
          "is_bot": false,
          "headline": "fst: fix docs in transducer impls",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-03-10T16:44:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6e61c4119652e2117286578aead7d6d19da1be6",
          "body": "This was fixed in aho-corasick 0.7.x, but I re-introduced it in my\nrefactoring. Essentially, stream searching and prefilters do not mix\nwell. I believe it's possible to do, but it requires a fair bit more\nsophistication to ensure that the results of a prefilter are correctly\nsynchronized with the current state of the Aho-Corasick automaton. If\nthey get out of sync, then \"resuming\" a search at a non-contiguous point\nin the stream will likely give incorrect results.",
          "is_bot": false,
          "headline": "stream: fix a bug in our stream handling",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-27T16:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e943403a922839c0b1f62fa0e96779c37fdb4681",
          "body": null,
          "is_bot": false,
          "headline": "ci: add tests for 'std' and 'std,perf-literal'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-27T16:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2df0983e7ef76bf50e6213fee35cda87af191292",
          "body": "The packed prefilters determine their own pattern IDs, so when\nwe build prefilters, we should make sure that their pattern IDs\nare in sync with the pattern IDs for the Aho-Corasick automaton.",
          "is_bot": false,
          "headline": "prefilter: fix a prefilter bug",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-27T16:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee4c05e07ae2e12c9aea4763ec0e6426f358ff7f",
          "body": "This lets us use \"weak dependency\" features. Namely, we permit folks to\nenable 'std' without necessarily bringing in 'memchr'. We also get to\navoid exposing features named 'memchr' and 'log'.",
          "is_bot": false,
          "headline": "msrv: bump to Rust 1.60",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-27T16:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d58908d7ee892193ebd3d7ff13b46812e06cf117",
          "body": "This fixes typos and generally polishes things up. The biggest change\nhere is making 'Input' panic eagerly if the bounds given to it are\ninvalid for its haystack. I'm still not quite sure about doing things\nthis way, but it seems sensible. Otherwise, it's kind of just left up to\nthe search implementation to panic or not. Which may or may not happen\ndepending on whether the haystack is actually accessed.",
          "is_bot": false,
          "headline": "doc: polish",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-27T16:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11db9750f447cf0085fa9dce11326bd705aa43fa",
          "body": "While we don't currently utilize the safety property here, we might in\nthe future want to eliminate bounds checks (or other things) that depend\non the correctness of implementations of `Automaton`.\n\nSince I don't expect people to be implementing the `Automaton` trait\ncommonly, this doesn't seem like a big burden. And in general, the\nsafety property here is quite sensible. Any implementation of\n`Automaton` that wouldn't satisfy it is likely badly broken.",
          "is_bot": false,
          "headline": "api: make the 'Automaton' trait unsafe to implement",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-27T16:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04ded231f5cdcec12aeb0bf829fa324caccb689c",
          "body": "We leave the code commented out and in the tree for now, but I think\nI'm going to either move it to a new crate ('fst-aho-corasick'\nperhaps?) or make it an optional feature on 'fst' itself.",
          "is_bot": false,
          "headline": "deps: drop 'fst' completely",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-27T16:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e7fa3b85dd3a3ce882896f1d4ee22b1f271f0b4",
          "body": "It turns out that 4 byte needles can really make a difference in\nsome cases. In one particular case, 3 byte Teddy was being used on\nCyrillic text. The first 2 bytes of most needles corresponded to one\ncodepoint, while the last byte corresponding to the leading byte of\nthe next codepoint. But since m\n[…]\ncation routine because of a very high false\npositive rate.\n\nHaving the ability to use 4 bytes helps a lot here, because (at least\nin the case of Cyrillic text), it lets us capture two full codepoints.",
          "is_bot": false,
          "headline": "packed/teddy: add support for searching 4 byte needles",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-18T13:55:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee6432c0a7a1c29c2db66bb514c0e8412978375f",
          "body": "In some cases, Teddy can spend a lot of time in verification, and\nthis seems to slightly improve codegen leading to a small perf\nboost.",
          "is_bot": false,
          "headline": "packed/teddy: inline a loop",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-18T13:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a949b34adc0ee2d32d7e771f53ea56e9e1cb7fe",
          "body": "This seems to help in some cases where Teddy spends a lot of time\nin verification. This also matches what we do in 'memchr::memmem'.\nThe idea here is that we tend to search a lot of short needles,\nso when we use a slower 'zip' loop for everything less than 8\nbytes, we wind up doing the slower loop in most cases.",
          "is_bot": false,
          "headline": "packed: switch 'memcmp' to use 4 bytes",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-18T13:47:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f01480bcb4a988701fb03eb7ff7fdef7c934f0a7",
          "body": "This makes it a bit clearer which packed searcher is being\nselected.",
          "is_bot": false,
          "headline": "packed: add some log messages",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-02-18T13:45:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e74ed25054d65aae4bd6d648e163c5635e0ce6ab",
          "body": "Thanks @ahxxm for noticing this!\n\nSee: https://github.com/BurntSushi/aho-corasick/commit/28b679dc217aca49f92190867b7d88e574fd8e02#r95649653",
          "is_bot": false,
          "headline": "readme: change 2022 to 2023, derp",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-10T13:43:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14b41aa00c68e0d8fe883a2d40465433fb8f5e25",
          "body": "Since it's no longer part of the workspace (because of annoying MSRV\nissues), this setting is no longer inherited.",
          "is_bot": false,
          "headline": "aho-corasick-debug: set debug=true",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-10T13:41:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28b679dc217aca49f92190867b7d88e574fd8e02",
          "body": null,
          "is_bot": false,
          "headline": "readme: note that 1.0 isn't released yet",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T12:33:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b6b6c4165cf5e2d3dc6b092356b9b383250dd0c",
          "body": "PR #100",
          "is_bot": false,
          "headline": "msrv: set rust-version to 1.56.1",
          "author_name": "Alex Touchet",
          "author_login": "atouchet",
          "committed_at": "2023-01-05T12:30:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf495271f48309654b0afeefa06516aa425f7fd0",
          "body": "I dunno why builds are choking on not being able to find env_logger\n0.10.0 or bstr 1.0 and then not being able to do anything else. So for\nnow, just drop bstr (sigh) and kick aho-corasick-debug and bench out of\nthe workspace.",
          "is_bot": false,
          "headline": "msrv: drop bstr and kick aho-corasick-debug out of workspace",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e453f6062651f338ca3a7fb217f7590a2f89f9ab",
          "body": "I'm not sure why this wasn't caught in the old API, as I think the same\nbug existed.",
          "is_bot": false,
          "headline": "fuzz: fix a bug caught by the fuzzer",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "730ecbd911fa1dd7fcfd36d9e4cd2e113bcf4514",
          "body": "... and also clean up the code.",
          "is_bot": false,
          "headline": "fuzz: update the fuzzer to work with API changes",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f32d32e549f906c4f2910802ee4903d5d35f7fba",
          "body": "This commit nearly wipes the slate clean with respect to the\nAho-Corasick implementations and rebuilds things from scratch. The main\nthing that motivated this was actually to make it possible for\nAho-Corasick automata to support both unanchored and anchored searches,\nwithout having to build two dist\n[…]\natterns is very small.\n\nOther than that, the central type of this crate remains 'AhoCorasick',\nand its most common use cases will work almost unchanged from\n'aho-corasick 0.7'.\n\nCloses #57, Closes #83",
          "is_bot": false,
          "headline": "api: rewrite most of the crate and give an API refresh",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b9b090fdcef9882cff92ba7c65cbe6befe68ac9",
          "body": "Now that we've greatly simplified leftmost NFA construction, we no\nlonger need to record the depth of a state. (We do still use it to\ndetermine whether to build a sparse or a dense state, though, that\ndoesn't require storing the depth.)",
          "is_bot": false,
          "headline": "impl: get rid of 'depth' on 'State'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6210098131a611c58815b390d47a60da7c681c4a",
          "body": null,
          "is_bot": false,
          "headline": "rust: move to the 2021 edition",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b7afdf41e636cf02fc3bcd32360c268417ef34f",
          "body": "Now that byte classes and premultiplication are no longer meaningfully\nconfigurable, we fix the benchmarks.",
          "is_bot": false,
          "headline": "bench: fix benchmarks",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac1fe99a47a7b13741596d4fd98bb72cd950cf58",
          "body": "I probably could have removed this a long time ago, but I think it just\nslipped through the cracks. 0..=255 is much nicer.",
          "is_bot": false,
          "headline": "impl: remove 'AllBytesIter'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c35edc7c53dda5b1297b1be2db525cade3525ed",
          "body": "'slice::copy_within' was stabilized in Rust 1.37, which is now way under\nour MSRV.",
          "is_bot": false,
          "headline": "impl: remove 'unsafe' by using 'copy_within'",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aa87d3a62508ecca6d36252cabbc5a6491972e8",
          "body": "This gets rid of 'Premultiplied'. All that's left now is a DFA with\npremultiplied state IDs and equivalence classes.\n\nThis let's us also get rid of the 'Repr' vs 'DFA' split, since the\nformer was only used to represent the common bits between the different\ntypes of DFAs. But now that we only have one, everything can get\nflattened down.",
          "is_bot": false,
          "headline": "dfa: shrink down to a single variant",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15efdab0af1777a65e29ec1d8c7ced6764ea6c5a",
          "body": "This was deprecated some time ago. We will always enable\npremultiplication.\n\nThe next step will be to always enable byte classes, albeit, with the\noption to still disable them so that transitions are easier to debug.\nNote though, than even when disabled, the byte class map will still be\nused such th\n[…]\nwell.\n\nEventually, we'll also remove the generic 'S: StateID' parameter as well\nand force the use of 'u32' everywhere. This makes every a lot more\nconcrete and strikes a good middle ground everywhere.",
          "is_bot": false,
          "headline": "api: remove 'premultiply' option",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54da4b04dfb1550f545788b9e1815725c35c5899",
          "body": "It turns out that we weren't using the \"leftmost with state\" code at\nall. I believe I had originally added this in an attempt to make the\nleftmost searching work with streams, but I wasn't able to tie it\ntogether and forgot to get rid of part of the aborted attempt.",
          "is_bot": false,
          "headline": "cleanup: remove some dead code",
          "author_name": "Andrew Gallant",
          "author_login": "BurntSushi",
          "committed_at": "2023-01-05T04:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 61,
      "commits_last_year": 7,
      "latest_release_at": "2025-10-28T21:09:41Z",
      "latest_release_tag": "1.1.4",
      "releases_from_tags": true,
      "days_since_last_push": 92,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 267,
      "mean_days_between_releases": 102.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "aho-corasick",
          "exists": true,
          "license": "Unlicense OR MIT",
          "keywords": [
            "text",
            "search",
            "string",
            "multi",
            "pattern",
            "text-processing"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/aho-corasick",
          "is_deprecated": false,
          "latest_version": "1.1.4",
          "repository_url": "https://github.com/BurntSushi/aho-corasick",
          "versions_count": 62,
          "total_downloads": 975017109,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 67322380,
          "first_published_at": "2015-06-12T01:15:54.846782Z",
          "latest_published_at": "2025-10-28T21:09:48.086878Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 267
        }
      ]
    },
    "popularity": {
      "forks": 116,
      "stars": 1269,
      "watchers": 15,
      "fork_history": {
        "days": [
          {
            "date": "2015-07-09",
            "count": 1
          },
          {
            "date": "2015-10-04",
            "count": 1
          },
          {
            "date": "2015-10-15",
            "count": 1
          },
          {
            "date": "2015-12-25",
            "count": 1
          },
          {
            "date": "2016-02-16",
            "count": 2
          },
          {
            "date": "2016-05-11",
            "count": 1
          },
          {
            "date": "2017-02-02",
            "count": 1
          },
          {
            "date": "2017-02-04",
            "count": 1
          },
          {
            "date": "2017-07-24",
            "count": 1
          },
          {
            "date": "2017-07-25",
            "count": 1
          },
          {
            "date": "2017-08-29",
            "count": 1
          },
          {
            "date": "2017-10-29",
            "count": 1
          },
          {
            "date": "2017-11-08",
            "count": 1
          },
          {
            "date": "2017-11-29",
            "count": 1
          },
          {
            "date": "2017-12-13",
            "count": 1
          },
          {
            "date": "2018-02-15",
            "count": 1
          },
          {
            "date": "2018-05-02",
            "count": 1
          },
          {
            "date": "2018-05-13",
            "count": 2
          },
          {
            "date": "2018-05-24",
            "count": 1
          },
          {
            "date": "2018-06-05",
            "count": 1
          },
          {
            "date": "2018-10-18",
            "count": 1
          },
          {
            "date": "2019-01-05",
            "count": 1
          },
          {
            "date": "2019-01-18",
            "count": 1
          },
          {
            "date": "2019-02-16",
            "count": 1
          },
          {
            "date": "2019-04-02",
            "count": 1
          },
          {
            "date": "2019-04-04",
            "count": 1
          },
          {
            "date": "2019-04-28",
            "count": 1
          },
          {
            "date": "2019-05-14",
            "count": 1
          },
          {
            "date": "2019-09-17",
            "count": 1
          },
          {
            "date": "2019-11-18",
            "count": 1
          },
          {
            "date": "2019-12-03",
            "count": 1
          },
          {
            "date": "2020-01-01",
            "count": 1
          },
          {
            "date": "2020-02-21",
            "count": 1
          },
          {
            "date": "2020-07-01",
            "count": 1
          },
          {
            "date": "2020-09-15",
            "count": 1
          },
          {
            "date": "2020-10-14",
            "count": 1
          },
          {
            "date": "2020-10-25",
            "count": 1
          },
          {
            "date": "2020-10-27",
            "count": 1
          },
          {
            "date": "2020-12-15",
            "count": 1
          },
          {
            "date": "2021-03-24",
            "count": 1
          },
          {
            "date": "2021-03-28",
            "count": 2
          },
          {
            "date": "2021-04-03",
            "count": 1
          },
          {
            "date": "2021-04-16",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 1
          },
          {
            "date": "2021-06-19",
            "count": 1
          },
          {
            "date": "2021-07-03",
            "count": 1
          },
          {
            "date": "2021-07-15",
            "count": 1
          },
          {
            "date": "2021-09-14",
            "count": 1
          },
          {
            "date": "2021-09-17",
            "count": 1
          },
          {
            "date": "2021-10-15",
            "count": 1
          },
          {
            "date": "2021-11-02",
            "count": 1
          },
          {
            "date": "2022-02-02",
            "count": 1
          },
          {
            "date": "2022-02-28",
            "count": 1
          },
          {
            "date": "2022-03-23",
            "count": 1
          },
          {
            "date": "2022-05-11",
            "count": 1
          },
          {
            "date": "2022-05-15",
            "count": 1
          },
          {
            "date": "2022-05-17",
            "count": 1
          },
          {
            "date": "2022-06-01",
            "count": 1
          },
          {
            "date": "2022-06-14",
            "count": 1
          },
          {
            "date": "2022-07-17",
            "count": 1
          },
          {
            "date": "2022-08-08",
            "count": 1
          },
          {
            "date": "2022-08-13",
            "count": 1
          },
          {
            "date": "2022-08-15",
            "count": 1
          },
          {
            "date": "2022-09-13",
            "count": 1
          },
          {
            "date": "2022-12-14",
            "count": 1
          },
          {
            "date": "2023-01-05",
            "count": 1
          },
          {
            "date": "2023-02-22",
            "count": 1
          },
          {
            "date": "2023-04-04",
            "count": 1
          },
          {
            "date": "2023-08-07",
            "count": 1
          },
          {
            "date": "2023-08-18",
            "count": 1
          },
          {
            "date": "2023-08-29",
            "count": 1
          },
          {
            "date": "2023-10-07",
            "count": 1
          },
          {
            "date": "2023-10-16",
            "count": 1
          },
          {
            "date": "2023-10-26",
            "count": 1
          },
          {
            "date": "2023-11-13",
            "count": 1
          },
          {
            "date": "2023-11-20",
            "count": 1
          },
          {
            "date": "2024-01-07",
            "count": 1
          },
          {
            "date": "2024-02-13",
            "count": 1
          },
          {
            "date": "2024-02-18",
            "count": 1
          },
          {
            "date": "2024-02-25",
            "count": 1
          },
          {
            "date": "2024-05-04",
            "count": 1
          },
          {
            "date": "2024-10-23",
            "count": 1
          },
          {
            "date": "2024-11-08",
            "count": 1
          },
          {
            "date": "2024-11-09",
            "count": 1
          },
          {
            "date": "2024-11-16",
            "count": 1
          },
          {
            "date": "2024-11-21",
            "count": 1
          },
          {
            "date": "2025-01-01",
            "count": 1
          },
          {
            "date": "2025-01-24",
            "count": 1
          },
          {
            "date": "2025-02-04",
            "count": 1
          },
          {
            "date": "2025-06-23",
            "count": 1
          },
          {
            "date": "2025-07-04",
            "count": 1
          },
          {
            "date": "2025-10-01",
            "count": 1
          },
          {
            "date": "2025-10-15",
            "count": 1
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-11-15",
            "count": 1
          },
          {
            "date": "2025-11-17",
            "count": 1
          },
          {
            "date": "2025-12-04",
            "count": 1
          },
          {
            "date": "2025-12-16",
            "count": 1
          },
          {
            "date": "2026-01-27",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-03-19",
            "count": 1
          },
          {
            "date": "2026-04-06",
            "count": 1
          },
          {
            "date": "2026-04-12",
            "count": 1
          },
          {
            "date": "2026-05-03",
            "count": 1
          },
          {
            "date": "2026-05-19",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 111,
        "total_forks": 116
      },
      "star_history": null,
      "open_issues_and_prs": 16
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "aho-corasick-debug/Cargo.toml",
        "benchmarks/engines/naive/Cargo.toml",
        "benchmarks/engines/rust-aho-corasick/Cargo.toml",
        "benchmarks/engines/rust-daachorse/Cargo.toml",
        "benchmarks/engines/rust-jetscii/Cargo.toml",
        "benchmarks/engines/rust-old-aho-corasick/Cargo.toml",
        "benchmarks/shared/Cargo.toml",
        "fuzz/Cargo.toml"
      ],
      "largest_source_bytes": 107521,
      "source_files_sampled": 40,
      "oversized_source_files": 3,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "aho-corasick-debug/Cargo.toml",
        "fuzz/Cargo.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 3,
        "malicious_count": 0,
        "assessed_package": "crates:aho-corasick@1.1.4",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates"
      ],
      "dependencies": [
        {
          "name": "log",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.17"
        },
        {
          "name": "memchr",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.4.0"
        },
        {
          "name": "aho-corasick",
          "manifest": "aho-corasick-debug/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "*"
        },
        {
          "name": "anyhow",
          "manifest": "aho-corasick-debug/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0.68"
        },
        {
          "name": "memmap2",
          "manifest": "aho-corasick-debug/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5.8"
        },
        {
          "name": "env_logger",
          "manifest": "aho-corasick-debug/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9.3"
        },
        {
          "name": "clap",
          "manifest": "aho-corasick-debug/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.34.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "aho-corasick",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "aho-corasick",
            "direct": true,
            "version": "1.0.5",
            "ecosystem": "crates"
          },
          {
            "name": "anyhow",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "anyhow",
            "direct": true,
            "version": "1.0.69",
            "ecosystem": "crates"
          },
          {
            "name": "anyhow",
            "direct": true,
            "version": "1.0.72",
            "ecosystem": "crates"
          },
          {
            "name": "anyhow",
            "direct": true,
            "version": "1.0.75",
            "ecosystem": "crates"
          },
          {
            "name": "clap",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "env_logger",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "env_logger",
            "direct": true,
            "version": "0.9.3",
            "ecosystem": "crates"
          },
          {
            "name": "log",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "log",
            "direct": true,
            "version": "0.4.20",
            "ecosystem": "crates"
          },
          {
            "name": "memchr",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "memchr",
            "direct": true,
            "version": "2.5.0",
            "ecosystem": "crates"
          },
          {
            "name": "memchr",
            "direct": true,
            "version": "2.6.3",
            "ecosystem": "crates"
          },
          {
            "name": "memmap2",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "atty",
            "direct": false,
            "version": "0.2.14",
            "ecosystem": "crates"
          },
          {
            "name": "bstr",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "crates"
          },
          {
            "name": "bstr",
            "direct": false,
            "version": "1.6.2",
            "ecosystem": "crates"
          },
          {
            "name": "daachorse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "crates"
          },
          {
            "name": "doc-comment",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "hermit-abi",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "crates"
          },
          {
            "name": "humantime",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "crates"
          },
          {
            "name": "jetscii",
            "direct": false,
            "version": "0.5.3",
            "ecosystem": "crates"
          },
          {
            "name": "lexopt",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "crates"
          },
          {
            "name": "libc",
            "direct": false,
            "version": "0.2.148",
            "ecosystem": "crates"
          },
          {
            "name": "libfuzzer-sys",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "proc-macro2",
            "direct": false,
            "version": "1.0.66",
            "ecosystem": "crates"
          },
          {
            "name": "quote",
            "direct": false,
            "version": "1.0.33",
            "ecosystem": "crates"
          },
          {
            "name": "regex",
            "direct": false,
            "version": "1.9.5",
            "ecosystem": "crates"
          },
          {
            "name": "regex-automata",
            "direct": false,
            "version": "0.3.8",
            "ecosystem": "crates"
          },
          {
            "name": "regex-syntax",
            "direct": false,
            "version": "0.7.5",
            "ecosystem": "crates"
          },
          {
            "name": "serde",
            "direct": false,
            "version": "1.0.152",
            "ecosystem": "crates"
          },
          {
            "name": "serde",
            "direct": false,
            "version": "1.0.177",
            "ecosystem": "crates"
          },
          {
            "name": "serde",
            "direct": false,
            "version": "1.0.178",
            "ecosystem": "crates"
          },
          {
            "name": "serde",
            "direct": false,
            "version": "1.0.188",
            "ecosystem": "crates"
          },
          {
            "name": "serde_derive",
            "direct": false,
            "version": "1.0.188",
            "ecosystem": "crates"
          },
          {
            "name": "syn",
            "direct": false,
            "version": "2.0.31",
            "ecosystem": "crates"
          },
          {
            "name": "termcolor",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "crates"
          },
          {
            "name": "unicode-ident",
            "direct": false,
            "version": "1.0.11",
            "ecosystem": "crates"
          },
          {
            "name": "winapi",
            "direct": false,
            "version": "0.3.9",
            "ecosystem": "crates"
          },
          {
            "name": "winapi-i686-pc-windows-gnu",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "crates"
          },
          {
            "name": "winapi-util",
            "direct": false,
            "version": "0.1.5",
            "ecosystem": "crates"
          },
          {
            "name": "winapi-x86_64-pc-windows-gnu",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "crates"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 43,
        "direct_count": 15,
        "indirect_count": 28
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 9,
        "merged_prs": 63,
        "open_issues": 7,
        "closed_ratio": 0.914,
        "closed_issues": 74,
        "closed_unmerged_prs": 13
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "BurntSushi",
          "commits": 242,
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4"
        },
        {
          "type": "User",
          "login": "andrew-d",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/1079173?v=4"
        },
        {
          "type": "User",
          "login": "Marwes",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/957312?v=4"
        },
        {
          "type": "User",
          "login": "atouchet",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/26315797?v=4"
        },
        {
          "type": "User",
          "login": "GuillaumeGomez",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/3050060?v=4"
        },
        {
          "type": "User",
          "login": "jneem",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/1448113?v=4"
        },
        {
          "type": "User",
          "login": "ruuda",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/506953?v=4"
        },
        {
          "type": "User",
          "login": "Ten0",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/9094255?v=4"
        },
        {
          "type": "User",
          "login": "adetaylor",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/145740?v=4"
        },
        {
          "type": "User",
          "login": "allaboutevemirolive",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/112833599?v=4"
        }
      ],
      "contributors_sampled": 31,
      "top_contributor_share": 0.837
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": false,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 3,
            "reason": "3 out of 9 merged PRs checked by a CI test -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 1,
            "reason": "Found 4/26 approved changesets -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 6 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 10,
            "reason": "project is fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 1,
            "reason": "0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 10,
            "reason": "all dependencies are pinned",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "c82178696b9ddc18b56c3c74853529e7926ff329",
        "ran_at": "2026-07-22T23:51:51Z",
        "aggregate_score": 5.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T01:39:02Z",
      "oldest_open_prs": [
        {
          "number": 148,
          "created_at": "2024-10-23T17:12:34Z",
          "last_comment_at": "2024-12-01T22:48:20Z",
          "last_comment_author": "hirehamir"
        },
        {
          "number": 153,
          "created_at": "2025-02-05T09:24:10Z",
          "last_comment_at": "2025-02-17T07:31:58Z",
          "last_comment_author": "bobozaur"
        },
        {
          "number": 167,
          "created_at": "2026-02-16T07:10:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 172,
          "created_at": "2026-05-03T13:58:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 174,
          "created_at": "2026-05-19T20:51:14Z",
          "last_comment_at": "2026-07-08T15:18:05Z",
          "last_comment_author": "xtqqczze"
        },
        {
          "number": 177,
          "created_at": "2026-07-10T15:24:25Z",
          "last_comment_at": "2026-07-10T22:14:35Z",
          "last_comment_author": "BurntSushi"
        },
        {
          "number": 178,
          "created_at": "2026-07-11T08:34:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 179,
          "created_at": "2026-07-11T08:46:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 180,
          "created_at": "2026-07-11T09:06:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-04-21T20:54:15Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 137,
          "created_at": "2023-12-06T12:25:45Z",
          "last_comment_at": "2023-12-06T12:41:45Z",
          "last_comment_author": "BurntSushi"
        },
        {
          "number": 138,
          "created_at": "2023-12-26T10:25:06Z",
          "last_comment_at": "2026-02-22T22:59:17Z",
          "last_comment_author": "hsqStephenZhang"
        },
        {
          "number": 140,
          "created_at": "2024-03-25T12:09:35Z",
          "last_comment_at": "2024-03-25T14:03:01Z",
          "last_comment_author": "BurntSushi"
        },
        {
          "number": 146,
          "created_at": "2024-10-15T03:24:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 173,
          "created_at": "2026-05-04T08:06:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 175,
          "created_at": "2026-06-03T09:19:32Z",
          "last_comment_at": "2026-06-03T12:06:02Z",
          "last_comment_author": "BurntSushi"
        },
        {
          "number": 176,
          "created_at": "2026-06-03T09:31:12Z",
          "last_comment_at": "2026-06-03T12:04:23Z",
          "last_comment_author": "BurntSushi"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/BurntSushi/aho-corasick",
    "host": "github.com",
    "name": "aho-corasick",
    "owner": "BurntSushi"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 68,
        "vitality": 36,
        "community": 72,
        "governance": 67,
        "engineering": 38
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 36,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "critical",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 22,
            "inputs": {
              "commits_last_year": 7,
              "human_commit_share": 0.99,
              "days_since_last_push": 92,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 92 days ago",
                "points": 9.9,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 92
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "7 commits in the last year",
                "points": 8.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "releases_count": 61,
              "latest_release_tag": "1.1.4",
              "releases_from_tags": true,
              "days_since_latest_release": 267,
              "mean_days_between_releases": 102.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "61 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 61
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 267 days ago",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 267
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~102.4 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 102.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 92,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 92 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 92
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 72,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "forks": 116,
              "stars": 1269,
              "watchers": 15,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1,269 stars",
                "points": 50.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1269
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "116 forks",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 116
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "15 watchers",
                "points": 6.4,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Unlicense)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Unlicense"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "packages": [
                "aho-corasick"
              ],
              "dependents": null,
              "ecosystems": "crates",
              "total_downloads": 975017109,
              "monthly_downloads": 67322380
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "67,322,380 downloads/month across crates",
                "points": 80,
                "status": "met",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 67322380,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 67,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 31,
              "top_contributor_share": 0.837
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 84% of commits",
                "points": 3.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 84
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "31 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 31
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "merged_prs": 63,
              "open_issues": 7,
              "closed_issues": 74,
              "issue_closed_ratio": 0.914,
              "closed_unmerged_prs": 13
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "91% of issues closed",
                "points": 42.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 91
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "63/76 decided PRs merged",
                "points": 31.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 63,
                      "decided": 76
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 4/26 approved changesets -- score normalized to 1",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 75,
            "inputs": {
              "followers": 12664,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "BurntSushi",
              "public_repos": 182,
              "account_age_days": 5747
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "12,664 followers of BurntSushi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 12664,
                      "login": "BurntSushi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "182 public repos, account ~15 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 182
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 91,
            "inputs": {
              "packages": [
                "aho-corasick"
              ],
              "ecosystems": "crates",
              "any_deprecated": false,
              "min_days_since_publish": 267
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on crates",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 267 days ago",
                "points": 26,
                "status": "partial",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 267
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "62 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 62
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "at_risk",
        "name": "Engineering Quality",
        "value": 38,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "has_ci": true,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "3 out of 9 merged PRs checked by a CI test -- score normalized to 3",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [
                "aho-corasick",
                "substring-matching",
                "finite-state-machine",
                "text-processing",
                "search"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 68,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 5.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 9 merged PRs checked by a CI test -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 4/26 approved changesets -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is fuzzed",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:aho-corasick@1.1.4 runtime dependency closure — what installing the published package pulls in — 3 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "crates:aho-corasick@1.1.4",
                  "assessed": 3
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 3,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 3,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 13
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 56,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.899,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "89 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 89,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "aho-corasick-debug/Cargo.toml",
                "benchmarks/engines/naive/Cargo.toml",
                "benchmarks/engines/rust-aho-corasick/Cargo.toml",
                "benchmarks/engines/rust-daachorse/Cargo.toml",
                "benchmarks/engines/rust-jetscii/Cargo.toml",
                "benchmarks/engines/rust-old-aho-corasick/Cargo.toml",
                "benchmarks/shared/Cargo.toml",
                "fuzz/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, aho-corasick-debug/Cargo.toml, benchmarks/engines/naive/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, aho-corasick-debug/Cargo.toml, benchmarks/engines/naive/Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 96,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 107521,
              "source_files_sampled": 40,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/40 source files over 60KB",
                "points": 50.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 40,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch crates package 'aho-corasick-debug' from its registry"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T23:52:12.731432Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/BurntSushi/aho-corasick.svg",
  "full_name": "BurntSushi/aho-corasick",
  "license_state": "standard",
  "license_spdx": "Unlicense"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计crates.io.