[object Object]

← back to Sample Followup Sweep

stamp_aliases: stamp-only recipient aliases (WQ contract@/lindsaydetwiler@, RBL support@rebelwalls.com); send routing unaffected + test (TK-12351)

d7b4973ef2054f227a016544c91af1cd409f717b · 2026-09-26 13:10:29 -0700 · Steve Abrams

Files touched

Diff

commit d7b4973ef2054f227a016544c91af1cd409f717b
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Sep 26 13:10:29 2026 -0700

    stamp_aliases: stamp-only recipient aliases (WQ contract@/lindsaydetwiler@, RBL support@rebelwalls.com); send routing unaffected + test (TK-12351)
---
 .gitignore                  |  1 +
 data/contacts.json          | 11 +++++++++--
 scripts/sent-stamp-core.mjs |  4 +++-
 test/stamp-aliases.test.js  | 21 +++++++++++++++++++++
 4 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6f58160..aad1443 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ dist/
 build/
 .next/
 out/
+.claude/
diff --git a/data/contacts.json b/data/contacts.json
index a9598a9..4e23ae3 100644
--- a/data/contacts.json
+++ b/data/contacts.json
@@ -12,7 +12,11 @@
   "wq": {
     "name": "WallQuest / Malibu",
     "sample_email": "orders@wallquest.com",
-    "account_number": "651317"
+    "account_number": "651317",
+    "stamp_aliases": [
+      "contract@wallquest.com",
+      "lindsaydetwiler@wallquest.com"
+    ]
   },
   "thi": {
     "name": "Thibaut",
@@ -139,7 +143,10 @@
   "rbl": {
     "name": "Rebel Walls (via Gimmersta US)",
     "sample_email": "support@gimmersta.com",
-    "account_number": "On File"
+    "account_number": "On File",
+    "stamp_aliases": [
+      "support@rebelwalls.com"
+    ]
   },
   "spn": {
     "name": "Spoonflower (online \u2014 no rep desk)",
diff --git a/scripts/sent-stamp-core.mjs b/scripts/sent-stamp-core.mjs
index 60dd4cb..fefc87d 100644
--- a/scripts/sent-stamp-core.mjs
+++ b/scripts/sent-stamp-core.mjs
@@ -71,7 +71,9 @@ export function buildEmailVid(fleetVendors, contacts, { slugAliases = {}, slugFo
   const map = {};
   for (const [slug, c] of Object.entries(contacts || {})) {
     const vids = slugVids[slug]; if (!vids || !c) continue;
-    for (const field of [c.sample_email, c.main_email]) {
+    // stamp_aliases: extra recipient addresses recognised as this vendor for STAMPING ONLY — send
+    // routing never reads this field, so adding one cannot change who a letter goes to (TK-12351).
+    for (const field of [c.sample_email, c.main_email, ...(Array.isArray(c.stamp_aliases) ? c.stamp_aliases : [])]) {
       for (const one of String(field || '').toLowerCase().split(/[,;]\s*/)) {
         const t = one.trim(); if (!t) continue;
         const set = (map[t] = map[t] || new Set()); for (const v of vids) set.add(v);
diff --git a/test/stamp-aliases.test.js b/test/stamp-aliases.test.js
new file mode 100644
index 0000000..2f2d343
--- /dev/null
+++ b/test/stamp-aliases.test.js
@@ -0,0 +1,21 @@
+// TK-12351: stamp_aliases map extra recipient addresses to a vendor for STAMPING ONLY.
+const assert = require('assert');
+const fs = require('fs'), path = require('path');
+(async () => {
+  const core = await import('../scripts/sent-stamp-core.mjs');
+  const fleet = [{ slug: 'wq', vid: 'WQ' }];
+  const contacts = { wq: { sample_email: 'orders@wallquest.com', stamp_aliases: ['contract@wallquest.com'] } };
+  const map = core.buildEmailVid(fleet, contacts);
+  assert.deepStrictEqual(core.vidsForRecipient(map, 'Contract CS <contract@wallquest.com>'), ['WQ'], 'alias must map to WQ');
+  assert.deepStrictEqual(core.vidsForRecipient(map, 'orders@wallquest.com'), ['WQ'], 'primary still maps');
+  assert.deepStrictEqual(core.vidsForRecipient(map, 'nobody@x.com'), [], 'unknown stays unmapped');
+  // send routing must never read stamp_aliases: only the stamp core may reference it.
+  const offenders = [];
+  for (const dir of ['lib', 'bin', 'scripts']) for (const f of fs.readdirSync(dir)) {
+    if (f === 'sent-stamp-core.mjs' || !/\.(m?js|cjs)$/.test(f)) continue;
+    if (fs.readFileSync(path.join(dir, f), 'utf8').includes('stamp_aliases')) offenders.push(dir + '/' + f);
+  }
+  if (fs.readFileSync('server.js', 'utf8').includes('stamp_aliases')) offenders.push('server.js');
+  assert.deepStrictEqual(offenders, [], 'stamp_aliases leaked into non-stamp code: ' + offenders);
+  console.log('stamp-aliases: ALL PASS');
+})().catch(e => { console.error('FAIL:', e.message); process.exit(1); });

← 5b98d5b Sent-stamp watcher: dead-letter heartbeat + vid-keyed pull-f  ·  back to Sample Followup Sweep  ·  auto-data-snapshot: 2026-09-26T13:16:02 (1 data files) — dat d8151a8 →