Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-24 14:17 UTC

eschizoid / kpipe

Composable Kafka consumer library for building modular, testable JVM data pipelines.

JavaApache-2.0★ 57 зірок⑂ 7 форківз квіт. 2025 р.Переглянути на GitHub ↗

eschizoid/kpipe має індекс здоров’я 62 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (87/100), найнижчий — Community & Adoption (43/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

Mariano GonzalezОсобистий обліковий запис
89 підписників142 публічні репозиторіїз лип. 2014 р.

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

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

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

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

87Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
15.2/36Ритм комітів — 22/52 тижнів із комітами
18/18Обсяг комітів — 256 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year256
human_commit_share0,94
days_since_last_push0
active_weeks_last_year22
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 41 релізів
36/36Свіжість релізів — останній реліз 4 дн. тому
27/27Ритм релізів — реліз кожні ~6,7 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count41
latest_release_tagv1.18.0
releases_from_tagsні
days_since_latest_release4
mean_days_between_releases6,7
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

43У зоні ризику · 18% загального індексу
Як обчислюється оцінка
28.4/60Зірки — 57 зірок
6.5/25Форки — 7 форків
1.7/15Спостерігачі — 3 спостерігачів
Використані вхідні дані
forks7
stars57
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
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ні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

50Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0.2/22.5Розподіл комітів — головний контриб’ютор — автор 99% комітів
5.4/13.5Широта контриб’юторів — 4 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled4
top_contributor_share0,99
Як обчислюється оцінка
45.2/46.8Вирішення issue — закрито 97% issue
36.6/38.3Прийняття PR — злито 237/248 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/29 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs237
open_issues1
closed_issues29
issue_closed_ratio0,967
closed_unmerged_prs11
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
14.1/25Охоплення власника — 89 підписників у eschizoid
25/25Послужний список — 142 публічних репозиторіїв, вік облікового запису ~12 р.
Використані вхідні дані
followers89
owner_typeUser
is_verified
owner_logineschizoid
public_repos142
account_age_days4 391
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

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

74Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 29 out of 30 merged PRs checked by a CI test -- score normalized to 9
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

85Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
10/10Теми — 7 тем
10/10Wiki
Використані вхідні дані
topicsapache-kafka, data-pipelines, event-driven, functional-programming, java, kafka, stream-processing
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

51Помірний · 16% загального індексу

Стан безпеки

51Помірний
Як обчислюється оцінка
6.8/7.5Binary-Artifacts — binaries present in source code
0.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.2/2.5CI-Tests — 29 out of 30 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/29 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
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 — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5,1
Виключено з оцінювання (немає даних або не застосовно): signed_releases. Залишкові ваги перенормовано.

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

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

68Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 94 з 94 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
18/18Розгортання однією командою — justfile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Java (статично типізована)
10/10Відтворюване середовище — Dockerfile
4/10Підтверджена практика роботи з агентами — 2 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 6 з останніх 100 комітів — автоматичні оновлення залежностей
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileтак
typed_languageтак
bootstrap_filesjustfile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,02
toolchain_manifestsbenchmarks/build.gradle.kts, build.gradle.kts, examples/avro/build.gradle.kts, examples/build.gradle.kts, examples/bytes/build.gradle.kts, examples/circuit-breaker/build.gradle.kts, examples/custom-format/build.gradle.kts, examples/demo/build.gradle.kts, examples/json/build.gradle.kts, examples/protobuf-schema-registry/build.gradle.kts, examples/protobuf/build.gradle.kts, examples/schema-registry/build.gradle.kts, examples/tracing/build.gradle.kts, lib/build.gradle.kts, lib/kpipe-api/build.gradle.kts, lib/kpipe-bom/build.gradle.kts, lib/kpipe-consumer/build.gradle.kts, lib/kpipe-core/build.gradle.kts, lib/kpipe-format-avro/build.gradle.kts, lib/kpipe-format-json/build.gradle.kts, lib/kpipe-format-protobuf-confluent/build.gradle.kts, lib/kpipe-format-protobuf/build.gradle.kts, lib/kpipe-metrics-otel/build.gradle.kts, lib/kpipe-metrics/build.gradle.kts, lib/kpipe-producer/build.gradle.kts, lib/kpipe-schema-registry-confluent/build.gradle.kts, lib/kpipe-test/build.gradle.kts, lib/kpipe-tracing-otel/build.gradle.kts
dependency_bot_commit_share0,06
Як обчислюється оцінка
45/45Типізований код — Java (статично типізована)
54.8/55Керовані розміри файлів — 1/293 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageJava
largest_source_bytes66 676
source_files_sampled293
oversized_source_files1
Як обчислюється оцінка
40/40Схема API (OpenAPI/GraphQL/proto) — lib/kpipe-consumer/src/test/resources/protobuf/customer.proto
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_fileslib/kpipe-consumer/src/test/resources/protobuf/customer.proto

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

57зірок GitHub
4контриб'юторів
256комітів за останні 12 місяців
0днів від останнього пушу
41релізів
1бас-фактор
1відкритих issue
Mavenпакетних екосистем

Попередження щодо збору даних

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Докладніше

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

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

1234567712025-042025-102026-04
Мажорні 1Мінорні 7Патчі 11
OpenSSF Scorecard 5.1 / 10
5.1сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-24 14:17 UTC

9Binary-Artifactsbinaries present in source code
1Branch-Protectionbranch protection is not maximal on development and all release branches
9CI-Tests29 out of 30 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/29 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Усі залежності 0

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 0 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies to assess

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "apache-kafka",
        "data-pipelines",
        "event-driven",
        "functional-programming",
        "java",
        "kafka",
        "stream-processing"
      ],
      "is_fork": false,
      "size_kb": 7317,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Java": 1922624,
        "Just": 2380,
        "Shell": 3958,
        "Dockerfile": 668
      },
      "pushed_at": "2026-07-24T13:14:46Z",
      "created_at": "2025-04-10T04:57:24Z",
      "owner_type": "User",
      "updated_at": "2026-07-24T13:16:43Z",
      "description": "Composable Kafka consumer library for building modular, testable JVM data pipelines.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Java",
      "significant_languages": [
        "Java"
      ]
    },
    "owner": {
      "blog": "https://mariano-gonzalez.com",
      "name": "Mariano Gonzalez",
      "type": "User",
      "login": "eschizoid",
      "company": null,
      "location": "Chicago, Illinois",
      "followers": 89,
      "avatar_url": "https://avatars.githubusercontent.com/u/8173837?v=4",
      "created_at": "2014-07-15T21:47:13Z",
      "is_verified": null,
      "public_repos": 142,
      "account_age_days": 4391
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.18.0",
          "kind": "minor",
          "published_at": "2026-07-20T04:20:58Z"
        },
        {
          "tag": "v1.17.0",
          "kind": "minor",
          "published_at": "2026-07-12T17:24:22Z"
        },
        {
          "tag": "v1.16.3",
          "kind": "patch",
          "published_at": "2026-06-20T01:45:58Z"
        },
        {
          "tag": "v1.16.2",
          "kind": "patch",
          "published_at": "2026-06-19T23:17:37Z"
        },
        {
          "tag": "v1.16.1",
          "kind": "patch",
          "published_at": "2026-06-18T18:16:52Z"
        },
        {
          "tag": "v1.16.0",
          "kind": "minor",
          "published_at": "2026-06-08T02:14:08Z"
        },
        {
          "tag": "v1.15.1",
          "kind": "patch",
          "published_at": "2026-06-02T02:58:52Z"
        },
        {
          "tag": "v1.15.0",
          "kind": "minor",
          "published_at": "2026-05-29T18:45:29Z"
        },
        {
          "tag": "v1.14.1",
          "kind": "patch",
          "published_at": "2026-05-26T22:10:27Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2026-05-20T17:06:22Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2026-05-16T13:59:57Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2026-05-15T21:17:24Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-05-09T17:39:31Z"
        },
        {
          "tag": "v1.10.5",
          "kind": "patch",
          "published_at": "2026-05-08T21:22:14Z"
        },
        {
          "tag": "v1.10.4",
          "kind": "patch",
          "published_at": "2026-05-07T19:11:35Z"
        },
        {
          "tag": "v1.10.2",
          "kind": "patch",
          "published_at": "2026-05-05T12:34:36Z"
        },
        {
          "tag": "v1.10.1",
          "kind": "patch",
          "published_at": "2026-05-04T22:39:53Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-05-03T15:38:23Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-05-03T00:04:24Z"
        },
        {
          "tag": "v1.8.4",
          "kind": "patch",
          "published_at": "2026-04-18T10:49:40Z"
        },
        {
          "tag": "v1.8.3",
          "kind": "patch",
          "published_at": "2026-04-16T04:56:08Z"
        },
        {
          "tag": "v1.8.2",
          "kind": "patch",
          "published_at": "2026-04-12T15:00:25Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2026-04-12T14:07:15Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-04-12T12:39:28Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2026-04-10T09:14:16Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-04-08T02:44:26Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2026-04-01T02:29:44Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-03-31T23:59:22Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-03-29T22:49:40Z"
        },
        {
          "tag": "v1.3.3",
          "kind": "patch",
          "published_at": "2026-03-29T20:41:56Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-03-29T20:05:30Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-03-29T09:39:53Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-03-27T18:09:22Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-03-27T17:19:54Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-03-22T10:13:55Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-03-14T15:07:42Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-03-09T01:21:44Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-03-07T17:06:21Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2025-07-28T17:56:58Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2025-04-22T18:36:24Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2025-04-19T23:22:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "f090ec6365d334f22554b39f169cd3faab1fd4ac",
          "body": "…he code (#282)",
          "is_bot": false,
          "headline": "docs(readme): independent-audit corrections — the story now matches t…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-24T13:14:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37d45d39f5aad40573dc428bdcea02ee33bac4f2",
          "body": "…#281)\n\n* docs(readme): strip the rhetorical AI-isms from both READMEs\n\nA prose pass over README.md and benchmarks/README.md removing the tics that crept in\nwith the recent benchmark-section rewrites: negative-parallelism punch lines ('a\nthreading-model verdict, not a tuning gap', 'verified, not ass\n[…]\n-test for their own pipelines, with an anchor link to the Testing section\n\nWhole-file audit found the rest already clean: no AI-vocabulary hits, all internal\nanchors resolve, middle sections accurate.",
          "is_bot": false,
          "headline": "docs(readme): humanize both READMEs + story-correctness second pass (…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-24T12:43:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "226de18d3ab3fabfc2fe6871cea26eaeda5259bf",
          "body": "…ose (#280)\n\nThe sub-ms caveat attributed the local-box deficit to dispatcher lock contention and\npromised a striped-lock experiment. That experiment ran: the lock is gone (v2, CHM +\nper-queue monitors, +122% in the isolated dispatch bench) and the broker-level sub-ms\ncell measured flat (0.86x vs CP\n[…]\nY) - the budget there is fetch + deserialize + offset\ntracking, not dispatch. Both READMEs now state what was measured and link the A/B record\ninstead of promising an experiment that already happened.",
          "is_bot": false,
          "headline": "docs(readme): reflect the v2 dispatcher in the KEY_ORDERED metrics pr…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-22T22:58:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df01f9fc31a7df8be93301efe76520b4ab5a3c5a",
          "body": "…-bound, not end-to-end (#279)\n\nRe-ran kpipeKeyOrdered + confluentKey against a live broker at 1ms/fork=5 on merged main\nto check whether the micro-bench +112%/+122% translates. It does not: KEY_ORDERED 52,216\nvs the v1 reference 52,949 (flat), ratio vs CPC KEY 0.83x->0.86x (within noise; the CPC\nca\n[…]\n workloads (and makes the dispatcher scale up with cores rather than down),\nbut the README's sub-ms KEY_ORDERED caveat stays as written. Prediction made, measured,\nrefuted — recorded rather than spun.",
          "is_bot": false,
          "headline": "docs(bench): record the v2 dispatcher broker-verify — win is dispatch…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-22T09:22:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f9cdecc769bfa18b9d137013fe14b949b10bbdb",
          "body": "…122% at high key cardinality (#278)\n\n* perf(consumer): KeyOrderedDispatcher v2 — replace the global lock with CHM + per-queue monitors\n\nThe single ReentrantLock serialized every worker dequeue against every dispatch;\nKeyOrderedDispatchBenchmark measured KEY_ORDERED flat at ~380k ops/s regardless of\n[…]\nhing baseline), tripping the old guard. All outcomes were ACCEPTABLE (zero\nFORBIDDEN); this was a timing trip, not a correctness failure. New guard keeps ~1.5x the\nnew baseline plus contention margin.",
          "is_bot": false,
          "headline": "perf(consumer): KeyOrderedDispatcher v2 — CHM + per-queue monitors, +…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-22T04:25:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a1d55afaa9a1aa80478628ad64cec2b1c2d3678",
          "body": "… + README refresh (#277)\n\n* bench: first local quiesced-box reference capture (fork=5, full sweep + latency modes)\n\n20.4h overnight run on a dedicated box per METHODOLOGY's publishing runbook: 7 parallel\narms x full workMicros sweep (0-100ms) + the first full latency-mode sweep, fork=5, gc\nprofiler\n[…]\nED sub-ms caveat stated plainly\n- raw artifact: results/2026-07-20-overnight.json (fork=5 JSON, 1.9 MB)\n\n* bench(snapshot): review tweak — cite reactor's surviving-fork drain as ~119s (JSON-derivable)",
          "is_bot": false,
          "headline": "bench: 2026-07-21 local reference capture — full-sweep fork=5 numbers…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-21T17:44:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24f4bf50e791515f19a81473a0f1f32cf992f8c3",
          "body": "… step 2) (#276)",
          "is_bot": false,
          "headline": "docs(readme): bump install snippets to 1.18.0 (post-release checklist…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-20T20:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27133d9df003895ae9c2b9287b4ca67df129c418",
          "body": null,
          "is_bot": true,
          "headline": "deps(deps): bump the gradle-minor-patch group with 3 updates (#275)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-20T19:17:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67e0fb4e72b438ae00d31fe5cf35a46e9e60e073",
          "body": "…-lens audit (#274)\n\n* fix: pre-release hardening — verified findings from the adversarial 4-lens audit\n\nEvery fix below is a hand-verified finding from the pre-1.18 hard audit\n(claims that did not survive verification were declined and recorded).\n\n1. Builder Properties defensive clone (KPipeConsume\n[…]\nprobe-rejection log now states the\npaused-until-restart consequence for non-shutdown rejections; the sendToDlq\njavadoc prose moved above the tag block.\n\nFormats + api + consumer targeted suites green.",
          "is_bot": false,
          "headline": "fix: pre-release hardening — verified findings from the adversarial 4…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-18T15:19:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81f9d0d3f0182500d666ab57393a33acd0b55154",
          "body": "… (#273)\n\n\"Pending\" overloaded two different concepts in the consumer: the dispatcher's\ncount of records actively running or queued in a worker (what drain waits on),\nand the offset-side \"pending\" (PendingOffsetSet windows, PartitionState.\npendingCount, CommitCoordinator.pendingCount — offsets/commi\n[…]\ncher is a package-private sealed interface).\nDispatcher/Watermark suites green; the two Testcontainers failures in the full\nlocal run are ContainerLaunchException (local Docker exhaustion), unrelated.",
          "is_bot": false,
          "headline": "refactor(consumer): rename Dispatcher.pendingCount() to activeCount()…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-18T14:32:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c920c5f19e0c262d8568933bf10a1b8682b734b6",
          "body": "…ojects block (#272)",
          "is_bot": false,
          "headline": "build: hoist duplicated java/toolchain/test config into the lib subpr…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-18T14:32:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae17fb20415216da7bb64bfa8735799f7ba9cf76",
          "body": "…m-format examples (#271)\n\n* test(examples): Docker-free integration tests for the bytes and custom-format examples\n\n* test(examples): pin App.hexPreview directly instead of a drifting copy\n\nReview follow-up: the bytes test replicated the app's private hexPreview and\npinned literals against its own \n[…]\nsame pattern as\nexamples/protobuf's buildCustomerDescriptor) and call it from the test, so the\nhardcoded literals now pin the app's actual implementation. Deleted the copy.\n:examples:bytes:test green.",
          "is_bot": false,
          "headline": "test(examples): Docker-free integration tests for the bytes and custo…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-18T14:32:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a10ba94a98f3f2f1a0c7f4c4576ba9703596226",
          "body": "… messages, varint-parse extraction (#270)\n\nPass-3 sweep findings, hand-verified.\n\n1. KafkaConsumerConfig: the five Kafka property keys were repeated literals\n   across the factory, transformers, and builder; the deserializer default was\n   a hand-typed FQCN string. Named the keys once and derived t\n[…]\napi + kpipe-format-protobuf suites green (the one\nMultiBuilderBatchIntegrationTest failure in the first run was a Testcontainers\ntopic-metadata timing flake — passes on rerun, unrelated to this diff).",
          "is_bot": false,
          "headline": "refactor: surface polish — config constants + fail-fast, MultiBuilder…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T23:28:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fbdc5ce4ec68441736e8261e51d3f885616fb38f",
          "body": "…fast validations (#269)\n\nPass-3 sweep findings, hand-verified.\n\n1. The consumer's metric-map keys were declared THREE times — private literals\n   in KPipeConsumer (11 keys, plus \"inFlight\" as a bare literal at the\n   getMetrics call site), ConsumerMetricsReporter (6), and TestKitMetrics (4).\n   A r\n[…]\nfaults.POLL_TIMEOUT — NOT AppConfig's\n   demo-scaffolding constant, preserving the deliberate severing of builder\n   defaults from AppConfig.\n\nkpipe-metrics + kpipe-consumer + kpipe-test suites green.",
          "is_bot": false,
          "headline": "refactor(metrics,consumer): shared ConsumerMetricKeys + builder fail-…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T23:28:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "410862756f857faae798738ebba93589030bc29b",
          "body": "…(#268)\n\nInvestigation (11 consecutive runs, 2026-07-17): the jcstress step runs a\nrock-steady ~28-30 minutes, all green — it is NOT wedging; the baseline grew\nas the campaign added suites (now ~19 jcstress classes, 15 in kpipe-consumer).\nThe step comment still claimed \"a few minutes\" — stale since \n[…]\nls the job in 45 minutes instead of burning the 360-minute\n  job default. It is a guard, not a budget — documented as such.\n\nKeeps jcstress PR-gating (per the standing decision — no nightly demotion).",
          "is_bot": false,
          "headline": "ci: honest jcstress baseline comment + 45-minute wedge-guard timeout …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T23:05:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04ae9c888adacb9a64b072d2a85749273ce5c27a",
          "body": "…ecord and batch paths (#267)\n\nThe durable-terminal-state rule — a failed record's offset advances only when\nthe record is DLQ-parked (send ok) or explicitly opted into log-and-advance\n(no DLQ), and a failed send leaves it pending — is implemented twice: in\nhandleProcessingError (per-record) and the\n[…]\nfocused tests (DlqSendFailureTest,\nProcessingModeSinkDlqMatrixTest, KPipeDlqTest): those pin individual\nbehaviors; this table pins the cross-path symmetry in one visible place.\n\nAll Dlq* suites green.",
          "is_bot": false,
          "headline": "test(consumer): DLQ terminal-state lockstep contract across the per-r…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T22:47:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7cbbcd2cc0e85912617845361db53db88c94240e",
          "body": "… varint-overflow test (#266)",
          "is_bot": false,
          "headline": "chore: pass-2 polish — test-kit dedup, catalog hygiene, doc accuracy,…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T15:29:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08280edb40aab766d03bea68373c32d15eb2944a",
          "body": "All 7 dependency examples (Gradle Kotlin/Groovy, Maven, BOM, tracing-otel,\nschema-registry-confluent, the SBT note) pinned 1.15.0 — two releases behind\nthe latest v1.17.0 tag. Users copy-pasting got a stale line missing the\noffset-tracking and robustness fixes.",
          "is_bot": false,
          "headline": "docs(readme): bump install snippets from 1.15.0 to 1.17.0 (#265)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T15:21:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c255af2fb56a1dede73b239dc507e1a58d29756",
          "body": "…ilently dropped them (#264)\n\nDefaultStream carries onFiltered/onFailed/peekResult and DefaultSink\ndispatched them, but DefaultBatchSink.buildPipeline() built its pipeline with\nNO observer wiring — `.onFailed(x).toBatch(...)` silently dropped x. Same\nsilent-drop class as the tracer/circuit-breaker d\n[…]\nTests: StreamResultObserversTest gains a batch section — peekResult fires for\nall three outcomes and onFiltered/onFailed dispatch through the toBatch()\npipeline (regression guard for the silent drop).",
          "is_bot": false,
          "headline": "fix(api): wire result observers into the batch pipeline — toBatch() s…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T15:21:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da188ee1cb4a6193b56b6cb208f041cd5d296760",
          "body": "…note avro static-fetch footgun (#263)",
          "is_bot": false,
          "headline": "chore(examples): dogfood CapturingSink, drop DemoConfig dead fields, …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T14:48:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "610f7a0cd57c02d12fcfa348abb67b0564f28369",
          "body": "…an-scope CAS, ServiceLoader determinism (#262)\n\n* fix(consumer/formats/tracing): small robustness bundle — Sink single-shot, close() log, span-scope CAS, ServiceLoader determinism\n\n- DefaultSink / DefaultBatchSink: add an AtomicBoolean started guard so a second\n  start() throws IllegalStateExceptio\n[…]\n undefined behavior', but the guard now makes it a defined\nIllegalStateException throw. Tighten the interface doc + add @throws so the\ncontract matches the implementation (flagged by 3 review lenses).",
          "is_bot": false,
          "headline": "fix: robustness bundle — Sink single-shot guard, close() WARN log, sp…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T14:48:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "58b5250d303b105e82b01f2a610eac6b39be75a6",
          "body": "…fecycle + metrics-observer (#261)\n\n* refactor(consumer): split ConsumerHealthController.Hook into pause-lifecycle + metrics-observer\n\nSplit the single ConsumerHealthController.Hook interface (7 methods mixing\ntwo concerns) into two focused interfaces:\n\n- PauseLifecycleHook: onPause/onResume — the p\n[…]\nd independently. This exercises (and\n  realizes) the exact testability payoff that motivated the split: a pause-only\n  test no longer has to stub the five metric callbacks.\n\nkpipe-consumer:test green.",
          "is_bot": false,
          "headline": "refactor(consumer): split ConsumerHealthController.Hook into pause-li…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T14:48:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4290ca6203ffad84ba4a4591b73a298dd34b112b",
          "body": "…peMetricsReporter (#260)\n\n`KPipeMetricsReporter` declared `default void start() {}` / `stop() {}`, but\nnothing in KPipe ever calls them and no implementation overrides them — the\nconsumer drives `reportMetrics()` on a periodic daemon thread it owns\n(KPipeConsumerBuilder), so the reporter has no lif\n[…]\nhod — and the Javadoc states plainly that KPipe does not\ncall any lifecycle hook.\n\nVerified: no `reporter.start()/stop()` call site anywhere (grep); kpipe-metrics\ntests + kpipe-consumer compile green.",
          "is_bot": false,
          "headline": "refactor(metrics): drop the decorative start()/stop() no-ops from KPi…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T14:31:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c092083213897f79f08ab0ea11f161de805a896c",
          "body": "…re-envelope parse (#259)\n\nAvroFormat and ProtobufFormat each hand-rolled the identical Confluent\nwire-envelope prefix parse: a `0x00` magic-byte check and a byte-identical\n4-byte big-endian schema-id read (`((data[1]&0xff)<<24)|...`), plus their own\n`CONFLUENT_MAGIC`/length constants. Two copies of\n[…]\nbig-endian read incl. high-bit/0xFFFFFFFF,\nmagic mismatch, too-short). Full avro + protobuf + protobuf-confluent (the\ngold-standard KafkaProtobufSerializer wire-compat round-trip) + core suites\ngreen.",
          "is_bot": false,
          "headline": "refactor(core): extract ConfluentEnvelope, dedup the Avro+Protobuf wi…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T14:04:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52577810324ec0e38ca60d66c366d8250d2fc7ea",
          "body": "…chema-Registry path (#258)\n\nThe headline Protobuf + Confluent Schema Registry example shipped with zero\ntest. Add a deterministic, Docker-free end-to-end test of the consumer decode\npath: a Confluent-format wire record (magic 0x00 + 4-byte BE schema id +\nsingle-message-index shorthand + a DynamicMe\n[…]\ne app has -confluent runtimeOnly; withRegistry throws at construction if no\ncompiler is on the path).\n\nVerified: :examples:protobuf-schema-registry:test green (8x stable reruns), no\njava.lang.reflect.",
          "is_bot": false,
          "headline": "test(examples): add Docker-free integration test for the Protobuf + S…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T04:33:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "20538f40246d0328ccdef2eaecf60a1118d4bc2b",
          "body": "…way map; small nits (#257)\n\n- RegistryEntry.getMetrics: `(timeNs / count) / 1_000_000.0` integer-divided\n  timeNs/count FIRST, dropping sub-millisecond precision in the reported\n  average. Compute `timeNs / (count * 1_000_000.0)` in one step. Also return\n  an immutable `Map.of(...)` instead of allo\n[…]\ntatic`\nis correct; Avro/Protobuf are instance methods because they need the\nschema/descriptor. The asymmetry reflects a real difference, not drift.)\n\nVerified: core + producer + api test suites green.",
          "is_bot": false,
          "headline": "fix(core): correct RegistryEntry average-time precision + drop throwa…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T04:33:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "656eb21553fe25708434c37de2b0461e85ffa4d3",
          "body": "…RestartHarness (#256)\n\nTestStream (live drive) and CrashRestartHarness (crash/restart) hand-rolled\nbyte-identical quiescence logic: the same 4 metric-key constants\n(messagesReceived/Processed/Errors/inFlight), the same accountedFor formula,\nand a near-identical quiescent() check (TestStream on the \n[…]\neadline loop.\nOne source of truth, unit-testable in isolation. CLOSE_AGE_CAP stays on\nTestStream — it's a batch-policy age cap, not a metrics concern.\n\nBehavior-preserving: :lib:kpipe-test:test green.",
          "is_bot": false,
          "headline": "refactor(test): extract shared TestKitMetrics from TestStream + Crash…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T04:33:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "312c78aa8f89aec3be574b9f000cb3c5ccbb4d98",
          "body": "* refactor(consumer): extract OffsetLedger from KafkaOffsetManager\n\nKafkaOffsetManager mixed two concerns: the consumer-offset lifecycle\n(state machine, scheduler, commit I/O, rebalance) and the per-partition\noffset bookkeeping (pending windows, highest-processed marks, the interned\nTopicPartition c\n[…]\n(was a mutable HashMap leaked into the record).\n- Add coverage for the previously-untested statistics() branch: the average\n  field and the empty-ledger zeroed snapshot (no-processed -> 0.0, not NaN).",
          "is_bot": false,
          "headline": "refactor(consumer): extract OffsetLedger from KafkaOffsetManager (#255)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T03:40:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "935a750e0187d334f2f1e25119852ac904daf3df",
          "body": "…467 markdown dialect (#254)\n\nThe repo standardized on `///` markdown javadoc (markdown links `[Type]` /\n`[#member]`, backtick code spans) — but 7 main-source files still had legacy\nHTML-javadoc tags mixed into their `///` comments. This sweep converts the\nlast 29 holdouts so the whole main-source t\n[…]\nules.\n- `javadoc` task green for all 3 modules — zero broken-link warnings (only 2\n  pre-existing \"no comment\" warnings on an unrelated Tracer.java).\n- Zero remaining `{@link`/`{@code` in the 7 files.",
          "is_bot": false,
          "headline": "docs: convert remaining {@link}/{@code} HTML-javadoc tags to the JEP-…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T01:49:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "681bd69e98fb0cb180e8c6aab756ecfb9e095d06",
          "body": "…stale package-info links (#253)\n\n* refactor(core): align BytesFormat visibility with reachability + drop stale package-info links\n\nBytesFormat was `public final` but its only instance (`INSTANCE`) is\npackage-private and the constructor is private, so no external code could\never name, construct, or \n[…]\nto a plain\n  `PipelineDiagnostics` code span; the prose meaning is unchanged.\n\nSame theme as the BytesFormat/package-info fix: stop advertising\npackage-private internals as public SPI. Compiles green.",
          "is_bot": false,
          "headline": "refactor(core): align BytesFormat visibility with reachability + fix …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-17T00:28:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1f55f6019a64634c9969637f5651af8bca688aa",
          "body": "…misleading shutdown log (#252)\n\n* refactor(consumer): sever load-bearing defaults from AppConfig + fix misleading shutdown log\n\nTwo small kpipe-consumer cleanups:\n\n1. The consumer's load-bearing default timeouts (WAIT_FOR_MESSAGES,\n   THREAD_TERMINATION, EXECUTOR_TERMINATION) lived on the demo `App\n[…]\nCAPE-HATCHES to ConsumerDefaults.EXECUTOR_TERMINATION (review nit)\n\nThe executor-drain timeout moved from AppConfig to ConsumerDefaults in this PR;\nthe escape-hatches doc still named the old location.",
          "is_bot": false,
          "headline": "refactor(consumer): sever load-bearing defaults from AppConfig + fix …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T23:35:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b45e77414e21b529f4b6f897469aef08ef46c74",
          "body": "…method (#251)\n\n`MessagePipeline.then()` — 47 lines of two-pipeline composition machinery — had\nzero production callers; its only users were the four `then*` tests in\nMessagePipelineContractTest that existed solely to exercise it. That's a\ndeletion-test failure: nothing in the shipped library compos\n[…]\n. Delete it per\n§16, along with the four tests, their now-unused imports, and the dangling\nJavadoc reference.\n\nVerified: :lib:kpipe-core:test green; no `.then(` reference remains in any\nsource or doc.",
          "is_bot": false,
          "headline": "refactor(core): delete the unused MessagePipeline.then() composition …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T22:44:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b3d1b2267bb9c4bdec6c3867328b690f5367014f",
          "body": "… (#250)\n\n* refactor(consumer): extract CommitCoordinator from KafkaOffsetManager\n\nThe async-commit correlation — a UUID → CompletableFuture map with a\nregister/complete/forget/count lifecycle — was inlined in KafkaOffsetManager\nacross four sites (the field, performCommit, notifyCommitComplete,\ngetS\n[…]\ning-await, timeout, and\nlate-complete-after-timeout (no-op). Full consumer suite green (3m5s).\n\nTests updated to the id-based API + the concurrent-completion path\n(completeUnblocksAConcurrentAwaiter).",
          "is_bot": false,
          "headline": "refactor(consumer): extract CommitCoordinator from KafkaOffsetManager…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T21:48:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f24c5e187350576fc192310275fd35f3fc0d64c2",
          "body": "…typed records (#249)\n\nKafkaOffsetManager.getStatistics() (on the OffsetManager SPI) and\ngetPartitionState() (impl-only) returned Map<String,Object> with magic-string\nkeys, and 27+ test/jcstress/property/stress call sites did unchecked casts\n(`(long) state.get(\"nextOffsetToCommit\")`). One site (Retr\n[…]\nfurther shrink the god-class.\n\nVerified: all source sets compile (main/test/jcstress/kpipe-test/api);\n:lib:kpipe-consumer:test green (3m8s, incl. property/stress); zero stringly\n.get() access remains.",
          "is_bot": false,
          "headline": "refactor(consumer): replace stringly-typed offset observability with …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T20:46:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "866b543e3e9f59f1e89bb7d3cf47205dbff0682d",
          "body": "…eConsumerBuilder (#248)\n\n* refactor(consumer): extract KPipeConsumer.Builder to a top-level KPipeConsumerBuilder\n\nKPipeConsumer was 1974 lines — a god-class whose ~570-line nested Builder\ndominated it and hurt navigability. Extract the Builder to its own top-level\nKPipeConsumerBuilder.java in the s\n[…]\nidening encapsulation smell (28 package-private fields) is\ndeliberately deferred to a follow-up config-snapshot-record PR per the review;\neffective access is unchanged (only KPipeConsumer reads them).",
          "is_bot": false,
          "headline": "refactor(consumer): extract KPipeConsumer.Builder to a top-level KPip…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T19:09:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00ae21a8f7c98c200be038b0735294093f18401a",
          "body": "… KeyOrderedDispatcher (#247)\n\nParallelDispatcher submitted each record to the VT executor and discarded the\nFuture, so a throwable escaping processTask.run() — a contract violation, since\nprocessTask owns the consumer's per-record error handling / DLQ — was silently\nswallowed by the FutureTask. Key\n[…]\nure (mirroring KeyOrderedDispatcherTest) proves\nthe escaping throwable is logged once at ERROR with the cause attached, and\nthat a throwing onComplete is logged at WARNING without stranding in-flight.",
          "is_bot": false,
          "headline": "fix(consumer): add a safety-net catch to ParallelDispatcher, matching…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T17:45:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4de0ed3b2dd4c3558e4f20d4c36dfc57b92ab172",
          "body": "…trics field name (#246)\n\n* feat(producer): count sends through KafkaMessageSink + de-OTel the metrics field name\n\nTwo producer-module observability cleanups:\n\n- KafkaMessageSink (the facade custom terminal Kafka sink) sent via the raw\n  producer and logged failures, but incremented NO metrics — so \n[…]\nsafety), matching the tracer guard three lines up.\n- Reword Builder.withMetrics Javadoc: it still said \"OpenTelemetry metrics\n  instruments\" though the field is the vendor-neutral ProducerMetrics SPI.",
          "is_bot": false,
          "headline": "feat(producer): count sends through KafkaMessageSink + de-OTel the me…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T16:20:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "868cabfa0db422613bb45ad07d2e76983bfdc34d",
          "body": "… Avro envelope blind spot (#245)\n\n* refactor(formats): hoist hexPreview to core Diagnostics + fix Avro envelope blind spot\n\nJsonFormat and ProtobufFormat each carried a byte-identical private\nhexPreview (same body, same HEX_PREVIEW_LIMIT=8) — a duplicated diagnostic\nhelper drifting toward divergenc\n[…]\ngnostics.\n\nAlso adds the resolver-throws-propagates-unwrapped Avro test the\ncorrectness lens suggested (guards the #244 boundary against a future edit\nmoving the resolver call inside the widened try).",
          "is_bot": false,
          "headline": "refactor(formats): share byte previews via core WireDiagnostics + fix…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T15:56:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "26a115bd19d6d8938ececf54a17615769dfa51e7",
          "body": "…ption (#244)\n\n* refactor(formats): standardize read-path failures on IllegalStateException\n\nThe \"malformed wire envelope / decode failed\" exception type diverged across\nformats: JSON and Avro threw RuntimeException, Protobuf's envelope threw\nIllegalStateException, and the Confluent descriptor compi\n[…]\nelf an IllegalStateException, so citing \"IllegalState\"\nas an example of a cause-chain programming error invited a wrapper-vs-cause\ndouble-take (round-1 doc-accuracy note). Use a non-colliding example.",
          "is_bot": false,
          "headline": "refactor(formats): standardize read-path failures on IllegalStateExce…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-16T01:18:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ac89c7aa0ee1671af6eafb791aebd9dfb6e4e93",
          "body": "…lder mirrors, batch tracer/CB, benchmarks README) (#243)\n\n* build(bom): derive BOM constraints from the :lib graph + add coverage guard\n\nThe BOM hand-listed 10 of 13 published modules, silently omitting\nkpipe-tracing-otel, kpipe-schema-registry-confluent, and\nkpipe-format-protobuf-confluent — a con\n[…]\nnt the threading contract: accept() is concurrency-safe (reads only\n  the final counters); bindSchemaRegistryCache/close are single-owner\n  lifecycle calls, not thread-safe with respect to each other.",
          "is_bot": false,
          "headline": "chore: top-5 architecture cleanup (BOM drift, observer leak, MultiBui…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-15T22:40:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d7fbcc65971f10a5b5c107da5aa5593bfbc5070",
          "body": "…e, docs (#242)\n\n* chore: post-review cleanup — MultiBuilder SR overloads, package rename, docs\n\nPost-architecture-review cleanup (non-breaking). Three parts:\n\n1. MultiBuilder Schema-Registry overloads — add avro(topic, resolver, cfg) and\n   protobuf(topic, resolver, cfg) mirroring KPipe.avro/protob\n[…]\n stands; only the mechanism was wrong.\n- Stream.withSchemaRegistry: the shaded protobuf-confluent compiler jar\n  measures ~19 MB (19,274,319 bytes), not ~17 MB — verified against the\n  built artifact.",
          "is_bot": false,
          "headline": "chore: post-review cleanup — MultiBuilder SR overloads, package renam…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-15T16:01:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a94f2e95bf2546e63578f855012dcc5a718f142d",
          "body": "* feat(protobuf): Confluent Schema-Registry per-record auto-lookup (§19)\n\nProtobuf SR auto-lookup, mirroring AvroFormat.withRegistry — proven\nwire-compatible against Confluent's own KafkaProtobufSerializer.\n\n## Two-module design (the kpipe SPI/impl pattern, like metrics/tracing-otel)\nprotobuf-java h\n[…]\nlver: widen lookupById doc (schema text — Avro JSON or Protobuf .proto).\n- Tests: facade dispatch (WithSchemaRegistryDispatchTest), computeIfAbsent\n  retry-on-throw, multi-element message-index [0,1].",
          "is_bot": false,
          "headline": "feat(protobuf): Confluent Schema-Registry per-record auto-lookup (#241)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-14T22:41:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4208f7cd8ead18d3f2a788bcb8d4c64ea3a5701",
          "body": "…umer DLQ cell (#240)\n\n* test(consumer): deterministic crash-restart harness (kpipe-test) + started-consumer DLQ cell\n\nCloses two 'road to fully verified' items from PLAN.md.\n\n## CrashRestartHarness — public kpipe-test API (§21)\nA Docker-free, deterministic crash-restart verifier:\n  CrashRestartHarn\n[…]\ny-load-bearing\n  resume-seek assertion is recorded as still-open.\n\nAll /// doc lines kept <=95 cols (google-java-format wraps longer /// lines\ninto // continuations the IDE flags as dangling Javadoc).",
          "is_bot": false,
          "headline": "test: deterministic crash-restart harness (kpipe-test) + started-cons…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-14T02:42:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6092f34d6cc085b931264848579f406f4d688e2c",
          "body": "* chore: remove stray .idea profile + clear test/bench IDE warnings\n\nTwo post-#238 cleanups:\n\n1. Remove .idea/inspectionProfiles/Project_Default.xml — an IDE-local\n   inspection profile that a 'git add -A' in #238 swept into the tree by\n   accident (it was untracked, not meant to ship). Add .idea/in\n[…]\ntTrue(isRunning()) precondition gives the test teeth: a no-op queue\nread would leave it PAUSED and fail the postcondition.\n\nResolves the dead 'commandQueue' warning by making the field genuinely used.",
          "is_bot": false,
          "headline": "chore: remove stray .idea profile + clear test/bench IDE warnings (#239)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-13T17:14:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21d806833ecb95e0c961c8fdaa973faf8d015ba0",
          "body": "Bumps the gradle-minor-patch group with 11 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [io.opentelemetry:opentelemetry-api](https://github.com/open-telemetry/opentelemetry-java) | `1.63.0` | `1.64.0` |\n| [io.opentelemetry:opentelemetry-sdk](https://github.com/open-telemetry/opentelemetry\n[…]\n-update:semver-minor\n  dependency-group: gradle-minor-patch\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": "deps(deps): bump the gradle-minor-patch group with 11 updates (#237)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T16:30:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e5d86f7cf3fa7eb70389f372ac9b783a180fae32",
          "body": "* chore: clear the fixable -Xlint compiler warnings (89 → 68)\n\nThe build never ran -Xlint, so 89 compiler warnings sat unsurfaced. Triaged and fixed\nevery actionable one; left only genuine noise.\n\nFixed (21 warnings):\n- exports (8): kpipe-metrics-otel + kpipe-tracing-otel expose OpenTelemetry (an\n  \n[…]\nescape-\nhatch API (invisible to IDE reachability), OTel gauge fields (must retain\nstrong refs), AvroFormat possible-NPEs (guarded by static-vs-registry mode\ndispatch), guarded switch over sealed type.",
          "is_bot": false,
          "headline": "chore: clear the fixable -Xlint compiler warnings (89 → 68) (#238)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-13T16:05:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7347bf8702877ed2fc23de3eee387e6773f3ff98",
          "body": "The custom-OffsetManager section named a non-existent getOffsetsToCommit method.\nThe real SPI surface is trackOffset / markOffsetProcessed / notifyCommitComplete /\nstart / stop / isRunning / getState / getStatistics / createRebalanceListener / close.\nPre-existing drift surfaced by the 1.17.0 review lenses.",
          "is_bot": false,
          "headline": "docs: fix OffsetManager SPI method list in ESCAPE-HATCHES (#236)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-12T22:21:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93349a09ef31f14fa0a144b804ef2c7321a659b3",
          "body": "…(1.17.0) (#235)\n\n* wip: 1.17 degenerify — core + facade + kpipe-test main sources compile\n\nKPipeConsumer/Builder/OffsetManager/KafkaOffsetManager/ErrorHandler/ProcessingError/\nDispatcher hierarchy/BatchPipelineWrapper degenerified; keys pinned to byte[] with\nByteArrayDeserializer forced in Builder.\n[…]\nr-handler surface in README section 7 / the\nfluent-surface table and the ESCAPE-HATCHES custom-error-handler row without a decode\nexample. Added the null-guarded decode to all three (DX review GAP 1).",
          "is_bot": false,
          "headline": "feat(consumer): delete the K type parameter — keys are always byte[] …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-12T17:13:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa4ee473015ffb051f3b466b4c5f331e19a70704",
          "body": "…ing (#231)\n\n* feat(test): kpipe-test module — TestStream driver + CapturingSink for Docker-free pipeline tests\n\nNew published module lib/kpipe-test (io.github.eschizoid.kpipe.test, JPMS module of the\nsame name) implementing the PLAN P2 surface:\n\n- TestStream<T>: MockConsumer-backed driver around a \n[…]\nic flush, filter/error visibility);\n  the existing docker-compose walkthrough moves under an\n  \"Integration testing against a real broker\" heading.\n\n* refactor(test): simplification pass on kpipe-test",
          "is_bot": false,
          "headline": "feat: kpipe-test module — TestStream<T> for Docker-free pipeline test…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-11T17:59:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f33660ff06febcf42af435eecab9597d9a75a67",
          "body": "…longer parks forever (#233)\n\nA backpressure pause used to LockSupport.park() the consumer thread\nindefinitely. For the lag strategy (auto-derived in SEQUENTIAL mode)\nnothing ever unparks it: SEQUENTIAL has no asynchronous record\ncompletions (processing runs inline on the parked thread itself), and \n[…]\n: all three tests fail against the old park-based loop\n(resume-after-external-lag-drop, keep-polling-while-lag-paused,\nkeep-polling-while-manually-paused) and pass with the fix. No public\nAPI changes.",
          "is_bot": false,
          "headline": "fix(consumer): paused consumer keeps polling — lag-strategy pause no …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-11T17:21:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5cf6f8299ef618d3356a3566d40127675dba4a2d",
          "body": "…EQUENTIAL mode (#234)\n\nThe batch circuit-breaker test was the only test in the class running in the\ndefault PARALLEL mode, so the breaker tripped on a batch-flush worker thread\ninstead of the consumer thread. internalPause flips the state to PAUSED before\noffering the Pause command, and the consume\n[…]\n feed the breaker window). The underlying\ncross-thread pause-delivery race is a product bug fixed separately by the\npaused-consumer-keeps-polling rework (#233), which retires the park() path\nentirely.",
          "is_bot": false,
          "headline": "test(consumer): de-flake sustainedBatchFailuresTripBreaker — run in S…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-11T17:21:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f701768e48cd4ae53206cbc19322e830ce24e228",
          "body": "…232)\n\nThe 'single-sample harness bug' footnote is resolved: it was the #228 lost-wakeup\ndeadlock killing 24/25 forks in the PARALLEL low-regime cells. The confirmation capture\non the fix (run 29107846506, fork=5) yields 25/25 samples: 155,696±8% @100us and\n145,418±7% @1ms — PARALLEL is ~2x CPC UNOR\n[…]\ntored. README sub-ms paragraph strengthened with the PARALLEL\nnumber, stale single-sample caveat replaced with the bug-found-and-fixed story; snapshot\ngets a dated addendum with the superseding table.",
          "is_bot": false,
          "headline": "docs: PARALLEL sub-ms cells confirmed at full fork depth post-#228 (#…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-11T13:45:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a056f80a01eee65bdd4dd5d72ea6fc35d52050de",
          "body": "…x) (#230)\n\n* bench: per-record latency harness — true p50/p95/p99/max across four runtime arms\n\nThe existing ParallelProcessingLatencyBenchmark divides whole-batch completion\ntime by @OperationsPerInvocation, so its percentiles are batch-amortized — a\nthroughput number in latency clothing (results/\n[…]\ne latency harness section\n\nArms run sequentially against one long-lived broker, so page-cache and broker-JVM warmth\naccumulate across arms. One-line reading caveat per the measurement-validity review.",
          "is_bot": false,
          "headline": "bench: per-record latency harness — true tail latency (p50/p95/p99/ma…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-10T23:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fff0b9396177993f046377ee78cd342bbf7815c8",
          "body": "…ast in-flight drain (#228)\n\n* fix(consumer): close backpressure lost-wakeup race that parks the consumer thread forever\n\ntickBackpressure decided PAUSE from an in-flight metric read taken BEFORE\nrequestPause published the BACKPRESSURE bit, while record completions only\nunpark the consumer thread wh\n[…]\nst comment (it fails fast via assertion; it\n   does not itself park a thread) and assert the pause edge is counted\n   (backpressurePauses == 1) and the immediate release records a >= 1 ms\n   duration.",
          "is_bot": false,
          "headline": "fix(consumer): lost-wakeup deadlock when backpressure pause races a f…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-10T23:12:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9197c97c1c09237507347d7f82bd55763f02af5",
          "body": "…er allocation (#229)\n\n* perf(consumer): primitive-long pending-offset set — cut offset-manager allocation 45%\n\nReplace the per-partition ConcurrentSkipListSet<Long> in KafkaOffsetManager\nwith PendingOffsetSet, a monitor-synchronized sorted primitive-long window:\n\n- Inline single-element mode (no ba\n[…]\no\nthe arbiter. Each doc now points at SafeFirstJCStressTest for the true\ncross-lock-set interleaving (monitor-only readers vs bucket-lock-plus-\nmonitor writers). Comments only — no test logic changed.",
          "is_bot": false,
          "headline": "perf(consumer): primitive-long pending-offset set — −45% offset-manag…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-10T22:36:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff4045fd838de953848b0f36df234f69fea124e7",
          "body": "…nchmark snapshot (#227)\n\n* bench: 2026-07-09 snapshot — fork=5 low regime, first high-regime (10-100ms) capture, latency-mode note\n\nLow regime at fork=5 reproduces every 2026-06-20 ordering with publishable error bars\n(KEY_ORDERED 93.8k±0.8% vs CPC KEY 65.9k±1% at 1ms = 1.42x, clean separation). Fi\n[…]\n\nreal API: inline lambda + Operators.addField). All intra-doc anchors and file links\nverified resolving.\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: README overhaul — lead with the 10–100ms regime + 2026-07-09 be…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-10T11:46:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e41c0042ae15eb0313925e32709bdc129649c244",
          "body": "…226)\n\n* docs: put the benchmark wins and verification story on the README front page\n\nThe competitive numbers (fastest correct consumer at production-like work levels; beats\nConfluent PC ~1.2-2x, KEY_ORDERED beats CPC KEY ~1.5x apples-to-apples) lived only in\nbenchmarks/results/ and got one cautiou\n[…]\nfork=5 is a weekend run; document the trim option.\n- Mark the fork=2 latency example as spot-check-only.\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: benchmark wins + verification story on the README front page (#…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-09T05:07:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10f536429930d7ed9ac69a2998da8144ad376946",
          "body": null,
          "is_bot": true,
          "headline": "deps(deps): bump the gradle-minor-patch group with 2 updates (#225)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-06T18:14:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcb62552b1c90c5c869fb76d60d74021f32718e3",
          "body": "…ker to fix CI flake (#224)\n\nRebalanceAtScaleIntegrationTest was the only class failing on main CI (3 runs: the #221\nmerge run + both attempts of the #218 run). The signature was identical every time:\nproduce timed out at line 325 (send.get in the produceRecords setup helper) with\norg.apache.kafka.c\n[…]\nontainer classes untouched.\n\nCannot run Testcontainers locally (no Docker); verified it compiles. CI is the confirmation\n— will re-run the branch a few times to confirm the rebalance tests stay green.",
          "is_bot": false,
          "headline": "test(consumer): give RebalanceAtScaleIntegrationTest a per-method bro…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-07-03T16:34:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08489102845c2774f8bf386e7cb11cf0877d5e23",
          "body": null,
          "is_bot": true,
          "headline": "ci(deps): bump actions/upload-artifact from 4 to 7 (#218)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-29T22:59:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "918a1db73ff44478a84be5a5fd556f2e40952351",
          "body": null,
          "is_bot": true,
          "headline": "deps(deps): bump the gradle-minor-patch group with 8 updates (#223)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-29T15:29:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e87170dca1ff739e99239667539ef21f78acd019",
          "body": "…ssingIntegrationTest (#222)\n\nThree '//' comment blocks had mid-sentence single words stranded on their own lines\n(spotless wraps at ~100 chars and pushed the overflow word down). Re-wrapped each block\nso every line stays under the wrap width with natural multi-word continuations. Cosmetic\nonly — no code or assertion changes. (Sentence-final single-word lines are left as-is.)",
          "is_bot": false,
          "headline": "chore(consumer): reflow stranded comment lines in CrashRestartReproce…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-22T22:17:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e59b910947b5f5b8f744eaa46d78c7e9d3517191",
          "body": "…er durability, rebalance, tracing, lifecycle (#221)\n\n* test: Tier-2 correctness coverage — formats, schema evolution, producer durability, rebalance, tracing, lifecycle\n\nConsolidates the Tier-2 verification fleet (surfaces #217 never touched). 11 new\ntest classes; 57 local tests pass (0 skipped/fai\n[…]\nme idiom already applied to the other pendingCount drain\ncheck in this file (line 424). Pre-existing flake surfaced by #221's CI; not caused by the\nTier-2 tests. Verified stable across 3 local reruns.",
          "is_bot": false,
          "headline": "test: Tier-2 correctness coverage — formats, schema evolution, produc…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-22T21:38:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "974517ccd99fb0047011f5b454ab99dd93188297",
          "body": "…deterministic crash-restart (#220)\n\n* test(consumer): drive circuit-breaker-window + state-CAS jcstress against real code\n\nTier-1 follow-up to #217: the two jcstress tests that mirrored private logic now\nexercise the real production code, removing replica-drift risk.\n- ConsumerHealthController.Slid\n[…]\n offset\nsuites, and DlqSendFailureTest. The max.poll.records bounding + the KeyOrdered drain\nde-flake are kept (real improvements).\n\n* test(consumer): tidy wrapped comment orphan in crash-restart test",
          "is_bot": false,
          "headline": "test(consumer): Tier-1 correctness hardening — real-class jcstress + …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-22T20:15:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4e2dc5532f802bd3bae103cf11e14312030a517",
          "body": null,
          "is_bot": true,
          "headline": "deps(deps): bump net.jqwik:jqwik in the gradle-minor-patch group (#219)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T11:50:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1a8612cc454afa40179808b82384b11ef11e7e3",
          "body": "…(#217)\n\njcstress/jqwik/VT-stress/chaos+crash-restart verification of the at-least-once surface across 5 modules (15 jcstress tests, now gating CI). Fixes 3 real bugs: trackOffset pending-set data-loss race (jcstress-found), DLQ-send-failure silent loss, and the circuit breaker being blind to the batch path. Adds the kpipe.producer.dlq.failed metric. See PR description for the operator-facing DLQ commit-stall behavior change and honest scoping.",
          "is_bot": false,
          "headline": "test(consumer): at-least-once correctness suite + 3 production fixes …",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-22T03:51:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2b591f73a1fae34b41436addf555dcabbac1717",
          "body": "…#216)\n\nProfile-first follow-up to the 2026-06-20 capture. gc.alloc.rate.norm\n(deterministic, reliable even on noisy hardware) attributes the 1628\nB/op: ~62% virtual-thread creation, ~24% offset track/mark Long-boxing,\n~14% pipeline.\n\nConclusions: Result.Passed is noise (~24 B/op), not a target; VT\n\n[…]\ntSkipListSet),\nwhich is deferred into the upcoming correctness phase because it lives\nin the concurrency-critical lowest-pending-offset structure — optimize\nit under a Lincheck safety net, not before.",
          "is_bot": false,
          "headline": "bench: record allocation attribution for KPipe PARALLEL (1628 B/op) (…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-21T15:35:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52cda3976e2ac72e79e81a9fa259e4f2797fbd69",
          "body": "…les) + CI regime docs (#215)\n\n* ci: make ParallelProcessing workMicros overridable for CI captures\n\nThe competitive bench's workMicros is a hardcoded 7-value @Param up to\n100ms/record. The single-threaded arm is serial, so 25k records × 100ms\nis ~42 min/iteration — the {35,50,100}ms cells push a fu\n[…]\null sweep incl. singleThread stays a local overnight run.\n\nPercentile capture itself needs a CI dispatch to confirm (Testcontainers\nbench, can't run locally without Docker). Build config parses clean.",
          "is_bot": false,
          "headline": "bench: annotation-driven benchmark mode (restores CI latency percenti…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-21T15:20:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "515f94232aa6a8733edc737170787f5d51b52ac6",
          "body": "…ride (#214)\n\n* ci: make ParallelProcessing workMicros overridable for CI captures\n\nThe competitive bench's workMicros is a hardcoded 7-value @Param up to\n100ms/record. The single-threaded arm is serial, so 25k records × 100ms\nis ~42 min/iteration — the {35,50,100}ms cells push a full sweep past\nGit\n[…]\npleTime —\nfiled as a follow-up), and KPipe allocates the most per op (1628 B/op) —\nthe VT+Result+offset-tracking cost, an honest tradeoff.\n\nRaw JMH JSON committed alongside as results-2026-06-20.json.",
          "is_bot": false,
          "headline": "bench: CI-captured competitive numbers (2026-06-20) + workMicros over…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-21T14:56:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "689bb00e222ba292af36b797c073269c660f030b",
          "body": "Regenerated via the wrapper task. Properties distributionUrl points at\n9.6.0; gradlew / gradlew.bat carry the matching script regen (comment\ntext only). Verified working — the benchmark suite runs on it.",
          "is_bot": false,
          "headline": "chore: bump Gradle wrapper 9.5.1 → 9.6.0 (#213)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:56:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2235cc46ed14d2286cfd8e7af4232e7153084160",
          "body": "…) (#212)\n\nJMH benchmarks don't gate PRs — they're slow and GitHub runners are\nshared, noisy CPU where absolute numbers are unreliable. This workflow\ngives two things:\n\n- workflow_dispatch: run a chosen benchmark set on demand with tunable\n  iterations / warmup / fork / profilers. For branch-vs-main\n[…]\nemits the\nstring \"NaN\" when iterations are too few for a stddev).\n\nSmoke-validated locally: OffsetManagerBoxingBenchmark runs, produces\nresults.json at the expected path, and the summary jq parses it.",
          "is_bot": false,
          "headline": "ci: add Benchmarks workflow (manual dispatch + weekly bench-rot smoke…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:39:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bbdb36e1c3157a8a05023ad8585ad837a172fbe6",
          "body": "Four documentation hardenings from the R1 convergence review of the\naudit-fix PRs (#205-#210). All comment/javadoc only — zero behavior\nchange.\n\n- AvroFormat.deserializeStatic: explain why the catch is broadened to\n  RuntimeException (Avro surfaces malformed bytes as AvroRuntimeException,\n  not IOEx\n[…]\nl. (#210)\n- OffsetManagerBoxingBenchmark: drop the JVM-version-specific\n  object-header byte estimate; point the reader at the measured\n  gc.alloc.rate.norm delta instead (prove, don't assert). (#205)",
          "is_bot": false,
          "headline": "docs: harden audit-review comments on non-obvious correctness (#211)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:30:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3fd79fe7a8ec96fd580f52fc16fb12b649904378",
          "body": "…ach throwables (#210)\n\nLogging-hygiene roundup from the logging audit.\n\nPer-record spam (HIGH):\n- Registry: the per-record WARN for an unrouted operator/sink key now fires\n  once per distinct key (ConcurrentHashMap.newKeySet guard), not once per\n  record. The WARNING is load-bearing so it stays at \n[…]\nnk namespaces dedup\n  independently (captured via the JUL bridge).\n- BatchPipelineWrapperCoverageContractTest gains a pin asserting the\n  coverage-violation WARN's LogRecord carries a non-null thrown.",
          "is_bot": false,
          "headline": "fix(logging): dedup unrouted-key WARN, drop per-record INFO spam, att…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:15:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a82762da678d8c416977f904dd2646baf10b0cc",
          "body": "The KPipeConsumer constructor opens, in order: the Kafka consumer, the\ndispatcher (PARALLEL owns a virtual-thread executor), an optional built-in\nDLQ producer, an optional scheduler, the batch wrappers, and a JVM shutdown\nhook. If any step after the first open threw — e.g. addShutdownHook while the\n\n[…]\n throwing\noffset-manager provider through build() and asserts the Kafka consumer was\nclosed; shouldReturnStartedServerFromEnv hits the fromEnv endpoint without\ncalling start() to prove it was started.",
          "is_bot": false,
          "headline": "fix(consumer): close resources on constructor-failure paths (#209)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:11:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04e67bed8398df5f5a6fd63c092b355838cdaf16",
          "body": "…es (#208)\n\nSeveral validation throws stated the rule but omitted the offending\nvalue or how to fix, while sibling validations in the same files\nalready appended \"got \" + value. Make them consistent:\n\n- BackpressureController ctor: highWatermark/lowWatermark now append\n  the got-value (matches the l\n[…]\n).\n- MultiBuilder.start: add how-to-fix listing the route methods.\n\nException types unchanged. Added focused got-value tests for the two\nmost user-facing cases (BackpressureController, DefaultStream).",
          "is_bot": false,
          "headline": "fix: include offending value + remediation in validation error messag…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:09:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f7dd94e0b1845f5dab9de60c6cae9ae7e7d6ccfb",
          "body": "…ext (#207)\n\nBare 'Failed to deserialize X' messages buried the format name and byte\ncontext behind the nested cause, slowing operator triage when a deserialize\ngenuinely throws (the no-silent-failures doctrine cares about the signal: the\nmessage + cause chain).\n\n- JsonFormat: deserialize message no\n[…]\ns stay single-line for log friendliness.\n\nTests: each format gains a malformed-bytes test asserting the thrown message\ncontains the format name AND the byte length, pinning the triage-signal\ncontract.",
          "is_bot": false,
          "headline": "fix(format): enrich SerDe error messages with format name + byte cont…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:09:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "554c54bbb333ef86c615fac6dc7ccddfba6ec5e5",
          "body": "…sitive (#206)\n\nPart A — remove unused requires (verified by grep + clean compile):\n- kpipe-api: drop `requires kafka.clients` (no org.apache.kafka import in src/main)\n- kpipe-consumer: drop `requires java.net.http` (health server uses jdk.httpserver)\n\nPart B — promote requires to transitive where t\n[…]\nageFormat<Message>)\n\nBuild-metadata only; no behavior change. Changes the downstream module graph:\nconsumers of kpipe-api no longer need to manually `requires` the format\nmodules' dependency packages.",
          "is_bot": false,
          "headline": "chore(jpms): remove unused requires, promote API-exposed deps to tran…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:09:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36ba4e1273f4f9583a0ea07b02134d48e1a0af08",
          "body": "…ger + add JMH benchmark (#205)\n\n`KafkaOffsetManager.trackOffset` and `markOffsetProcessed` previously allocated a\nfresh `TopicPartition(topic, partition)` per call to use as a `ConcurrentHashMap`\nkey — at 100k rec/s that's ~200k disposable instances/sec from this manager alone\n(twice per record: on\n[…]\n` so the timed loop only exercises the fast path. Run\n  with `-prof gc` to see `gc.alloc.rate.norm` drop by one `TopicPartition`\n  instance per record (~24 bytes on a 64-bit JVM with compressed oops).",
          "is_bot": false,
          "headline": "perf(consumer): cache TopicPartition per partition in KafkaOffsetMana…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T01:09:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01417c004182d33ee191f68f4938bdf7e8e8b8b2",
          "body": "…ence Backpressure constants (#202)\n\n* chore: tighten Builder null-validation + dlqTopic blank-check + reference Backpressure constants\n\nThree small validation-hygiene fixes bundled together:\n\n1. Add Objects.requireNonNull to the KPipeConsumer.Builder setters that\n   previously accepted null silentl\n[…]\num constants do,\nclass static fields don't — JDK quirk). Switching to backtick prose\nreferences keeps the audit's anti-drift intent (constants named, not\nliteral values) without the broken cross-link.",
          "is_bot": false,
          "headline": "chore: tighten Builder null-validation + dlqTopic blank-check + refer…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T00:57:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be1b8731d684f71793498775b23d759fab067229",
          "body": "…de settings (#199)\n\n* fix(api): MultiBuilder rejects silently-dropped per-route consumer-wide settings\n\nMultiBuilder.start() folds N per-topic routes into a single underlying\nKPipeConsumer, but only replays each route's pipeline (buildPipeline /\naddBatchRoute) — the route's consumer-level config (w\n[…]\nigurator\nmisconfig at construction). Promote both legacy checks to\nIllegalArgumentException so callers can catch one type.\n\nUpdates the two assertions in KPipeFacadeBuildTest that pinned the old\ntype.",
          "is_bot": false,
          "headline": "fix(api): MultiBuilder rejects silently-dropped per-route consumer-wi…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T00:14:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16dd0f34ea7291c7d1be78bb02127c8944db5866",
          "body": "…ne sites (#204)\n\nThe audit flagged bare `Thread.sleep(N)` followed by an immediate assertion as the\nhighest-severity test-brittleness pattern. Under loaded CI a fixed sleep budget can\nbe exceeded by GC pauses or VT scheduling jitter, and the follow-up assertion races\nthe wall clock instead of the a\n[…]\nTestcontainer integration tests (ExternalOffsetIntegrationTest,\nKPipeProducerIntegrationTest) fail at suite level due to local Docker daemon\nunavailability — pre-existing and unrelated to this change.",
          "is_bot": false,
          "headline": "test: replace bare Thread.sleep with poll-until-deadline in flake-pro…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T00:05:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79d9b136d2ebefa64f1bbed5195bd886fa53f109",
          "body": "… + BitSet, drop KeyOrdered wrapper (#203)\n\nThree small, surgical allocation cuts on the per-record hot path. No\nbehavior change; existing tests pass unmodified.\n\n1. TypedPipelineBuilder.deserialize: hoist `format.getClass().getSimpleName()`\n   from per-record to build-time. The value is only used i\n[…]\n(`ExternalOffsetIntegrationTest`, `KPipeProducerIntegrationTest`)\nare Testcontainers-based and fail on main too due to Docker daemon being\nunavailable in this environment — unrelated to these changes.",
          "is_bot": false,
          "headline": "perf: hot-path quick wins — hoist getSimpleName, batch scratch buffer…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T00:05:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cade7d6ffeee30d7792391c0df705e2b05095438",
          "body": "…ps, format) (#201)\n\nThe static-mode KPipe.avro/protobuf overloads took (format, topic, props)\nwhile KPipe.custom and the SR-mode KPipe.avro(topic, props, resolver) both\nput the format/resolver last. The §17 capability table documents the\ncanonical shape as (topic, props, format) — the static-mode o\n[…]\nMultiBuilder.protobuf(String topic, ProtobufFormat format, configurator)\n\nHard-rename + migrate all callers in the same PR per the no-deprecation\npolicy. No @Deprecated overloads kept for back-compat.",
          "is_bot": false,
          "headline": "refactor(api): normalize KPipe.avro/protobuf arg order to (topic, pro…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T00:05:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3610f5dceea537345a7bb3c1704bee7f59c57f45",
          "body": "Three documentation-drift fixes surfaced by an audit pass:\n\n1. `kpipe-api/package-info.java` — the worked example referenced\n   `KPipe.stream(\"topic\", JsonFormat.of()).process(...).to(Sink.console())`,\n   none of which exist. Rewritten to the current\n   `KPipe.json(topic, props).pipe(...).toConsole(\n[…]\nhmarks/` -> 0 hits.\n\nAlso updated the local CLAUDE.md §17 capability table to add a Tracing\nrow (Stream/MultiBuilder/Builder `withTracer(Tracer)`); the file is\ngitignored so it is not part of this PR.",
          "is_bot": false,
          "headline": "docs: fix package-info example, drop stale processToSink refs (#200)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-20T00:05:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81270744b9ab7ec3557989ae188f698addb4c881",
          "body": "…acer (#198)\n\nBoth adapters were package-private SPI helpers with exactly one production\ncallsite (OtelTracer itself), zero tests, zero examples. Their Javadoc already\ndeclared them as \"Used by OtelTracer#...\" — conceptually private. Pulling them\ninto OtelTracer as private static nested final classe\n[…]\nOC: -61 / +53 = -8 lines, one less compilation unit.\n\nJPMS unchanged: package-info still exports the same package; the deleted\nclasses were never independently exported, so no module-info edit needed.",
          "is_bot": false,
          "headline": "chore(tracing-otel): inline HeadersTextMap{Getter,Setter} into OtelTr…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-19T18:05:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c10b8a1221bc8ab3e555bea60aab05748c8ee5ef",
          "body": "…dule *ConsoleSinkTest (#197)\n\nThe same 30-line `java.util.logging.Handler` lived verbatim in three places — one per format module — each with exactly one consumer (the sibling *ConsoleSinkTest). Inline as a private nested class inside the sole consumer, matching how KPipeBytesConsoleSinkTest alread\n[…]\nnt) handler. A shared kpipe-test-fixtures module would be over-engineering for a 30-line JUL handler and would add a new published artifact + JPMS split-package coordination for no real reuse benefit.",
          "is_bot": false,
          "headline": "chore(test-fixtures): inline triplicated CapturingHandler into per-mo…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-19T18:05:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5573fb84f96148453ae889d5c57f79707d957b68",
          "body": "…All() (#196)\n\nPublic-API removal. Per the no-deprecation policy, hard-delete in the same\nPR rather than add a deprecation cycle.\n\ninvalidateAll() existed as a disaster-recovery surface for a hypothetical\nSR migration where previously-stable IDs map to different schemas. That\nscenario contradicts th\n[…]\nn grep returned only the method definition and the one test\nmethod; zero in-tree callers, so no migration code is needed. External\nusers on the rare-to-nonexistent recovery path: restart the consumer.",
          "is_bot": false,
          "headline": "chore(schema-registry): delete unused CachedSchemaResolver.invalidate…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-19T18:05:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c43852a46c9c06f94e94c17ff145da08018b0316",
          "body": "The accessor had only one caller — a unit test asserting its return\nvalue. Confirmed via grep across lib/, examples/, benchmarks/ with zero\nproduction callers. Drop the method and its test-load-only coverage in\nthe same PR per the no-deprecation policy.\n\nMode invariants stay enforced by:\n- AvroFormat.consoleSink() throws when registry-backed\n- AvroFormat.serialize() throws when registry-backed",
          "is_bot": false,
          "headline": "chore(format-avro): delete dead AvroFormat.isRegistryBacked() (#195)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-19T18:04:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a15b2c2ba37948e39a64fc9da9aa9c7cc5cbc833",
          "body": "JsonFormat is a stateless singleton exposed via JsonFormat.INSTANCE. The\npublic no-arg ctor was only used by the INSTANCE static initializer, so\nnothing user-facing constructs it. AvroFormat and ProtobufFormat both\ntake ctor args; JsonFormat was the odd one out exposing a public default\nctor that was never meant to be called directly.\n\nTighten the modifier to private and update the Javadoc to point users at\nJsonFormat.INSTANCE. Public-surface narrowing with zero callers — no\nmigration needed.",
          "is_bot": false,
          "headline": "chore(format-json): tighten JsonFormat no-arg ctor to private (#194)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-19T18:03:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ccac989bb7895f204c3ac564cc983ca6da84b7e",
          "body": "* test(producer): pin KafkaMessageSink error paths\n\nCloses a criticality-6 coverage gap: the existing tests only exercised\nhappy paths. Add three tests that pin the error contract:\n\n- acceptPropagatesProducerExceptionAsRuntime: synchronous KafkaException\n  from Producer.send must propagate (no silen\n[…]\nExceptionUnwrapped`. The body asserts the\noriginal `KafkaException` propagates verbatim via `assertSame`, so\n\"Unwrapped\" matches the actual invariant; \"AsRuntime\" implied a rewrap\nthat doesn't happen.",
          "is_bot": false,
          "headline": "test(producer): pin KafkaMessageSink error paths (#192)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T19:55:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "816123d9400921bb1b4c83f36080fca2ca1996be",
          "body": "…act (§19) (#193)\n\n* test(schema-registry): pin CachedSchemaResolver failure-caching contract\n\nAdds three tests that nail down the failure-propagation path under\ncontention — the criticality-8 coverage gap in the prior audit.\n\nThe §19 \"cache forever in-process\" invariant is correct ONLY for\nsuccessf\n[…]\nring context survives).\n\nReplaces the two §19 references in CachedSchemaResolverTest with\ndirect wording: \"Confluent SR schema IDs are immutable\" and\n\"computeIfAbsent must collapse concurrent misses\".",
          "is_bot": false,
          "headline": "test(schema-registry): pin CachedSchemaResolver failure-caching contr…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T19:52:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5943b14b2c7d2ff49e908e5f95a1a1f528dd379",
          "body": "Existing shouldSendDlqRecordWithAllHeaders covers the static x-dlq-*\nheaders but does NOT verify that a custom Tracer's injectContextInto\nruns against the outbound record. A future refactor that drops the\ntracer.injectContextInto(headers) call would silently strip trace\ncontext from DLQ records with\n[…]\nsends a\nrecord through sendToDlq, and asserts the stamp lands on the captured\nProducerRecord. Uses a hand-written stub (not Mockito) so the contract\nis enforced by behaviour, not by argument matching.",
          "is_bot": false,
          "headline": "test(producer): pin Tracer header injection through DLQ (#191)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T19:52:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df9c1d8716be8ce37b1d1e5a16138d1425ac0d4a",
          "body": "* chore: roundup of worth-considering nits from the 20-agent review fleet\n\nFive small follow-ups surfaced by recent reviews; no single one warrants\na PR on its own, but together they close real gaps.\n\n- Add `pendingCountDrainsWhenTaskThrowsError` to ParallelDispatcherTest:\n  pins that the `finally` \n[…]\nreserved.\n- Drop the trailing \"any other caller must too\" sentence from\n  ParallelDispatcher.dispatch's Javadoc — the class is package-private\n  with a single in-module caller, so the warning is moot.",
          "is_bot": false,
          "headline": "chore: roundup of worth-considering nits from review fleet (#190)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T19:52:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eb214920a9269c745b79c8617faaa1927be4c828",
          "body": "…eanup) (#187)\n\nSurfaced by the architecture + dead-code audits. All removals had zero\nproduction callers (test/bench callsites migrated in this commit per\nthe §16 delete-and-migrate policy):\n\n- AvroSchemaCatalog + test (~265 LOC)\n- ProtobufDescriptorCatalog + test (~177 LOC)\n- AvroRegistryKey (one \n[…]\nther + dedicated test\n- README + format-class Javadoc examples that referenced the catalogs\n\nNet: -553 LOC. JPMS module-info files unchanged (packages still\nexported; only deleting types within them).",
          "is_bot": false,
          "headline": "chore: delete dead Catalog classes + test-only withers (post-audit cl…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T19:16:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5fad212b544d084a6d1214b1b89363f74d4a2ce0",
          "body": "… (#189)\n\n`shouldProbe` had zero production callers — the Javadoc advertised \"a\ntimer asks shouldProbe on each tick\" but no such tick exists. The real\nOPEN → HALF_OPEN transition fires via a one-shot\n`scheduler.schedule(this::tryHalfOpen, openDuration, …)` future in\n`ConsumerHealthController.trip()`\n[…]\non to match the\n  actual scheduler-based design (and update the test-class Javadoc).\n- Add a \"Circuit breaker\" row to §17 capability table in\n  `.claude/CLAUDE.md` — the table was missing it entirely.",
          "is_bot": false,
          "headline": "chore(consumer): drop CircuitBreakerController.shouldProbe + fix docs…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T19:16:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce4988602cf2294b5728f7fc5340fff1203acf98",
          "body": "Adds 5 tests that pin the silent-failure guards in `BatchPipelineWrapper`:\n\n- `incompleteBatchResultRoutesMissingRecordsToDlq` — missing index in\n  `BatchResult` must route the unaccounted-for record to the failure\n  callback with a synthetic `IllegalStateException`, not be silently\n  marked process\n[…]\nxisting `BatchPipelineWrapperConcurrencyTest` only exercises the\nhappy-path parallel-enqueue invariant. These tests close the remaining\ngap on the wrapper's `BatchResult` classification + drain logic.",
          "is_bot": false,
          "headline": "test(consumer): pin BatchPipelineWrapper coverage-contract paths (#188)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T19:16:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "165b5dc77de3efd39634b8cc9db548e0551b625e",
          "body": "… paths (#186)\n\nCloses the criticality-9 coverage gap on ParallelDispatcher — the in-flight\ncounter that drives PARALLEL-mode backpressure is the single source of truth\nfor the high/low watermark, and any leak or double-decrement silently breaks\neither pause-forever (deadlock) or pause-never (overlo\n[…]\nntDispatchAndCloseDoesNotLeakPending: 200 concurrent dispatches\n  racing against close() — every dispatch terminates as started-and-drained\n  OR rejected-and-rolled-back, with no third \"leaked\" state.",
          "is_bot": false,
          "headline": "test(consumer): pin ParallelDispatcher pendingCount + onComplete race…",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T18:47:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6bf214ceade8402b8aa4b82a3fde38cda67e0237",
          "body": "- KafkaOffsetManagerTest: add partitionsAssignedFromDifferentThreadTripsAssertion\n  sibling to the existing onPartitionsRevoked off-thread test, closing the\n  symmetry gap surfaced in the PR #168 review.\n- OtelTracerTest: assertSame on Tracer.noop() / SpanScope.noop() pairs to pin\n  the enum-singlet\n[…]\ncaptured saturation WARN's message\n  contains \"saturat\" (lowercase substring) so a wording regression that\n  drops the saturation signal entirely fails the test, not just the count\n  (PR #167 review).",
          "is_bot": false,
          "headline": "test: pin three coverage follow-ups from recent reviews (#185)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T18:30:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e86d8dc8c6cff0814d38b2f1d4537aaf8084f79",
          "body": "Introduces examples/custom-format demonstrating the KPipe.custom(topic,\nprops, format) fluent entry point with a user-supplied MessageFormat<T>\nimplemented inline — no kpipe-format-* module dependency, no schema\nregistry, no extra runtime deps. The example uses a tiny CSV-line codec\nfor a CsvOrder r\n[…]\n standard error path\ninstead of masking them as filtered records.\n\nGap surfaced by the issue #166 audit: every other facade entry point\n(json/avro/protobuf/bytes) had a runnable example except custom.",
          "is_bot": false,
          "headline": "docs(examples): add KPipe.custom-format example (refs #166) (#184)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T18:28:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "491a9a8a4b666adc8f6e4f6e4d26b2a5599f5e16",
          "body": "Adds an `examples/bytes` module that demonstrates the\n`KPipe.bytes(topic, props)` fluent entry point — the only bundled\nformat without an example before this change (audit finding from\nissue #166).\n\nThe example wires a `MessageSink<byte[]>` that logs each record's\nlength plus a short hex preview. Useful as a reference for raw\nproxying, archival, or pre-format inspection where the pipeline\nstays in `byte[]` end-to-end with no SerDe.",
          "is_bot": false,
          "headline": "docs(examples): add KPipe.bytes example (refs #166) (#183)",
          "author_name": "Mariano Gonzalez",
          "author_login": "eschizoid",
          "committed_at": "2026-06-18T18:28:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 41,
      "commits_last_year": 256,
      "latest_release_at": "2026-07-20T04:20:58Z",
      "latest_release_tag": "v1.18.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 22,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 6.7
    },
    "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": []
    },
    "popularity": {
      "forks": 7,
      "stars": 57,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2025-04-21",
            "count": 1
          },
          {
            "date": "2025-04-22",
            "count": 1
          },
          {
            "date": "2025-04-25",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-14",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 7,
        "total_forks": 7
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "justfile"
      ],
      "api_schema_files": [
        "lib/kpipe-consumer/src/test/resources/protobuf/customer.proto"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "benchmarks/build.gradle.kts",
        "build.gradle.kts",
        "examples/avro/build.gradle.kts",
        "examples/build.gradle.kts",
        "examples/bytes/build.gradle.kts",
        "examples/circuit-breaker/build.gradle.kts",
        "examples/custom-format/build.gradle.kts",
        "examples/demo/build.gradle.kts",
        "examples/json/build.gradle.kts",
        "examples/protobuf-schema-registry/build.gradle.kts",
        "examples/protobuf/build.gradle.kts",
        "examples/schema-registry/build.gradle.kts",
        "examples/tracing/build.gradle.kts",
        "lib/build.gradle.kts",
        "lib/kpipe-api/build.gradle.kts",
        "lib/kpipe-bom/build.gradle.kts",
        "lib/kpipe-consumer/build.gradle.kts",
        "lib/kpipe-core/build.gradle.kts",
        "lib/kpipe-format-avro/build.gradle.kts",
        "lib/kpipe-format-json/build.gradle.kts",
        "lib/kpipe-format-protobuf-confluent/build.gradle.kts",
        "lib/kpipe-format-protobuf/build.gradle.kts",
        "lib/kpipe-metrics-otel/build.gradle.kts",
        "lib/kpipe-metrics/build.gradle.kts",
        "lib/kpipe-producer/build.gradle.kts",
        "lib/kpipe-schema-registry-confluent/build.gradle.kts",
        "lib/kpipe-test/build.gradle.kts",
        "lib/kpipe-tracing-otel/build.gradle.kts"
      ],
      "largest_source_bytes": 66676,
      "source_files_sampled": 293,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "benchmarks/build.gradle.kts",
        "build.gradle.kts",
        "examples/build.gradle.kts",
        "lib/build.gradle.kts"
      ],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "maven"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 237,
        "open_issues": 1,
        "closed_ratio": 0.967,
        "closed_issues": 29,
        "closed_unmerged_prs": 11
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "eschizoid",
          "commits": 304,
          "avatar_url": "https://avatars.githubusercontent.com/u/8173837?v=4"
        },
        {
          "type": "User",
          "login": "igor-soldev",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/229307367?v=4"
        },
        {
          "type": "User",
          "login": "jkondrat",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/5969801?v=4"
        },
        {
          "type": "User",
          "login": "matheusandre1",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/92062874?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.99
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "benchmarks.yaml",
        "ci.yaml",
        "release.yaml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 1,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
            "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": 0,
            "reason": "Found 0/29 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 0,
            "reason": "project is not 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": 10,
            "reason": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f090ec6365d334f22554b39f169cd3faab1fd4ac",
        "ran_at": "2026-07-24T14:17:07Z",
        "aggregate_score": 5.1,
        "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-24T14:15:05Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-24T13:14:47Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 50,
          "created_at": "2025-04-20T23:04:37Z",
          "last_comment_at": "2025-04-20T23:05:41Z",
          "last_comment_author": "eschizoid"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/eschizoid/kpipe",
    "host": "github.com",
    "name": "kpipe",
    "owner": "eschizoid"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 51,
        "vitality": 87,
        "community": 43,
        "governance": 50,
        "engineering": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 87,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "commits_last_year": 256,
              "human_commit_share": 0.94,
              "days_since_last_push": 0,
              "active_weeks_last_year": 22
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "22/52 weeks with commits",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "256 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 256
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "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": 100,
            "inputs": {
              "releases_count": 41,
              "latest_release_tag": "v1.18.0",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 6.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "41 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 41
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~6.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.7
                    }
                  }
                ],
                "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": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "forks": 7,
              "stars": 57,
              "watchers": 3,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "57 stars",
                "points": 28.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 57
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "7 forks",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 50,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.99
            },
            "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 99% of commits",
                "points": 0.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "merged_prs": 237,
              "open_issues": 1,
              "closed_issues": 29,
              "issue_closed_ratio": 0.967,
              "closed_unmerged_prs": 11
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "97% of issues closed",
                "points": 45.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "237/248 decided PRs merged",
                "points": 36.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 237,
                      "decided": 248
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "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": 61,
            "inputs": {
              "followers": 89,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "eschizoid",
              "public_repos": 142,
              "account_age_days": 4391
            },
            "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": "89 followers of eschizoid",
                "points": 14.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 89,
                      "login": "eschizoid"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "142 public repos, account ~12 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 142
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 74,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "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": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "apache-kafka",
                "data-pipelines",
                "event-driven",
                "functional-programming",
                "java",
                "kafka",
                "stream-processing"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "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": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 51,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 5.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "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 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 not fuzzed",
                "points": 0,
                "status": "missed",
                "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": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 4
            },
            "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": 68,
        "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": 1,
              "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": "94 of 94 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 94,
                      "sampled": 94
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "justfile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [
                "benchmarks/build.gradle.kts",
                "build.gradle.kts",
                "examples/avro/build.gradle.kts",
                "examples/build.gradle.kts",
                "examples/bytes/build.gradle.kts",
                "examples/circuit-breaker/build.gradle.kts",
                "examples/custom-format/build.gradle.kts",
                "examples/demo/build.gradle.kts",
                "examples/json/build.gradle.kts",
                "examples/protobuf-schema-registry/build.gradle.kts",
                "examples/protobuf/build.gradle.kts",
                "examples/schema-registry/build.gradle.kts",
                "examples/tracing/build.gradle.kts",
                "lib/build.gradle.kts",
                "lib/kpipe-api/build.gradle.kts",
                "lib/kpipe-bom/build.gradle.kts",
                "lib/kpipe-consumer/build.gradle.kts",
                "lib/kpipe-core/build.gradle.kts",
                "lib/kpipe-format-avro/build.gradle.kts",
                "lib/kpipe-format-json/build.gradle.kts",
                "lib/kpipe-format-protobuf-confluent/build.gradle.kts",
                "lib/kpipe-format-protobuf/build.gradle.kts",
                "lib/kpipe-metrics-otel/build.gradle.kts",
                "lib/kpipe-metrics/build.gradle.kts",
                "lib/kpipe-producer/build.gradle.kts",
                "lib/kpipe-schema-registry-confluent/build.gradle.kts",
                "lib/kpipe-test/build.gradle.kts",
                "lib/kpipe-tracing-otel/build.gradle.kts"
              ],
              "dependency_bot_commit_share": 0.06
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "justfile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "justfile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "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": "Java (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Java"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "6 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 6,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Java",
              "largest_source_bytes": 66676,
              "source_files_sampled": 293,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Java (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Java"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/293 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 293,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "good",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": [
                "lib/kpipe-consumer/src/test/resources/protobuf/customer.proto"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "lib/kpipe-consumer/src/test/resources/protobuf/customer.proto",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lib/kpipe-consumer/src/test/resources/protobuf/customer.proto"
                    }
                  }
                ],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T14:17:27.655567Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/eschizoid/kpipe.svg",
  "full_name": "eschizoid/kpipe",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистика.