-- Migration 007: durable session workbench placement, keyed by namespace -- generation. Every session (including pre-existing ones) gets an explicit -- local placement row; absence is never a guess. BEGIN IMMEDIATE; CREATE TABLE session_placements ( session_id TEXT NOT NULL REFERENCES sessions(id), namespace_generation TEXT NOT NULL, placement TEXT NOT NULL CHECK(json_valid(placement)), created_ms INTEGER NOT NULL CHECK(created_ms >= 0), PRIMARY KEY (session_id, namespace_generation) ) STRICT; CREATE INDEX idx_session_placements_session ON session_placements(session_id, created_ms); -- Existing sessions upgrade to an explicit Local binding: unambiguously -- local, not NULL-means-guess. The generation marker identifies the -- pre-M1 binding; a relocate always mints a fresh generation instead. INSERT INTO session_placements (session_id, namespace_generation, placement, created_ms) SELECT s.id, 'm0-legacy', '{"kernel_target":{"placement":"local"},"namespace_id":"main","namespace_generation":"m0-legacy"}', CAST(strftime('%s','now') AS INTEGER) * 1000 FROM sessions s WHERE NOT EXISTS ( SELECT 1 FROM session_placements p WHERE p.session_id = s.id ); PRAGMA user_version = 7; COMMIT;