-- 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;