Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 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 р.Переглянути на GitHub ↗

BurntSushi/aho-corasick має індекс здоров’я 55 зі 100, що відповідає смузі «Помірний». Найвищий показник — Community & Adoption (72/100), найнижчий — Vitality (36/100). Останнє оновлення було 92 дні тому. Більшість нещодавньої роботи виконує один учасник.

55
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

55
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Andrew GallantОсобистий обліковий запис
12 664 підписники182 публічні репозиторіїз жовт. 2010 р.@openai

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
crates.ioaho-corasick1.1.467 322 38062267 днів томуtextsearchstringmultipatterntext-processing

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

36У зоні ризику · 22% загального індексу
Як обчислюється оцінка
9.9/36Свіжість push — останній push 92 дн. тому
2.8/36Ритм комітів — 4/52 тижнів із комітами
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
Як обчислюється оцінка
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
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Unlicense)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
80/80Щомісячні завантаження — 67 322 380 завантажень/місяць у crates
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Вирішення issue — закрито 91% issue
31.7/38.3Прийняття PR — злито 63/76 вирішених PR
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Охоплення власника — 12 664 підписників у BurntSushi
25/25Послужний список — 182 публічних репозиторіїв, вік облікового запису ~15 р.
Використані вхідні дані
followers12 664
owner_typeUser
is_verified
owner_loginBurntSushi
public_repos182
account_age_days5 747
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у crates
26/35Свіжість публікацій — остання публікація 267 дн. тому
20/20Історія версій — 62 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesaho-corasick
ecosystemscrates
any_deprecatedні
min_days_since_publish267

Інженерна якість

Чи наявні базові інженерні практики та документація?

38У зоні ризику · 20% загального індексу

Інженерні практики

30У зоні ризику
Як обчислюється оцінка
24/24Процеси CI — 1 процес(ів) CI
0/24Наявні тести
0/16Конфігурація лінтера
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
Виключено з оцінювання (немає даних або не застосовно): Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено з runtime-замиканням залежностей crates:aho-corasick@1.1.4 — тим, що тягне за собою встановлення опублікованого пакета, — 3 пакетів. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

56Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 89 з 99 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
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/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Rust (статично типізована)
10/10Відтворюване середовище — lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
8/8Автоматизоване супроводження — 1 з останніх 100 комітів — автоматичні оновлення залежностей
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Керовані розміри файлів — 3/40 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageRust
largest_source_bytes107 521
source_files_sampled40
oversized_source_files3

Ключові факти

1 269зірок GitHub
31контриб'юторів
7комітів за останні 12 місяців
92днів від останнього пушу
61релізів
1бас-фактор
7відкритих issue
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

Докладніше

Історія зірок і форків 0 ★ / 116 ⇿
0Зірки
116Форки
53Релізи

Коли додано кожну зірку й форк — зібрано з 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 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
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.