- modules/data_table/MIGRATION.md: porting guide + release checklist 1.0.0-stable
- data_table.md: growth log entry commented for post-gate bump
- data_table.md: fix error_type Go remnant ("error_go_core" -> "") in C++ module
- cpp/CMakeLists.txt: SQLite3 optional dep for data_table_bench (cross-windows)
- agent_cleanup_worktree.go: !windows build tag (uses unix-only syscalls)
- dev/issues/0133-cpp-data-table-10m-rows.md: issue tracking
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.4 KiB
data_table MIGRATION guide
Referencia para apps que migran a v1.0.0 estable del modulo data_table.
La version de modulo (module.md) es semver independiente del entrypoint (data_table.md).
Este documento cubre el salto al hito de estabilidad 1.0.0, no versiones intermedias.
v2.x → estabilidad 1.0.0 (pendiente gate 0133)
What changed (internals — no API change)
Las optimizaciones planificadas en issue 0133 son transparentes para el caller. La API publica (data_table.h) no cambia.
| Cambio interno | Impacto en caller |
|---|---|
| Columnar snapshot interno (agente B) | Ninguno. TableInput.cells sigue siendo row-major caller-owned. |
| String interning de celdas en snapshot | Ninguno. Misma interfaz de lectura. Strings siguen viviendo en el caller. |
Lazy visible_rows (filter + sort diferidos) |
Ninguno. render() sigue siendo una sola llamada por frame. |
| Display cache per-cell | Ninguno. La cache es opaca al caller. |
| OpenMP en compute (agente A bench gate) | Ninguno. Threading interno, thread-safety invariante: llamar solo desde el main thread de ImGui. |
What you must do
Nada, si usas la API publica.
data_table::render(id, tables, st, events_out, show_chrome)— firma identica.TableInput,State,TableEvent,ColumnSpec,ColorRule— sin cambios de layout.- Back-compat overload
render(id, tables, st, show_chrome)— sigue compilando.
Casos especificos:
| Situacion | Accion |
|---|---|
Guardabas punteros a TableInput.cells entre frames |
Sigue valido. El caller es dueno de cells; el modulo no lo mueve ni libera. |
Usabas data_table_internal.h directamente |
Rebuild obligatorio. El header es privado del modulo — si lo incluias, estabas fuera del contrato. No se garantiza estabilidad de UiState ni de los helpers internos. |
Enlazan fn_table_viz (target antiguo) |
Reemplazar por fn_module_data_table. El target fn_table_viz fue deprecado en v1.4.0 (2026-05-16). |
Behavior contracts preserved
Estos contratos estan FROZEN en v1.0.0 y no pueden romperse sin major version bump:
- Bit-identical rendering: misma entrada → misma salida visual (excepto antialiasing de ImGui).
TableEvent.rowindexaTableInput: los indices de fila en eventos (ButtonClick,RowDoubleClick,RowRightClick) referencian la tabla de entrada original, no el snapshot interno ni la vista filtrada.stats_last_cellspointer-identity sentinel: el campoState::stats_last_cellsse usa internamente para detectar cambio de datos. Si el caller pasa el mismo punterocellsen frames consecutivos, el modulo reutiliza la cache de stats. Cambiar el puntero (aunque el contenido sea igual) invalida la cache — comportamiento documentado y frozen.events_outsolo hacepush_back:render()nunca llamaclear()niresize()sobre el vector del caller. El caller limpia antes de cada frame si no quiere acumulacion.show_chrome = truepor defecto: el overload de back-compat sinshow_chromepasatrue.Statees caller-managed: el modulo no alloca ni libera elState. El caller lo destruye cuando quiere.
New (optional, v1.0.0+)
(placeholder — se documentaran aqui las features opt-in que lleguen post-gate)
Backwards compatibility policy
La API publica de data_table::render, TableInput, State, TableEvent, ColumnSpec y ColorRule esta FROZEN en v1.0.0.
- Breaking changes (cambiar firma, quitar campo, cambiar semántica de parametro existente) requieren major version bump y un periodo de coexistencia con el path anterior.
- Additive changes (nuevo campo en struct con default sensato, nuevo overload, nuevo
CellRendererenum value) son minor — consumidores existentes no necesitan cambios. - Bugfixes y optimizaciones internas son patch — sin cambio de contrato.
Apps consumidoras que solo usen #include "data_table/data_table.h" y #include "core/data_table_types.h" no necesitan cambios en minor y patch bumps.
Porting desde el playground (pre-registry)
Si tu app usaba el playground original (cpp/apps/primitives_gallery/playground/tables/data_table.h):
-
Cambiar include path:
// Antes #include "tables/data_table.h" #include "tables/data_table_types.h" // Despues #include "data_table/data_table.h" #include "core/data_table_types.h" -
Cambiar target CMake:
# Antes target_link_libraries(mi_app PRIVATE fn_table_viz) # Despues target_link_libraries(mi_app PRIVATE fn_module_data_table) -
app.md: declararuses_modules: [data_table_cpp]en lugar de listar funciones miembro individualmente. -
Namespace identico:
data_table::render,data_table::State,data_table::TableInput— sin cambios. -
data_table_logic.heliminado: los helpers internos del playground (row_to_tsv, drill, view_mode, etc.) eran privados. En el modulo sonstaticendata_table.cpp. Si los necesitabas externamente, estan fuera del contrato — contactar para evaluar si deben promoverse al registry.
Release checklist (gate 0133 — NO ejecutar hasta A+B listos)
Pasos exactos para ejecutar cuando agentes A y B completen su trabajo:
-
Bench gate:
data_table_bench --rows 10000000debe reportarfps_p1 >= 60. El agente A construye el bench; esta metrica es el prerequisito de estabilidad. -
fn doctor clean:
fn doctor cpp-appsdebe pasar sin nuevosCANDIDATE(tablas inline sin migrar en apps consumidoras). Indica que todos los consumidores usan el modulo correctamente. -
Build 11 consumidores: compilar los 11 apps que linkean
fn_module_data_tablesin errores ni warnings nuevos. Verificar con:cd cpp/build && cmake --build . --target \ registry_dashboard kanban dag_engine_ui services_monitor \ graph_explorer chart_demo 2>&1 | grep -E "error:|warning:"(ajustar lista de targets segun
fn doctor cpp-appsoutput) -
Version bump:
/version modules/data_table minor "estable 1.0.0 + columnar + 10M rows"Esto bumpa el campo
version:enmodule.md(actualmente2.1.0) a3.0.0(major bump porque el modulo alcanza estabilidad contractual) o al numero que corresponda segun la politica semver del proyecto en ese momento.Nota:
data_table.mdtiene version1.5.0(entrypoint).module.mdtiene2.1.0(modulo). El bump de "estabilidad 1.0.0" es un hito de politica — el numero exacto lo decide el operador segun cual de los dos .md es la fuente de verdad para el semver del modulo. -
Tag stable: en
module.mdfrontmatter, anadirtags: [stable]al array existente[tables, viz, ui, imgui, tql, cpp]. -
Capability growth log: descomentar la entrada preparada en
data_table.md(ver seccion al final del archivo), rellenando la fecha realYYYY-MM-DD. -
Push + tag git:
git add modules/data_table/module.md modules/data_table/data_table.md git commit -m "feat(data_table): stable 1.0.0 — columnar + 10M rows gate passed" git tag data_table/v1.0.0 git push && git push --tags
Inconsistencias detectadas en doc actual
Las siguientes inconsistencias fueron detectadas durante la preparacion de este documento. No bloquean el gate pero conviene resolver antes del bump:
-
Version drift entre los dos .md:
data_table.mdtieneversion: 1.5.0ymodule.mdtieneversion: 2.1.0. Son versionados independientemente pero no esta documentado explicitamente cual es la "version publica" del modulo. Recomendacion: clarificar enmodule.mdque su version es la del modulo como unidad ydata_table.mdes la del entrypoint como funcion del registry. -
error_type: "error_go_core"endata_table.md: la funcion es C++ pura (no retornaerrorde Go). El campoerror_typedel frontmatter parece heredado del template Go. No afecta el comportamiento pero es semanticamente incorrecto para un entrypoint C++. -
testsarray endata_table.mdapunta acpp/tests/test_column_specs.cpppero la documentacion dice "No hay tests unitarios directos". Los tests listados son del harness de compilacion (cpp/tests/), no del entrypoint en si. Aclarar en## Notasque eltest_file_pathreferencia tests de compilacion/link, no tests de render. -
llm_anthropic_cpp_coreenmodule.mduses_functions perodata_table.mdno lo lista (stub interno). Alinear: si el stub es interno al modulo, deberia estar enmembers, no enuses_functions.