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

snowflakedb / snowflake-kafka-connector

Snowflake Kafka Connector (Sink Connector)

Java · PythonApache-2.0★ 175 зірок⑂ 113 форківз трав. 2019 р.Переглянути на GitHub ↗

snowflakedb/snowflake-kafka-connector має індекс здоров’я 73 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (96/100), найнижчий — Engineering Quality (49/100). Останнє оновлення було 3 дні тому. Більшість нещодавньої роботи виконують 4 учасники.

73
загалом / 100
Добрий

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

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

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

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

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

Власність

SnowflakeОрганізація
1 616 підписників63 публічні репозиторіїз січ. 2014 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Mavencom.snowflake:snowflake-kafka-connector4.1.0-963 дні тому

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

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

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

96Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 3 дн. тому
30.5/36Ритм комітів — 44/52 тижнів із комітами
18/18Обсяг комітів — 260 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year260
human_commit_share1
days_since_last_push3
active_weeks_last_year44
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 89 релізів
36/36Свіжість релізів — останній реліз 3 дн. тому
27/27Ритм релізів — реліз кожні ~20,2 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count89
latest_release_tagv4.1.0
releases_from_tagsні
days_since_latest_release3
mean_days_between_releases20,2
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

55Помірний · 18% загального індексу
Як обчислюється оцінка
36.3/60Зірки — 175 зірок
17.1/25Форки — 113 форків
5.6/15Спостерігачі — 11 спостерігачів
Використані вхідні дані
forks113
stars175
watchers11
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ні

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

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

87Відмінний · 24% загального індексу
Як обчислюється оцінка
43.2/54Бас-фактор — на 4 контриб’ютор(ів) припадає половина всіх комітів
19.1/22.5Розподіл комітів — головний контриб’ютор — автор 15% комітів
13.5/13.5Широта контриб’юторів — 50 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Використані вхідні дані
bus_factor4
contributors_sampled50
top_contributor_share0,15
Як обчислюється оцінка
42.3/46.8Вирішення issue — закрито 90% issue
28.7/38.3Прийняття PR — злито 937/1 247 вирішених PR
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Використані вхідні дані
merged_prs937
open_issues25
closed_issues237
issue_closed_ratio0,905
closed_unmerged_prs310
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
23.1/25Охоплення власника — 1 616 підписників у snowflakedb
25/25Послужний список — 63 публічних репозиторіїв, вік облікового запису ~12 р.
Використані вхідні дані
followers1 616
owner_typeOrganization
is_verified
owner_loginsnowflakedb
public_repos63
account_age_days4 569

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у maven
35/35Свіжість публікацій — остання публікація 3 дн. тому
20/20Історія версій — 96 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagescom.snowflake:snowflake-kafka-connector
ecosystemsmaven
any_deprecatedні
min_days_since_publish3

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

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

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

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

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

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

50Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
10/10Теми — 4 тем
0/10Wiki
Використані вхідні дані
topicskafka, kafka-connect, snowflake, java
has_wikiні
homepage
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

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

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

Стан безпеки

65Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
6/7.5Branch-Protection — branch protection is not maximal on development and all release branches
0/2.5CI-Tests — 0 out of 30 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
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 0 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_aggregate6,5
Виключено з оцінювання (немає даних або не застосовно): signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
12/25Непрямі залежності без відомих сповіщень — уражено 1: at.yawk.lz4:lz4-java 1.10.1 (moderate 6.5)
40/40Немає задавнених сповіщень — жодне сповіщення не є публічним довше за 90 дн.
Використані вхідні дані
sourceosv
advisories1
affected_packages1
assessed_packages33
unassessed_packages0
affected_by_severitymoderate 1
direct_affected_packages0
Звірено з runtime-замиканням залежностей maven:com.snowflake:snowflake-kafka-connector@4.1.0 — тим, що тягне за собою встановлення опублікованого пакета, — 33 пакетів. Досяжність не аналізується.

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

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

61Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
12.6/18Розгортання однією командою — pom.xml, test/test_data/protobuf/pom.xml (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Java (статично типізована)
10/10Відтворюване середовище — Dockerfile
10/10Підтверджена практика роботи з агентами — 9 з останніх 100 комітів створено агентом або з його зазначенням
5/8Автоматизоване супроводження — автоматизацію залежностей налаштовано, але у вибірці комітів її не видно
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_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,09
toolchain_manifestspom.xml, test/test_data/protobuf/pom.xml
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Java (статично типізована)
54.5/55Керовані розміри файлів — 3/309 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageJava
largest_source_bytes79 795
source_files_sampled309
oversized_source_files3
Як обчислюється оцінка
40/40Схема API (OpenAPI/GraphQL/proto) — test/test_data/sensor.proto
0/20Сервер MCP
0/40Придатні до запуску приклади
Використані вхідні дані
example_dirs
has_mcp_signalні
api_schema_filestest/test_data/sensor.proto

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

175зірок GitHub
50контриб'юторів
260комітів за останні 12 місяців
3днів від останнього пушу
89релізів
4бас-фактор
25відкритих issue
Maven, PyPIпакетних екосистем

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

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

Докладніше

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

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

02040608010012010832019-052022-122026-06
Мажорні 3Мінорні 19Патчі 54

Кожна точка охоплює 7 днів.

OpenSSF Scorecard 6.5 / 10
6.5сукупно

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

10Binary-Artifactsno binaries found in the repo
8Branch-Protectionbranch protection is not maximal on development and all release branches
0CI-Tests0 out of 30 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 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
Прямі залежності 22
РеєстрПакетОбмеження версіїМаніфест
Mavenorg.apache.kafka:kafka-clients${kafka.version}pom.xml
Mavennet.snowflake:snowflake-jdbc${snowflake-jdbc.version}pom.xml
Mavencom.google.protobuf:protobuf-java${protobuf.version}pom.xml
Mavencom.google.protobuf:protobuf-java-util${protobuf.version}pom.xml
Mavenorg.apache.avro:avro1.12.1pom.xml
Mavenorg.apache.commons:commons-compress${commons-compress.version}pom.xml
Mavenorg.apache.commons:commons-lang3${commons-lang3.version}pom.xml
Mavencom.fasterxml.jackson.core:jackson-core${jackson.version}pom.xml
Mavencom.fasterxml.jackson.core:jackson-databind${jackson.version}pom.xml
Mavenio.confluent:kafka-schema-registry-client${confluent.version}pom.xml
Mavenio.confluent:kafka-avro-serializer${confluent.version}pom.xml
Mavenio.confluent:kafka-connect-avro-converter${confluent.version}pom.xml
Mavenio.confluent:kafka-schema-registry-client-encryption${confluent.version}pom.xml
Mavenio.dropwizard.metrics:metrics-core4.2.39pom.xml
Mavenio.dropwizard.metrics:metrics-jmx4.2.39pom.xml
Mavencom.google.guava:guava${guava.version}pom.xml
Mavencom.google.auto.value:auto-value-annotations${auto-value.version}pom.xml
Mavencom.github.ben-manes.caffeine:caffeine3.2.4pom.xml
Mavendev.failsafe:failsafe3.3.2pom.xml
Mavenorg.slf4j:slf4j-api${slf4j-api.version}pom.xml
Mavencom.snowflake:snowpipe-streaming${snowpipe-streaming.version}pom.xml
Mavenorg.junit:junit-bom5.14.4pom.xml
Усі залежності 54

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

РеєстрПакетВерсіяЗв'язок
Mavencom.fasterxml.jackson.core:jackson-core2.22.1пряма
Mavencom.fasterxml.jackson.core:jackson-databind2.22.1пряма
Mavencom.github.ben-manes.caffeine:caffeine3.2.4пряма
Mavencom.google.auto.value:auto-value-annotations1.11.1пряма
Mavencom.google.guava:guava33.6.0-jreпряма
Mavencom.google.protobuf:protobuf-java3.25.5пряма
Mavencom.google.protobuf:protobuf-java-util3.25.5пряма
Mavencom.snowflake:snowpipe-streaming1.6.2пряма
Mavendev.failsafe:failsafe3.3.2пряма
Mavenio.confluent:kafka-avro-serializer7.9.2пряма
Mavenio.confluent:kafka-connect-avro-converter7.9.2пряма
Mavenio.confluent:kafka-schema-registry-client7.9.2пряма
Mavenio.confluent:kafka-schema-registry-client-encryption7.9.2пряма
Mavenio.dropwizard.metrics:metrics-core4.2.39пряма
Mavenio.dropwizard.metrics:metrics-jmx4.2.39пряма
Mavennet.snowflake:snowflake-jdbc4.3.2пряма
Mavenorg.apache.avro:avro1.12.1пряма
Mavenorg.apache.commons:commons-compress1.28.0пряма
Mavenorg.apache.commons:commons-lang33.20.0пряма
Mavenorg.apache.kafka:kafka-clients3.9.2пряма
Mavenorg.junit:junit-bom5.14.4пряма
Mavenorg.slf4j:slf4j-api2.0.18пряма
Mavencom.github.stefanbirkner:system-rules1.19.0непряма
Mavencom.google.auto.value:auto-value1.11.1непряма
Mavencommons-dbutils:commons-dbutils1.8.1непряма
Mavenjunit:junit4.13.2непряма
Mavenorg.apache.commons:commons-dbcp22.14.0непряма
Mavenorg.apache.kafka:connect-api3.9.2непряма
Mavenorg.apache.kafka:connect-json0.9.0.0непряма
Mavenorg.apache.kafka:connect-runtime3.9.2непряма
Mavenorg.apache.kafka:kafka-server-common3.9.2непряма
Mavenorg.apache.kafka:kafka_2.133.9.2непряма
Mavenorg.apache.logging.log4j:log4j-core2.26.1непряма
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.15.0непряма
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.3непряма
Mavenorg.apache.maven.plugins:maven-failsafe-plugin3.5.5непряма
Mavenorg.apache.maven.plugins:maven-gpg-plugin3.2.8непряма
Mavenorg.apache.maven.plugins:maven-jar-plugin3.5.0непряма
Mavenorg.apache.maven.plugins:maven-javadoc-plugin3.12.0непряма
Mavenorg.apache.maven.plugins:maven-project-info-reports-plugin3.3.0непряма
Mavenorg.apache.maven.plugins:maven-site-plugin3.12.1непряма
Mavenorg.apache.maven.plugins:maven-source-plugin3.4.0непряма
Mavenorg.apache.maven.plugins:maven-surefire-plugin3.5.5непряма
Mavenorg.assertj:assertj-core3.27.7непряма
Mavenorg.awaitility:awaitility4.3.0непряма
Mavenorg.bouncycastle:bcpkix-fips2.1.11непряма
Mavenorg.codehaus.mojo:exec-maven-plugin3.2.0непряма
Mavenorg.junit.jupiter:junit-jupiter-engineнепряма
Mavenorg.junit.jupiter:junit-jupiter-paramsнепряма
Mavenorg.junit.vintage:junit-vintage-engineнепряма
Mavenorg.mockito:mockito-core5.23.0непряма
Mavenorg.slf4j:slf4j-log4j122.0.18непряма
Mavenorg.sonatype.central:central-publishing-maven-plugin0.10.0непряма
Mavenorg.testcontainers:testcontainers2.0.5непряма
Сповіщення про залежності 1

Встановлення maven:com.snowflake:snowflake-kafka-connector@4.1.0 тягне 33 пакетів, прямих і транзитивних: 1 мають відомі сповіщення, з них 0 — прямі залежності.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
at.yawk.lz4:lz4-java1.10.1непрямапомірна11.11.1

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "kafka",
        "kafka-connect",
        "snowflake",
        "java"
      ],
      "is_fork": false,
      "size_kb": 151370,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Java": 1754402,
        "Ruby": 2037,
        "Shell": 71951,
        "Python": 553590,
        "Dockerfile": 744
      },
      "pushed_at": "2026-07-22T17:22:45Z",
      "created_at": "2019-05-21T22:51:40Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T15:15:51Z",
      "description": "Snowflake Kafka Connector (Sink Connector)",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "master",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Java",
      "significant_languages": [
        "Java",
        "Python"
      ]
    },
    "owner": {
      "blog": "https://snowflake.com",
      "name": "Snowflake",
      "type": "Organization",
      "login": "snowflakedb",
      "company": null,
      "location": "In the ☁",
      "followers": 1616,
      "avatar_url": "https://avatars.githubusercontent.com/u/6453780?v=4",
      "created_at": "2014-01-20T19:36:18Z",
      "is_verified": null,
      "public_repos": 63,
      "account_age_days": 4569
    },
    "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": "v4.1.0",
          "kind": "minor",
          "published_at": "2026-07-22T17:18:36Z"
        },
        {
          "tag": "v4.1.0-rc1",
          "kind": "prerelease",
          "published_at": "2026-07-07T06:48:30Z"
        },
        {
          "tag": "v4.0.2",
          "kind": "patch",
          "published_at": "2026-06-25T16:24:55Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2026-06-02T22:05:58Z"
        },
        {
          "tag": "v3.5.4",
          "kind": "patch",
          "published_at": "2026-05-28T15:13:45Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2026-04-17T17:03:29Z"
        },
        {
          "tag": "v4.0.0-rc9",
          "kind": "prerelease",
          "published_at": "2026-03-30T15:57:34Z"
        },
        {
          "tag": "v4.0.0-rc8",
          "kind": "prerelease",
          "published_at": "2026-01-27T13:24:22Z"
        },
        {
          "tag": "v3.5.3",
          "kind": "patch",
          "published_at": "2026-01-27T01:14:01Z"
        },
        {
          "tag": "v4.0.0-rc7",
          "kind": "prerelease",
          "published_at": "2026-01-21T12:00:59Z"
        },
        {
          "tag": "v3.5.2",
          "kind": "patch",
          "published_at": "2026-01-13T16:12:51Z"
        },
        {
          "tag": "v4.0.0-rc6",
          "kind": "prerelease",
          "published_at": "2026-01-14T18:11:22Z"
        },
        {
          "tag": "v3.5.1",
          "kind": "patch",
          "published_at": "2026-01-08T17:32:32Z"
        },
        {
          "tag": "v4.0.0-rc5",
          "kind": "prerelease",
          "published_at": "2025-12-17T17:55:42Z"
        },
        {
          "tag": "v3.5.0",
          "kind": "minor",
          "published_at": "2025-12-15T21:06:55Z"
        },
        {
          "tag": "v4.0.0-rc4",
          "kind": "prerelease",
          "published_at": "2025-12-04T18:08:40Z"
        },
        {
          "tag": "v4.0.0-rc3",
          "kind": "prerelease",
          "published_at": "2025-11-24T23:27:08Z"
        },
        {
          "tag": "v4.0.0-rc2",
          "kind": "prerelease",
          "published_at": "2025-11-19T09:57:23Z"
        },
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2025-11-05T20:18:33Z"
        },
        {
          "tag": "v4.0.0-rc1",
          "kind": "prerelease",
          "published_at": "2025-10-22T10:46:59Z"
        },
        {
          "tag": "v3.3.1",
          "kind": "patch",
          "published_at": "2025-10-23T09:12:33Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2025-08-26T09:33:18Z"
        },
        {
          "tag": "v3.2.4",
          "kind": "patch",
          "published_at": "2025-07-31T21:07:16Z"
        },
        {
          "tag": "v3.2.3",
          "kind": "patch",
          "published_at": "2025-07-14T11:58:15Z"
        },
        {
          "tag": "v3.2.2",
          "kind": "patch",
          "published_at": "2025-06-26T13:57:55Z"
        },
        {
          "tag": "v3.2.1",
          "kind": "patch",
          "published_at": "2025-06-02T21:11:25Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2025-04-28T18:22:37Z"
        },
        {
          "tag": "v3.1.3",
          "kind": "patch",
          "published_at": "2025-04-08T10:49:16Z"
        },
        {
          "tag": "v3.1.2",
          "kind": "patch",
          "published_at": "2025-03-18T14:49:18Z"
        },
        {
          "tag": "v3.1.1",
          "kind": "patch",
          "published_at": "2025-02-27T10:13:30Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2025-01-21T08:27:40Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2024-12-10T16:44:47Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2024-10-31T07:54:21Z"
        },
        {
          "tag": "v2.4.1",
          "kind": "patch",
          "published_at": "2024-09-19T08:36:35Z"
        },
        {
          "tag": "v2.4.0",
          "kind": "minor",
          "published_at": "2024-08-15T17:30:43Z"
        },
        {
          "tag": "v2.3.0",
          "kind": "minor",
          "published_at": "2024-07-10T20:00:30Z"
        },
        {
          "tag": "v2.2.2",
          "kind": "patch",
          "published_at": "2024-05-07T18:27:15Z"
        },
        {
          "tag": "v2.2.1",
          "kind": "patch",
          "published_at": "2024-03-15T17:11:09Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2024-02-07T18:36:48Z"
        },
        {
          "tag": "v2.1.2",
          "kind": "patch",
          "published_at": "2023-12-04T21:48:29Z"
        },
        {
          "tag": "v2.0.2-rc",
          "kind": "prerelease",
          "published_at": "2023-11-17T18:13:26Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2023-08-24T20:22:23Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2023-07-31T16:59:12Z"
        },
        {
          "tag": "v1.9.4",
          "kind": "patch",
          "published_at": "2023-07-12T20:14:18Z"
        },
        {
          "tag": "v1.9.3",
          "kind": "patch",
          "published_at": "2023-05-19T00:08:12Z"
        },
        {
          "tag": "v1.9.2",
          "kind": "patch",
          "published_at": "2023-04-29T01:28:48Z"
        },
        {
          "tag": "v1.9.1",
          "kind": "patch",
          "published_at": "2023-03-01T20:55:54Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2023-02-27T19:40:39Z"
        },
        {
          "tag": "v1.8.2",
          "kind": "patch",
          "published_at": "2022-11-11T00:18:57Z"
        },
        {
          "tag": "v1.6.9",
          "kind": "patch",
          "published_at": "2022-09-28T21:29:56Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2022-09-02T20:52:32Z"
        },
        {
          "tag": "v1.6.8",
          "kind": "patch",
          "published_at": "2022-08-18T20:24:15Z"
        },
        {
          "tag": "v1.6.7",
          "kind": "patch",
          "published_at": "2022-08-12T18:16:14Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2022-04-28T19:21:32Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2022-04-25T17:06:12Z"
        },
        {
          "tag": "v1.6.6",
          "kind": "patch",
          "published_at": "2022-04-21T20:40:20Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2022-01-21T18:47:35Z"
        },
        {
          "tag": "v1.6.5",
          "kind": "patch",
          "published_at": "2022-01-21T18:46:42Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2022-01-14T18:44:14Z"
        },
        {
          "tag": "v1.6.4",
          "kind": "patch",
          "published_at": "2022-01-13T07:48:18Z"
        },
        {
          "tag": "v1.6.3",
          "kind": "patch",
          "published_at": "2021-12-14T18:48:46Z"
        },
        {
          "tag": "v1.6.2",
          "kind": "patch",
          "published_at": "2021-12-10T23:52:30Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2021-11-30T03:41:47Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2021-10-19T18:06:19Z"
        },
        {
          "tag": "v1.5.5",
          "kind": "patch",
          "published_at": "2021-06-21T22:58:07Z"
        },
        {
          "tag": "v1.5.4",
          "kind": "patch",
          "published_at": "2021-05-19T01:07:09Z"
        },
        {
          "tag": "v1.5.3",
          "kind": "patch",
          "published_at": "2021-05-10T19:43:34Z"
        },
        {
          "tag": "v1.5.2",
          "kind": "patch",
          "published_at": "2021-01-26T23:37:21Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2020-12-01T23:57:26Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2020-09-30T18:44:29Z"
        },
        {
          "tag": "v1.4.4",
          "kind": "patch",
          "published_at": "2020-08-18T20:33:31Z"
        },
        {
          "tag": "v1.4.3",
          "kind": "patch",
          "published_at": "2020-08-05T00:53:02Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2020-07-22T23:38:46Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2020-06-22T19:02:04Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2020-06-11T22:01:33Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2020-06-04T22:31:36Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2020-05-27T00:01:56Z"
        },
        {
          "tag": "v1.2.3",
          "kind": "patch",
          "published_at": "2020-04-06T16:27:33Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2020-03-16T17:45:28Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2020-03-12T23:55:30Z"
        },
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2019-11-06T23:09:13Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2019-11-01T18:09:12Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2019-10-29T20:24:05Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2019-10-29T20:16:42Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2019-10-07T20:34:31Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2019-09-27T21:55:59Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2019-09-04T22:17:37Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2019-07-09T18:46:10Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2019-06-30T22:47:45Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "35e977b8121dde31d811e1ba431903b0ae6402ad",
          "body": "… ingestion (snowflake.autocreate.table.type) (#1487)\n\n## Summary\n\nAdds managed-Iceberg **table auto-creation + ingestion** to KC v4, gated\nby a new connector-wide `snowflake.autocreate.table.type` (`snowflake` |\n`iceberg` | `none`). The setting governs **auto-creation only** — an\nexisting table is \n[…]\n\n\nRelated: SNOW-3552261 (server-side SE on managed Iceberg), SNOW-3053493\n(primitive-column SE), SNOW-3161094 (KC for SSv2 Iceberg).\n\n---------\n\nCo-authored-by: Seb Kurella <seb.kurella@snowflake.com>",
          "is_bot": false,
          "headline": "SNOW-3161094: Kafka Connector — managed-Iceberg table auto-creation +…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-07-22T15:13:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "504ef2047aa38472cdd91937d7abb0a1c08c44a7",
          "body": "Dependency bumps for the 4.1.0 release, in both `pom.xml` and\n`pom_confluent.xml`.\n\n- **Jackson `2.22.0` → `2.22.1`** — fixes three advisories affecting\n`2.22.0` (all fixed in `2.22.1`): CVE-2026-59889 (`@JsonView` bypassed\nfor `@JsonUnwrapped` container properties on deserialization),\nCVE-2026-5451\n[…]\nurrency bump; the JDBC is a\nshaded fat jar whose patch releases pick up bundled transitive fixes.\n- **snowpipe-streaming (SSv2 SDK) `1.6.1` → `1.6.2`** — shaded artifact\n(not the `-unshaded` variant).",
          "is_bot": false,
          "headline": "Bump Jackson, snowflake-jdbc, and Snowpipe Streaming SDK (#1527)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-22T14:10:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a014907e7902157926cf3c0ab5757ceef936f72",
          "body": "Bump connector version from `4.1.0-rc1` to `4.1.0` in `pom.xml`,\n`pom_confluent.xml`, and the `Utils.VERSION` constant.",
          "is_bot": false,
          "headline": "Bump version to 4.1.0 (#1525)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-22T11:53:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4612623d90a7c0e2f534e443246ce9b10e301df9",
          "body": "…C v3 parity) (#1522)\n\nSNOW-3766306\n\n## Bug\n\nA `TIME` column receiving an ISO time string with a UTC offset but **no\nfractional seconds** (e.g. `\"00:00:00Z\"`) passes the connector's\nclient-side check, but SSv2 can't parse it and **silently drops the\nrow** (committed offset advances → data lost). KC \n[…]\n1 literals with a trailing `Z` (e.g.\n`\"2017-09-15Z\"`) is a *new* capability KC v3 never had; tracked\nseparately in **SNOW-3819217**.\n\n---------\n\nCo-authored-by: Seb Kurella <seb.kurella@snowflake.com>",
          "is_bot": false,
          "headline": "SNOW-3766306: normalize TIME values with a UTC offset so they land (K…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-07-22T11:51:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2a40389680918a7eccef439f55c043827a5b14c",
          "body": "…1524)\n\n## Summary\n\nFixes a flaky e2e test,\n`test_invalidation_one_partition_others_healthy`, which\nfailed on master (scheduled run, `core_legacy confluent 6.2.15 AZURE`)\nwith:\n\n```\nAssertionError: Healthy partition 2 lost data: before=100, after=100\n{0: 210, 1: 210, 2: 100}\n```\n\nNo data was actuall\n[…]\npartition_others_healthy`\n    together: **3/3** (6/6 executions).\n  - Every partition grew past its baseline in every run.\n\nFollow-up to #1512, which fixed the invalidated-partition side of this\ntest.",
          "is_bot": false,
          "headline": "e2e: wait for all partitions to recover after channel invalidation (#…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-07-14T13:30:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc8161ae81bfb36f8b8b3128b2f36eb3a56a4251",
          "body": "## Summary\n\nAdds a long-running **soak test** (`test/tests/test_soak_with_chaos.py`) that hammers the Snowpipe Streaming v2 ingestion and channel-recovery path under continuous high-rate load while injecting several kinds of chaos, and asserts strict data-integrity invariants throughout. It runs **n\n[…]\nall regular functional / stress jobs, so the long test never runs in the normal pipeline.\n\n## Testing\n\nhttps://github.com/snowflakedb/snowflake-kafka-connector/actions/runs/29098069518/job/86379587335",
          "is_bot": false,
          "headline": "add soak test with chaos (#1493)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-13T14:35:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f208ea2455d7a425015a65148ff099caa2e8829d",
          "body": "SNOW-3214907\n\n## Summary\n\nKafka Connect deserializes raw header bytes into typed values using the configured `header.converter` before a record reaches the connector. The connector writes those values to `RECORD_METADATA:headers`.\n\nToday the connector flattens every header value to a string (`String\n[…]\nches how KC v3 wrote headers.\n\nThe default is `false` because changing the stored representation of existing headers is a breaking change for downstream consumers that parse `RECORD_METADATA:headers`.",
          "is_bot": false,
          "headline": "add support for typed headers (#1521)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-13T13:46:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b1247b724414e131f19edf16fb98ae59457d4b49",
          "body": "## Context\nReview of the connector's local observability (SNOW-3136119). Adds\nperformance\nmetrics and SDK log/metrics controls so slow or stalled ingestion can be\ndiagnosed from JMX (k8s) and, via an opt-in SDK Prometheus endpoint, in\nmore\ndetail for benchmarking — without any change to the ingest S\n[…]\nootstraps the SDK metrics server; it then\ningests,\nverifies no regression, and scrapes the SDK Prometheus endpoint\ncross-container\n  for the expected metric names.\n- google-java-format and ruff clean.",
          "is_bot": false,
          "headline": "SNOW-3136119: improve Kafka Connector local observability (#1514)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-07-09T09:26:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9df7f43ac3b5d9cc164e81a7ed3c2a6a7c7b6fa8",
          "body": "[SNOW-3417175](https://snowflakecomputing.atlassian.net/browse/SNOW-3417175)\n\nAdds optional regex **group substitution** to\n`snowflake.topic2table.map`, so a capturing topic pattern can project\nmatched groups into the resolved table name (e.g. `topic_(.*):\"tbl_$1\"`\nsends `topic_events` to `tbl_event\n[…]\nap (rejected at config time).\n\n[SNOW-3417175]:\nhttps://snowflakecomputing.atlassian.net/browse/SNOW-3417175?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",
          "is_bot": false,
          "headline": "implement `topic2table` regex replacement (#1502)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-08T13:54:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d2c2bbbcd312cafac061658e4052a697ac36a5f",
          "body": "SNOW-3417175\r\n\r\nPure refactor. Will allow us to add an alternative implementation and switch between them with a setting.",
          "is_bot": false,
          "headline": "refactor: add TopicToTableResolver (#1452)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-08T12:16:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a78d7c7f8090eba4c180408e90220bfb52b259f",
          "body": "…517)\n\n## Summary\n\nWhen client-side structural validation fails (extra columns or missing\nNOT NULL columns) and schema evolution is disabled, the resulting\n`DataException` routed to the DLQ did not identify which table triggered\nthe failure. With many tables in flight this made the error hard to act\n[…]\n`snowflake.feature.validation.error.table.name` (default\n`true`), matching the existing `snowflake.feature.*` flags. Set it to\n`false` to revert to the legacy message format that omits the table\nname.",
          "is_bot": false,
          "headline": "Include target table name in structural validation error messages (#1…",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-06T20:42:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47b79c2628898e45d73ab39e0980ba21cb998b94",
          "body": null,
          "is_bot": false,
          "headline": "remove dead CI links from README (#1518)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-06T19:45:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "983f1b8d5896f40ca7f024e1e7cd606346d353d3",
          "body": "…false) (#1519)\n\n## Summary\n\nThe streaming SDK (>= 1.6.1) defaults `oauth_include_scope` to **true**,\nwhich makes it derive `session:role:{role}` and send it as the `scope`\non OAuth refresh requests. External OAuth / IdP refresh tokens that were\nminted **without** a role scope are then rejected by t\n[…]\nConfigValidatorTest` — scope-without-include is invalid;\nscope-with-include is valid.\n- [ ] Re-run the OAuth E2E ingestion test on this branch (default\nconfig, no scope) to confirm master CI is green.",
          "is_bot": false,
          "headline": "Expose snowflake.oauth.include.scope to control OAuth scope (default …",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-06T19:43:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "165c04c5fd39f9e178dba8f4c25ae2beac176bee",
          "body": null,
          "is_bot": false,
          "headline": "add OAuth support to streaming SDK and connector validation (#1449)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-06T15:43:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c935778e844861bcbf07761cd4ea8e1897e1c69",
          "body": "…bumps (#1516)\n\n## Summary\n\nThe two build POMs had drifted out of sync (kafka, assertj, log4j,\ncommons-dbcp2, and two Maven plugins differed between `pom.xml` and\n`pom_confluent.xml`). This aligns them and bumps the safe/stable shared\ndependencies to their latest stable releases, so every shared ver\n[…]\n.\n\n### Closable Dependabot PRs once this lands\n\n- #1470 (jackson → 2.21.3) — superseded by 2.22.0\n- #1469 (slf4j → 2.0.18) — included as-is\n- #1466 (dropwizard-metrics → 4.2.38) — superseded by 4.2.39",
          "is_bot": false,
          "headline": "Sync dependency versions across pom.xml and pom_confluent.xml + safe …",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-06T15:33:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bde3ad21b1206b1f0e78c16c4086061c2a104f23",
          "body": "Bumps the connector version to `4.1.0-rc1` (release candidate) across\nthe three version sources: `pom.xml`, `pom_confluent.xml`, and the\n`VERSION` constant in `Utils.java`.",
          "is_bot": false,
          "headline": "Bump version to 4.1.0-rc1 (#1515)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-06T14:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0428e739f3574315e7965df88b4280789fb868ce",
          "body": "## Summary\n\nAdds OAuth support to JDBC connection properties. When the connector is\nconfigured with `snowflake.authenticator=oauth`,\n`makeJdbcDriverProperties` fetches an access token via\n`OAuthAccessTokenFetcher` and passes it to the JDBC driver instead of a\nprivate key.\n\n- **`InternalUtils.makeJdb\n[…]\nied locally against\nSnowflake\n\n[SNOW-3535094]:\nhttps://snowflakecomputing.atlassian.net/browse/SNOW-3535094?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",
          "is_bot": false,
          "headline": "add OAuth support to JDBC connection properties (#1448)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-06T11:26:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "29c1b9e55a46975b2dca6585ea29183e3e6b4cd7",
          "body": "## Summary\n\nAdds OAuth error codes, the `URL` interface extensions (`sslEnabled()`,\n`path()`), and the token infrastructure needed by subsequent PRs in the\nOAuth stack.\n\n- **Error codes**: ERROR_0026, ERROR_0027, ERROR_0029, ERROR_0033,\nERROR_1004\n- **`URL` interface**: added `sslEnabled()` and `pat\n[…]\nceed (all using\nMockito-mocked `HttpClient`)\n- [x] `OAuthAccessTokenFetcherTest` — asserts a permanent 4xx (401) is\nnot retried (`verify(httpClient, times(1))`), so terminal failures abort\nimmediately",
          "is_bot": false,
          "headline": "add OAuth error codes, URL extensions, and token infrastructure (#1447)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-02T15:19:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08b63fd4a73b9d979366d934d510d8caf5c2d6c1",
          "body": "…timeout (#1513)\n\n## Summary\n\n`test_migration_from_snowpipe` intermittently fails with\n`AssertionError: v3 never ingested beyond 10 warmup records`. The warmup\ncheck waited via `wait_for(..., timeout=60)`, but the v3 connector\ningests through classic file-based Snowpipe, whose async file loading\nrou\n[…]\n before the next file-based Snowpipe batch loaded\n— which the old 60s wait would have failed on. With the wider budget it\npassed cleanly, no gaps and no duplicates (25950 expected / distinct /\ntotal).",
          "is_bot": false,
          "headline": "end-to-end: de-flake v3 Snowpipe migration test by increasing warmup …",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-02T14:59:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c76ab8daff71e45fe4a90b6627715fe349b4393e",
          "body": "…count (#1512)\n\n## Summary\n\n`test_invalidation_one_partition_others_healthy` intermittently fails on\nmaster with `Partition 1 did not recover: before=100, after=100` (assert\n`100 > 100`) — seen post-merge on today's commits #1511 and #1458,\nunrelated to those diffs.\n\nRoot cause is a test-design race\n[…]\nfirms invalidation took hold); only its\nnow-unused return value is dropped.\n\nNote: `test_invalidation_all_partitions` has the same latent\nglobal-count-vs-per-partition race but is left unchanged here.",
          "is_bot": false,
          "headline": "e2e: wait for invalidated partition to recover instead of global row …",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-02T14:42:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e0023dfbda6588e6e429e345b8542dba61a64da",
          "body": "## Summary\n\n`test_native_complex_smt[v3]` flaked in CI (release-4.0): it asserted\nthe first row's `offset == 0` but got `13`. Root cause is in the test,\nnot the connector — all 100 rows ingested fine.\n\n`Table.select` issues `SELECT * FROM <table>` with no `ORDER BY`, so\n`select(...)[0]` returns an a\n[…]\ny`\n- `test_avrosr_avrosr.py`\n- `test_string_avrosr.py`\n- `test_native_string_json_without_schema.py`\n- `test_native_string_protobuf.py` (also drops a misleading `LIMIT 1`,\nwhich was equally unordered)",
          "is_bot": false,
          "headline": "end-to-end: de-flake by fixing result order (#1505)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-02T14:14:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f489dbf0433e91ff46c5bd558288fd9e04b5527",
          "body": "…N (#1511)\n\nSnowflake returns \"ON\" (not \"Y\") for enabled ERROR_LOGGING in SHOW\nTABLES output, so tables with error logging were incorrectly flagged as\ndisabled.\n\nCo-authored-by: Alex Newsome <alex.newsome+snow@snowflake.com>",
          "is_bot": false,
          "headline": "fix hasErrorLoggingEnabled to check SHOW TABLES error_logging value O…",
          "author_name": "Alex Newsome",
          "author_login": "sfc-gh-anewsome",
          "committed_at": "2026-07-01T14:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a343504e3a872d437a3db683f9e49665ca3d1738",
          "body": "## Summary\n\nReworks how authentication config is modeled in `SinkTaskConfig`.\nPreviously sensitive fields were typed as `Password` but had to tiptoe\naround nullability; now all auth-related config is `Optional`, which\nremoves null-handling at call sites and reads more cleanly. The cleanup\nis modest \n[…]\nest` — added `testOAuthBlankClientId` /\n`testOAuthBlankClientSecret`\n- [x] `InternalUtilsTest`, `StreamingClientPropertiesTest` — updated\n`parsePrivateKey` callers to `Password` + `Optional<Password>`",
          "is_bot": false,
          "headline": "improve password parsing (#1458)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-07-01T10:54:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13fb9b491d1873bc5097d3a8826c1b48d1386a2f",
          "body": "Rotate the RSA key in the AWS/Azure/GCS Kafka Connector E2E test\nprofiles. Based on master incl. credential masking (#1509) and reduced\nPython config logging (#1504).",
          "is_bot": false,
          "headline": "NO-SNOW: rotate sfctest0 test-profile keys (#1510)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-06-29T12:13:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e3553dac3a5fa232536cf639646f7ffbf3b87df",
          "body": null,
          "is_bot": false,
          "headline": "mask credentials with `::add-mask::` (#1509)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-29T10:35:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fe9fd4bca7f8e0bb547c314b8e43be612b604d5",
          "body": "## Summary\nRemoves a verbose `Config template` debug dump from the\nconnector-creation path in the Python integration test driver\n(`test/lib/driver.py`). This trims unnecessary log output during test\nruns.\n\n## Details\n- Drops the `logger.info(\"Config template: ...\")` call in\n`KafkaDriver.createConnector`.\n- No change to test behavior; the connector is still created and\nvalidated exactly as before.\n\n## Test plan\n- [x] Existing integration test suite runs unchanged (the removed line\nwas log-only).",
          "is_bot": false,
          "headline": "Reduce config logging in Python integration tests (#1504)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-06-25T16:10:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc7b6cb08e5f882601d4402c8fcf5ea8c766399d",
          "body": "…s detection (#1497)\n\nPM action item from PROD-538073 (KC 4.0.0 silent offset-rewind data\nloss).\nAdds two additive, per-channel signals (JMX + `kafka_channel_usage`\ntelemetry, already version-stamped) so offset-gap abnormalities can be\ntrended across connector releases:\n\n- **`offset_gap_count` / `of\n[…]\nan.\n- Live e2e on a SUT (apache 3.7.0, via the Snowfort KC proxy holder, SDK\npinned 1.4.0 per #1481): `test_string_json[v4]` and\n`test_channel_invalidation_recovery[v4]` both PASS.\n\nJIRA: SNOW-3655748",
          "is_bot": false,
          "headline": "SNOW-3655748: add offset-gap and recovery-skip telemetry for data-los…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-06-25T15:27:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea8d08ba8efa3eacc5a9f7e8de52b0c198779483",
          "body": "## Summary\n\nThe e2e Kafka producer helpers (`sendBytesData` / `sendAvroSRData`) were\nfire-and-forget. `confluent_kafka`'s `produce()` reports delivery\nfailures only through the `on_delivery` callback, and `flush()` returns\nthe number of still-unsent messages instead of raising. A dropped record\nwas \n[…]\nalue)`, so callers that pass a lazy iterator (e.g.\n`itertools.islice`) keep working.\n- Fix a latent bug in `sendAvroSRData`: the mid-loop flush flushed the\nplain producer instead of the avro producer.",
          "is_bot": false,
          "headline": "fail when a test record is not delivered to Kafka (#1501)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-25T14:07:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8eb1a2089a47b846b285a8f9b4bcf91ccc5faabb",
          "body": "… path) (#1499)\n\n## Summary\n\nKafka Connector v4 (Snowpipe Streaming V2) does not auto-recover from a\ntransient **HTTP 404 (\"No Route\")** at the Snowflake envoy layer. A\nbrief routing blip (<30s observed) makes the Rust SDK mark the\n`SnowflakeStreamingIngestClient` **permanently invalid**\n(`InvalidCl\n[…]\n kill-switch + the fault-injection e2e.\n- The e2e uses the `create_connector` fixture + `RecordProducer`\n(mirrors `test_channel_invalidation_recovery`); all assertions are\n**exact** (no \"at least N\").",
          "is_bot": false,
          "headline": "SNOW-3670537: recover invalid SDK client from preCommit (offset-fetch…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-06-24T13:15:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5abb7cb68adf3d50bd31f0c5cea36f83c5c43124",
          "body": "SNOW-3647384\n\n## Summary\n\nDuring a consumer rebalance a partition can be revoked while its\n`openChannel` is still in-flight. When that open completes — after\n`PartitionChannelManager.close()` has already removed the partition's\npending offset reset — `initializeFromSnowflake` fires `onOffsetReset`\na\n[…]\ne fix\nworks (see [successful\nrun](https://github.com/snowflakedb/snowflake-kafka-connector/actions/runs/27969081410/job/82770400739))\nwhile the same test failed on `master` locally in an 8-minute run.",
          "is_bot": false,
          "headline": "SNOW-3647384 don't rewind unassigned partitions (#1498)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-24T12:24:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6b235a92af00ed92595ea0c4702485dba77c663",
          "body": "SNOW-3675649\n\nWe were not verifying precision and scale of NUMBER columns when using\nclient-side validation. This accidentally wasn't ported from the SSv1\nSDK because it was done within the Parquet serializer.",
          "is_bot": false,
          "headline": "SNOW-3675649 fix client-side validation of decimals (#1494)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-22T15:28:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49c0e02bf48a510042b7c7b55f1c322464fcc33e",
          "body": "## Overview\n\nSNOW-3664035\n\nSets the Snowpipe Streaming v2 (SSv2) SDK `application` property to\n`SnowflakeKafkaConnector/<Utils.VERSION>` (e.g.\n`SnowflakeKafkaConnector/4.1.0`) when the\nconnector builds its SSv2 client. The SDK appends this to the outbound\nHTTP User-Agent as\n`(app=SnowflakeKafkaConne\n[…]\ng`\n  1.5.0 — confirms the dependency level does not regress ingestion.\n\n## Parameter protection\n\nNot parameter-protected — this is a User-Agent attribution string with\nno change to ingestion\nbehavior.",
          "is_bot": false,
          "headline": "SNOW-3664035: pass KC version to SSv2 SDK User-Agent (#1492)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-06-22T11:31:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74180e88d9a2ceef9fe9af5d3b4df76d94a6bfd2",
          "body": null,
          "is_bot": false,
          "headline": "e2e: use JAR from `target` rather than `tmp` (#1488)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-22T09:02:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6aeb3e07898175caf8be5deb661d9f76df15c68f",
          "body": null,
          "is_bot": false,
          "headline": "bump snowpipe-streaming to 1.6.0 (#1481)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-22T09:02:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa27ff2a63bfa2c79c625fccd7074ce469c1b09c",
          "body": "…ration test (#1489)\n\nSNOW-3608128",
          "is_bot": false,
          "headline": "increase `task.shutdown.graceful.timeout.ms` to de-flake Snowpipe mig…",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-20T12:02:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eeead0f2c5b7218a8fb34e0c51b0a5d1e54bf45a",
          "body": "This allows running some or all end-to-end tests with a single workflow dispatch.",
          "is_bot": false,
          "headline": "unify end-to-end workflows (#1485)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-04T10:38:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd8c473d6ecaa672166c30300d9d608941d1e1da",
          "body": "This mirrors changes in #1459.",
          "is_bot": false,
          "headline": "bump dependencies in Confluent build (#1482)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-04T10:38:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5ac1df289874616f855ec87278bcfa65de19a7b",
          "body": "We do handle schematization, both client-side and server-side. It's also a different setting to schema evolution.",
          "is_bot": false,
          "headline": "remove misleading warning (#1457)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-06-04T10:38:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d84a3b4b1846d2fa68c641d492721885a8cf15ca",
          "body": "…#1480)\n\n## Summary\n\nThe test was computing `duplicates = total_rows - distinct_offsets` from\n**two separate `cursor.execute()` calls** (`SELECT DISTINCT ...` followed by\n`SELECT count(*) ...`). Snowpipe Streaming v2 commits rows asynchronously, so\neven with the producer stopped these two back-to-ba\n[…]\nvery. Zero phantom-dup outcomes across the loop.\n\n## Test plan\n\n- [x] `ruff check` + `ruff format --check` clean\n- [x] 10 consecutive runs against qa3: zero phantom-dup outcomes\n- [ ] CI E2E run on PR",
          "is_bot": false,
          "headline": "Fix duplicate-counting race in test_invalidation_offset_consistency (…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-05-29T15:47:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84ec6625dc2deaa2370954b7666865fa8c72807d",
          "body": null,
          "is_bot": false,
          "headline": "Add E2E client recreation test with mitmproxy 410 injection (#1479)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-05-29T10:08:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e428b81d5de897b19766a3128d682d4d9184d9c2",
          "body": "…(#1478)\n\n## Why\n\nSSv2 pipe failover surfaces to the connector as an HTTP 410 / `InvalidClientError` `SFException`. Once a `SnowflakeStreamingIngestClient` is in this state, every subsequent SDK call on it fails the same way — the only path forward is to swap in a freshly-constructed client. Without\n[…]\nnd capped at 30 s, plus ±20% jitter so concurrent recreators on the same pipe don't retry in lockstep. Observed SSv2 failover propagation windows are 2–4 minutes; the budget covers that with headroom.",
          "is_bot": false,
          "headline": "SNOW-3574225: Add client recreation for SDK pipe failover (HTTP 410) …",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-05-29T10:07:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33c118d7703a8fc139199b3d40677b34df979225",
          "body": null,
          "is_bot": false,
          "headline": "SNOW-3574225 clean up dead code (#1477)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-28T13:14:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8ebfd98a4f92a1de02936311f5908b78a7673d1",
          "body": "## Problem\n\nWhen a channel is invalidated, `SinkTaskContext::offset` was called from two threads:\n- main thread, at the end of `put`, to rewind the partition that was skipped\n- channel IO thread, after the reopen, with the offset fetched from the Snowflake channel status.\n\nThis creates a race condit\n[…]\n clears pending resets for revoked partitions.\n\nThis ensures `sinkTaskContext.offset()` is only ever called from the task thread, and recovery offsets cannot be overwritten by the skip-tracking logic.",
          "is_bot": false,
          "headline": "SNOW-3574225 thread-safe offset rewinds (#1476)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-28T12:47:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0846f61c0fd14062ddb8cbb928b9e6f3c4633276",
          "body": "We weren't really getting any value from `AppendRowWithFallbackPolicy` - it was basically a glorified try/catch block. So this PR replaces the entire class with an actual try/catch block. Should make it easier to follow.\n\nFurthermore, `TopicPartitionChannelInsertionException` was actually wrapped in\n[…]\n`ConnectException`.\n\nAll in all, this PR is a pure refactor. The only observable change is `RuntimeException` changes to `ConnectException` when a channel fails to be reopened a couple times in a row.",
          "is_bot": false,
          "headline": "remove AppendRowWithFallbackPolicy (#1471)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-27T09:57:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a3266ec2459b0ffb9859af120a9c44c26950cdd",
          "body": "## Summary\n\nAfter `mvn package` builds the kafka-connector release zip, generate a\ndetached GPG signature (`.zip.asc`) and a SHA-256 checksum\n(`.zip.sha256`) next to it. Upload both sidecars to the same S3 location\nas the existing zip.\n\n## Why\n\nAdds an authenticity + integrity verification path for \n[…]\nafka-connector-3.1.0.zip.asc\n2026-05-25 17:19:43        115 snowflakeinc-snowflake-kafka-connector-3.1.0.zip.sha256\n```\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SNOW-3530141: sign and hash kafka-connector release zip (#1465)",
          "author_name": "Tomasz Arczewski",
          "author_login": "sfc-gh-tarczewski",
          "committed_at": "2026-05-26T09:18:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a8c6d75b9a30739deaeded982df34d3ce8d1aa6",
          "body": "## Summary\n\nBumps all external dependencies to their latest stable versions in one\nPR, superseding the 5 stale Dependabot PRs (#1321–#1325). Each\ndependency bump is its own commit for easy bisection/revert.\n\n### Runtime dependencies\n\n| Dependency | Old | New |\n|---|---|---|\n| Jackson (core + databin\n[…]\nodulePath>` to surefire to keep tests on the\nclasspath.\n- Mockito 2.20.1 → 5.23.0 is the largest jump; revert that single commit\nif tests break.\n- Closes #1321, #1322, #1323, #1324, #1325 once merged.",
          "is_bot": false,
          "headline": "bump all dependencies (#1459)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-19T13:05:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fcb9410b9757257c32e2ab3dd196fc13f3cd5229",
          "body": "Change `SinkTaskConfig` fields that hold secrets (`snowflakePrivateKey`, `snowflakePrivateKeyPassphrase`, `oauthClientSecret`, `oauthRefreshToken`) from `String` to Kafka's `Password` type so they are masked in logs and JMX.\n\nUpdate all callers (`InternalUtils`, `StreamingClientProperties`) to unwrap via `Password.value()` with null guards.",
          "is_bot": false,
          "headline": "mask passwords in SinkTaskConfig (#1455)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-14T11:08:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf42587aee50229a55f9bf187cc98247f9176b70",
          "body": "use SinkTaskConfig in makeJdbcDriverProperties\n\nuse SinkTaskConfig in SnowflakeConnectionServiceBuilder\n\nuse SinkTaskConfig when building JDBC/proxy Properties",
          "is_bot": false,
          "headline": "use SinkTaskConfig to configure JDBC (#1451)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-13T17:28:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ead6b65aea333afd4a5577b4b9dd98a28de6b572",
          "body": "## Summary\n\nAdds OAuth configuration support to the Kafka Connector v4, laying the groundwork for OAuth authentication (JWT key-pair remains the default). This PR introduces only the config layer — no runtime behavior changes.\n\nChanges:\n- New `AuthenticatorType` enum (`SNOWFLAKE_JWT`, `OAUTH`) to re\n[…]\ntorTest`: valid OAuth config, client\\_credentials grant (no refresh token), custom token endpoint, invalid authenticator rejected, missing client ID/secret rejected, private key not required for OAuth",
          "is_bot": false,
          "headline": "add config for OAuth (#1446)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-13T16:50:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eedcfc8f8a5a5fe3887dc1870c360ad9ca8b1446",
          "body": "Simplifies using worktrees because `profile.json` doesn't need to be symlinked from each tree.\n\nAlso uses Jackson to avoid parsing JSON nodes to access fields.",
          "is_bot": false,
          "headline": "IT tests: read profile.json from SNOWFLAKE_CREDENTIAL_FILE (#1454)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-13T16:24:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7949ee62de88b6c915b670e6774fdae9ec48531",
          "body": null,
          "is_bot": false,
          "headline": "fix logical merge conflict (#1453)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-13T13:58:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5811c749ebd31254cdaa86dac3ac56f6ea3da625",
          "body": "Turns out, neither `clientName` nor `clientProperties` from `StreamingClientProperties::from` were in use - its only utility was for `parameterOverrides`. We had two different ways of creating `Properties` out of the `SinkTaskConfig` and one was only relevant for tests.\n\nThis PR moves SSv2 SDK property creation from `StreamingClientFactory` into `StreamingClientProperties` - the old code in `StreamingClientProperties` is effectively thrown away.",
          "is_bot": false,
          "headline": "actually use StreamingClientProperties (#1444)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-13T13:17:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4649eaecf932603d85e2acc4be1232bcc005fa2f",
          "body": "## Summary\n\n- **`StreamingClientPool.recreateClient()`** — atomically replaces the `RefCountedClient` entry only if the current resolved client is identity-equal to the given invalid client (CAS semantics). Preserves task registrations via `copyTasksFrom()`. Old client is closed best-effort **outsid\n[…]\nd replacement evicts the entry, retry exhaustion wraps as `ClientRecreationException`\n- [x] `StreamingClientPoolsTest` — 2 tests (1 new): `getClient` retries on client-invalid then wraps on exhaustion",
          "is_bot": false,
          "headline": "Add CAS client recreation to StreamingClientPool (#1429)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-05-13T12:58:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca9de1c92907ee5139a72b5a40e944a7b6e258c4",
          "body": null,
          "is_bot": false,
          "headline": "fix flaky E2E tests (#1450)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-05-13T12:15:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f04fc0f210da1ab16d6a2a01683d0b210031f9a6",
          "body": "## Summary\n- `ClientRecreationException`: unchecked exception wrapping `SFException` for client-invalid error codes (`InvalidClientError`, `SfApiPipeFailedOverError`, `ClosedClientError`). Static `isClientInvalidError()` classifies without instantiation; static `wrap(Throwable)` safely casts and wra\n[…]\n, wrap helper, and negative cases.\n\nNo callers yet — these are consumed in subsequent PRs in this stack.\n\n**JIRA**: SNOW-3360429\n\n## Test plan\n- [x] `ClientRecreationExceptionTest` — 11 tests all pass",
          "is_bot": false,
          "headline": "Add ClientRecreationException and ClientRecreator interface (#1428)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-05-07T12:45:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eb0f62348e1e1586037784e2fd1d74dec996ff9f",
          "body": "Removing @snowflakedb/streaming-connectors from CODEOWNERS after the\nproject's transition.",
          "is_bot": false,
          "headline": "CODEOWNERS: remove @snowflakedb/streaming-connectors (#1442)",
          "author_name": "Norbert Sienkiewicz",
          "author_login": "sfc-gh-nsienkiewicz-1",
          "committed_at": "2026-04-26T17:13:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a90951a0fd8fcdd57f462b65ee243b38eaff260e",
          "body": "## Summary\n- Bump `kafka-clients` 3.9.1 → 3.9.2\n- Bump `assertj-core` 3.26.3 → 3.27.7 (test-only)\n- Bump `log4j-core` 2.17.1 → 2.25.4 (test-only)\n\nAddresses SNOW-3417227.\n\n## Test plan\n- [x] `mvn clean compile` passes\n- [x] Unit tests pass\n- [ ] CI green",
          "is_bot": false,
          "headline": "bump kafka-clients, assertj-core, log4j-core (#1439)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-23T11:48:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f188e44a368229f9aff286786655e9e8e645afa0",
          "body": "## Summary\n- Bump project version from 4.0.0 to 4.1.0in pom.xml, pom_confluent.xml,\nand Utils.java VERSION constant\n\n## Test plan\n- [ ] Verify build compiles with `mvn compile`\n- [ ] Existing unit tests pass (no hardcoded version assertions)",
          "is_bot": false,
          "headline": "Bump version to 4.1.0 (#1440)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-23T08:09:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca18c7f6409d72a83046554ca7c32e2818628433",
          "body": "New order:\n\n- Validation of compatibility settings\n- `topic2table`\n- validation mode (server-, client-side)\n- offset migration settings\n- most other settings (behavior on null values, SDK overrides, ...)\n- compatibility settings\n- caching settings",
          "is_bot": false,
          "headline": "add offset migration settings to ConfigDef (#1438)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-15T15:28:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fc60e2e80323251172111e4237f6ffd3d634b1c",
          "body": "Remove the hardcoded `USE ROLE SYSADMIN` from the `invalidate_channel` helper in the e2e channel invalidation tests.\n\nThe default role from `profile.json` already has sufficient permissions for `SYSTEM$STREAMING_CHANNEL_INVALIDATE`, so the explicit role switch was unnecessary. This also simplifies the try/finally block.\n\nTested against QA3 — all 8 invalidation tests pass.",
          "is_bot": false,
          "headline": "remove hardcoded role from e2e channel invalidation tests (#1437)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-15T15:14:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6afc8d072a60ee61a8d80597340b77725c38e8ad",
          "body": "## Overview\n\nBump connector version from 4.0.0-rc9 to 4.0.0 for GA release.\n\n## Pre-review checklist\n- [ ] This change should be part of a Behavior Change Release. See\n[go/behavior-change](http://go/behavior-change).\n- [ ] This change has passed Merge gate tests\n- [ ] Snowpipe Changes\n- [x] Snowpipe\n[…]\nUnreleased Features and\nFixes](http://go/ppp-prpr)).\n- [ ] If there is an issue, it can be safely mitigated by turning the\nparameter off. This is also verified by a test (See\n[go/ppp](http://go/ppp)).",
          "is_bot": false,
          "headline": "Release v4.0.0 (#1426)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-15T13:26:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "854d3e3f4ec51ed81877d6d95f689c6400fd1174",
          "body": "## Summary\n\nAdds a new connector setting `snowflake.streaming.validate.compatibility.with.classic` (default: `true`) that validates all settings required for backward compatibility with KC v3. This safeguards users migrating from v3 to v4 who may not have explicitly configured the required compatibi\n[…]\ngs\n- [x] E2E `v4-ht` tests and REST template tests opt out via `validate.compatibility.with.classic=false`\n- [x] Java ITs opt out centrally via `TestUtils.transformProfileFileToConnectorConfiguration`",
          "is_bot": false,
          "headline": "SNOW-3343935 add compatibility config validation (#1422)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-15T13:08:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8eb0dd14f605781ac9945162b71bbb5ffb2aa27c",
          "body": "KC v3 doesn't support table names with lowercase characters but KC v4 does, so we need to pass them correctly to the system function for the \"best_effort\" mode to correctly ignore tables with lowercase characters rather than failing.\n\n## Testing\n\nThis functionality will be covered by the change in https://app.graphite.com/github/pr/snowflakedb/snowflake-kafka-connector/1422 to run the case sensitivity tests in \"best_effort\" migration mode.",
          "is_bot": false,
          "headline": "fix table name quoting in offset token migration (#1435)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-15T13:08:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6cfc81129d299b9f80f2a96908f2d3cd9aad3c55",
          "body": "Add legacy end-to-end tests badge to improve visibility of failures - they don't run on PRs.\n\nComment out the misleading code coverage badge as it's not been running for a long time and needs to be fixed.",
          "is_bot": false,
          "headline": "update CI badges in README (#1436)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-15T13:02:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "298aba4f27c87b60a6fa63cfa34c2981bcf25a7a",
          "body": null,
          "is_bot": false,
          "headline": "unskip offset migration tests (#1434)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-15T12:19:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68cb8ea2b62c03f9ce06a3680d27faf49f97c518",
          "body": "…ing (#1433)\n\n## Summary\n\n- **Fix**: `KafkaRecordConverter.convertBytes()` was base64-encoding Avro bytes before passing to RowValidator. RowValidator's `validateAndParseBinary` expected hex strings, causing all Avro bytes → BINARY to fail in v4-compat. Changed to pass `byte[]` directly, matching KC\n[…]\nON E2E type compatibility tests still pass (no regression)\n- [x] Unit tests for ByteBuffer handling in RowValidator and KafkaRecordConverter\n- [x] E2E_TEST_PLAN.md updated with Avro type mapping table",
          "is_bot": false,
          "headline": "Add Avro type compatibility E2E tests and fix ByteBuffer BINARY handl…",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-15T11:44:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a92a2c3d12f5ea84a7d69843c2118aa581ef4d0",
          "body": "…#1419)\n\n## Background\n\nIn KC v3, `StreamingRecordMapper.getTextualValue()` serialized **every value to a String** before the SSv1 SDK saw it — Integer `42` became `\"42\"`, Boolean `true` became `\"true\"`, Map `{a:1}` became `\"{\\\"a\\\":1}\"`. The SSv1 SDK then re-parsed these strings using type-specific \n[…]\ncted — no client-side validation)\n- [x] Negative test cases cover: invalid JSON → OBJECT/ARRAY, bad strings → BOOLEAN, non-0/1 integers → BOOLEAN, cross-type Map/List → VARCHAR(10), invalid timestamps",
          "is_bot": false,
          "headline": "Fix data type normalization in RowValidator for v3/v4-compat parity (…",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-15T11:15:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9edf6e72b3fb1aa1a1a92aa56cac103655d08d76",
          "body": "Remove redundant connectorName/taskId params from PartitionChannelManager production constructor\n\nPass SinkTaskConfig into SnowpipeStreamingPartitionChannel instead of individual config flags\n\nRemove duplicate field extraction in SnowflakeSinkServiceV2; use taskConfig getters directly\n\nRemove dead topic2table field and 3-arg test constructor from SnowflakeSinkTask\n\nPeriodicTelemetryReporter accepts SinkTaskConfig instead of separate connectorName/taskId",
          "is_bot": false,
          "headline": "use SinkTaskConfig directly where appropriate (#1424)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-13T22:27:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee5a74c878c4557eaaee94ed9442d98312c71bfc",
          "body": "…n (#1418)\n\n## Summary\nEliminate 43.6% CPU bottleneck in `SnowflakeTelemetryChannelStatus.registerChannelJMXMetrics()` during channel creation.\n\n**Root cause:** Two issues in the per-channel JMX metric registration path:\n1. `removeMetricsFromRegistry()` did an O(N) scan of all metrics via `MetricFil\n[…]\niling confirms `PartitionChannelManager.buildChannel` CPU dropped from 46.7% to 0.2%\n- [x] async-profiler flame graphs confirm MBean registration/unregistration overhead eliminated\n\nJira: SNOW-3356560",
          "is_bot": false,
          "headline": "Replace O(N) metric scan with targeted removal in channel registratio…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-13T16:30:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ad6819866b32d849dc9ec6493a9fc1a7861d5eba",
          "body": "## Summary\n- Add docker-compose profiling overlays (JFR, GC logging, JMX remote, async-profiler) for both Confluent and Apache platforms\n- Add `--profile` flag to `run_tests.sh` that layers the profiling overlay\n- Add `profile_connect.sh` helper CLI for JFR dumps, heap dumps, thread dumps, flame gra\n[…]\ner (itimer engine)\n- [x] Captured JFR recordings (9 files, 876MB total)\n- [x] Analyzed JFR for CPU hotspots, allocation sites, GC behavior\n- [x] Findings documented in SNOW-3356559\n\nJira: SNOW-3356559",
          "is_bot": false,
          "headline": "Add JVM profiling infrastructure for CPU and memory analysis (#1417)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-13T16:03:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7725baf5f06f578543e795ad8cda25f59df6a6a",
          "body": "## Summary\n\nSNOW-3293138: E2E test for migrating from KC v3 file-based Snowpipe to KC v4 (Snowpipe Streaming v2) under continuous load.\n\nAdds `test_migration_from_snowpipe` which runs a v3 connector in file-based Snowpipe mode with data continuously flowing into the topic, then switches to a v4 SSv2\n[…]\nords 1–100)\n\n    Note over Table: Final order: 101–200, 1–100 ❌\n```\n\nWith the drain wait, Snowpipe finishes loading records 1–100 before v4 starts, so the table ends up with 1–100 followed by 101–200.",
          "is_bot": false,
          "headline": "SNOW-3293138 add Snowpipe migration test (#1425)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-13T14:55:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cfaf939190e9f97548a2d43a4c93f5d49f9cd35f",
          "body": "Issue originally identified in #1397.\n\n## Problem\n\nWhen a non-retryable `SFException` is thrown by `appendRow` mid-batch,\n`reopenChannel()` starts an async recovery on the IO executor. The task\nthread continues processing the next record in the same batch. This\ncreates a race window where `shouldPro\n[…]\nre recovery to simply skip subsequent records across all\npartitions rather than just in the current one - this behavior matches\nthe fact that we skip records in all partitions in *subsequent* batches.",
          "is_bot": false,
          "headline": "SNOW-3361266 fix race condition in channel recovery (#1423)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-13T14:44:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81d45c6f9999be06b46dd78e8c241cef0b647ea9",
          "body": "## Problem\n\nWhen migrating from KC v3 (SSv1) to KC v4 (SSv2), the new v4 connector opens fresh SSv2 channels with no committed offset. It falls back to the Kafka consumer group offset, which can be behind the last data committed to Snowflake via SSv1, causing duplicate rows.\n\n## Solution\n\nAdd an opt\n[…]\nST_EFFORT`, `STRICT`\n- **`Constants.java` / `SinkTaskConfig.java`** — config keys and parsing\n- **`PartitionChannelManager.java`** — constructs SSv1 channel name based on `include.connector.name` flag",
          "is_bot": false,
          "headline": "SNOW-3291635 migrate offset tokens from SSv1 channels (#1359)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-13T14:23:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7beee7edcdba566d9fb5f7982f2aa4461c07cd17",
          "body": "Manual stress test run:\nhttps://github.com/snowflakedb/snowflake-kafka-connector/actions/runs/24245190621\n\nBackend metrics confirm that the above stress test run experienced no\nthrottling and overall 3x smaller peak bulk-channel-status RPS.",
          "is_bot": false,
          "headline": "run preCommit less frequently in stress tests (#1421)",
          "author_name": "Seb Kurella",
          "author_login": "sfc-gh-skurella",
          "committed_at": "2026-04-10T13:51:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cab4e01e5f5263fc191c4a4c106fef640ed2dc4",
          "body": "…notes (#1416)\n\n## Summary\n\n- **BINARY**: corrects v4-compat status from `Diverges` to `Pass`. PR\n#1412 (SNOW-3256183) fixed the divergence by converting hex strings to\n`byte[]` in `RowValidator` before the SDK call. v4-ht remains `Diverges`\n(server-side passes hex directly to SSv2 which misinterpre\n[…]\nLong` epochs without\napplying the default timezone, so v3 stores the correct value. Test is\n`xfail` for both v4 modes.\n\n## Test plan\n\n- [ ] No code changes — doc-only update to `test/E2E_TEST_PLAN.md`",
          "is_bot": false,
          "headline": "Update test plan: correct BINARY and TIMESTAMP_NTZ(epoch) divergence …",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-10T08:48:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "02ffca2a165ea93068e56a22a77e4812d9d8120a",
          "body": "This PR reverts some changes in manifest that have been done in #1253 to\npublish connector as a new listing on Confluent. We changed that\ndecision and now the connector will be published as a new version of\nexisting connector.",
          "is_bot": false,
          "headline": "Change Confluent manifest to publish as the same listing (#1415)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-10T08:43:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "917868e6ca9d4ef31a1efb43fcb97d74eb520ae7",
          "body": "## Summary\n\nComprehensive e2e test suite for channel invalidation recovery, building on the fix in #1401. Uses `SYSTEM$STREAMING_CHANNEL_INVALIDATE` (SNOW-3291474) to programmatically inject `ERR_CHANNEL_MUST_BE_REOPENED` and verify the connector recovers with no data loss.\n\n**7 test scenarios in `t\n[…]\ntion_with_connector_restart` — PASSED\n- [x] `test_invalidation_offset_consistency` — PASSED\n- [x] `test_invalidation_during_flush` — PASSED\n- [x] Full suite: 7 passed in 633s (Apache Kafka 3.7.2, QA3)",
          "is_bot": false,
          "headline": "Add channel invalidation e2e test suite (SNOW-3097571) (#1405)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-09T10:52:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39ee6c8c9c546bd129cac19ec8652dc88b0efcc1",
          "body": "…to byte[] (#1412)\n\n## Summary\n\n- **Root cause**: `RowValidator` passed hex strings for BINARY columns\ndirectly to the Ingest SDK. The SDK interprets `String` values as either\nhex or base64 depending on the server-side parameter\n`ENABLE_SSV2_DEFAULT_BINARY_FORMAT_BASE64`, causing garbled bytes on\nde\n[…]\nE — 91 passed, 8 xfailed;\n`test_binary[v4-compat]` now hard-passes\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SNOW-3256183: Fix BINARY column validation by converting hex strings …",
          "author_name": "Alec Huang",
          "author_login": "sfc-gh-alhuang",
          "committed_at": "2026-04-08T22:17:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a4db3e56074458ea1fa357b4c52a9296273a8dc",
          "body": "## Summary\n- Removes the lenient subset check on\n`test_case_sensitivity_schema_evolution` that was introduced as a\nworkaround for SNOW-3291723 (server-side/client-side schema evolution\nrace creating phantom uppercase columns)\n- v4 now uses the same strict column equality assertion as v3\n- Merges the\n[…]\nE=TRUE` set at\naccount level on sfctest0 to confirm no phantom columns appear\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Tighten schema evolution case sensitivity assertion for v4 (#1404)",
          "author_name": "Alec Huang",
          "author_login": "sfc-gh-alhuang",
          "committed_at": "2026-04-08T19:57:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e88a7efd2115b59f5699e23962d6e08c6bf86f56",
          "body": "## Summary\n- Add \\`hasErrorLoggingEnabled()\\` to \\`SnowflakeConnectionService\\`; checks via \\`SHOW TABLES\\` and results are cached in \\`CachingSnowflakeConnectionService\\`\n- Auto-created tables now include \\`ERROR_LOGGING = TRUE\\` in the \\`CREATE TABLE\\` DDL\n- Pre-flight check in \\`SnowflakeSinkServ\n[…]\nrror_table_schema_mismatch[v4-ht]\\` — schema mismatch rows captured in error table\n  - \\`test_error_table_vs_dlq_routing[v4-ht]\\` — invalid records go to error table, not DLQ, when both are configured",
          "is_bot": false,
          "headline": "Add error table support for KC v4 high-throughput mode (#1384)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-08T12:42:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db8528ae5281e69c76586a7e4c8ca4fc682dad1b",
          "body": "## Overview\n\nSNOW-3256797\n\nFix RECORD_CONTENT column handling when `schematization=off` to match KCv3 behavior.\n\n### Problem\n\nKCv3 used `writeValueAsString()` because the SSv1 SDK re-parsed strings via `readTree()` in its VARIANT validation. SSv2 SDK passes NDJSON directly to the server with no re-p\n[…]\nD_CONTENT` added by schema evolution) |\n| `wrapAsRecordContent` serialization | `writeValueAsString` (needed by SSv1) | `writeValueAsString` (not needed by SSv2) | No serialization (SSv2 handles it) |",
          "is_bot": false,
          "headline": "SNOW-3256797 Fix RECORD_CONTENT serialization (#1356)",
          "author_name": "Alec Huang",
          "author_login": "sfc-gh-alhuang",
          "committed_at": "2026-04-08T09:56:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7df82e9ca89c2fdcfa68105eec51710d9dad097f",
          "body": "## Summary\n\nAfter channel invalidation recovery, `resetAfterRecovery()` correctly rewinds the Kafka consumer and sets `processedOffset` to the last committed offset. However, `transformAndSend()` then calls `recordProcessed(kafkaOffset)` for the record that triggered the fallback, advancing `process\n[…]\n 5/5 pass (updated to verify return value)\n- [x] `SnowpipeStreamingPartitionChannelTest` — 20/20 pass\n- [x] E2e `test_invalidation_offset_consistency` — verifies replayed offsets now land in Snowflake",
          "is_bot": false,
          "headline": "Fix offset rewind after channel recovery (SNOW-3344243) (#1414)",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-08T08:43:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cd3d6edeabe67148245b3ab8dcc46bbdfea9c885",
          "body": "…from 60s to 120s (#1411)\n\n## Problem\n\n`test_dt_geography[v4-compat]` uses `ingest_one_type_abort` with `errors.tolerance=none`. For the GEOGRAPHY type, the connector must open a Snowflake channel and receive a server-side rejection before the Kafka Connect task transitions to FAILED state. On slow \n[…]\nfor_topic`).\n\n## Test plan\n- [ ] `test_dt_geography[v4-compat]` passes consistently in CI\n- [ ] No slowdown for fast-failing type tests (they still exit as soon as `get_failed_tasks` returns a result)",
          "is_bot": false,
          "headline": "Fix geography ingest timeout: increase ingest_one_type_abort default …",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-03T08:36:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "119196a51eb8ae6fa96c09f755d3c8282e697e5f",
          "body": "## Problem\n\n`test_string_json` asserted the content of the first ingested record by calling:\n\n```python\nrecord_metadata = json.loads(table.select_scalar(\"record_metadata\"))\nassert record_metadata == {\"offset\": 0, ...}\n```\n\n`select_scalar` issues `SELECT record_metadata FROM \"table\"` with **no ORDER \n[…]\nfetch the row at offset 0 by its Kafka offset value rather than relying on insertion order.\n\n## Test plan\n- [ ] `test_string_json[v3]` and `test_string_json[v4]` pass consistently across multiple runs",
          "is_bot": false,
          "headline": "Fix non-deterministic SELECT in test_string_json (#1410)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-03T08:08:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "56b92e34756d7277b2a26221a70949277f1052a8",
          "body": "…rametrize dims (#1409)\n\n## Problem\n\n`test_high_performance_case_sensitivity_table_name` is parametrized on two dimensions:\n- `connector_version = [\"v4\"]` (indirect)\n- `sanitize_autogenerated_table_names = [True, False]`\n\nThe `name_salt` fixture only differentiates on `connector_version` (adding `_V\n[…]\nn\n- [ ] `test_high_performance_case_sensitivity_table_name[sanitized-v4]` and `[unsanitized-v4]` both pass in the same CI run\n- [ ] No regression on tests with only `connector_version` parametrization",
          "is_bot": false,
          "headline": "Fix topic collision: extend name_salt with discriminator for extra pa…",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-03T07:00:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3458e27225e15f9785fad601785dda25c9b80cf1",
          "body": "## Problem\n\n`test_channel_invalidation_recovery` called `USE ROLE ACCOUNTADMIN` on the session-scoped `driver.snowflake_conn`, which is shared across the entire test session. The test then calls `SYSTEM$STREAMING_CHANNEL_INVALIDATE`, which:\n\n1. **Does not exist on sfctest0** (the CI Snowflake accoun\n[…]\n a confusing error.\n\n## Test plan\n- [ ] On sfctest0 CI: test is skipped cleanly, no role remains poisoned, all subsequent tests pass\n- [ ] On QA3 (where function exists): test runs normally end-to-end",
          "is_bot": false,
          "headline": "Fix session poisoning in test_channel_invalidation_recovery (#1408)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-02T20:40:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83dca8b499b6fa4ed4cce1e49a6e07170f7c766c",
          "body": "## Problem\n\n`consume_messages()` in `test/lib/driver.py` called `consumer.subscribe([topic_name])` before consuming from a DLQ topic. Kafka's `subscribe()` API triggers an async consumer-group rebalance. When the DLQ topic is auto-created by Kafka Connect on the first error record, it doesn't exist \n[…]\nt from 60s → 120s to match the new `_wait_for_topic` budget.\n\n## Test plan\n- [ ] Verify `test_schema_evolution_config_variants` passes consistently in CI\n- [ ] Confirm no regression on other DLQ tests",
          "is_bot": false,
          "headline": "Fix DLQ consumer race: use assign() instead of subscribe() (#1407)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-02T19:52:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c29a3f31e32527a255587da62f68634ae0137f3",
          "body": "## Summary\n- Move the 4 old-platform e2e matrix entries (apache 2.8.2, apache 3.9.2, confluent 6.2.15, confluent 7.9.3) out of \\`end-to-end.yaml\\` into a new \\`end-to-end-legacy.yml\\` workflow that only triggers on master push and \\`workflow_dispatch\\`\n- \\`end-to-end.yaml\\` now runs only the new pla\n[…]\n\n\n## Effect\n- PR CI: **6 jobs** (apache 4.1.1 × 3 groups + confluent 8.2.0 × 3 groups)\n- Master CI: **10 jobs** (all platforms — same as before)\n\nFollows the same pattern as \\`end-to-end-stress.yml\\`.",
          "is_bot": false,
          "headline": "Skip old-platform e2e jobs on pull_request to reduce CI load (#1406)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-02T15:51:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec8c5b4d956bc32ca9ffc9a323934ffbda87f5e4",
          "body": "…open (#1401)\n\n## Summary\n\nAfter a channel invalidation, `insertRowWithFallback`'s Failsafe fallback called `reopenChannel` successfully but then re-threw the exception. The KC framework treated the re-thrown exception as unrecoverable and permanently killed the task.\n\n**Fix:** Remove the re-throw f\n[…]\n→ rows resume (229), task RUNNING\n- [x] E2e test on unfixed branch confirms bug: same sequence → re-throw → task dies, rows stuck at 100\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "Fix channel invalidation recovery: don't re-throw after successful re…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-02T14:42:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84f27219169ec16e4ed0a495d5b4f16762f8d5ec",
          "body": "… (#1402)\n\n## Summary\n- Fix `RowValidator` to accept records that omit server-filled columns\n(AUTOINCREMENT, DEFAULT NOT NULL)\n- Extend `DescribeTableRow` and `ColumnSchema` to carry\ndefault/autoincrement metadata from `DESCRIBE TABLE`\n- Add `isServerFilled()` check to skip these columns in\n`detectM\n[…]\nestamp, default numeric, mixed\n- [x] E2E tests to be run against live Snowflake + Kafka environment\n\nJIRA: SNOW-3174124\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SNOW-3174124: Fix client-side validation for default/identity columns…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-04-02T14:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "54250d82d1d70d45c1519e10354142be156f748c",
          "body": null,
          "is_bot": false,
          "headline": "update test plan (#1403)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-01T16:46:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f94ac35746163d1928c003eaafbfbbf91c3c779",
          "body": null,
          "is_bot": false,
          "headline": "Update test plan clean up some e2e tests (#1399)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-01T14:04:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb31ff4c8cee47a56410b8ebc30971294ed641ef",
          "body": "## Overview\n\nFixes #1334. Supersedes community PR #1335 (credit: @klvmungai).\n\nTimestamps between roughly 1969-01-01 and 1971-01-01 were stored in Snowflake with completely wrong years — e.g. `1969-04-08T00:00:00Z` → `1236-03-29`.\n\n**Root cause:** `convertInt64` called `Timestamp.fromLogical(schema,\n[…]\n969-04-08T00:00:00Z` (the exact date from the bug report) asserting the result is an `Instant`; update `testConvertHeaders_WithTimestampLogicalType` expectation to match the new ISO-8601 string format",
          "is_bot": false,
          "headline": "Fix Timestamp data corruption for dates near Unix epoch (#1395)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-01T13:24:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "729af21da3dbed5a79e42f1a670820ba623e2102",
          "body": "## Summary\n- Fix `appendColumnsToTable` / `alterNonNullableColumns` to use `ALTER ICEBERG TABLE` for iceberg tables (detected via `SHOW ICEBERG TABLES LIKE`)\n- Fix `shouldEvolveSchema` to check both `SHOW TABLES` and `SHOW ICEBERG TABLES`\n- Add `isIcebergTable()` to `SnowflakeConnectionService` inte\n[…]\nuent 7.9.3, local)\n- [x] Avro SR tests pass with backward-compatible schema evolution (consistent record name + nullable union defaults)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "Add iceberg E2E tests and fix SE DDL for iceberg tables (#1389)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-04-01T11:52:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d9edc8cb6eb202d62de84857cea142d4a37a6b92",
          "body": "## Summary\n- Convert 4 Schema Registry tests from dual-with-v3-skip to v4-only (`@pytest.mark.parametrize(\"connector_version\", [\"v4\"], indirect=True)`). Running in dual mode is not supported due to class name conflict.\n- Assertions capture v3 reference behavior (tests ported from v3); v4 parity conf\n[…]\nst plan\n- [x] Ran all 4 SR tests on Confluent 7.8.0 before conversion (4 passed, 4 v3 skipped)\n- [x] Ran all 4 SR tests after conversion (4 passed, 0 skipped, 0 failed)\n- [x] Ruff format and lint pass",
          "is_bot": false,
          "headline": "Convert SR tests to v4-only after confirming v3 parity (#1398)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-03-31T14:08:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8f8b4fe3915fb26004f752c2878b5bce629030b",
          "body": "## Summary\n\n- Accept `Integer` and `Long` epoch values for TIMESTAMP columns in `DataValidationUtil.validateAndParseTimestamp()`\n- Converts numeric inputs to `String` before delegating to the existing `parseInstantGuessScale` logic\n- Fixes a v3 → v4-compat divergence where Kafka `JsonConverter` send\n[…]\nering Integer, Long, zero, and negative epoch values\n- [x] All existing validation tests pass (51/51)\n- [ ] E2E compatibility tests (CI)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "Accept Integer/Long epoch values in timestamp validation (#1393)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-03-31T11:40:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "604f8722e4ce5dd77f65f8b93b806c9abd559f96",
          "body": "…er images (#1396)\n\n## What and why\n\nE2E CI was the dominant feedback loop bottleneck (~50m wall clock per push). This PR attacks it from two angles.\n\n### 1. Test matrix split — 3 parallel groups per new platform\n\nTests on new platforms (apache 4.1.1, confluent 8.2.0) now run as 3 concurrent jobs in\n[…]\n9.3 | 46m 39s | 23m 27s [core] |\n| confluent 8.2.0 | 47m 11s | 8m 47s [compatibility], 25m 08s [schema_and_correctness], 23m 38s [core] |\n\n**Wall clock (slowest job): 49m 46s → 25m 08s  (−24m, −50%)**",
          "is_bot": false,
          "headline": "Split e2e test suite into parallel groups and cache Apache Kafka Dock…",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-03-31T10:58:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60c41ad51c3f30b668afe5bd0b3c0941f0813e7d",
          "body": "…1386)\n\n## Summary\n\n- Replace the 5s fixed-delay busy-wait retry loop (`withMaxAttempts(-1)`) in `AppendRowWithRetryAndFallbackPolicy` with batch-level offset rewind\n- On retryable SDK errors (429/503), throw `BackpressureException` immediately instead of blocking the `put()` thread\n- Catch `Backpre\n[…]\nwind, coexists with initializing partitions, skips rewind when no offset\n- [x] Full test suite: **441 tests, 0 failures, BUILD SUCCESS**\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "SNOW-3248350 Replace busy-wait 429 retry with offset-based backoff (#…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-03-31T09:54:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "27dbc619cabe1d468692265bc8fd3cd7736844e8",
          "body": "## Summary\n\nAdds E2E data-type compatibility tests for the Snowflake Kafka Connector, comparing behavior across three ingestion modes:\n\n- **v3**: `SnowflakeSinkConnector` with Snowpipe Streaming v1 (SSv1) — the current production connector\n- **v4-compat**: `SnowflakeStreamingSinkConnector` with `cli\n[…]\n [x] Verify divergence logging: `grep DIVERGENCE` captures all known behavioral differences\n- [ ] CI passes on all platform combinations\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "Add data-type ingestion compatibility tests (#1368)",
          "author_name": "Peter Popov",
          "author_login": "sfc-gh-ppopov",
          "committed_at": "2026-03-30T17:32:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2973fe5fa92e7b55d4543506984d11dfa424951d",
          "body": "…SAGE telemetry (#1376)\n\n## Summary\n- Adds `schema_evolution_failure_count` to KAFKA_CHANNEL_USAGE. When schema evolution is attempted but re-validation still fails, the error is silently tolerated — this counter tracks how often that happens.\n- Enriches KAFKA_FATAL_ERROR events with channel context\n[…]\n channel caused a connector crash. The two call sites in `SnowpipeStreamingPartitionChannel` (close-channel errors and channel error threshold violations) now pass their context.\n\n## Jira\nSNOW-3075419",
          "is_bot": false,
          "headline": "SNOW-3075419 Report schema evolution failure count in KAFKA_CHANNEL_U…",
          "author_name": "Berzan Mikaili",
          "author_login": "sfc-gh-bmikaili",
          "committed_at": "2026-03-30T16:32:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 89,
      "commits_last_year": 260,
      "latest_release_at": "2026-07-22T17:18:36Z",
      "latest_release_tag": "v4.1.0",
      "releases_from_tags": false,
      "days_since_last_push": 3,
      "active_weeks_last_year": 44,
      "days_since_latest_release": 3,
      "mean_days_between_releases": 20.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "com.snowflake:snowflake-kafka-connector",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/com.snowflake/snowflake-kafka-connector",
          "is_deprecated": false,
          "latest_version": "4.1.0",
          "repository_url": "https://github.com/snowflakedb/snowflake-kafka-connector",
          "versions_count": 96,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-22T17:54:59Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 3
        }
      ]
    },
    "popularity": {
      "forks": 113,
      "stars": 175,
      "watchers": 11,
      "fork_history": {
        "days": [
          {
            "date": "2019-05-29",
            "count": 1
          },
          {
            "date": "2019-06-23",
            "count": 1
          },
          {
            "date": "2019-07-01",
            "count": 1
          },
          {
            "date": "2019-09-06",
            "count": 1
          },
          {
            "date": "2019-09-30",
            "count": 1
          },
          {
            "date": "2019-10-09",
            "count": 1
          },
          {
            "date": "2019-10-18",
            "count": 1
          },
          {
            "date": "2019-10-29",
            "count": 1
          },
          {
            "date": "2019-11-20",
            "count": 1
          },
          {
            "date": "2019-11-22",
            "count": 1
          },
          {
            "date": "2020-02-24",
            "count": 1
          },
          {
            "date": "2020-03-03",
            "count": 1
          },
          {
            "date": "2020-04-03",
            "count": 1
          },
          {
            "date": "2020-04-29",
            "count": 1
          },
          {
            "date": "2020-05-21",
            "count": 1
          },
          {
            "date": "2020-06-05",
            "count": 1
          },
          {
            "date": "2020-06-19",
            "count": 1
          },
          {
            "date": "2020-06-24",
            "count": 1
          },
          {
            "date": "2020-07-14",
            "count": 1
          },
          {
            "date": "2020-07-31",
            "count": 1
          },
          {
            "date": "2020-08-31",
            "count": 1
          },
          {
            "date": "2020-09-04",
            "count": 2
          },
          {
            "date": "2020-10-13",
            "count": 2
          },
          {
            "date": "2020-10-18",
            "count": 1
          },
          {
            "date": "2020-11-17",
            "count": 1
          },
          {
            "date": "2020-12-03",
            "count": 2
          },
          {
            "date": "2021-02-03",
            "count": 2
          },
          {
            "date": "2021-02-04",
            "count": 1
          },
          {
            "date": "2021-03-02",
            "count": 1
          },
          {
            "date": "2021-04-08",
            "count": 1
          },
          {
            "date": "2021-04-16",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 1
          },
          {
            "date": "2021-06-15",
            "count": 1
          },
          {
            "date": "2021-07-30",
            "count": 1
          },
          {
            "date": "2021-11-14",
            "count": 2
          },
          {
            "date": "2021-11-18",
            "count": 1
          },
          {
            "date": "2021-12-14",
            "count": 1
          },
          {
            "date": "2022-01-18",
            "count": 2
          },
          {
            "date": "2022-04-21",
            "count": 1
          },
          {
            "date": "2022-10-13",
            "count": 1
          },
          {
            "date": "2022-10-31",
            "count": 1
          },
          {
            "date": "2022-11-03",
            "count": 1
          },
          {
            "date": "2022-11-28",
            "count": 1
          },
          {
            "date": "2022-12-02",
            "count": 1
          },
          {
            "date": "2022-12-13",
            "count": 2
          },
          {
            "date": "2022-12-17",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 1
          },
          {
            "date": "2023-02-13",
            "count": 1
          },
          {
            "date": "2023-02-22",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 1
          },
          {
            "date": "2023-03-17",
            "count": 1
          },
          {
            "date": "2023-03-18",
            "count": 1
          },
          {
            "date": "2023-04-07",
            "count": 1
          },
          {
            "date": "2023-05-02",
            "count": 1
          },
          {
            "date": "2023-07-06",
            "count": 1
          },
          {
            "date": "2023-08-29",
            "count": 1
          },
          {
            "date": "2023-09-12",
            "count": 1
          },
          {
            "date": "2023-09-20",
            "count": 1
          },
          {
            "date": "2023-09-26",
            "count": 1
          },
          {
            "date": "2023-10-27",
            "count": 1
          },
          {
            "date": "2023-11-16",
            "count": 1
          },
          {
            "date": "2023-12-28",
            "count": 1
          },
          {
            "date": "2024-02-01",
            "count": 1
          },
          {
            "date": "2024-02-08",
            "count": 1
          },
          {
            "date": "2024-02-26",
            "count": 1
          },
          {
            "date": "2024-03-01",
            "count": 1
          },
          {
            "date": "2024-05-02",
            "count": 1
          },
          {
            "date": "2024-05-17",
            "count": 1
          },
          {
            "date": "2024-05-22",
            "count": 1
          },
          {
            "date": "2024-05-24",
            "count": 1
          },
          {
            "date": "2024-06-03",
            "count": 1
          },
          {
            "date": "2024-07-28",
            "count": 1
          },
          {
            "date": "2024-08-21",
            "count": 1
          },
          {
            "date": "2024-09-01",
            "count": 1
          },
          {
            "date": "2024-09-10",
            "count": 1
          },
          {
            "date": "2024-09-12",
            "count": 1
          },
          {
            "date": "2024-10-28",
            "count": 1
          },
          {
            "date": "2025-01-07",
            "count": 1
          },
          {
            "date": "2025-01-29",
            "count": 1
          },
          {
            "date": "2025-02-12",
            "count": 1
          },
          {
            "date": "2025-02-18",
            "count": 1
          },
          {
            "date": "2025-03-07",
            "count": 1
          },
          {
            "date": "2025-03-26",
            "count": 1
          },
          {
            "date": "2025-06-24",
            "count": 2
          },
          {
            "date": "2025-06-28",
            "count": 1
          },
          {
            "date": "2025-07-25",
            "count": 1
          },
          {
            "date": "2025-07-28",
            "count": 1
          },
          {
            "date": "2025-09-09",
            "count": 1
          },
          {
            "date": "2025-11-05",
            "count": 1
          },
          {
            "date": "2025-11-11",
            "count": 1
          },
          {
            "date": "2026-02-26",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 2
          }
        ],
        "complete": true,
        "collected": 108,
        "total_forks": 113
      },
      "star_history": null,
      "open_issues_and_prs": 41
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [
        "test/test_data/sensor.proto"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "pom.xml",
        "test/test_data/protobuf/pom.xml"
      ],
      "largest_source_bytes": 79795,
      "source_files_sampled": 309,
      "oversized_source_files": 3,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pom.xml",
        "test/pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "at.yawk.lz4:lz4-java",
            "direct": false,
            "version": "1.10.1",
            "severity": "moderate",
            "ecosystem": "maven",
            "cvss_score": 6.5,
            "advisory_ids": [
              "GHSA-xx22-p4ch-683r"
            ],
            "fixed_version": "1.11.1",
            "advisory_count": 1,
            "oldest_advisory_days": 1
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "moderate": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 33,
        "malicious_count": 0,
        "assessed_package": "maven:com.snowflake:snowflake-kafka-connector@4.1.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "maven",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "org.apache.kafka:kafka-clients",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${kafka.version}"
        },
        {
          "name": "net.snowflake:snowflake-jdbc",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${snowflake-jdbc.version}"
        },
        {
          "name": "com.google.protobuf:protobuf-java",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${protobuf.version}"
        },
        {
          "name": "com.google.protobuf:protobuf-java-util",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${protobuf.version}"
        },
        {
          "name": "org.apache.avro:avro",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "1.12.1"
        },
        {
          "name": "org.apache.commons:commons-compress",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${commons-compress.version}"
        },
        {
          "name": "org.apache.commons:commons-lang3",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${commons-lang3.version}"
        },
        {
          "name": "com.fasterxml.jackson.core:jackson-core",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${jackson.version}"
        },
        {
          "name": "com.fasterxml.jackson.core:jackson-databind",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${jackson.version}"
        },
        {
          "name": "io.confluent:kafka-schema-registry-client",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${confluent.version}"
        },
        {
          "name": "io.confluent:kafka-avro-serializer",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${confluent.version}"
        },
        {
          "name": "io.confluent:kafka-connect-avro-converter",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${confluent.version}"
        },
        {
          "name": "io.confluent:kafka-schema-registry-client-encryption",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${confluent.version}"
        },
        {
          "name": "io.dropwizard.metrics:metrics-core",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "4.2.39"
        },
        {
          "name": "io.dropwizard.metrics:metrics-jmx",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "4.2.39"
        },
        {
          "name": "com.google.guava:guava",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${guava.version}"
        },
        {
          "name": "com.google.auto.value:auto-value-annotations",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${auto-value.version}"
        },
        {
          "name": "com.github.ben-manes.caffeine:caffeine",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "3.2.4"
        },
        {
          "name": "dev.failsafe:failsafe",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "3.3.2"
        },
        {
          "name": "org.slf4j:slf4j-api",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${slf4j-api.version}"
        },
        {
          "name": "com.snowflake:snowpipe-streaming",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${snowpipe-streaming.version}"
        },
        {
          "name": "org.junit:junit-bom",
          "manifest": "pom.xml",
          "ecosystem": "maven",
          "version_constraint": "5.14.4"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "com.fasterxml.jackson.core:jackson-core",
            "direct": true,
            "version": "2.22.1",
            "ecosystem": "maven"
          },
          {
            "name": "com.fasterxml.jackson.core:jackson-databind",
            "direct": true,
            "version": "2.22.1",
            "ecosystem": "maven"
          },
          {
            "name": "com.github.ben-manes.caffeine:caffeine",
            "direct": true,
            "version": "3.2.4",
            "ecosystem": "maven"
          },
          {
            "name": "com.google.auto.value:auto-value-annotations",
            "direct": true,
            "version": "1.11.1",
            "ecosystem": "maven"
          },
          {
            "name": "com.google.guava:guava",
            "direct": true,
            "version": "33.6.0-jre",
            "ecosystem": "maven"
          },
          {
            "name": "com.google.protobuf:protobuf-java",
            "direct": true,
            "version": "3.25.5",
            "ecosystem": "maven"
          },
          {
            "name": "com.google.protobuf:protobuf-java-util",
            "direct": true,
            "version": "3.25.5",
            "ecosystem": "maven"
          },
          {
            "name": "com.snowflake:snowpipe-streaming",
            "direct": true,
            "version": "1.6.2",
            "ecosystem": "maven"
          },
          {
            "name": "dev.failsafe:failsafe",
            "direct": true,
            "version": "3.3.2",
            "ecosystem": "maven"
          },
          {
            "name": "io.confluent:kafka-avro-serializer",
            "direct": true,
            "version": "7.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "io.confluent:kafka-connect-avro-converter",
            "direct": true,
            "version": "7.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "io.confluent:kafka-schema-registry-client",
            "direct": true,
            "version": "7.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "io.confluent:kafka-schema-registry-client-encryption",
            "direct": true,
            "version": "7.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "io.dropwizard.metrics:metrics-core",
            "direct": true,
            "version": "4.2.39",
            "ecosystem": "maven"
          },
          {
            "name": "io.dropwizard.metrics:metrics-jmx",
            "direct": true,
            "version": "4.2.39",
            "ecosystem": "maven"
          },
          {
            "name": "net.snowflake:snowflake-jdbc",
            "direct": true,
            "version": "4.3.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.avro:avro",
            "direct": true,
            "version": "1.12.1",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.commons:commons-compress",
            "direct": true,
            "version": "1.28.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.commons:commons-lang3",
            "direct": true,
            "version": "3.20.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.kafka:kafka-clients",
            "direct": true,
            "version": "3.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.junit:junit-bom",
            "direct": true,
            "version": "5.14.4",
            "ecosystem": "maven"
          },
          {
            "name": "org.slf4j:slf4j-api",
            "direct": true,
            "version": "2.0.18",
            "ecosystem": "maven"
          },
          {
            "name": "com.github.stefanbirkner:system-rules",
            "direct": false,
            "version": "1.19.0",
            "ecosystem": "maven"
          },
          {
            "name": "com.google.auto.value:auto-value",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "maven"
          },
          {
            "name": "commons-dbutils:commons-dbutils",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "maven"
          },
          {
            "name": "junit:junit",
            "direct": false,
            "version": "4.13.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.commons:commons-dbcp2",
            "direct": false,
            "version": "2.14.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.kafka:connect-api",
            "direct": false,
            "version": "3.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.kafka:connect-json",
            "direct": false,
            "version": "0.9.0.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.kafka:connect-runtime",
            "direct": false,
            "version": "3.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.kafka:kafka-server-common",
            "direct": false,
            "version": "3.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.kafka:kafka_2.13",
            "direct": false,
            "version": "3.9.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.logging.log4j:log4j-core",
            "direct": false,
            "version": "2.26.1",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-compiler-plugin",
            "direct": false,
            "version": "3.15.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-compiler-plugin",
            "direct": false,
            "version": "3.3",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-failsafe-plugin",
            "direct": false,
            "version": "3.5.5",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-gpg-plugin",
            "direct": false,
            "version": "3.2.8",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-jar-plugin",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-javadoc-plugin",
            "direct": false,
            "version": "3.12.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-project-info-reports-plugin",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-site-plugin",
            "direct": false,
            "version": "3.12.1",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-source-plugin",
            "direct": false,
            "version": "3.4.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-surefire-plugin",
            "direct": false,
            "version": "3.5.5",
            "ecosystem": "maven"
          },
          {
            "name": "org.assertj:assertj-core",
            "direct": false,
            "version": "3.27.7",
            "ecosystem": "maven"
          },
          {
            "name": "org.awaitility:awaitility",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.bouncycastle:bcpkix-fips",
            "direct": false,
            "version": "2.1.11",
            "ecosystem": "maven"
          },
          {
            "name": "org.codehaus.mojo:exec-maven-plugin",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.junit.jupiter:junit-jupiter-engine",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.junit.jupiter:junit-jupiter-params",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.junit.vintage:junit-vintage-engine",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.mockito:mockito-core",
            "direct": false,
            "version": "5.23.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.slf4j:slf4j-log4j12",
            "direct": false,
            "version": "2.0.18",
            "ecosystem": "maven"
          },
          {
            "name": "org.sonatype.central:central-publishing-maven-plugin",
            "direct": false,
            "version": "0.10.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.testcontainers:testcontainers",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "maven"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 54,
        "direct_count": 22,
        "indirect_count": 32
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 16,
        "merged_prs": 937,
        "open_issues": 25,
        "closed_ratio": 0.905,
        "closed_issues": 237,
        "closed_unmerged_prs": 310
      },
      "bus_factor": 4,
      "bot_contributors": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "sfc-gh-japatel",
          "commits": 134,
          "avatar_url": "https://avatars.githubusercontent.com/u/57274584?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-mbobowski",
          "commits": 111,
          "avatar_url": "https://avatars.githubusercontent.com/u/145468486?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-skurella",
          "commits": 109,
          "avatar_url": "https://avatars.githubusercontent.com/u/182647916?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-zli",
          "commits": 99,
          "avatar_url": "https://avatars.githubusercontent.com/u/63482288?v=4"
        },
        {
          "type": "User",
          "login": "binglihub",
          "commits": 76,
          "avatar_url": "https://avatars.githubusercontent.com/u/29698166?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-rcheng",
          "commits": 58,
          "avatar_url": "https://avatars.githubusercontent.com/u/111399397?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-lkucharski",
          "commits": 47,
          "avatar_url": "https://avatars.githubusercontent.com/u/132927420?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-bmikaili",
          "commits": 36,
          "avatar_url": "https://avatars.githubusercontent.com/u/172383519?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-ppopov",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/83581809?v=4"
        },
        {
          "type": "User",
          "login": "sfc-gh-tzhang",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/65984323?v=4"
        }
      ],
      "contributors_sampled": 50,
      "top_contributor_share": 0.15
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "IntegrationTest.yml",
        "build-apache-kafka-images.yml",
        "end-to-end.yaml",
        "formatting.yml",
        "semgrep.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 8,
            "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": 0,
            "reason": "0 out of 30 merged PRs checked by a CI test -- score normalized to 0",
            "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": 10,
            "reason": "all changesets reviewed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "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 0 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": "35e977b8121dde31d811e1ba431903b0ae6402ad",
        "ran_at": "2026-07-26T09:10:17Z",
        "aggregate_score": 6.5,
        "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-26T01:23:22Z",
      "oldest_open_prs": [
        {
          "number": 1039,
          "created_at": "2025-01-07T19:34:21Z",
          "last_comment_at": "2025-01-07T19:35:29Z",
          "last_comment_author": "VitoMakarevich"
        },
        {
          "number": 1190,
          "created_at": "2025-10-17T07:56:11Z",
          "last_comment_at": "2026-02-26T13:34:16Z",
          "last_comment_author": "sfc-gh-bmikaili"
        },
        {
          "number": 1212,
          "created_at": "2025-11-11T20:42:29Z",
          "last_comment_at": "2026-01-25T21:50:28Z",
          "last_comment_author": "momirza"
        },
        {
          "number": 1258,
          "created_at": "2026-01-22T11:01:10Z",
          "last_comment_at": "2026-01-22T11:01:38Z",
          "last_comment_author": "sfc-gh-lkucharski"
        },
        {
          "number": 1301,
          "created_at": "2026-02-26T16:56:20Z",
          "last_comment_at": "2026-02-26T18:06:05Z",
          "last_comment_author": "sfc-gh-bmikaili"
        },
        {
          "number": 1400,
          "created_at": "2026-04-01T11:52:33Z",
          "last_comment_at": "2026-04-01T12:24:39Z",
          "last_comment_author": "sfc-gh-bmikaili"
        },
        {
          "number": 1467,
          "created_at": "2026-05-25T18:54:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1468,
          "created_at": "2026-05-25T18:54:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1486,
          "created_at": "2026-06-11T06:56:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1491,
          "created_at": "2026-06-18T12:48:17Z",
          "last_comment_at": "2026-06-18T12:48:33Z",
          "last_comment_author": "sfc-gh-bmikaili"
        },
        {
          "number": 1520,
          "created_at": "2026-07-09T11:38:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1526,
          "created_at": "2026-07-22T11:02:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1528,
          "created_at": "2026-07-22T15:07:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1529,
          "created_at": "2026-07-22T17:04:58Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1530,
          "created_at": "2026-07-22T17:17:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1531,
          "created_at": "2026-07-22T20:48:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-22T15:13:21Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 445,
          "created_at": "2022-06-16T15:32:34Z",
          "last_comment_at": "2022-11-15T15:32:48Z",
          "last_comment_author": "JonathonO"
        },
        {
          "number": 502,
          "created_at": "2022-10-15T17:57:39Z",
          "last_comment_at": "2023-11-19T16:53:51Z",
          "last_comment_author": "hitesh-yadav-x"
        },
        {
          "number": 505,
          "created_at": "2022-10-26T18:55:54Z",
          "last_comment_at": "2025-07-31T04:08:11Z",
          "last_comment_author": "ryancrawcour"
        },
        {
          "number": 525,
          "created_at": "2023-01-17T09:51:29Z",
          "last_comment_at": "2024-06-20T07:13:27Z",
          "last_comment_author": "sfc-gh-gjachimko"
        },
        {
          "number": 792,
          "created_at": "2024-02-27T18:36:47Z",
          "last_comment_at": "2024-10-09T09:35:07Z",
          "last_comment_author": "simonepm"
        },
        {
          "number": 821,
          "created_at": "2024-04-15T05:55:18Z",
          "last_comment_at": "2024-07-15T09:49:36Z",
          "last_comment_author": "sfc-gh-gjachimko"
        },
        {
          "number": 871,
          "created_at": "2024-06-21T20:59:47Z",
          "last_comment_at": "2024-07-11T12:26:46Z",
          "last_comment_author": "sfc-gh-gjachimko"
        },
        {
          "number": 992,
          "created_at": "2024-11-05T15:49:06Z",
          "last_comment_at": "2024-11-18T07:20:25Z",
          "last_comment_author": "sfc-gh-gjachimko"
        },
        {
          "number": 1032,
          "created_at": "2024-12-19T02:11:22Z",
          "last_comment_at": "2025-01-16T10:35:59Z",
          "last_comment_author": "sfc-gh-achyzy"
        },
        {
          "number": 1051,
          "created_at": "2025-02-04T22:19:29Z",
          "last_comment_at": "2025-02-25T20:19:29Z",
          "last_comment_author": "jmks"
        },
        {
          "number": 1066,
          "created_at": "2025-03-04T16:51:28Z",
          "last_comment_at": "2025-07-29T01:29:43Z",
          "last_comment_author": "ryancrawcour"
        },
        {
          "number": 1069,
          "created_at": "2025-03-17T04:05:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1088,
          "created_at": "2025-04-15T16:57:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1089,
          "created_at": "2025-04-16T19:35:22Z",
          "last_comment_at": "2025-07-30T12:30:47Z",
          "last_comment_author": "ravilk"
        },
        {
          "number": 1094,
          "created_at": "2025-04-28T09:35:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1099,
          "created_at": "2025-05-05T11:42:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1100,
          "created_at": "2025-05-05T16:36:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1105,
          "created_at": "2025-05-21T14:49:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1121,
          "created_at": "2025-06-12T17:45:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1128,
          "created_at": "2025-07-01T08:04:00Z",
          "last_comment_at": "2025-08-14T11:46:56Z",
          "last_comment_author": "sfc-gh-wtrefon"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/snowflakedb/snowflake-kafka-connector",
    "host": "github.com",
    "name": "snowflake-kafka-connector",
    "owner": "snowflakedb"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 73,
      "inputs": {
        "security": 69,
        "vitality": 96,
        "community": 55,
        "governance": 87,
        "engineering": 49
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 96,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "commits_last_year": 260,
              "human_commit_share": 1,
              "days_since_last_push": 3,
              "active_weeks_last_year": 44
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "44/52 weeks with commits",
                "points": 30.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 44
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "260 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 260
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 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": 89,
              "latest_release_tag": "v4.1.0",
              "releases_from_tags": false,
              "days_since_latest_release": 3,
              "mean_days_between_releases": 20.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "89 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 89
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~20.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 20.2
                    }
                  }
                ],
                "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": 3,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 3 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 55,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "forks": 113,
              "stars": 175,
              "watchers": 11,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "175 stars",
                "points": 36.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 175
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "113 forks",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 113
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "11 watchers",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "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": "excellent",
        "name": "Sustainability & Governance",
        "value": 87,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "excellent",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "bus_factor": 4,
              "contributors_sampled": 50,
              "top_contributor_share": 0.15
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "4 contributor(s) cover half of all commits",
                "points": 43.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 15% of commits",
                "points": 19.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 15
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "50 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 50
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "merged_prs": 937,
              "open_issues": 25,
              "closed_issues": 237,
              "issue_closed_ratio": 0.905,
              "closed_unmerged_prs": 310
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "90% of issues closed",
                "points": 42.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 90
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "937/1247 decided PRs merged",
                "points": 28.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 937,
                      "decided": 1247
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "followers": 1616,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "snowflakedb",
              "public_repos": 63,
              "account_age_days": 4569
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1,616 followers of snowflakedb",
                "points": 23.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1616,
                      "login": "snowflakedb"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "63 public repos, account ~12 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 63
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "com.snowflake:snowflake-kafka-connector"
              ],
              "ecosystems": "maven",
              "any_deprecated": false,
              "min_days_since_publish": 3
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on maven",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "maven"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 3 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "96 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 96
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "at_risk",
        "name": "Engineering Quality",
        "value": 49,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "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": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": "0 out of 30 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [
                "kafka",
                "kafka-connect",
                "snowflake",
                "java"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "4 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 69,
        "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": 65,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 6.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 30 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is 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 0 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": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Matched the maven:com.snowflake:snowflake-kafka-connector@4.1.0 runtime dependency closure — what installing the published package pulls in — 33 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "maven:com.snowflake:snowflake-kafka-connector@4.1.0",
                  "assessed": 33
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 87,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 33,
              "unassessed_packages": 0,
              "affected_by_severity": "moderate 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "1 affected: at.yawk.lz4:lz4-java 1.10.1 (moderate 6.5)",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "at.yawk.lz4:lz4-java 1.10.1 (moderate 6.5)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 33,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 5
            },
            "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": 61,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "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": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.09,
              "toolchain_manifests": [
                "pom.xml",
                "test/test_data/protobuf/pom.xml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "pom.xml, test/test_data/protobuf/pom.xml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "pom.xml, test/test_data/protobuf/pom.xml"
                    }
                  }
                ],
                "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": "9 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 9,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "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": 79795,
              "source_files_sampled": 309,
              "oversized_source_files": 3
            },
            "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": "3/309 source files over 60KB",
                "points": 54.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 309,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": false,
              "api_schema_files": [
                "test/test_data/sensor.proto"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "test/test_data/sensor.proto",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "test/test_data/sensor.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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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-26T09:10:47.218832Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/snowflakedb/snowflake-kafka-connector.svg",
  "full_name": "snowflakedb/snowflake-kafka-connector",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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