Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-26 09:10 UTC

snowflakedb / snowflake-kafka-connector

Snowflake Kafka Connector (Sink Connector)

Java · PythonApache-2.0★ 175 Sterne⑂ 113 Forksseit Mai 2019Auf GitHub ansehen ↗

snowflakedb/snowflake-kafka-connector erreicht einen Gesundheitsindex von 73 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Vitality (96/100) ab, am schwächsten bei Engineering Quality (49/100). Zuletzt vor 3 Tagen aktualisiert. 4 Mitwirkende tragen den Großteil der jüngsten Arbeit.

73
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

73
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

SnowflakeOrganisation
1.616 Follower63 öffentliche Reposseit Jan. 2014

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Mavencom.snowflake:snowflake-kafka-connector4.1.0-96vor 3 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

96Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 3 Tagen
30.5/36Commit-Rhythmus — 44/52 Wochen mit Commits
18/18Commit-Volumen — 260 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year260
human_commit_share1
days_since_last_push3
active_weeks_last_year44

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 89 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 3 Tagen
27/27Release-Rhythmus — ein Release etwa alle 20,2 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count89
latest_release_tagv4.1.0
releases_from_tagsnein
days_since_latest_release3
mean_days_between_releases20,2
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

55Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
36.3/60Stars — 175 Stars
17.1/25Forks — 113 Forks
5.6/15Watcher — 11 Watcher
Verwendete Eingangsdaten
forks113
stars175
watchers11
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

87Exzellent · 24 % des Gesamtindex
Wie die Bewertung erfolgt
43.2/54Bus-Faktor — 4 Beitragende decken die Hälfte aller Commits ab
19.1/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 15 % der Commits
13.5/13.5Breite der Beitragenden — 50 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Verwendete Eingangsdaten
bus_factor4
contributors_sampled50
top_contributor_share0,15
Wie die Bewertung erfolgt
42.3/46.8Issue-Lösungsquote — 90 % der Issues geschlossen
28.7/38.3PR-Annahme — 937/1.247 entschiedene PRs gemergt
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Verwendete Eingangsdaten
merged_prs937
open_issues25
closed_issues237
issue_closed_ratio0,905
closed_unmerged_prs310
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
23.1/25Reichweite des Inhabers — 1.616 Follower von snowflakedb
25/25Kontohistorie — 63 öffentliche Repos, Kontoalter ca. 12 Jahre
Verwendete Eingangsdaten
followers1.616
owner_typeOrganization
is_verified
owner_loginsnowflakedb
public_repos63
account_age_days4.569

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf maven
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 3 Tagen
20/20Versionshistorie — 96 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagescom.snowflake:snowflake-kafka-connector
ecosystemsmaven
any_deprecatednein
min_days_since_publish3

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

49Gefährdet · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 5 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 30 merged PRs checked by a CI test -- score normalized to 0
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 4 Topics
0/10Wiki
Verwendete Eingangsdaten
topicskafka, kafka-connect, snowflake, java
has_wikinein
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

69Mittel · 16 % des Gesamtindex
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
6/7.5Branch-Protection — branch protection is not maximal on development and all release branches
0/2.5CI-Tests — 0 out of 30 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
12/25Indirekte Abhängigkeiten ohne bekannte Advisories — 1 betroffen: at.yawk.lz4:lz4-java 1.10.1 (moderate 6.5)
40/40Keine offenen Advisories — kein Advisory ist länger als 90 Tage öffentlich
Verwendete Eingangsdaten
sourceosv
advisories1
affected_packages1
assessed_packages33
unassessed_packages0
affected_by_severitymoderate 1
direct_affected_packages0
Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von maven:com.snowflake:snowflake-kafka-connector@4.1.0 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 33 Paketen. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

61Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 99 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — pom.xml, test/test_data/protobuf/pom.xml (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Java (statisch typisiert)
10/10Reproduzierbare Umgebung — Dockerfile
10/10Belegte Agentenpraxis — 9 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
5/8Automatisierte Wartung — Abhängigkeits-Automatisierung konfiguriert, in den erfassten Commits nicht beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfileja
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,09
toolchain_manifestspom.xml, test/test_data/protobuf/pom.xml
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Java (statisch typisiert)
54.5/55Handhabbare Dateigrößen — 3/309 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageJava
largest_source_bytes79.795
source_files_sampled309
oversized_source_files3
Wie die Bewertung erfolgt
40/40API-Schema (OpenAPI/GraphQL/proto) — test/test_data/sensor.proto
0/20MCP-Server
0/40Lauffähige Beispiele
Verwendete Eingangsdaten
example_dirs
has_mcp_signalnein
api_schema_filestest/test_data/sensor.proto

Eckdaten

175GitHub-Sterne
50Mitwirkende
260Commits, letzte 12 Monate
3Tage seit letztem Push
89Releases
4Bus-Faktor
25offene Issues
Maven, PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 113 ⇿
0Sterne
113Forks
86Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

02040608010012010832019-052022-122026-06
Major 3Minor 19Patch 54

Jeder Punkt umfasst 7 Tage.

OpenSSF Scorecard 6.5 / 10
6.5Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-26 09:10 UTC

10Binary-Artifactsno binaries found in the repo
8Branch-Protectionbranch protection is not maximal on development and all release branches
0CI-Tests0 out of 30 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 22
RegistryPaketVersionsvorgabeManifest
Mavenorg.apache.kafka:kafka-clients${kafka.version}pom.xml
Mavennet.snowflake:snowflake-jdbc${snowflake-jdbc.version}pom.xml
Mavencom.google.protobuf:protobuf-java${protobuf.version}pom.xml
Mavencom.google.protobuf:protobuf-java-util${protobuf.version}pom.xml
Mavenorg.apache.avro:avro1.12.1pom.xml
Mavenorg.apache.commons:commons-compress${commons-compress.version}pom.xml
Mavenorg.apache.commons:commons-lang3${commons-lang3.version}pom.xml
Mavencom.fasterxml.jackson.core:jackson-core${jackson.version}pom.xml
Mavencom.fasterxml.jackson.core:jackson-databind${jackson.version}pom.xml
Mavenio.confluent:kafka-schema-registry-client${confluent.version}pom.xml
Mavenio.confluent:kafka-avro-serializer${confluent.version}pom.xml
Mavenio.confluent:kafka-connect-avro-converter${confluent.version}pom.xml
Mavenio.confluent:kafka-schema-registry-client-encryption${confluent.version}pom.xml
Mavenio.dropwizard.metrics:metrics-core4.2.39pom.xml
Mavenio.dropwizard.metrics:metrics-jmx4.2.39pom.xml
Mavencom.google.guava:guava${guava.version}pom.xml
Mavencom.google.auto.value:auto-value-annotations${auto-value.version}pom.xml
Mavencom.github.ben-manes.caffeine:caffeine3.2.4pom.xml
Mavendev.failsafe:failsafe3.3.2pom.xml
Mavenorg.slf4j:slf4j-api${slf4j-api.version}pom.xml
Mavencom.snowflake:snowpipe-streaming${snowpipe-streaming.version}pom.xml
Mavenorg.junit:junit-bom5.14.4pom.xml
Alle Abhängigkeiten 54

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 22 direkte und 32 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
Mavencom.fasterxml.jackson.core:jackson-core2.22.1direkt
Mavencom.fasterxml.jackson.core:jackson-databind2.22.1direkt
Mavencom.github.ben-manes.caffeine:caffeine3.2.4direkt
Mavencom.google.auto.value:auto-value-annotations1.11.1direkt
Mavencom.google.guava:guava33.6.0-jredirekt
Mavencom.google.protobuf:protobuf-java3.25.5direkt
Mavencom.google.protobuf:protobuf-java-util3.25.5direkt
Mavencom.snowflake:snowpipe-streaming1.6.2direkt
Mavendev.failsafe:failsafe3.3.2direkt
Mavenio.confluent:kafka-avro-serializer7.9.2direkt
Mavenio.confluent:kafka-connect-avro-converter7.9.2direkt
Mavenio.confluent:kafka-schema-registry-client7.9.2direkt
Mavenio.confluent:kafka-schema-registry-client-encryption7.9.2direkt
Mavenio.dropwizard.metrics:metrics-core4.2.39direkt
Mavenio.dropwizard.metrics:metrics-jmx4.2.39direkt
Mavennet.snowflake:snowflake-jdbc4.3.2direkt
Mavenorg.apache.avro:avro1.12.1direkt
Mavenorg.apache.commons:commons-compress1.28.0direkt
Mavenorg.apache.commons:commons-lang33.20.0direkt
Mavenorg.apache.kafka:kafka-clients3.9.2direkt
Mavenorg.junit:junit-bom5.14.4direkt
Mavenorg.slf4j:slf4j-api2.0.18direkt
Mavencom.github.stefanbirkner:system-rules1.19.0indirekt
Mavencom.google.auto.value:auto-value1.11.1indirekt
Mavencommons-dbutils:commons-dbutils1.8.1indirekt
Mavenjunit:junit4.13.2indirekt
Mavenorg.apache.commons:commons-dbcp22.14.0indirekt
Mavenorg.apache.kafka:connect-api3.9.2indirekt
Mavenorg.apache.kafka:connect-json0.9.0.0indirekt
Mavenorg.apache.kafka:connect-runtime3.9.2indirekt
Mavenorg.apache.kafka:kafka-server-common3.9.2indirekt
Mavenorg.apache.kafka:kafka_2.133.9.2indirekt
Mavenorg.apache.logging.log4j:log4j-core2.26.1indirekt
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.15.0indirekt
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.3indirekt
Mavenorg.apache.maven.plugins:maven-failsafe-plugin3.5.5indirekt
Mavenorg.apache.maven.plugins:maven-gpg-plugin3.2.8indirekt
Mavenorg.apache.maven.plugins:maven-jar-plugin3.5.0indirekt
Mavenorg.apache.maven.plugins:maven-javadoc-plugin3.12.0indirekt
Mavenorg.apache.maven.plugins:maven-project-info-reports-plugin3.3.0indirekt
Mavenorg.apache.maven.plugins:maven-site-plugin3.12.1indirekt
Mavenorg.apache.maven.plugins:maven-source-plugin3.4.0indirekt
Mavenorg.apache.maven.plugins:maven-surefire-plugin3.5.5indirekt
Mavenorg.assertj:assertj-core3.27.7indirekt
Mavenorg.awaitility:awaitility4.3.0indirekt
Mavenorg.bouncycastle:bcpkix-fips2.1.11indirekt
Mavenorg.codehaus.mojo:exec-maven-plugin3.2.0indirekt
Mavenorg.junit.jupiter:junit-jupiter-engineindirekt
Mavenorg.junit.jupiter:junit-jupiter-paramsindirekt
Mavenorg.junit.vintage:junit-vintage-engineindirekt
Mavenorg.mockito:mockito-core5.23.0indirekt
Mavenorg.slf4j:slf4j-log4j122.0.18indirekt
Mavenorg.sonatype.central:central-publishing-maven-plugin0.10.0indirekt
Mavenorg.testcontainers:testcontainers2.0.5indirekt
Abhängigkeits-Advisories 1

Die Installation von maven:com.snowflake:snowflake-kafka-connector@4.1.0 zieht 33 Pakete nach sich, direkt und transitiv: 1 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
at.yawk.lz4:lz4-java1.10.1indirektmittel11.11.1

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenMaven.