Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1198 commits
Select commit Hold shift + click to select a range
dac98f4
fix(seo): optimize meta titles for remaining 2 zero-click pages (BUY-…
BuyWhere Jun 24, 2026
c4a63da
fix: deduplicate /best-* URLs in sitemap-pages.xml (BUY-56627)
Paperclip-Paperclip Jun 24, 2026
81e0587
BUY-56579: disk space watchdog cron wrapper (5min)
Jun 24, 2026
668a02b
Revert "BUY-56579: disk space watchdog cron wrapper (5min)"
Jun 24, 2026
b9e6dab
BUY-56579: disk space watchdog cron wrapper (5min)
Jun 24, 2026
557082b
BUY-56579: update evidence report
Jun 24, 2026
d0c78ca
BUY-56605: worker node WC cycle artifact cleanup run
Jun 24, 2026
a6743bb
chore: safe workspace disk cleanup sweep (BUY-56624)
Jun 24, 2026
b297044
fix: ignore runtime worker status files in .gitignore (BUY-56624)
Jun 24, 2026
3a4e6cc
chore: untrack live worker status files now covered by .gitignore (BU…
Jun 24, 2026
0558e86
BUY-56632: WC cycle cleanup runner + evidence (178 files trashed, dis…
Jun 24, 2026
3736659
BUY-56647: add WC cycle artifact cleanup enforcement script
Jun 24, 2026
e4f32c9
fix(mcp): BUY-56635 fix releaseClientSafely to check transactionStatu…
BuyWhere Jun 24, 2026
bb051ee
feat(seo): restore missing brand/deals/earn landing pages
Jun 24, 2026
83c3c02
fix(seo): add 5 orphan /cheapest-* routes to hub (BUY-56822)
Jun 24, 2026
a5fd4b8
chore: force Railway clean rebuild
Jun 24, 2026
b62800a
chore: safe workspace disk cleanup sweep (BUY-56824)
Jun 24, 2026
8907f2e
SEO: Update meta tags for CTR optimization (BUY-56963)
Jun 24, 2026
3b90544
fix(mcp): BUY-57258 — add db.connect() error handling + reduce statem…
Jun 25, 2026
ed7ec0d
feat(fx): BUY-57140 / BUY-52476 — refresh fx_rates from frankfurter +…
Jun 25, 2026
fcf430b
initial commit for workspace
Jun 25, 2026
ad3123d
BUY-57250: fix git workspace + fx-refresh verified
Jun 25, 2026
7059682
BUY-57311: consolidate WC cycle artifact cleanup: 8→1 cron entry
Jun 25, 2026
51469dc
feat: add MCP authenticated endpoint health check (BUY-57227)
Jun 25, 2026
c8033a2
BUY-57327: enforce WC cycle artifact cleanup consolidation — deprecat…
Jun 25, 2026
25ab888
BUY-57327: add final evidence document
Jun 25, 2026
30ec926
BUY-57336: Worker node disk-space enforcement (WC cycle artifact clea…
Jun 25, 2026
5cb2be3
BUY-57336: optimize wc-cycle-cleanup.sh to skip lsof on zero-byte files
Jun 25, 2026
f50a004
BUY-57336: update evidence doc with latest enforcement status and zer…
Jun 25, 2026
cbd5826
fix: /v1/ingest/health timeout - add per-query statement_timeout, res…
Jun 25, 2026
681684c
BUY-57336: optimize wc-cycle-cleanup.sh to skip lsof on zero-byte files
Jun 25, 2026
62fafc4
BUY-57351: Worker node disk-space enforcement (WC cycle artifact clea…
Jun 25, 2026
1028769
BUY-57360: Monitor Carousell SG scraper daemon
Jun 25, 2026
082081d
fix: BUY-57370 MCP search_products US/global -32603 regression
Jun 25, 2026
5f627c1
fix: resolve Stripe API version TypeScript mismatch
Jun 25, 2026
2fb0f75
fix: correct Stripe apiVersion to match installed types
Jun 25, 2026
cc564ae
BUY-57420: add ingestion_runs indexes for health endpoint performance
Jun 25, 2026
40fb227
fix(webhooks): BUY-57442 add Redis-based idempotency for UptimeRobot …
Jun 25, 2026
4ebd538
fix(seo): dedupe 9 URLs from sitemap-pages.xml (BUY-57452)
Jun 25, 2026
11f1797
Merge branch 'fix/buy-57452-sitemap-pages-dedupe'
Jun 25, 2026
293ad57
test(seo): use Array.from for Map.entries iteration (BUY-57452)
Jun 25, 2026
e04b800
Merge fix/buy-57452-sitemap-pages-dedupe (test iteration fix)
Jun 25, 2026
1e875bb
feat(api/webhooks): Redis-backed dedup for UptimeRobot alerts (BUY-57…
BuyWhere Jun 25, 2026
35ab2b9
BUY-57443: add monitor-ID allowlist + phantom-ID rejection to uptime-…
Jun 25, 2026
6f40c48
BUY-57565: re-enable skipTrailingSlashRedirect for 410 pages
Jun 25, 2026
d60e670
fix(seo): add 4 missing DEAD_BLOG_SLUGS so they return 410 (BUY-57626)
Jun 26, 2026
acb9aa9
BUY-57640: switch Railway healthcheck to local self-check
Jun 26, 2026
83acc9d
fix(mcp): BUY-56635 - kill the 15s -32603 by fail-fast + country-awar…
Jun 26, 2026
c1f6433
fix(seo): trailing-slash 301 should strip slash, not preserve it (BUY…
Jun 26, 2026
e685d0b
feat(monitoring): integrate WC cycle artifact cleanup into disk space…
Jun 26, 2026
2ee76d2
BUY-57780: verify WC cycle artifact cleanup end-to-end (apply run, 5 …
Jun 26, 2026
299036a
BUY-57821: evidence for safe-data-cleanup sweep
Jun 26, 2026
7365ebf
fix(webhooks): use UptimeRobot v2 monitor.url for incident URL + mark…
Jun 26, 2026
f94459f
fix(seo): noindex /register, 410 /about, noindex merchant placeholder…
Jun 26, 2026
878859d
fix(mcp): BUY-57657 post-filter country_code on FTS candidate set
Jun 26, 2026
1db73ba
fix(mcp): BUY-57657 add 2s db.connect timeout in search_products
Jun 26, 2026
cdf87f4
docs: BUY-57657 fix evidence (live probe + concurrent load test)
Jun 26, 2026
d75e8d3
BUY-57906: Optimize title for CamelCamelCamel Singapore query CTR
Jun 26, 2026
0461019
fix(seo): lead airpods-singapore title with 'AirPods Price in Singapo…
Jun 26, 2026
558b3b6
feat(seo): BUY-57922 content depth for 5 zero-click pages (#185)
BuyWhere Jun 26, 2026
c14ad8f
BUY-57925: Worker node WC cycle artifact cleanup enforcement
Jun 26, 2026
03280f8
BUY-57934: workspace disk cleanup sweep evidence
Jun 26, 2026
0731bf2
BUY-57953: Worker node WC cycle artifact cleanup enforcement
Jun 26, 2026
1288c8b
BUY-58029 evidence: WC cycle artifact cleanup heartbeat
Jun 26, 2026
938a23c
BUY-58062: untrack stale evidence MDs and old issue cleanup scripts
Jun 26, 2026
eeacdac
BUY-58065: clean up stale evidence files from closed issues
Jun 26, 2026
b1ad451
BUY-58065: add workspace disk cleanup evidence
Jun 26, 2026
1f93407
BUY-58075: workspace disk cleanup sweep + BUY-58069 enforcement setup
Jun 26, 2026
2bed29f
BUY-58075: workspace disk cleanup sweep — skip (0.95GB < 1GB threshold)
Jun 26, 2026
c9eabb5
BUY-58096: Worker node WC cycle artifact cleanup enforcement (buywher…
Jun 26, 2026
3cfccc1
BUY-58147: add Roomba-specific intro paragraph + iRobot comparison ta…
Jun 27, 2026
c856530
fix(mcp-warmup): correct idx_products_deals_discount_pct shape for BU…
Jun 27, 2026
f1bae61
fix(mcp): BUY-58015 cold-cache regression on US market + get_deals
Jun 27, 2026
be16300
fix(mcp-railway): BUY-58015 same cold-cache fixes as api/ service
Jun 27, 2026
b8d3827
revert: BUY-58015 — revert cold-cache fixes to restore api.buywhere.ai
Jun 27, 2026
eff37e4
fix(seo): stop returning 410 for /about so the page's <title> and met…
BuyWhere Jun 27, 2026
80ed7b6
fix(seo): CTR rescue — title/meta rewrites for 3 high-impression page…
BuyWhere Jun 27, 2026
34e3313
feat(seo): BUY-58633 content depth for 4 deep-zero-click pages (1,719…
BuyWhere Jun 27, 2026
b9b943b
feat(seo): BUY-58704 content depth + structured data for top-4 zero-c…
BuyWhere Jun 28, 2026
2d3959e
feat(seo): BUY-58750 wave-4 schema + title polish for /blog/best-time…
Jun 28, 2026
68a066f
fix(site): reject internal-only SITE_HEALTH_BASE_URL (BUY-58553)
Jun 27, 2026
d97cc2b
fix(MCP): add list_categories tool + optimize get_deals to avoid repl…
BuyWhere Jun 29, 2026
a6b82c1
fix(api): BUY-59390 reject non-numeric product_id in find_similar
BuyWhere Jun 30, 2026
347125c
feat(seo): wave-7 price-anchor title/meta for iPhone 16 vs 17
BuyWhere Jun 30, 2026
51358f1
fix(seo): remove dead sitemap-products-sg.xml from robots.txt (BUY-59…
Jun 30, 2026
f26f181
fix(mcp-railway): BUY-59768 unblock get_deals + list_categories
Jul 2, 2026
b9e3e18
fix(mcp-railway): BUY-59768 part 2 - region->currency inference + liv…
Jul 2, 2026
5ed9093
fix(mcp-railway): BUY-59768 part 2 (re-deploy trigger)
Jul 2, 2026
6e1ca9e
fix(mcp-railway): BUY-59768 part 3 - bump get_deals timeout to 45s fo…
Jul 2, 2026
e1877c4
fix(mcp-railway): BUY-59768 part 4 - US in fallback, 60s timeouts
Jul 2, 2026
96cb3ac
fix(mcp-railway): BUY-59768 part 5 - tune work_mem + disable hashagg …
Jul 2, 2026
94c41cb
BUY-59774 fix: use discount_pct index in /v1/deals; add country_code …
Jul 2, 2026
b670421
search: OR-semantics FTS match + recurring cache warm
richmondteo-code Jul 3, 2026
676fc9d
catalog/stats: stop running exact count(*) on the search replica
richmondteo-code Jul 3, 2026
c77783a
fix(api): restore products featured route
BuyWhere Jul 3, 2026
4e4226a
fix(api): make featured products route schema-safe
BuyWhere Jul 3, 2026
5d30376
fix(api): make featured products browse use indexed order
BuyWhere Jul 3, 2026
858f491
fix(api): BUY-59860 use bigint join for compare query instead of text…
Jul 3, 2026
7f9291e
fix(posthog): BUY-59907 supply stable anonymous distinct id to PostHo…
BuyWhere Jul 3, 2026
01fc75d
fix(nav): collapse header to hamburger below lg breakpoint (BUY-59856)
Jul 3, 2026
e7d528d
search: AND-first-then-OR to fix the cold broad-multiword latency tail
richmondteo-code Jul 3, 2026
e4bbf1c
search: fix AND-first scoping (apply to SG) + use AND on any match
richmondteo-code Jul 3, 2026
5449aa1
search: fix orphaned tsOr bind param in AND-first (was 500ing uncache…
richmondteo-code Jul 3, 2026
d1a5caf
Fix SG search FTS ranking timeout
Jul 3, 2026
72d3f1c
fix(search): prune ranked search join by country partition
Jul 3, 2026
ad1d8a8
Revert "fix(search): prune ranked search join by country partition"
richmondteo-code Jul 3, 2026
ba108b3
fix(site): proxy product search with API auth
BuyWhere Jul 3, 2026
ed483e5
fix(site): normalize search country parameter
BuyWhere Jul 3, 2026
121ce2c
search: Sprint A — safe query parsing, degraded-200 instead of 504, e…
richmondteo-code Jul 3, 2026
864c3d0
search: Sprint C — append-OR page fill, normalized cache key, stagger…
richmondteo-code Jul 3, 2026
e170750
search: budget-guard the OR top-up (cold AND+OR serially blew the han…
richmondteo-code Jul 3, 2026
d4bbacc
ci: TS error-count ratchet baseline (plan 0.6) — fail builds only whe…
richmondteo-code Jul 3, 2026
f8e4c53
search: default the OR top-up OFF behind SEARCH_OR_TOPUP kill-switch
richmondteo-code Jul 3, 2026
7bcbf57
Add GitHub Actions workflow for API deployment
BuyWhere Jul 4, 2026
1c72076
ci: end-to-end pipeline verification (triggers deploy-api workflow)
richmondteo-code Jul 4, 2026
74037dc
Refactor deploy-api workflow for clarity and functionality
BuyWhere Jul 4, 2026
0cbff1a
search: relax broad multi-token first touch
Jul 4, 2026
50e6dc6
BUY-60053: confirm search route — plainto_tsquery AND-first, no parti…
Jul 4, 2026
fc0fd69
fix(api): bound MCP regional deal/category/price probes
BuyWhere Jul 4, 2026
331eeef
fix(api): repair bounded MCP fallback queries
BuyWhere Jul 4, 2026
42cad73
fix(api): return bounded MCP fallback data
BuyWhere Jul 4, 2026
cd04c6a
fix(api): ignore empty MCP category cache
BuyWhere Jul 4, 2026
53799ed
fix(api): bound MCP best-price fallback
BuyWhere Jul 4, 2026
62ecdb9
fix(api): ensure MCP best-price returns regional fallback
BuyWhere Jul 4, 2026
d7299de
BUY-60068: derive country from region in MCP get_deals so region=us/s…
BuyWhere Jul 4, 2026
17831fa
BUY-60069: normalize list_categories region
BuyWhere Jul 4, 2026
635c8f8
BUY-60069: propagate region/country_code in FastAPI MCP list_categories
BuyWhere Jul 4, 2026
32e04b8
BUY-60073: map MCP list_categories region in Node API
Jul 4, 2026
936fdbf
fix(mcp-railway): BUY-60076 bound get_deals with candidate-set + regi…
Jul 4, 2026
6bed8f3
fix(frontend): replace bw_live_ placeholder with bw_beta_ in public d…
BuyWhere Jul 4, 2026
6d35ca7
fix(api): add SEO search fallback rows
BuyWhere Jul 4, 2026
a2b0921
fix(api): bust search cache for SEO fallback
BuyWhere Jul 4, 2026
b7404f5
fix(site): build Next.js from src/ where the app lives
BuyWhere Jul 4, 2026
a7fffd2
fix(mcp-railway): BUY-60076 short-circuit regional deals fallback
BuyWhere Jul 4, 2026
75f147a
fix(mcp-railway): BUY-60076 proxy get_deals to API fallback
BuyWhere Jul 4, 2026
04b1a0a
revert(mcp-railway): remove BUY-60076 API proxy experiment
BuyWhere Jul 4, 2026
09ae59f
fix(api): bound MCP warmup database timeouts
Jul 4, 2026
0f248e3
fix(mcp): bound canonical pool warmups
Jul 4, 2026
ed0e162
fix(site): revert site.Dockerfile to COPY . . with .dockerignore — WO…
BuyWhere Jul 4, 2026
b9359e9
feat(site): add /api/health route for UptimeRobot site monitor
BuyWhere Jul 4, 2026
38b19d5
fix(site): pass Railway account token to CLI
Jul 4, 2026
811b69c
fix(api): add bounded search timeout fallback
BuyWhere Jul 4, 2026
5b126b0
fix(api): bound SG zero-AND search fallback
Jul 4, 2026
44f06e2
fix(api): bound SG strict-search ladder
Jul 4, 2026
7cd2d0e
fix(api): materialize bounded search slices
Jul 4, 2026
22b05c8
fix(api): bust SG degraded search cache
Jul 4, 2026
2031758
fix(compare): map product search rows
Jul 4, 2026
87c192d
Fix search result product card rendering
BuyWhere Jul 4, 2026
616cc25
BUY-60002: accept bw_beta_ prefix keys by also looking up canonical b…
Jul 4, 2026
206e0fb
BUY-60002: support bw_beta keys in FastAPI auth
Jul 4, 2026
356627c
fix(mcp-railway): BUY-60170 add third fallback to list_categories
Jul 5, 2026
b5381b1
fix(a11y): robust pricing table headers
Jul 5, 2026
5924083
fix(deploy): add permissions block to deploy-api workflow
Jul 5, 2026
2b7bc59
fix(deploy): add permissions block to deploy-api workflow
Jul 5, 2026
fa4c7ad
BUY-60172: validate token fix
Jul 5, 2026
b76a8ba
fix(api/request-key): call /v1/auth/register, require bw_<32 hex> API…
BuyWhere Jul 5, 2026
c335f93
fix(mcp-railway): BUY-60170 increase warmup timeouts for initial matv…
Jul 5, 2026
91d6573
fix(mcp-railway): BUY-60170 increase warmup timeout to 10min for init…
Jul 5, 2026
5a120ae
fix(mcp-railway): BUY-60170 increase advisory warmup timeout to 15min
Jul 5, 2026
de1b399
BUY-13543: add What Is a Price Index developer FAQ
May 8, 2026
0ca24b0
fix(embed): add Railway config for embed worker (api-embed/Dockerfile)
BuyWhere Jul 5, 2026
52bff5c
fix(embed): add Railway config for embed worker (api-embed/railway.json)
BuyWhere Jul 5, 2026
d718299
fix(embed-worker): include api build context
BuyWhere Jul 5, 2026
e4c57a4
fix(mcp-railway): keep list_categories cold misses available
Jul 5, 2026
6eb3299
Compact search result cards
BuyWhere Jul 5, 2026
459a143
Deploy MCP via Railway GraphQL
Jul 5, 2026
e8867d2
fix(mcp-railway): bound list_categories cold fallback latency
Jul 5, 2026
48de91d
Expose MCP well-known manifests
Jul 5, 2026
c3b8958
fix(api): BUY-60112/60117 - increase bounded slice cap 5k->50k and ad…
Jul 5, 2026
2d7a6ac
fix(api): BUY-60112/60117 - replace GIN-fallback with fast ILIKE scan
Jul 5, 2026
11d16d1
fix(api): BUY-60112/60117 - remove erroneous id>800M filter from ILIK…
Jul 5, 2026
21a550e
fix(deploy): add Railway project id to site deploy
Jul 5, 2026
107d459
Filter broken search result images
BuyWhere Jul 5, 2026
7436564
Fix compare retailer links
Jul 5, 2026
5ed5122
Fix search result image type
Jul 5, 2026
dac794a
fix(api): BUY-60309 deals timeout patch - reduced timeouts, bounded s…
Jul 5, 2026
9fc2a61
fix(embed): BUY-60368 split hash gate across sourceDb/vectorDb
Jul 6, 2026
4013b59
BUY-60201: add /category/:slug and /best/:slug redirect routes
BuyWhere Jul 6, 2026
7c0287d
fix(embed): BUY-60378 CTE index scan + replicaDb statement_timeout
Jul 6, 2026
615946f
fix(redirect): add timeout to affiliate redirect handler (BUY-60383)
BuyWhere Jul 6, 2026
7d8b963
fix(hydration): BUY-60203 eliminate React #418/#422 on homepage/searc…
Jul 6, 2026
21a2410
Merge branch 'fix/BUY-60203-hydration-mismatch' into main
BuyWhere Jul 6, 2026
d79484e
fix(mcp-railway): BUY-60397 use CONCURRENTLY for matview refresh
Jul 6, 2026
d3f8dd4
docs: BUY-60397 verification results
Jul 6, 2026
6a8c0b1
docs: BUY-60397 final sweep results
Jul 6, 2026
b5c0dbd
fix(hydration): BUY-60203 change afterInteractive scripts to lazyOnload
Jul 6, 2026
f029ae8
fix(hydration): BUY-60203 defer PostHog init past hydration
BuyWhere Jul 6, 2026
4cd24de
fix(search): prune product search partition join by country_code
BuyWhere Jul 6, 2026
c5796cf
fix(seo): BUY-60202 show honest empty state when search API returns d…
BuyWhere Jul 6, 2026
f37a884
fix(seo): increase timeout to 20s to match server timeout (#194)
BuyWhere Jul 6, 2026
19a8a97
refactor(seo): type-safe degraded/total checks in SearchApiResponse (…
BuyWhere Jul 6, 2026
78a9ad2
fix(BUY-60385): Add price sanitization for /bin/bash and >0k anomalies
BuyWhere Jul 6, 2026
5d37fb0
fix(embed): BUY-60446 drop NULLS LAST from price-DESC candidate scan
Jul 6, 2026
1ff778a
fix(seo): correct S$ currency leak in /best-smart-home-us meta descri…
BuyWhere Jul 6, 2026
9f7ae1e
fix(seo): optimize iphone-17-vs-16 title/description for zero-click C…
BuyWhere Jul 6, 2026
3c03457
fix(seo): BUY-59851 multi-query fallback for degraded product searche…
BuyWhere Jul 6, 2026
15e3afe
fix(redirect): BUY-60548 /r/direct lands on merchant URL not homepage…
BuyWhere Jul 6, 2026
f17a9ea
fix(api): BUY-60565 return 400 for non-numeric :id on /v1/products/* …
Jul 6, 2026
b7b1850
fix(redirect): add /r/direct/:merchantId/:productId route to bypass a…
Jul 7, 2026
953e9f2
fix(seo): BUY-59851 add missing backupQueries for laptop-singapore (#…
BuyWhere Jul 7, 2026
5ee61bd
fix(BUY-60630): consolidate hero subheading + paragraph into single v…
BuyWhere Jul 7, 2026
4187f4d
fix(BUY-60629): compare empty state shows executed query in zero-resu…
BuyWhere Jul 7, 2026
228ee79
fix(seo): BUY-59851 add minPrice filter to prevent wrong products (#204)
BuyWhere Jul 7, 2026
f165b7f
fix(embed): BUY-60378 v2 use updated_at DESC instead of price DESC (n…
Jul 7, 2026
761a065
fix(redirect): BUY-60824 use affiliate_url over destination_url
Jul 7, 2026
a32280e
fix(redirect): BUY-60824 add affiliate_url column migration
Jul 8, 2026
64a9300
fix(redirect): BUY-60824 run affiliate_url migration preflight
Jul 8, 2026
860f949
fix(embed): BUY-60824 record product_views from cached search/feature…
Jul 8, 2026
b09e554
search: Phase-3 tier cutover (feature-flagged hybrid) + CAT-08 in_sto…
richmondteo-code Jul 8, 2026
17fbe70
search: bound tier candidate scan (LIMIT 5000) + 4s tier timeout
richmondteo-code Jul 8, 2026
d439141
fix(BUY-60824): force deploy to refresh production container
Jul 8, 2026
9ef04bd
fix(seo): add hreflang + locale meta to all SEO landing pages; create…
Jul 8, 2026
5be0feb
fix(BUY-60824): add debug logging to product_views instrumentation
Jul 8, 2026
fd3b58d
fix(BUY-60824): change product_views instrumentation to async try/cat…
Jul 8, 2026
7dc92f5
fix(BUY-60872): delete compare-page mock-data fallback, add deploy-ww…
Jul 8, 2026
e39acf1
fix(BUY-59983): add full catalog image remotePatterns to next.config
Jul 8, 2026
d53dfbb
fix(search): BUY-60623 do not default region=US when explicit country…
BuyWhere Jul 8, 2026
0b12232
Fix SG search bounded slice ordering
Jul 8, 2026
2adc1ac
fix(embed): BUY-60920 cast candidate ids as bigint array
Jul 8, 2026
b3e2d6d
fix(embed): BUY-60920 fetch embed candidates in one indexed query
Jul 8, 2026
2cb9792
fix(search): BUY-60123 order bounded SG slices by updated_at DESC
BuyWhere Jul 8, 2026
fbac38a
fix(BUY-60383/BUY-60606): expand redirect allowlist for US/global mer…
Jul 8, 2026
ac303fd
fix(BUY-60383): trust DB-resolved redirect destinations; block only u…
Jul 8, 2026
1b8c762
fix(search): BUY-60123 v2 reduce bounded SG slice cap to 2000
Jul 8, 2026
ebace84
Fix BUY-60877: Comprehensive WCAG 2.1 AA color-contrast violations (#…
BuyWhere Jul 8, 2026
7fb8609
fix(BUY-60877): PriceCard TS error blocking prod deploy (#206)
BuyWhere Jul 8, 2026
e477508
fix(BUY-60877): resilient sitemap prerendering (API 401 build crash) …
BuyWhere Jul 8, 2026
26fb102
fix(BUY-60877): footer + newsletter placeholder WCAG contrast (#208)
BuyWhere Jul 8, 2026
2103b8a
fix(BUY-60006): wire /pricing CTAs to real checkout links
Jul 8, 2026
48c1a4e
hex-scope-probe
BuyWhere Jul 9, 2026
8d07427
fix(api): route legacy product query to search
Jul 9, 2026
d63c67f
BUY-59846 BUY-60826: Add affiliate disclosure fields to product API r…
Jul 9, 2026
0750ee1
hex probe: PAT non-workflow write
BuyWhere Jul 9, 2026
5d77d55
hex: remove probe artifact
BuyWhere Jul 9, 2026
29ff249
BUY-59846 BUY-60826: Add affiliate disclosure fields to product API r…
Jul 9, 2026
3531725
fix(seo): BUY-61481 cheapest-country CTR rescue for /blog/cheapest-ma…
BuyWhere Jul 9, 2026
ab67db1
fix(api): BUY-52474 wire product_views on cache-hit paths + expand cl…
BuyWhere Jul 10, 2026
6271a93
fix(seo): BUY-61557 prevent 503 on mobile viewport for SEO landing pages
Jul 10, 2026
edf0f6b
feat(home): add consumer search bar above the fold (BUY-61556)
Jul 10, 2026
c026633
fix(seo): avoid source.unsplash fallback images
Jul 10, 2026
a9dae4d
fix(seo): BUY-61661 Sony WH-1000XM5 price-anchored CTR rescue for /bl…
BuyWhere Jul 10, 2026
66be18a
MCP search parity: route search_products tool through the tier (gated…
Jul 11, 2026
8df840f
Fix TS2352: cast SearchResponse via unknown in MCP runTierSearch
Jul 11, 2026
8e431cf
Set gin_fuzzy_search_limit=0 in tier queries (master fix for multi-wo…
Jul 11, 2026
cfb868e
fix(BUY-61117): default search tier and zero-row fallback
BuyWhere Jul 11, 2026
df4867d
fix(BUY-61558): render degraded banner when /api/products/search retu…
Jul 11, 2026
bc12368
BUY-61770: update buildSearchResponse to { data, meta } schema per Op…
Jul 11, 2026
eb6a765
BUY-61977: stop caching degraded envelopes in search + deals
Jul 12, 2026
ce15d73
fix(BUY-62253): fix zombie auto-cleanup column names in /v1/ingest/he…
Jul 13, 2026
92811fe
fix(BUY-62307): clean zombie runs before ingest health count
Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Workspace Memory - BUY-31015 WooCommerce Deep-page Lane Supervisor

## Issue Status
- Most recent: BUY-54957 WooCommerce deep-page lane supervisor (BUY-31015)
- Status: done (closed 2026-06-21T11:32Z)
- Previous: BUY-54940 (done 2026-06-21T10:53Z), BUY-54932 (done 2026-06-21T10:36Z), BUY-54907 (done 2026-06-21T09:34Z)

## Lane Components
- Supervisor: scripts/buy31015-deep-page-supervisor.mjs (BUY-52234 deps check soft-warned in BUY-54932)
- Worker: scripts/buy31015-woocommerce-deep-page.mjs
- Keepalive: scripts/buy31015-deep-page-keepalive.sh
- Keepalive cron: run-buy-51993-deep-page-keepalive.sh (every 2 min)
- State files: data/buy31015-deep-page-*.json
- Known merchants: data/buy31015-wc-known-merchants.json (1,518 merchants)

## Current Status (2026-06-21T11:32Z, end of BUY-54957 heartbeat)
- Cycle: 324
- Worker PID: 464081 (post-restart; setsid-detached, PPID=1)
- Rows updated: 108 (cycle 324 mid-tick, ~24s after restart)
- rowsPerHour: 16,281 (post-restart acceleration typical)
- Merchants visited: 12 (cycle 324 mid-tick)
- Supervisor: healthy, --check returns exit 0 with deps-warning soft-note
- Keep-alive state: RUNNING, consecutive_dead=0, last_action=noop

## This Heartbeat Action (BUY-54957)
- Detected dead worker pid=429805 via --check (worker exited cleanly after cycle 323 signal-end at 11:30:29Z)
- Verified dead: `ls /proc/429805` -> No such file or directory
- Restarted via `node scripts/buy31015-deep-page-supervisor.mjs --restart` -> pid=464081
- Confirmed new worker is setsid-detached (PPID=1, Ssl, --check returns alive=yes)
- Cycle 324 healthy at 16,281 rows/hr post-restart
- Posted comment + marked BUY-54957 done
- Wrote reports/BUY-54957-IMPLEMENTATION.md

## Cycle Progression Since BUY-54940
| Cycle | Closed/Active | merchants | rowsUpdated | rows/hr | Note |
|-------|---------------|-----------|-------------|---------|------|
| 319 | closed (BUY-54940) | 25 | 211 | 11,253 | post-restart healthy |
| 320 | closed | — | — | — | reaped mid-cycle |
| 321 | closed | 73 | 535 | 8,503 | reaped mid-cycle |
| 322 | closed | — | — | — | reaped mid-cycle |
| 323 | closed | 85 | 540 | 7,253 | reaped at ~11:30Z after harvesting 85 merchants (largest cycle) |
| 324 | active | 12 | 108 | 16,281 | post-restart healthy (acceleration) |

## Notes
- Lane is fully operational with supervisor + keepalive cron
- Worker deaths happen both: (a) clean cycle-end exit (wait for next cron tick to restart), (b) reaped by paperclip-orphan-reaper cron (root, every 5 min, RSS>10MB filter on PPID=1)
- Supervisor --restart recovers within ~10s of detection
- Permanent reaper fix still requires root cgroup move (out of Dash scope)
- BUY-52234 deps check is now scoped appropriately: warning for non-importers, hard-fail (in scripts/buy31015-node-modules-guard.mjs) for lanes that do import

## BUY-55238 Heartbeat (2026-06-22T02:04Z)
- Latest routine heartbeat: BUY-55238
- Status: done (closed 2026-06-22T02:04:20Z)
- Detected dead pid=2983890 via --check at 02:00:33Z (clean cycle-32 exit)
- Restarted via supervisor --restart -> pid=3033255 setsid-detached (PPID=1, Ssl)
- Cycle 33 mid-tick: 14 merchants, 108 rows, 7,916 rows/hr
- Keepalive RUNNING, consecutive_dead=0
- Worker deaths continue to be clean cycle-end timeouts (--duration-sec=720), not crashes
20 changes: 20 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Python API - excludes root app/ so Next.js uses src/app not the Python package
app/
venv/
__pycache__/
*.pyc
*.pyo

# Large artifacts not needed for Next.js build
.git/
.next-deploy/
node_modules/

# Docs and other non-frontend dirs
docs-site/
scraper/
scrapers/
tests/
reports/
logs/
data/
87 changes: 87 additions & 0 deletions .github/ISSUE_TEMPLATE/build-with-buywhere-submission.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Build With BuyWhere Challenge Submission
description: Submit your AI shopping agent for the Build With BuyWhere Challenge
title: "[Submission] "
labels: [challenge, submission]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for entering the **Build With BuyWhere Challenge**! Fill out the details below and our team will review your submission.

- type: input
id: project-name
attributes:
label: Project Name
description: What did you build?
placeholder: e.g. "ShopBot — AI Shopping Assistant"
validations:
required: true

- type: textarea
id: description
attributes:
label: Description
description: Tell us about your AI shopping agent. What does it do? What problem does it solve?
placeholder: Describe your agent, its features, and the real shopping scenarios it handles.
validations:
required: true

- type: input
id: repo-url
attributes:
label: Source Repository
description: Link to your public GitHub repo.
placeholder: https://github.com/your-username/your-agent
validations:
required: true

- type: input
id: demo-url
attributes:
label: Demo URL
description: Link to a live demo, video, or screencast.
placeholder: https://demo.example.com or https://youtube.com/...
validations:
required: false

- type: dropdown
id: integration-type
attributes:
label: Integration Type
description: How does your agent use BuyWhere?
options:
- REST API
- MCP Server
- Both
- Other
validations:
required: true

- type: textarea
id: instructions
attributes:
label: Setup & Usage Instructions
description: How do we run or test your agent?
placeholder: Steps to set up and use your submission...
validations:
required: true

- type: checkboxes
id: checklist
attributes:
label: Submission Checklist
options:
- label: My agent uses BuyWhere's API or MCP tools for at least one core feature
required: true
- label: My source code is publicly accessible
required: true
- label: I have included a clear demo or walkthrough
required: false
- label: My submission is original work
required: true

- type: markdown
attributes:
value: |
By submitting, you agree to the [Challenge Terms](https://buywhere.ai/terms). Good luck! 🚀
1 change: 1 addition & 0 deletions .github/__hex-scope-probe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
TEST
57 changes: 57 additions & 0 deletions .github/workflows/build-mcp-server.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Build MCP server image

on:
workflow_dispatch:
push:
branches: [main]
paths:
- 'Dockerfile'
- 'mcp-server.js'
- 'mcp-health-config.js'
- '.github/workflows/build-mcp-server.yml'

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}/mcp-server

jobs:
build:
name: Build and push MCP server image
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=sha,prefix=sha-
type=ref,event=branch
type=raw,value=latest,enable={{is_default_branch}}

- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
52 changes: 52 additions & 0 deletions .github/workflows/build-on-push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Build site image on push to main

on:
push:
branches: [main]

env:
GCP_PROJECT_ID: gaia-calendar-488606
GCP_REGION: asia-southeast1
ARTIFACT_REGISTRY: asia-southeast1-docker.pkg.dev
IMAGE_REPO: cloud-run-source-deploy

jobs:
build:
name: Build and push site image
runs-on: ubuntu-latest
outputs:
full_image: ${{ steps.tag.outputs.full_image }}
image_tag: ${{ steps.tag.outputs.image_tag }}
steps:
- uses: actions/checkout@v4

- name: Authenticate to GCP
uses: google-github-actions/auth@v2
with:
credentials_json: ${{ secrets.GCP_SA_KEY }}

- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v2
with:
project_id: ${{ env.GCP_PROJECT_ID }}

- name: Configure Docker for Artifact Registry
run: gcloud auth configure-docker ${{ env.ARTIFACT_REGISTRY }} --quiet

- name: Set image tag
id: tag
run: |
TAG="sha-${{ github.sha }}"
echo "image_tag=${TAG}" >> "$GITHUB_OUTPUT"
FULL_IMAGE="${{ env.ARTIFACT_REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.IMAGE_REPO }}/site:${TAG}"
echo "full_image=${FULL_IMAGE}" >> "$GITHUB_OUTPUT"
echo "Built image tag: ${TAG}"
echo "Full image: ${FULL_IMAGE}"

- name: Build and push site image
env:
FULL_IMAGE: ${{ steps.tag.outputs.full_image }}
run: |
docker build -t "$FULL_IMAGE" -f site.Dockerfile .
docker push "$FULL_IMAGE"
echo "Successfully pushed ${FULL_IMAGE}"
Loading
Loading