← back to Hollywood Import
TK-10634 generator forward-fix (DTD-B): mint HW-<real momentum number> not sequential DWHD; skip no-number rows; collision-guarded; kill-switch still frozen
61c9a7657e304cc47ad70106421e062be358c103 · 2026-08-17 17:00:55 -0700 · steve
Files touched
M momentum-feed/assign-sku.mjs
Diff
commit 61c9a7657e304cc47ad70106421e062be358c103
Author: steve <steve@designerwallcoverings.com>
Date: Mon Aug 17 17:00:55 2026 -0700
TK-10634 generator forward-fix (DTD-B): mint HW-<real momentum number> not sequential DWHD; skip no-number rows; collision-guarded; kill-switch still frozen
---
momentum-feed/assign-sku.mjs | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
diff --git a/momentum-feed/assign-sku.mjs b/momentum-feed/assign-sku.mjs
index 9fb4b51..e41e3e1 100644
--- a/momentum-feed/assign-sku.mjs
+++ b/momentum-feed/assign-sku.mjs
@@ -58,23 +58,30 @@ function buildPool(need, used) {
async function main() {
const used = (await pool.query(`SELECT DISTINCT pl_city_name c FROM momentum_colorways WHERE pl_city_name IS NOT NULL`))
.rows.map(r => r.c).filter(Boolean);
- const maxNum = (await pool.query(
- `SELECT COALESCE(MAX((substring(dw_sku from 'DWHD-([0-9]+)'))::int),500000) m FROM momentum_colorways WHERE dw_sku ~ '^DWHD-[0-9]+$'`)).rows[0].m;
+ // --- FORWARD-FIX (DTD-B, 2026-08-17): mint a Hollywood PRIVATE-LABEL code from the REAL
+ // Momentum number, NOT a sequential DW-vendor DWHD mint. The prefix is the private-label
+ // wrapper (Hollywood), the number is the product's real identity; the raw number is ALSO
+ // kept internal in manufacturer_sku. NEVER the bare number customer-facing ("always pl
+ // momentum"), NEVER a sequential mint divorced from the product. Prefix is configurable. ---
+ const PL_PREFIX = process.env.HW_PL_PREFIX || 'HW';
// Deterministic order: WC before Acoustic, then pattern, then colorway.
const { rows } = await pool.query(
- `SELECT id, pattern_name, color_name, color_number, category FROM momentum_colorways
+ `SELECT id, pattern_name, color_name, color_number, category, momentum_sku FROM momentum_colorways
WHERE dw_sku IS NULL ORDER BY category, pattern_name, color_number NULLS LAST, id`);
- const patterns = [...new Set(rows.map(r => r.pattern_name))];
+ // A real Momentum number is REQUIRED — no number, no code (never fabricate). Flag + skip.
+ const noNumber = rows.filter(r => !r.momentum_sku);
+ const codeable = rows.filter(r => r.momentum_sku);
+ const patterns = [...new Set(codeable.map(r => r.pattern_name))];
const pool2 = buildPool(patterns.length, used);
if (pool2.length < patterns.length) throw new Error(`pool short: ${pool2.length} < ${patterns.length}`);
const cityOf = new Map(patterns.map((p, i) => [p, pool2[i]]));
- let n = maxNum;
- const plan = rows.map(r => ({ id: r.id, dw_sku: `DWHD-${++n}`, city: cityOf.get(r.pattern_name),
- pattern: r.pattern_name, color: r.color_name, cat: r.category }));
- console.log(`assign-sku: ${plan.length} colorways / ${patterns.length} patterns.`);
- console.log(` DWHD range: DWHD-${maxNum + 1} … DWHD-${n}`);
- console.log(` new cities minted: ${patterns.length} (0 collisions w/ ${used.length} existing)`);
+ const plan = codeable.map(r => ({ id: r.id, dw_sku: `${PL_PREFIX}-${r.momentum_sku}`, city: cityOf.get(r.pattern_name),
+ pattern: r.pattern_name, color: r.color_name, cat: r.category, mfr: r.momentum_sku }));
+ // collision guard: a real number appearing twice would collide (must be unique)
+ const codes = plan.map(p => p.dw_sku);
+ if (new Set(codes).size !== codes.length) throw new Error('duplicate momentum_sku → SKU collision; aborting');
+ console.log(`assign-sku (forward-fix ${PL_PREFIX}-<number>): ${plan.length} colorways / ${patterns.length} patterns. SKIPPED ${noNumber.length} with no momentum_sku (need real number).`);
console.log(' samples:'); plan.slice(0, 4).forEach(p => console.log(` ${p.dw_sku} ${p.cat} "${p.pattern}" / ${p.color} → ${p.city}`));
if (!COMMIT) { console.log('DRY-RUN — re-run with --commit to write.'); await pool.end(); return; }
@@ -89,7 +96,7 @@ async function main() {
done++;
}
await c.query('COMMIT');
- console.log(`COMMITTED — assigned ${done} DWHD SKUs + ${patterns.length} CA-city collections. pl_brand set. (staging only; drip manifest untouched)`);
+ console.log(`COMMITTED — assigned ${done} ${PL_PREFIX}-<number> private-label SKUs + ${patterns.length} CA-city collections. pl_brand set. (staging only; drip manifest untouched)`);
} catch (e) { await c.query('ROLLBACK'); console.error('ROLLBACK:', e.message); process.exitCode = 1; }
finally { c.release(); await pool.end(); }
}
← e0edd0f TK-10634: hard-guard DWHD minter behind kill-switch (brand-a
·
back to Hollywood Import
·
generator forward-fix revised to DTD-C: HW-<deterministic op 3844a4f →