Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"gatling",
"performance",
"performance-testing",
"jdbc",
"gatling-plugin",
"hikaricp",
"java",
"kotlin",
"load-testing",
"mysql",
"postgresql",
"scala"
],
"is_fork": false,
"size_kb": 730,
"has_wiki": true,
"homepage": null,
"languages": {
"Java": 26299,
"Scala": 276164,
"Shell": 113567,
"Kotlin": 4911,
"PowerShell": 37305
},
"pushed_at": "2026-07-26T03:24:38Z",
"created_at": "2024-03-24T12:21:52Z",
"owner_type": "Organization",
"updated_at": "2026-07-23T04:52:12Z",
"description": "Gatling plugin for JDBC — SQL queries, batch operations, and stored procedures with HikariCP connection pooling",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "Scala",
"significant_languages": [
"Scala",
"Shell"
]
},
"owner": {
"blog": "galaxio.org",
"name": "Galaxio Team",
"type": "Organization",
"login": "galax-io",
"company": null,
"location": null,
"followers": 18,
"avatar_url": "https://avatars.githubusercontent.com/u/148836406?v=4",
"created_at": "2023-10-24T03:08:39Z",
"is_verified": null,
"public_repos": 15,
"account_age_days": 1009
},
"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.5.0",
"kind": "minor",
"published_at": "2026-07-23T05:03:30Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-07-21T19:45:31Z"
},
{
"tag": "v1.3.1",
"kind": "patch",
"published_at": "2026-07-19T16:15:50Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-07-19T07:01:37Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2026-07-12T23:26:05Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-07-12T08:17:30Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2026-07-10T12:47:42Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2026-05-31T15:51:57Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2026-05-31T15:26:11Z"
},
{
"tag": "v0.20.6",
"kind": "patch",
"published_at": "2026-05-31T14:31:51Z"
},
{
"tag": "v0.20.5",
"kind": "patch",
"published_at": "2026-05-31T14:06:01Z"
},
{
"tag": "v0.20.4",
"kind": "patch",
"published_at": "2026-05-31T13:51:48Z"
},
{
"tag": "v0.20.3",
"kind": "patch",
"published_at": "2026-05-31T11:55:56Z"
},
{
"tag": "v0.20.2",
"kind": "patch",
"published_at": "2026-05-31T03:04:05Z"
},
{
"tag": "v0.19.4",
"kind": "patch",
"published_at": "2026-05-30T22:19:22Z"
},
{
"tag": "v0.19.3",
"kind": "patch",
"published_at": "2026-05-30T21:45:41Z"
},
{
"tag": "v0.19.2",
"kind": "patch",
"published_at": "2026-05-30T20:51:37Z"
},
{
"tag": "v0.19.1",
"kind": "patch",
"published_at": "2026-05-25T21:20:16Z"
},
{
"tag": "v0.19.0",
"kind": "minor",
"published_at": "2026-05-19T00:47:23Z"
},
{
"tag": "v0.18.1",
"kind": "patch",
"published_at": "2026-05-19T00:27:46Z"
},
{
"tag": "v0.18.0",
"kind": "minor",
"published_at": "2026-05-19T00:14:26Z"
},
{
"tag": "v0.17.3",
"kind": "patch",
"published_at": "2026-05-19T00:11:55Z"
},
{
"tag": "v0.17.2",
"kind": "patch",
"published_at": "2026-05-17T13:17:19Z"
},
{
"tag": "v0.17.1-latest",
"kind": "prerelease",
"published_at": "2026-05-17T13:09:33Z"
},
{
"tag": "v0.17.1",
"kind": "patch",
"published_at": "2026-05-17T13:01:40Z"
},
{
"tag": "v0.17.0",
"kind": "minor",
"published_at": "2026-05-15T17:16:06Z"
},
{
"tag": "v0.16.2",
"kind": "patch",
"published_at": "2026-05-15T15:32:46Z"
},
{
"tag": "v0.16.1",
"kind": "patch",
"published_at": "2026-05-15T15:22:18Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-05-15T14:35:38Z"
},
{
"tag": "v0.15.1",
"kind": "patch",
"published_at": "2026-05-15T14:05:27Z"
},
{
"tag": "v0.14.2",
"kind": "patch",
"published_at": "2026-02-10T10:15:43Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-02-10T10:12:43Z"
},
{
"tag": "v0.14.1",
"kind": "patch",
"published_at": "2025-08-18T02:39:41Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2025-08-18T02:23:38Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2024-12-15T19:05:53Z"
},
{
"tag": "v0.13.0-latest",
"kind": "prerelease",
"published_at": "2024-12-15T19:05:26Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2024-06-26T21:59:27Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2024-05-23T05:36:55Z"
},
{
"tag": "v0.10.3",
"kind": "patch",
"published_at": "2024-05-09T11:45:43Z"
}
],
"recent_commits": [
{
"oid": "01abbf728c72151a83f176adf65aca501d5ef30e",
"body": "….5.0 release) (#162)\n\n{@link #where(String, Map)} referenced the overload without matching\nscaladoc's cross-language javadoc-link resolver in this mixed Java+Scala\nbuild, failing `sbt doc` (and therefore `sbt ci-release`, which requires\ndocJar generation for Sonatype publishing) with:\n\n Could not \n[…]\nase is already written.\n\nVerified locally: sbt doc succeeds; full gate (scalafmtCheckAll\nscalafmtSbtCheck compile test) still green, 202 tests.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(docs): unresolvable javadoc {@link} broke scaladoc generation (v1…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:52:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c6b6d498d110aa19f5ad6deeaade27b51cf7e2ee",
"body": "Adds an \"Upgrading to 1.5.0\" README section (and a parameterized-where example\nunder Batch Operations) covering the milestone-8 behavior changes so users can\nmigrate from release notes alone (spec 005 SC-006):\n\n- #93: literal \"NULL\" strings now stored as text; use NullParam / JVM null for SQL NULL\n-\n[…]\nvery milestone-8 fix landed with H2/logback regressions, migration notes in\nREADME, full gate + Gatling DebugTest green, PR #161 opened closing\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: v1.5.0 migration notes; mark 005 tasks complete",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e018aa767a3a253ba62e31d74b3d65f062566a15",
"body": "withParamsMap mapped the string \"NULL\" to NullParam, so a legitimate feeder\nvalue of \"NULL\" was silently written as database NULL — the four-character\ntext was unstorable and test data was corrupted without any signal. Removing\nthe `case (k, \"NULL\") => NullParam` line makes every string round-trip\nv\n[…]\nd to the old sentinel\nupdated to assert the corrected behavior.\n\nSpec: 005-injection-secrets-null US3 / FR-008, FR-009. Migration note in T018.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): store literal \"NULL\" strings as text, not SQL NULL (#93)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "41897673204e0b5423d8476bea12575eb117692e",
"body": "…s (#92)\n\nA probe (pinned in HikariSecretPropsSpec) confirms HikariCP 7.1.0 masks its\nown `password` but prints custom properties such as `sslpassword` and\n`token`, and URL-embedded credentials, verbatim in its own DEBUG config\ndump. The plugin cannot both keep those values working (the driver needs\n[…]\naram.\nDocs (data-model, contracts) updated to the broadened redaction contract.\n\nSpec: 005-injection-secrets-null US2 / FR-005, FR-006, FR-007.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(protocol): warn on secret-like datasource properties and URL cred…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e6ac651bc6b1fc0335b681693a5abefef125b592",
"body": "reportError sent the raw exception message into logResponse, so a driver\nconstraint error echoing a feeder value (email, password) was persisted into\nGatling stats and reports — artifacts that get shared widely. Separately, a\nsession-resolved procedure/table/column name that failed identifier\nvalida\n[…]\nationSpec assert the\nrejected value is absent from stats/crashes and present only on DEBUG.\n\nSpec: 005-injection-secrets-null US1/US2 / FR-007.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(actions): report structured value-free KO messages (#126)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "43839149e57764988b14eece92b7a13fe2f7cf26",
"body": "JdbcProtocolBuilderConnectionSettingsStep is a case class whose synthesized\ntoString printed the password (and any URL-embedded credentials) wherever the\nstep was logged or folded into an exception. Override toString to mask the\npassword and credential-redact the URL; apply/copy/unapply are untouche\n[…]\nain; copy/apply\nstill behave as a normal case class; malformed URLs redact instead of throwing.\n\nSpec: 005-injection-secrets-null US2 / FR-005.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(protocol): redact credentials in builder toString and URLs (#91)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4b3563bf09ceeb54e3d6858f97ffc50c203f742a",
"body": "…#125)\n\nThe batch-update WHERE fragment was resolved and interpolated into the\nUPDATE text, so a Gatling-EL value (e.g. \"#{v}\" resolving to \"1 OR 1=1\")\nbecame predicate text and could widen the update to every row.\n\nNew safe overloads on BatchUpdateValuesStepAction (Scala + Java facade):\n- where(Str\n[…]\npec exercises\nboth overloads and the EL rejection through BatchBase unwrapping.\n\nSpec: 005-injection-secrets-null US1 / FR-003, FR-004, FR-010.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(actions): parameterize batch WHERE values, reject EL predicates (…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f61db7217b385f508236fbc96e5d6487c739b342",
"body": "A session-resolved procedure name was interpolated into CALL text verbatim,\nso a feeder value like \"proc; DROP TABLE users\" reached the driver as\nstatement text. The resolved name now goes through the SqlIdentifier\nallowlist (#124 grammar: qualified, quoted, brace-free) before any SQL is\nassembled; \n[…]\nuoted names keep executing (real H2 aliases);\nOUT-parameter behavior unchanged.\n\nSpec: 005-injection-secrets-null US1 / FR-001, FR-002, FR-010.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(actions): validate procedure identifiers before CALL assembly (#90)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d96c0d416264e99ec9ffcc591e22072087edc1bb",
"body": "Spec-first artifacts for milestone 8 (v1.5.0 — Runtime correctness:\ninjection, secrets & NULL handling; #90 #91 #92 #93 #125 #126):\n\n- spec.md — rationale-first: 4 criteria drive 3 prioritized stories\n (P1 injection, P2 secret/PII redaction, P3 NULL fidelity), 10 FRs,\n 6 measurable SCs, zero open \n[…]\naction\nboundary documented; 512-char truncation marked with an ellipsis;\nFR-006/FR-005 cross-referenced for URL-credential redaction ownership.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): add 005-injection-secrets-null spec/plan/tasks",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2e4396f3198a780137e06eb802f8b4486131e817",
"body": "…n carve-out)\n\nCodify the maintainer decision of 2026-07-22: a runtime-behavior change whose\nsole effect is to stop silent data corruption, secret/PII disclosure, or\nexecution of unintended SQL may ship in a MINOR release as a plain fix commit,\nunder four mandatory conditions (defect misrepresents u\n[…]\nOR-only.\n\nPrecedent: milestone 8 / spec 005-injection-secrets-null (#93, #125 → v1.5.0).\nResolves finding C1 of /speckit-analyze for that spec.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: amend constitution to v1.1.0 (Principle I corruption & injectio…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-23T04:43:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2284c2ca1ef5588531a51c46526d4786dae447d6",
"body": "check-linkage.sh hard-errored on ANY PR carrying a milestone with no\nclosing issue. That's backwards: the obligation is one-directional. If\na tracked issue exists, its PR must link it (Closes #<issue>, same\nmilestone) - already enforced by the per-issue check and, in\ntag-readiness mode, by requiring\n[…]\n6-07-19 with 0 open issues, but the milestone itself\nwas never closed, so current-milestone.sh kept resolving it as\n'current' instead of v1.4.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(scripts): a PR closing no issue is not itself a linkage violation",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T19:19:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "91926aaa76879492f95dd8d5165e18e9602b4b04",
"body": "All 27 tasks done: 7 issue commits (#88, #122, #123, #84, #86, #87,\n#124) each green on the full gate with same-commit real-database\nregression tests; polish sweep green (155 tests, DebugTest, PostgreSQL\nslice); linkage gate PASS on PR #151; README docs PR prepared\nseparately per the 1-concern-per-PR rule (T026).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): mark 003-batch-resultset-correctness tasks complete",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3ebf30cb2f80af0cdb55b2002a5134e26beecaec",
"body": "The six new db-level specs from the 003 milestone each duplicated the\nsame boilerplate: data source + blocking pool + JDBCClient lifecycle,\nraw-SQL exec helper, and fresh-connection visibility helpers. No\nexisting fixture covered the client level (JdbcActionSpecFixture is\nGatling-scenario-level; H2 \n[…]\nource override for the\nfailure-injecting pool), BoundedRetrievalSpec, and LobDetachmentSpec\nonto it. No assertion changes; 155 tests stay green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(db): share H2 client fixture across runtime-correctness specs",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "735ae36e8c7d27a84619c38944f99b3064703d69",
"body": "Behavior change (defect fix): insert and batch actions interpolated\nresolved table names and column names directly into SQL text, so a\nfeeder value like 'users; DROP TABLE t' could alter statement structure\nor smuggle in a second statement.\n\nNew SqlIdentifier allowlist validator (spec 003 identifier\n[…]\np working.\n\nConstitution III note: pure resolve-time validation on short strings;\nno resource, pool, timeout, or threading changes.\n\nCloses #124\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(actions): validate SQL identifiers before statement assembly (#124)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "be5be5be569ef0cb3b511b2bfd2d8a92e604b471",
"body": "Behavior change (defect fix): Blob/Clob/NClob/SQLXML/Array values were\nstored in the session as live driver locators, but every resource\n(ResultSet, Statement, Connection) closes before the consumer callback\nruns - so any check touching such a value hit an invalid-locator error.\nThe previous behavio\n[…]\n(or thrown itself if the copy succeeded), so no locator leaks\nand no failure is masked; all inside the existing Using.Manager scope.\n\nCloses #87\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): detach LOB values while the ResultSet is open (#87)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eb0ec561c5d4e76cc2c7d557350bbe923a22f9f4",
"body": "…p (#86)\n\nEvery SELECT previously materialized the full ResultSet even when no\ncheck consumed rows, so a large load-only query could OOM the load\ngenerator - and on PostgreSQL the driver buffers the entire result\nclient-side regardless of retention unless the query runs with\nauto-commit off, a forwa\n[…]\n Using; commit on success, rollback + eviction semantics shared\nwith #84; fetch-size hint only, no pool sizing or threading changes.\n\nCloses #86\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(actions): bounded result retrieval - discard path and maxRows ca…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a33669d5207325b0eaf0e80ea06162979adbffcb",
"body": "Three failure modes fixed in the batch transaction flow:\n\n1. Rollback masking: the failure branch returned\n Try(conn.rollback()).flatMap(_ => Failure(primary)), so a rollback\n failure replaced the original BatchUpdateException.\n2. Nested-Try flattening: Failure(primary) was returned as an ordina\n[…]\n scope -> statement, released in reverse); eviction only\non the failed-rollback path; no pool sizing, timeout, or threading\nchanges.\n\nCloses #84\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): preserve primary batch failure over cleanup failures (#84)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f358a61c496f3d3a766f143615de4debb41d825e",
"body": "Behavior change (defect fix): a result carrying the same label twice\n(e.g. a JOIN selecting two id columns) previously kept only the last\nvalue - the earlier one vanished without KO or warning, corrupting\nchecks silently. The hoisted label list (#122) is now validated once\nper ResultSet, before the \n[…]\ntitution III note: pure mapping-layer change inside the existing\nresource scope; no lifecycle, pool, timeout, or threading changes.\n\nCloses #123\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): fail loud on duplicate ResultSet labels (#123)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "896484ab620c7c83c7ea69ee922280c591b037f7",
"body": "Behavior change (defect fix): SELECT col AS alias previously exposed the\nphysical column name as the session key, so checks and saveAs could not\nreference the documented alias. Result rows are now keyed by\nResultSetMetaData.getColumnLabel, verbatim - the alias when AS is\npresent, the column name oth\n[…]\nII note: mapping still happens inside the existing\nUsing.Manager scope; no resource lifecycle, pool, timeout, or threading\nchanges.\n\nCloses #122\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): key result rows by column label, not physical name (#122)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "608ef81685180aeabb9829d6f6b9dcfe42054a1e",
"body": "Behavior change (defect fix): a HikariConfig with autoCommit=false\npreviously let every non-batch write report OK while Hikari rolled the\ndirty connection back on checkin - green statistics over an empty\ndatabase. The configuration has no working use case here: there is no\ncommit DSL, connections ar\n[…]\nppens before any resource exists;\nsuccessful paths are untouched - no pool sizing, timeout, threading,\nor error-propagation changes.\n\nCloses #88\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): reject autoCommit=false pool configuration at startup (#88)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "469c8415d900d209674ea81f6ebfaa002ead91ac",
"body": "…acts, and tasks\n\nPlan (research R0-R8, data-model, contracts, quickstart) and 27-task\nbreakdown for milestone v1.4.0 (issues #84, #86, #87, #88, #122, #123,\n#124), with Codex-review and cross-artifact-analysis findings folded in:\n\n- #84: throw the primary through Using.Manager (nested-Try shape rem\n[…]\nands via constitution I's additive path\n (new optional parameter with safe default); compatibility note recorded\n in the API surface contract.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): add 003-batch-resultset-correctness plan, design artif…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "486caccaafb17189861b96d04dc6234375e86834",
"body": "Specify milestone 7 (v1.4.0 — Runtime correctness: batch execution &\nResultSet mapping) as feature 003: six prioritized user stories covering\nthe seven audit issues (#84, #86, #87, #88, #122, #123, #124), functional\nrequirements mapped 1:1 to issues, measurable success criteria, and\ndocumented defau\n[…]\nices (duplicate labels fail explicitly, row cap\nopt-in, identifier allowlist grammar). Point .specify/feature.json at the\nnew feature directory.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): add 003-batch-resultset-correctness spec",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-21T08:32:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5d79b9217f2dd87551029433cab2c70c1ad41cac",
"body": "… notes\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): mark 004-review-followups tasks complete with as-built…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:57:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "59877371e9ab5e05138952fc67e824053bb57acf",
"body": "…andalone (#154)\n\nThe third test registered passing->failing->failing, so a replace-instead-of-\nappend regression (which keeps only the last check) still produced a KO and the\ntest passed. Rearranged to passing->failing->passing and added the Check ERROR\nresponseCode assertion; mutation-verified: wi\n[…]\nng how ThrowingCheckSpec already pins the thrown-check mode's message —\nclosing the last unasserted column of the check-failure behavior freeze.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(actions): make check-chain regression test detect replacement st…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:57:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c8c3e6f1f875a65e54b3d7de5bbb60b1a293bf19",
"body": "Both check-failure modes (returned validation failure, thrown predicate) now\nreport through one nested failCheck helper; per-mode session choice (newSession\nvs original session) and message source preserved exactly. Zero observable\nbehavior change - ThrowingCheckSpec, SessionMarkAsFailedSpec,\nActionSessionFailureSpec, QueryActionBuilderCheckChainSpec pass unmodified.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(actions): consolidate duplicated check-failure KO path (#153)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:57:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a44bc1ea531262363d1ddefe5f5f08df618799ed",
"body": "… rule (#155)\n\nSince 1.3.0 batches preserve declared order and merge identical SQL into one\nprepared-statement group only when adjacent; interleaving increases group count\n(A,B,A -> 3 vs A,A,B -> 2). States the adjacency guidance and that transactional\nbehavior is unchanged.\n\nBatchOrderSpec: the int\n[…]\nnferring the count from final state plus the separate\nA,A,A,B -> 2 case. Both counting assertions measure deltas so they stay\norder-independent.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): document batch execution ordering and adjacent-grouping…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:57:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9fb7556bbf1784be800469a796f2e2da0b2b5f85",
"body": "…uilder (#152)\n\nSince 1.3.0 check() is copy-on-write; calling it and ignoring the returned\nbuilder silently registers no checks. Adds the upgrade note with before/after\nexamples and the branching reassurance to the Checks -> Java section.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): warn that Java QueryActionBuilder.check returns a new b…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:57:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3cd4d2f2504b9e8ecd6ac0f5e01698a3b5a992a3",
"body": "Post-review follow-ups from the v1.3.0 milestone review: spec (4 prioritized\nstories), plan, research decisions R1-R6, data model, behavior/docs contracts\nC1-C3, quickstart validation, tasks. Points CLAUDE.md and feature.json at 004.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): add 004-review-followups spec, plan, and design artifacts",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:57:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "55b3eebdb5f173a6a5faa8542616eac5209ef125",
"body": "…n separate lines\n\nThe worktrees extension appended \".worktrees/\" to a .gitignore that lacked a\ntrailing newline, corrupting the last pattern into \"scratchpad-*.sh.worktrees/\".\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(gitignore): restore scratchpad pattern and ignore .worktrees/ o…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:57:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "689ee0a6bdb5288db62c8d26440836812221e8fe",
"body": "check-linkage.sh --for-tag normalized every vX.Y.Z to the vX.Y.0 milestone, and\ncurrent-milestone.sh only recognized vX.Y.0 titles — so a dedicated patch\nmilestone (e.g. v1.3.1) was invisible to both. Tagging v1.3.1 would silently\naudit the unrelated v1.3.0 milestone instead and could pass while v1.\n[…]\n5 issues open); --for-tag v1.3.0 still resolves\nthe existing #6 milestone unchanged. AGENTS.md's two descriptions of this gate\nupdated to match.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: release gate cannot resolve patch-version milestones (#157)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T15:53:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7ba8aa19250db199764743ac9cf17d578930c6bc",
"body": null,
"is_bot": true,
"headline": "Update scalafmt-core to 3.11.4",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-19T09:16:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5f320ea40041a37b11b2779df5fe020c271445d",
"body": null,
"is_bot": true,
"headline": "Update sbt-scalafmt to 2.6.2",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-19T09:15:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "392124e405a009f39309035c3f4140649559e481",
"body": null,
"is_bot": true,
"headline": "Update HikariCP to 7.1.0",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-19T09:14:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b25f239bc4beaa80b7846d49b5337997eb520894",
"body": "…th as-built notes\n\nAll 14 tasks done: five fix commits with failing-first H2 regression specs,\nspectest-gap tightenings, full gate and DebugTest green, PR #150 opened with\nmilestone linkage verified. Notes cover the Docker-less local environment,\nthe String-caster edge-case reality, the def-name-to-val stability addition,\nand the injectable recording StatsEngine test infra.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): mark 002-check-semantics-concurrency tasks complete wi…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f0292e6c90253a6f68f97d4da18646af4627cf88",
"body": "…ss specs\n\nEvery action-level spec duplicated the same event-loop/actor-system/config\nblock and hand-rolled test Sessions, and seven specs each repeated the same\nHikariConfig H2 setup. Extract SessionFixture (event loop + freshSession +\nteardown) and JdbcActionSpecFixture (adds actor system and Gatl\n[…]\nntainer-derived configs and\nJDBCClientThreadingSpec its stub DataSource — nothing to unify there.\nTest-only, no behavior change: 86 tests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(test): extract shared fixtures and unify H2 pool config acro…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "39755aaa9bb5f4d5c7b4cec835c01528f07fcfb9",
"body": "… statement reuse per batch run\n\nFR-003: ActionSessionFailureSpec now counts next invocations and KO stats\nentries on the reportError path (exactly one of each), using the recording\nStatsEngine infra from #77. FR-007: BatchOrderSpec asserts a contiguous run\nof identical SQL shares one PreparedStatement (2 prepares for 3 inserts + 1\nupdate) via a prepare-counting DataSource proxy — the efficiency half of the\n#82 ordering contract.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(actions,db): close spectest gaps — exactly-once KO on DB errors,…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3590c2a7da783861ac070cac7adff4c9a91023e3",
"body": "batch() grouped queries with groupBy(_.sql) — an unordered HashMap — so\ndistinct statements executed in hash order and non-contiguous repeats of the\nsame SQL were merged into one group, silently reordering the batch relative\nto its declared sequence (insert A -> update all -> insert B produced a\ndif\n[…]\n\nRegression: BatchOrderSpec (H2) pins final row state and per-statement count\norder for interleaved, distinct, and contiguous-identical batches.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): preserve declared SQL order in batch execution (#82)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bbd1973db0e612211ea9647e5fe7945ff47ae7f4",
"body": "…ranches (#80)\n\nThe Java wrapper reassigned its non-final wrapped field and returned this,\nso branches derived from one shared base all aliased the same object and\naccumulated each other's checks — nondeterministic Empty/NonEmpty outcomes\ndepending on build order. Make wrapped final and have check()\n[…]\nature change.\n\nRegression: QueryActionBuilderBranchSpec proves distinct instances, an\nuntouched base, and independent H2-backed branch outcomes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(javaapi): stop QueryActionBuilder.check mutating shared builder b…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c40aa6e1385e613bb953053c295624fe587eb271",
"body": "…#79)\n\nQueryActionBuilder.check did copy(checks = newChecks), so .check(a).check(b)\nsilently dropped a — a declared assertion could be disabled just by adding\nanother one. Append with checks ++ newChecks and document that checks execute\nin declaration order.\n\nRegression: QueryActionBuilderCheckChain\n[…]\nr-level\naccumulation and, over H2, that an earlier failing check is reported even\nwhen a later check passes (mutation test for the replace bug).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(actions): append chained query checks instead of replacing them (…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f5b26ebf26495701263783ba12625d81923d6ca0",
"body": "…s (#78)\n\nCheck.check ran unguarded inside the executeSelect consumer, so a check\npredicate that threw escaped into the Future's failure channel: no KO, no\nstats entry, no next call — the virtual user hung. Wrap check evaluation in\na NonFatal guard at its single call site and route the exception thr\n[…]\n(H2) proves one KO with the exception message,\na failed session, and exactly one next invocation, plus the passing-check OK\npath staying intact.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(actions): report KO instead of hanging VU when a JDBC check throw…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4e4d6001475c81bbb61cfd3f76991a7d9d680ee0",
"body": "… EL (#77)\n\ncrashOnFailure re-resolved the failing requestName expression and acted only\non success, so a missing #{attr} silently dropped the KO, the failed session,\nand the next call — the virtual user hung forever. Resolve the name once and\nfall back to the action's stable Gatling name so the cra\n[…]\naction types on H2 plus the\nnon-String-attribute edge case; test infra gains an injectable recording\nStatsEngine (test-only, default unchanged).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(actions): emit KO instead of hanging VU on unresolved requestName…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e9dd28d1e6d42247996882f0780c82df3e2a440a",
"body": "Milestone v1.3.0 (galax-io/gatling-jdbc-plugin#6): specify the 5 open P0\nruntime-correctness bugs (#77, #78, #79, #80, #82) with rationale for each,\nplus the implementation plan (research scoping each fix against the current\ntree, data-model invariants, behavioral contracts with no signature changes\n[…]\nremediations: check-throw contract scoped to the\nquery action, type-mismatch edge case, #77 fallback pinned to the action's\nstable Gatling name.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): add 002-check-semantics-concurrency spec, plan, and tasks",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-19T06:49:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f2727a8467beab7f2c9a241d34bf1dfca732468f",
"body": "…ngelog (#145)\n\nfilter_unconventional = true silently skipped any commit that failed\nstrict `type: description` parsing before commit_parsers ever saw it —\nthe v1.2.0 release notes ended up missing 38b99bd (the actual deadlock\nfix issue #57 was filed for). Flip filter_unconventional to false so a\nfa\n[…]\nled-parse commit still reaches commit_parsers, and add a trailing\ncatch-all rule routing it to an \"Other\" group instead of nowhere.\n\nCloses #144\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(release): stop dropping non-Conventional-Commit messages from cha…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-07-13T05:00:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3d07b448dfb5d18a4593a9a96df03fe0f6195814",
"body": "…built notes (PR #140)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): mark 001-concurrency-hardening tasks complete with as-…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T23:06:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c5acf7a1b93d95c44631febf57cebc0479f83a6e",
"body": "…(#100)\n\nClose-counting proxy datasource (test-only HikariDataSource subclass)\nverifies per-resource exactly-once release when a missing parameter\nbinding throws synchronously inside the Using block: original\nexception stays primary with an injected non-fatal close failure\nattached as suppressed (Us\n[…]\ntion, statement and result set exactly\nonce as well. rel_items is cleared per client so repeated runs in one\nJVM (DB_CLOSE_DELAY=-1) stay green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(db): prove exactly-once resource release on synchronous failure …",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T23:06:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "13616d42fd8ba46d69a25332d727bdfee2c9dafd",
"body": "Real-PostgreSQL acceptance: a batch blocked on pg_sleep(10) with a 1s\nprotocol queryTimeout fails as KO within a named abort deadline (1s\ntimeout + driver cancel margin, never the full sleep), the transaction\nis rolled back and the connection returns to the pool; fast batches\nunder the same client and batches without a configured timeout behave\nexactly as before.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(db): prove batch honors configured queryTimeout (#83)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T23:06:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "99c6333a4cec3211fb4f6f1088e2e238dc1f6175",
"body": "Recording proxy over a real H2 CallableStatement (CREATE ALIAS\nfunctions, `? = CALL` form) asserts no overlap between IN setters and\nregisterOutParameter, exactly-once binding/registration per position\nfor mixed, IN-only and OUT-only calls, the missing-OUT-placeholder\nIllegalArgumentException path, and correct OUT values for 50\nconcurrent calls through the client.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(db): prove serialized CallableStatement IN/OUT registration (#121)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T23:06:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "43d248d7274786ed6cc5e6f7418e3612f20daac7",
"body": "Recording JDK-proxy over a real H2 statement asserts max concurrent\nsetter entry == 1 and exactly-once binding per index — multi-param\n(incl. NULL), duplicated placeholders, zero-param and\nunbound-placeholder failure paths; an instrumentation sensitivity\ncheck (250ms hold window) proves overlap would be detected.\nPostgreSQL spec gains a 50-user concurrent multi-param insert case\nverifying 100% value correctness end-to-end.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(db): prove serialized PreparedStatement param binding (#120)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T23:06:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "91a0151ae0414fd25bc199a17fffb0b84246d31e",
"body": "Spec, plan, research, data model, behavioral contract, quickstart and\ntask list for closing milestone v1.2.0 issues #83, #100, #120, #121.\nContracts narrowed after adversarial review: Using-severity error\npreservation, exactly-once binding without cross-position order.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): add 001-concurrency-hardening spec/plan/tasks",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T23:06:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "75925b67046695501746f41174fa7daa24244b20",
"body": "…baseline) (#139)\n\nInitial ratification of .specify/memory/constitution.md, replacing the raw\ntemplate. Principles derived from AGENTS.md: backward compatibility,\ntest-first with real databases, resource & concurrency safety,\nspec-driven semantic delivery, idiomatic simplicity. Adds build/format/\ndependency and release discipline sections plus governance.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(speckit): ratify constitution v1.0.0 (5 principles + governance …",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T20:51:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5c2c9c5ac2d4d7fc891ed5c213050c5079a7a048",
"body": "…ard hook (#138)\n\n* ci(milestones): enforce current-milestone assignment via milestone-guard hook\n\nAdd a PreToolUse(Bash) hook that hard-blocks assigning an issue or PR to any\nmilestone other than the current release milestone (the single open `vX.Y.0 …`,\nlowest semver if several). It fires only on \n[…]\nll assignment invocation inside a quoted string still matches (bypassable).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(milestones): enforce current-milestone assignment via milestone-gu…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T19:06:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "38b99bd02a8920706b126635e5d4a6f1c3e3af73",
"body": "* fix: resolve deadlock by executing all actions in a single Future\n\nfixes #57\n\n* refactor: remove obsolete wrappers\n\n* docs: adapt scaladoc in JDBCClient to new consumer parameter\n\n* test: reenable PostgreSQLIntegrationSpec\n\n* refactor: simplify PostgreSQLIntegrationSpec\n\n* refactor: simplify PostgreSQLIntegrationSpec\n\n---------\n\nCo-authored-by: Joshua Gleitze <joshua.gleitze@atruvia.de>",
"is_bot": false,
"headline": "Fix Deadlock on Backpressure From Connection Pool (#59)",
"author_name": "Joshua Gleitze",
"author_login": "jGleitz",
"committed_at": "2026-07-12T11:21:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d0cd2b6ee373d35e7b6c5d9a3d9e6d9a228fc7fa",
"body": "Bumps sbt-ci-release 1.11.2 -> 1.12.0, and restores sbt-git 2.1.0 explicitly (1.12.0 removed the bundled sbt-git, which provides GitVersioning).",
"is_bot": true,
"headline": "chore(deps): update sbt-ci-release to 1.12.0 (#134)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-12T05:13:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72e8a15a3835768d57b9a20b2b980f9e1fdc38f8",
"body": null,
"is_bot": true,
"headline": "Update postgresql to 1.21.4",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-12T04:50:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0474cb3f46703e4ea8a3124db4daa0ceb538d027",
"body": null,
"is_bot": true,
"headline": "Update scalafmt-core to 3.10.7",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-12T04:49:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "48930e67bd36110365058c8d4df462bddd56bd6a",
"body": null,
"is_bot": true,
"headline": "Update HikariCP to 6.3.3",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-12T04:49:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "054f52d9d1ff97ff9c1dc1f2eae24f409a05298a",
"body": null,
"is_bot": true,
"headline": "Update postgresql to 42.7.13",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-12T04:49:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a1ff411c3cd3f161f8259ebff0466b640468816b",
"body": null,
"is_bot": true,
"headline": "Update gatling-sbt to 4.18.4",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-12T04:48:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d82502bf40474c6dcc7264d657b5c69320dea387",
"body": "Restructure AGENTS.md to the galax-io template (Role/Stack/Commands/Structure/Architecture/Test Model + Boundaries/Milestones/Commits/Release/Tooling); CLAUDE.md -> @AGENTS.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: adopt galax-io AGENTS/CLAUDE guide",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T04:08:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3abae2b5277fddbea38786087d90252c4f721685",
"body": "ci.yml is test-only; release.yml is tag-driven (validate tag on main/release/*, sbt ci-release to Sonatype, git-cliff notes via cliff.toml). Third-party release actions are SHA-pinned. Manual vX.Y.Z tags replace auto-tag-on-main.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(release): generate release notes with git-cliff; split ci/release",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T04:08:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "695df5dd2999fd74dca3b8e99e77da79815373a7",
"body": "pre-commit runs 'sbt scalafmtAll scalafmtSbt' and re-stages the commit's files (-batch + closed stdin so a failure aborts, not hangs); compile+tests stay in CI. install-hooks.sh wires core.hooksPath.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(hooks): add scalafmt pre-commit git hook",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T04:08:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "df6f05df6d5f58e5e00eacaaef70230f2a578fdc",
"body": "sbt-git's JGit reader throws NoWorkTreeException in linked git worktrees (.git is a file). useReadableConsoleGit shells out to the git CLI for read-only ops, fixing project load from worktrees.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "build: read git via console so sbt loads in worktrees",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T04:08:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0a3b2936320b3ed519a0ee43d6c3621cddbb5a16",
"body": "specify init + extensions (bug, git, worktrees, harness, spectest, changelog) and the claude-ask-questions preset, via setup-speckit.sh. Adds .specify/, .claude/skills/, specs/.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(speckit): install spec-kit toolkit",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T04:08:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "172ca7983eb87438e594e50e2358e843dedceb3d",
"body": "check-linkage.sh enforces the issue<->PR<->milestone contract; a PreToolUse(Bash) hook (.claude/settings.json) runs it as a release-tag gate. Ignore local Claude state in .gitignore.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(process): add issue/PR/milestone linkage guard",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-12T04:08:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e55fff5cbc81c80bae9725a21318945ee04fdfe9",
"body": "Metals auto-generates .mcp.json (local MCP server pointer with an\nephemeral port), .metals/, .bloop/ and project/metals.sbt on build\nimport. None of these belong in version control.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: gitignore Metals/Bloop artifacts and generated .mcp.json",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-07-10T12:33:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a8d0401bd92ea694f5f550dd279e61d5581408c3",
"body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update compatibility table for 1.0.0 (Java 11+)",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T15:33:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d5858621db2361ddd8ed800cc90cd130aadbaecf",
"body": "Removed:\n- transaction() — does not exist in codebase\n- row(index), column(name), cell(name, rowIndex) checks — do not exist\n- Incorrect insertInto signature showing Scala varargs instead of\n Columns() wrapper\n\nAdded:\n- rawSql() action — existed but undocumented\n- batch() action with insert and upd\n[…]\niver version 42.7.4 → 42.7.11\n- Quick-start check examples use real API (simpleCheck)\n- Java/Kotlin minimal examples use simpleCheckType enum\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: fix README to match actual API surface",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T15:07:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c84146b0e668aa2ecb9ae7108793649014038e9c",
"body": "BREAKING CHANGE: ActionBase trait signature changed — added new members\n(now, reportError, crashOnFailure, resolveParams) and self-type\nconstraint (self: ChainableAction). External mixins of ActionBase will\nneed to update.\n\nExtract repeated ~15-line failure/crash blocks from DBQuery, DBRawQuery,\nDBI\n[…]\ned JDBC execution\n- crashOnFailure — validation crash handler (logRequestCrash + KO)\n- resolveParams — Expression[Any] → Map[String,Any] fold\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(actions)!: extract shared error handling into ActionBase",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T15:01:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ac7377b2f7e1ec0a192df615434de730d2a3fd8b",
"body": "- Remove StatementWrapper.addBatch/executeBatch — batch path uses\n PreparedStatementWrapper; these were never called.\n- Remove setInt/setDouble/setString/setLong/setObject/setBoolean/\n setTimestamp/registerOutParameter from PreparedStatementWrapper and\n CallableStatementWrapper public traits — only called inside each\n Impl's setParams, now private.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(db): narrow statement wrapper traits, remove dead batch methods",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T15:01:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b4aa4a90092a702da812433fb678d5d09170efef",
"body": "Orphaned by the prepared-statement migration (#38) — only their own\ntests referenced them. Also an injection-shaped raw-value string\ninterpolator; removing it is a net security improvement.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(db): remove dead substituteParams/paramValueToSql",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T15:01:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bc059652d736b9b7844a23ebf1c71367a0b8765c",
"body": "- sbt 1.12.2 → 1.12.11\n- sbt-scalafmt 2.5.6 → 2.6.1 (unblocked by sbt upgrade)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(deps): update sbt and sbt-scalafmt",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T14:21:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7397650ae739d3a1993f9b6cd36c815d3485c26c",
"body": "- HikariCP 7.0.2 → 6.3.0 (Java 11+ branch)\n- scalatest 3.2.19 → 3.2.20\n- testcontainers 1.20.4 → 1.21.0\n- postgresql-jdbc 42.7.4 → 42.7.11\n- sbt-scalafmt 2.6.1 skipped — requires sbt 1.12.9+, current 1.12.2\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(deps): update dependencies to latest stable",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T14:20:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e5d1a35e769da20b92af8b89cfeb1326ceb7a5ad",
"body": "…#46)\n\n* fix(protocol): tighten API visibility and null safety\n\n- Make JdbcProtocol.blockingPoolSize private[protocol] — impl detail,\n no external callers; prevents accidental case class pattern match dependency\n- Change Java API Integer params to int primitives for maximumPoolSize,\n minimumIdleCo\n[…]\nly@anthropic.com>\n\n* style: reformat JdbcProtocol case class parameters\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(protocol): bounded thread pool and proper JDBC resource cleanup (…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T13:54:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e1b812e5cc77378df6bc6e9b8c6a266957cebfdb",
"body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: track AGENTS.md and CLAUDE.md, remove from .gitignore",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T13:54:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "15be2e2f038eb36f1c50301349207801c0933fbd",
"body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: expand AGENTS.md with full project agent instructions",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T13:38:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0ea52c9174db5ee23ae3fb322f4952c375c4c4ea",
"body": "The plugin does not ship vendor JDBC drivers. New users hit classpath\nerrors without knowing they need to add the driver themselves.\nAdds copy-paste snippets for PostgreSQL, MySQL, SQL Server, and Oracle\nwith sbt/Gradle/Maven examples. Quick start now references this section.\n\nFixes galax-io/gatling-jdbc-plugin#23",
"is_bot": false,
"headline": "docs: add Database Driver Dependencies section",
"author_name": "i.akhaltsev",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T11:37:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5f0532ce260667e6da4773d792e57d3b7d98c8d9",
"body": "The DockerTest tag/suite does not exist on main. Integration tests use\nTestcontainers (PostgreSQLIntegrationSpec) and run via plain sbt test.\n\nFixes galax-io/gatling-jdbc-plugin#32",
"is_bot": false,
"headline": "docs: replace non-existent DockerTest command with real test workflow",
"author_name": "i.akhaltsev",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T11:37:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69b2a5cdd96445e4a6e999fc480157e0d4697233",
"body": "org.galaxio.gatling.jdbc.javaapi -> org.galaxio.gatling.javaapi\n\nFixes galax-io/gatling-jdbc-plugin#31",
"is_bot": false,
"headline": "docs: fix Java and Kotlin imports to use real javaapi package path",
"author_name": "i.akhaltsev",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T11:37:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f20503baa79227fa6ba43beb140930891e130425",
"body": "Fixes galax-io/gatling-jdbc-plugin#30",
"is_bot": false,
"headline": "docs: fix compatibility matrix to reflect Gatling 3.13.x on main",
"author_name": "i.akhaltsev",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T11:37:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd7de89deeb93b713bacd6b761ae31f90275fe24",
"body": "… (#44)\n\n[[scala.None]] and [[scala.concurrent.duration.Duration.Zero]] fail\nScaladoc generation in Scala 2.13 (-Xfatal-warnings). Replace with\nplain-text references so `sbt doc` and the Release job succeed.\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(docs): replace unresolvable Scaladoc links in JdbcProtocolBuilder…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T02:55:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "38e0d15673d29fae050661113f48929afcb9d66f",
"body": "…(#43)\n\nAdds PostgreSQLIntegrationSpec exercising real JDBC behavior against a\nPostgreSQL container: happy-path query/update/batch, invalid SQL error\npropagation, connectivity failure, slow query (pg_sleep), server-side\nstatement_timeout, parallel execution (20 concurrent queries), and\nconnection cleanup verification after both success and failure.\n\nFixes galax-io/gatling-jdbc-plugin#24\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add Testcontainers PostgreSQL integration suite for JDBCClient …",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T02:44:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0a5d8f61c1a01bf08aaeaebede4b86ca1e0676af",
"body": "… + Java API) (#42)\n\n* fix: implement OUT parameter extraction for stored procedures\n\n- JDBCClient.call now returns Map[String,Any] of OUT param values (instead of update-count Int)\n- CallableStatementWrapper gains getOutParams to read registered OUT params after execute\n- DBCallAction stores each O\n[…]\nrait; deduplicate CaptureAction/TestContext/noOpExit/fixedClock (Fix 5)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: implement OUT parameter extraction for stored procedures (Scala…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T01:13:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fa87df9dc20a30a430581f4c4acf17245ff3ab58",
"body": "…ion failure (#41)\n\n* test: add unit regression tests for ResourceFut, SQL mapping, and action failure\n\nExtends ResourceFutSpec with coverage of the happy path, acquire failure,\nrelease call-count invariants, same-exception suppression guard, and all\nfour combinators (pure, liftFuture, map, flatMap)\n[…]\nmVal variant (Int, Long, Double, Boolean, String, Date, UUID, Null) as well\nas explicit withParams binding and withOutParams.\n\nFixes galax-io/gatling-jdbc-plugin#34\n\n* style: apply scalafmt formatting",
"is_bot": false,
"headline": "feat: add unit regression tests for ResourceFut, SQL mapping, and act…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-31T01:12:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b4ebb71056179df8ec866b9878269cb104153094",
"body": "…EventLoopGroup leak in tests (#40)\n\nCo-authored-by: Fix Agent <bot@fix-agent.local>",
"is_bot": false,
"headline": "fix: round up sub-second queryTimeout to 1s, document semantics, fix …",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-30T22:22:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b1b8ad2483b2c147a14b2e11ee9a04991fe287e0",
"body": "…ion (#38)\n\n* fix: use prepared statements in batch execution to prevent SQL injection\n\nReplace plain Statement string-substitution in batch() with per-query\nPreparedStatement execution inside a single transaction, so string values\ncontaining single-quotes (and other special characters) are safely\np\n[…]\nn a\nmid-batch statement fails. Added regression test verifying that a\nmid-batch PK violation rolls back all preceding successful statements.\n\n---------\n\nCo-authored-by: Fix Agent <bot@fix-agent.local>",
"is_bot": false,
"headline": "fix: use prepared statements in batch execution to prevent SQL inject…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-30T22:20:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "61ea472153813b6505386e5c58496d82138cf2e6",
"body": "* fix: mark Gatling session as failed when JDBC execution returns KO\n\nAll JDBC action failure paths (executeSelect exception, executeUpdate\nerror, batch error, call error, executeRaw exception) now call\nsession.markAsFailed before passing the session to executeNext.\nThis aligns raw SQL, query, inser\n[…]\nQueryAction \"should forward a failed session to\nnext when SQL is invalid\" to fail.\n\n---------\n\nCo-authored-by: Fix Agent <bot@fix-agent.local>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: mark Gatling session as failed when JDBC execution returns KO (#35)",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-30T22:08:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d0a33ae36f289b102b4574071be615fcc36b3616",
"body": "…s (#36)\n\n* fix: preserve original JDBC exception when resource cleanup also fails\n\nWhen both the primary operation and the release step fail, the original\nexception is now always surfaced. The cleanup exception is attached as\na suppressed exception on the primary so it remains accessible without\nma\n[…]\n in CI but not locally.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Fix Agent <bot@fix-agent.local>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: preserve original JDBC exception when resource cleanup also fail…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-30T22:07:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "549b68992a52851dd45ec69bc975280fa23e9875",
"body": "… API (#37)\n\n* fix: implement queryTimeout builder method and align README docs\n\nAdds queryTimeout(FiniteDuration) to JdbcProtocolBuilderConnectionSettingsStep\n(Scala) and JdbcProtocolBuilderConnectionSettingsStep (Java), propagating the\nvalue through JdbcProtocolBuilder and JdbcProtocol down to JDB\n[…]\nded four JdbcProtocolBuilderSpec tests covering queryTimeout flow-through,\n None default, zero (no-limit) semantics, and negative rejection\n\n---------\n\nCo-authored-by: Fix Agent <bot@fix-agent.local>",
"is_bot": false,
"headline": "fix: implement queryTimeout and align README with JdbcProtocolBuilder…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-30T21:34:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d3be6dc4df99791f67e767307c75f836ab23b9f0",
"body": "Added `case (k, null) => (k, NullParam)` to the pattern match in\nwithParamsMap before the catch-all, so Java/Kotlin callers that pass\nactual null values no longer trigger a NullPointerException from\nv.toString. Extended UtilsSpec to cover the full withParamsMap path\nwith a null value in addition to the existing expression-layer test.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: handle null values in withParamsMap to prevent NPE",
"author_name": "Fix Agent",
"author_login": null,
"committed_at": "2026-05-30T21:34:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7399d5808374ba928dc127601c56ec30515d70ca",
"body": null,
"is_bot": false,
"headline": "style: apply scalafmt formatting",
"author_name": "Fix Agent",
"author_login": null,
"committed_at": "2026-05-30T21:34:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0eb724065470fbc177592636ab5548bd418b215c",
"body": "…to strings\n\nPreviously Utils.getSeq() called .toString() on every Map value before passing\nit to Expressions.toExpression(), converting ints, longs, booleans, UUIDs, and\nother typed values into Strings. This caused divergence from the Scala DSL and\ncould silently bind wrong JDBC types at runtime.\n\n\n[…]\nticValueExpression()\nto preserve the original Java type for correct JDBC binding.\n\nRegression tests cover int, long, boolean, UUID, double, null, and EL strings.\n\nFixes galax-io/gatling-jdbc-plugin#26",
"is_bot": false,
"headline": "fix: preserve typed Java/Kotlin parameter values instead of coercing …",
"author_name": "Fix Agent",
"author_login": null,
"committed_at": "2026-05-30T21:34:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "321bc0c1b339ef04b9ba9dc7ed44d2d4b723fedc",
"body": null,
"is_bot": false,
"headline": "chore: update .gitignore",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-30T20:44:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "835038402e50ae9def2b1b6159655115e976b334",
"body": "…ser exit\n\n`ProtocolComponents.onExit` fires for every virtual user — closing the shared\ndatasource on the first exit would race with all remaining in-flight JDBC calls.\n\nRegister cleanup via `actorSystem.registerOnTermination`, which fires exactly\nonce when the simulation actor system shuts down. `onExit` remains a no-op.\n\nCloses #22\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(protocol): close JDBC resources at simulation shutdown, not per-u…",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-25T21:12:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c9a2e0bd42906574f0dab00f255d1df8a9775f81",
"body": "`newCachedThreadPool()` spawned unlimited native threads when JDBC calls\nqueued under load. Replaced with `newFixedThreadPool(blockingPoolSize)`\nbacked by a named daemon-thread factory.\n\n`blockingPoolSize` is a new DSL option that defaults to `maximumPoolSize`.\nAdded scalatest for unit specs; verifi\n[…]\nCClientThreadingSpec\nthat thread count is capped under concurrent blocked JDBC calls.\n\nCloses #22 (partial — resource cleanup in next commit)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(protocol): replace unbounded thread pool with bounded fixed pool",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-25T21:12:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9c6ae89efdbaf2e98d7afbf2f692e4d9abb0074c",
"body": null,
"is_bot": false,
"headline": "feat: align main with gatling 3.13",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-19T00:30:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6447ab4db27fe667152159be51f5b1c86255c6c3",
"body": null,
"is_bot": false,
"headline": "feat: merge latest/gatling into main",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-19T00:20:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "608c37a735e5c347233feb1cfe68a71d0f89ef0a",
"body": null,
"is_bot": false,
"headline": "fix(jdbc): support gatling 3.12",
"author_name": "John Axe",
"author_login": "jigarkhwar",
"committed_at": "2026-05-19T00:11:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d9307417d107df2052158b90fc1203725197b074",
"body": null,
"is_bot": false,
"headline": "docs: fix compatibility table — suffix-based versioning",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-17T13:09:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fa93a04dc5c6fe38a0c58268d147d8d132f53142",
"body": null,
"is_bot": false,
"headline": "docs: fix compatibility table — suffix-based versioning",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-17T13:08:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0bba942b33ed8e33beabb3b215314d8252e0d8ff",
"body": "…ick start",
"is_bot": false,
"headline": "docs: unified README with compatibility table, ToC, and 3-language qu…",
"author_name": "John",
"author_login": "jigarkhwar",
"committed_at": "2026-05-17T12:53:19Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 39,
"commits_last_year": 116,
"latest_release_at": "2026-07-23T05:03:30Z",
"latest_release_tag": "v1.5.0",
"releases_from_tags": false,
"days_since_last_push": 3,
"active_weeks_last_year": 9,
"days_since_latest_release": 5,
"mean_days_between_releases": 5.8
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 4,
"stars": 9,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2024-12-12",
"count": 1
},
{
"date": "2025-12-18",
"count": 1
},
{
"date": "2026-05-04",
"count": 1
},
{
"date": "2026-07-10",
"count": 1
}
],
"complete": true,
"collected": 4,
"total_forks": 4
},
"star_history": null,
"open_issues_and_prs": 32
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 14153,
"source_files_sampled": 109,
"oversized_source_files": 0,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 11237
},
"dependencies": {
"manifests": [],
"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": [],
"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": 1,
"merged_prs": 51,
"open_issues": 31,
"closed_ratio": 0.693,
"closed_issues": 70,
"closed_unmerged_prs": 10
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "jigarkhwar",
"commits": 110,
"avatar_url": "https://avatars.githubusercontent.com/u/11795372?v=4"
},
{
"type": "User",
"login": "slandelle",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/849197?v=4"
},
{
"type": "User",
"login": "jGleitz",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/4305652?v=4"
}
],
"contributors_sampled": 3,
"top_contributor_share": 0.932
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml",
"scala-steward.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "6 out of 6 merged PRs checked by a CI test -- score normalized to 10",
"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/6 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"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": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 2,
"reason": "dependency not pinned by hash detected -- score normalized to 2",
"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": "01abbf728c72151a83f176adf65aca501d5ef30e",
"ran_at": "2026-07-29T03:51:36Z",
"aggregate_score": 4.9,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-26T03:24:45Z",
"oldest_open_prs": [
{
"number": 163,
"created_at": "2026-07-26T03:24:36Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-23T04:52:08Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 94,
"created_at": "2026-07-10T20:42:28Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 95,
"created_at": "2026-07-10T20:42:30Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 96,
"created_at": "2026-07-10T20:42:32Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 99,
"created_at": "2026-07-10T20:42:38Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 101,
"created_at": "2026-07-10T20:42:42Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 102,
"created_at": "2026-07-10T20:42:44Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 103,
"created_at": "2026-07-10T20:42:46Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 104,
"created_at": "2026-07-10T20:42:48Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 105,
"created_at": "2026-07-10T20:42:50Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 106,
"created_at": "2026-07-10T20:42:52Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 108,
"created_at": "2026-07-10T20:42:55Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 109,
"created_at": "2026-07-10T20:42:58Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 110,
"created_at": "2026-07-10T20:43:00Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 111,
"created_at": "2026-07-10T20:43:02Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 112,
"created_at": "2026-07-10T20:43:04Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 113,
"created_at": "2026-07-10T20:43:06Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 114,
"created_at": "2026-07-10T20:43:08Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 115,
"created_at": "2026-07-10T20:43:11Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 116,
"created_at": "2026-07-10T20:43:13Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 117,
"created_at": "2026-07-10T20:43:15Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/galax-io/gatling-jdbc-plugin",
"host": "github.com",
"name": "gatling-jdbc-plugin",
"owner": "galax-io"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"security": 49,
"vitality": 82,
"community": 33,
"governance": 44,
"engineering": 65
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 82,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"commits_last_year": 116,
"human_commit_share": 0.91,
"days_since_last_push": 3,
"active_weeks_last_year": 9
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "9/52 weeks with commits",
"points": 6.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 9
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "116 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 116
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 39,
"latest_release_tag": "v1.5.0",
"releases_from_tags": false,
"days_since_latest_release": 5,
"mean_days_between_releases": 5.8
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "39 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 39
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~5.8 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 5.8
}
}
],
"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": 5,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 5 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 5
}
}
],
"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": 33,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 19,
"inputs": {
"forks": 4,
"stars": 9,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "9 stars",
"points": 14.6,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 9
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "4 forks",
"points": 4,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 4
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"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": "at_risk",
"name": "Sustainability & Governance",
"value": 44,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 18,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 3,
"top_contributor_share": 0.932
},
"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 93% of commits",
"points": 1.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 93
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "3 contributors",
"points": 4.1,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 3
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"merged_prs": 51,
"open_issues": 31,
"closed_issues": 70,
"issue_closed_ratio": 0.693,
"closed_unmerged_prs": 10
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "69% of issues closed",
"points": 32.4,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 69
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "51/61 decided PRs merged",
"points": 32,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 51,
"decided": 61
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/6 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"followers": 18,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "galax-io",
"public_repos": 15,
"account_age_days": 1009
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "18 followers of galax-io",
"points": 9.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 18,
"login": "galax-io"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "15 public repos, account ~2 yr old",
"points": 14.3,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 15
}
},
{
"code": "account_age_years",
"params": {
"years": 2
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 65,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 68,
"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": "6 out of 6 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"gatling",
"performance",
"performance-testing",
"jdbc",
"gatling-plugin",
"hikaricp",
"java",
"kotlin",
"load-testing",
"mysql",
"postgresql",
"scala"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "12 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 12
}
}
],
"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": "at_risk",
"name": "Security",
"value": 49,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 49,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.9
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "6 out of 6 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"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/6 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"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": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 2",
"points": 1,
"status": "partial",
"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": 3
},
"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": 64,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 11237
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md"
}
}
],
"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": "91 of 91 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 91,
"sampled": 91
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 45,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.73,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "Scala (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Scala"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "73 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 73,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 2",
"points": 2,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Scala",
"largest_source_bytes": 14153,
"source_files_sampled": 109,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Scala (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Scala"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/109 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 109,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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-29T03:51:52.651822Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/galax-io/gatling-jdbc-plugin.svg",
"full_name": "galax-io/gatling-jdbc-plugin",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}