公开记录
软件健康报告模式 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年5月在 GitHub 上查看 ↗

snowflakedb/snowflake-kafka-connector 的健康指数为 100 分中的 73 分,处于「良好」区间。 其得分最高的类别是Vitality(96/100),最低的是Engineering Quality(49/100)。 最近一次更新在 3 天前。 近期的大部分工作由 4 位贡献者完成。

73
总分 / 100
良好

软件健康指数

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

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

评分画像

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

所有权

Snowflake组织
1,616 关注者63 个公开仓库始于 2014年1月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Mavencom.snowflake:snowflake-kafka-connector4.1.0-963 天前

按类别列示的指标

活力

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

96优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 3 天前
30.5/36提交节奏 — 52 周中有 44 周有提交
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

发布纪律

100优秀
评分方式
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

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

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

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议题解决 — 90% 的议题已关闭
28.7/38.3PR 接受 — 已裁定的 PR 中 937/1,247 已合并
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所有者影响力 — snowflakedb 有 1,616 位关注者
25/25既往记录 — 63 个公开仓库,账户约 12 年
所用输入
followers1,616
owner_typeOrganization
is_verified
owner_loginsnowflakedb
public_repos63
account_age_days4,569
评分方式
25/25已发布且可解析 — maven 上有 1 个软件包
35/35发布时效 — 最近一次发布于 3 天前
20/20版本历史 — 96 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagescom.snowflake:snowflake-kafka-connector
ecosystemsmaven
any_deprecated
min_days_since_publish3

工程质量

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

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

工程实践

48存在风险
评分方式
24/24CI 工作流 — 5 个工作流
24/24存在测试
0/16Linter 配置
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
比对的是 maven:com.snowflake:snowflake-kafka-connector@4.1.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 33 个软件包。 未对可达性进行分析。

AI 就绪度

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

61中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 99 次说明了意图(结构化标题或解释性正文)
所用输入
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/11Lint / 格式化配置
11/11静态类型检查 — Java(静态类型)
10/10可复现环境 — Dockerfile
10/10已体现的代理实践 — 最近 100 次提交中有 9 次由代理编写或署名代理
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可控的文件大小 — 采样的 309 个源文件中有 3 个超过 60KB
所用输入
primary_languageJava
largest_source_bytes79,795
source_files_sampled309
oversized_source_files3

机器可读接口

40存在风险
评分方式
40/40API 模式(OpenAPI/GraphQL/proto) — test/test_data/sensor.proto
0/20MCP 服务器
0/40可运行示例
所用输入
example_dirs
has_mcp_signal
api_schema_filestest/test_data/sensor.proto

关键数据

175GitHub 星标
50贡献者
260最近 12 个月提交数
3距最近推送天数
89发布版本数
4巴士系数(bus factor)
25开放议题
Maven, PyPI软件包生态系统数

数据采集警告

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

更多细节

Star 与 Fork 历史 0 ★ / 113 ⇿
0Star
113Fork
86发布

每颗 star 和每个 fork 的添加时间,来自 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 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
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.