App Reference Architecture — Molde Next.js + Tauri para Apps Novos
Skill de arquitetura de referência. Não resolve um domínio de negócio — resolve a espinha
dorsal técnica que todo app novo do autor precisa (auth dual, pagamento dual, push dual, build
Tauri, Docker, CI/CD) para que um app novo comece na estrutura já validada em produção, em vez de
reinventar essas decisões a cada projeto.
Governanca Global
Esta skill segue GLOBAL.md, policies/execution.md, policies/handoffs.md,
policies/quality-gates.md, policies/token-efficiency.md, policies/stack-flexibility.md,
policies/tool-safety.md e policies/evals.md.
Para exemplos de código completos e comparação linha a linha entre as variantes dos 3 apps de
origem, consultar docs/skill-guides/app-reference-architecture.md apenas quando necessário —
este SKILL.md cobre o suficiente para decisões e setup inicial.
Complementa e não substitui 03-backend-api, 15-mobile-tauri, 07-deploy-docker e
25-ai-integration-architect — esta skill decide a ARQUITETURA GERAL (quais peças existem, como
se encaixam); as skills de domínio implementam cada peça em profundidade.
Quando Usar
- iniciar um app novo que precisa de login web + app nativo Android a partir do mesmo código
- decidir como estruturar auth para servir web (cookie) e Tauri/APK (Bearer token) ao mesmo tempo
- integrar pagamento que precisa funcionar tanto na web (Stripe) quanto dentro de um APK
distribuído pela Play Store (Google Play Billing é obrigatório nesse caso)
- configurar push notification que funcione em PWA (Web Push) e Android nativo (FCM)
- resolver o problema de rodar Next.js App Router (Server Components, Server Actions, API routes)
dentro de um build estático do Tauri (
output: 'export')
- montar Dockerfile + GitHub Actions para publicar automaticamente um APK assinado na Play Store
- decidir se um app precisa de monorepo, worker assíncrono (BullMQ), ou sistema de créditos —
ou se a versão simples (single-app, sem worker, assinatura pura) já resolve
Quando Nao Usar
- app que é só web, sem plano de virar APK/app nativo (não precisa da complexidade de auth dual,
build Tauri, IAP) — nesse caso,
03-backend-api + 04-frontend-integration bastam
- app que é só mobile nativo (Swift/Kotlin puro, sem camada Next.js compartilhada) — Tauri não se
aplica, essa skill não ajuda
- decisão de UI/UX, copy de marketing, ou SEO da landing — use
02-ui-ux-design,
13-marketing-copy, 14-seo-specialist
- implementação detalhada de uma única peça já decidida (ex: só escrever o webhook do Stripe) —
use
03-backend-api direto, esta skill é para a decisão de arquitetura geral, não a
implementação linha a linha de cada endpoint
Entradas Esperadas
- que tipo de app está sendo criado (SaaS simples / conteúdo com IA leve / IA pesada com
processamento assíncrono) — determina qual variante de cada decisão usar (ver seção Variantes)
- se o app precisa de APK Android desde o início ou só mais adiante
- público-alvo (BR-only afeta decisão de Pix; internacional não precisa)
- se já existe alguma decisão herdada (ex: "já decidimos usar Supabase") que restringe as opções
Saidas Esperadas
- decisão registrada de cada peça (auth, ORM, pagamento, push, monorepo ou não, worker ou não)
com justificativa curta, não só a escolha
- estrutura de pastas inicial do projeto (route groups,
api/, actions/, lib/)
- arquivos de configuração base:
next.config.ts + next.config.tauri.mjs,
scripts/build-tauri.js, .env.example comentado, Dockerfile + Dockerfile.android,
workflow .github/workflows/android-release.yml
- handoff claro para as skills de implementação (backend, frontend, deploy) com a arquitetura já
decidida, para não retrabalhar decisão estrutural no meio da implementação
Responsabilidades
1. Levantar o tipo de app e mapear pra uma variante de referência
Antes de decidir qualquer peça isolada, classificar o app numa das 3 famílias (ver
docs/skill-guides/app-reference-architecture.md seção "Resumo — pontos de partida" para o
detalhe de cada uma):
- SaaS simples (dashboards, produtividade, finanças pessoais) → Prisma, JWT custom, single
app, Stripe+IAP, Web Push+FCM, sem worker, sem créditos — padrão gastos-app.
- Conteúdo/comunidade com IA leve (chat, personas, multi-persona de IA em texto) → considerar
Supabase Auth se OAuth pronto importa, Pix se público for BR, avaliar push tri-canal só se
precisar de tempo real — padrão memrapp.
- IA pesada (geração de imagem/vídeo, análise de arquivo, processamento >10s) → Prisma, worker
BullMQ obrigatório, sistema de créditos (custo variável real por uso), monorepo só se mobile e
web realmente divergirem em feature set — padrão VisaLab.
Se o usuário não souber, perguntar: "o app processa algo pesado por usuário (IA de imagem/vídeo,
arquivo grande) ou é majoritariamente CRUD/dashboard?" — essa resposta sozinha decide worker e
créditos, os dois itens de maior custo de implementação.
2. Auth dual (web + Tauri)
Decidir entre JWT custom (secret compartilhado com NextAuth) ou Supabase Auth com resolução em
cascata (Bearer token → cookie). Ver seção "1. Auth" em
docs/skill-guides/app-reference-architecture.md para o código de referência de cada variante,
CORS allowlist obrigatória para origens Tauri, e o middleware bypass seguro.
Regra não-negociável, independente da variante: uma única função central de auth chamada por
toda rota de API protegida — nunca duplicar a checagem de sessão rota a rota.
3. Build estático do Tauri sobre o App Router
Esta é a peça mais técnica e mais fácil de fazer errado. O padrão é sempre: script que faz
backup/swap de config e env, "apaga" temporariamente (renomeia, nunca deleta) tudo que não
sobrevive a output: 'export' (API routes, Server Actions, layouts com getServerSession()),
builda, e restaura tudo no finally — nunca manter dois códigos-fonte permanentemente
divergentes. Ver seção "2. Build Tauri" no guia detalhado para o script de referência completo.
Verificar SEMPRE, ao planejar uma feature nova: se ela usa Server Action, existe (ou vai existir)
uma rota de API irmã que o stub client-side do build Tauri pode chamar? Decidir isso no design da
feature, não depois que o build Tauri já quebrou.
Checkpoint: rodar o build Tauri de verdade (não só o build Next.js normal) antes de considerar a feature pronta — o script de swap pode ter deixado algo não-restaurado no finally de uma execução anterior interrompida. Se o build falhar, checar primeiro se o finally rodou na última execução (arquivos ainda renomeados) antes de investigar a feature nova.
4. Pagamento dual (Stripe + Google Play IAP [+ Pix])
Google Play Billing não é opcional se o app vende assinatura/conteúdo dentro de um APK publicado
na Play Store — é exigência de política da plataforma. Modelo de dados sempre unificado: uma
única tabela Subscription com campo platform/status cobrindo active/trialing/
grace_period/canceled/past_due/account_hold — nunca uma tabela por provider, nunca um
campo booleano solto isPremium. RTDN do Google Play é push-only sem garantia — sempre com cron
de reconciliação diário. Ver seção "3. Pagamentos" no guia para schema completo, webhook
idempotente, e quando vale sistema de créditos em vez de assinatura pura.
5. Push dual (Web Push + FCM)
Web Push (VAPID) para PWA/browser, FCM (Firebase Admin SDK, credencial JSON base64 numa env var)
para Android via Tauri. Função central que envia pros dois canais em paralelo, filtra por
segmento, limpa tokens inválidos automaticamente. ntfy self-hosted como terceiro canal é
avançado/opcional — só adicionar se o produto precisa de atualização em tempo real com o app em
foreground. Ver seção "4. Push" no guia.
6. Docker + CI/CD
Dockerfile multi-stage (deps/builder/runner) pro web, Dockerfile.android separado (Ubuntu +
Node + Java 17 + Rust + Android SDK/NDK) pro build do APK — sempre dentro de container, nunca
build local em produção. GitHub Actions dispara por tag, publica via
r0adkll/upload-google-play@v1. Deploy web via Coolify observando o Git, sem workflow de deploy
customizado. Ver seção "5. Docker/CI-CD" no guia para os Dockerfiles e workflow completos.
7. Registrar a decisão e entregar para implementação
Depois de decidida cada peça, produzir um resumo curto (não um documento longo) com: variante
escolhida por peça + 1 linha de justificativa, e entregar para 03-backend-api/
04-frontend-integration/07-deploy-docker implementarem. Esta skill não escreve a
implementação completa do zero — decide a arquitetura e aponta pros exemplos de referência.
Variantes — tabela de decisão rápida
| Peça |
Opção A |
Opção B |
Default recomendado |
| Auth |
JWT custom (secret compartilhado c/ NextAuth) |
Supabase Auth (cascata Bearer→cookie) |
A, salvo se já usa Supabase |
| ORM |
Prisma |
pg puro + migrations SQL |
Prisma |
| Estrutura |
Single Next.js app |
Monorepo pnpm workspaces |
Single-app, migrar só sob dor real |
| Pagamento |
Stripe + Google Play IAP |
+ Pix (Abacate Pay/Mercado Pago) |
A é o mínimo obrigatório; Pix só se público BR |
| Push |
Web Push + FCM |
+ ntfy self-hosted (tri-canal) |
A, tri-canal só se precisar tempo real |
| Cobrança |
Assinatura pura (free/premium) |
Sistema de créditos (ledger) |
A, créditos só se custo variável por uso for alto |
| Processamento |
Síncrono (rota de API normal) |
Worker separado (BullMQ + Redis) |
A, worker só se operação não cabe em request/response |
Detalhe completo de cada trade-off em docs/skill-guides/app-reference-architecture.md, seção
"Guia de Decisão".
Anti-Padroes
"Reimplementar a checagem de auth em cada rota"
Gera drift entre rotas (uma esquece de checar o Bearer, outra esquece o cookie). Sempre uma
função central (getAuthUserId/getAuthenticatedUser) chamada por toda rota protegida.
"Deletar em vez de renomear no script de build Tauri"
Se o script de build estático deleta arquivos (API routes, layouts) em vez de renomear pra
.bak, uma interrupção no meio do build (Ctrl+C, crash) deixa o código-fonte real quebrado
permanentemente. Sempre rename + restore no finally, nunca delete.
"Campo booleano solto pra saber se é pagante"
isPremium: boolean fica dessincronizado do status real da assinatura assim que existe
grace_period/trialing/account_hold. Sempre uma função central que resolve o plano a partir
do status + datas, lida toda vez, nunca um campo mutado em paralelo.
"Confiar 100% em webhook sem cron de reconciliação"
Todo webhook (Stripe, RTDN do Google Play) pode falhar silenciosamente em entregar um evento.
Todo sistema de pagamento precisa de um cron de reconciliação que confere o estado real via API
do provider e corrige divergência — sem isso, "paguei mas continuo free" é bug de produção
inevitável, não hipotético.
"Stub do build Tauri divergindo do código real sem aviso"
Quando um layout/página tem uma versão real (com getServerSession()) e uma versão stub (usada
só durante o build Tauri), mudar a lógica de uma sem atualizar a outra é bug garantido e
silencioso — só aparece testando o APK. Deixar comentário cruzado nos dois arquivos apontando um
pro outro.
"Adicionar worker/créditos/monorepo por precaução"
Essas três peças são a maior fonte de complexidade evitável. Só adicionar sob sinal concreto (ver
tabela de decisão) — "pode ser que precise no futuro" não é sinal concreto.
Evidencia de Conclusao
- variante de cada peça (auth, ORM, pagamento, push, estrutura, cobrança, processamento) decidida
e justificada, não deixada em aberto
- estrutura de pastas inicial criada seguindo o padrão de route groups
.env.example comentado variável por variável desde o commit inicial
- script de build Tauri com padrão backup/swap/restore implementado antes da primeira feature
- handoff registrado para as skills de implementação com a arquitetura já fechada
Handoff
Recebe de
- Orchestrator (skill 09): quando a task classificada é "app novo greenfield com mobile"
- Program Router (skill 39): via program
adversarial-dev ou composição ad-hoc quando o
usuário pede um app do zero com o pacote completo (login+pagamento+push+APK)
Entrega para
- Backend Developer (skill 03): implementa as rotas de API decididas (auth, pagamento,
push, cron) seguindo os exemplos de referência do guia
- Frontend Developer (skill 04): implementa hooks (
useTauriSafeSession), interceptor de
fetch, componentes de UI que respeitam isTauri()
- Mobile/Desktop Developer (skill 15): setup detalhado do Tauri em si (permissões, ícones,
plugins nativos) — esta skill decide QUE Tauri é usado e COMO se integra ao build; a 15
aprofunda a configuração Tauri isolada
- DevOps/Deployer (skill 07): Dockerfiles e workflow de CI/CD detalhados a partir da decisão
desta skill
- AI Integration Architect (skill 25): se a variante escolhida for "IA pesada", aprofunda o
pipeline de IA/worker além do que esta skill decide na arquitetura geral
Integracao com Pipeline
- Chamada no início de qualquer app novo greenfield que precisa da stack completa (web+APK+
pagamento+push) — antes de
01-po-feature-spec definir features específicas de domínio, essa
skill já deveria ter decidido a espinha dorsal técnica
- Não substitui
18-repo-auditor — se o app já existe e a dúvida é "como esse repo já estruturou
isso", use o Repo Auditor primeiro para mapear o estado real antes de aplicar esta skill
- Consome os mesmos princípios de
15-mobile-tauri (Tauri v2, build nativo) mas foca na
integração completa com auth/pagamento/push — a 15 é mais genérica (qualquer app Tauri, mesmo
sem esse pacote de monetização)
- Registra decisão para
10-documenter gerar o ADR correspondente se a decisão for não-óbvia
(ex: por que Supabase em vez de JWT custom neste app específico)
1---2name: app-reference-architecture3description: Molde arquitetural completo para apps novos que precisam de login, pagamento, push, landing page, web app e APK Android a partir do mesmo codigo-fonte (Next.js + Tauri v2), deploy via Docker/Coolify e build/publicacao de APK via GitHub Actions. Extraido por engenharia reversa de 3 apps reais em producao do autor (gastos-app, memrapp, VisaLab) para que todo app novo nasca na mesma estrutura testada, sem reinventar auth dual, build estatico Tauri, multi-pagamento (Stripe + Google Play IAP + Pix) ou push multi-canal a cada projeto. Trigger em: "novo app", "app do zero", "greenfield mobile", "Next.js + Tauri", "APK do zero", "arquitetura de referencia", "auth dual web e app", "gerar APK a partir do Next.js", "template de SaaS", "monetizar app mobile", "Google Play IAP", "assinatura Stripe e Play Store", "mesma estrutura dos outros apps", "boilerplate de app", "starter kit mobile+web".4---56# App Reference Architecture — Molde Next.js + Tauri para Apps Novos78Skill de arquitetura de referência. Não resolve um domínio de negócio — resolve a espinha9dorsal técnica que todo app novo do autor precisa (auth dual, pagamento dual, push dual, build10Tauri, Docker, CI/CD) para que um app novo comece na estrutura já validada em produção, em vez de11reinventar essas decisões a cada projeto.1213## Governanca Global1415Esta skill segue `GLOBAL.md`, `policies/execution.md`, `policies/handoffs.md`,16`policies/quality-gates.md`, `policies/token-efficiency.md`, `policies/stack-flexibility.md`,17`policies/tool-safety.md` e `policies/evals.md`.1819Para exemplos de código completos e comparação linha a linha entre as variantes dos 3 apps de20origem, consultar `docs/skill-guides/app-reference-architecture.md` apenas quando necessário —21este SKILL.md cobre o suficiente para decisões e setup inicial.2223Complementa e não substitui `03-backend-api`, `15-mobile-tauri`, `07-deploy-docker` e24`25-ai-integration-architect` — esta skill decide a ARQUITETURA GERAL (quais peças existem, como25se encaixam); as skills de domínio implementam cada peça em profundidade.2627## Quando Usar2829- iniciar um app novo que precisa de login web + app nativo Android a partir do mesmo código30- decidir como estruturar auth para servir web (cookie) e Tauri/APK (Bearer token) ao mesmo tempo31- integrar pagamento que precisa funcionar tanto na web (Stripe) quanto dentro de um APK32 distribuído pela Play Store (Google Play Billing é obrigatório nesse caso)33- configurar push notification que funcione em PWA (Web Push) e Android nativo (FCM)34- resolver o problema de rodar Next.js App Router (Server Components, Server Actions, API routes)35 dentro de um build estático do Tauri (`output: 'export'`)36- montar Dockerfile + GitHub Actions para publicar automaticamente um APK assinado na Play Store37- decidir se um app precisa de monorepo, worker assíncrono (BullMQ), ou sistema de créditos —38 ou se a versão simples (single-app, sem worker, assinatura pura) já resolve3940## Quando Nao Usar4142- app que é só web, sem plano de virar APK/app nativo (não precisa da complexidade de auth dual,43 build Tauri, IAP) — nesse caso, `03-backend-api` + `04-frontend-integration` bastam44- app que é só mobile nativo (Swift/Kotlin puro, sem camada Next.js compartilhada) — Tauri não se45 aplica, essa skill não ajuda46- decisão de UI/UX, copy de marketing, ou SEO da landing — use `02-ui-ux-design`,47 `13-marketing-copy`, `14-seo-specialist`48- implementação detalhada de uma única peça já decidida (ex: só escrever o webhook do Stripe) —49 use `03-backend-api` direto, esta skill é para a decisão de arquitetura geral, não a50 implementação linha a linha de cada endpoint5152## Entradas Esperadas5354- que tipo de app está sendo criado (SaaS simples / conteúdo com IA leve / IA pesada com55 processamento assíncrono) — determina qual variante de cada decisão usar (ver seção Variantes)56- se o app precisa de APK Android desde o início ou só mais adiante57- público-alvo (BR-only afeta decisão de Pix; internacional não precisa)58- se já existe alguma decisão herdada (ex: "já decidimos usar Supabase") que restringe as opções5960## Saidas Esperadas6162- decisão registrada de cada peça (auth, ORM, pagamento, push, monorepo ou não, worker ou não)63 com justificativa curta, não só a escolha64- estrutura de pastas inicial do projeto (route groups, `api/`, `actions/`, `lib/`)65- arquivos de configuração base: `next.config.ts` + `next.config.tauri.mjs`,66 `scripts/build-tauri.js`, `.env.example` comentado, `Dockerfile` + `Dockerfile.android`,67 workflow `.github/workflows/android-release.yml`68- handoff claro para as skills de implementação (backend, frontend, deploy) com a arquitetura já69 decidida, para não retrabalhar decisão estrutural no meio da implementação7071## Responsabilidades7273### 1. Levantar o tipo de app e mapear pra uma variante de referência7475Antes de decidir qualquer peça isolada, classificar o app numa das 3 famílias (ver76`docs/skill-guides/app-reference-architecture.md` seção "Resumo — pontos de partida" para o77detalhe de cada uma):7879- **SaaS simples** (dashboards, produtividade, finanças pessoais) → Prisma, JWT custom, single80 app, Stripe+IAP, Web Push+FCM, sem worker, sem créditos — padrão gastos-app.81- **Conteúdo/comunidade com IA leve** (chat, personas, multi-persona de IA em texto) → considerar82 Supabase Auth se OAuth pronto importa, Pix se público for BR, avaliar push tri-canal só se83 precisar de tempo real — padrão memrapp.84- **IA pesada** (geração de imagem/vídeo, análise de arquivo, processamento >10s) → Prisma, worker85 BullMQ obrigatório, sistema de créditos (custo variável real por uso), monorepo só se mobile e86 web realmente divergirem em feature set — padrão VisaLab.8788Se o usuário não souber, perguntar: "o app processa algo pesado por usuário (IA de imagem/vídeo,89arquivo grande) ou é majoritariamente CRUD/dashboard?" — essa resposta sozinha decide worker e90créditos, os dois itens de maior custo de implementação.9192### 2. Auth dual (web + Tauri)9394Decidir entre JWT custom (secret compartilhado com NextAuth) ou Supabase Auth com resolução em95cascata (Bearer token → cookie). Ver seção "1. Auth" em96`docs/skill-guides/app-reference-architecture.md` para o código de referência de cada variante,97CORS allowlist obrigatória para origens Tauri, e o middleware bypass seguro.9899Regra não-negociável, independente da variante: **uma única função central de auth chamada por100toda rota de API protegida** — nunca duplicar a checagem de sessão rota a rota.101102### 3. Build estático do Tauri sobre o App Router103104Esta é a peça mais técnica e mais fácil de fazer errado. O padrão é sempre: script que faz105backup/swap de config e env, "apaga" temporariamente (renomeia, nunca deleta) tudo que não106sobrevive a `output: 'export'` (API routes, Server Actions, layouts com `getServerSession()`),107builda, e restaura tudo no `finally` — nunca manter dois códigos-fonte permanentemente108divergentes. Ver seção "2. Build Tauri" no guia detalhado para o script de referência completo.109110Verificar SEMPRE, ao planejar uma feature nova: se ela usa Server Action, existe (ou vai existir)111uma rota de API irmã que o stub client-side do build Tauri pode chamar? Decidir isso no design da112feature, não depois que o build Tauri já quebrou.113114**Checkpoint:** rodar o build Tauri de verdade (não só o build Next.js normal) antes de considerar a feature pronta — o script de swap pode ter deixado algo não-restaurado no `finally` de uma execução anterior interrompida. Se o build falhar, checar primeiro se o `finally` rodou na última execução (arquivos ainda renomeados) antes de investigar a feature nova.115116### 4. Pagamento dual (Stripe + Google Play IAP [+ Pix])117118Google Play Billing não é opcional se o app vende assinatura/conteúdo dentro de um APK publicado119na Play Store — é exigência de política da plataforma. Modelo de dados sempre unificado: uma120única tabela `Subscription` com campo `platform`/`status` cobrindo `active`/`trialing`/121`grace_period`/`canceled`/`past_due`/`account_hold` — nunca uma tabela por provider, nunca um122campo booleano solto `isPremium`. RTDN do Google Play é push-only sem garantia — sempre com cron123de reconciliação diário. Ver seção "3. Pagamentos" no guia para schema completo, webhook124idempotente, e quando vale sistema de créditos em vez de assinatura pura.125126### 5. Push dual (Web Push + FCM)127128Web Push (VAPID) para PWA/browser, FCM (Firebase Admin SDK, credencial JSON base64 numa env var)129para Android via Tauri. Função central que envia pros dois canais em paralelo, filtra por130segmento, limpa tokens inválidos automaticamente. ntfy self-hosted como terceiro canal é131avançado/opcional — só adicionar se o produto precisa de atualização em tempo real com o app em132foreground. Ver seção "4. Push" no guia.133134### 6. Docker + CI/CD135136`Dockerfile` multi-stage (deps/builder/runner) pro web, `Dockerfile.android` separado (Ubuntu +137Node + Java 17 + Rust + Android SDK/NDK) pro build do APK — sempre dentro de container, nunca138build local em produção. GitHub Actions dispara por tag, publica via139`r0adkll/upload-google-play@v1`. Deploy web via Coolify observando o Git, sem workflow de deploy140customizado. Ver seção "5. Docker/CI-CD" no guia para os Dockerfiles e workflow completos.141142### 7. Registrar a decisão e entregar para implementação143144Depois de decidida cada peça, produzir um resumo curto (não um documento longo) com: variante145escolhida por peça + 1 linha de justificativa, e entregar para `03-backend-api`/146`04-frontend-integration`/`07-deploy-docker` implementarem. Esta skill não escreve a147implementação completa do zero — decide a arquitetura e aponta pros exemplos de referência.148149## Variantes — tabela de decisão rápida150151| Peça | Opção A | Opção B | Default recomendado |152|---|---|---|---|153| Auth | JWT custom (secret compartilhado c/ NextAuth) | Supabase Auth (cascata Bearer→cookie) | A, salvo se já usa Supabase |154| ORM | Prisma | `pg` puro + migrations SQL | Prisma |155| Estrutura | Single Next.js app | Monorepo pnpm workspaces | Single-app, migrar só sob dor real |156| Pagamento | Stripe + Google Play IAP | + Pix (Abacate Pay/Mercado Pago) | A é o mínimo obrigatório; Pix só se público BR |157| Push | Web Push + FCM | + ntfy self-hosted (tri-canal) | A, tri-canal só se precisar tempo real |158| Cobrança | Assinatura pura (free/premium) | Sistema de créditos (ledger) | A, créditos só se custo variável por uso for alto |159| Processamento | Síncrono (rota de API normal) | Worker separado (BullMQ + Redis) | A, worker só se operação não cabe em request/response |160161Detalhe completo de cada trade-off em `docs/skill-guides/app-reference-architecture.md`, seção162"Guia de Decisão".163164## Anti-Padroes165166### "Reimplementar a checagem de auth em cada rota"167Gera drift entre rotas (uma esquece de checar o Bearer, outra esquece o cookie). Sempre uma168função central (`getAuthUserId`/`getAuthenticatedUser`) chamada por toda rota protegida.169170### "Deletar em vez de renomear no script de build Tauri"171Se o script de build estático deleta arquivos (API routes, layouts) em vez de renomear pra172`.bak`, uma interrupção no meio do build (Ctrl+C, crash) deixa o código-fonte real quebrado173permanentemente. Sempre rename + restore no `finally`, nunca delete.174175### "Campo booleano solto pra saber se é pagante"176`isPremium: boolean` fica dessincronizado do `status` real da assinatura assim que existe177`grace_period`/`trialing`/`account_hold`. Sempre uma função central que resolve o plano a partir178do `status` + datas, lida toda vez, nunca um campo mutado em paralelo.179180### "Confiar 100% em webhook sem cron de reconciliação"181Todo webhook (Stripe, RTDN do Google Play) pode falhar silenciosamente em entregar um evento.182Todo sistema de pagamento precisa de um cron de reconciliação que confere o estado real via API183do provider e corrige divergência — sem isso, "paguei mas continuo free" é bug de produção184inevitável, não hipotético.185186### "Stub do build Tauri divergindo do código real sem aviso"187Quando um layout/página tem uma versão real (com `getServerSession()`) e uma versão stub (usada188só durante o build Tauri), mudar a lógica de uma sem atualizar a outra é bug garantido e189silencioso — só aparece testando o APK. Deixar comentário cruzado nos dois arquivos apontando um190pro outro.191192### "Adicionar worker/créditos/monorepo por precaução"193Essas três peças são a maior fonte de complexidade evitável. Só adicionar sob sinal concreto (ver194tabela de decisão) — "pode ser que precise no futuro" não é sinal concreto.195196## Evidencia de Conclusao197198- variante de cada peça (auth, ORM, pagamento, push, estrutura, cobrança, processamento) decidida199 e justificada, não deixada em aberto200- estrutura de pastas inicial criada seguindo o padrão de route groups201- `.env.example` comentado variável por variável desde o commit inicial202- script de build Tauri com padrão backup/swap/restore implementado antes da primeira feature203- handoff registrado para as skills de implementação com a arquitetura já fechada204205## Handoff206207### Recebe de208- **Orchestrator (skill 09)**: quando a task classificada é "app novo greenfield com mobile"209- **Program Router (skill 39)**: via program `adversarial-dev` ou composição ad-hoc quando o210 usuário pede um app do zero com o pacote completo (login+pagamento+push+APK)211212### Entrega para2131. **Backend Developer (skill 03)**: implementa as rotas de API decididas (auth, pagamento,214 push, cron) seguindo os exemplos de referência do guia2152. **Frontend Developer (skill 04)**: implementa hooks (`useTauriSafeSession`), interceptor de216 fetch, componentes de UI que respeitam `isTauri()`2173. **Mobile/Desktop Developer (skill 15)**: setup detalhado do Tauri em si (permissões, ícones,218 plugins nativos) — esta skill decide QUE Tauri é usado e COMO se integra ao build; a 15219 aprofunda a configuração Tauri isolada2204. **DevOps/Deployer (skill 07)**: Dockerfiles e workflow de CI/CD detalhados a partir da decisão221 desta skill2225. **AI Integration Architect (skill 25)**: se a variante escolhida for "IA pesada", aprofunda o223 pipeline de IA/worker além do que esta skill decide na arquitetura geral224225## Integracao com Pipeline226227- Chamada no início de qualquer app novo greenfield que precisa da stack completa (web+APK+228 pagamento+push) — antes de `01-po-feature-spec` definir features específicas de domínio, essa229 skill já deveria ter decidido a espinha dorsal técnica230- Não substitui `18-repo-auditor` — se o app já existe e a dúvida é "como esse repo já estruturou231 isso", use o Repo Auditor primeiro para mapear o estado real antes de aplicar esta skill232- Consome os mesmos princípios de `15-mobile-tauri` (Tauri v2, build nativo) mas foca na233 integração completa com auth/pagamento/push — a 15 é mais genérica (qualquer app Tauri, mesmo234 sem esse pacote de monetização)235- Registra decisão para `10-documenter` gerar o ADR correspondente se a decisão for não-óbvia236 (ex: por que Supabase em vez de JWT custom neste app específico)