You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Port the data layer of genesis/webui/backend_server.py (~707 lines) to the Rust service. Current endpoints to cover:
GET /api/experiments — run list
GET /api/experiments/{run_id}/programs — population for a run
GET /api/experiments/{run_id}/programs/{program_id} — program detail (code, metrics, parent/inspirations)
GET /api/experiments/{run_id}/stats — per-generation aggregates (feeds the fitness/novelty charts)
GET /api/experiments/{run_id}/lineage — parent-edge graph (feeds the lineage tree)
GET /api/database/info
Notes
Use the clickhouse crate with typed row structs. Watch the usual clickhouse-rs typed gotchas (nullable columns, (U)Int width mismatches fail at deserialize time, not compile time).
Decide and document: the legacy sqlite db_path mode (/list_databases, /get_programs) — port it or explicitly drop it. If ClickHouse has been the real store since the CLICKHOUSE_INTEGRATION work, dropping legacy sqlite in the rewrite is the simpler call; record it in the issue when decided.
These land as internal query functions returning typed structs; whether they stay exposed as JSON routes or become fragment-renderers only is settled by #28 (fragments are the product — JSON routes are only needed if something else consumes them).
Update 2026-08-05 (#32): the read model targets Turso embedded (in-process, turso crate), not the clickhouse crate — land the #32 spike first, then port these queries against the Turso schema. The golden-file parity idea survives: same data loaded into both stores, diff the responses. The legacy-sqlite question is resolved by #32 (superseded).
Depends on #26.
Port the data layer of
genesis/webui/backend_server.py(~707 lines) to the Rust service. Current endpoints to cover:GET /api/experiments— run listGET /api/experiments/{run_id}/programs— population for a runGET /api/experiments/{run_id}/programs/{program_id}— program detail (code, metrics, parent/inspirations)GET /api/experiments/{run_id}/stats— per-generation aggregates (feeds the fitness/novelty charts)GET /api/experiments/{run_id}/lineage— parent-edge graph (feeds the lineage tree)GET /api/database/infoNotes
clickhousecrate with typed row structs. Watch the usual clickhouse-rs typed gotchas (nullable columns, (U)Int width mismatches fail at deserialize time, not compile time).db_pathmode (/list_databases,/get_programs) — port it or explicitly drop it. If ClickHouse has been the real store since the CLICKHOUSE_INTEGRATION work, dropping legacy sqlite in the rewrite is the simpler call; record it in the issue when decided.These land as internal query functions returning typed structs; whether they stay exposed as JSON routes or become fragment-renderers only is settled by #28 (fragments are the product — JSON routes are only needed if something else consumes them).
Update 2026-08-05 (#32): the read model targets Turso embedded (in-process,
tursocrate), not theclickhousecrate — land the #32 spike first, then port these queries against the Turso schema. The golden-file parity idea survives: same data loaded into both stores, diff the responses. The legacy-sqlite question is resolved by #32 (superseded).