Close-out record for Epic 19 — R2a Function-Library Audit (the memo's §9 recommendation 5, lead-approved). The epic ran with per-story issues only where stories touched tracked code (19.1 → #248 / PR #249, 19.4 → #254); this issue is the epic-level record. Planning artifacts live in _bmad-output/planning-artifacts/ (local-only by design — _bmad* is gitignored).
What the audit produced (5/5 stories complete)
The decision (2026-09-01, lead-signed)
Branch 3 resolved by RE-SCOPE, not slip. Parser-ownership ADR decided: option C with option B as the R2a increment — no jOOQ anywhere in R2a. elasticsql's own parser owns all-ES relational closure (subqueries, CTEs, set operators), executed on the shipped JoinPlanner → DuckDB pipeline; jOOQ enters in R2b (Epics 26/27, narrowed per ADR Addendum A), where the option-C fallback door opens at marginal cost.
Consequences:
Handshake record (content-addressed sign-off)
- Memo as signed: sha256
f6a71ee02de28c0f2816015ce455106c240b50c20f4d2f8c12497ce911584cf5 (byte copy epic-19/verdict/out/memo-as-signed.md)
- Published (
gate: CLOSED, frontmatter-only diff, verified): sha256 7d6714fe7451de14601fa514be3a3d36ee93e0aef16dda64c0a339f27758d5b7
- Signer: Stéphane Manciot (
signoff.json; gate_outcome: cleared, adr_status_at_signing: C, denominator_confirmed: no — the unit recall was never answered and is moot under the re-scope)
- Roadmap edits: applied by
update_roadmaps.py (9 edits; the two byte-frozen passages — the Epic 22 estimate-history clause and the pre-committed decision-rule table — verified unchanged)
Related
Story issues #248 (PR #249) and #254 can be closed as complete now that the epic gate is closed. Product issues #250 #251 #252 #253 (and the jdbc/arrow siblings) stay open — they are Epic 20/21 work items.
Close-out record for Epic 19 — R2a Function-Library Audit (the memo's §9 recommendation 5, lead-approved). The epic ran with per-story issues only where stories touched tracked code (19.1 → #248 / PR #249, 19.4 → #254); this issue is the epic-level record. Planning artifacts live in
_bmad-output/planning-artifacts/(local-only by design —_bmad*is gitignored).What the audit produced (5/5 stories complete)
sbt "sql/testOnly *DialectCensusSpec".parseUnknownFunctions=IGNORE) moves 51 rows but mangles INTERVAL args; parse dialect is not a lever.absent_feature(89 = the identifier-quoting family, Identifier quoting coverage: backticks rejected in every position; double-quoted table names unparseable in FROM #252). Product issues filed from it: Parser.apply can throw ValidationError instead of returning Left on parenthesized WHERE clauses #250 Support FROM-less SELECT of literal expressions — SELECT 1 is the connection/health idiom of Tableau and Superset and is rejected #251 Identifier quoting coverage: backticks rejected in every position; double-quoted table names unparseable in FROM #252 GROUP BY without an aggregate in the SELECT list returns per-document rows instead of one row per group (silent wrong answer) #253, jdbc#32–35, arrow#166–169.epic-19-audit-verdict.md, decision rule applied → branch 3 (lead_decision).The decision (2026-09-01, lead-signed)
Branch 3 resolved by RE-SCOPE, not slip. Parser-ownership ADR decided: option C with option B as the R2a increment — no jOOQ anywhere in R2a. elasticsql's own parser owns all-ES relational closure (subqueries, CTEs, set operators), executed on the shipped JoinPlanner → DuckDB pipeline; jOOQ enters in R2b (Epics 26/27, narrowed per ADR Addendum A), where the option-C fallback door opens at marginal cost.
Consequences:
r2a-rescope-epics-20-23-draft.md): Epic 20 = BI venue enablement (jdbc#32–35, arrow#166–169, connection-guide fixes) · Epic 21 = core SQL front door (Parser.apply can throw ValidationError instead of returning Left on parenthesized WHERE clauses #250 Support FROM-less SELECT of literal expressions — SELECT 1 is the connection/health idiom of Tableau and Superset and is rejected #251 Identifier quoting coverage: backticks rejected in every position; double-quoted table names unparseable in FROM #252 GROUP BY without an aggregate in the SELECT list returns per-document rows instead of one row per group (silent wrong answer) #253) · Epic 22 = native relational closure (phases 22a–22d; JOIN queries without a join-capable extension silently return wrong results #157 loud-error fix first;terms_lookuppushdown kept) · Epic 23 = BI regression matrix seeded with the captured corpus.Handshake record (content-addressed sign-off)
f6a71ee02de28c0f2816015ce455106c240b50c20f4d2f8c12497ce911584cf5(byte copyepic-19/verdict/out/memo-as-signed.md)gate: CLOSED, frontmatter-only diff, verified): sha2567d6714fe7451de14601fa514be3a3d36ee93e0aef16dda64c0a339f27758d5b7signoff.json;gate_outcome: cleared,adr_status_at_signing: C,denominator_confirmed: no— the unit recall was never answered and is moot under the re-scope)update_roadmaps.py(9 edits; the two byte-frozen passages — the Epic 22 estimate-history clause and the pre-committed decision-rule table — verified unchanged)Related
Story issues #248 (PR #249) and #254 can be closed as complete now that the epic gate is closed. Product issues #250 #251 #252 #253 (and the jdbc/arrow siblings) stay open — they are Epic 20/21 work items.