{
  "$comment": "Weekly ship log → #shipped. New items at TOP. Public brands OK (ChamaFácil, Falcão, MetroEx). Private/social/+18 → product 'Social' or generic. area: mobile|backend|realtime|ai|games|infra|web|payments|security",
  "updated": "2026-09-14",
  "items": [
    {
      "id": "2026-09-14-firestore-catchall",
      "date": "2026-09-14",
      "product": "Social",
      "area": "security",
      "title": {
        "en": "Firestore catch-all OR bug → production lockdown",
        "pt": "Bug OR do catch-all Firestore → lockdown em produção"
      },
      "summary": {
        "en": "Root match /{document=**} OR'd with every rule and voided wallet/admin locks. Removed catch-all, declared collections explicitly, 49 emulator regression tests green — wallets, admins and payment logs no longer client-writable.",
        "pt": "O match raiz /{document=**} fazia OR com tudo e anulava locks de wallet/admin. Removi o catch-all, declarei coleções, 49 testes no emulador verdes — wallet, admins e payment logs sem write do client."
      },
      "tags": [
        "Firebase",
        "Firestore Rules",
        "Security",
        "Emulator"
      ]
    },
    {
      "id": "2026-09-09-age-verify",
      "date": "2026-09-09",
      "product": "Social",
      "area": "security",
      "title": {
        "en": "Third-party age verification + Remote Config gate",
        "pt": "Verificação de idade third-party + gate Remote Config"
      },
      "summary": {
        "en": "Integrated an identity-verification provider with firestore.rules for verification state and a Remote Config kill-switch — compliance without hardcoding country policy in the binary.",
        "pt": "Integrei provedor de verificação de identidade com rules no Firestore e kill-switch no Remote Config — compliance sem hardcodar política de país no binário."
      },
      "tags": [
        "Compliance",
        "Remote Config",
        "Firebase"
      ]
    },
    {
      "id": "2026-08-26-notif-rules",
      "date": "2026-08-26",
      "product": "Social",
      "area": "security",
      "title": {
        "en": "Closed open notifications/** rules + prune job",
        "pt": "Rules abertas de notifications/** fechadas + prune"
      },
      "summary": {
        "en": "Removed the open notifications block, locked writes to trusted paths and added a scheduled prune so the inbox can't be forged or grow forever.",
        "pt": "Removi o bloco aberto de notifications, travei writes em paths confiáveis e pus prune agendado — inbox sem forge e sem crescer pra sempre."
      },
      "tags": [
        "Firestore Rules",
        "Cloud Scheduler"
      ]
    },
    {
      "id": "2026-08-07-account-status",
      "date": "2026-08-07",
      "product": "Social",
      "area": "security",
      "title": {
        "en": "accountStatus whitelist — no self-unban",
        "pt": "Whitelist de accountStatus — sem auto-desban"
      },
      "summary": {
        "en": "Owners may only transit Active/inactive. Blocked/Suspended/Deleted stay Admin SDK–only after proving a blacklist on the wrong literal let banned users write Active back.",
        "pt": "Dono só transita Active/inactive. Blocked/Suspended/Deleted ficam no Admin SDK — blacklist no literal errado permitia banido gravar Active de novo."
      },
      "tags": [
        "Firestore Rules",
        "Abuse prevention"
      ]
    },
    {
      "id": "2026-08-06-wallet-admin-lock",
      "date": "2026-08-06",
      "product": "Social",
      "area": "security",
      "title": {
        "en": "Wallet, admins & audit collections client-locked",
        "pt": "Wallet, admins e auditoria trancados pro client"
      },
      "summary": {
        "en": "coins/total_coins/accountStatus backend-owned; wallet transactions write-zero from clients; admins, audit_logs and payment_logs closed — any signed-in user could read/write them before.",
        "pt": "coins/total_coins/accountStatus no backend; transactions de wallet write-zero no client; admins, audit_logs e payment_logs fechados — antes qualquer logado lia/escrevia."
      },
      "tags": [
        "Firebase",
        "Integrity",
        "Payments"
      ]
    },
    {
      "id": "2026-09-14-drone-edge-yolo",
      "date": "2026-09-14",
      "product": "Field-ops",
      "area": "geo",
      "title": {
        "en": "On-device YOLO/NCNN over drone UI mirror",
        "pt": "YOLO/NCNN on-device sobre espelho da UI do drone"
      },
      "summary": {
        "en": "Android edge pipeline: MediaProjection of the drone controller screen + NCNN YOLO11 detection overlay (person/vehicle/boat/fire) without piloting the aircraft.",
        "pt": "Pipeline edge Android: MediaProjection da tela do controle + overlay YOLO11 NCNN (pessoa/veículo/barco/fogo) sem pilotar a aeronave."
      },
      "tags": [
        "Android",
        "NCNN",
        "YOLO",
        "MediaProjection"
      ]
    },
    {
      "id": "2026-09-14-drone-telemetry-geo",
      "date": "2026-09-14",
      "product": "Field-ops",
      "area": "geo",
      "title": {
        "en": "Drone telemetry fusion → geo-target estimate",
        "pt": "Fusão de telemetria do drone → estimativa de geoalvo"
      },
      "summary": {
        "en": "Fuse GPS/heading/gimbal sources and estimate target lat/lon from camera geometry — field units upload photo + telemetry to the C2 for map plot.",
        "pt": "Fusão GPS/heading/gimbal e estimativa de lat/lon do alvo pela geometria da câmera — unidade de campo sobe foto + telemetria pro C2 no mapa."
      },
      "tags": [
        "GPS",
        "Telemetry",
        "Geolocation"
      ]
    },
    {
      "id": "2026-09-14-presence-api",
      "date": "2026-09-14",
      "product": "Field-ops",
      "area": "geo",
      "title": {
        "en": "Field-unit presence API (heartbeat + map)",
        "pt": "API de presença de unidades (heartbeat + mapa)"
      },
      "summary": {
        "en": "Cloudflare Workers presence service with health, token auth and TTL heartbeats so the ops map shows which edge units are online.",
        "pt": "Serviço de presença em Workers com health, auth por token e heartbeat com TTL — mapa operacional mostra quem está online."
      },
      "tags": [
        "Workers",
        "Realtime",
        "Ops"
      ]
    },
    {
      "id": "2026-09-14-forts-security-baseline",
      "date": "2026-09-14",
      "product": "Field-ops",
      "area": "security",
      "title": {
        "en": "C2 security baseline: secrets out of source",
        "pt": "Baseline de segurança do C2: secrets fora do código"
      },
      "summary": {
        "en": "Audited hardcoded tokens/passwords/API keys in the legacy C2, rotation plan, env-based config and auth on ingest routes — prototype → engineering security bar.",
        "pt": "Auditei tokens/senhas/API keys hardcoded no C2 legado, plano de rotação, config via env e auth nas rotas de ingestão — barra de segurança de protótipo → engenharia."
      },
      "tags": [
        "Secrets",
        "Auth",
        "Hardening"
      ]
    },
    {
      "id": "2026-09-14-pos-bridge",
      "date": "2026-09-14",
      "product": "ChamaFácil",
      "area": "backend",
      "title": {
        "en": "Restaurant POS ↔ live dispatch bridge",
        "pt": "Ponte POS de restaurante ↔ despacho ao vivo"
      },
      "summary": {
        "en": "Bidirectional logistics: POS orders hit the dispatch board with live status callbacks (accepted → on the way → delivered / rejected).",
        "pt": "Logística bidirecional: pedidos do POS caem no kanban com callbacks ao vivo (aceito → a caminho → entregue / rejeitado)."
      },
      "tags": [
        "Node.js",
        "Webhooks",
        "Realtime"
      ]
    },
    {
      "id": "2026-09-14-ops-digest",
      "date": "2026-09-14",
      "product": "ChamaFácil",
      "area": "backend",
      "title": {
        "en": "Weekly ops email digests for delivery hubs",
        "pt": "Digest semanal de operação por e-mail"
      },
      "summary": {
        "en": "Automated reports: created / completed / cancelled orders and revenue per active unit — who moved, who went quiet.",
        "pt": "Relatórios automáticos: pedidos criados / concluídos / cancelados e faturamento por unidade — quem andou e quem parou."
      },
      "tags": [
        "Ops",
        "Email",
        "Node.js"
      ]
    },
    {
      "id": "2026-09-14-firebase-migration-plan",
      "date": "2026-09-14",
      "product": "Social",
      "area": "backend",
      "title": {
        "en": "Firebase → API migration map (integrity-first)",
        "pt": "Mapa de migração Firebase → API (integridade primeiro)"
      },
      "summary": {
        "en": "Classified what must leave client-writable Firestore (wallet, uniqueness, auth lookups) vs what can stay — so money and nicknames never depend on open rules.",
        "pt": "Classifiquei o que precisa sair do Firestore writeable no client (wallet, unicidade, lookups) vs o que pode ficar — dinheiro e nicknames sem rules abertas."
      },
      "tags": [
        "Architecture",
        "Firebase",
        "API"
      ]
    },
    {
      "id": "2026-09-13-field-ops-site",
      "date": "2026-09-13",
      "product": "Field-ops",
      "area": "geo",
      "title": {
        "en": "Field-ops product site + presence API",
        "pt": "Site field-ops + API de presença"
      },
      "summary": {
        "en": "React/Vite on Cloudflare Pages plus Workers presence API with health checks — DNS, SEO and deploy pipeline end-to-end.",
        "pt": "React/Vite no Cloudflare Pages e API de presença em Workers com health — DNS, SEO e deploy ponta a ponta."
      },
      "tags": [
        "React",
        "Workers",
        "SEO",
        "Geolocation",
        "Ops"
      ]
    },
    {
      "id": "2026-09-13-tutorial-landings",
      "date": "2026-09-13",
      "product": "ChamaFácil",
      "area": "web",
      "title": {
        "en": "Operator tutorial landings + Play Store build",
        "pt": "Landings de tutorial + build Play Store"
      },
      "summary": {
        "en": "Shipped tutorial upload/landings via CI and kicked the Android release pipeline so hubs get onboarding that matches the live product.",
        "pt": "Landings de tutorial via CI e pipeline Android na Play — onboarding alinhado com o produto em produção."
      },
      "tags": [
        "CI/CD",
        "Android",
        "Content"
      ]
    },
    {
      "id": "2026-09-13-whitelabel-visual",
      "date": "2026-09-13",
      "product": "ChamaFácil",
      "area": "web",
      "title": {
        "en": "White-label visual identity rollout",
        "pt": "Rollout de identidade white-label"
      },
      "summary": {
        "en": "Per-hub themes on store / admin / motoboy panels — colors, favicons and titles without forking the codebase.",
        "pt": "Temas por central nos painéis loja / admin / motoboy — cores, favicons e títulos sem fork do código."
      },
      "tags": [
        "White-label",
        "React",
        "Theming"
      ]
    },
    {
      "id": "2026-09-11-ai-consent",
      "date": "2026-09-11",
      "product": "Social",
      "area": "ai",
      "title": {
        "en": "AI feature consent screen + settings toggle",
        "pt": "Tela de consentimento de IA + toggle"
      },
      "summary": {
        "en": "Versioned consent copy persisted in Firestore, mirrored from the nickname-prompt UX pattern, with a settings kill-switch.",
        "pt": "Texto versionado no Firestore, espelhando o UX do nickname prompt, com kill-switch nas configurações."
      },
      "tags": [
        "Flutter",
        "Privacy",
        "AI"
      ]
    },
    {
      "id": "2026-09-10-driver-pix-score",
      "date": "2026-09-10",
      "product": "ChamaFácil",
      "area": "payments",
      "title": {
        "en": "Driver PIX keys + invite scoring v1",
        "pt": "Chave PIX do motoboy + score de convites v1"
      },
      "summary": {
        "en": "Drivers register PIX for settlements; invite events feed a reliability score so hubs stop guessing who shows up.",
        "pt": "Motoboys cadastram PIX; eventos de convite alimentam um score de confiabilidade."
      },
      "tags": [
        "Flutter",
        "PostgreSQL",
        "Payments"
      ]
    },
    {
      "id": "2026-09-09-pwa-share",
      "date": "2026-09-09",
      "product": "ChamaFácil",
      "area": "mobile",
      "title": {
        "en": "Motoboy PWA share-link previews",
        "pt": "Previews de share link no PWA Motoboy"
      },
      "summary": {
        "en": "Custom OG/share metadata for the driver PWA so WhatsApp and browsers show the right brand instead of a blank card.",
        "pt": "OG/share metadata no PWA do motoboy — WhatsApp e browsers mostram a marca certa."
      },
      "tags": [
        "PWA",
        "OG",
        "Flutter Web"
      ]
    },
    {
      "id": "2026-09-07-pos-kanban-sync",
      "date": "2026-09-07",
      "product": "ChamaFácil",
      "area": "realtime",
      "title": {
        "en": "Kanban state machine synced to POS",
        "pt": "Máquina de estados do kanban ↔ POS"
      },
      "summary": {
        "en": "Mapped ACCEPTED / ONGOING / FINISHED / REJECTED to partner board columns with cancel webhooks both ways.",
        "pt": "Mapeei ACCEPTED / ONGOING / FINISHED / REJECTED para colunas do parceiro com cancelamento nos dois sentidos."
      },
      "tags": [
        "Webhooks",
        "State machine"
      ]
    },
    {
      "id": "2026-09-05-dispatch-simplify",
      "date": "2026-09-05",
      "product": "ChamaFácil",
      "area": "backend",
      "title": {
        "en": "Dispatch simplified: invite-then-pool",
        "pt": "Despacho simplificado: convite → pool"
      },
      "summary": {
        "en": "Killed the unused wave cascade. One invite, then open pool — less latency, same fairness, fewer edge cases in production.",
        "pt": "Matei a cascata de waves. Um convite e depois pool — menos latência, mesma justiça, menos edge cases."
      },
      "tags": [
        "Dispatch",
        "Product"
      ]
    },
    {
      "id": "2026-09-05-xo-game",
      "date": "2026-09-05",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "In-chat tic-tac-toe (Flutter + Firestore)",
        "pt": "Jogo da velha no chat (Flutter + Firestore)"
      },
      "summary": {
        "en": "Second realtime mini-game beside the Unity title — invite/accept flow in chat without shipping another native binary.",
        "pt": "Segundo mini-game realtime ao lado do título Unity — convite/aceite no chat sem outro binário nativo."
      },
      "tags": [
        "Flutter",
        "Firestore",
        "Games"
      ]
    },
    {
      "id": "2026-09-04-ai-order-bot",
      "date": "2026-09-04",
      "product": "Falcão Digital",
      "area": "ai",
      "title": {
        "en": "AI WhatsApp order & support flows",
        "pt": "Pedido e suporte no WhatsApp com IA"
      },
      "summary": {
        "en": "Agent clarifies addresses, quotes delivery fees and routes support — Claude + WhatsApp bridge in production.",
        "pt": "Agente clarifica endereço, cotiza taxa e atende suporte — Claude + ponte WhatsApp em produção."
      },
      "tags": [
        "Claude",
        "WhatsApp",
        "AI"
      ]
    },
    {
      "id": "2026-09-04-fee-quote-api",
      "date": "2026-09-04",
      "product": "ChamaFácil",
      "area": "backend",
      "title": {
        "en": "Reusable fee → quote → preview service",
        "pt": "Service reutilizável fee → quote → preview"
      },
      "summary": {
        "en": "Neighborhood pricing pipeline with 27 unit tests — quote and preview share one service so admin/store/API can't drift.",
        "pt": "Pipeline de tarifa por bairro com 27 testes — quote e preview no mesmo service pra admin/loja/API não divergirem."
      },
      "tags": [
        "TypeScript",
        "TDD",
        "Pricing"
      ]
    },
    {
      "id": "2026-09-03-cnh-upload-fix",
      "date": "2026-09-03",
      "product": "ChamaFácil",
      "area": "mobile",
      "title": {
        "en": "Driver license upload hard-fail fix",
        "pt": "Fix hard-fail no upload de CNH"
      },
      "summary": {
        "en": "New driver signups were dying on document upload; fixed API validation + mobile retry so onboarding completes in the field.",
        "pt": "Cadastro de motoboy morrendo no upload; validação na API + retry no mobile pra onboarding fechar em campo."
      },
      "tags": [
        "Flutter",
        "API",
        "Onboarding"
      ]
    },
    {
      "id": "2026-09-02-store-signup",
      "date": "2026-09-02",
      "product": "ChamaFácil",
      "area": "web",
      "title": {
        "en": "Store self-registration with Places coords",
        "pt": "Auto-cadastro de loja com coords Places"
      },
      "summary": {
        "en": "Lat/lng required via Google Places on both admin paths — no more stores without a pin for dispatch radius.",
        "pt": "Lat/lng obrigatório via Google Places nos dois caminhos do admin — loja sem pin não entra no raio."
      },
      "tags": [
        "Maps",
        "React",
        "UX"
      ]
    },
    {
      "id": "2026-09-01-motoboy-menu",
      "date": "2026-09-01",
      "product": "ChamaFácil",
      "area": "web",
      "title": {
        "en": "Responsive hamburger nav across panels",
        "pt": "Menu hamburger responsivo nos painéis"
      },
      "summary": {
        "en": "Admin + store TypeScript builds green; mobile operators finally get a usable nav instead of a crushed desktop menu.",
        "pt": "Builds admin + loja verdes; operadores no celular ganham nav usável em vez do menu desktop esmagado."
      },
      "tags": [
        "React",
        "UX",
        "TypeScript"
      ]
    },
    {
      "id": "2026-09-01-pix-settlement",
      "date": "2026-09-01",
      "product": "ChamaFácil",
      "area": "payments",
      "title": {
        "en": "Motoboy PIX settlement registration",
        "pt": "Cadastro de PIX pra acerto do motoboy"
      },
      "summary": {
        "en": "Production deploy: drivers save PIX keys; hubs settle without spreadsheet ping-pong.",
        "pt": "Deploy em produção: motoboys salvam PIX; centrais acertam sem planilha."
      },
      "tags": [
        "Payments",
        "API",
        "PWA"
      ]
    },
    {
      "id": "2026-08-28-discover-api",
      "date": "2026-08-28",
      "product": "Social",
      "area": "geo",
      "title": {
        "en": "Discover feed served by Postgres API",
        "pt": "Feed Discover servido pela API Postgres"
      },
      "summary": {
        "en": "Moved Discover off multi-hundred Firestore reads per open toward PostGIS-backed queries — same UX, order-of-magnitude less read cost.",
        "pt": "Discover sai de centenas de reads no Firestore por abertura pra queries PostGIS — mesmo UX, custo bem menor."
      },
      "tags": [
        "PostGIS",
        "API",
        "Cost",
        "Geolocation"
      ]
    },
    {
      "id": "2026-08-28-profile-boost",
      "date": "2026-08-28",
      "product": "Social",
      "area": "mobile",
      "title": {
        "en": "72h Discover boost for new profiles",
        "pt": "Boost de 72h no Discover pra perfis novos"
      },
      "summary": {
        "en": "New accounts no longer land invisible — temporary ranking boost so first-session density isn't zero.",
        "pt": "Conta nova não chega invisível — boost temporário de ranking pra densidade da 1ª sessão não ser zero."
      },
      "tags": [
        "Growth",
        "Flutter",
        "Ranking"
      ]
    },
    {
      "id": "2026-08-26-push-reengage",
      "date": "2026-08-26",
      "product": "Social",
      "area": "mobile",
      "title": {
        "en": "Mass re-engage push (1.2k cohort)",
        "pt": "Push de reengajamento em massa (coorte 1,2k)"
      },
      "summary": {
        "en": "First measured blast to the 8–90 day silent cohort with scripts for send + open attribution.",
        "pt": "Primeiro blast medido pra coorte silenciosa 8–90d com scripts de disparo + atribuição de abertura."
      },
      "tags": [
        "FCM",
        "Growth",
        "Analytics"
      ]
    },
    {
      "id": "2026-08-26-unique-nickname",
      "date": "2026-08-26",
      "product": "Social",
      "area": "backend",
      "title": {
        "en": "Globally unique nicknames via Postgres",
        "pt": "Nicknames únicos via Postgres"
      },
      "summary": {
        "en": "Claim/edit flow with unique index on the API — mirrored to Firestore for chat mentions without race conditions.",
        "pt": "Fluxo claim/edit com índice único na API — espelhado no Firestore pra menções sem corrida."
      },
      "tags": [
        "Postgres",
        "API",
        "Flutter"
      ]
    },
    {
      "id": "2026-08-26-sales-bot-reup",
      "date": "2026-08-26",
      "product": "Falcão Digital",
      "area": "ai",
      "title": {
        "en": "WhatsApp sales bot brought back online",
        "pt": "Bot de vendas no WhatsApp de volta"
      },
      "summary": {
        "en": "Re-wired Baileys + Claude on the VPS with cold-lead re-engagement rules that don't spam.",
        "pt": "Baileys + Claude religados na VPS com regras de reengajamento que não spamam lead frio."
      },
      "tags": [
        "WhatsApp",
        "Claude",
        "Sales"
      ]
    },
    {
      "id": "2026-08-21-codemagic-ios",
      "date": "2026-08-21",
      "product": "Social",
      "area": "infra",
      "title": {
        "en": "Codemagic iOS signing + one-shot release script",
        "pt": "Signing iOS no Codemagic + script one-shot"
      },
      "summary": {
        "en": "Code-signing group + tokenized release script so TestFlight bumps don't depend on a local Mac ceremony.",
        "pt": "Grupo de signing + script com token — bump de TestFlight sem cerimônia no Mac local."
      },
      "tags": [
        "iOS",
        "CI/CD",
        "Codemagic"
      ]
    },
    {
      "id": "2026-08-16-crash-triage",
      "date": "2026-08-16",
      "product": "Social",
      "area": "mobile",
      "title": {
        "en": "Crashlytics triage: FATAL noise killed",
        "pt": "Triagem Crashlytics: ruído FATAL eliminado"
      },
      "summary": {
        "en": "Framework errors were logged as FATAL — fixed classification so real crashes stop drowning in noise.",
        "pt": "Erros de framework iam como FATAL — classificação corrigida pra crash real não afogar no ruído."
      },
      "tags": [
        "Crashlytics",
        "Observability"
      ]
    },
    {
      "id": "2026-08-15-friend-search",
      "date": "2026-08-15",
      "product": "Social",
      "area": "backend",
      "title": {
        "en": "Friend search without full collection scan",
        "pt": "Busca de amigos sem scan da coleção"
      },
      "summary": {
        "en": "Stopped downloading ~4.7k user docs / 11MB per search — distance-capped list + path toward a dedicated search index.",
        "pt": "Pareceu de baixar ~4,7k docs / 11MB por busca — lista por distância + caminho pra índice dedicado."
      },
      "tags": [
        "Firestore",
        "Perf",
        "Cost"
      ]
    },
    {
      "id": "2026-08-10-poker-escrow",
      "date": "2026-08-10",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "Multiplayer escrow economy (coins on the table)",
        "pt": "Economia de escrow no multiplayer (moedas na mesa)"
      },
      "summary": {
        "en": "Match stakes locked in escrow and split by final chips — wallet integrity guards so a bad client can't wipe balances.",
        "pt": "Apostas em escrow e divisão pelas fichas finais — guards de wallet pra client malvado não zerar saldo."
      },
      "tags": [
        "Unity",
        "Wallet",
        "Cloud Functions"
      ]
    },
    {
      "id": "2026-08-06-ai-infra-docs",
      "date": "2026-08-06",
      "product": "Social",
      "area": "ai",
      "title": {
        "en": "AI infra cost scenarios documented",
        "pt": "Cenários de custo de infra de IA documentados"
      },
      "summary": {
        "en": "Provider choice, R-rated store constraints and cost models at scale — so features don't ship blind on burn rate.",
        "pt": "Escolha de provedor, limites das lojas e modelos de custo em escala — feature sem voar às cegas no burn."
      },
      "tags": [
        "AI",
        "Architecture",
        "Cost"
      ]
    },
    {
      "id": "2026-08-05-unity-bridge-park",
      "date": "2026-08-05",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "Unity bridge park + cold launch without game",
        "pt": "Park do bridge Unity + launch frio sem jogo"
      },
      "summary": {
        "en": "App can cold-start with the embedded game parked — resumeUnity brings the surface back without killing the Flutter process.",
        "pt": "App sobe com o jogo embarcado parkado — resumeUnity volta a superfície sem matar o processo Flutter."
      },
      "tags": [
        "Unity",
        "Flutter",
        "Native bridge"
      ]
    },
    {
      "id": "2026-08-03-share-og",
      "date": "2026-08-03",
      "product": "Social",
      "area": "mobile",
      "title": {
        "en": "Profile share deep links + OG preview",
        "pt": "Deep link de perfil + preview OG"
      },
      "summary": {
        "en": "Validated in production: share a profile, land in-app, correct Open Graph card — referral query edge still tracked.",
        "pt": "Validado em produção: compartilha perfil, abre no app, card OG certo — edge do referral ainda no radar."
      },
      "tags": [
        "Deep links",
        "OG",
        "Growth"
      ]
    },
    {
      "id": "2026-08-01-unity-verify",
      "date": "2026-08-01",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "Unity↔Flutter verification suite (66 checks)",
        "pt": "Suite de verificação Unity↔Flutter (66 checks)"
      },
      "summary": {
        "en": "Three-layer verify script in CI — bridge class, Data folder, arm64-only artifacts — 66 ok / 0 fail before store builds.",
        "pt": "Script de 3 camadas no CI — bridge, pasta Data, artefatos arm64 — 66 ok / 0 fail antes do build de loja."
      },
      "tags": [
        "CI/CD",
        "Unity",
        "QA"
      ]
    },
    {
      "id": "2026-07-29-chat-reactions",
      "date": "2026-07-29",
      "product": "Social",
      "area": "mobile",
      "title": {
        "en": "Chat reactions + live profile sync",
        "pt": "Reações no chat + sync live de perfil"
      },
      "summary": {
        "en": "Message reactions, friends status icons and profile updates that reflect immediately — liquid-glass UI polish on top.",
        "pt": "Reações, ícones de status de amigos e perfil que atualiza na hora — polish liquid-glass por cima."
      },
      "tags": [
        "Flutter",
        "Realtime",
        "UI"
      ]
    },
    {
      "id": "2026-07-28-hotfixes",
      "date": "2026-07-28",
      "product": "Social",
      "area": "mobile",
      "title": {
        "en": "Crash hotfixes → Play internal + TestFlight",
        "pt": "Hotfixes de crash → Play internal + TestFlight"
      },
      "summary": {
        "en": "Same-day Crashlytics hotfixes shipped to internal tracks while dSYMs uploaded so stacks stay symbolicated.",
        "pt": "Hotfixes no mesmo dia pras tracks internas com dSYM pra stack continuar simbolizada."
      },
      "tags": [
        "Crashlytics",
        "Release"
      ]
    },
    {
      "id": "2026-07-24-unity-rejoin",
      "date": "2026-07-24",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "Multiplayer auto-rejoin after background",
        "pt": "Rejoin automático após background"
      },
      "summary": {
        "en": "Android/iOS return from Unity to Flutter without killing the room — PlayerTtl / EmptyRoomTtl tuned, explicit rejoin path.",
        "pt": "Volta Unity → Flutter sem matar a sala — PlayerTtl / EmptyRoomTtl calibrados e caminho de rejoin explícito."
      },
      "tags": [
        "Photon",
        "Unity",
        "Mobile"
      ]
    },
    {
      "id": "2026-07-18-wallet-guard",
      "date": "2026-07-18",
      "product": "Social",
      "area": "payments",
      "title": {
        "en": "Wallet wipe guard (±40 chip ceiling)",
        "pt": "Guard anti-wipe de wallet (teto ±40 fichas)"
      },
      "summary": {
        "en": "Final-balance writes that could zero a wallet are clamped — validated on real BR↔BR matches after the deadlock rewrite.",
        "pt": "Writes de saldo final que zeravam wallet agora têm teto — validado em partidas BR↔BR depois do rewrite do deadlock."
      },
      "tags": [
        "Cloud Functions",
        "Integrity"
      ]
    },
    {
      "id": "2026-07-18-poker-flag",
      "date": "2026-07-18",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "Multiplayer feature flag → everyone",
        "pt": "Feature flag do multiplayer → todo mundo"
      },
      "summary": {
        "en": "Remote Config rolled out; mutual permission (both sides) required before an invite button shows in chat.",
        "pt": "Remote Config liberado; permissão mútua (dos dois lados) antes do botão de convite no chat."
      },
      "tags": [
        "Remote Config",
        "Product"
      ]
    },
    {
      "id": "2026-07-17-unit-tests-gate",
      "date": "2026-07-17",
      "product": "Social",
      "area": "infra",
      "title": {
        "en": "First unit-test CI gate on Android release",
        "pt": "Primeiro gate de unit test no release Android"
      },
      "summary": {
        "en": "aes_encrypter, chat-request decisions and purchase validation tests — release workflow fails closed if they regress.",
        "pt": "Testes de aes_encrypter, decisões de chat-request e purchase — release falha fechado se regredir."
      },
      "tags": [
        "TDD",
        "CI/CD",
        "Flutter"
      ]
    },
    {
      "id": "2026-07-15-reward-wheel",
      "date": "2026-07-15",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "Free reward wheel on empty-wallet invite",
        "pt": "Roleta grátis em convite sem moedas"
      },
      "summary": {
        "en": "Players with zero coins still get a path into a match; reward credit function whitelisted so it can't be spoofed.",
        "pt": "Jogador zerado ainda entra na partida; função de crédito com whitelist pra não ser spoofada."
      },
      "tags": [
        "Economy",
        "Cloud Functions"
      ]
    },
    {
      "id": "2026-07-15-moments-perf",
      "date": "2026-07-15",
      "product": "Social",
      "area": "mobile",
      "title": {
        "en": "Moments feed perf + optimistic post UX",
        "pt": "Perf do feed Moments + post otimista"
      },
      "summary": {
        "en": "Phase-1 performance work plus Instagram-style optimistic posting so the feed feels instant on mid devices.",
        "pt": "Fase 1 de perf + postagem otimista estilo Instagram — feed parece instantâneo em aparelho médio."
      },
      "tags": [
        "Flutter",
        "Perf",
        "UX"
      ]
    },
    {
      "id": "2026-07-12-arm64-only",
      "date": "2026-07-12",
      "product": "Social",
      "area": "infra",
      "title": {
        "en": "Android arm64-only build policy",
        "pt": "Política Android arm64-only"
      },
      "summary": {
        "en": "Formal decision + Gradle/CI/verify-artifact filters — smaller AAB, no 32-bit tax for ~10% of a dying base.",
        "pt": "Decisão formal + filtros Gradle/CI/verify — AAB menor, sem imposto 32-bit pra ~10% de base morrendo."
      },
      "tags": [
        "Android",
        "CI/CD"
      ]
    },
    {
      "id": "2026-07-10-match-tracking",
      "date": "2026-07-10",
      "product": "Social",
      "area": "games",
      "title": {
        "en": "Multiplayer session tracking in Firestore",
        "pt": "Tracking de sessões multiplayer no Firestore"
      },
      "summary": {
        "en": "started / completed / errored sessions queryable — so we finally know if the game is healthy beyond Crashlytics.",
        "pt": "Sessões started / completed / errored consultáveis — saúde do jogo além do Crashlytics."
      },
      "tags": [
        "Analytics",
        "Firestore"
      ]
    },
    {
      "id": "2026-07-01-checkout-falcao",
      "date": "2026-07-01",
      "product": "Falcão Digital",
      "area": "payments",
      "title": {
        "en": "Self-service hub checkout + PIX",
        "pt": "Checkout self-service de central + PIX"
      },
      "summary": {
        "en": "New delivery hubs pay PIX, get provisioned and land on the product CTA — no manual ops spreadsheet.",
        "pt": "Nova central paga PIX, é provisionada e cai no CTA — sem planilha manual de ops."
      },
      "tags": [
        "Mercado Pago",
        "Cloudflare"
      ]
    },
    {
      "id": "2026-06-24-lucas-bot",
      "date": "2026-06-24",
      "product": "Falcão Digital",
      "area": "ai",
      "title": {
        "en": "Always-on WhatsApp sales agent",
        "pt": "Agente de vendas 24/7 no WhatsApp"
      },
      "summary": {
        "en": "Baileys + Claude Haiku on a dedicated VPS — qualifies, demos, closes on the self-service checkout.",
        "pt": "Baileys + Claude Haiku em VPS — qualifica, demonstra e fecha no checkout self-service."
      },
      "tags": [
        "AI",
        "WhatsApp",
        "Sales"
      ]
    },
    {
      "id": "2026-06-15-geo-lifecycle",
      "date": "2026-06-15",
      "product": "ChamaFácil",
      "area": "geo",
      "title": {
        "en": "Multi-region geo + org lifecycle",
        "pt": "Geo multi-região + ciclo de vida da unidade"
      },
      "summary": {
        "en": "N cities per org, quick-call for stores, close/reopen/delete that preserves financial history.",
        "pt": "N cidades por org, chamada rápida na loja, fechar/reabrir/excluir preservando o financeiro."
      },
      "tags": [
        "Maps",
        "PostgreSQL",
        "React",
        "Geofence"
      ]
    },
    {
      "id": "2026-06-05-motoboy-pwa",
      "date": "2026-06-05",
      "product": "ChamaFácil",
      "area": "mobile",
      "title": {
        "en": "Motoboy iOS PWA (no App Store)",
        "pt": "PWA Motoboy no iOS (sem App Store)"
      },
      "summary": {
        "en": "Flutter Web PWA for iPhone drivers — same realtime dispatch as Android, installable from Safari.",
        "pt": "PWA Flutter Web pra motoboy no iPhone — mesmo despacho realtime do Android, instalável no Safari."
      },
      "tags": [
        "Flutter Web",
        "PWA",
        "iOS"
      ]
    },
    {
      "id": "2026-05-01-metroex",
      "date": "2026-05-01",
      "product": "MetroEx",
      "area": "mobile",
      "title": {
        "en": "Offline-first industrial metrology (ongoing)",
        "pt": "Metrologia industrial offline-first (contínuo)"
      },
      "summary": {
        "en": "Flutter ownership for ISO 17025 field work: local sync, offline calc, audit trail → Mixpanel, 99%+ crash-free.",
        "pt": "Dono da camada Flutter ISO 17025: sync local, cálculo offline, auditoria → Mixpanel, 99%+ crash-free."
      },
      "tags": [
        "Flutter",
        "Offline-First",
        "Azure DevOps"
      ]
    }
  ]
}
