
CREATE TABLE users (
  user_id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  username VARCHAR ( 25 ) UNIQUE NOT NULL,
  email VARCHAR ( 50 ) UNIQUE NOT NULL,
  full_name VARCHAR ( 100 ) NOT NULL,
  last_login TIMESTAMP,
  created_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE boards (
  board_id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  board_name VARCHAR ( 50 ) UNIQUE NOT NULL,
  board_description TEXT NOT NULL
);

CREATE TABLE comments (
  comment_id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  user_id INT REFERENCES users(user_id) ON DELETE CASCADE,
  board_id INT REFERENCES boards(board_id) ON DELETE CASCADE,
  comment TEXT NOT NULL,
  time TIMESTAMP
);

CREATE TABLE rich_content (
  content_id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  comment_id INT REFERENCES comments(comment_id) ON DELETE CASCADE,
  content JSONB NOT NULL
);

INSERT INTO users 
  (username, email, full_name, created_on, last_login)
VALUES 
  ('dpuckring0', 'dpuckring0@wikimedia.org', 'Dicky Puckring', NOW() - interval '350 days', null),
  ('ssiviour1', 'ssiviour1@ow.ly', 'Suzanna Siviour', NOW() - interval '3 days', NOW() - interval '1 day'),
  ('gsomerled2', 'gsomerled2@auda.org.au', 'Geneva Somerled', NOW() - interval '280 days', null),
  ('wedginton3', 'wedginton3@google.com', 'Winny Edginton', NOW() - interval '6 days', NOW() - interval '2 days'),
  ('mshine4', 'mshine4@army.mil', 'Mitchael Shine', NOW() - interval '45 days', NOW() - interval '3 days'),
  ('marnli5', 'marnli5@google.co.uk', 'Magdalena Arnli', NOW() - interval '200 days', NOW() - interval '15 days'),
  ('wjohnston6', 'wjohnston6@omniture.com', 'Wandis Johnston', NOW() - interval '120 days', NOW() - interval '5 days'),
  ('shenstone7', 'shenstone7@networksolutions.com', 'Sibyl Henstone', NOW() - interval '14 days', NOW() - interval '1 day'),
  ('chuffey8', 'chuffey8@csmonitor.com', 'Calhoun Huffey', NOW() - interval '330 days', NOW() - interval '320 days'),
  ('asandiland9', 'asandiland9@sun.com', 'Adolphe Sandiland', NOW() - interval '90 days', NOW() - interval '10 days'),
  ('sfaiera', 'sfaiera@goo.ne.jp', 'Sofie Faier', NOW() - interval '365 days', null),
  ('bbordisb', 'bbordisb@yahoo.com', 'Barbi Bordis', NOW() - interval '250 days', NOW() - interval '30 days'),
  ('gstathorc', 'gstathorc@sciencedaily.com', 'Gabby Stathor', NOW() - interval '180 days', NOW() - interval '2 days'),
  ('gsukbhansd', 'gsukbhansd@indiegogo.com', 'Gill Sukbhans', NOW() - interval '160 days', null),
  ('jcabbelle', 'jcabbelle@whitehouse.gov', 'Jelene Cabbell', NOW() - interval '75 days', NOW() - interval '8 days'),
  ('gedelf', 'gedelf@businessinsider.com', 'Galvin Edel', NOW() - interval '310 days', NOW() - interval '45 days'),
  ('bluptong', 'bluptong@domainmarket.com', 'Brittney Lupton', NOW() - interval '22 days', NOW() - interval '4 days'),
  ('zbromellh', 'zbromellh@utexas.edu', 'Zebulen Bromell', NOW() - interval '195 days', NOW() - interval '60 days'),
  ('gwillsheei', 'gwillsheei@dedecms.com', 'Gweneth Willshee', NOW() - interval '140 days', NOW() - interval '7 days'),
  ('aaizikovj', 'aaizikovj@posterous.com', 'Amy Aizikov', NOW() - interval '55 days', null),
  ('hmaccurtaink', 'hmaccurtaink@psu.edu', 'Halie MacCurtain', NOW() - interval '300 days', null),
  ('cmanleyl', 'cmanleyl@posterous.com', 'Cissiee Manley', NOW() - interval '110 days', NOW() - interval '20 days'),
  ('lblakedenm', 'lblakedenm@pbs.org', 'Lucienne Blakeden', NOW() - interval '240 days', NOW() - interval '100 days'),
  ('flinnitn', 'flinnitn@yahoo.co.jp', 'Filmore Linnit', NOW() - interval '35 days', NOW() - interval '1 day'),
  ('lbasshamo', 'lbasshamo@ca.gov', 'Laraine Bassham', NOW() - interval '170 days', NOW() - interval '50 days'),
  ('gromaynep', 'gromaynep@lycos.com', 'Gisella Romayne', NOW() - interval '85 days', null),
  ('hmocherq', 'hmocherq@archive.org', 'Husein Mocher', NOW() - interval '265 days', NOW() - interval '12 days'),
  ('sspadarir', 'sspadarir@dailymail.co.uk', 'Stanislaus Spadari', NOW() - interval '18 days', NOW() - interval '3 days'),
  ('efoukxs', 'efoukxs@vinaora.com', 'Etheline Foukx', NOW() - interval '340 days', NOW() - interval '200 days'),
  ('cmcbeitht', 'cmcbeitht@bing.com', 'Clywd McBeith', NOW() - interval '130 days', NOW() - interval '25 days'),
  ('fbodicumu', 'fbodicumu@prlog.org', 'Felice Bodicum', NOW() - interval '60 days', null),
  ('wcurwoodv', 'wcurwoodv@hubpages.com', 'Webb Curwood', NOW() - interval '215 days', null),
  ('gmacklinw', 'gmacklinw@163.com', 'Georgiana Macklin', NOW() - interval '290 days', NOW() - interval '40 days'),
  ('kferrarottix', 'kferrarottix@amazon.co.uk', 'Kate Ferrarotti', NOW() - interval '10 days', NOW() - interval '1 day'),
  ('gcloneyy', 'gcloneyy@un.org', 'Glen Cloney', NOW() - interval '150 days', null),
  ('gcasserleyz', 'gcasserleyz@infoseek.co.jp', 'Gale Casserley', NOW() - interval '100 days', NOW() - interval '14 days'),
  ('gduckels10', 'gduckels10@harvard.edu', 'Geno Duckels', NOW() - interval '355 days', NOW() - interval '6 days'),
  ('rlorenzetti11', 'rlorenzetti11@boston.com', 'Rahel Lorenzetti', NOW() - interval '230 days', null),
  ('ldykes12', 'ldykes12@examiner.com', 'Lily Dykes', NOW() - interval '42 days', null),
  ('msimonich13', 'msimonich13@ihg.com', 'Maynord Simonich', NOW() - interval '175 days', null),
  ('klicciardo14', 'klicciardo14@printfriendly.com', 'Kacey Licciardo', NOW() - interval '320 days', null),
  ('nwhatsize15', 'nwhatsize15@japanpost.jp', 'Nicholas Whatsize', NOW() - interval '28 days', NOW() - interval '2 days'),
  ('aianinotti16', 'aianinotti16@blogspot.com', 'Auroora Ianinotti', NOW() - interval '260 days', NOW() - interval '35 days'),
  ('fcaldwall17', 'fcaldwall17@themeforest.net', 'Fanchette Caldwall', NOW() - interval '190 days', null),
  ('mharg18', 'mharg18@quantcast.com', 'Merralee Harg', NOW() - interval '70 days', null),
  ('ggoude19', 'ggoude19@eventbrite.com', 'Gracie Goude', NOW() - interval '305 days', NOW() - interval '90 days'),
  ('kbrenard1a', 'kbrenard1a@patch.com', 'Karlotta Brenard', NOW() - interval '15 days', NOW() - interval '1 day'),
  ('esemechik1b', 'esemechik1b@geocities.com', 'Earlie Semechik', NOW() - interval '145 days', NOW() - interval '55 days'),
  ('mcoche1c', 'mcoche1c@lycos.com', 'Michel Coche', NOW() - interval '220 days', NOW() - interval '9 days'),
  ('tzecchini1d', 'tzecchini1d@cnet.com', 'Tiena Zecchini', NOW() - interval '50 days', NOW() - interval '11 days'),
  ('esibbs1e', 'esibbs1e@amazon.de', 'Estele Sibbs', NOW() - interval '335 days', null),
  ('whadrill1f', 'whadrill1f@economist.com', 'Waverly Hadrill', NOW() - interval '105 days', NOW() - interval '18 days'),
  ('jphin1g', 'jphin1g@google.es', 'Joy Phin', NOW() - interval '275 days', NOW() - interval '70 days'),
  ('kalbro1h', 'kalbro1h@usnews.com', 'Kenn Albro', NOW() - interval '185 days', null),
  ('mmarzelo1i', 'mmarzelo1i@deviantart.com', 'Mara Marzelo', NOW() - interval '40 days', NOW() - interval '5 days'),
  ('nbanbury1j', 'nbanbury1j@blog.com', 'Nonah Banbury', NOW() - interval '155 days', NOW() - interval '22 days'),
  ('nflaune1k', 'nflaune1k@ameblo.jp', 'Nerita Flaune', NOW() - interval '8 days', NOW() - interval '1 day'),
  ('csatterfitt1l', 'csatterfitt1l@samsung.com', 'Chloris Satterfitt', NOW() - interval '245 days', null),
  ('acluer1m', 'acluer1m@dropbox.com', 'Annadiana Cluer', NOW() - interval '115 days', null),
  ('tburton1n', 'tburton1n@reddit.com', 'Ted Burton', NOW() - interval '360 days', NOW() - interval '4 days'),
  ('lmacgraith1o', 'lmacgraith1o@wired.com', 'Latisha MacGraith', NOW() - interval '65 days', NOW() - interval '16 days'),
  ('ggoodright1p', 'ggoodright1p@ucoz.ru', 'Griswold Goodright', NOW() - interval '210 days', NOW() - interval '80 days'),
  ('glangdon1q', 'glangdon1q@umn.edu', 'Gilbertine Langdon', NOW() - interval '30 days', NOW() - interval '7 days'),
  ('jwarsap1r', 'jwarsap1r@nationalgeographic.com', 'Jewelle Warsap', NOW() - interval '295 days', NOW() - interval '110 days'),
  ('tsculley1s', 'tsculley1s@businesswire.com', 'Tilda Sculley', NOW() - interval '135 days', NOW() - interval '28 days'),
  ('pcottingham1t', 'pcottingham1t@google.es', 'Patin Cottingham', NOW() - interval '345 days', NOW() - interval '150 days'),
  ('rpurselow1u', 'rpurselow1u@shareasale.com', 'Rayshell Purselow', NOW() - interval '20 days', NOW() - interval '3 days'),
  ('fstubley1v', 'fstubley1v@facebook.com', 'Fairlie Stubley', NOW() - interval '255 days', NOW() - interval '65 days'),
  ('larthy1w', 'larthy1w@sina.com.cn', 'Lukas Arthy', NOW() - interval '95 days', null),
  ('tlamond1x', 'tlamond1x@usatoday.com', 'Tilda Lamond', NOW() - interval '165 days', NOW() - interval '33 days'),
  ('rcraufurd1y', 'rcraufurd1y@purevolume.com', 'Reinaldo Craufurd', NOW() - interval '315 days', NOW() - interval '130 days'),
  ('mstaunton1z', 'mstaunton1z@domainmarket.com', 'Mora Staunton', NOW() - interval '80 days', NOW() - interval '13 days'),
  ('nknowlden20', 'nknowlden20@abc.net.au', 'Nora Knowlden', NOW() - interval '235 days', NOW() - interval '48 days'),
  ('ebridgestock21', 'ebridgestock21@sogou.com', 'Eveline Bridgestock', NOW() - interval '125 days', null),
  ('bmoyler22', 'bmoyler22@netscape.com', 'Briney Moyler', NOW() - interval '270 days', NOW() - interval '85 days'),
  ('wbeardwell23', 'wbeardwell23@wix.com', 'Wald Beardwell', NOW() - interval '48 days', null),
  ('cmorphey24', 'cmorphey24@tiny.cc', 'Cleopatra Morphey', NOW() - interval '205 days', NOW() - interval '42 days'),
  ('bheaslip25', 'bheaslip25@acquirethisname.com', 'Brice Heaslip', NOW() - interval '12 days', NOW() - interval '2 days'),
  ('bspellacy26', 'bspellacy26@liveinternet.ru', 'Beverie Spellacy', NOW() - interval '285 days', NOW() - interval '75 days'),
  ('wshirley27', 'wshirley27@house.gov', 'Weston Shirley', NOW() - interval '225 days', null),
  ('mmcwhan28', 'mmcwhan28@pagesperso-orange.fr', 'Miltie McWhan', NOW() - interval '38 days', NOW() - interval '6 days'),
  ('bbuchett29', 'bbuchett29@trellian.com', 'Burton Buchett', NOW() - interval '325 days', NOW() - interval '180 days'),
  ('dblase2a', 'dblase2a@merriam-webster.com', 'Dorisa Blase', NOW() - interval '5 days', NOW() - interval '1 day'),
  ('cpaulo2b', 'cpaulo2b@privacy.gov.au', 'Charissa Paulo', NOW() - interval '155 days', NOW() - interval '38 days'),
  ('lcorns2c', 'lcorns2c@ifeng.com', 'Lyndell Corns', NOW() - interval '310 days', null),
  ('lspowage2d', 'lspowage2d@miitbeian.gov.cn', 'Loralyn Spowage', NOW() - interval '58 days', NOW() - interval '21 days'),
  ('hmains2e', 'hmains2e@so-net.ne.jp', 'Holly Mains', NOW() - interval '142 days', null),
  ('jcaillou2f', 'jcaillou2f@newsvine.com', 'Jemmy Caillou', NOW() - interval '248 days', null),
  ('iwitchalls2g', 'iwitchalls2g@netlog.com', 'Iggy Witchalls', NOW() - interval '102 days', NOW() - interval '17 days'),
  ('ovalentim2h', 'ovalentim2h@japanpost.jp', 'Osbourn Valentim', NOW() - interval '188 days', NOW() - interval '52 days'),
  ('mswayton2i', 'mswayton2i@answers.com', 'Mabelle Swayton', NOW() - interval '25 days', NOW() - interval '8 days'),
  ('comohun2j', 'comohun2j@nyu.edu', 'Cinnamon O''Mohun', NOW() - interval '340 days', NOW() - interval '240 days'),
  ('pcalles2k', 'pcalles2k@hp.com', 'Perle Calles', NOW() - interval '73 days', NOW() - interval '19 days'),
  ('amckerlie2l', 'amckerlie2l@bizjournals.com', 'Adore McKerlie', NOW() - interval '198 days', null),
  ('csazio2m', 'csazio2m@flavors.me', 'Cameron Sazio', NOW() - interval '32 days', NOW() - interval '4 days'),
  ('gbarosch2n', 'gbarosch2n@networksolutions.com', 'Greta Barosch', NOW() - interval '272 days', NOW() - interval '95 days'),
  ('lwelds2o', 'lwelds2o@jimdo.com', 'Lenka Welds', NOW() - interval '148 days', NOW() - interval '26 days'),
  ('kcandy2p', 'kcandy2p@ycombinator.com', 'Katherine Candy', NOW() - interval '362 days', NOW() - interval '120 days'),
  ('tullock2q', 'tullock2q@smugmug.com', 'Tarah Ullock', NOW() - interval '88 days', null),
  ('rstallard2r', 'rstallard2r@google.ca', 'Rutter Stallard', NOW() - interval '52 days', NOW() - interval '10 days'),
  ('dwinter2s', 'dwinter2s@flickr.com', 'Dillon Winter', NOW() - interval '7 days', NOW() - interval '1 day');

INSERT INTO boards (board_name, board_description) VALUES
('The SQL Zone', 'Discussing database queries, optimization, and that one N+1 problem we all have'),
('Frontend Fears', 'CSS troubles, state management nightmares, and ''why won''t this div center?'''),
('DevOps Dreams', 'Infrastructure, deployment pipelines, and convincing everyone Docker is worth it'),
('AI Adventures', 'Machine learning, prompt engineering, and what did the AI generate this time?'),
('The Cache Conundrum', 'Caching strategies, Redis headaches, and ''there are only two hard things in CS'''),
('API Apocalypse', 'REST, GraphQL, and the eternal debate about versioning'),
('Debugging Diaries', 'Print statements, debuggers, and the rubber duck effect'),
('Node Nightmares', 'JavaScript, callbacks, promises, and async/await confusion'),
('Git Grievances', 'Merge conflicts, rebase disasters, and who committed what?'),
('Code Review Chronicles', 'Making comments on PRs that took way too long to review'),
('The Test Tavern', 'Unit tests, integration tests, and that one test that''s flaky'),
('Laptop Laments', 'Thermal throttling, M1 vs Intel, and SSD prices'),
('Editor Wars', 'Vim vs Neovim vs VSCode vs Emacs (no judgment, mostly)'),
('CLI Cool Kids', 'Command line tools, shell scripts, and memorizing flags'),
('Database Dilemmas', 'Postgres vs MySQL vs MongoDB and regret'),
('Kubernetes Kingdom', 'Container orchestration, YAML indentation, and why is this pod pending?'),
('React Reality', 'Hooks, re-renders, useCallback nightmares'),
('Python Pathways', 'GIL complaints, type hints, and beautiful syntax'),
('The Memory Lane', 'Memory leaks, garbage collection, and heap dumps'),
('Security Secrets', 'Authentication, encryption, and ''please don''t hard-code the API key'''),
('Microservices Madness', 'Service discovery, circuit breakers, and distributed chaos'),
('The CSS Kitchen', 'Flexbox, Grid, and why is it always margin?'),
('TypeScript Truths', 'Type safety, generics, and ''any'' is not a type'),
('DevOps Destiny', 'CI/CD pipelines, GitHub Actions, and automation dreams'),
('The Lambda Lair', 'Serverless architecture, cold starts, and function pricing'),
('HTML Headquarters', 'Semantic markup, accessibility, and what even is ARIA?'),
('JavaScript Jungle', 'Closures, prototypes, and why is this undefined?'),
('The Package Manager Panic', 'npm, yarn, pnpm, and dependency hell'),
('Browser Basics', 'Console errors, network tabs, and DevTools magic'),
('Data Structure Dojo', 'Algorithms, Big O notation, and LeetCode stress'),
('Regex Realm', 'Regular expressions, negative lookbehinds, and why avoid them'),
('The Build Tool Bazaar', 'Webpack, Vite, Rollup, and bundler wars'),
('Cloud Crusades', 'AWS, GCP, Azure, and bill shock'),
('Testing Tactics', 'Mocking, stubbing, fixtures, and test pyramids'),
('The Code Smell Clinic', 'Technical debt, refactoring, and when to rewrite'),
('Static Analysis Station', 'Linters, formatters, and automatic code review'),
('The Config Conundrum', '.env files, secrets management, and oops, committed the password'),
('API Documentation Station', 'OpenAPI, Swagger, and is this endpoint even documented?'),
('Scalability School', 'Load testing, sharding, and ''it works on my machine'''),
('The Socket Saga', 'WebSockets, real-time updates, and connection pooling'),
('Rate Limiting Lounge', 'Throttling, queuing, and fair usage policies'),
('The Monitoring Mansion', 'Observability, logging, tracing, and alerts at 3am'),
('Concurrency Castle', 'Threads, locks, deadlocks, and race conditions'),
('The Version Control Vault', 'Git workflows, branching strategies, and rebase nightmares'),
('Docker Docks', 'Containers, images, registries, and layer caching'),
('The Network Nook', 'TCP/IP, DNS, latency, and why is the internet so complicated?'),
('Error Handling Headquarters', 'Exceptions, error codes, and meaningful messages'),
('The Refactor Retreat', 'Code cleanup, optimization, and when is too much?'),
('CI/CD Cathedral', 'Continuous integration, deployment, and automation'),
('The Pattern Palace', 'Design patterns, SOLID principles, and best practices'),
('Load Balancer Lodge', 'Distribution, failover, and keeping the service up'),
('The Monitoring Midnight', 'Dashboards, metrics, logs, and making sense of data'),
('Concurrency Commons', 'Async/await, promises, streams, and callbacks'),
('The Query Quest', 'SQL optimization, explain plans, and indexes'),
('Frontend Framework Fest', 'React, Vue, Angular, and the new hotness'),
('The Backend Bonanza', 'Node, Python, Go, Rust, and what''s next?'),
('The Dependency Diner', 'Package management, versioning, and breaking changes'),
('Scalability Station', 'Horizontal scaling, caching layers, and architecture'),
('The Testing Theater', 'TDD, BDD, and coverage reports'),
('Code Quality Café', 'Reviews, standards, and consistency'),
('The Documentation Depot', 'READMEs, wikis, and keeping things current'),
('Security Sanctuary', 'Vulnerabilities, patches, and zero-days'),
('The Deployment Destination', 'Rollouts, rollbacks, and zero-downtime updates'),
('Performance Plaza', 'Profiling, optimization, and microseconds matter'),
('The Debug Diner', 'Breakpoints, logging, and tracing execution'),
('Server Café', 'HTTP, status codes, and response headers'),
('The Middleware Marketplace', 'Middleware chains, composability, and order matters'),
('Accessibility Avenue', 'a11y, WCAG, and inclusive design'),
('The Mobile Mansion', 'Responsive design, viewport units, and touch events'),
('Progressive Enhancement Plaza', 'Graceful degradation, fallbacks, and compatibility'),
('The Bundle Size Boulevard', 'Minification, tree-shaking, and fast loading'),
('State Management Station', 'Redux, Context, Zustand, and prop drilling'),
('The Rendering Ring', 'Virtual DOM, diffing, and when to optimize'),
('Build Speed Boulevard', 'Fast rebuilds, incremental builds, and HMR'),
('The Environment Exchange', 'Development, staging, production, and config'),
('Logging Lounge', 'Structured logging, levels, and searching logs'),
('The Error Boundary Barn', 'Exception handling, recovery, and graceful failures'),
('Session Storage Society', 'Cookies, localStorage, sessionStorage, and security'),
('The Request Response Relay', 'HTTP methods, status codes, and proper semantics'),
('Date & Time Daydream', 'Timezones, DST, and why date math is hard'),
('The Unicode Universe', 'Character encoding, emoji, and internationalization'),
('Search Symposium', 'Full-text search, Elasticsearch, and relevance'),
('The Backup Battalion', 'Data redundancy, recovery, and RTO/RPO'),
('Compliance Corner', 'GDPR, CCPA, and legal obligations'),
('The Analytics Arena', 'Tracking, metrics, business intelligence'),
('Monitoring Mechanics', 'Uptime, SLOs, SLAs, and incident response'),
('The Automation Attic', 'Scripts, cron jobs, and scheduled tasks'),
('Email Engineering', 'SMTP, deliverability, and why is email hard?'),
('The Payment Portal', 'Transactions, PCI compliance, and money handling'),
('API Gateway Grove', 'Rate limiting, authentication, and request routing'),
('The Proxy Pavilion', 'Forward proxies, reverse proxies, and caching'),
('Notification Nook', 'Push notifications, webhooks, and event-driven updates'),
('The GraphQL Garden', 'Query language design, schema design, and resolver hell'),
('Observability Operations', 'Metrics, traces, logs, and the three pillars'),
('The Web Assembly Workshop', 'WASM, performance, and when to use it'),
('Concurrency Conundrums', 'Parallelism, threading models, and shared state nightmares'),
('The Compiler Chronicles', 'Compilation, transpilation, and intermediate representations'),
('Memory Management Mansion', 'Allocators, garbage collection, and memory safety'),
('The Parser Parlor', 'Tokenization, abstract syntax trees, and grammars'),
('Runtime Roundup', 'Execution models, JIT compilation, and performance tuning');

INSERT INTO comments (user_id, board_id, comment, time) VALUES
-- Semantic cluster: "Deploying on Friday is risky"
(12, 63, 'We have a hard rule: no deploys after Thursday noon. It has saved us more times than I can count.', NOW() - INTERVAL '142 days 8 hours 15 minutes'),
(47, 49, 'Pushed a release at 4pm on Friday once. Spent the entire weekend on a Zoom call fixing it. Never again.', NOW() - INTERVAL '98 days 14 hours 33 minutes'),
(3, 63, 'End-of-week releases are a trap. Nobody wants to debug on Saturday morning.', NOW() - INTERVAL '44 days 10 hours 5 minutes'),
(81, 24, 'Our CI/CD pipeline blocks merges to main after 2pm on Fridays. Best automation decision we ever made.', NOW() - INTERVAL '11 days 16 hours 22 minutes'),

-- Semantic cluster: "Caching invalidation is the real problem"
(55, 5, 'Getting the cache to fill is easy. Knowing when to throw it away? That is the actual engineering challenge.', NOW() - INTERVAL '177 days 3 hours 12 minutes'),
(9, 58, 'We had stale data showing up for 6 hours because nobody thought about TTLs when they set up the Redis layer.', NOW() - INTERVAL '130 days 19 hours 45 minutes'),
(34, 5, 'The two hardest problems in computer science: naming things, and making sure your cached data is still correct.', NOW() - INTERVAL '67 days 7 hours 8 minutes'),
(72, 51, 'Our users kept seeing yesterday''s prices because the CDN cache wasn''t busting properly. Took us a week to find it.', NOW() - INTERVAL '22 days 11 hours 50 minutes'),

-- Semantic cluster: "Microservices were overkill"
(18, 21, 'We split our monolith into 23 microservices. Now we have 23 problems instead of 1. Would not recommend for a team of 4.', NOW() - INTERVAL '165 days 5 hours 40 minutes'),
(63, 21, 'Distributed systems are incredible when you need them and a nightmare when you don''t. We did not need them.', NOW() - INTERVAL '110 days 22 hours 17 minutes'),
(44, 56, 'A well-structured monolith will beat a poorly designed service mesh every single time. Fight me.', NOW() - INTERVAL '55 days 14 hours 28 minutes'),
(91, 35, 'The overhead of maintaining service-to-service communication ended up costing us more than the thing we were trying to scale.', NOW() - INTERVAL '8 days 9 hours 3 minutes'),

-- Semantic cluster: "Naming things is impossibly hard"
(22, 60, 'I spent 45 minutes naming a variable today. Ended up calling it "data2" anyway. I am not proud.', NOW() - INTERVAL '170 days 12 hours 20 minutes'),
(77, 35, 'Our codebase has a function called "processStuff." Nobody knows what it does but it runs in production so we don''t touch it.', NOW() - INTERVAL '101 days 6 hours 55 minutes'),
(8, 61, 'Good naming is documentation that never goes stale. Bad naming is a riddle your coworkers have to solve at 2am.', NOW() - INTERVAL '38 days 15 hours 11 minutes'),
(50, 50, 'I renamed a module three times this week. Each name was worse than the last. I went back to the original.', NOW() - INTERVAL '5 days 4 hours 42 minutes'),

-- Semantic cluster: "Email is deceptively hard"
(15, 88, 'I thought sending email from an app was trivial. Then I learned about SPF, DKIM, DMARC, and my will to live decreased.', NOW() - INTERVAL '160 days 20 hours 30 minutes'),
(39, 88, 'Nothing humbles a backend engineer faster than trying to get transactional emails to land in the inbox instead of spam.', NOW() - INTERVAL '88 days 2 hours 14 minutes'),
(66, 88, 'We spent 3 weeks building the notification system and 2 months on email deliverability. The ratio tells you everything.', NOW() - INTERVAL '28 days 17 hours 46 minutes'),

-- Semantic cluster: "Documentation that nobody reads"
(29, 61, 'Wrote a 30-page onboarding doc. New hire''s first Slack message: "Where do I find the setup instructions?"', NOW() - INTERVAL '155 days 1 hour 10 minutes'),
(84, 38, 'We documented every single API endpoint with examples. Support tickets stayed exactly the same.', NOW() - INTERVAL '91 days 13 hours 37 minutes'),
(6, 61, 'The best documentation is the kind people actually open. Which, based on our metrics, is none of it.', NOW() - INTERVAL '43 days 8 hours 52 minutes'),
(53, 7, 'I think the only person who ever reads API docs is the person who wrote them, while proofreading.', NOW() - INTERVAL '15 days 20 hours 5 minutes'),

-- Semantic cluster: "Time zones are a nightmare"
(41, 82, 'Every time I think I understand time zones, daylight saving time proves me wrong.', NOW() - INTERVAL '148 days 6 hours 18 minutes'),
(70, 82, 'We store everything in UTC. Display in local time. This still somehow breaks twice a year.', NOW() - INTERVAL '95 days 11 hours 2 minutes'),
(19, 82, 'Our scheduling feature worked perfectly until we had users in Arizona, which doesn''t observe DST. Fun times.', NOW() - INTERVAL '30 days 22 hours 39 minutes'),
(88, 53, 'Date math is the closest software engineering gets to black magic. Just use a library. Trust me.', NOW() - INTERVAL '4 days 7 hours 15 minutes'),

-- Semantic cluster: "Premature optimization is a waste"
(33, 64, 'My junior dev wanted to add Redis caching for a query that takes 3ms. I had to talk them down gently.', NOW() - INTERVAL '140 days 16 hours 44 minutes'),
(96, 64, 'We spent two weeks shaving 10ms off a function that runs once a day at 3am. Great use of engineering time.', NOW() - INTERVAL '80 days 4 hours 21 minutes'),
(14, 54, 'Always measure first. I was certain the bottleneck was in the API layer. It was a missing database index.', NOW() - INTERVAL '50 days 9 hours 33 minutes'),
(58, 1, 'Profile first, optimize second. Every other order is just guessing with extra steps.', NOW() - INTERVAL '17 days 18 hours 57 minutes'),

-- Semantic cluster: "On-call is brutal"
(25, 85, 'Got paged at 3:17am because a health check was failing. The health check itself had a bug. The service was fine.', NOW() - INTERVAL '135 days 3 hours 22 minutes'),
(79, 42, 'On-call wouldn''t be so bad if alerts were actually actionable. 90% of ours are noise.', NOW() - INTERVAL '105 days 15 hours 48 minutes'),
(11, 85, 'I keep my laptop next to my bed during on-call weeks. My partner is thrilled.', NOW() - INTERVAL '59 days 0 hours 8 minutes'),
(46, 42, 'We went from 200 alerts per week to 15 by actually tuning our thresholds. Should have done it years ago.', NOW() - INTERVAL '2 days 12 hours 35 minutes'),

-- Semantic cluster: "Technical debt compounds"
(37, 35, 'Technical debt is a lot like credit card debt. Easy to accumulate, painful to pay off, and the interest rate is brutal.', NOW() - INTERVAL '175 days 10 hours 5 minutes'),
(62, 48, 'We skipped writing tests to ship faster. 8 months later we''re afraid to change anything because we have no idea what will break.', NOW() - INTERVAL '122 days 18 hours 30 minutes'),
(5, 35, 'Every shortcut you take now is a tax on every engineer who touches that code later.', NOW() - INTERVAL '71 days 12 hours 46 minutes'),
(90, 60, 'We finally allocated a whole sprint to paying down tech debt. The codebase feels 5 years younger.', NOW() - INTERVAL '20 days 5 hours 18 minutes'),

-- Semantic cluster: "Impostor syndrome in tech"
(48, 60, 'Sat in a meeting nodding along to acronyms I didn''t recognize. Looked them up later. Half the room didn''t know either.', NOW() - INTERVAL '168 days 14 hours 55 minutes'),
(23, 60, 'I have 12 years of experience and I still Google how to reverse a string sometimes. It''s fine. We''re all pretending.', NOW() - INTERVAL '115 days 7 hours 20 minutes'),
(74, 60, 'The senior engineer on our team told me she still gets nervous before code reviews. That made me feel way better.', NOW() - INTERVAL '62 days 21 hours 38 minutes'),

-- Semantic cluster: "Code review etiquette matters"
(31, 10, 'If your PR review is just "looks good" on 400 lines of code, you did not actually review it.', NOW() - INTERVAL '158 days 9 hours 40 minutes'),
(68, 10, 'Phrase feedback as questions, not commands. "What do you think about extracting this?" lands way better than "Extract this."', NOW() - INTERVAL '107 days 1 hour 12 minutes'),
(2, 10, 'We started doing pair reviews for anything over 300 lines and the quality of feedback went way up.', NOW() - INTERVAL '51 days 16 hours 25 minutes'),
(85, 10, 'My favorite type of PR comment is "this is clever, but will future-us understand it in 6 months?"', NOW() - INTERVAL '13 days 3 hours 50 minutes'),

-- Semantic cluster: "Dependency hell"
(56, 28, 'Updated one package and it broke 14 others. Love the JavaScript ecosystem.', NOW() - INTERVAL '152 days 7 hours 28 minutes'),
(17, 57, 'Our lockfile diffs are bigger than our actual code diffs most weeks.', NOW() - INTERVAL '99 days 20 hours 33 minutes'),
(43, 28, 'Left-pad taught us nothing. We still import packages for things that are three lines of code.', NOW() - INTERVAL '40 days 14 hours 7 minutes'),
(78, 57, 'Spent an entire day resolving peer dependency conflicts. The actual feature took 20 minutes.', NOW() - INTERVAL '7 days 22 hours 42 minutes'),

-- Semantic cluster: "CSS is harder than it looks"
(64, 2, 'I have a computer science degree and I cannot vertically center a div without looking it up.', NOW() - INTERVAL '145 days 11 hours 55 minutes'),
(10, 22, 'Flexbox solved 90% of my CSS problems. Grid solved another 9%. The last 1% will haunt me forever.', NOW() - INTERVAL '86 days 5 hours 14 minutes'),
(35, 2, 'Changed one margin and it moved something on a completely different page. CSS is chaos magic.', NOW() - INTERVAL '34 days 19 hours 48 minutes'),

-- Semantic cluster: "Debugging is mostly reading logs"
(82, 42, 'I own a fancy debugger and use it maybe twice a year. Everything else is console.log and reading stack traces.', NOW() - INTERVAL '172 days 2 hours 35 minutes'),
(27, 76, 'Structured logging changed my life. Being able to filter by request ID across services makes debugging actually possible.', NOW() - INTERVAL '118 days 9 hours 50 minutes'),
(59, 66, 'Our observability stack is world-class and at the end of the day I''m still grep-ing through stdout.', NOW() - INTERVAL '56 days 17 hours 22 minutes'),
(93, 7, 'The best debugging tool is a good night''s sleep. I have found more bugs at 9am than at midnight.', NOW() - INTERVAL '19 days 1 hour 38 minutes'),

-- Standalone varied comments: questions
(40, 16, 'Has anyone successfully migrated from Kubernetes to ECS? We''re evaluating and I want to know the gotchas.', NOW() - INTERVAL '179 days 6 hours 10 minutes'),
(7, 89, 'What''s the deal with rate limiting on the Stripe API? We keep hitting 429s during peak checkout times.', NOW() - INTERVAL '174 days 18 hours 42 minutes'),
(52, 93, 'Does anyone actually understand how WASM memory management works? Every tutorial I find assumes I already know C.', NOW() - INTERVAL '166 days 4 hours 8 minutes'),
(86, 1, 'What query planner does everyone use? EXPLAIN ANALYZE is good but I want something visual.', NOW() - INTERVAL '159 days 22 hours 55 minutes'),
(20, 46, 'Can someone explain TCP backpressure to me like I''m five? I''ve read three blog posts and I''m more confused.', NOW() - INTERVAL '151 days 15 hours 30 minutes'),
(71, 73, 'Is anyone running server components in production yet? Or is it still an experiment?', NOW() - INTERVAL '144 days 0 hours 14 minutes'),
(38, 17, 'Thoughts on using Drizzle vs Prisma in 2025? Starting a new project and I don''t want to pick wrong.', NOW() - INTERVAL '136 days 12 hours 48 minutes'),
(95, 20, 'How are you all handling JWT rotation in microservice architectures? Our current approach feels fragile.', NOW() - INTERVAL '128 days 8 hours 5 minutes'),
(16, 33, 'What cloud provider are people using for hobby projects these days? AWS feels like overkill for my side project.', NOW() - INTERVAL '120 days 3 hours 22 minutes'),
(61, 30, 'Anyone have a good resource for Big O notation that doesn''t assume a math degree?', NOW() - INTERVAL '112 days 17 hours 40 minutes'),
(83, 69, 'Is ARIA landmark navigation actually used by screen reader users? Trying to prioritize our a11y backlog.', NOW() - INTERVAL '104 days 10 hours 8 minutes'),
(28, 45, 'We''re drowning in YAML. Is there an alternative for Kubernetes manifests that''s less painful?', NOW() - INTERVAL '97 days 5 hours 33 minutes'),
(54, 15, 'Should I learn raw SQL deeply or just use an ORM and call it a day? Honest opinions please.', NOW() - INTERVAL '89 days 14 hours 55 minutes'),
(4, 40, 'What WebSocket library are you all using? Socket.io feels heavy for our use case.', NOW() - INTERVAL '83 days 9 hours 18 minutes'),
(76, 91, 'Is cron still the right tool for scheduling jobs in 2025? It feels ancient but it just works.', NOW() - INTERVAL '75 days 21 hours 42 minutes'),
(30, 31, 'How do people actually test regex patterns? I usually just throw things at regex101 until it works.', NOW() - INTERVAL '68 days 2 hours 55 minutes'),

-- Standalone varied comments: frustrated venting
(49, 27, 'JavaScript has like 15 ways to check if something is null or undefined and they all behave differently. I am tired.', NOW() - INTERVAL '176 days 19 hours 8 minutes'),
(13, 9, '"Works on my machine" is the most infuriating sentence in software engineering. Docker was supposed to fix this.', NOW() - INTERVAL '163 days 11 hours 35 minutes'),
(65, 3, 'Spent the morning fighting our Jenkins pipeline. The error message was "null." Just... null. Thanks, Jenkins.', NOW() - INTERVAL '153 days 23 hours 50 minutes'),
(21, 44, 'Rebased against main and lost half my changes because I said yes to the wrong prompt. Git is hostile software.', NOW() - INTERVAL '137 days 4 hours 15 minutes'),
(89, 96, 'Three different AST parsers and they all tokenize arrow functions differently. I''m losing my mind.', NOW() - INTERVAL '129 days 16 hours 28 minutes'),
(36, 23, 'TypeScript''s type inference is amazing until it gives you an error message that''s 47 lines long and references six generics.', NOW() - INTERVAL '121 days 8 hours 42 minutes'),
(73, 89, 'PCI compliance is basically a full-time job. Every time I think we''re done, there''s a new requirement.', NOW() - INTERVAL '113 days 1 hour 55 minutes'),
(57, 16, 'Our Kubernetes cluster has more YAML than actual application code. This can''t be right.', NOW() - INTERVAL '106 days 19 hours 10 minutes'),
(24, 8, 'I have been staring at this callback hell for three hours. This code predates async/await and nobody wants to refactor it.', NOW() - INTERVAL '96 days 6 hours 33 minutes'),
(80, 92, 'Spent an entire day on a bug that turned out to be a Unicode zero-width space pasted from Slack. I need a drink.', NOW() - INTERVAL '87 days 14 hours 48 minutes'),
(42, 62, 'I''m convinced linters exist solely to argue with me about semicolons and trailing commas. Every. Single. Commit.', NOW() - INTERVAL '78 days 3 hours 5 minutes'),
(67, 55, 'Upgraded Node from 18 to 20 and half our tests broke. Not because of Node, but because the test runner changed default behavior.', NOW() - INTERVAL '69 days 20 hours 22 minutes'),
(1, 37, 'We rotate secrets every 90 days. The rotation process itself has broken production twice. Ironic.', NOW() - INTERVAL '61 days 10 hours 38 minutes'),
(92, 41, 'Our rate limiter rate-limited our own health checks. The alert for "service down" was technically correct.', NOW() - INTERVAL '53 days 2 hours 52 minutes'),
(32, 79, 'My phone got 47 push notifications from our staging environment at 2am because someone left a test flag on.', NOW() - INTERVAL '42 days 18 hours 10 minutes'),

-- Standalone varied comments: helpful answers
(69, 1, 'For slow Postgres queries, start with EXPLAIN ANALYZE. Look for sequential scans on large tables first. Usually a missing index.', NOW() - INTERVAL '178 days 12 hours 30 minutes'),
(26, 5, 'Cache aside pattern works great for reads. For writes, prefer write-through if consistency matters more than latency.', NOW() - INTERVAL '169 days 0 hours 45 minutes'),
(51, 20, 'For JWTs, keep the access token short-lived (15 min) and use refresh tokens with rotation. Revoke the refresh token on logout.', NOW() - INTERVAL '161 days 7 hours 18 minutes'),
(87, 45, 'If you''re drowning in Docker networking issues, try running docker network inspect. 90% of the time it''s a subnet conflict.', NOW() - INTERVAL '147 days 14 hours 55 minutes'),
(60, 4, 'Set up alerts on your 99th percentile latency, not your average. Average hides the pain from your worst-off users.', NOW() - INTERVAL '139 days 2 hours 8 minutes'),
(94, 46, 'For DNS propagation issues, use dig +trace to see exactly where the resolution chain breaks. Saves hours of guessing.', NOW() - INTERVAL '131 days 18 hours 33 minutes'),
(45, 3, 'If your GitHub Actions are slow, cache your dependencies and use a matrix strategy for test parallelism. Cut our build time from 20min to 6.', NOW() - INTERVAL '123 days 11 hours 48 minutes'),
(75, 47, 'Try-catch everything at the boundary of your system (HTTP handlers, queue consumers). Let internal code throw. Log at the boundary with full context.', NOW() - INTERVAL '116 days 4 hours 5 minutes'),
(99, 69, 'Start a11y work with the low-hanging fruit: alt text on images, proper heading hierarchy, and keyboard focus management. Those three cover a huge percentage of issues.', NOW() - INTERVAL '108 days 16 hours 22 minutes'),
(38, 77, 'When dealing with cookies, always set SameSite=Lax at minimum. Strict is better if your users don''t follow links from external sites.', NOW() - INTERVAL '100 days 9 hours 38 minutes'),
(16, 54, 'For query optimization: check your indexes first, look at the execution plan, then consider if you even need that JOIN.', NOW() - INTERVAL '92 days 1 hour 52 minutes'),
(55, 72, 'Hot module replacement not working? Check that your component file has a default export. Vite needs it for the HMR boundary.', NOW() - INTERVAL '84 days 17 hours 10 minutes'),
(29, 86, 'For database backups: test your restores regularly. A backup you can''t restore from is not a backup.', NOW() - INTERVAL '76 days 8 hours 28 minutes'),

-- Standalone varied comments: casual/conversational
(83, 91, 'Our cron jobs are held together with duct tape and prayers. Do not look at the scheduler config, it will hurt your feelings.', NOW() - INTERVAL '173 days 15 hours 5 minutes'),
(46, 13, 'I love Vim. I have no idea how to exit Vim. These are not contradictory statements.', NOW() - INTERVAL '162 days 3 hours 20 minutes'),
(70, 11, 'That flaky test has been failing randomly for 8 months and at this point it''s basically a coworker.', NOW() - INTERVAL '149 days 20 hours 38 minutes'),
(19, 50, 'Design patterns are just fancy names for things you''ve already been doing. At least, that''s what I tell myself.', NOW() - INTERVAL '141 days 6 hours 52 minutes'),
(58, 33, 'My AWS bill is a horror story I tell junior devs to keep them humble.', NOW() - INTERVAL '133 days 13 hours 10 minutes'),
(97, 14, 'I don''t always use the command line, but when I do, I forget the flags and end up on StackOverflow anyway.', NOW() - INTERVAL '125 days 0 hours 25 minutes'),
(34, 27, 'JavaScript is the language where NaN is a number and undefined is defined. I have accepted this.', NOW() - INTERVAL '117 days 19 hours 42 minutes'),
(62, 48, 'Refactoring is like cleaning your house. You start with one room and end up reorganizing the entire kitchen.', NOW() - INTERVAL '109 days 8 hours 58 minutes'),
(8, 73, 'Started a side project in React, rewrote it in Svelte, considered Vue, and ultimately shipped nothing.', NOW() - INTERVAL '103 days 14 hours 15 minutes'),
(41, 65, 'I write comments in my code for future me. Future me never reads them and makes the same mistakes.', NOW() - INTERVAL '93 days 22 hours 30 minutes'),
(76, 9, '"Let''s just rewrite it" said someone at every company I''ve worked at. It has never once been a good idea.', NOW() - INTERVAL '85 days 10 hours 48 minutes'),
(15, 74, 'State management libraries are like diets. Everyone swears by a different one and none of them work for everyone.', NOW() - INTERVAL '77 days 5 hours 5 minutes'),

-- Standalone varied comments: sharing wins
(52, 64, 'Finally got our p99 latency under 200ms after switching to connection pooling. Three months of work but it feels amazing.', NOW() - INTERVAL '171 days 21 hours 40 minutes'),
(87, 3, 'Migrated from Jenkins to GitHub Actions last month. Build times dropped by 60% and the config is actually readable.', NOW() - INTERVAL '143 days 10 hours 15 minutes'),
(22, 39, 'We load tested our service to 10x expected traffic and it held. First time that has ever happened. I am unreasonably proud.', NOW() - INTERVAL '126 days 7 hours 30 minutes'),
(64, 1, 'Added a composite index and our slowest query went from 4 seconds to 12 milliseconds. I feel like a wizard.', NOW() - INTERVAL '102 days 14 hours 42 minutes'),
(39, 69, 'Ran our app through an accessibility audit and scored 96. The remaining 4% is a third-party widget we can''t control.', NOW() - INTERVAL '73 days 0 hours 55 minutes'),
(98, 63, 'Zero-downtime deployment pipeline is finally working. Blue-green with automated canary rollback. I can sleep again.', NOW() - INTERVAL '36 days 16 hours 8 minutes'),
(71, 79, 'Switched from polling to WebSockets for our chat feature and the user experience is night and day.', NOW() - INTERVAL '25 days 13 hours 22 minutes'),

-- Standalone varied comments: hot takes/opinions
(43, 6, 'GraphQL is great until your schema has 40 nested resolvers and you''re debugging an N+1 problem at 2am. REST was fine.', NOW() - INTERVAL '167 days 8 hours 25 minutes'),
(80, 23, 'Hot take: TypeScript''s biggest value isn''t type safety. It''s autocomplete. Fight me.', NOW() - INTERVAL '154 days 16 hours 38 minutes'),
(26, 25, 'Serverless is just "someone else''s server with a worse debugging experience." There, I said it.', NOW() - INTERVAL '146 days 1 hour 52 minutes'),
(57, 17, 'ORMs are training wheels. Eventually you need to write actual SQL and understand what the ORM was hiding from you.', NOW() - INTERVAL '138 days 19 hours 10 minutes'),
(12, 55, 'The best programming language is the one your team already knows. I will die on this hill.', NOW() - INTERVAL '127 days 5 hours 25 minutes'),
(68, 21, 'Every "microservices success story" I read involves a team of 200 engineers. My team has 6 people. A monolith is fine.', NOW() - INTERVAL '119 days 13 hours 42 minutes'),
(33, 32, 'Webpack is legacy software and nobody will convince me otherwise. Vite changed the game.', NOW() - INTERVAL '111 days 2 hours 58 minutes'),
(91, 15, 'Stop normalizing your database to death. A little denormalization for read performance is not a sin.', NOW() - INTERVAL '94 days 18 hours 12 minutes'),
(5, 18, 'Python''s GIL exists because threading is hard and the core team made a pragmatic trade-off. It was the right call.', NOW() - INTERVAL '81 days 7 hours 28 minutes'),
(48, 6, 'REST vs GraphQL debates are boring. Use whatever fits your data access patterns. Stop making it religious.', NOW() - INTERVAL '60 days 23 hours 45 minutes'),

-- Standalone varied comments: short reactions
(75, 35, 'This. Exactly this.', NOW() - INTERVAL '164 days 13 hours 2 minutes'),
(9, 10, '+1. Same issue here on our team.', NOW() - INTERVAL '156 days 5 hours 18 minutes'),
(82, 42, 'Bookmarking this for later.', NOW() - INTERVAL '134 days 0 hours 35 minutes'),
(44, 20, 'We literally just hit this yesterday.', NOW() - INTERVAL '114 days 11 hours 48 minutes'),
(67, 8, 'lol the callback hell comment hits too close to home.', NOW() - INTERVAL '90 days 19 hours 5 minutes'),
(100, 64, 'Huge if true.', NOW() - INTERVAL '72 days 6 hours 22 minutes'),
(14, 49, 'Can confirm. We did the same thing.', NOW() - INTERVAL '47 days 15 hours 38 minutes'),
(37, 88, 'pain.', NOW() - INTERVAL '26 days 8 hours 52 minutes'),

-- Semantic cluster: "Config management is chaos"
(88, 37, 'We have 4 different .env files and nobody knows which one is the source of truth. This is fine.', NOW() - INTERVAL '157 days 17 hours 45 minutes'),
(30, 75, 'Our configuration is split between environment variables, a YAML file, a JSON file, and a database table. Why are we like this.', NOW() - INTERVAL '124 days 6 hours 10 minutes'),
(54, 37, 'Someone changed a config value in production without telling anyone and we spent 3 hours debugging a "code bug."', NOW() - INTERVAL '57 days 13 hours 28 minutes'),

-- Semantic cluster: "Regex is write-only code"
(73, 31, 'I wrote a regex 6 months ago and now I genuinely cannot read it. It works. I''m afraid to touch it.', NOW() - INTERVAL '150 days 4 hours 32 minutes'),
(2, 31, 'Every regex I write goes through the same lifecycle: doesn''t work, works on my test case, breaks on edge case, despair, StackOverflow.', NOW() - INTERVAL '79 days 15 hours 48 minutes'),
(60, 96, 'Named capture groups changed my regex life. At least now future-me has a clue what each part is supposed to match.', NOW() - INTERVAL '31 days 2 hours 5 minutes'),

-- Semantic cluster: "Containers solved and created problems"
(47, 45, 'Docker solved "works on my machine." Docker Compose solved "works on my cluster." Kubernetes solved "I need more problems."', NOW() - INTERVAL '143 days 20 hours 15 minutes'),
(85, 16, 'Container images make deployments reproducible. Container orchestration makes your weekends disappear. Choose wisely.', NOW() - INTERVAL '74 days 12 hours 38 minutes'),
(20, 45, 'We containerized everything and our builds got slower, our images got bigger, and our ops team got crankier. But at least it''s consistent.', NOW() - INTERVAL '33 days 5 hours 52 minutes'),

-- More topically specific standalone comments
(98, 87, 'Our analytics pipeline processes 2TB daily and the bottleneck is always the GROUP BY on unindexed columns. Same lesson, larger scale.', NOW() - INTERVAL '180 days 10 hours 20 minutes'),
(7, 90, 'For API gateway auth, we moved from validating JWTs at each service to validating once at the gateway and forwarding claims. Cut latency on every internal hop.', NOW() - INTERVAL '176 days 2 hours 40 minutes'),
(63, 84, 'Prometheus + Grafana for metrics, Loki for logs, Tempo for traces. All free, all open source, all integrated. No excuse not to have observability.', NOW() - INTERVAL '170 days 7 hours 55 minutes'),
(32, 89, 'PCI compliance tip: scope reduction is your best friend. The fewer systems that touch card data, the less you have to audit.', NOW() - INTERVAL '164 days 22 hours 10 minutes'),
(79, 95, 'Memory-safe languages aren''t just about preventing bugs. They''re about sleeping at night knowing a buffer overflow won''t take down production.', NOW() - INTERVAL '157 days 3 hours 25 minutes'),
(11, 43, 'Our deadlock was caused by two services acquiring the same locks in different order. Classic problem, still got us.', NOW() - INTERVAL '150 days 18 hours 40 minutes'),
(56, 91, 'Replaced a 200-line bash deployment script with a 15-line Makefile. Sometimes the old tools really are better.', NOW() - INTERVAL '143 days 5 hours 55 minutes'),
(94, 97, 'JIT compilation blew my mind when I first understood it. The runtime literally rewrites your code while it''s running based on real usage patterns.', NOW() - INTERVAL '136 days 21 hours 10 minutes'),
(40, 78, 'HTTP 204 No Content is the most underappreciated status code. Perfect for DELETE responses and actions that don''t need a body.', NOW() - INTERVAL '129 days 12 hours 25 minutes'),
(18, 26, 'Semantic HTML is not just about accessibility. It makes your CSS easier, your tests easier, and your future refactors easier. Use the right tags.', NOW() - INTERVAL '122 days 3 hours 40 minutes'),
(66, 93, 'Compiled our image processing library to WASM and it runs at near-native speed in the browser. The user doesn''t even know it''s not JavaScript.', NOW() - INTERVAL '114 days 18 hours 55 minutes'),
(35, 36, 'Run your linter as a pre-commit hook, not just in CI. Catching formatting issues before they hit the PR saves everyone time and emotional energy.', NOW() - INTERVAL '107 days 9 hours 10 minutes'),
(81, 51, 'Load balancer health checks should be more than just "is the port open." Check your database connection, check your dependencies. A responsive but broken service is worse than a down one.', NOW() - INTERVAL '100 days 0 hours 25 minutes'),
(50, 67, 'Server-side rendering cut our time-to-first-byte from 3s to 400ms. Client-side rendering was fine for our internal dashboard but brutal for public pages.', NOW() - INTERVAL '91 days 15 hours 40 minutes'),
(23, 70, 'Touch events on mobile are a completely different mental model from click events. You need to handle tap, swipe, pinch, and long-press as distinct interactions.', NOW() - INTERVAL '82 days 6 hours 55 minutes'),
(69, 19, 'Tracked down a memory leak that only appeared after 72 hours of uptime. It was a Map that grew on every request because nothing ever deleted old entries.', NOW() - INTERVAL '74 days 22 hours 10 minutes'),
(3, 59, 'End-to-end tests are slow and flaky. Unit tests are fast but miss integration bugs. The testing pyramid is a guideline, not a law.', NOW() - INTERVAL '66 days 13 hours 25 minutes'),
(86, 34, 'Mocking third-party APIs in tests saved us. When Stripe''s sandbox went down for a day, our test suite still passed and we could still ship.', NOW() - INTERVAL '58 days 4 hours 40 minutes'),
(10, 53, 'We process orders across 14 time zones. Every single date bug we''ve had was because someone forgot to convert to UTC before comparing.', NOW() - INTERVAL '49 days 19 hours 55 minutes'),
(74, 40, 'Moved from short-polling to SSE for our notification feed. Way simpler than WebSockets for a one-directional data stream.', NOW() - INTERVAL '41 days 11 hours 10 minutes'),
(45, 4, 'If your API versioning strategy is "put v1 in the URL and hope we never need v2," you are not alone but you should probably plan ahead.', NOW() - INTERVAL '35 days 2 hours 25 minutes'),
(99, 57, 'Pinning your dependencies is not optional. Letting npm resolve "latest" in CI is how you get surprise breakage on a Tuesday morning.', NOW() - INTERVAL '27 days 17 hours 40 minutes'),
(53, 85, 'SLOs should be set collaboratively with product, not dictated by engineering. Otherwise you''re just guessing at what "reliable enough" means.', NOW() - INTERVAL '18 days 8 hours 55 minutes'),
(28, 71, 'Graceful degradation is underrated. When the recommendation engine goes down, show popular items instead of an error page. Users barely notice.', NOW() - INTERVAL '10 days 0 hours 10 minutes'),
(95, 83, 'Full-text search in Postgres using tsvector and tsquery is good enough for most apps. Don''t add Elasticsearch until you actually need it.', NOW() - INTERVAL '3 days 15 hours 25 minutes'),

-- More varied topical comments to fill remaining slots
(42, 92, 'Discovered our app was emitting emoji as surrogate pairs in one browser and unified codepoints in another. Character encoding is never boring.', NOW() - INTERVAL '180 days 1 hour 45 minutes'),
(77, 52, 'Moved from Redis to DragonflyDB for our caching layer and it''s a drop-in replacement that handles memory way more efficiently.', NOW() - INTERVAL '175 days 14 hours 20 minutes'),
(13, 29, 'The browser DevTools performance tab is the most underused tool in frontend development. Learn to read flame charts.', NOW() - INTERVAL '169 days 0 hours 35 minutes'),
(59, 87, 'GDPR forced us to actually think about what data we collect and why. Turns out we were hoarding data we never used.', NOW() - INTERVAL '162 days 15 hours 50 minutes'),
(96, 76, 'Structured JSON logging with request IDs is the difference between debugging for 5 minutes and debugging for 5 hours.', NOW() - INTERVAL '155 days 6 hours 5 minutes'),
(31, 39, 'Load testing tip: don''t just test your happy path. Throw in 10% error requests and see how your error handling holds up under pressure.', NOW() - INTERVAL '148 days 21 hours 20 minutes'),
(68, 68, 'Tree-shaking only works if your imports are statically analyzable. Dynamic require() calls will include the entire module every time.', NOW() - INTERVAL '140 days 12 hours 35 minutes'),
(4, 80, 'I reflexively reach for localStorage and then remember it''s synchronous, blocks the main thread, and has a 5MB limit. IndexedDB it is.', NOW() - INTERVAL '132 days 3 hours 50 minutes'),
(84, 94, 'Race conditions aren''t just a concurrency thing. We had a race condition in our React state updates that caused phantom clicks.', NOW() - INTERVAL '124 days 19 hours 5 minutes'),
(17, 86, 'We backup to S3 hourly, replicate to another region daily, and test restores monthly. Paranoid? Maybe. But we''ve never lost data.', NOW() - INTERVAL '116 days 10 hours 20 minutes'),
(49, 67, 'Hydration errors in server-rendered React are the bane of my existence. The DOM mismatch warnings are almost never helpful.', NOW() - INTERVAL '108 days 1 hour 35 minutes'),
(6, 98, 'Built a custom tokenizer for our domain-specific language and honestly the hardest part was handling string escapes with nested quotes.', NOW() - INTERVAL '99 days 16 hours 50 minutes'),
(90, 58, 'The number of production incidents caused by someone not reading the README is genuinely depressing.', NOW() - INTERVAL '90 days 8 hours 5 minutes'),
(25, 46, 'Our entire networking team spent a week on a DNS issue that turned out to be a typo in a CNAME record. One character.', NOW() - INTERVAL '82 days 23 hours 20 minutes'),
(72, 34, 'Snapshot testing sounds great in theory. In practice it''s a "press Y to update" button that nobody reads before pressing.', NOW() - INTERVAL '75 days 14 hours 35 minutes'),
(36, 25, 'Cold starts on Lambda went from a real problem to mostly fine. If you''re still complaining about them, check if you''re importing the entire AWS SDK.', NOW() - INTERVAL '67 days 5 hours 50 minutes'),
(61, 75, 'We switched from Webpack to Vite and our dev server starts in under a second. The future is fast.', NOW() - INTERVAL '59 days 21 hours 5 minutes'),
(100, 43, 'Mutexes are simple. Knowing where to put them is the hard part. We had a lock protecting the wrong resource for months.', NOW() - INTERVAL '52 days 12 hours 20 minutes'),
(14, 90, 'API key rotation is one of those things everyone agrees is important and nobody does until they get breached.', NOW() - INTERVAL '44 days 3 hours 35 minutes'),
(78, 17, 'Our database has 47 tables and we use about 12 regularly. The rest are from features that were abandoned but never cleaned up.', NOW() - INTERVAL '37 days 18 hours 50 minutes'),
(51, 7, 'If your error messages say "something went wrong" you have failed as a developer. Tell the user what happened and what they can do about it.', NOW() - INTERVAL '29 days 10 hours 5 minutes'),
(89, 56, 'We let every team pick their own tech stack and now we have 4 languages, 3 ORMs, and 2 different test frameworks. Autonomy has a cost.', NOW() - INTERVAL '21 days 1 hour 20 minutes'),
(33, 99, 'Learned about tracing this week and I genuinely don''t know how we debugged distributed systems without it. Distributed traces are magic.', NOW() - INTERVAL '14 days 16 hours 35 minutes'),
(65, 49, 'Our CI pipeline runs for 42 minutes. I could make a sandwich, eat it, and still have time to question my career choices.', NOW() - INTERVAL '6 days 7 hours 50 minutes'),
(20, 73, 'Tried every state management library and landed back on React Context for most things. Not everything needs to be global state.', NOW() - INTERVAL '1 day 23 hours 5 minutes'),

-- Semantic cluster: "Security is everyone's job"
(92, 20, 'The weakest security link is always a human. No amount of encryption helps when someone clicks a phishing link.', NOW() - INTERVAL '160 days 9 hours 15 minutes'),
(27, 62, 'We passed a security audit, felt great, then found a SQL injection vulnerability the next week. Audits are a snapshot, not a guarantee.', NOW() - INTERVAL '70 days 18 hours 30 minutes'),
(50, 20, 'Every intern''s first PR has hardcoded credentials somewhere. It''s a rite of passage at this point.', NOW() - INTERVAL '16 days 3 hours 45 minutes'),

-- Semantic cluster: "Postgres can do everything"
(40, 15, 'We moved our job queue from RabbitMQ to Postgres with SKIP LOCKED. One fewer service to manage, same reliability.', NOW() - INTERVAL '156 days 12 hours 50 minutes'),
(78, 1, 'People keep reaching for separate tools when Postgres already has full-text search, JSONB, pub/sub with LISTEN/NOTIFY, and now vectors. It''s wild.', NOW() - INTERVAL '64 days 3 hours 15 minutes'),
(55, 83, 'Needed a search feature. Almost added Elasticsearch. Tried Postgres tsvector first and it was more than sufficient for our 500k rows.', NOW() - INTERVAL '9 days 20 hours 30 minutes'),

-- Semantic cluster: "Monorepos vs polyrepos"
(46, 9, 'Moved to a monorepo last year and code sharing is way easier. But good luck if your CI doesn''t understand incremental builds.', NOW() - INTERVAL '132 days 17 hours 10 minutes'),
(10, 44, 'Polyrepos give you isolation but the dependency management across 30 repos is a full-time job.', NOW() - INTERVAL '46 days 22 hours 25 minutes'),
(83, 44, 'The monorepo vs polyrepo debate is really a tooling debate. Either works fine if you invest in the right build system.', NOW() - INTERVAL '12 days 14 hours 40 minutes'),

-- More standalone varied comments
(37, 52, 'Redis Streams are criminally underused. Perfect for event sourcing patterns without the overhead of Kafka.', NOW() - INTERVAL '178 days 5 hours 28 minutes'),
(71, 98, 'Wrote a recursive descent parser for our config format and honestly it was one of the most satisfying things I''ve built.', NOW() - INTERVAL '171 days 16 hours 43 minutes'),
(15, 43, 'Thread pools: too small and you starve your system, too large and you context-switch yourself into oblivion. Finding the sweet spot is an art.', NOW() - INTERVAL '165 days 8 hours 58 minutes'),
(56, 81, 'CORS errors are the "check if it''s plugged in" of web development. Everyone hits them and everyone is confused the first time.', NOW() - INTERVAL '158 days 0 hours 13 minutes'),
(93, 97, 'V8 inlines functions it calls frequently. If you care about performance, small focused functions aren''t just clean code, they''re optimizable code.', NOW() - INTERVAL '151 days 15 hours 28 minutes'),
(28, 38, 'The best API docs I''ve ever seen had runnable examples for every endpoint. Not just sample requests. Actual buttons you could click.', NOW() - INTERVAL '144 days 6 hours 43 minutes'),
(64, 58, 'Horizontal scaling is not a magic bullet. If your app has shared mutable state, adding more servers just adds more race conditions.', NOW() - INTERVAL '137 days 21 hours 58 minutes'),
(41, 71, 'Feature flags let us deploy code that''s not ready without branching. Ship the flag off, flip it on when confidence is high. Game changer.', NOW() - INTERVAL '130 days 13 hours 13 minutes'),
(79, 95, 'Rust''s borrow checker is annoying until you realize it''s catching exactly the bugs you''d spend hours finding in C. Then it''s annoying and correct.', NOW() - INTERVAL '123 days 4 hours 28 minutes'),
(22, 2, 'CSS container queries are the thing I didn''t know I needed until I had them. Media queries based on the parent element, not the viewport. Beautiful.', NOW() - INTERVAL '115 days 19 hours 43 minutes'),
(58, 76, 'Centralized logging without correlation IDs is basically just a very expensive grep across multiple machines.', NOW() - INTERVAL '106 days 10 hours 58 minutes'),
(4, 30, 'LeetCode is a terrible way to evaluate engineers and a pretty decent way to learn data structures. Both things are true.', NOW() - INTERVAL '97 days 2 hours 13 minutes'),
(86, 41, 'We implemented token bucket rate limiting and it handles bursty traffic way better than fixed-window counting.', NOW() - INTERVAL '88 days 17 hours 28 minutes'),
(13, 22, 'Z-index is not a difficulty level. Stop setting things to z-index: 99999. Create a proper stacking context.', NOW() - INTERVAL '79 days 8 hours 43 minutes'),
(39, 48, 'Started with a big refactor and ended up touching 200 files. Should have done it in smaller PRs. Nobody will review a 200-file diff.', NOW() - INTERVAL '71 days 23 hours 58 minutes'),
(72, 84, 'OpenTelemetry has finally unified the metrics/traces/logs story. No more juggling three different SDKs.', NOW() - INTERVAL '63 days 15 hours 13 minutes'),
(24, 14, 'Aliases in your shell config are free productivity. I have one for every kubectl command I type more than twice.', NOW() - INTERVAL '54 days 6 hours 28 minutes'),
(97, 27, 'Closures in JavaScript are elegant and also the number one source of "why does this variable have the wrong value" bugs.', NOW() - INTERVAL '45 days 21 hours 43 minutes'),
(51, 63, 'We do canary deployments that route 5% of traffic to the new version. If error rates spike, automatic rollback. I sleep well.', NOW() - INTERVAL '38 days 12 hours 58 minutes'),
(8, 39, 'Chaos engineering sounds scary until you realize it''s just "break things on purpose so they don''t break by surprise."', NOW() - INTERVAL '30 days 4 hours 13 minutes'),
(66, 47, 'Error handling is the difference between "the app crashed" and "the app told me what went wrong and recovered gracefully."', NOW() - INTERVAL '23 days 19 hours 28 minutes'),
(34, 57, 'Semantic versioning only works if everyone agrees on what a "breaking change" is. Spoiler: nobody agrees.', NOW() - INTERVAL '15 days 10 hours 43 minutes'),
(92, 80, 'localStorage is fine for preferences and UI state. It is not fine for auth tokens. Please stop putting auth tokens in localStorage.', NOW() - INTERVAL '8 days 1 hour 58 minutes'),
(48, 36, 'Our linter has 247 rules enabled. I''m pretty sure 200 of them contradict each other somewhere.', NOW() - INTERVAL '3 days 17 hours 13 minutes'),

-- Final semantic cluster: "Monitoring is useless without good alerts"
(19, 52, 'A dashboard nobody checks is just expensive art. Alerts that trigger action are what actually matter.', NOW() - INTERVAL '146 days 8 hours 30 minutes'),
(57, 85, 'We had Grafana dashboards for everything and still missed a 3-hour outage because nobody was watching. Set up alerts, not dashboards.', NOW() - INTERVAL '48 days 20 hours 45 minutes'),
(87, 42, 'Good alerting is about reducing noise. If your team ignores pages because they''re always false alarms, you have a bigger problem than uptime.', NOW() - INTERVAL '1 day 5 hours 0 minutes'),

-- Semantic cluster: "Testing in production is sometimes the only way"
(61, 34, 'No amount of staging environment testing catches the bugs that only show up with real user traffic patterns.', NOW() - INTERVAL '169 days 11 hours 40 minutes'),
(3, 59, 'We test in production and I''m not ashamed. Feature flags, canary rollouts, and good monitoring make it safe. Staging is a lie anyway.', NOW() - INTERVAL '103 days 6 hours 55 minutes'),
(85, 11, 'Our staging environment is three months behind production config-wise. Testing there gives us false confidence.', NOW() - INTERVAL '39 days 14 hours 10 minutes'),

-- Semantic cluster: "The build step has gotten out of control"
(16, 32, 'Our build step does transpilation, bundling, tree-shaking, minification, image optimization, CSS purging, and generates a manifest. Compiling C was simpler.', NOW() - INTERVAL '159 days 2 hours 18 minutes'),
(44, 72, 'Remember when you could just write an HTML file, open it in a browser, and it worked? I miss those days sometimes.', NOW() - INTERVAL '83 days 16 hours 33 minutes'),
(70, 68, 'Our frontend build takes longer than our backend build even though it''s a tenth the size of the codebase. Something is deeply wrong.', NOW() - INTERVAL '24 days 9 hours 48 minutes'),

-- More standalone comments
(29, 18, 'Python type hints are documentation that the IDE can actually verify. Use them. Your future self will thank you.', NOW() - INTERVAL '177 days 18 hours 22 minutes'),
(52, 66, 'Our log volume went from 2GB/day to 200MB/day when we stopped logging request bodies in production. Also improved response times.', NOW() - INTERVAL '172 days 9 hours 37 minutes'),
(77, 50, 'The strategy pattern is my go-to refactoring move when I see a switch statement with more than 4 cases.', NOW() - INTERVAL '166 days 0 hours 52 minutes'),
(1, 33, 'Got our first AWS bill after leaving a GPU instance running for a month. I have no further comments.', NOW() - INTERVAL '160 days 16 hours 7 minutes'),
(63, 77, 'HttpOnly cookies are non-negotiable for session tokens. If JavaScript can read it, so can an XSS attack.', NOW() - INTERVAL '153 days 7 hours 22 minutes'),
(38, 8, 'Promises are great. Promise.allSettled is even better. Not everything needs to fail just because one thing failed.', NOW() - INTERVAL '147 days 22 hours 37 minutes'),
(82, 87, 'GDPR right-to-deletion requests made us realize we had user data in 14 different systems. That was a fun quarter.', NOW() - INTERVAL '141 days 13 hours 52 minutes'),
(21, 41, 'Implemented a sliding window rate limiter and it handles traffic spikes way more gracefully than our old fixed-window approach.', NOW() - INTERVAL '135 days 5 hours 7 minutes'),
(95, 74, 'Zustand is what Redux should have been. Minimal boilerplate, hooks-based, and my state management code shrank by 60%.', NOW() - INTERVAL '128 days 20 hours 22 minutes'),
(47, 65, 'The best code comment I''ve ever seen: "This is wrong. I know it''s wrong. But it fixes the bug. Don''t touch it."', NOW() - INTERVAL '121 days 11 hours 37 minutes'),
(10, 19, 'Heap dumps are like reading the Matrix. Mostly gibberish until you spot the one object that''s 4GB and shouldn''t exist.', NOW() - INTERVAL '113 days 2 hours 52 minutes'),
(74, 55, 'Tried Go for the first time. The error handling is verbose but at least I always know exactly what can fail and where.', NOW() - INTERVAL '105 days 18 hours 7 minutes'),
(31, 40, 'If your WebSocket reconnection strategy doesn''t have exponential backoff with jitter, you''ll DDoS yourself during outages.', NOW() - INTERVAL '98 days 9 hours 22 minutes'),
(56, 26, 'We added skip navigation links and a customer wrote in specifically to thank us. Accessibility matters to real people.', NOW() - INTERVAL '90 days 0 hours 37 minutes'),
(88, 54, 'Window functions in SQL blew my mind. ROW_NUMBER, RANK, LAG, LEAD — they solve problems I used to pull data into Python for.', NOW() - INTERVAL '81 days 15 hours 52 minutes'),
(23, 46, 'DNS TTL of 5 minutes sounds aggressive until you need to failover to a different region and your old TTL was 24 hours.', NOW() - INTERVAL '73 days 7 hours 7 minutes'),
(65, 3, 'Our deploy process: merge PR, CI builds, deploy to canary, wait 10 minutes, promote. Simple and it has never bitten us.', NOW() - INTERVAL '64 days 22 hours 22 minutes'),
(40, 75, 'You don''t need React for a blog. You don''t need React for a landing page. You might not even need React for your SaaS. Use the right tool.', NOW() - INTERVAL '56 days 13 hours 37 minutes'),
(9, 84, 'Started collecting custom metrics and realized our most-used feature is one we almost cut last quarter. Data beats opinions.', NOW() - INTERVAL '48 days 4 hours 52 minutes'),
(73, 12, 'The difference between 16GB and 32GB of RAM on a dev machine is the difference between closing Chrome tabs and not.', NOW() - INTERVAL '40 days 20 hours 7 minutes'),
(43, 78, 'HTTP 429 Too Many Requests is the status code that teaches you about rate limiting whether you wanted to learn or not.', NOW() - INTERVAL '32 days 11 hours 22 minutes'),
(17, 62, 'Spent a day configuring ESLint and Prettier to not fight each other. There''s a day of my life I''ll never get back.', NOW() - INTERVAL '25 days 2 hours 37 minutes'),
(91, 70, 'Responsive design isn''t just about screen width. Consider touch targets, font sizes, and whether your hover states make any sense on mobile.', NOW() - INTERVAL '17 days 17 hours 52 minutes'),
(30, 99, 'Service meshes add a proxy sidecar to every pod. That''s extra latency, extra memory, and extra complexity. Make sure you need it.', NOW() - INTERVAL '9 days 9 hours 7 minutes'),
(62, 15, 'Postgres EXPLAIN output should be required reading. The difference between a nested loop and a hash join can be a 100x performance difference.', NOW() - INTERVAL '2 days 0 hours 22 minutes'),

-- Semantic cluster: "AI-generated code still needs review"
(54, 4, 'Copilot wrote a beautiful function that passed all my tests and had a subtle off-by-one error. Trust but verify.', NOW() - INTERVAL '168 days 13 hours 15 minutes'),
(80, 60, 'Using LLMs to write code is like having a very fast intern. Productive, but you better review every line.', NOW() - INTERVAL '93 days 4 hours 30 minutes'),
(26, 10, 'AI-generated PRs still need the same scrutiny as human ones. Maybe more, because the bugs are more confident.', NOW() - INTERVAL '28 days 19 hours 45 minutes'),

-- Semantic cluster: "Database migrations are scary"
(7, 15, 'Running ALTER TABLE on a 500 million row table in production is the closest I''ve come to a religious experience.', NOW() - INTERVAL '174 days 6 hours 28 minutes'),
(45, 1, 'We do all schema migrations behind feature flags now. Migrate the data first, then switch the code path. Zero-downtime.', NOW() - INTERVAL '95 days 21 hours 43 minutes'),
(69, 15, 'Accidentally ran a migration on prod instead of staging once. Had to restore from backup. I now triple-check which terminal I''m in.', NOW() - INTERVAL '19 days 12 hours 58 minutes'),

-- A few more standalone comments
(99, 92, 'The amount of edge cases in Unicode normalization is genuinely horrifying. Two strings can look identical and not be equal.', NOW() - INTERVAL '155 days 19 hours 40 minutes'),
(36, 79, 'Moved our notification system from pull-based to push-based and user engagement went up 3x. Turns out people respond to real-time.', NOW() - INTERVAL '87 days 10 hours 55 minutes'),
(5, 94, 'If your code has a comment that says "don''t ask why this works" it means nobody has understood it since 2019 and it will break eventually.', NOW() - INTERVAL '51 days 1 hour 10 minutes'),
(84, 56, 'Started a project in Go, realized the team knew TypeScript better, rewrote it in Node. Picking the boring familiar tech was the right call.', NOW() - INTERVAL '43 days 16 hours 25 minutes'),
(11, 86, 'Tested our disaster recovery process for the first time. Restore took 6 hours, not 1 hour like we estimated. Glad we practiced before we needed it.', NOW() - INTERVAL '35 days 7 hours 40 minutes'),
(49, 30, 'Hashtable performance degrades badly with poor hash functions. We were hashing user IDs with MD5 for no reason. Switched to xxHash and saved 15% CPU.', NOW() - INTERVAL '26 days 22 hours 55 minutes'),
(2, 13, 'Switched from VS Code to Neovim and my startup time went from 3 seconds to instant. My configuration time went from zero to infinity.', NOW() - INTERVAL '18 days 14 hours 10 minutes'),
(67, 90, 'OAuth flows work perfectly in your documentation and never in your implementation. There is always one redirect URI mismatch.', NOW() - INTERVAL '10 days 5 hours 25 minutes'),
(33, 71, 'Feature flags are not a replacement for cleaning up old code paths. We have flags from 2022 that are still on. They should just be code.', NOW() - INTERVAL '4 days 20 hours 40 minutes'),
(75, 49, 'Our CI pipeline caches node_modules and it saves 3 minutes per build. Across 50 builds a day that''s 2.5 hours. Cache everything.', NOW() - INTERVAL '0 days 11 hours 55 minutes'),

-- Final batch to reach 300
(42, 93, 'WASM is not a JavaScript replacement. It''s a JavaScript complement. Use it for the hot loop, not the whole app.', NOW() - INTERVAL '161 days 4 hours 12 minutes'),
(18, 77, 'Set the Secure flag on every cookie. If you''re not on HTTPS by now, that''s a different conversation.', NOW() - INTERVAL '152 days 19 hours 27 minutes'),
(96, 29, 'The network tab in Chrome DevTools has solved more bugs for me than any logging framework ever has.', NOW() - INTERVAL '145 days 10 hours 42 minutes'),
(59, 24, 'Automated deployments are great until the automation itself breaks and nobody remembers how to deploy manually.', NOW() - INTERVAL '138 days 1 hour 57 minutes'),
(14, 52, 'Redis pub/sub is great for fan-out but terrible for guaranteed delivery. Use Streams or an actual message broker if you can''t afford to drop messages.', NOW() - INTERVAL '131 days 17 hours 12 minutes'),
(81, 53, 'Spent an hour debugging a test that only failed on the CI server. Time zone difference between my machine and CI. Of course.', NOW() - INTERVAL '125 days 8 hours 27 minutes'),
(35, 4, 'Version your APIs from day one. It costs almost nothing upfront and saves months of pain when you need breaking changes.', NOW() - INTERVAL '118 days 23 hours 42 minutes'),
(60, 12, 'My MacBook fans spin up whenever I open Slack, Chrome, Docker, and VS Code simultaneously. Which is always.', NOW() - INTERVAL '111 days 14 hours 57 minutes'),
(6, 44, 'git bisect found a bug introduced 47 commits ago in under 2 minutes. Automated bisect with a test script is criminally underused.', NOW() - INTERVAL '104 days 6 hours 12 minutes'),
(78, 86, 'Point-in-time recovery saved us when someone ran an UPDATE without a WHERE clause. Yes, really.', NOW() - INTERVAL '96 days 21 hours 27 minutes'),
(53, 23, 'TypeScript generics are like spicy food. A little bit makes everything better. Too much and you can''t enjoy the meal.', NOW() - INTERVAL '88 days 12 hours 42 minutes'),
(27, 85, 'Our SLO dashboard is the first thing I check every morning. Not because I want to, but because I learned what happens when I don''t.', NOW() - INTERVAL '80 days 3 hours 57 minutes'),
(94, 2, 'CSS specificity wars are the real reason people invented CSS-in-JS. Change my mind.', NOW() - INTERVAL '72 days 19 hours 12 minutes'),
(45, 67, 'Server components are not just about performance. They fundamentally change how you think about data fetching. Worth the learning curve.', NOW() - INTERVAL '65 days 10 hours 27 minutes'),
(12, 76, 'Added log sampling and our observability bill dropped 70%. We were logging the same healthy request 10 million times a day.', NOW() - INTERVAL '57 days 1 hour 42 minutes'),
(68, 19, 'Found a goroutine leak in production. We were spawning goroutines in a loop without any cancellation. 400k goroutines. Oops.', NOW() - INTERVAL '50 days 16 hours 57 minutes'),
(37, 69, 'Color contrast checkers should be mandatory in every design review. So many "design-approved" UIs fail WCAG AA.', NOW() - INTERVAL '42 days 8 hours 12 minutes'),
(83, 48, 'Refactored a 2000-line file into 8 modules. The code does exactly the same thing but now I can actually find stuff.', NOW() - INTERVAL '34 days 23 hours 27 minutes'),
(20, 91, 'Our most important cron job had no monitoring. We discovered it had been silently failing for two weeks. Add alerts to your scheduled tasks.', NOW() - INTERVAL '7 days 14 hours 42 minutes'),
(46, 1, 'Just discovered CTEs in SQL and my complex queries went from incomprehensible to almost readable. WITH clauses are beautiful.', NOW() - INTERVAL '0 days 5 hours 57 minutes'), 

-- Semantic cluster: "Meetings that should have been emails"
(71, 60, 'Just got out of a 90-minute meeting to decide on a naming convention. We did not decide on a naming convention.', NOW() - INTERVAL '173 days 4 hours 18 minutes'),
(24, 60, 'I block off "focus time" on my calendar and people just schedule over it. The calendar is a suggestion, apparently.', NOW() - INTERVAL '109 days 15 hours 33 minutes'),
(55, 60, 'Four people in a meeting, one person talks, three people check Slack. We could have just posted in the channel.', NOW() - INTERVAL '52 days 7 hours 48 minutes'),

-- Semantic cluster: "Logging too much is as bad as logging too little"
(39, 76, 'We log everything at DEBUG level in production. Our log storage bill is higher than our compute bill.', NOW() - INTERVAL '167 days 11 hours 22 minutes'),
(82, 84, 'Turned on verbose logging to debug an issue and the sheer volume of output made the actual problem harder to find.', NOW() - INTERVAL '101 days 2 hours 37 minutes'),
(15, 76, 'Our logging pipeline processes 8TB a day and 99% of it is health check requests. We finally added a filter.', NOW() - INTERVAL '37 days 18 hours 52 minutes'),
(63, 42, 'The signal-to-noise ratio in our logs was about 1:500. Spent a week pruning and now debugging takes minutes instead of hours.', NOW() - INTERVAL '14 days 6 hours 7 minutes'),

-- Semantic cluster: "Estimates are fiction"
(48, 60, 'Manager asked how long the feature would take. I said two weeks. It took six. I was the optimistic estimate.', NOW() - INTERVAL '158 days 22 hours 14 minutes'),
(3, 35, 'We tried story points, t-shirt sizes, and planning poker. None of them made our estimates less wrong.', NOW() - INTERVAL '85 days 13 hours 29 minutes'),
(90, 60, 'The only honest estimate in software is "it depends." Everything else is a guess wearing a suit.', NOW() - INTERVAL '29 days 4 hours 44 minutes'),

-- Topical comments for boards that might be underrepresented
(77, 93, 'Compiled a Rust image processing library to WASM and the performance difference versus pure JS was 40x on large images. Worth the toolchain hassle.', NOW() - INTERVAL '149 days 3 hours 19 minutes'),
(22, 96, 'Writing a recursive descent parser for a simple expression language taught me more about compilers than any textbook. Highly recommend as a weekend project.', NOW() - INTERVAL '142 days 18 hours 34 minutes'),
(66, 97, 'The V8 blog post on hidden classes completely changed how I think about object shapes in JavaScript. Consistent property ordering actually matters for JIT.', NOW() - INTERVAL '134 days 9 hours 49 minutes'),
(34, 95, 'Switched from a naive mark-and-sweep to a generational garbage collector in our custom runtime and GC pauses went from 50ms to under 2ms.', NOW() - INTERVAL '126 days 1 hour 4 minutes'),
(89, 94, 'Concurrency in Go feels natural until you forget to close a channel and your goroutine hangs forever with no error message. Silent failures are the worst.', NOW() - INTERVAL '117 days 16 hours 19 minutes'),
(41, 91, 'Replaced 12 separate cron jobs with a single orchestration script that handles dependencies between them. No more "job B ran before job A finished."', NOW() - INTERVAL '110 days 7 hours 34 minutes'),
(59, 92, 'Fun fact: the Turkish locale uppercases "i" to "İ" not "I". Our string comparison broke for exactly one customer. Internationalization is a minefield.', NOW() - INTERVAL '102 days 22 hours 49 minutes'),
(7, 79, 'Server-Sent Events are perfect for push notifications when you only need server-to-client. Simpler than WebSockets, works through HTTP proxies, built into browsers.', NOW() - INTERVAL '94 days 14 hours 4 minutes'),
(86, 89, 'Stripe webhooks with idempotency keys saved us from double-charging a customer during a network retry. Never process payments without idempotency.', NOW() - INTERVAL '86 days 5 hours 19 minutes'),
(13, 90, 'Our API gateway handles auth, rate limiting, and request transformation. Moving all that logic out of individual services simplified each one dramatically.', NOW() - INTERVAL '78 days 20 hours 34 minutes'),
(52, 88, 'Set up DMARC in report-only mode first. We discovered three internal tools sending email that nobody on the team knew about.', NOW() - INTERVAL '70 days 11 hours 49 minutes'),

-- Semantic cluster: "Burnout is real"
(25, 60, 'Worked 60-hour weeks for two months straight to hit a deadline. The feature launched, nobody used it, and I was too exhausted to care.', NOW() - INTERVAL '154 days 8 hours 11 minutes'),
(74, 60, 'Took a week off with no laptop and came back solving problems in 30 minutes that had stumped me for days. Rest is a productivity tool.', NOW() - INTERVAL '76 days 23 hours 26 minutes'),
(33, 60, 'The on-call rotation burned out our best engineer and she quit. We finally hired more people, but we lost the person who knew everything.', NOW() - INTERVAL '21 days 14 hours 41 minutes'),

-- Semantic cluster: "The wrong abstraction is worse than no abstraction"
(96, 50, 'DRY is not a religion. Sometimes duplicating code is clearer than a shared function with 8 boolean parameters.', NOW() - INTERVAL '163 days 19 hours 56 minutes'),
(17, 35, 'We built a "generic" data layer that could handle any entity type. It handled none of them well.', NOW() - INTERVAL '99 days 11 hours 11 minutes'),
(58, 48, 'Inherited a codebase with so many layers of abstraction that a simple database query went through 7 files. I could not follow the flow.', NOW() - INTERVAL '41 days 2 hours 26 minutes'),

-- More standalone varied comments
(80, 83, 'PostgreSQL''s JSONB indexing with GIN is fast enough that we stopped using a separate document store entirely. One less service in the architecture.', NOW() - INTERVAL '139 days 14 hours 8 minutes'),
(2, 87, 'Built a simple analytics dashboard with Postgres materialized views and it handles our volume fine. Not everything needs a data warehouse.', NOW() - INTERVAL '133 days 5 hours 23 minutes'),
(69, 25, 'Lambda cold starts are manageable if you keep your deployment package small. The teams complaining about cold starts usually have 200MB bundles.', NOW() - INTERVAL '127 days 20 hours 38 minutes'),
(44, 78, 'Content-Type headers are load-bearing. Sent JSON with text/html once and spent half a day figuring out why the client was parsing it wrong.', NOW() - INTERVAL '120 days 11 hours 53 minutes'),
(19, 43, 'We had a race condition that only triggered when two users clicked submit within the same 50ms window. Took three weeks to reproduce.', NOW() - INTERVAL '112 days 3 hours 8 minutes'),
(76, 66, 'Grep is 50 years old and still the first tool I reach for. Sometimes the old stuff just works.', NOW() - INTERVAL '104 days 18 hours 23 minutes'),
(32, 17, 'Switched from an ORM to raw SQL for our reporting queries and they went from timing out to finishing in 200ms. ORMs optimize for developer speed, not query speed.', NOW() - INTERVAL '97 days 9 hours 38 minutes'),
(61, 20, 'We finally set up a bug bounty program and someone found an IDOR vulnerability within 48 hours. Best money we ever spent.', NOW() - INTERVAL '89 days 0 hours 53 minutes'),
(98, 45, 'Multi-stage Docker builds cut our image size from 1.2GB to 180MB. Your production image does not need gcc and build tools.', NOW() - INTERVAL '81 days 16 hours 8 minutes'),
(5, 74, 'Tried every state management approach and honestly useReducer plus context handles 90% of cases. The ecosystem overcorrected.', NOW() - INTERVAL '73 days 7 hours 23 minutes'),
(47, 62, 'Prettier ended all formatting debates on our team overnight. Nobody argues about semicolons when the robot decides for you.', NOW() - INTERVAL '65 days 22 hours 38 minutes'),
(28, 33, 'Reserved instances saved us 40% on our AWS bill. If your workload is predictable, you''re burning money on on-demand.', NOW() - INTERVAL '57 days 13 hours 53 minutes'),
(73, 11, 'Integration tests caught a bug that 500 unit tests missed because none of the unit tests tested the actual integration point. Surprise.', NOW() - INTERVAL '49 days 5 hours 8 minutes'),
(38, 47, 'Custom error classes in JavaScript are worth the boilerplate. Being able to catch ApiError separately from ValidationError makes error handling so much cleaner.', NOW() - INTERVAL '41 days 20 hours 23 minutes'),
(87, 14, 'fzf changed my terminal workflow more than any other tool. Fuzzy finding through command history and file paths is addicting.', NOW() - INTERVAL '33 days 11 hours 38 minutes'),
(50, 82, 'Daylight saving time transitions have caused bugs in every system I have ever worked on. Including one that only runs batch jobs.', NOW() - INTERVAL '25 days 2 hours 53 minutes'),
(12, 56, 'We let each team choose their own framework and now onboarding someone to a different team takes a month. Consistency has value.', NOW() - INTERVAL '17 days 18 hours 8 minutes'),
(64, 51, 'Nginx as a reverse proxy in front of our Node servers handles static files and SSL termination. Let each tool do what it''s good at.', NOW() - INTERVAL '9 days 9 hours 23 minutes'),
(93, 1, 'Partial indexes in Postgres are a hidden gem. Index only the rows you actually query and your index is a fraction of the size.', NOW() - INTERVAL '3 days 0 hours 38 minutes'),
(21, 55, 'Rewrote our bottleneck service from Python to Rust and throughput went up 20x. But for the other 47 services, Python is perfectly fine.', NOW() - INTERVAL '1 day 15 hours 53 minutes'),

-- Semantic cluster: "The first deploy is the hardest"
(42, 63, 'Spent two weeks writing the feature and three weeks figuring out how to deploy it. The deployment pipeline was the real project.', NOW() - INTERVAL '150 days 6 hours 31 minutes'),
(16, 49, 'Our first production deploy took 4 hours of manual steps. We automated it down to 8 minutes. Should have done that first.', NOW() - INTERVAL '60 days 21 hours 46 minutes'),
(70, 24, 'If deploying your app requires a wiki page with 30 steps, you do not have a deployment process. You have a ritual.', NOW() - INTERVAL '13 days 12 hours 1 minutes'),

-- Last few to pad out
(99, 90, 'The hardest part of API design is not the happy path. It''s deciding what error messages look like when everything goes wrong.', NOW() - INTERVAL '46 days 3 hours 16 minutes'),
(26, 53, 'Tested our app with a user whose name contains an apostrophe and three features broke. O''Brien is not an edge case.', NOW() - INTERVAL '36 days 18 hours 31 minutes'),
(85, 72, 'Hot reloading saves me maybe 2 seconds per change. Over a full day of development that adds up to staying sane.', NOW() - INTERVAL '27 days 9 hours 46 minutes'),
(8, 37, 'Environment variables for config, feature flags for behavior, database for user settings. Mixing these up causes pain.', NOW() - INTERVAL '19 days 1 hour 1 minutes'),
(54, 44, 'Our git history is beautiful on main and an absolute warzone on feature branches. And honestly, that''s fine.', NOW() - INTERVAL '11 days 16 hours 16 minutes'),
(79, 15, 'Postgres advisory locks are the concurrency tool nobody knows about. No table overhead, application-level locking, and dead simple.', NOW() - INTERVAL '5 days 7 hours 31 minutes');

INSERT INTO rich_content
  (comment_id, content)
VALUES
  (63, '{ "type": "poll", "question": "What is your favorite color?", "options": ["blue", "red", "green", "yellow"] }'),
  (71, '{ "type": "video", "url": "https://youtu.be/dQw4w9WgXcQ", "dimensions": { "height": 1080, "width": 1920 }}'),
  (104, '{ "type": "poll", "question": "Is this your favorite video?", "options": ["yes", "no", "oh you"] }'),
  (201, '{ "type": "image", "url": "https://btholt.github.io/complete-intro-to-linux-and-the-cli/WORDMARK-Small.png", "dimensions": { "height": 400, "width": 1084 }}'),
  (274, '{ "type": "image", "url": "https://btholt.github.io/complete-intro-to-linux-and-the-cli/HEADER.png", "dimensions": { "height": 237 , "width": 3301 }}');
