The "cold run" deck left analytics/'s ClickHouse schema
unrecovered — a real parse gap in sqlparser's `ClickHouseDialect`.
RFC 0057 and RFC 0058 closed it. This deck re-analyzes the same repo, from a clean cache, to
show the actual result — and the new thing that only became visible once real column data
existed for it to happen to. Every screen here is real output, unedited, from this session.
$ ekos clean
Clean complete. 2 item(s) removed from artifact cache.
$ ekos recover
INFO running pass pass=sql-analyzer:priv/ingest_repo/structure.sql
INFO sql-analyzer complete
pass=sql-analyzer:priv/ingest_repo/structure.sql
objects=15 relationships=0
Recover complete.
SQL files analysed: 2
Passes run: 6
Before RFC 0057: falling back to empty graph. Now:
15 objects, zero WARN lines — every real
CREATE TABLE in structure.sql, including the
two CREATE DICTIONARY statements correctly stripped rather than
crashing the whole-file parse.
Object: plausible_events_db.sessions_v2 (Table) Properties: columns: [ {"data_type":"UInt64","name":"session_id"}, {"data_type":"INT8","name":"sign"}, {"data_type":"DATETIME","name":"timestamp"}, ... 40 more, including: {"data_type":"LowCardinality(FixedString(2))","name":"country_code"}, {"data_type":"Array(STRING)","name":"entry_meta.key"}, {"data_type":"LowCardinality(STRING)","name":"channel"} ] // 43 columns total Evidence: [100%] priv/ingest_repo/structure.sql — "CREATE TABLE ...sessions_v2"
events_v2 resolves the same way — 39 real columns,
correct Nullable(DECIMAL(18,3)) for the revenue fields, correct
Array(STRING) for the meta.key/meta.value pair. Every ALIAS column present.
Nothing here was true before RFC 0057 — the whole file compiled to an empty graph.
$ ekos ekl "FIND Object WHERE kind = 'Table' RETURN name"
name
plausible_events_db.sessions_v2
plausible_events_db.location_data
plausible_events_db.ingest_counters
plausible_events_db.imported_visitors
plausible_events_db.imported_sources
plausible_events_db.imported_pages
plausible_events_db.imported_locations
plausible_events_db.imported_custom_events
plausible_events_db.events_v2
plausible_events_db.schema_migrations
10 row(s).
sql-analyzer reported 15. Five real
tables — imported_operating_systems, imported_exit_pages, imported_entry_pages, imported_devices, imported_browsers — aren't in
this list. Not a parsing regression: a different pipeline stage did this.
Merge proposals (3):
...
3. 'plausible_events_db.imported_visitors' (Table)
— 6 objects merged, confidence 0.93
• imported_visitors
• imported_operating_systems
• imported_exit_pages
• imported_entry_pages
• imported_devices
• imported_browsers
All six real ClickHouse tables — crates/identity/src/lib.rs:172
scores same-kind pairs as 0.7 × name_similarity + 0.3 ×
column_Jaccard against a 0.85 default merge threshold. Every
imported_* table shares the same 8-column "spine"
(site_id, date, visitors, visits, ...) and the same name prefix — high
on both axes, for tables that are genuinely distinct in ClickHouse.
Object: plausible_events_db.imported_visitors (Table) Properties: columns: [site_id, date, visitors, pageviews, bounces, visits, visit_duration, import_id] // imported_visitors' own 8 columns only — // operating_system, exit_page, entry_page, // device, browser are gone Evidence: [100%] ...structure.sql — "CREATE TABLE ...imported_visitors" // 1 evidence entry, not 6
This isn't a labeling quirk — the five merged-away tables' own distinguishing
column and evidence are not attached to this identity at all. Anyone asking EKOS about
imported_browsers' schema today gets imported_visitors'
columns back instead.
structural_score's
column-Jaccard scoring (crates/identity/src/lib.rs:391) already
existed before RFC 0057 touched anything — it just never had real ClickHouse column data to
operate on, because every ClickHouse table compiled to an empty graph. This deck's own finding
is a direct consequence of RFC 0057/0058 succeeding, not a defect they introduced:
fixing the parser is what finally gave the identity resolver something real to over-match on.
// crates/identity/src/lib.rs:172 let combined = 0.7 * name + 0.3 * structural; // default merge_threshold: 0.85 — no per-kind // override for Table, unlike Concept's 0.95