<!-- SOLID CITY · part 2882 -->
s flanking the entrance, merchandise visible behind */
    box(g, 2.4, 2.6, 0.18, sxp - 3.9, 1.9, zB + 8.2, M.glass);
    box(g, 2.4, 2.6, 0.18, sxp + 3.9, 1.9, zB + 8.2, M.glass);
    box(g, 2.5, 0.14, 0.24, sxp - 3.9, 3.28, zB + 8.2, M.silver);
    box(g, 2.5, 0.14, 0.24, sxp + 3.9, 3.28, zB + 8.2, M.silver);
    /* sign housing: dark band + architectural lettering */
    box(g, 8.5, 1.1, 0.35, sxp, 4.35, zB + 8.05, M.titanium);
    var sign = makeText(T, shop.name, 0xd8a833); sign.position.set(sxp, 4.35, zB + 8.28); g.add(sign);
    /* warm interior light strip on store ceiling */
    box(g, 9.5, 0.12, 0.5, sxp, 5.0, zB + 4.25, M.warmLight);
    /* fixtures: two display tables (intentional, aligned) */
    for (var dt = -1; dt <= 1; dt += 2) {
      box(g, 2.6, 0.12, 1.4, sxp + dt * 2.4, 1.05, zB + 4.5, M.silver);   /* table top */
      box(g, 2.4, 1.0, 1.2, sxp + dt * 2.4, 0.5, zB + 4.5, M.titanium);   /* table base */
      for (var pi = 0; pi < 3; pi++) {                                    /* curated products */
        var pc = [0xc65c5c, 0x5c8ac6, 0xd8a833][pi % 3];
        box(g, 0.55, 0.7, 0.55, sxp + dt * 2.4 - 0.8 + pi * 0.8, 1.5, zB + 4.5, lam(pc));
      }
    }
    /* back-wall shelves: 3 aligned shelves, products in rows */
    for (var sh = 0; sh < 3; sh++) {
      box(g, 9.0, 0.14, 1.1, sxp, 1.3 + sh * 1.15, zB + 0.85, M.silver);
      box(g, 9.0, 1.0, 0.12, sxp, 0.85 + sh * 1.15, zB + 0.35, M.titanium);
      for (var pj = 0; pj < 6; pj++) {
        var pc2 = [0x9aa4b5, 0xd8a833, 0x5c8ac6, 0xc65c5c][(pj + sh) % 4];
        box(g, 0.5, 0.62, 0.5, sxp - 3.5 + pj * 1.4, 1.68 + sh * 1.15, zB + 0.85, lam(pc2));
      }
    }
    /* feature pedestal with accent-lit object */
    box(g, 1.2, 1.1, 1.2, sxp, 0.55, zB + 6.2, M.titanium);
    box(g, 1.3, 0.1, 1.3, sxp, 1.15, zB + 6.2, M.gold);
    box(g, 0.6, 0.9, 0.6, sxp, 1.65, zB + 6.2, accentMat);
    /* service counter at rear */
    box(g, 3.2, 1.05, 1.1, sxp, 0.52, zB + 1.6, M.titanium);
    box(g, 3.4, 0.1, 1.25, sxp, 1.1, zB + 1.6, M.silver);
    FP(cfg.ox + sxp, cfg.oz + zB + 4.25, 11, 9, 0, 5.6);
  }

  /* Lobby finishes for the reference tower: patterned floor medallion,
     ceiling light coves, wall-to-ceiling transition trim. */
  function lobbyFinishes(g, cfg) {
    var hw = 18, hd = 18, lh = 8;
    /* floor medallion: gold-bordered stone inset at lobby center */
    box(g, 12, 0.06, 12, 0, 0.33, 2, M.stone);
    box(g, 12.4, 0.05, 0.35, 0, 0.33, 2 - 6.1, M.gold);
    box(g, 12.4, 0.05, 0.35, 0, 0.33, 2 + 6.1, M.gold);
    box(g, 0.35, 0.05, 12.4, -6.1, 0.33, 2, M.gold);
    box(g, 0.35, 0.05, 12.4, 6.1, 0.33, 2, M.gold);
    box(g, 6, 0.06, 6, 0, 0.34, 2, M.silver);
    /* ceiling light coves: warm strips where walls meet the floor-2 slab */
    box(g, W - 3, 0.14, 0.5, 0, lh - 0.4, -hd + 0.6, M.warmLight);
    box(g, W - 3, 0.14, 0.5, 0, lh - 0.4, hd - 0.6, M.warmLight);
    box(g, 0.5, 0.14, D - 3, hw - 0.6, lh - 0.4, 0, M.warmLight);
    box(g, 0.5, 0.14, D - 3, -hw + 0.6, lh - 0.4, 0, M.warmLight);
    /* wall-to-ceiling transition: titanium crown trim */
    box(g, W, 0.35, 0.35, 0, lh - 0.1, -hd + 0.2, M.titanium);
    box(g, W, 0.35, 0.35, 0, lh - 0.1, hd - 0.2, M.titanium);
  }


  var TOWERS = [
    { id: 'command', name: 'COMMAND SPIRE', accent: 0xffc65c, tint: 0x9caec6, ox: -55, oz: -55 },
    { id: 'intelligence', name: 'INTELLIGENCE TOWER', accent: 0x4be5ff, tint: 0x83b8cc, ox: 55, oz: -55 },
    { id: 'living', name: 'LIVING TOWER', accent: 0xffda72, tint: 0xc7b7a0, ox: -55, oz: 55 },
    { id: 'frontier', name: 'FRONTIER TOWER', accent: 0xff5b6b, tint: 0x9c9cb3, ox: 55, oz: 55 }
  ];

  function towerShops(id) { return SHOPS.stores.filter(function (s) { return s.tower === id; }).slice(0, 2); }

  function buildTower(cfg) {
    var g = new T.Group(); g.name = 'tower:' + cfg.id; g.position.set(cfg.ox, 0, cfg.oz); root.add(g);
    var shell = lam(cfg.tint), trim = lam(cfg.accent, cfg.accent);
    var hw = W / 2, hd = D / 2;

    /* corner columns */
    for (var sx = -1; sx <= 1; sx += 2) for (var sz = -1; sz <= 1; sz += 2) {
      box(g, 1.6, TH, 1.6, sx * hw, TH / 2, sz * hd, shell);
      FP(cfg.ox + sx * hw, cfg.oz + sz * hd, 2.2, 2.2, 0, TH);
    }
    /* floor plates + accent trim */
    for (var f = 0; f <= FLOORS; f++) {
      var y = f * FH;
      box(g, W + 2, 0.55, D + 2, 0, y, 0, M.dark);
      box(g, W + 2, 0.4, 0.5, 0, y, hd, trim); box(g, W + 2, 0.4, 0.5, 0, y, -hd, trim);
      box(g, 0.5, 0.4, D + 2, hw, y, 0, trim); box(g, 0.5, 0.4, D + 2, -hw, y, 0, trim);
    }
    /* glass facades floors 1-11 (skip lobby) */
    for (var fl = 1; fl < FLOORS; fl++) {
      var gy = fl * FH + FH / 2;
      box(g, W - 3, FH - 1, 0.22, 0, gy, hd, M.glass); box(g, W - 3, FH - 1, 0.22, 0, gy, -hd, M.glass);
      box(g, 0.22, FH - 1, D - 3, hw, gy, 0, M.glass); box(g, 0.22, FH - 1, D - 3, -hw, gy, 0, M.glass);
    }
    /* lobby exterior walls with SOUTH door gap (8m wide) */
    var lh = 