openvibers/openvibe.live Commits
Live: drop user_cosmetics, user_equipped and user_equipped_tag (merge on or after 2026-10-15 18:00 UTC) (#55)
Changes
nnew file mode 100644@@@ -0,0 +1,10 @@++-- phase: contract++-- after: 0002++-- ADR-054 §8: Live's cosmetics live in OpenVibe.Inventory since 2026-10-09 14:53 UTC. The import was applied and verified++-- row for row first (8 people, 153 unlocks, 16 slots), and since Live#54 nothing in Live reads or writes these three++-- (test/cosmetics-tables-gone.test.js). user_equipped_tag held 0 rows: the legacy game that wrote it is gone.++-- The N-1 release (Live#54) names none of them. Rollback: OpenVibe.Inventory holds every row (its scripts/import-live.js++-- --verify compared them); the operator-side dump taken before the deploy restores the tables if ever needed.++DROP TABLE IF EXISTS user_equipped_tag;++DROP TABLE IF EXISTS user_equipped;++DROP TABLE IF EXISTS user_cosmetics;@@@ -29,4 +29,10 @@ for (const file of [...walk(path.join(ROOT, 'server')), ...walk(path.join(ROOT,assert.deepStrictEqual(offenders, [], 'Live\'s cosmetics are OpenVibe.Inventory\'s (ADR-054 §8): read them through server/monetization/cosmetics.js');assert.ok(!fs.existsSync(path.join(ROOT, 'server/chat/tags.js')), 'the legacy chat tags left with the game');assert.ok(!/INVENTORY_AUTHORITY/.test(fs.readFileSync(path.join(ROOT, 'server/monetization/cosmetics.js'), 'utf8')), 'no switch back to Live\'s tables');--console.log('cosmetics tables: nothing under server/ or scripts/ names them');++// The contract migration drops them, after the N-1 window (it names 0002, so the migrator holds it for 7 days).++const drop = fs.readFileSync(path.join(ROOT, 'migrations', '0005_drop_live_cosmetics.sql'), 'utf8');++assert.match(drop, /^-- phase: contract$/m);++assert.match(drop, /^-- after: 0002$/m);++const dropped = [...drop.matchAll(/^DROP TABLE IF EXISTS (\w+);$/gm)].map((m) => m[1]).sort();++assert.deepStrictEqual(dropped, ['user_cosmetics', 'user_equipped', 'user_equipped_tag'], '0003 drops exactly the three');++console.log('cosmetics tables: nothing under server/ or scripts/ names them, and 0003 drops them');
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+-- phase: contract
+-- after: 0002
+-- ADR-054 §8: Live's cosmetics live in OpenVibe.Inventory since 2026-10-09 14:53 UTC. The import was applied and verified
+-- row for row first (8 people, 153 unlocks, 16 slots), and since Live#54 nothing in Live reads or writes these three
+-- (test/cosmetics-tables-gone.test.js). user_equipped_tag held 0 rows: the legacy game that wrote it is gone.
+-- The N-1 release (Live#54) names none of them. Rollback: OpenVibe.Inventory holds every row (its scripts/import-live.js
+-- --verify compared them); the operator-side dump taken before the deploy restores the tables if ever needed.
+DROP TABLE IF EXISTS user_equipped_tag;
+DROP TABLE IF EXISTS user_equipped;
+DROP TABLE IF EXISTS user_cosmetics;
@@ -29,4 +29,10 @@ for (const file of [...walk(path.join(ROOT, 'server')), ...walk(path.join(ROOT,
@@ -29,4 +29,10 @@ for (const file of [...walk(path.join(ROOT, 'server')), ...walk(path.join(ROOT,
assert.deepStrictEqual(offenders, [], 'Live\'s cosmetics are OpenVibe.Inventory\'s (ADR-054 §8): read them through server/monetization/cosmetics.js');
assert.deepStrictEqual(offenders, [], 'Live\'s cosmetics are OpenVibe.Inventory\'s (ADR-054 §8): read them through server/monetization/cosmetics.js');
assert.ok(!fs.existsSync(path.join(ROOT, 'server/chat/tags.js')), 'the legacy chat tags left with the game');
assert.ok(!fs.existsSync(path.join(ROOT, 'server/chat/tags.js')), 'the legacy chat tags left with the game');
assert.ok(!/INVENTORY_AUTHORITY/.test(fs.readFileSync(path.join(ROOT, 'server/monetization/cosmetics.js'), 'utf8')), 'no switch back to Live\'s tables');
assert.ok(!/INVENTORY_AUTHORITY/.test(fs.readFileSync(path.join(ROOT, 'server/monetization/cosmetics.js'), 'utf8')), 'no switch back to Live\'s tables');
-console.log('cosmetics tables: nothing under server/ or scripts/ names them');
+// The contract migration drops them, after the N-1 window (it names 0002, so the migrator holds it for 7 days).
+const drop = fs.readFileSync(path.join(ROOT, 'migrations', '0005_drop_live_cosmetics.sql'), 'utf8');
+assert.match(drop, /^-- phase: contract$/m);
+assert.match(drop, /^-- after: 0002$/m);
+const dropped = [...drop.matchAll(/^DROP TABLE IF EXISTS (\w+);$/gm)].map((m) => m[1]).sort();
+assert.deepStrictEqual(dropped, ['user_cosmetics', 'user_equipped', 'user_equipped_tag'], '0003 drops exactly the three');
+console.log('cosmetics tables: nothing under server/ or scripts/ names them, and 0003 drops them');