CataSync feeds 6/6: niletech go-live + stale Google Listings cleanup (operator OK)
Imported from GitHub issue El-SaMa/oma#249 by @El-SaMa.
Part of the Product feeds epic. Last step. Needs the operator's OK before each live change.
What
Turn the feeds on for niletech and clear the stale Google Listings & Ads leftovers.
Steps
- Create on niletech (site
44fd1064-faae-4fd6-9998-18680bb64601) viaoma.admin_catasync_feeds:Google Merchant(preset google_xml, destination google, merchant 684452171)hinta.fi,Hintaseuranta,Hintaopas (Prisjakt)(their presets, destination url) Show the operator each feed's preview and skipped counts before enabling.
- Google: dry run first, operator reviews the sample items, then the real run. Verify approved/disapproved counts after 24 h.
- Comparison sites: give the operator the feed URLs and the merchant sign-up steps for each site (do not sign up or email anyone without the operator approving the exact text; outgoing mail follows the draft-before-send rule).
- Cleanup (operator OK, read-only check first, backup of the rows to
/root/archiveon nilek): delete the stale Google Listings & Ads post meta on niletech (_wc_gla_sync_status,_wc_gla_errors,_wc_gla_synced_at,_wc_gla_mc_status,_wc_gla_google_ids,_wc_gla_notification_status,_wc_gla_availabilityDate) and thegla_*options, since the plugin is gone. Flush the object cache afterwards (see handbook niletech notes: Redis runs inside the site container). - The 165 published own spare parts with no description stay out of the feeds (requireDescription filter). List them for the operator; no AI text.
Acceptance
- Four feeds live on niletech, previews approved by the operator.
- Google shows niletech products as approved (count reported), market sync returns benchmarks for many products.
- Stale GLA meta removed with a backup, counts reported.
- Handbook and
ops/sites/niletech/README.mdupdated.
Binding rules (read before coding)
- Read
CLAUDE.mdand every.cursor/rules/*.mdcwithalwaysApply: truefirst. They win over your defaults. - No OpenAI / AI calls anywhere in this feature. CataSync AI switch (
ai_enabled) stays off. Never turn it on. - Smallest correct change. Match the surrounding code style (engine = plain ESM
.mjs, mysql2 pool fromsrc/db.mjs; core-api = TypeScript). - Every staff action goes through the admin MCP (
admin-mcp-first.mdc): executor inservices/core-api/src/agent-tools/tools-catasync.ts, confirm handler inservices/core-api/src/platform/confirm.tsfor writes, registry entry, zod schema inservices/mcp-server/src/tools.ts, test intools-catasync.test.ts. The UI calls the same tool (viaapps/web/lib/catasync/admin-actions.ts), never a separate path. - UI: vertical side nav only (never a second tab row), forms in modals, shadow cards, full width (
portal-chrome.mdc). - Every string:
next-intlkey with native en, fi, sv (Finnish must read native, not translated). No em/en dashes in prose. Runnode scripts/i18n-validate.mjs. - Handbook: update
apps/web/content/admin-docs/products/catasync.md(new section) for every behaviour you add. - Secrets (tokens, Google tokens, feed tokens) never in logs, commits, handbook or chat.
- Commits: author ELSAMA only, no Co-authored-by / AI attribution. Push to
mainright after each commit (rebase onorigin/mainfirst). - Deploy: engine with
bash scripts/catasync-engine-roll.sh figaro; OMA only via the trainbash scripts/deploy-quick.sh(never setOMA_DEPLOY_SERVICES, never build on the VM). Check the live SHA contains your commit. - WordPress plugin changes: bump version, pass
scripts/wp-plugin-gate-remote.sh ops/catasync/plugins/lafu-catasync-connectorwith 0 errors 0 warnings + security check (wp-plugin-dod.mdc). Install on maxfort.fi first (test shop), only then niletech. - Never change niletech prices, statuses, shipping rows or the Code Snippets / table-rate plugins as part of this work.
- Clean up test data and temp files when done.