-- 平台可靠性闭环:导出权限、对象清理、缓存 manifest 元数据。 BEGIN; ALTER TABLE model_export_jobs ADD COLUMN IF NOT EXISTS created_by TEXT; ALTER TABLE model_export_jobs ADD COLUMN IF NOT EXISTS tenant_id TEXT; ALTER TABLE model_export_jobs ADD COLUMN IF NOT EXISTS archive_status TEXT NOT NULL DEFAULT 'pending'; ALTER TABLE model_export_jobs ADD COLUMN IF NOT EXISTS archive_error TEXT; ALTER TABLE storage_objects ADD COLUMN IF NOT EXISTS deleted_at TEXT; ALTER TABLE storage_objects ADD COLUMN IF NOT EXISTS deleted_by TEXT; ALTER TABLE storage_objects ADD COLUMN IF NOT EXISTS cleanup_attempts INTEGER NOT NULL DEFAULT 0; ALTER TABLE storage_objects ADD COLUMN IF NOT EXISTS last_cleanup_error TEXT; ALTER TABLE storage_objects ADD COLUMN IF NOT EXISTS last_verified_at TEXT; ALTER TABLE storage_cache_jobs ADD COLUMN IF NOT EXISTS version_id TEXT; ALTER TABLE storage_cache_jobs ADD COLUMN IF NOT EXISTS checksum_sha256 TEXT; ALTER TABLE storage_cache_jobs ADD COLUMN IF NOT EXISTS byte_size BIGINT NOT NULL DEFAULT 0; ALTER TABLE storage_cache_jobs ADD COLUMN IF NOT EXISTS last_accessed_at TEXT; ALTER TABLE storage_cache_jobs ADD COLUMN IF NOT EXISTS protected_until TEXT; CREATE TABLE IF NOT EXISTS storage_cleanup_jobs ( id TEXT PRIMARY KEY, storage_object_id TEXT NOT NULL REFERENCES storage_objects(id) ON DELETE CASCADE, action TEXT NOT NULL DEFAULT 'delete', status TEXT NOT NULL DEFAULT 'pending', attempts INTEGER NOT NULL DEFAULT 0, error TEXT, create_time TEXT NOT NULL, completed_at TEXT ); CREATE INDEX IF NOT EXISTS idx_storage_cleanup_status ON storage_cleanup_jobs(status, create_time); COMMIT;