diff --git a/public/icons/phosphor-sprite.svg b/public/icons/phosphor-sprite.svg
index 67c5c3da..c1d31db6 100644
--- a/public/icons/phosphor-sprite.svg
+++ b/public/icons/phosphor-sprite.svg
@@ -1,36 +1,84 @@
\ No newline at end of file
+
+
diff --git a/test-all.sh b/test-all.sh
index b67c7dca..56b2dabb 100755
--- a/test-all.sh
+++ b/test-all.sh
@@ -29,6 +29,7 @@ node test-issue-1409-no-encrypted-flood.js
node test-analytics-channels-integration.js
node test-observers-headings.js
node test-issue-1648-m1-emoji-scan.js
+node test-issue-1648-m2-emoji-scan.js
node test-traces.js
# #1418 — route-view v2 (Tufte) coverage
diff --git a/test-issue-1648-m2-emoji-scan.js b/test-issue-1648-m2-emoji-scan.js
new file mode 100644
index 00000000..c8163e75
--- /dev/null
+++ b/test-issue-1648-m2-emoji-scan.js
@@ -0,0 +1,156 @@
+#!/usr/bin/env node
+/* Issue #1648 — M2: emoji → Phosphor sprite migration (static scan).
+ *
+ * M2 covers page headers + table chrome surfaces:
+ * analytics.js, nodes.js, packets.js, live.js, map.js,
+ * node-analytics.js, traces.js, perf.js, audio-lab.js
+ *
+ * Asserts (per file):
+ * 1. Zero UI-iconography codepoints (U+1F300–1FAFF, U+2600–27BF, and
+ * Misc-Symbols: ◆●■▲★☆○✓✗⚠✉) outside an allowlist of contexts that are
+ * not UI iconography (CSS comments, JS comments referencing prior
+ * glyphs, console.log/debug strings, and explicitly tagged
+ * // EMOJI-OK lines).
+ * 2. At least N