Raw JSON report machine-readable
{
"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"
}