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