Index: test/c2s-compose.test.js
===================================================================
--- test/c2s-compose.test.js	(revision 15f1cb57a2792167f63aa562ececc415c9943088)
+++ test/c2s-compose.test.js	(revision 094f7d08b6d73938da056dc164a0ca363c60a269)
@@ -85,11 +85,11 @@
     assert.equal(vid.icon && vid.icon.url, 'https://test.example/media/reply-media/film.mp4.poster.jpg',
       'the poster federates as the attachment icon');
-    // The web tile plays the video as its own thumbnail (Robins aanwijzing):
-    // the first video becomes the cover video, with NO cover image beside it,
-    // because the tile's image branch would win and freeze the tile.
-    assert.equal(post.cover_video_url, '/media/reply-media/film.mp4');
+    // NO cover (Robins besluit): a cover next to the content showed the same
+    // video twice on the post page. The tiles derive their picture from the
+    // content (post-tile/post-card), so the post model stays single-source.
+    assert.equal(post.cover_video_url, null);
     assert.equal(post.cover_image_url, null);
     assert.equal((note.attachment || []).filter((a) => a.url.endsWith('film.mp4')).length, 1,
-      'cover video + attachment dedupe to the one entry that knows its poster');
+      'and the video federates exactly once');
   } finally {
     if (prev === undefined) delete process.env.MEDIA_PATH; else process.env.MEDIA_PATH = prev;
@@ -123,5 +123,4 @@
   assert.equal(r.status, 201, 'a picture can be the whole message');
   const post = db.prepare('SELECT * FROM posts WHERE id = ?').get(r.id);
-  assert.equal(post.cover_image_url, '/media/reply-media/alleen.jpg',
-    'a photo post fronts its photo instead of the (untitled) gradient');
+  assert.equal(post.cover_image_url, null, 'no cover: the tile reads the photo from the content');
 });
