Epic 15 / Story 15.2 — the elasticsql slice of the daily product-instance telemetry ping (stacked on #111 / feature/15.3).
Scope (elasticsql, default JDK, cross-compiled 2.12+2.13)
licensing/.../package.scala (A11): LicenseType.values; new sealed trait ProductType extends Feature + object ProductType; AdbcDriver replaces OdbcDriver, Repl added; Feature.values/fromString/toSnakeCase now 8 entries (snake jdbc_driver|adbc_driver|flight_sql|federation|repl).
- NEW
TelemetryConfig.load reading the NEW top-level softclient4es.telemetry.enabled opt-out (A8), DISTINCT from softclient4es.license.telemetry.enabled; NEW softclient4es.telemetry { enabled = true } block in reference.conf.
- NEW
LicenseRefreshStrategy.emitInstancePing(...) seam (A15, default no-op) so the REPL (core, Apache) can emit the ping through the strategy without depending on the ELv2 extensions transport.
- REPL (
Repl.scala): session timing, commands_executed counted in executeStatement+executeBatch (NOT the shared executeStatementDirect — OQ-3/P3), session-end ping with a ~2s bounded await, >24h daily timer; executors widened to ElasticClientApi to reach the strategy.
Tests
FeatureSpec/FeatureFromStringSpec/LicenseKeySpec/LicenseManagerSpec updated (8 features, AdbcDriver/Repl); NEW ProductTypeSpec + TelemetryConfigSpec. 62 licensing tests pass; cross-compile clean 2.12+2.13.
🤖 Generated with Claude Code
Epic 15 / Story 15.2 — the elasticsql slice of the daily product-instance telemetry ping (stacked on #111 / feature/15.3).
Scope (elasticsql, default JDK, cross-compiled 2.12+2.13)
licensing/.../package.scala(A11):LicenseType.values; newsealed trait ProductType extends Feature+object ProductType;AdbcDriverreplacesOdbcDriver,Repladded;Feature.values/fromString/toSnakeCasenow 8 entries (snakejdbc_driver|adbc_driver|flight_sql|federation|repl).TelemetryConfig.loadreading the NEW top-levelsoftclient4es.telemetry.enabledopt-out (A8), DISTINCT fromsoftclient4es.license.telemetry.enabled; NEWsoftclient4es.telemetry { enabled = true }block inreference.conf.LicenseRefreshStrategy.emitInstancePing(...)seam (A15, default no-op) so the REPL (core, Apache) can emit the ping through the strategy without depending on the ELv2 extensions transport.Repl.scala): session timing,commands_executedcounted inexecuteStatement+executeBatch(NOT the sharedexecuteStatementDirect— OQ-3/P3), session-end ping with a ~2s bounded await, >24h daily timer; executors widened toElasticClientApito reach the strategy.Tests
FeatureSpec/FeatureFromStringSpec/LicenseKeySpec/LicenseManagerSpecupdated (8 features, AdbcDriver/Repl); NEWProductTypeSpec+TelemetryConfigSpec. 62 licensing tests pass; cross-compile clean 2.12+2.13.🤖 Generated with Claude Code