=== Session change log ===
Session started: 2026-09-02
Rule: Before changing any file that is not a .md or .txt file, write the current timestamp followed by the exact diff here first, then make the change.

(no file changes made yet in this session)

[2026-09-02 20:34:48] DELETE dead files per DEAD_CODE_REPORT.md §1 (28 files):

Removed in packages/db_helper_sqlite/src/helper_methods/:
- banner.ts        (entire file — legacy duplicate, never imported)
- complaint.ts     (entire file — legacy duplicate, never imported)
- const.ts         (entire file — legacy duplicate, never imported)
- coupon.ts        (entire file — legacy duplicate, never imported)
- order.ts         (entire file — legacy duplicate, never imported)
- product.ts       (entire file — legacy duplicate, never imported)
- slots.ts         (entire file — legacy duplicate, never imported)
- staff-user.ts    (entire file — legacy duplicate, never imported)
- store.ts         (entire file — legacy duplicate, never imported)
- user.ts          (entire file — legacy duplicate, never imported)
- vendor-snippets.ts (entire file — legacy duplicate, never imported)

Removed in packages/db_helper_postgres/src/helper_methods/: (same 11 files as above)
- banner.ts, complaint.ts, const.ts, coupon.ts, order.ts, product.ts, slots.ts, staff-user.ts, store.ts, user.ts, vendor-snippets.ts (entire files — legacy duplicates, never imported)

Removed in both packages (db_helper_sqlite + db_helper_postgres):
- src/user-apis/tags.ts        (entire file — imported by no one)
- src/common-apis/utils.ts     (entire file — imported by no one; formatDate/generateCode/calculateDiscount unreferenced)
- src/db/types.ts              (entire file — imported by no one)

Kept: helper_methods/upload-url.ts (alive — re-exported by index.ts, used by backend).

Command: rm <each file listed above>

[2026-09-02 20:38:02] COMPLETED deletion of 28 dead files (DEAD_CODE_REPORT.md §1).
Verification:
- grep for 'helper_methods|user-apis/tags|common-apis/utils|db/types' across both packages + apps/backend: only remaining match is the live import of helper_methods/upload-url.ts in both index.ts files.
- tsc --noEmit on both packages reports pre-existing errors only (in untouched live files: src/db/seed.ts, src/user-apis/order.ts, src/user-apis/product.ts, src/admin-apis/complaint.ts, src/admin-apis/product.ts). No errors reference any deleted module.

[2026-09-02 20:45:45] DELETE dead exported methods per DEAD_CODE_REPORT.md §2a (8 symbols, both packages).

=== packages/db_helper_sqlite/src/admin-apis/product.ts ===
- removed getAllUnits (lines 650-657):
    export async function getAllUnits(): Promise<AdminUnit[]> {
      const allUnits = await db.query.units.findMany({
        orderBy: units.shortNotation,
      })
      return allUnits.map(mapUnit)
    }
- removed addProductToGroup (lines 1032-1034):
    export async function addProductToGroup(groupId: number, productId: number): Promise<void> {
      await db.insert(productGroupMembership).values({ groupId, productId })
    }
- removed removeProductFromGroup (lines 1036-1042):
    export async function removeProductFromGroup(groupId: number, productId: number): Promise<void> {
      await db.delete(productGroupMembership)
        .where(and(
          eq(productGroupMembership.groupId, groupId),
          eq(productGroupMembership.productId, productId)
        ))
    }

=== packages/db_helper_postgres/src/admin-apis/product.ts ===
- identical removals (getAllUnits at 232-239, addProductToGroup at 496-498, removeProductFromGroup at 500-506)

=== packages/db_helper_sqlite/src/admin-apis/vendor-snippets.ts ===
- removed getOrderItemsByOrderIds (lines 196-209):
    export async function getOrderItemsByOrderIds(orderIds: number[]) {
      return await db.query.orderItems.findMany({
        where: inArray(orderItems.orderId, orderIds),
        with: { sku: { with: { product: true, features: true } } },
      })
    }
- removed getOrderStatusByOrderIds (lines 210-214):
    export async function getOrderStatusByOrderIds(orderIds: number[]) {
      return await db.query.orderStatus.findMany({
        where: inArray(orderStatus.orderId, orderIds),
      })
    }

=== packages/db_helper_postgres/src/admin-apis/vendor-snippets.ts ===
- removed getOrderItemsByOrderIds (lines 188-200) — same signature; body joins product.unit instead of sku:
    export async function getOrderItemsByOrderIds(orderIds: number[]) {
      return await db.query.orderItems.findMany({
        where: inArray(orderItems.orderId, orderIds),
        with: { product: { with: { unit: true } } },
      })
    }
- removed getOrderStatusByOrderIds (lines 201-205) — identical to sqlite

=== packages/db_helper_sqlite/src/admin-apis/staff-user.ts + packages/db_helper_postgres/src/admin-apis/staff-user.ts ===
- removed updateUserSuspensionStatus (lines 101-109 in both) — duplicate of live upsertUserSuspension:
    export async function updateUserSuspensionStatus(userId: number, isSuspended: boolean): Promise<void> {
      await db
        .insert(userDetails)
        .values({ userId, isSuspended })
        .onConflictDoUpdate({
          target: userDetails.userId,
          set: { isSuspended },
        })
    }

=== packages/db_helper_sqlite/src/user-apis/user.ts + packages/db_helper_postgres/src/user-apis/user.ts ===
- removed getUserWithCreds (lines 15-28 in both):
    export async function getUserWithCreds(userId: number) {
      const result = await db
        .select()
        .from(users)
        .leftJoin(userCreds, eq(users.id, userCreds.userId))
        .where(eq(users.id, userId))
        .limit(1)
      if (result.length === 0) return null
      return { user: result[0].users, creds: result[0].user_creds }
    }

=== packages/db_helper_sqlite/src/user-apis/auth.ts + packages/db_helper_postgres/src/user-apis/auth.ts ===
- removed createUserWithCreds (lines 145-168 in both):
    export async function createUserWithCreds(input: { name; email; mobile; hashedPassword }) {
      return db.transaction(async (tx) => { ...insert user, insert userCreds, return user... })
    }

=== packages/db_helper_sqlite/index.ts (export list cleanup) ===
- removed line:  getAllUnits,
- removed lines:  addProductToGroup,
                  removeProductFromGroup,
- removed lines:  getOrderItemsByOrderIds,
                  getOrderStatusByOrderIds,
- removed line:   updateUserSuspensionStatus,
- removed line:   getUserWithCreds as getUserWithCreds,
- removed line:   createUserWithCreds as createUserAuthWithCreds,

=== packages/db_helper_postgres/index.ts (export list cleanup) ===
- same 8 export-line removals as sqlite index.ts

=== apps/backend/src/sqliteImporter.ts (re-export chain cleanup) ===
- removed line:   getAllUnits,
- removed lines:  addProductToGroup,
                  removeProductFromGroup,
- removed lines:  getOrderItemsByOrderIds,
                  getOrderStatusByOrderIds,
- removed line:   updateUserSuspensionStatus,
- removed line:   createUserAuthWithCreds,
- removed line:   getUserWithCreds,

Note: apps/backend/src/dbService.ts uses `export * from '@/src/sqliteImporter'` — no per-symbol change needed there.
Any imports left unused by these deletions (e.g. productGroupMembership, inArray, userCreds) will be removed in a follow-up entry if tsc/grep confirms they are unused.

[2026-09-02 20:49:23] FOLLOW-UP: remove imports/orphans left unused by §2a deletions.

=== packages/db_helper_sqlite/src/admin-apis/product.ts ===
- removed now-unused local type + mapper (only consumer was deleted getAllUnits):
    line 103:  type UnitRow = InferSelectModel<typeof units>
    line 117:  const mapUnit = (unit: UnitRow): AdminUnit => ({
                 id: unit.id,
                 shortNotation: unit.shortNotation,
                 fullName: unit.fullName,
               })
  (postgres product.ts keeps mapUnit — still used there at lines 111, 142)

=== packages/db_helper_sqlite/src/user-apis/user.ts ===
- import line 2: removed 'userCreds' from  import { notifCreds, unloggedUserTokens, userCreds, userDetails, users } from '../db/schema'

=== packages/db_helper_postgres/src/user-apis/user.ts ===
- same import fix as sqlite user.ts

[2026-09-02 20:51:30] COMPLETED §2a deletion (8 dead exported methods, both packages + re-export chains).
Removed: getAllUnits, addProductToGroup, removeProductFromGroup, getOrderItemsByOrderIds, getOrderStatusByOrderIds, updateUserSuspensionStatus, getUserWithCreds, createUserWithCreds (+ orphaned mapUnit/UnitRow in sqlite product.ts, orphaned userCreds imports in both user.ts).
Verification:
- grep across packages + apps: zero live references remain (only commented lines in postgresImporter.ts).
- tsc --noEmit: sqlite = 4 errors (same as pre-change baseline), postgres = 40 errors (all pre-existing drizzle inference mismatches in untouched files), backend = 17 errors (all pre-existing, in untouched files). No error references any deleted symbol.

[2026-09-02 20:54:32] DELETE §2b/§2c dead exports + PARITY RENAME + RESTORE two methods for future use.

--- DELETIONS, packages/db_helper_sqlite/src/admin-apis/product.ts ---
- removed createSpecialDealsForSku (lines 1124-1145): inserts specialDeals rows keyed by skuId, returns mapped AdminSpecialDeal[]
- removed updateSkuDeals (lines 1147-1241): diff-based sync of specialDeals for a skuId (add/remove/update validTill)
- removed mergeSkus (lines 1243-1366, end of file): merges fromSkuId into toSkuId across orderItems, specialDeals, cartItems, couponApplicableProducts, JSON skuIds columns (deliverySlotInfo, homeBanners, coupons, reservedCoupons, vendorSnippets), keyValStore popularItems, then deletes skuFeatures + sku + orphaned product

--- DELETIONS, packages/db_helper_postgres/src/admin-apis/product.ts ---
- removed toggleProductOutOfStock (lines 181-203): flips productInfo.isOutOfStock
- removed createSpecialDealsForProduct (lines 677-698): postgres counterpart of createSpecialDealsForSku (keyed by productId)
- removed updateProductDeals (lines 700-775): postgres counterpart of updateSkuDeals

--- DELETION, packages/db_helper_postgres/src/lib/automated-jobs.ts ---
- removed toggleFlashDeliveryForItems (lines 10-16): bulk productInfo.isFlashAvailable update
- import line 2: removed 'productInfo' from  import { productInfo, keyValStore } from '../db/schema'
- import line 3: removed 'inArray' from  import { inArray, eq } from 'drizzle-orm'

--- EXPORT LIST, packages/db_helper_sqlite/index.ts ---
- removed lines:  createSpecialDealsForSku,
                  updateSkuDeals,
                  mergeSkus,

--- EXPORT LIST, packages/db_helper_postgres/index.ts ---
- removed lines:  createSpecialDealsForProduct,
                  updateProductDeals,
                  toggleProductOutOfStock,
- removed line:   toggleFlashDeliveryForItems,

--- EXPORT LIST, apps/backend/src/sqliteImporter.ts ---
- removed lines:  createSpecialDealsForSku,
                  updateSkuDeals,
                  mergeSkus,

--- PARITY RENAME, packages/db_helper_postgres/src/user-apis/product.ts ---
- renamed getSuspendedProductIds -> getSuspendedSkuIds (backend calls getSuspendedSkuIds; sqlite exports that name).
  NOTE: implementation unchanged (queries productInfo.isSuspended) — postgres schema has no sku/marketStats model, so this is the closest postgres equivalent of the sqlite query on productMarketStats.skuId.
- packages/db_helper_postgres/index.ts: export line getSuspendedProductIds, -> getSuspendedSkuIds,

--- RESTORE (user request: needed in future), both packages ---
packages/db_helper_sqlite/src/user-apis/user.ts + packages/db_helper_postgres/src/user-apis/user.ts:
- re-added getUserWithCreds:
    export async function getUserWithCreds(userId: number) {
      const result = await db
        .select()
        .from(users)
        .leftJoin(userCreds, eq(users.id, userCreds.userId))
        .where(eq(users.id, userId))
        .limit(1)

      if (result.length === 0) return null
      return {
        user: result[0].users,
        creds: result[0].user_creds,
      }
    }
- re-added 'userCreds' to the schema import line in both files.

packages/db_helper_sqlite/src/user-apis/auth.ts + packages/db_helper_postgres/src/user-apis/auth.ts:
- re-added createUserWithCreds:
    export async function createUserWithCreds(input: {
      name: string
      email: string
      mobile: string
      hashedPassword: string
    }) {
      return db.transaction(async (tx) => {
        const [user] = await tx.insert(users).values({
          name: input.name,
          email: input.email,
          mobile: input.mobile,
        }).returning()

        await tx.insert(userCreds).values({
          userId: user.id,
          userPassword: input.hashedPassword,
        })

        return user
      })
    }

packages/db_helper_sqlite/index.ts + packages/db_helper_postgres/index.ts:
- re-added export lines:  createUserWithCreds as createUserAuthWithCreds,   (user auth block)
                          getUserWithCreds as getUserWithCreds,             (user profile block)

apps/backend/src/sqliteImporter.ts:
- re-added re-export lines: createUserAuthWithCreds,  and  getUserWithCreds,

[2026-09-02 20:58:19] FOLLOW-UP: remove orphaned CreateSpecialDealInput (only consumers were the deleted deal functions; zero usages repo-wide).

=== packages/db_helper_sqlite/src/admin-apis/product.ts ===
- removed (line ~1118):
    export interface CreateSpecialDealInput {
      quantity: number
      price: number
      validTill: string | Date
    }

=== packages/db_helper_postgres/src/admin-apis/product.ts ===
- removed identical interface (line ~647)

[2026-09-02 20:59:28] COMPLETED §2b/§2c deletions + parity rename + restoration of createUserWithCreds/getUserWithCreds.
Verification:
- grep: zero references to createSpecialDealsForSku, updateSkuDeals, mergeSkus, createSpecialDealsForProduct, updateProductDeals, toggleProductOutOfStock, toggleFlashDeliveryForItems, getSuspendedProductIds (only commented postgresImporter.ts lines excluded from check).
- Restored methods present in both packages' src + index.ts + backend sqliteImporter.ts.
- Postgres now exports getSuspendedSkuIds (renamed from getSuspendedProductIds) matching sqlite/backend usage.
- tsc --noEmit baselines unchanged: sqlite 4, postgres 40, backend 17 errors — all pre-existing, none reference touched symbols.

[2026-09-02 21:01:52] §3 EXPORT-ONLY DEAD cleanup: remove from index.ts (implementations kept), delete non-exported dead types.

=== packages/db_helper_sqlite/index.ts ===
- removed line 10 block:  export { staffRoleEnum, staffPermissionEnum } from './src/db/schema'
  (these enum values still flow to consumers via the existing `export * from './src/db/schema'` — the explicit line was redundant)
- user product block: removed type lines  type SkuSummary,
                                         type OffersPageData,
                                         type OffersPageProductData,
- store helpers block: removed line  type AvailabilityCacheData,
- user order block: removed type lines  type OrderWithFullData,
                                        type OrderWithCancellationData,
- SKU Features block: removed lines  cleanFeatureValue,
                                     splitQuantityFeature,
                                     type SkuFeatureLike,
  (kept composeUnitNotation, composeSkuName — used by backend)

=== packages/db_helper_postgres/index.ts ===
- removed line 11 block:  export { staffRoleEnum, staffPermissionEnum } from './src/db/schema';
- user order block: removed type lines  type OrderWithFullData,
                                        type OrderWithCancellationData,

=== apps/backend/src/sqliteImporter.ts ===
- removed type lines  type OrderWithFullData,
                      type OrderWithCancellationData,
- removed line  getUserNotifCred,

Note: getNotifCred index export line in both packages:  getNotifCred as getUserNotifCred,  — removed (see below).

=== packages/db_helper_sqlite/index.ts + packages/db_helper_postgres/index.ts ===
- user profile block: removed line  getNotifCred as getUserNotifCred,
  (function getNotifCred kept in user.ts — called internally by upsertNotifCred)

=== packages/db_helper_sqlite/src/user-apis/order.ts ===
- removed dead interface (lines 33-40):
    export interface PlaceOrderInput {
      userId: number
      selectedItems: OrderItemInput[]
      addressId: number
      paymentMethod: 'online' | 'cod'
      couponId?: number
      userNotes?: string
      isFlash?: boolean
    }
- removed dead interface (lines 43-51):
    export interface OrderGroupData {
      slotId: number | null
      items: Array<{
        productId: number
        quantity: number
        slotId: number | null
        product: typeof productInfo.$inferSelect
      }>
    }

=== packages/db_helper_postgres/src/user-apis/order.ts ===
- removed identical PlaceOrderInput (lines 29-36) and OrderGroupData (lines 39-47)

[2026-09-02 21:04:10] CORRECTION to previous entry: while editing packages/db_helper_sqlite/index.ts user product block I accidentally removed getAllSkusSummary, getOffersAndCombos and type ProductSummaryData (all three are USED by backend). Immediately restored them; final state of that block keeps: getAllProductsWithUnits, getAllSkusSummary, getOffersAndCombos, type ProductSummaryData. Only type SkuSummary, type OffersPageData, type OffersPageProductData were meant to be (and now are) removed.

[2026-09-02 21:07:40] CORRECTION: while editing the user order block of packages/db_helper_sqlite/index.ts I accidentally removed getOrdersByIdsWithFullData and getOrderByIdWithFullData (both USED by backend post-order-handler). Immediately restored. Final state: those two functions kept; only type OrderWithFullData and type OrderWithCancellationData removed from that block. Also fixed an earlier accidental newline removal after the store-helpers export close brace.

[2026-09-02 21:05:24] FOLLOW-UP: remove orphaned OrderItemInput from user-apis/order.ts in both packages (its only consumer, PlaceOrderInput, was deleted; definition-only now).

=== packages/db_helper_sqlite/src/user-apis/order.ts ===
- removed (lines 27-31):
    export interface OrderItemInput {
      productId: number
      quantity: number
      slotId: number | null
    }

=== packages/db_helper_postgres/src/user-apis/order.ts ===
- removed identical interface (lines 23-27)

[2026-09-02 21:06:16] COMPLETED §3 export-only-dead cleanup.
Removed from index.ts (implementations kept in src):
- both packages: redundant staffRoleEnum/staffPermissionEnum export block (still exported via `export * from './src/db/schema'`), type OrderWithFullData, type OrderWithCancellationData, getNotifCred as getUserNotifCred
- sqlite only: type SkuSummary, type OffersPageData, type OffersPageProductData, type AvailabilityCacheData, cleanFeatureValue, splitQuantityFeature, type SkuFeatureLike (kept composeUnitNotation/composeSkuName)
Removed from apps/backend/src/sqliteImporter.ts: type OrderWithFullData, type OrderWithCancellationData, getUserNotifCred
Deleted dead types in user-apis/order.ts (both packages): PlaceOrderInput, OrderGroupData, OrderItemInput
Verification:
- Backend-used exports confirmed intact: getAllSkusSummary, getOffersAndCombos, ProductSummaryData, getOrdersByIdsWithFullData, getOrderByIdWithFullData, getAvailabilityForCache, getAllProductCombosForCache, getUserWithCreds, createUserAuthWithCreds, composeSkuName, composeUnitNotation
- tsc --noEmit baselines unchanged: sqlite 4 (seed.ts 1, order.ts 2, product.ts 1), postgres 40, backend 17 — all pre-existing, none reference touched symbols.

[2026-09-02 21:21:13] §4: remove never-referenced schema tables — addressZones, addressAreas, userNotifications, productCategories (BOTH packages).
NOTE: this only removes them from the drizzle schema (code). The actual DB tables/columns/FK constraints still exist in D1/Postgres — dropping them in the DB requires a migration, which the user will handle (per AGENTS.md). Both schema.ts files drift from the live DB until then; drizzle-kit push/generate must NOT be run by the agent.

=== packages/db_helper_sqlite/src/db/schema.ts ===
- removed addressZones table (lines 106-110):
    export const addressZones = sqliteTable('address_zones', {
      id: integer().primaryKey({ autoIncrement: true }),
      zoneName: text('zone_name').notNull(),
      addedAt: timestampText('added_at').notNull().default(sql`CURRENT_TIMESTAMP`),
    })
- removed addressAreas table (lines 112-117):
    export const addressAreas = sqliteTable('address_areas', {
      id: integer().primaryKey({ autoIncrement: true }),
      placeName: text('place_name').notNull(),
      zoneId: integer('zone_id').references(() => addressZones.id),
      createdAt: timestampText('created_at').notNull().default(sql`CURRENT_TIMESTAMP`),
    })
- addresses table: changed zoneId column to drop FK (column KEPT — shared UserAddress type and user-apis/address.ts mapUserAddress still expose zoneId):
    before: zoneId: integer('zone_id').references(() => addressZones.id),
    after:  zoneId: integer('zone_id'),
- removed productCategories table (lines 431-434):
    export const productCategories = sqliteTable('product_categories', {
      id: integer().primaryKey({ autoIncrement: true }),
      name: text().notNull(),
      description: text(),
    })
- removed userNotifications table (lines 545-551):
    export const userNotifications = sqliteTable('user_notifications', {
      id: integer().primaryKey({ autoIncrement: true }),
      title: text('title').notNull(),
      imageUrl: text('image_url'),
      createdAt: timestampText('created_at').notNull().default(sql`CURRENT_TIMESTAMP`),
      body: text('body').notNull(),
      applicableUsers: jsonText<number[] | null>('applicable_users'),
    })
- addressesRelations: removed line  zone: one(addressZones, { fields: [addresses.zoneId], references: [addressZones.id] }),
- removed productCategoriesRelations (line 686):  export const productCategoriesRelations = relations(productCategories, ({}) => ({}))
- removed userNotificationsRelations (lines 720-722):
    export const userNotificationsRelations = relations(userNotifications, ({}) => ({
      // No relations needed for now
    }))
- removed addressZonesRelations (lines 749-752):
    export const addressZonesRelations = relations(addressZones, ({ many }) => ({
      addresses: many(addresses),
      areas: many(addressAreas),
    }))
- removed addressAreasRelations (lines 754-756):
    export const addressAreasRelations = relations(addressAreas, ({ one }) => ({
      zone: one(addressZones, { fields: [addressAreas.zoneId], references: [addressZones.id] }),
    }))

=== packages/db_helper_postgres/src/db/schema.ts === (same removals, postgres style)
- removed addressZones table (lines 58-62, mf.table('address_zones', ...))
- removed addressAreas table (lines 64-69, mf.table('address_areas', ...))
- addresses.zoneId (line 54): dropped .references(() => addressZones.id) — column kept
- removed productCategories table (lines 318-322, mf.table('product_categories', ...))
- removed userNotifications table (lines 434-440, mf.table('user_notifications', ...))
- addressesRelations: removed zone relation line (line 496)
- removed productCategoriesRelations (line 573)
- removed userNotificationsRelations (lines 607-609)
- removed addressZonesRelations (lines 636-639) and addressAreasRelations (lines 641-643)

[2026-09-02 21:23:14] COMPLETED §4 schema table removal.
- Removed from both packages' src/db/schema.ts: addressZones, addressAreas, productCategories, userNotifications tables + productCategoriesRelations, userNotificationsRelations, addressZonesRelations, addressAreasRelations.
- addresses.zoneId column KEPT (FK reference + addressesRelations.zone relation removed) because shared UserAddress type and user-apis/address.ts still expose zoneId.
- Verified: zero remaining references to the 4 tables anywhere; jsonText/jsonb/text imports still used by other tables; tsc baselines unchanged (sqlite 4, postgres 40, backend 17 — all pre-existing).
- REMINDER: DB tables still exist in D1/Postgres until the user runs a drop migration (agent must not run drizzle migrations).

[2026-09-02 21:24:48] §6: DELETE dead backend files (10 files) + clean commented references to them.

DELETED (all verified: zero live imports — only commented mentions remain):
- apps/backend/src/postgresImporter.ts   (entirely commented-out swap scaffold; restore from git when swapping to postgres)
- apps/backend/src/lib/signed-url-cache-old.ts
- apps/backend/src/lib/signed-url-cache.ts
- apps/backend/src/lib/disk-persisted-set.ts   (body fully commented out)
- apps/backend/src/lib/catch-async.ts
- apps/backend/src/lib/axios.ts               (phonepeAxios never imported)
- apps/backend/src/lib/delete-image.ts        (deleteS3Image never imported)
- apps/backend/src/lib/event-queue.ts         (enqueue never imported; queue-consumer.ts is the live path)
- apps/backend/src/lib/notif-service.ts
- apps/backend/src/types/db.types.ts

COMMENT CLEANUP (files are .ts → logged here):
=== apps/backend/index.ts ===
- removed line 5:  // import signedUrlCache from '@/src/lib/signed-url-cache';
- removed line 12: // signedUrlCache.loadFromDisk(); // Disabled for Workers compatibility
 Left untouched: s3-client.ts:141 prose comment (mentions the concept, not an import), dbService.ts prose header.
KEPT (verified alive): jobs/cache-creator.ts (Durable Object), lib/queue-consumer.ts, lib/flash-delivery-cron.ts, lib/seed.ts, lib/init.ts, lib/worker-init.ts, src/apis/**, src/test-controller.ts, types/hono.d.ts (ambient).

[2026-09-02 21:25:58] COMPLETED §6 backend dead-file deletion (10 files) + index.ts comment cleanup.
Verification: backend tsc --noEmit now reports 11 errors (was 17) — the 6 that vanished were signed-url-cache-old.ts's own pre-existing errors; remaining 11 are the same pre-existing set in untouched files (app.ts, lib/init.ts, s3-client.ts, main-router.ts, trpc-index.ts, sqlite order.ts/product.ts). No new errors.
Note: apps/backend/src/lib/s3-client.ts.txt (a .txt copy of s3-client) still exists — left alone, flagging as possible future cleanup.

[2026-09-02 21:31:17] Remove 4 dead-code items missed by our report but caught by cmd_v4_dead.md.

DELETED (3 files, verified zero live imports — only commented references):
- apps/backend/src/lib/redis-client.ts      (stubbed: createClient = (args:any) => {}; only '// import redisClient' comments remain elsewhere)
- apps/backend/src/lib/redisKeyGetters.ts   (only commented imports in trpc/apis/admin-apis/apis/slots.ts:7,613,694)
- apps/backend/src/middleware/auth.ts       (verifyToken/requireRole never imported; app uses middleware/auth.middleware.ts + staff-auth.ts)

EDITED:
=== packages/shared/index.ts ===
- removed line 10 (dead type, definition-only):
    export type CacheFilename = typeof CACHE_FILENAMES[keyof typeof CACHE_FILENAMES]
  (CACHE_FILENAMES const itself is heavily used by backend cloud_cache.ts and web-ui/user-ui hooks — kept)

[2026-09-02 21:32:23] COMPLETED removal of 4 missed dead-code items.
- Deleted: apps/backend/src/lib/redis-client.ts, apps/backend/src/lib/redisKeyGetters.ts, apps/backend/src/middleware/auth.ts (middleware/ dir still has auth.middleware.ts + staff-auth.ts).
- Removed CacheFilename type from packages/shared/index.ts (CACHE_FILENAMES const kept — used by cloud_cache.ts + web-ui/user-ui hooks).
- Verified: zero remaining references (excluding comments); backend tsc --noEmit = 11 errors, same pre-existing baseline.

[2026-09-02 21:45:00] CREATED analysis scripts (new .js files, read-only analysis): scripts/dead-code/user-ui-files.js, user-ui-symbols.js, user-ui-suspects.js, user-ui-store-actions.js, user-ui-store-final.js, user-ui-store-precise.js

[2026-09-02 22:56:40] EXECUTE user_ui_glm.md cleanup: remove dead code, KEEP register.tsx, DO NOT touch npm dependencies.

--- FILE DELETIONS ---
- apps/user-ui/app/(drawer)/(tabs)/me/about/_layout.tsx        (unreachable route, zero navigations)
- apps/user-ui/app/(drawer)/(tabs)/me/about/index.tsx          (unreachable route)
  KEPT: app/(auth)/register.tsx (user decision — keep for future sign-up wiring)
- apps/user-ui/constants/Colors.ts                             (never imported; constants/ dir becomes empty)
- apps/user-ui/components/BannerCarousel.tsx                   (never imported)
- apps/user-ui/src/components/google-sign-in.tsx               (never imported; login uses common-ui's copy)
- apps/user-ui/app/api/auth/authorize+api.ts                   (unreferenced Google OAuth endpoints; ⚠️ no caller in repo —
- apps/user-ui/app/api/auth/callback+api.ts                     restore from git if an external Google redirect URI was configured)
- apps/user-ui/app/api/auth/token+api.ts
- UNUSED ASSETS (zero references in code/app.json/eas.json):
  assets/images/adaptive-icon.png, farm2door-logo.png, freshyo-logoo.png, freshyo-logoo.svg,
  logo_mini.jpg, partial-react-logo.png, react-logo.png, react-logo@2x.png, react-logo@3x.png,
  splash-icon.png, symbuyote.png
  (assets/images/logo.png, icon.png, favicon.png, freshyo-logo.png, fonts/SpaceMono-Regular.ttf KEPT — referenced)

--- EDITS ---
=== apps/user-ui/src/hooks/prominent-api-hooks.ts ===
- remove dead chain: useBanners() hook + BannersResponse type (only consumer was deleted BannerCarousel)
  (CACHE_FILENAMES import stays — used by other cache hooks in the file)

=== apps/user-ui/hooks/useJWT.ts ===
- removed saveRoles, getRoles, deleteRoles (never called) + ROLES_KEY const (only used by the dead trio)
  (AUTH_TOKEN_KEY, USER_ID_KEY, saveUserId, getUserId, saveAuthToken, getAuthToken, deleteAuthToken kept — live)

=== apps/user-ui/services/toaster.tsx ===
- removed InfoToast, ErrorToast, SuccessToast (never imported; NotificationToast + default Toast are live)

=== apps/user-ui/src/store/centralProductStore.ts ===
- removed clearProducts (interface field + implementation; nothing ever clears the product store)

=== apps/user-ui/src/store/addressStore.ts ===
- removed clearSelectedAddress (interface field + implementation)

=== apps/user-ui/src/store/centralSlotStore.ts ===
- removed clearSlotsData (interface field + implementation)

=== apps/user-ui/src/store/quickDeliveryStore.ts ===
- removed setDrawerHidden (never called; isDrawerHidden state + readers kept — flag is permanently false today)

=== apps/user-ui/components/PaymentAndOrderComponent.tsx ===
- removed commented createRazorpayOrderMutation block (~lines 97-104)
- removed commented initiateRazorpayPayment block (~lines 170-210)
  (live COD/verify-payment flow untouched; react-native-razorpay dependency KEPT per instruction)

=== apps/user-ui/app/(drawer)/(tabs)/me/my-orders/index.tsx ===
- removed commented initiateRazorpayPayment block (~lines 564-585)
  (live handleRetryPayment + createRazorpayOrderMutation untouched)

=== apps/user-ui/app/_layout.tsx ===
- removed line 40:  console.log('from layout')
- line 11 import: removed unused Dimensions →  import { Appearance, StatusBar, View } from "react-native";

NOT TOUCHED (per instruction): all npm dependencies in package.json (incl. react-native-razorpay, expo-image-picker, etc.)
NOT TOUCHED (left as-is): scripts/reset-project.js (template helper wired to npm script — user call), dist/ build artifacts

[2026-09-02 23:02:51] COMPLETED user_ui_glm.md cleanup (register.tsx KEPT, npm dependencies NOT touched).
Deleted: me/about route (2 files + dir), constants/Colors.ts (+ empty constants/ dir), components/BannerCarousel.tsx, src/components/google-sign-in.tsx, app/api/auth/{authorize,callback,token}+api.ts (+ empty dirs), 11 unused assets.
Edited: prominent-api-hooks.ts (useBanners + BannersResponse + BannersApiType import removed), useJWT.ts (saveRoles/getRoles/deleteRoles/ROLES_KEY removed), toaster.tsx (InfoToast/ErrorToast/SuccessToast removed), 4 stores (clearProducts, clearSelectedAddress, clearSlotsData, setDrawerHidden removed), PaymentAndOrderComponent.tsx + my-orders/index.tsx (commented Razorpay blocks removed), _layout.tsx (console.log + unused Dimensions import removed).
Verification: zero leftover references; tsc --noEmit total unchanged at 106 (all pre-existing, in ../backend files via @backend types; 0 errors in user-ui's own files).

[2026-09-02 23:45:00] EXECUTE admin_ui_dpsk.md cleanup: delete dead code; KEEP §4 (single-source routes + dead affordances); DO NOT touch npm dependencies.

PLANNED FILE DELETIONS (verified zero live references via grep across apps/admin-ui + packages):
- app/(drawer)/dashboard/coupons/reserved-coupons/index.tsx   (orphaned route; feature duplicated inline as ReservedTab in coupons/index.tsx)
- components/context/auth-context.tsx   (100% commented-out legacy auth; no live exports)
- components/context/roles-context.tsx  (imports non-export AuthContext → broken; useRoles/useIsAdmin zero importers)
- components/dashboard-header.tsx       (zero importers; replaced by drawer header)
- components/TabNavigation.tsx, components/day-account-view.tsx, components/HorizontalImageScroller.tsx (zero importers)
- components/AddressPlaceForm.tsx, components/AddressZoneForm.tsx, components/app-container.tsx (zero importers)
- components/ui/IconSymbol.ios.tsx, IconSymbol.tsx, TabBarBackground.ios.tsx, TabBarBackground.tsx (expo-template tab files; zero importers)
- components/UserIncidentDialog.tsx     (zero importers; live UserIncidentsView.tsx holds private duplicate)
- components/date-time-picker.tsx       (zero importers; duplicate of common-ui's live DateTimePickerMod)
- src/api-hooks/banner.api.ts           (zero importers)
- hooks/useHideDrawerHeader.ts, hooks/useCurrentUserId.ts, hooks/usePhonepeSdk.ts (zero importers)
- hooks/useThemeColor.ts, hooks/useColorScheme.ts, hooks/useColorScheme.web.ts, constants/Colors.ts (template trio; sole consumer = deleted dashboard-header)
- utils/getCurrentUserId.ts             (zero live importers)
- services/axios-admin-ui.ts            (zero importers)
- services/notif-service/notif-checker.tsx, notif-context.tsx, notif-register.ts (never mounted in app/_layout; notif-checker imports nonexistent @/api-hooks/user.api)
- scripts/reset-project.js + e2e/jest.config.js + e2e/starter.test.js + .detoxrc.js (expo-template leftovers; no detox dep/script)

PLANNED EDITS (with false-positive corrections verified by reading live callers):
=== apps/admin-ui/app/(drawer)/dashboard/index.tsx ===
- remove unused import: LinearGradient  (theme import KEPT — used by menu items; only the LinearGradient JSX block is commented out)
=== apps/admin-ui/app/(drawer)/dashboard/send-notifications/index.tsx ===
- remove commented-out ImageUploader UI block; remove now-unused ImageUploader/usePickImage imports, handleImagePick/handleRemoveImage handlers, selectedImage/displayImage state, and their reset lines in sendNotification.onSuccess
  (image-upload feature is commented out/unreachable; useUploadToObjectStorage.uploadSingle KEPT — still used in handleSend)
=== apps/admin-ui/app/(drawer)/dashboard/manage-orders/delivery-sequences/index.tsx ===
- remove commented-out hint-banner JSX block inside the DraggableFlatList
=== apps/admin-ui/hooks/useJWT.ts ===
- prune to live exports only: saveJWT, getJWT, deleteJWT (+ JWT_KEY const). Remove: saveUserId, getUserId, saveRoles, getRoles, deleteRoles, ROLES_KEY, USER_ID_KEY
=== apps/admin-ui/src/components/CouponForm.tsx ===
- remove console.log('Toggling user:', ...) debug line (keep setFieldValue)
=== apps/admin-ui/components/StoreForm.tsx ===
- remove StoreFormRef interface + forwardRef wrapper + unused ref param + displayName (ref never attached by stores/add.tsx or stores/edit.tsx)
- KEPT: ProductForm's ProductFormRef/clearImages (genuinely used by products/edit.tsx via productFormRef.current?.clearImages())
- KEPT: SlotForm's dateTestID/timeTestID props (common-ui DateTimePickerMod accepts them — verified in packages/ui/src/components/date-time-picker.tsx)
- KEPT: OrderOptionsMenu onWhatsApp/onDial props and no-op callers (§4 dead-affordance zone — not deleting)

NOT TOUCHED (per instruction):
- §4: rebalance-orders route, slots/slot-details route, customize-app/product-tags home-grid entries, vendor-snippets "View Slot" no-op button, orders/index packaged-checkbox no-op onPress
- All npm dependencies in package.json (incl. react-native-phonepe-pg, expo-notifications, material-top-tabs, toaster dep, buffer, jwt-decode)
- components/SnippetMenu.tsx SuccessToast call + services/toaster.tsx (product decision — no <Toast/> host mounted)
- user-ui counterparts (LIVE there; e.g. user-ui's useColorScheme/Colors/notif-service are wired and in use)

[2026-09-02 23:58:00] COMPLETED admin_ui_dpsk.md cleanup.
Deleted 34 dead files + emptied dirs:
- Route: app/(drawer)/dashboard/coupons/reserved-coupons/index.tsx (+ emptied dir)
- Components: context/auth-context.tsx, context/roles-context.tsx, dashboard-header.tsx, TabNavigation.tsx, day-account-view.tsx, HorizontalImageScroller.tsx, AddressPlaceForm.tsx, AddressZoneForm.tsx, app-container.tsx, UserIncidentDialog.tsx, date-time-picker.tsx, ui/{IconSymbol,IconSymbol.ios,TabBarBackground,TabBarBackground.ios}.tsx (+ emptied components/ui dir)
- src/api-hooks/banner.api.ts (+ emptied dir)
- Hooks: useHideDrawerHeader.ts, useCurrentUserId.ts, usePhonepeSdk.ts, useThemeColor.ts, useColorScheme.ts, useColorScheme.web.ts
- constants/Colors.ts (+ emptied dir), utils/getCurrentUserId.ts, services/axios-admin-ui.ts, services/notif-service/{notif-checker,notif-context,notif-register} (+ emptied dir)
- scripts/reset-project.js (+ emptied dir), e2e/{jest.config.js,starter.test.js} (+ emptied dir), .detoxrc.js
- components/context/ dir kept (staff-auth-context.tsx is live)

Edited:
- app/(drawer)/dashboard/index.tsx: removed unused LinearGradient import (theme kept — used by menu items; commented gradient JSX block left as comment)
- app/(drawer)/dashboard/send-notifications/index.tsx: removed commented-out image-upload UI + dead image state (selectedImage/displayImage), handleImagePick/handleRemoveImage handlers, ImageUploader/usePickImage/useUploadToObjectStorage imports, and image upload path in handleSend (UI is disabled; uploadSingle had no reachable caller left)
- app/(drawer)/dashboard/manage-orders/delivery-sequences/index.tsx: removed commented-out hint-banner JSX block
- hooks/useJWT.ts: pruned to saveJWT/getJWT/deleteJWT + JWT_KEY (removed saveUserId/getUserId/saveRoles/getRoles/deleteRoles/ROLES_KEY/USER_ID_KEY)
- src/components/CouponForm.tsx: removed debug console.log in toggleUserSelection
- components/StoreForm.tsx: removed unused StoreFormRef interface + forwardRef wrapper + ref param + displayName (now plain function component; StoreFormData export kept)
- Regenerated .expo/types/router.d.ts via brief expo start (removed stale reserved-coupons route types); dev server killed

KEPT (per instruction / verification): §4 routes & affordances (rebalance-orders, slot-details, customize-app/product-tags, vendor-snippets "View Slot" no-op, orders packaged-checkbox no-op); ProductForm ProductFormRef/clearImages (USED by products/edit.tsx); SlotForm dateTestID/timeTestID (common-ui DateTimePickerMod accepts them); OrderOptionsMenu onWhatsApp/onDial props; SnippetMenu SuccessToast + services/toaster.tsx (no Toast host — product decision); all npm dependencies untouched; user-ui counterparts untouched (live there).

Verification:
- grep across apps/admin-ui: zero remaining references to any deleted file/symbol (only generated .expo cache regenerated clean).
- tsc --noEmit: no errors in any file I edited. Remaining 19 admin-ui-local errors + backend errors are pre-existing (in untouched files: complaints, coupons/edit, customize-app, products, user-management, delivery-sequences lines 343/398 implicit-any, ProductGroupForm, ProductsSelector, ProductForm) — verified none are in modified regions.

[2026-09-02 23:20:00] CREATED analysis script: scripts/dead-code/repeat-types.js (read-only type-declaration scanner, outputs scripts/dead-code/repeat-types-raw.json)

[2026-09-03 00:10:00] EXECUTE repeat_types_dpsk.md cleanup — remove legacy doctor/hospital/token types (not relevant to meat-farmer app).

PLANNED CHANGES:
=== packages/ui/shared-types.ts ===
- DELETE all legacy doctor/hospital/token types (zero external references — verified by grep across apps + packages):
  Person, User (hospital-era), Hospital, DoctorSpecialization, DoctorInfo, Doctor, DoctorDetails,
  DashboardDoctor, TokenDoctor, UpcomingToken, PastToken, UpcomingAppointment, MyTokensResponse,
  PastTokensResponse, BookTokenPayload, BookTokenResponse, DoctorAvailability,
  DoctorAvailabilityWithDate, DoctorAvailabilityResponse, DoctorAvailabilityPayload, token_user,
  PatientHistoryToken, PatientHistory, GetHospitalPatientHistoryResponse, PatientHistoryFilters
- DELETE shadowed meat-farmer duplicates that collide with packages/shared (also zero importers):
  Order, Slot, Coupon  (canonical copies live in packages/shared/types/{user.ts, admin.ts})
- KEEP: CreateCouponPayload (only live export — imported by apps/admin-ui coupons via 'common-ui/shared-types')
- REMOVE trailing `export * from './token-types'`

=== packages/ui/token-types.ts ===
- DELETE entire file (DoctorTokenSummary, HospitalTodaysTokensResponse, DoctorTodayToken, DoctorTodaysTokensResponse — only re-exported by shared-types.ts:333, no external consumers)

[2026-09-03 00:15:00] COMPLETED legacy doctor/hospital/token type removal.
- packages/ui/shared-types.ts: rewritten to contain ONLY CreateCouponPayload (the single live export). Removed 28 legacy doctor/hospital/token types + 3 shadowed meat-farmer duplicates (Order, Slot, Coupon — canonical copies live in packages/shared) + trailing `export * from './token-types'`.
- packages/ui/token-types.ts: deleted (4 token-summary types, zero external consumers).
Verification:
- grep across apps + packages: zero references to any removed legacy type name or the token-types module.
- CreateCouponPayload intact; its only importers (admin-ui coupons/edit/[id].tsx + src/components/CouponForm.tsx) unchanged.
- Pre-existing tsc error in coupons/edit/[id].tsx:92 (`skuIds` not in CreateCouponPayload) untouched and unrelated (predates this change; CreateCouponPayload body preserved byte-for-byte).

[2026-09-03 20:03:29] DELETE unused types (no consumers repo-wide; scanner: scripts/dead-code/unused-types.js; ambient .d.ts declarations excluded by design).
NOTE: date rollover — this entry and deletions performed 2026-09-03.

=== apps/backend/src/middleware/auth.middleware.ts ===
- removed interface UserContext (lines 7-12):
    interface UserContext {
      userId: number;
      name?: string;
      email?: string;
      mobile?: string;
    }
- removed interface StaffContext (lines 14-17):
    interface StaffContext {
      id: number;
      name: string;
    }
  (file types context vars via hono's ContextVariableMap augmentation in types/hono.d.ts — those ambient declarations KEPT, they are consumed by hono's type system, not by name)

=== packages/shared/types/coupon.types.ts ===
- removed interface ReservedCoupon (lines 21-25):
    export interface ReservedCoupon extends Coupon {
      secretCode: string;
      redeemedUserId: number | null;
      redeemedAt: Date | null;
    }

=== packages/shared/types/user.ts ===
- removed interface UserAvailabilityEntry (lines 339-345) — transitively dead (only consumer was UserAvailabilityResponse):
    export interface UserAvailabilityEntry {
      id: number;
      price: string;
      marketPrice: string | null;
      flashPrice: string | null;
      isFlashAvailable: boolean;
      isOutOfStock: boolean;
      isSuspended: boolean;
    }
- removed interface UserAvailabilityResponse (lines 347-350):
    export interface UserAvailabilityResponse {
      availability: UserAvailabilityEntry[];
      count: number;
    }

=== packages/ui/src/components/use-pick-image.tsx ===
- removed interface BaseProps (lines 5-8):
    interface BaseProps {
      label?: string;
      multiple: boolean;
    }
- removed interface ImageInfo (lines 22-36) — 15-field expo ImagePicker asset mirror, never referenced (picker assets are spread as any)
  (live hook + its Props type kept; file has 7 consumers)

[2026-09-03 20:06:30] COMPLETED unused-type deletion: 7 types removed across 4 files.

[2026-09-03 20:20:00] DEDUP IDENTICAL TYPES — centralize exact duplicates into @packages/shared (71 safe uniform names, per types_inventory.md §3).
NOTE: date rollover — this entry performed 2026-09-03.

=== NEW FILES in packages/shared/types/ ===
- upload.types.ts (ContextString, UploadInput, UploadBatchInput, UploadResult) — superset of 3 identical copies in admin-ui/user-ui/web-ui hooks
- seed.types.ts (UnitSeedData, StaffRoleName, StaffPermissionName, RolePermissionAssignment, KeyValSeedData) — 2 identical copies in db_helper_{postgres,sqlite}/lib/seed.ts
- inputs.types.ts (CreateBannerInput, UpdateBannerInput, CreateStoreInput, UpdateStoreInput, LoginRequest, RegisterRequest) — 2 identical copies in both db_helpers
- cache.types.ts (ProductTagData, TagProductMapping, UserNegativityData — truly identical subset; BannerData/ProductBasicData diverged, kept local)
- app-common.types.ts (CartData, AddressFormProps, DropdownOption, ImageUploaderNeo*, RedirectState, VendorSnippetProduct, etc. — cross-app identical copies)
- Updated packages/shared/types/index.ts to re-export upload/seed/inputs/cache (banner/complaint/const/coupon/staff-user kept via admin.ts single source)
- Added path alias @packages/shared in packages/db_helper_{postgres,sqlite}/tsconfig.json (both packages)

=== REWIRING PLAN (next edits — not yet applied in this chunk) ===
- db_helper_postgres/src/admin-apis/banner.ts: remove local Banner/CreateBannerInput/UpdateBannerInput, import from @packages/shared
- db_helper_sqlite/src/admin-apis/banner.ts: same
- db_helper_{postgres,sqlite}/src/admin-apis/complaint.ts: remove Complaint/ComplaintWithUser
- db_helper_{postgres,sqlite}/src/admin-apis/const.ts: remove Constant
- db_helper_{postgres,sqlite}/src/admin-apis/coupon.ts: remove CouponValidationResult/UserMiniInfo (Coupon stays local until divergence resolved)
- db_helper_{postgres,sqlite}/src/admin-apis/store.ts: remove Store/CreateStoreInput/UpdateStoreInput
- db_helper_{postgres,sqlite}/src/admin-apis/staff-user.ts: remove StaffUser/StaffRole
- db_helper_{postgres,sqlite}/src/lib/seed.ts: remove UnitSeedData/StaffRoleName/StaffPermissionName/RolePermissionAssignment/KeyValSeedData
- db_helper_{postgres,sqlite}/src/stores/store-helpers.ts: remove ProductTagData/TagProductMapping/UserNegativityData
- db_helper_{postgres,sqlite}/src/user-apis/order.ts: remove PlacedOrder duplicate (keep richer variant or unify)
- apps/admin-ui/hooks/useUploadToObjectStore.ts, apps/user-ui/hooks/useUploadToObjectStore.ts, apps/web-ui/src/hooks/useUploadToObjectStorage.ts: remove UploadInput/Batch/Result/ContextString
- apps/user-ui/hooks/cart-query-hooks.tsx ↔ apps/web-ui/src/hooks/cart-query-hooks.ts: CartData
- apps/user-ui/components/AddressForm.tsx ↔ apps/web-ui/src/components/AddressForm.tsx: AddressFormProps
- packages/ui/src/components/ImageUploaderNeo.tsx ↔ packages/web-components/src/components/image-uploader-neo.tsx: ImageUploaderNeo* 
- packages/ui/src/components/dropdown.tsx ↔ packages/web-components/src/components/dropdown.tsx: DropdownOption
- STALE per-domain files to delete after rewiring: banner.types.ts, complaint.types.ts, const.types.ts, coupon.types.ts, staff-user.types.ts (all re-exported via admin.ts)

=== TO VERIFY AFTER REWIRING ===
- grep for each deduped type name: only definition stays in packages/shared (or admin.ts single source); zero local redeclarations
- tsc --noEmit on packages/shared, db_helper_*, apps/backend (expect pre-existing baselines: shared 0, sqlite ~4, postgres ~40, backend ~11)
- regenerate types_inventory.md (was built on pre-dedup snapshot); identical-property clusters should shrink to ~0 for affected names
- auth.middleware.ts: UserContext, StaffContext (kept hono.d.ts ContextVariableMap — ambient module augmentation, consumed by hono's type system)
- shared/coupon.types.ts: ReservedCoupon
- shared/user.ts: UserAvailabilityResponse + UserAvailabilityEntry (transitively dead — only consumer was the removed response type)
- ui/use-pick-image.tsx: BaseProps, ImageInfo
Verification: zero leftover references repo-wide; tsc baselines unchanged — backend 11, packages/ui 924, user-ui 106, admin-ui 122 (all pre-existing).
Scanner limitation noted: same-name declarations across files (e.g. Props, Order) can mask per-copy deadness via word-boundary matching; those require import-graph resolution and were not touched.

[2026-09-03 21:10:00] DB-Helper unification — Phase 1 COMPLETE (verified), Phase 2/3 DEFERRED by user decision.
Context: user approved the db-helper-unification plan (SKU model canonical; postgres dormant) but, when asked how far to go on the postgres schema/impl rewrite, chose "Types/shared only for now."

=== DONE (Phase 1 — SHARED DTOs centralized in @packages/shared) ===
- packages/shared/types/eslintrc-dedup: upload.types.ts, seed.types.ts, inputs.types.ts, cache.types.ts, app-common.types.ts — created & re-exported in types/index.ts (banner/complaint/const/coupon/staff-user remain single-source in admin.ts).
- Both db_helper_{postgres,sqlite} tsconfig.json: added "@packages/shared" + "@packages/shared/*" path aliases → ../shared.
- Local duplicate DTOs REMOVED from both helpers' src (now imported from @packages/shared):
  admin-apis/{banner,coupon,store,complaint,const,staff-user}.ts, lib/seed.ts, stores/store-helpers.ts (ProductTagData/TagProductMapping/UserNegativityData), user-apis/*.ts.
- Verified: `grep -rnE "^(export )?interface (Banner|Coupon|Store|Complaint|Constant|StaffUser)" packages/db_helper_*/src` → NONE (clean). Both helpers typecheck-resolve @packages/shared via tsconfig paths.
- Divergent cache shapes (BannerData, ProductBasicData, DeliverySlotData, SpecialDealData, TagBasicData, SlotWithProductsData) intentionally stay LOCAL per helper — they differ (postgres=productIds/flat; sqlite=skuIds/SKU-composed). Documented in cache.types.ts header comment.

=== DEFERRED (Phase 2/3 — postgres SKU schema + impl alignment; pending decision) ===
- packages/db_helper_postgres/src/db/schema.ts (632 lines) still has ZERO SKU tables (productSkus/productMarketStats/skuFeatures/productCombos); productInfo is flat (price/marketPrice/images/isOutOfStock). sqlite has 43 tables, SKU-tier (37 refs).
- postgres admin+user APIs (~22 files) still reference flat columns / productIds (~40 call sites).
- Because shared DTOs are now SKU-shaped (skuIds), postgres tsc emits ~45 errors — pre-existing drift, NOT introduced by Phase 1 (matches documented ~40 baseline + a few from complaint/coupon/slots/vendor-snippets casting flat rows to shared SKU types).
- Next step (when user opts in): rewrite postgres schema.ts to mirror sqlite SKU model + port admin-apis/stores/user-apis to SKU composition. Per AGENTS.md, no drizzle migration is run by the agent (DB drift until user migrates).

=== REBUILT types_inventory.md (latest snapshot) ===
792 types (521 unique), 143 duplicate names, 131 identical-property clusters, 711 `any` usages across 210 files. Organized by file + by name, duplicate clusters w/ consumers, identical-property clusters, per-file `any` table.

[2026-09-04 23:36:11] PHASE 1: dedupe packages/shared/types/admin.ts — 10 types re-declared identically in dedicated files are replaced by re-exports (verified byte-identical modulo comments/whitespace).

=== packages/shared/types/admin.ts ===
- removed local declarations: Banner, Complaint, ComplaintWithUser, Constant, ConstantUpdateResult, Coupon, CouponValidationResult, UserMiniInfo, StaffUser, StaffRole
- added re-export block:
    export type { Banner } from './banner.types'
    export type { Complaint, ComplaintWithUser } from './complaint.types'
    export type { Constant, ConstantUpdateResult } from './const.types'
    export type { Coupon, CouponValidationResult, UserMiniInfo } from './coupon.types'
    export type { StaffUser, StaffRole } from './staff-user.types'
- KEPT in admin.ts: Store (canonical home — store.types.ts note says so), AdminOrderRow and everything below

[2026-09-04 23:40:00] PHASE 1b: packages/shared/types/user.ts — UserBanner is byte-identical to Banner; replaced local declaration with alias.
- removed local interface UserBanner (10 fields) at user.ts ~line 119
- added:  import type { Banner } from './banner.types'
           export type UserBanner = Banner
  (5 live consumers — sqlite/postgres banners.ts, backend dbService re-export — keep working unchanged)

[2026-09-04 23:47:00] PHASE 2: centralize cross-app / in-app exact-duplicate types.

=== apps/user-ui/src/types/auth.ts ===
- replaced local interfaces with shared aliases (shared/inputs.types.ts LoginRequest/RegisterRequest verified byte-identical):
    removed:  export interface LoginCredentials { identifier: string; password: string; }
              export interface RegisterData { name; email; mobile; password; profileImageUrl?: string | null; }
    added:    import type { LoginRequest, RegisterRequest } from '@packages/shared'
              export type LoginCredentials = LoginRequest
              export type RegisterData = RegisterRequest
  (6 consumer files keep importing the same names from '@/src/types/auth' — zero consumer edits)

=== apps/user-ui/hooks/useAuthenticatedRoute.ts + src/contexts/AuthContext.tsx ===
- RedirectState identical in both. Canonical: AuthContext (line 11 interface → exported).
- hook: deleted local interface, added  import type { RedirectState } from '@/src/contexts/AuthContext'
  (hook already imports useAuth from AuthContext — no new cycle)

=== login forms (user-ui + web-ui) ===
- both LoginFormInputs identical. Canonical: shared/app-common.types.ts LoginFormInputs (already there).
- apps/user-ui/app/(auth)/login.tsx: deleted local interface, added  import type { LoginFormInputs } from '@packages/shared'
- apps/web-ui/src/routes/login.tsx: deleted local interface, added  import type { LoginFormInputs } from '@packages/shared'

=== user-ui Order/OrderItem view models ===
- new file apps/user-ui/src/types/orders.ts exporting the identical Order + OrderItem interfaces (from me/my-orders/index.tsx)
- me/my-orders/index.tsx + components/NextOrderGlimpse.tsx: deleted locals (incl. the '// Type definitions' comment), import from '@/src/types/orders'

=== apps/user-ui/src/store/centralSlotStore.ts ===
- deleted local  type AvailabilityEntry = AvailabilityApiType['availability'][number]  (line 8)
- added  import type { AvailabilityEntry } from '@/src/hooks/prominent-api-hooks'
  (type-only import — no runtime cycle with the store's existing value import from the same file)

[2026-09-04 23:55:00] PHASE 3: centralize remaining exact-duplicate db types.

(a) FIX broken seed re-export chain (prior session migrated lib/seed.ts to shared imports but left index.ts re-exporting from lib/seed):
- packages/db_helper_sqlite/src/lib/seed.ts + packages/db_helper_postgres/src/lib/seed.ts: added
    export type { UnitSeedData, StaffRoleName, StaffPermissionName, RolePermissionAssignment, KeyValSeedData } from '@packages/shared'
  (index.ts `export { ..., type UnitSeedData, ... } from './src/lib/seed'` blocks resolve again)

(b) NEW packages/shared/types/order.types.ts: PlacedOrder, CouponUsageWithCoupon, GetAllOrdersInput
  (copied verbatim from sqlite; pg verified byte-identical. NOT included: OrderWithCancellationData — extends drifted OrderWithFullData, stays local in both packages.)
- shared/types/index.ts: added  export type * from './order.types';

(c) MIGRATIONS to shared:
- sqlite+pg user-apis/order.ts: deleted local PlacedOrder + CouponUsageWithCoupon; extended existing '@packages/shared' import
- sqlite+pg admin-apis/order.ts: deleted local GetAllOrdersInput; extended existing '@packages/shared' import
- sqlite+pg stores/store-helpers.ts: deleted local StoreBasicData interface; added
    import type { StoreSummary } from '@packages/shared'
    export type StoreBasicData = StoreSummary
  (index.ts `type StoreBasicData` export lines + backend consumers keep working via the alias; shared StoreSummary verified identical shape)

NOT touched (verified different, per exact-dupe rule): CreateCouponInput/UpdateCouponInput, CreateProductTagInput/UpdateProductTagInput, SlotSnippetInput, CreateSkuInput/CreateProductInput (sku- vs product-model drift); InferSelectModel *Row aliases (schema-bound per package); user-apis richer CouponValidationResult (different concept, same name — rename candidate only); backend banner-store Banner (subset shape); const-keys files (different key sets).

[2026-09-04 23:58:00] FIX Phase 1 regression: my shape comparison was unreliable (shell-quoting artifact) and wrongly unified 2 drifted pairs. sqlite tsc went 4 -> 12 errors (coupon.ts x5, staff-user.ts x3).
- Coupon: admin.ts original had `skuIds: number[] | null`; canonical coupon.types.ts has `productIds: number[] | null` — RESTORED admin.ts local Coupon.
- StaffUser: admin.ts original had `staffRoleId: number | null`; canonical staff-user.types.ts has `staffRoleId: number` — RESTORED admin.ts local StaffUser.
- Verified truly identical (re-export kept): Banner, Complaint, ComplaintWithUser, Constant, ConstantUpdateResult, UserMiniInfo, StaffRole.

[2026-09-04 23:59:00] PHASE 4: additive shared primitives + aliasing (zero consumer edits).
- NEW packages/shared/types/primitives.types.ts: MessageResponse {success, message}, IdName {id, name} (leaf module, no imports — no cycles)
- shared/types/index.ts: added  export type * from './primitives.types';
- shared/types/user.ts: 8 interfaces (UserAddressDeleteResponse, UserCancelOrderResponse, UserDeleteAccountResponse, UserPasswordUpdateResponse, UserPaymentFailResponse, UserPaymentVerifyResponse, UserRaiseComplaintResponse, UserUpdateNotesResponse) become  export type X = MessageResponse
- shared/types/admin.ts: AdminOrderMessageResult becomes  export type AdminOrderMessageResult = MessageResponse ; AdminVendorSnippetProduct becomes  export type AdminVendorSnippetProduct = IdName
- apps/admin-ui/types/vendor-snippets.ts: VendorSnippetProduct becomes alias of shared IdName
- apps/admin-ui/components/ProductListDialog.tsx: local VendorSnippetProduct becomes alias of shared IdName
- apps/admin-ui/src/components/TagForm.tsx: StoreOption becomes alias of shared IdName
- apps/admin-ui/components/context/staff-auth-context.tsx: Staff becomes alias of shared IdName
- apps/backend/src/middleware/auth.middleware.ts: StaffContext becomes alias of shared IdName
DECISION (documented, not done): ui<->web-components prop mirrors left independent (no cross-dep between the RN and web UI packages; wiring one for 3 prop types is disproportionate). migrator TableInfo/ColumnInfo left (ColumnInfo field names differ per direction — unifying TableInfo alone would be wrong). CartData left (each app's CartItem element type differs). Drifted pairs (coupon/tag/slot/product inputs, store-helpers cache types, user-apis order relations) left per exact-dupe rule.

[2026-09-05 00:02:00] FIX two regressions found by tsc verification:
(a) admin.ts used MessageResponse/IdName in aliases without importing them (export-from does not bring names into local scope) — added  import type { MessageResponse, IdName } from './primitives.types'  (re-export line kept).
(b) Pre-existing broken chain from prior centralization session (NOT mine, but fixed as part of unification): both store-helpers.ts files imported ProductTagData/TagProductMapping/UserNegativityData from shared without re-exporting, while both index.ts files re-export those names from store-helpers (TS2459 x3 in backend build). Added  export type { ProductTagData, TagProductMapping, UserNegativityData } from '@packages/shared'  to both store-helpers files.

[2026-09-05 00:05:00] FIX two more gaps from prior centralization session (surfaced by my Phase 2 wiring):
(a) shared/types/app-common.types.ts was never added to shared/types/index.ts star exports — added  export type * from './app-common.types';  (no name collisions verified). This makes LoginFormInputs/DropdownOption/CartIconProps/AddressFormProps/ComplaintFormProps/CartData importable from '@packages/shared'.
(b) user-ui prominent-api-hooks.ts declared AvailabilityEntry without export — added export keyword so centralSlotStore's import resolves.

[2026-09-05 00:08:50] COMPLETED exact-duplicate type unification (Phases 1-4).
Centralized in @packages/shared and re-used:
- admin.ts: Banner, Complaint, ComplaintWithUser, Constant, ConstantUpdateResult, CouponValidationResult, UserMiniInfo, StaffRole → re-exports (Coupon + StaffUser KEPT local — verified drifted: skuIds vs productIds, staffRoleId nullable vs not)
- user.ts: UserBanner → alias of Banner
- NEW order.types.ts: PlacedOrder, CouponUsageWithCoupon, GetAllOrdersInput; both db packages import them (OrderWithCancellationData left local — extends drifted OrderWithFullData)
- StoreBasicData (both store-helpers) → alias of shared StoreSummary (verified identical shape)
- seed re-export chain repaired in both lib/seed.ts (was dangling after prior session's migration)
- user-ui: LoginCredentials/RegisterData → shared aliases; RedirectState canonical in AuthContext; LoginFormInputs (user-ui + web-ui) → shared app-common; Order/OrderItem → new src/types/orders.ts; AvailabilityEntry canonical in prominent-api-hooks
- primitives.types.ts (MessageResponse, IdName): 8 user.ts + AdminOrderMessageResult + AdminVendorSnippetProduct + 4 cross-file {id,name} types aliased
- Fixed as found: app-common.types.ts added to shared index star-exports; AvailabilityEntry export added in user-ui hooks; 3 dangling store-helpers re-exports repaired
Verification: backend 11, sqlite 4, user-ui 106, admin-ui 122 (all = baselines); pg 45 = 40 + 5 pg-coupon casts that reproduce with byte-restored admin.ts (pre-existing drift from prior session, documented in report §8). Zero errors mention any unified name.
Deliberately NOT unified (documented in repeat_types_glm.md §8 + change-log): drifted input types (coupon/tag/slot/product), InferSelectModel *Row aliases (schema-bound), ui<->web-components (no cross-dep), migrator ColumnInfo (field names differ per direction), CartData (element types differ), backend banner-store Banner (subset shape), const-keys files (different key sets).

[2026-09-05 00:24:25] PHASE 5: unify remaining verified exact-duplicate types.
- shared primitives.types.ts: added BasicSuccessResponse {success: boolean}
- shared admin.ts: AdminDeleteProductResult, AdminSlotDeleteResult → aliases of MessageResponse; AdminSlotUpdateResult → alias of AdminSlotCreateResult
- shared user.ts: UserSavePushTokenResponse → alias of BasicSuccessResponse; UserDeliverySlot → alias of AdminDeliverySlot (+import from ./admin; no cycle — admin.ts does not import user.ts)
- shared app-common.types.ts: DELETED zero-consumer stale CartData (wrong element type), DropdownOption, CartIconProps; REPLACED stale AddressFormProps with the real current shape; ADDED StoreHeaderState, CartStore, AddedToCartProduct, CompactProductCardProps, ComplaintItemProps
- admin-ui TagForm.tsx: exported TagFormData; product-tags/add.tsx: deleted local, imports it (edit/index.tsx extended version untouched)
- admin-ui ProductGroupForm.tsx: exported ProductGroup; product-groupings/index.tsx: deleted local, imports it
- user-ui + web-ui AddressForm: deleted locals, import shared AddressFormProps
- user-ui + web-ui ComplaintForm: deleted locals, import shared ComplaintFormProps
- web-ui flash.tsx + slot-view.tsx: deleted local CompactProductCardProps, import shared
- user-ui complaints/index.tsx + web-ui me.complaints.tsx: deleted local ComplaintItemProps, import shared
- user-ui cartStore + web-ui cart-store: deleted local AddedToCartProduct + CartStore, import shared; flashCartStore: AddedFlashProduct → alias of shared AddedToCartProduct
- user-ui storeHeaderStore + web-ui store-header-store: deleted local state interfaces, import shared StoreHeaderState; web-ui keeps hook name via  type StoreHeaderStore = StoreHeaderState
- user-ui home/index.tsx: deleted ExploreProductItemProps, uses ProductItemProps
- user-ui cart.tsx + checkout.tsx: deleted empty Props{} + dropped unused props params
- backend order.ts: deleted second DeliveryStatus/OrderStatus pair (lines ~477-478), first pair serves both scopes
NOT unified (verified different or out of scope, documented): ChipProps/TagChipProps (different Tag element types), Tag pair (productIds? vs imageUrl), ProductsResponse family (backend-circular), CartData element types, StoreHeaderSt— n/a, migrator ColumnInfo, ui<->web props, fallback-ui 3d props, ProductsResponseAlias/ProductsResponse placeholders.

[2026-09-05 00:30:00] CORRECTION: reverted deletion of backend order.ts second DeliveryStatus/OrderStatus pair — both pairs are function-scoped (different closures), not file duplicates. No change needed there; cluster 49/50 verdict in types_inventory was wrong on scope.

[2026-09-05 00:35:00] PHASE 5 (continued): unify remaining verified exact-duplicates; CORRECTIONS for two over-eager aliases.
- shared primitives.types.ts: added BasicSuccessResponse {success: boolean}
- shared admin.ts: AdminSlotUpdateResult → alias of AdminSlotCreateResult; AdminOrderBasicResult → alias of BasicSuccessResponse
- shared user.ts: UserDeliverySlot → alias of AdminDeliverySlot (+import; no cycle)
- shared app-common.types.ts rewritten: DELETED zero-consumer stale CartData (wrong element type), DropdownOption, CartIconProps, RedirectState, VendorSnippetProduct, ProductsResponseAlias/ProductsResponse placeholders; REPLACED stale AddressFormProps with real shape; ADDED StoreHeaderState, CartStore, AddedToCartProduct, CompactProductCardProps, ComplaintItemProps
- user-ui + web-ui cart stores: local AddedToCartProduct + CartStore deleted, import shared; flashCartStore AddedFlashProduct → alias
- user-ui storeHeaderStore + web-ui store-header-store: locals deleted, import shared StoreHeaderState (web-ui keeps name via alias)
- user-ui + web-ui AddressForm/ComplaintForm: locals deleted, import shared
- web-ui flash.tsx + slot-view.tsx: local CompactProductCardProps deleted, import shared
- user-ui complaints + web-ui me.complaints: local ComplaintItemProps deleted, import shared
- admin-ui TagForm.tsx: TagFormData exported; product-tags/add.tsx imports it (edit/index extended version untouched)
- admin-ui ProductGroupForm.tsx: ProductGroup exported; product-groupings/index.tsx imports it
- user-ui home/index.tsx: ExploreProductItemProps deleted (uses ProductItemProps)
- user-ui cart.tsx + checkout.tsx: empty Props{} + unused props params deleted
- CORRECTION 1: reverted AdminDeleteProductResult/AdminSlotDeleteResult → MessageResponse aliases — backend procedures return {message} without success; aliasing changed the contract (tsc proved it). Restored local {message} interfaces. ({success,message}×9 aliases unaffected — identical contracts.)
- CORRECTION 2: removed accidentally-duplicated UserSavePushTokenResponse alias line in user.ts (duplicate identifier).
- CORRECTION 3: reverted backend order.ts DeliveryStatus/OrderStatus deletion — both pairs are function-scoped, not file duplicates.
- NOT unified (verified): ChipProps/TagChipProps (different Tag element types), Tag pair, ProductsResponse family (backend-circular), StoreHeader n/a, AdminCancelOrderError (union, not same shape), OffersSectionProps (single def), Props usage n/a.

[2026-09-05 00:40:00] CREATED analysis script scripts/subset-types.js (read-only subset/superset scanner; outputs scripts/subset-types-raw.json). No source changes in this entry.

[2026-09-05 00:47:00] PHASE 6: unify remaining verified exact-duplicates.
- shared seed.types.ts: KeyValSeedData → alias of Constant (+import from ./const.types; no cycle — const.types has no imports)
- shared user.ts: UserProductStoreInfo → alias of StoreSummary (+import from ./store.types; no cycle)
- shared cache.types.ts: DELETED PlacedOrderShape (zero consumers repo-wide; db PlacedOrder in order.types.ts is canonical)
- backend auth.ts: deleted local LoginRequest/RegisterRequest, import from '@packages/shared' (same treatment user-ui got)
- sqlite+pg user-apis/order.ts: OrderDetailWithRelations → alias of OrderWithRelations (verified byte-identical bodies 879/879 and 820/820)
- shared app-common.types.ts: added FlashDeliveryProps {isFlashDelivery?: boolean}
- user-ui cart-page/checkout-page + web-ui FloatingCartBar: {isFlashDelivery?} prop interfaces → aliases of shared FlashDeliveryProps
- user-ui home/index.tsx: deleted RenderStoreProps, uses SlotItemProps (same file, identical)
- web-components image-gallery.tsx: ImageGalleryProps → alias of ImageCarouselProps (same package)
NOT unified (verified): Tag pair user-ui/web-ui (name-collision risk with backend's richer Tag — same judgment as ChipProps pair); DropdownOption pair (ui has extra disabled?); ImageUploader/quantifier/dialog/checkbox/profile/search props (independent RN/web packages); CharactersProps (fallback-ui, out of scope); ProductsResponse family (backend-circular); migrator TableInfo (ColumnInfo differs); AndSnippets vs Base (verified DIFFERENT — WithAccess vs plain vendor snippets); SkuSummary admin-ui (sqlite's not exported via index); RegisterRequest backend done above.

[2026-09-05 10:01:39] COMPLETED Phase 6 second wave + full verification.
- shared: KeyValSeedData→Constant, UserProductStoreInfo→StoreSummary, AdminOrderBasicResult+UserSavePushTokenResponse→BasicSuccessResponse (new primitive), AdminSlotUpdateResult→AdminSlotCreateResult, UserDeliverySlot→AdminDeliverySlot, AdminDeleteProductResult + AdminSlotDeleteResult restored as local {message} (contract — backend returns message-only), app-common rewritten (real AddressFormProps; added StoreHeaderState/CartStore/AddedToCartProduct/CompactProductCardProps/ComplaintItemProps; deleted stale CartData/DropdownOption/CartIconProps/RedirectState/VendorSnippetProduct/placeholders)
- backend auth.ts: LoginRequest/RegisterRequest → shared imports
- db packages: OrderDetailWithRelations → alias (both, byte-identical verified); PlacedOrderShape deleted (zero consumers)
- admin-ui: TagFormData/ProductGroup canonical in form components; VendorSnippetProduct/StoreOption/Staff → IdName aliases
- user-ui + web-ui: cart/header stores, AddressForm, ComplaintForm, CompactProductCardProps, ComplaintItemProps → shared; ExploreProductItemProps/Props{}/RenderStoreProps removed
- web-ui store-header keeps hook name via alias
Verification: backend 11, sqlite 4, pg 45 (40+5 pre-existing coupon casts), user-ui 106, admin-ui 122 — all baselines hold; web-ui 150 (no baseline; errors are pre-existing JSX friction, none touch unified names).
Left deliberately (verified): Tag pair (backend name-collision risk), DropdownOption pair (ui has extra disabled?), ui<->web prop mirrors (independent packages), ChipProps pair, ProductsResponse family, migrator ColumnInfo, AndSnippets vs Base (verified DIFFERENT), fallback-ui (out of scope), drifted inputs, InferSelectModel rows, SkuSummary (not exported via index), DeliveryStatus/OrderStatus (function-scoped), OffersSectionProps (single), Props usage n/a.

[2026-09-05 10:10:00] Regen unification: OffersSectionProps (web-ui offers.tsx + user-ui order-again/index.tsx, verified identical) → shared app-common.types.ts; both routes import it.

[2026-09-05 10:20:00] Regen unification round 2: OffersSectionProps → shared app-common (web-ui offers + user-ui order-again import it); ImageGalleryProps → alias of ImageCarouselProps (same package web-components).

[2026-09-05 10:22:00] web-components image-carousel.tsx: exported ImageCarouselProps (needed by image-gallery.tsx alias).

[2026-09-05 10:30:00] Regen catch: packages/shared/types/cache.types.ts declared ProductTagData TWICE (bad merge) — deleted the duplicate second copy. No consumers affected (same shape).

[2026-09-05 10:35:00] REGENERATED types_inventory.md via new scripts/gen-inventory.js + scripts/render-inventory.js (read-only analysis scripts).
- Fresh harvest: 562 files, 620 declarations, 490 unique names, 42 single-identifier aliases (classified separately), 98 duplicate names, 56 clusters, 698 any-hits.
- Harvest fixes vs 09-03 edition: import/export-block lines never harvested (~17 bogus clusters gone); aliases excluded from shape clustering (new Unified Aliases section); React. qualifier stripped; optionality ignored (documented).
- Fixed as found during regen: duplicate ProductTagData in shared cache.types.ts (deleted 2nd copy); ImageGalleryProps → alias of ImageCarouselProps (+export added); OffersSectionProps → shared app-common (web-ui + user-ui import it).
- Verification: backend 11, sqlite 4, user-ui 106, admin-ui 122, pg 45 (40+5 pre-existing) — all baselines hold; web-components 3 pre-existing JSX errors, untouched by edits.

[2026-09-05 10:45:00] CREATED analysis scripts (read-only): scripts/gen-inventory.js (types harvest + clustering), scripts/render-inventory.js (md renderer with per-cluster verdicts), scripts/gen-cluster-files.js (per-cluster md files with full defs + consumers), scripts/update-inventory.js (one-off patch helper for the 09-03 edition; superseded by regeneration).
GENERATED: type-clusters/ folder (56 cluster files + README index).
REGENERATED: types_inventory.md from current tree (replaces 09-03 snapshot + manual annotations).

[2026-09-05 10:57:13] DELETE all agent-created analysis scripts (user request — remove, not needed; nothing references them in code or configs).
Deleted files in scripts/:
- gen-cluster-files.js, gen-inventory.js, render-inventory.js, update-inventory.js
- subset-types.js, subset-types-raw.json, types-inventory-data.json
Deleted directory scripts/dead-code/ entirely (contained only agent-created files):
- user-ui-files.js, user-ui-symbols.js, user-ui-suspects.js, user-ui-store-actions.js, user-ui-store-final.js, user-ui-store-precise.js
KEPT (pre-existing, not mine): scripts/clear-db-old.sql, scripts/clear-db.sql, scripts/s3-cleaner.js, scripts/s3-sync.js
Follow-up md-only cleanup: subset_types_glm.md lines referencing the deleted scripts reworded (no code impact).

[2026-09-05 11:03:50] ADD shared ReactParentComponent for Cluster-1 unification.
=== packages/shared/types/primitives.types.ts ===
- added type-only react import + new interface (appended):
    import type { ReactNode } from 'react'
    export interface ReactParentComponent {
      children: ReactNode
    }
- header comment updated: leaf module rule now reads "no runtime imports (type-only imports erased at compile are fine)".

[2026-09-05 11:06:00] Cluster-1 unification: replace 9 local children-only interfaces with shared ReactParentComponent (user-ui + ui).
- LocationTestWrapper.tsx: delete lines 44-46 (interface LocationTestWrapperProps); add shared type import; `: LocationTestWrapperProps` → `: ReactParentComponent` at use site line 51
- HealthTestWrapper.tsx: delete lines 9-11 (interface HealthTestWrapperProps); add import; `React.FC<HealthTestWrapperProps>` → `React.FC<ReactParentComponent>`
- WebViewWrapper.tsx: delete lines 9-11; add import; `{ children }: WebViewWrapperProps` → `{ children }: ReactParentComponent`
- FirstUserWrapper.tsx: delete lines 5-7 (interface Props); add import; `React.FC<Props>` → `React.FC<ReactParentComponent>`
- UpdateChecker.tsx: delete lines 5-7; add import; `React.FC<UpdateCheckerProps>` → `React.FC<ReactParentComponent>`
- notif-context.tsx: delete lines 36-38; add import; `React.FC<NotificationProviderProps>` → `React.FC<ReactParentComponent>`
- AuthContext.tsx: delete lines 19-21; add import; `React.FC<AuthProviderProps>` → `React.FC<ReactParentComponent>`
- CentralStoreInitializer.tsx: delete lines 5-7; add import; `{ children }: CentralStoreInitializerProps` → `{ children }: ReactParentComponent`
- ui app-container.tsx: delete lines 7-9 (interface Props); add import; `(props: Props)` → `(props: ReactParentComponent)`
Import line used everywhere:  import type { ReactParentComponent } from '@packages/shared'
Excluded: MyTouchableOpacityProps (optional children + extends — different shape); other files' same-named Props (different interfaces, verified).

[2026-09-05 11:10:00] CORRECTION (LocationTestWrapper): my first edit inserted a duplicate component declaration (interface did not directly precede the component). Repaired — file now has single component with ReactParentComponent annotation, interface + comment preserved correctly.

[2026-09-05 11:07:29] Cluster-1 fallback-ui: add @packages/shared path mapping to tsconfig (mirrors user-ui mapping), replace SuperAdminGuardProps + AuthWrapperProps with shared ReactParentComponent.
- apps/fallback-ui/tsconfig.json paths: added  "@packages/shared": ["../../packages/shared"],  "@packages/shared/*": ["../../packages/shared/*"]
- SuperAdminGuard.tsx: deleted lines 3-5 interface; added shared type import; `{ children }: SuperAdminGuardProps` → `{ children }: ReactParentComponent`
- AuthWrapper.tsx: deleted lines 7-9 interface; added shared type import; `{ children }: AuthWrapperProps` → `{ children }: ReactParentComponent`

[2026-09-05 11:08:15] Cluster-1 cleanup: remove now-unused ReactNode named imports (orphaned by interface deletions).
- notif-context.tsx: removed `ReactNode,` from react import block
- AuthContext.tsx: removed `ReactNode` from react import list

[2026-09-05 11:09:00] Cluster-1 cleanup: remove orphaned ReactNode named import in LocationTestWrapper.tsx (only remaining ReactNode use was the deleted interface).

[2026-09-05 11:12:00] FIX: shared/types/index.ts never starred primitives.types (existing MessageResponse/IdName only surfaced via admin.ts re-export). Added  export type * from './primitives.types';  so ReactParentComponent resolves from '@packages/shared'.

[2026-09-05 11:15:00] COMPLETED Cluster-1 ReactParentComponent unification (11 files + shared def + fallback-ui tsconfig).
Verification: user-ui 106, admin-ui 122, backend 11 (all = baselines); fallback-ui 107 total with zero errors in touched files. Zero leftover local interfaces. Docs: cluster-01 file + types_inventory status section marked resolved.

[2026-09-05 11:20:24] ADD shared TabIconProps for Cluster-2 unification.
=== packages/shared/types/primitives.types.ts ===
- appended:
    export interface TabIconProps {
      focused: boolean
      size: number
      color: string
    }

[2026-09-05 11:21:00] Cluster-2 unification: replace 6 local tab-icon prop interfaces with shared TabIconProps.
- apps/user-ui/components/icons/{HomeIcon,OffersIcon,CartIcon,StoresIcon,MeIcon}.tsx + packages/ui/src/components/icons/CartIcon.tsx: in each file delete lines 4-8 (local interface + trailing blank line) and add  import type { TabIconProps } from '@packages/shared'  after the react-native-svg import; update the single annotation  React.FC<XxxIconProps> → React.FC<TabIconProps>
- Excluded: nothing — all 6 members verified byte-identical shape, single local use each, no cross-file consumers.

[2026-09-05 11:25:00] COMPLETED Cluster-2 TabIconProps unification (6 files + shared def).
Added shared TabIconProps {focused, size, color} in primitives.types.ts (auto-exported via existing primitives star). Replaced all 6 local interfaces (5 user-ui icons + ui CartIcon), each verified single local use, zero cross-file consumers.
Verification: user-ui 106, admin-ui 122, backend 11 (all = baselines); zero leftover local interfaces. Docs: cluster-02 file + types_inventory status section marked resolved.

[2026-09-05 11:25:09] Cluster-04 (ProductRow): NOT unified — sqlite vs pg productInfo schemas differ (sqlite: storeId/incrementStep/productType; pg: unitId/price/images/flags), so one shared alias cannot represent both. Correct action instead: delete the 2 DEAD copies.
- packages/db_helper_postgres/src/admin-apis/vendor-snippets.ts: delete line 15  type ProductRow = InferSelectModel<typeof productInfo>  (zero references anywhere)
- packages/db_helper_sqlite/src/admin-apis/vendor-snippets.ts: delete line 16  type ProductRow = InferSelectModel<typeof productInfo>  (zero references anywhere)
Kept local (live, genuinely different types): pg product.ts:31 (1 use), sqlite product.ts:64 (2 uses).

[2026-09-05 11:28:00] COMPLETED Cluster-04 ProductRow handling (unification declined, dead copies removed).
Verification: tsc sqlite 4, pg 45 (both = baselines). Zero ProductRow references remain in either vendor-snippets.ts. Docs: cluster-04 file updated.

[2026-09-05 11:31:26] Cluster-05 (StoreRow): NOT unified — both live aliases evaluate the same today (identical storeInfo columns; both mapStores assign cleanly to shared Store), but no shared InferSelectModel source exists and hand-written copies would go silently stale. Correct action instead: delete the 2 DEAD copies.
- packages/db_helper_postgres/src/user-apis/stores.ts: delete line 7  type StoreRow = InferSelectModel<typeof storeInfo>  (zero references anywhere)
- packages/db_helper_sqlite/src/user-apis/stores.ts: delete line 8  type StoreRow = InferSelectModel<typeof storeInfo>  (zero references anywhere)
Kept local (live, self-maintaining mirrors): pg product.ts:33 (1 use), sqlite product.ts:103 (2 uses).

[2026-09-05 11:32:00] FOLLOW-UP cluster-05: remove orphaned imports left by StoreRow deletions.
- packages/db_helper_postgres/src/user-apis/stores.ts: delete line 4  import type { InferSelectModel } from 'drizzle-orm'  (no remaining uses in file)
- packages/db_helper_sqlite/src/user-apis/stores.ts: delete line 4  import type { InferSelectModel } from 'drizzle-orm'  (no remaining uses in file)

[2026-09-05 11:34:00] COMPLETED Cluster-05 StoreRow handling (unification declined, dead copies removed).
Verification: tsc sqlite 4, pg 45 (both = baselines). Zero StoreRow references remain in either user-apis/stores.ts. Docs: cluster-05 file updated.

[2026-09-05 11:36:35] Clusters 06-56 survey: no cluster carries a unify verdict — all are keep-local (schema-bound mirrors, RN/web independence, drifted shapes, circular deps) except dead-copy deletions. Executing dead-only cleanup:
- c15: migrator postgresToSqlite/index.ts lines 7-10 + sqliteToPostgres/index.ts lines 5-8 — delete dead `interface TableInfo` (ColumnInfo stays, live). No unification (ColumnInfo differs per direction).
- c28: pg + sqlite user-apis/complaint.ts line 7 — delete dead `type ComplaintRow`; line 4 `InferSelectModel` import orphaned in both, delete too.

[2026-09-05 11:39:00] Clusters 35/36/37/39/43 dead-copy deletions (unification declined per file verdicts — schema-bound mirrors stay local).
- pg admin-apis/product.ts: delete line 36  type ProductTagRow (c39, dead) + lines 37-39  ProductGroupRow / ProductGroupMembershipRow / ProductReviewRow (c35-37, dead). Keep 35 ProductTagInfoRow (live), 161/162 Insert/Update (live).
- sqlite admin-apis/product.ts: delete lines 107-109  ProductGroupRow / ProductGroupMembershipRow / ProductReviewRow (c35-37, dead) + line 302  type ProductInfoUpdate = Partial<ProductInfoInsert>  (c43, dead). Keep 106 ProductTagRow (5 uses), 301 ProductInfoInsert (live).
InferSelectModel/InferInsertModel imports stay (other live aliases in both files).

[2026-09-05 11:42:00] COMPLETED type-cluster dead-copy sweep (clusters 15, 28, 35, 36, 37, 39, 43 — 12 deletions total).
Verification: tsc sqlite 4, pg 45 (= baselines), migrator 0 errors. All deleted names grep-blank; live counterparts intact (sqlite ProductTagRow 6 refs, pg ProductInfoUpdate 2 refs). Docs: 7 cluster files updated.
FINAL POSITION on "unify the rest" (06-56): no cluster carries a unify verdict. Keep-local reasons per file: schema-bound InferSelectModel mirrors (16,26,27,29-34,38,40-42 + remaining 39/43), drifted/differing shapes (07,15,18,19,22,25,45,46,49,50,55,56), intentionally distinct shared types (10,18), RN/web independence (11-14,47,51-54,56), single-use co-located props (08), backend-circular (23-25), out-of-scope fallback-ui (06,09 partial w/ shared canonical already, 48), per-app collisions (44,49,50).

[2026-09-05 11:45:00] Cluster-06: use shared IdName in fallback-ui userStore.ts.
- apps/fallback-ui/src/stores/userStore.ts: delete local `interface User/Role/Permission` (each exactly {id:number;name:string}); add  import type { IdName } from '@packages/shared'  +  type User = IdName / type Role = IdName / type Permission = IdName. Names kept (UserWithRole extends User + store shape unchanged); only the hook is exported so no external imports affected.

[2026-09-05 11:47:00] COMPLETED Cluster-06 IdName adoption. Verification: fallback-ui tsc 107 = baseline, zero errors in userStore.ts. Docs: cluster-06 file updated.
