Files
basicmachines-co-basic-memory/tests/services
phernandez a85767ad92 fix(core): purge SQLite search_index on project delete
SQLite stores search_index as an FTS5 virtual table, which can't carry a
foreign key, so the ON DELETE CASCADE from search_index.project_id to
project.id only applies on Postgres. On SQLite, deleting a project left
its FTS rows behind — and when auto-increment handed the same id to a
new project, the leftover rows masqueraded as the new tenant's data and
leaked into searches scoped to that project.

- ProjectRepository.delete now explicitly purges search_index and
  search_vector_chunks for the project id in the same session before
  the ORM delete. Idempotent on Postgres (the cascade FK still runs).
- One-time cleanup migration sweeps two leftover shapes: rows whose
  project_id is gone, and rows whose entity_id is gone (the larger
  class from id reuse). Guarded by table-existence checks so fresh
  SQLite installs — where search_index is created at runtime by
  init_search_index, not by Alembic — don't fail the upgrade.
- Regression test seeds both derived tables, calls remove_project,
  and asserts both come out clean. Verified red on pre-fix code.

Signed-off-by: phernandez <paul@basicmachines.co>
2026-05-16 11:43:16 -05:00
..