Introduced new sections in core-config.yaml for managing sprints and workflows: - Defined locations for sprint documentation and current sprint file. - Added workflow management settings including current workflow file and templates. - Included AI agent context configuration for better context management. This enhancement supports improved organization and tracking of project workflows and sprints.
53 KiB
Archon V2 Beta - Brownfield Enhancement Architecture
Frontend Authentication System
Document Version: 1.0 Created: October 28, 2025 Author: Winston (Architect Agent) Enhancement: User Authentication System Project: Archon V2 Beta - Knowledge Management Platform
Change Log
| Change | Date | Version | Description | Author |
|---|---|---|---|---|
| Initial Architecture | 2025-10-28 | 1.0 | Brownfield authentication enhancement architecture | Winston (Architect) |
1. Introduction
Este documento define a arquitetura para adicionar Sistema de Autenticação de Usuários ao Archon V2 Beta, uma plataforma de gerenciamento de conhecimento com capacidades de IA. Esta melhoria transforma o Archon de um sistema local sem autenticação para uma aplicação multi-usuário segura, mantendo compatibilidade com o modelo de deployment local-first.
Relationship to Existing Architecture:
Este documento complementa a arquitetura atual do Archon (documentada em PRPs/ai_docs/ARCHITECTURE.md) definindo como os novos componentes de autenticação serão integrados. Em casos de conflito entre padrões novos e existentes, este documento fornece orientação para manter consistência durante a implementação.
1.1 Existing Project Analysis
Current Project State
Baseado na análise profunda do código-fonte, documentação e configurações:
- Primary Purpose: Plataforma de gerenciamento de conhecimento com RAG (Retrieval-Augmented Generation), crawling web, e integração MCP para IDEs de IA
- Current Tech Stack:
- Frontend: React 18.3, TypeScript 5.5, TanStack Query v5, Tailwind CSS, Vite 5.4
- Backend: Python 3.12, FastAPI 0.115, Supabase Client (PostgreSQL + pgvector)
- Infrastructure: Docker Compose (com suporte recente a Kubernetes via ArgoCD)
- AI/ML: PydanticAI, OpenAI Embeddings, FastMCP (Model Context Protocol)
- Architecture Style:
- Frontend: Vertical slice architecture com feature folders
- Backend: Service-oriented architecture com thin API routes
- Data Fetching: TanStack Query com smart polling (visibility-aware)
- Deployment Method:
- Primary: Docker Compose (3 serviços: archon-server:8181, archon-mcp:8051, archon-ui:3737)
- New: Kubernetes manifests em
k8s-argocd/para deployment via ArgoCD
Available Documentation
Documentos existentes consultados durante a análise:
CLAUDE.md- Beta development guidelines (fail-fast philosophy, error handling, code quality standards)code-review.md- Code review recente (MCP health endpoint, Kubernetes support)PRPs/ai_docs/ARCHITECTURE.md- Visão geral da arquitetura atual (componentes, módulos, API structure)PRPs/ai_docs/DATA_FETCHING_ARCHITECTURE.md- TanStack Query patterns, query key factories, smart pollingPRPs/ai_docs/QUERY_PATTERNS.md- Padrões de query hooks, stale times, optimistic updatesPRPs/ai_docs/ETAG_IMPLEMENTATION.md- ETag caching (~70% bandwidth reduction)PRPs/ai_docs/API_NAMING_CONVENTIONS.md- RESTful patterns, service methods, type namingdocs/prd/epic-1-frontend-authentication.md- Epic de autenticação com stories e acceptance criteriadocker-compose.yml- Service configuration e environment variables.env.example- Required environment variables (SUPABASE_URL, SUPABASE_SERVICE_KEY)
Identified Constraints
Limitações e requisitos críticos identificados na análise:
- Beta Development Constraint: Sistema segue princípio "fail fast and loud" - erros devem ser detalhados, não silenciosos
- Local-First Model: Deployment local deve permanecer funcional (auth deve ser opcional via feature flag)
- Backward Compatibility: Schema changes devem ser backward compatible (user_id nullable, service-key bypass)
- Zero Breaking Changes: APIs existentes não podem ser quebradas - apenas adicionar camada de auth
- Performance Budget: JWT validation deve adicionar <50ms de latency
- RLS Already Enabled: Row Level Security já habilitada no Supabase, precisa apenas de policies atualizadas
- CORS Configuration: Atualmente
allow_origins=["*"]- precisa ser ajustado com auth - Service Discovery: Sistema já suporta múltiplos ambientes (Docker Compose, Kubernetes) via
SERVICE_DISCOVERY_MODE - Kubernetes Readiness: Recentemente adicionado suporte K8s, health checks via HTTP
/healthendpoint
2. Enhancement Scope and Integration Strategy
2.1 Enhancement Overview
Enhancement Type: Additive Feature Layer (Non-Breaking)
Scope: Adicionar sistema de autenticação de usuários como camada opcional sobre a arquitetura existente. O sistema continua funcionando exatamente como está quando autenticação está desabilitada. Quando habilitada, adiciona:
- Frontend: Login/Signup UI + Auth context + Protected routes
- Backend: JWT validation middleware (opcional por endpoint)
- Database: Colunas
user_idnullable + RLS policies (opcionais quando service-key usado)
Integration Impact: Minimal (Low Risk)
- Código Existente: Zero modificações em funcionalidades atuais
- APIs Existentes: Mantidas 100% iguais, apenas adicionam suporte a header
Authorizationopcional - Database: Schema changes são aditivos (ADD COLUMN nullable), não modificam dados existentes
- Deployment: Feature flag
AUTH_ENABLEDcontrola ativação (default: false para compatibilidade)
2.2 Integration Approach
Code Integration Strategy
Pattern: Decorator/Wrapper Pattern (Non-Invasive)
Frontend:
// Sistema EXISTENTE permanece intocado
<App>
<Router>
<KnowledgePage /> {/* Funciona como sempre funcionou */}
</Router>
</App>
// Sistema COM AUTH adiciona wrapper opcional
<App>
<AuthProvider> {/* ← Nova camada OPCIONAL */}
<Router>
<ProtectedRoute> {/* ← Wrapper condicional */}
<KnowledgePage /> {/* Componente original INALTERADO */}
</ProtectedRoute>
</Router>
</AuthProvider>
</App>
Backend:
# Rota EXISTENTE permanece intocada
@app.get("/api/projects")
async def list_projects():
return project_service.list_projects()
# Rota COM AUTH adiciona decorator opcional
@app.get("/api/projects")
@optional_auth # ← Decorator NÃO quebra se auth desabilitado
async def list_projects(user_id: Optional[str] = None):
return project_service.list_projects(user_id)
Principle: Auth é uma camada interceptadora que pode ser ligada/desligada sem afetar código core.
Database Integration
Strategy: Additive Schema Changes (Backward Compatible)
Approach:
user_id UUIDcolumns são nullable (podem ser NULL para dados legacy)- RLS policies usam
auth.uid() IS NULL OR auth.uid() = user_id(permite acesso sem auth) - Service-key requests bypassam RLS completamente (comportamento atual mantido)
Migration Pattern:
-- Adiciona colunas SEM quebrar dados existentes
ALTER TABLE archon_projects ADD COLUMN user_id UUID;
-- Dados existentes ficam com user_id = NULL (válido)
-- RLS policies permitem acesso legacy
CREATE POLICY "users_own_projects" ON archon_projects
FOR ALL USING (
auth.uid() IS NULL -- ← Permite requests sem auth
OR auth.uid() = user_id -- ← Isola dados por user quando auth ativo
OR current_setting('request.jwt.claim.role', true) = 'service_role' -- ← Service-key bypass
);
API Integration
Strategy: Opt-in Authentication Headers
Current Behavior (Maintained):
# Request SEM auth (funciona como sempre funcionou)
GET /api/projects
# Response: todos os projects
New Behavior (When auth enabled):
# Request COM auth (adiciona header opcional)
GET /api/projects
Authorization: Bearer <jwt_token>
# Response: projects do user autenticado
# Request SEM auth (ainda funciona - fallback para comportamento legacy)
GET /api/projects
# Response: projects públicos ou erro 401 (configurável)
API Compatibility Matrix:
| Endpoint | Auth Disabled | Auth Enabled + Token | Auth Enabled + No Token |
|---|---|---|---|
/api/projects |
✅ All data | ✅ User data | ⚠️ Configurable (401 ou public data) |
/api/health |
✅ Public | ✅ Public | ✅ Public (sempre público) |
/mcp/* |
✅ Service-key | ✅ Service-key | ✅ Service-key (bypass auth) |
UI Integration
Strategy: Conditional Rendering (Feature Flag)
Existing UI Flow (Maintained when AUTH_ENABLED=false):
Browser → http://localhost:3737 → Dashboard (direto, sem login)
New UI Flow (When AUTH_ENABLED=true):
Browser → http://localhost:3737
↓
AuthProvider verifica sessão
├─ Sem sessão → Redirect /login
└─ Com sessão → Dashboard (como sempre)
2.3 Compatibility Requirements
Compatibility Guarantees:
| Requirement | Implementation | Status |
|---|---|---|
| Existing API contracts unchanged | Todos endpoints mantêm mesma signature | ✅ Garantido |
| Database schema backward compatible | user_id nullable, RLS com fallback |
✅ Garantido |
| UI/UX consistency | Novos componentes seguem design system existente | ✅ Garantido |
| Performance impact minimal | JWT validation <50ms, ETag caching mantido | ✅ Target definido |
| Local deployment mode functional | AUTH_ENABLED=false mantém comportamento atual |
✅ Garantido |
| Service-key access preserved | MCP/Agents bypassam auth, mantêm acesso total | ✅ Garantido |
| Zero breaking changes | Feature flag permite rollback instantâneo | ✅ Garantido |
3. Tech Stack
3.1 Existing Technology Stack
Todas as tecnologias abaixo serão mantidas e não modificadas. A feature de autenticação integra com o stack existente.
| Category | Current Technology | Version | Usage in Enhancement | Notes |
|---|---|---|---|---|
| Frontend Framework | React | 18.3.1 | Auth UI components, context providers | Mantido - componentes auth seguem padrões React existentes |
| Frontend Language | TypeScript | 5.5.3 | Type-safe auth interfaces e hooks | Mantido - auth types adicionados sem modificar tipos existentes |
| Frontend Build Tool | Vite | 5.4.2 | Build auth components com resto da aplicação | Mantido - sem mudanças em vite.config.ts |
| Frontend Styling | Tailwind CSS | 3.4.10 | Estilização de Login/Signup UI | Mantido - auth UI usa classes existentes do design system |
| State Management | TanStack Query | v5.56.2 | Auth state management (session, user queries) | Mantido - auth usa mesmo padrão de query keys |
| Frontend Router | React Router | 6.26.1 | Protected routes, auth redirects | Mantido - adiciona rotas /login e /signup |
| UI Components | Radix UI | Various | Auth form primitives (Input, Button, Dialog) | Mantido - auth reutiliza componentes existentes |
| Backend Framework | FastAPI | 0.115.0 | JWT validation middleware, auth endpoints | Mantido - adiciona middleware sem modificar app core |
| Backend Language | Python | 3.12+ | Auth service layer, JWT utilities | Mantido - auth segue padrões Python existentes |
| Database | Supabase (PostgreSQL) | Latest | User auth storage, RLS policies | Mantido - adiciona tabelas auth via Supabase Auth |
| Vector Database | pgvector | Latest | Não afetado pela feature auth | Mantido - embeddings continuam funcionando igual |
| AI/ML | PydanticAI | Latest | Não afetado pela feature auth | Mantido - agents continuam funcionando igual |
| MCP Server | FastMCP | 1.12.2 | Service-key bypass de auth | Mantido - MCP tools não precisam de JWT |
| Container Runtime | Docker | Latest | Auth services rodando em containers | Mantido - mesmo docker-compose.yml com env vars adicionais |
| Orchestration | Kubernetes | 1.28+ | Auth secrets via ConfigMaps/Secrets | Mantido - manifestos K8s adicionados em k8s-argocd/ |
| CD Tool | ArgoCD | Latest | Deploy auth feature via GitOps | Mantido - ArgoCD aplica manifestos K8s |
| Testing (Frontend) | Vitest | Latest | Auth component tests | Mantido - testes auth seguem mesmo padrão |
| Testing (Backend) | pytest | Latest | Auth middleware e RLS policy tests | Mantido - testes auth usam fixtures existentes |
| Linting (Frontend) | ESLint + Biome | Latest | Auth code linting | Mantido - auth code segue mesmas rules |
| Linting (Backend) | Ruff + MyPy | Latest | Auth code type checking | Mantido - auth code 100% type-safe |
3.2 New Technology Additions
Only 2 new dependencies will be added to implement authentication:
| Technology | Version | Purpose | Rationale | Integration Method |
|---|---|---|---|---|
| @supabase/supabase-js | ^2.45.4 | Supabase Auth SDK para frontend (login, signup, session management) | Supabase já é nosso database provider. Usar Supabase Auth evita adicionar Auth0, Firebase ou serviço third-party. Auth tables já existem no Supabase project. | npm install @supabase/supabase-js em archon-ui-main. Instanciar cliente auth em features/auth/services/authService.ts |
| python-jose[cryptography] | ^3.3.0 | JWT validation e decoding no backend Python | FastAPI não tem JWT built-in. python-jose é a biblioteca recomendada pela FastAPI docs para JWT RS256/HS256. Leve (<1MB), mature, bem mantida. |
uv add python-jose[cryptography] em python/. Usado em middleware/auth_middleware.py |
4. Data Models and Schema Changes
4.1 New Data Models
User Model (Managed by Supabase Auth)
Purpose: Armazena informações de autenticação de usuários
Integration: Supabase Auth cria automaticamente a tabela auth.users - não precisamos gerenciar
Key Attributes:
id: UUID - Primary key (gerado por Supabase)email: TEXT - Email único do usuárioencrypted_password: TEXT - Password hash (gerenciado por Supabase)email_confirmed_at: TIMESTAMP - Timestamp de confirmação de emailcreated_at: TIMESTAMP - Data de criação da contaupdated_at: TIMESTAMP - Última atualização
Relationships:
- With Existing:
user_idcolumns em tables existentes referenciarãoauth.users.id - With New: Nenhuma nova tabela além das fornecidas por Supabase Auth
4.2 Schema Integration Strategy
Database Changes Required:
New Columns Added to Existing Tables
-- archon_projects table
ALTER TABLE archon_projects
ADD COLUMN user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL;
-- archon_tasks table
ALTER TABLE archon_tasks
ADD COLUMN user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL;
-- archon_sources table (knowledge base sources)
ALTER TABLE archon_sources
ADD COLUMN user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL;
-- archon_crawled_pages table
ALTER TABLE archon_crawled_pages
ADD COLUMN user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL;
-- archon_code_examples table
ALTER TABLE archon_code_examples
ADD COLUMN user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL;
Key Design Decisions:
- ✅ Nullable columns: Permite dados existentes (user_id=NULL) sem migração complexa
- ✅ ON DELETE SET NULL: Se user deletado, dados ficam órfãos mas não são removidos
- ✅ Foreign key constraint: Garante integridade referencial quando user_id presente
New Indexes for Performance
-- Index para queries "meus projetos"
CREATE INDEX idx_projects_user_id ON archon_projects(user_id) WHERE user_id IS NOT NULL;
-- Index para queries "minhas tasks"
CREATE INDEX idx_tasks_user_id ON archon_tasks(user_id) WHERE user_id IS NOT NULL;
-- Index para queries "minhas sources"
CREATE INDEX idx_sources_user_id ON archon_sources(user_id) WHERE user_id IS NOT NULL;
Performance Impact: Queries com WHERE user_id = $1 serão otimizadas via index, <10ms overhead.
Updated RLS Policies
-- Projects table RLS
DROP POLICY IF EXISTS "Users can view all projects" ON archon_projects;
CREATE POLICY "users_own_projects" ON archon_projects
FOR ALL USING (
-- Permite acesso sem auth (backward compatibility)
auth.uid() IS NULL
-- Ou user é dono do projeto
OR auth.uid() = user_id
-- Ou é service_role key (MCP, agents)
OR current_setting('request.jwt.claim.role', true) = 'service_role'
);
-- Tasks table RLS
DROP POLICY IF EXISTS "Users can view all tasks" ON archon_tasks;
CREATE POLICY "users_own_tasks" ON archon_tasks
FOR ALL USING (
auth.uid() IS NULL
OR auth.uid() = user_id
OR current_setting('request.jwt.claim.role', true) = 'service_role'
);
-- Sources table RLS (similar pattern)
CREATE POLICY "users_own_sources" ON archon_sources
FOR ALL USING (
auth.uid() IS NULL
OR auth.uid() = user_id
OR current_setting('request.jwt.claim.role', true) = 'service_role'
);
Migration Strategy
Backward Compatibility Measures:
-
Existing Data Preservation:
- Todos dados existentes mantêm
user_id = NULL - RLS policies permitem acesso a dados com
user_id = NULLquandoauth.uid() IS NULL - Zero data loss ou corruption
- Todos dados existentes mantêm
-
Service-Key Access:
- Requests com
SUPABASE_SERVICE_KEYsetcurrent_setting('request.jwt.claim.role') = 'service_role' - RLS policies bypassam user_id check para service_role
- MCP server e agents mantêm acesso total
- Requests com
-
Rollback Plan:
-- Rollback migration (se necessário) ALTER TABLE archon_projects DROP COLUMN user_id; ALTER TABLE archon_tasks DROP COLUMN user_id; ALTER TABLE archon_sources DROP COLUMN user_id; -- Restaura RLS policies antigas
5. Component Architecture
5.1 New Components
Component: AuthProvider (Context Provider)
Responsibility: Gerencia estado de autenticação global da aplicação
Integration Points:
- Wraps
<App>component emApp.tsx - Fornece
AuthContextpara toda árvore de componentes - Integra com
@supabase/supabase-jspara session management
Key Interfaces:
interface AuthContextValue {
user: User | null;
session: Session | null;
loading: boolean;
signIn: (email: string, password: string) => Promise<void>;
signUp: (email: string, password: string) => Promise<void>;
signOut: () => Promise<void>;
isAuthenticated: boolean;
}
Dependencies:
- Existing Components: Nenhum (é root-level provider)
- New Components: AuthService (service layer)
Technology Stack: React Context API, @supabase/supabase-js, TanStack Query (para caching de user data)
Component: LoginPage
Responsibility: UI para usuário fazer login com email/password
Integration Points:
- Route
/loginem React Router - Redireciona para dashboard após login bem-sucedido
- Link para SignupPage
Key Interfaces:
interface LoginFormData {
email: string;
password: string;
}
Dependencies:
- Existing Components: Radix UI Input, Button, Card components
- New Components: useAuth() hook
Technology Stack: React, TypeScript, Radix UI, React Hook Form, Zod (validation)
Component: SignupPage
Responsibility: UI para usuário criar conta com email/password
Integration Points:
- Route
/signupem React Router - Form validation com Zod schema
- Redireciona para dashboard após signup
Key Interfaces:
interface SignupFormData {
email: string;
password: string;
confirmPassword: string;
}
Dependencies:
- Existing Components: Radix UI components
- New Components: useAuth() hook
Technology Stack: React, TypeScript, React Hook Form, Zod validation
Component: ProtectedRoute
Responsibility: Wrapper component que protege rotas requerendo autenticação
Integration Points:
- Wraps rotas protegidas em React Router
- Redireciona para /login se usuário não autenticado
- Permite acesso se
AUTH_ENABLED=false(backward compatibility)
Key Interfaces:
interface ProtectedRouteProps {
children: React.ReactNode;
fallback?: React.ReactNode;
}
Dependencies:
- Existing Components: React Router
Navigate - New Components: useAuth() hook
Technology Stack: React, React Router, TanStack Query
Component: AuthService (Service Layer)
Responsibility: Abstração sobre Supabase Auth client para operações de autenticação
Integration Points:
- Usado por AuthProvider e auth hooks
- Integra com apiClient.ts para injetar tokens
- Persiste session no localStorage (configurável)
Key Interfaces:
interface AuthService {
signIn(email: string, password: string): Promise<AuthResponse>;
signUp(email: string, password: string): Promise<AuthResponse>;
signOut(): Promise<void>;
getSession(): Promise<Session | null>;
refreshSession(): Promise<Session>;
onAuthStateChange(callback: (session: Session | null) => void): Unsubscribe;
}
Dependencies:
- Existing Components: apiClient.ts (para adicionar interceptor)
- New Components: @supabase/supabase-js client
Technology Stack: TypeScript, @supabase/supabase-js
5.2 Component Interaction Diagram
graph TB
App[App.tsx]
AuthProvider[AuthProvider Context]
Router[React Router]
LoginPage[LoginPage]
SignupPage[SignupPage]
ProtectedRoute[ProtectedRoute Wrapper]
Dashboard[Dashboard - Existing]
AuthService[AuthService]
SupabaseAuth[Supabase Auth]
ApiClient[apiClient.ts - Existing]
App --> AuthProvider
AuthProvider --> Router
Router --> LoginPage
Router --> SignupPage
Router --> ProtectedRoute
ProtectedRoute --> Dashboard
LoginPage --> AuthService
SignupPage --> AuthService
ProtectedRoute --> AuthProvider
AuthProvider --> AuthService
AuthService --> SupabaseAuth
AuthService --> ApiClient
style Dashboard fill:#90EE90
style ApiClient fill:#90EE90
style AuthProvider fill:#FFD700
style AuthService fill:#FFD700
style ProtectedRoute fill:#FFD700
Legend:
- 🟢 Green: Existing components (unchanged)
- 🟡 Yellow: New auth components
6. API Design and Integration
6.1 API Integration Strategy
API Integration Strategy: Opt-in JWT validation via middleware decorator
Authentication: Supabase JWT tokens (RS256) validated via public key
Versioning: No API versioning needed - auth is additive, não quebra existing contracts
6.2 New API Endpoints
Endpoint: POST /api/auth/session
Method: POST
Endpoint: /api/auth/session
Purpose: Valida JWT token e retorna user info (usado pelo frontend para verificar sessão)
Integration: Novo endpoint que não afeta rotas existentes
Request:
{
"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Response:
{
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"created_at": "2025-10-28T12:00:00Z"
},
"valid": true
}
Endpoint: POST /api/auth/refresh
Method: POST
Endpoint: /api/auth/refresh
Purpose: Refresh JWT token antes de expirar (handled by Supabase client, endpoint para debug)
Integration: Opcional - Supabase client faz refresh automático
Request:
{
"refresh_token": "v1.MR5S0vJBYue..."
}
Response:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "v1.NEW_REFRESH_TOKEN...",
"expires_in": 3600
}
6.3 Modified Existing Endpoints (Backward Compatible)
Todos endpoints existentes mantêm mesma signature mas adicionam suporte opcional a Authorization header.
Pattern Example:
# Before (existing behavior preserved)
@app.get("/api/projects")
async def list_projects():
# Returns all projects
return project_service.list_projects()
# After (auth-aware but backward compatible)
@app.get("/api/projects")
@optional_auth # Decorator injeta user_id se token presente
async def list_projects(user_id: Optional[str] = None):
# Returns user projects se user_id presente, senão all projects
return project_service.list_projects(user_id=user_id)
Affected Endpoints:
GET /api/projects- Filtra por user_id quando presentePOST /api/projects- Seta user_id automaticamente quando auth ativoGET /api/tasks- Filtra tasks por user_idGET /api/knowledge/sources- Filtra sources por user_idGET /api/progress/active- Filtra operações por user_id
Unchanged Endpoints (Always Public):
GET /api/health- Health check sempre públicoGET /api/docs- API documentation sempre públicaPOST /mcp/*- MCP tools usam service-key, não JWT
7. Source Tree
7.1 Existing Project Structure
archon-ui-main/src/
├── features/
│ ├── knowledge/ # Existing - Knowledge management
│ ├── projects/ # Existing - Project/task management
│ ├── mcp/ # Existing - MCP integration
│ ├── progress/ # Existing - Progress tracking
│ ├── shared/ # Existing - Shared utilities
│ └── ui/ # Existing - UI components
├── pages/ # Existing - Route pages
└── App.tsx # Existing - Main app entry
python/src/server/
├── api_routes/ # Existing - API endpoints
├── services/ # Existing - Business logic
├── middleware/ # Existing - CORS, logging
├── config/ # Existing - Configuration
└── utils/ # Existing - Utilities
7.2 New File Organization
archon-ui-main/src/
├── features/
│ ├── knowledge/ # Existing folder
│ ├── projects/ # Existing folder
│ ├── auth/ # ← NEW: Auth feature slice
│ │ ├── components/ # Login, Signup, ProtectedRoute
│ │ │ ├── LoginPage.tsx
│ │ │ ├── SignupPage.tsx
│ │ │ ├── ProtectedRoute.tsx
│ │ │ └── PasswordResetForm.tsx
│ │ ├── hooks/ # Auth-specific hooks
│ │ │ ├── useAuth.ts
│ │ │ ├── useSession.ts
│ │ │ └── useAuthQueries.ts # TanStack Query keys
│ │ ├── services/ # Auth service layer
│ │ │ ├── authService.ts # Supabase Auth wrapper
│ │ │ └── authApi.ts # Backend API calls
│ │ ├── context/ # Auth context provider
│ │ │ ├── AuthContext.tsx
│ │ │ └── AuthProvider.tsx
│ │ └── types/ # Auth TypeScript types
│ │ └── index.ts
│ ├── shared/ # Existing folder
│ │ ├── api/
│ │ │ └── apiClient.ts # MODIFIED: Add token interceptor
│ │ └── hooks/ # Existing hooks
│ └── ui/ # Existing folder
├── pages/
│ ├── KnowledgePage.tsx # Existing page
│ ├── ProjectsPage.tsx # Existing page
│ └── AuthPages.tsx # ← NEW: Auth routes (/login, /signup)
└── App.tsx # MODIFIED: Wrap with AuthProvider
python/src/server/
├── api_routes/
│ ├── knowledge_api.py # Existing file
│ ├── projects_api.py # Existing file
│ └── auth_api.py # ← NEW: Auth endpoints
├── services/
│ ├── knowledge/ # Existing folder
│ ├── projects/ # Existing folder
│ └── auth/ # ← NEW: Auth services
│ ├── jwt_service.py # JWT validation
│ ├── auth_service.py # Auth business logic
│ └── user_service.py # User data operations
├── middleware/
│ ├── cors.py # Existing file
│ ├── logging.py # Existing file
│ └── auth_middleware.py # ← NEW: JWT validation middleware
└── utils/
└── jwt_utils.py # ← NEW: JWT helper functions
k8s-argocd/ # Existing folder
├── base/ # Existing manifests
└── overlays/
└── production/
├── secrets.yaml # ← NEW: Auth secrets (JWT_SECRET)
└── configmap.yaml # MODIFIED: Add AUTH_ENABLED flag
7.3 Integration Guidelines
File Naming:
- Auth components:
{Purpose}Page.tsxou{Purpose}Form.tsx(segue padrão existente) - Auth services:
{domain}Service.ts(segue padrão service layer) - Auth middleware:
auth_middleware.py(segue snake_case Python)
Folder Organization:
- Auth feature em
features/auth/(vertical slice como outras features) - Auth services backend em
services/auth/(separado por domínio) - K8s manifests auth em
k8s-argocd/overlays/(environment-specific)
Import/Export Patterns:
// Frontend barrel exports (seguindo padrão existente)
// features/auth/index.ts
export { AuthProvider } from './context/AuthProvider';
export { useAuth } from './hooks/useAuth';
export { ProtectedRoute } from './components/ProtectedRoute';
export * from './types';
// Backend imports (seguindo padrão existente)
# python/src/server/services/auth/__init__.py
from .jwt_service import validate_jwt_token
from .auth_service import authenticate_user
from .user_service import get_user_by_id
__all__ = ['validate_jwt_token', 'authenticate_user', 'get_user_by_id']
8. Infrastructure and Kubernetes Deployment
8.1 Existing Infrastructure
Current Deployment: Docker Compose (local development e production local-first)
Infrastructure Tools:
- Docker 24.x
- Docker Compose 2.x
- Kubernetes 1.28+ (recentemente adicionado)
- ArgoCD Latest (GitOps para K8s)
Environments:
- Local Development (docker-compose.yml)
- Kubernetes Production (k8s-argocd/ manifests)
8.2 Enhancement Deployment Strategy
Deployment Approach: Gradual rollout com feature flag
Phases:
- Phase 1 - Development: Deploy com
AUTH_ENABLED=false(default, sem impacto) - Phase 2 - Testing: Habilitar auth em ambiente de test para validar integração
- Phase 3 - Production: Gradualmente habilitar auth via feature flag
Infrastructure Changes:
Docker Compose Changes
File: docker-compose.yml
services:
archon-server:
environment:
# Existing env vars (mantidos)
- SUPABASE_URL=${SUPABASE_URL}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY}
# NEW: Auth feature flag
- AUTH_ENABLED=${AUTH_ENABLED:-false} # Default false para backward compatibility
# NEW: JWT configuration
- JWT_SECRET=${JWT_SECRET} # For HS256 tokens (optional, Supabase usa RS256)
- JWT_ALGORITHM=${JWT_ALGORITHM:-RS256}
- SUPABASE_JWT_SECRET=${SUPABASE_JWT_SECRET} # Supabase project JWT secret
archon-ui:
environment:
# NEW: Frontend feature flag
- VITE_AUTH_ENABLED=${AUTH_ENABLED:-false}
# Existing vars (mantidos)
- VITE_API_URL=${VITE_API_URL:-http://localhost:8181}
Kubernetes Manifests (NEW)
File: k8s-argocd/base/auth-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: archon-auth-secrets
namespace: archon
type: Opaque
stringData:
jwt-secret: "" # Populated via Sealed Secrets ou External Secrets Operator
supabase-jwt-secret: "" # Supabase project JWT secret
File: k8s-argocd/overlays/production/configmap.yaml (MODIFIED)
apiVersion: v1
kind: ConfigMap
metadata:
name: archon-config
namespace: archon
data:
# Existing config (mantido)
SERVICE_DISCOVERY_MODE: "kubernetes"
API_SERVICE_URL: "http://archon-server.archon.svc:8181"
MCP_SERVICE_URL: "http://archon-mcp.archon.svc:8051"
# NEW: Auth configuration
AUTH_ENABLED: "true" # Production tem auth habilitado
JWT_ALGORITHM: "RS256"
File: k8s-argocd/base/deployment.yaml (MODIFIED)
apiVersion: apps/v1
kind: Deployment
metadata:
name: archon-server
spec:
template:
spec:
containers:
- name: archon-server
env:
# Existing env vars (mantidos)
- name: SUPABASE_URL
valueFrom:
secretKeyRef:
name: supabase-secret
key: url
# NEW: Auth env vars
- name: AUTH_ENABLED
valueFrom:
configMapKeyRef:
name: archon-config
key: AUTH_ENABLED
- name: SUPABASE_JWT_SECRET
valueFrom:
secretKeyRef:
name: archon-auth-secrets
key: supabase-jwt-secret
Pipeline Integration:
ArgoCD Application manifest permanece o mesmo. ArgoCD automaticamente detecta changes em k8s-argocd/ e aplica.
File: k8s-argocd/application.yaml (EXISTING - sem mudanças necessárias)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: archon
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-org/archon
targetRevision: main
path: k8s-argocd/overlays/production
destination:
server: https://kubernetes.default.svc
namespace: archon
syncPolicy:
automated:
prune: true
selfHeal: true
8.3 Rollback Strategy
Rollback Method:
-
Instant Rollback (sem deploy):
# Disable auth via ConfigMap (ArgoCD aplica em segundos) kubectl patch configmap archon-config -n archon -p '{"data":{"AUTH_ENABLED":"false"}}' # Restart pods para aplicar change kubectl rollout restart deployment/archon-server -n archon -
Git Rollback (via ArgoCD):
# Revert commit que habilitou auth git revert <commit-hash> git push origin main # ArgoCD automaticamente faz rollback
Risk Mitigation:
- Feature flag permite disable instantâneo sem rollback de código
- Database schema changes são backward compatible (user_id nullable)
- RLS policies permitem acesso sem auth (
auth.uid() IS NULL) - Service-key requests bypassam auth completamente
Monitoring:
# Prometheus metrics para monitorar auth
# File: k8s-argocd/base/servicemonitor.yaml (NEW)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: archon-auth-metrics
spec:
selector:
matchLabels:
app: archon-server
endpoints:
- port: metrics
path: /metrics
Metrics to track:
archon_auth_requests_total{status="success|failure"}- Auth attemptsarchon_jwt_validation_duration_seconds- JWT validation latencyarchon_auth_enabled- Feature flag state (0 ou 1)
9. Coding Standards
9.1 Existing Standards Compliance
Code Style:
- Frontend: ESLint + Biome (120 char lines, double quotes, trailing commas)
- Backend: Ruff + Black style (120 char lines, snake_case)
Linting Rules:
- Frontend: ESLint para legacy code, Biome para
/features(auth vai para features/auth, usa Biome) - Backend: Ruff check + Ruff format, MyPy para type checking
Testing Patterns:
- Frontend: Vitest + React Testing Library (auth tests em
features/auth/tests/) - Backend: pytest com async support (auth tests em
tests/server/auth/)
Documentation Style:
- Frontend: JSDoc para funções públicas, inline comments para lógica complexa
- Backend: Python docstrings (Google style), type hints obrigatórias
9.2 Enhancement-Specific Standards
Auth Code Security Standards:
-
Never log sensitive data: Passwords, tokens, secrets nunca devem aparecer em logs
# ❌ WRONG logger.info(f"User logged in with token: {token}") # ✅ CORRECT logger.info(f"User {user_id} logged in successfully") -
Always use HTTPS in production: JWT tokens devem ser transmitidos apenas via HTTPS
// Frontend apiClient deve verificar protocol em production if (import.meta.env.PROD && !window.location.protocol.startsWith('https')) { throw new Error('Auth requires HTTPS in production'); } -
Validate all inputs: Email, password devem ser validados antes de enviar ao backend
// Use Zod schemas para validation const loginSchema = z.object({ email: z.string().email('Invalid email format'), password: z.string().min(8, 'Password must be at least 8 characters') });
9.3 Critical Integration Rules
Existing API Compatibility:
- Todos endpoints devem manter mesma signature
Authorizationheader é opcional - backend deve funcionar sem ele- Nunca retornar erro se auth desabilitado via feature flag
Database Integration:
user_idcolumns devem ser nullable- Queries devem funcionar com
user_id = NULL(dados legacy) - Service-key requests devem bypassar RLS completamente
Error Handling:
- Seguir CLAUDE.md "fail fast and loud" philosophy
- JWT validation errors devem retornar 401 com mensagem clara
- Supabase Auth errors devem ser propagados ao frontend com contexto
Logging Consistency:
- Auth events devem usar mesmo logger que resto da aplicação
- Format:
[AUTH] {event} - user_id={id}, success={bool} - Exemplos:
logger.info(f"[AUTH] Login attempt - email={email}, success=True") logger.warning(f"[AUTH] Invalid token - user_id={user_id}, reason=expired") logger.error(f"[AUTH] JWT validation failed - error={str(e)}", exc_info=True)
10. Testing Strategy
10.1 Integration with Existing Tests
Existing Test Framework:
- Frontend: Vitest 1.6+ com React Testing Library
- Backend: pytest 8.x com pytest-asyncio
Test Organization:
- Frontend:
src/features/{feature}/tests/(co-located com código) - Backend:
tests/server/{module}/(espelhando src structure)
Coverage Requirements:
- Frontend: 80% coverage mínimo para features/auth/
- Backend: 90% coverage mínimo para services/auth/ e middleware/
10.2 New Testing Requirements
Unit Tests for New Components
Framework: Vitest + React Testing Library
Location: archon-ui-main/src/features/auth/tests/
Coverage Target: 85% minimum
Integration with Existing: Auth tests seguem mesmo padrão que tests existentes em features/projects/
Example Test Files:
features/auth/tests/
├── LoginPage.test.tsx # UI tests
├── SignupPage.test.tsx # Form validation tests
├── ProtectedRoute.test.tsx # Route protection tests
├── useAuth.test.ts # Hook tests
├── authService.test.ts # Service layer tests
└── AuthProvider.test.tsx # Context provider tests
Key Test Scenarios:
- ✅ Login com credenciais válidas
- ✅ Login com credenciais inválidas (401)
- ✅ Signup com dados válidos
- ✅ Signup com email duplicado (conflict)
- ✅ Protected route redireciona quando não autenticado
- ✅ Protected route permite acesso quando autenticado
- ✅ Token refresh automático antes de expirar
- ✅ Logout limpa session e redireciona
Backend Unit Tests
Framework: pytest + pytest-asyncio
Location: python/tests/server/auth/
Coverage Target: 90% minimum
Integration with Existing: Auth tests usam fixtures existentes para database e async client
Example Test Files:
tests/server/auth/
├── test_jwt_service.py # JWT validation tests
├── test_auth_middleware.py # Middleware integration tests
├── test_auth_api.py # API endpoint tests
└── test_user_service.py # User CRUD tests
Key Test Scenarios:
- ✅ JWT validation com token válido
- ✅ JWT validation com token expirado (401)
- ✅ JWT validation com token inválido (401)
- ✅ Middleware injeta user_id em request.state
- ✅ Middleware bypassa auth quando AUTH_ENABLED=false
- ✅ Service-key requests bypassam JWT validation
- ✅ RLS policies isolam dados por user_id
10.3 Integration Tests
Scope: End-to-end auth flow - Frontend → Backend → Database
Existing System Verification:
- ✅ Existing endpoints continuam funcionando sem auth header
- ✅ Existing data acessível quando user_id=NULL
- ✅ MCP server mantém acesso via service-key
New Feature Testing:
- ✅ User signup → email confirmation → login flow
- ✅ Protected route redirect → login → access granted
- ✅ Multi-user isolation (user A não vê dados de user B)
Test Environment:
# docker-compose.test.yml
services:
archon-server-test:
environment:
AUTH_ENABLED: "true"
SUPABASE_URL: "http://supabase-test:8000"
supabase-test:
image: supabase/supabase:latest
# Isolated test database
10.4 Regression Testing
Existing Feature Verification:
Run full test suite existente com AUTH_ENABLED=false e AUTH_ENABLED=true para garantir zero breaking changes.
Automated Regression Suite:
# Frontend regression
npm run test -- --coverage --run
npm run test:auth-disabled # Custom script com AUTH_ENABLED=false
npm run test:auth-enabled # Custom script com AUTH_ENABLED=true
# Backend regression
pytest tests/ --cov=src/server --cov-report=html
pytest tests/ --auth-disabled # Custom marker
pytest tests/ --auth-enabled # Custom marker
Manual Testing Requirements:
- ✅ Login flow completo (signup → login → dashboard)
- ✅ Protected routes funcionando
- ✅ Multi-user data isolation
- ✅ MCP server funcionando sem auth
- ✅ Existing features funcionando com auth disabled
- ✅ Rollback via feature flag funciona
11. Security Integration
11.1 Existing Security Measures
Authentication: Currently none - system operates local-only sem user accounts
Authorization: Supabase RLS enabled mas com policies públicas (FOR ALL USING (true))
Data Protection:
- HTTPS em production (assumido, não forçado)
- SUPABASE_SERVICE_KEY em environment variables (não hardcoded)
- Passwords: N/A (sem users atualmente)
Security Tools:
- Dependabot para dependency updates (GitHub)
- Ruff security rules (backend linting)
- ESLint security plugin (frontend linting)
11.2 Enhancement Security Requirements
Authentication Security
Password Requirements:
- Minimum 8 characters
- Must contain uppercase, lowercase, number, special char (enforced por Supabase Auth)
- Password hashing via bcrypt (gerenciado por Supabase)
JWT Token Security:
- Algorithm: RS256 (RSA with SHA-256) - Supabase default
- Expiration: 3600 seconds (1 hour) - auto-refresh antes de expirar
- Claims:
sub(user_id),email,role,exp(expiration) - Signature verification: Via Supabase public key (
https://<project>.supabase.co/.well-known/jwks.json)
Session Management:
- Storage: localStorage (default), configurable para sessionStorage
- Refresh token: Stored separately, rotated on refresh
- Session timeout: 7 days inactivity (Supabase default)
Authorization Security
Integration Points:
Backend middleware valida JWT e injeta user_id:
# middleware/auth_middleware.py
async def auth_middleware(request: Request, call_next):
token = request.headers.get("Authorization", "").replace("Bearer ", "")
if not token:
# No token - allow if AUTH_ENABLED=false
if not settings.AUTH_ENABLED:
return await call_next(request)
# Auth required but no token - check if endpoint is public
if is_public_endpoint(request.url.path):
return await call_next(request)
raise HTTPException(status_code=401, detail="Authentication required")
# Validate JWT
try:
payload = validate_jwt_token(token)
request.state.user_id = payload["sub"]
request.state.user_email = payload["email"]
except JWTExpiredError:
raise HTTPException(status_code=401, detail="Token expired")
except JWTInvalidError as e:
raise HTTPException(status_code=401, detail=f"Invalid token: {str(e)}")
return await call_next(request)
RLS Policy Security:
Supabase RLS garante data isolation no database level:
-- Exemplo: archon_projects table
CREATE POLICY "users_own_projects" ON archon_projects
FOR ALL USING (
-- Fallback para legacy data
auth.uid() IS NULL
-- User ownership
OR auth.uid() = user_id
-- Service-key bypass
OR current_setting('request.jwt.claim.role', true) = 'service_role'
);
Compliance Requirements:
- GDPR: User data deletion cascade (
ON DELETE CASCADEem foreign keys) - Data Export: API endpoint para user baixar todos seus dados
- Audit Log: Log de auth events (login, logout, token refresh)
11.3 Security Testing
Existing Security Tests: None specific to auth (não havia auth antes)
New Security Test Requirements:
# tests/server/auth/test_security.py
async def test_jwt_expired_rejected():
"""Tokens expirados devem retornar 401"""
expired_token = create_expired_jwt()
response = await client.get("/api/projects", headers={"Authorization": f"Bearer {expired_token}"})
assert response.status_code == 401
async def test_rls_isolates_user_data():
"""User A não deve ver dados de User B"""
user_a_token = await login("usera@example.com", "password")
user_b_token = await login("userb@example.com", "password")
# User A cria projeto
project = await create_project(user_a_token, {"title": "User A Project"})
# User B tenta acessar projeto de A
response = await client.get(f"/api/projects/{project.id}", headers={"Authorization": f"Bearer {user_b_token}"})
assert response.status_code == 404 # RLS policy bloqueia
async def test_service_key_bypasses_auth():
"""Service-key requests devem bypassar JWT validation"""
response = await client.get(
"/api/projects",
headers={"Authorization": f"Bearer {settings.SUPABASE_SERVICE_KEY}"}
)
assert response.status_code == 200
# Deve retornar TODOS os projects (sem filtro user_id)
Penetration Testing Requirements:
Manual testing scenarios:
- ✅ SQL Injection via email/password inputs
- ✅ XSS via user-generated content (project titles, task descriptions)
- ✅ CSRF attacks (mitigated por SameSite cookies se usarmos)
- ✅ Session fixation attacks
- ✅ Brute force login attempts (rate limiting needed?)
12. Next Steps
12.1 Story Manager Handoff
Prompt for Story Manager:
"Please develop detailed user stories for the Frontend Authentication System epic. Key considerations:
Integration Context:
- This is an enhancement to Archon V2 Beta (React 18/FastAPI/Supabase stack)
- Integration points verified:
- Frontend: apiClient.ts (token injection), App.tsx (AuthProvider wrapper)
- Backend: main.py (middleware registration), api_routes/ (decorator @optional_auth)
- Database: RLS policies with backward compatibility fallback
- K8s: ConfigMaps for AUTH_ENABLED flag, Secrets for JWT keys
Existing Patterns to Follow:
- Vertical slice architecture in
/features/auth/ - TanStack Query for auth state (session, user queries)
- Service layer pattern (authService.ts → auth_api.py → Supabase)
- Tron glassmorphism UI design system
- Testing with Vitest (frontend) and pytest (backend)
Critical Compatibility Requirements:
- Feature flag
AUTH_ENABLED=false(default) maintains current behavior - Nullable
user_idcolumns for backward compatibility - Service-key bypass for MCP server and agents
- Zero breaking changes to existing API contracts
- RLS policies with
auth.uid() IS NULLfallback
Each Story Must Include:
- Acceptance criteria validating existing functionality remains intact
- Test scenarios covering auth disabled and enabled states
- Integration verification with actual codebase files (not assumptions)
- Clear sequencing to minimize risk to existing system
First Story to Implement: Story 1 - Frontend Authentication Foundation (AuthContext, Supabase client, hooks)
The epic maintains system integrity while delivering secure multi-user authentication with user data isolation."
12.2 Developer Handoff
Prompt for Developers:
"Implementation guide for Frontend Authentication System enhancement.
Architecture Reference:
- This document (
docs/architecture.md) - Existing architecture:
PRPs/ai_docs/ARCHITECTURE.md - Coding standards analyzed from actual project files
- Beta philosophy: CLAUDE.md (fail fast and loud)
Integration Requirements:
✅ Do's:
- Use decorator/wrapper pattern - NEVER modify existing components directly
- Add
@optional_authto endpoints - maintain backward compatibility - Follow vertical slice in
features/auth/- reuse patterns from features/projects/ - Test with
AUTH_ENABLED=falsefirst - ensure no regressions - Use TanStack Query keys from
authKeysfactory - follow queryPatterns.ts
❌ Don'ts:
- Don't break existing APIs - only ADD auth support
- Don't modify database data - user_id nullable preserves legacy data
- Don't skip service-key bypass - MCP/agents need system-level access
- Don't log sensitive data (passwords, tokens)
- Don't hardcode secrets - use environment variables
Key Technical Decisions:
- JWT Validation: RS256 via python-jose + Supabase public key
- RLS Policies: Backward compatible with
auth.uid() IS NULL OR ... - Frontend State: TanStack Query context (not Redux/Zustand)
- K8s Secrets: ConfigMaps for feature flags, Secrets for JWT keys
Implementation Sequencing:
-
Backend First (Low Risk):
- Add
user_idcolumns (nullable) - Implement JWT middleware with feature flag check
- Update RLS policies with fallback
- Test with
AUTH_ENABLED=false- verify zero impact
- Add
-
Frontend Core:
- Install
@supabase/supabase-js - Create AuthProvider context
- Implement authService.ts
- Add token interceptor to apiClient.ts
- Install
-
Frontend UI:
- Build Login/Signup pages (Tron glassmorphism)
- Add ProtectedRoute wrapper
- Update App.tsx with conditional AuthProvider
-
Integration Testing:
- Test existing features with auth disabled
- Test new auth flow end-to-end
- Verify multi-user data isolation
- Confirm service-key bypass works
-
K8s Deployment:
- Add ConfigMap entries (AUTH_ENABLED)
- Create Secrets for JWT keys
- Update deployment with env vars
- Test ArgoCD sync
Verification Steps:
- All existing tests pass with AUTH_ENABLED=false
- All new auth tests pass with AUTH_ENABLED=true
- MCP server continues functioning (service-key access)
- Existing data accessible when user_id=NULL
- Rollback via feature flag works (< 30 seconds)
- JWT validation adds <50ms latency
- Code review passes (ruff, mypy, eslint, biome)
Contacts:
- Architecture Questions: Refer to this document
- Backend Integration:
python/src/server/api_routes/projects_api.py(reference pattern) - Frontend Patterns:
features/projects/hooks/useProjectQueries.ts(TanStack Query example) - K8s Deployment:
k8s-argocd/manifests + ArgoCD docs
Good luck! Remember: additive pattern, feature flag for safety, test with auth disabled first. 🏗️"
Appendix A: Reference Documentation
Key Files Referenced
Frontend:
archon-ui-main/src/App.tsx- Main application entryarchon-ui-main/src/features/shared/api/apiClient.ts- API client with ETag supportarchon-ui-main/src/features/shared/config/queryClient.ts- TanStack Query configurationarchon-ui-main/src/features/projects/hooks/useProjectQueries.ts- Query key factory example
Backend:
python/src/server/main.py- FastAPI application initializationpython/src/server/api_routes/projects_api.py- API endpoint pattern referencepython/src/server/services/project_service.py- Service layer pattern examplepython/src/server/config/service_discovery.py- Multi-environment service discovery
Infrastructure:
docker-compose.yml- Docker Compose service configuration.env.example- Required environment variablesk8s-argocd/- Kubernetes manifests (new)
Documentation:
CLAUDE.md- Beta development guidelinesPRPs/ai_docs/ARCHITECTURE.md- Current architecture overviewPRPs/ai_docs/DATA_FETCHING_ARCHITECTURE.md- TanStack Query patternsdocs/prd/epic-1-frontend-authentication.md- Authentication epic PRD
Appendix B: Decision Log
| Decision | Rationale | Date | Author |
|---|---|---|---|
| Use Supabase Auth over Auth0 | Already using Supabase for database, auth tables exist, zero new dependencies | 2025-10-28 | Winston |
| Nullable user_id columns | Backward compatibility - preserves existing data, allows gradual migration | 2025-10-28 | Winston |
| Feature flag AUTH_ENABLED | Enables instant rollback, maintains local-first deployment option | 2025-10-28 | Winston |
| Service-key bypass | MCP server and agents require system-level access without user context | 2025-10-28 | Winston |
| RS256 JWT algorithm | Supabase default, more secure than HS256 (public/private key pair) | 2025-10-28 | Winston |
| Decorator pattern for auth | Non-invasive, low risk, preserves existing code without modifications | 2025-10-28 | Winston |
| RLS policies with fallback | auth.uid() IS NULL OR ... allows access to legacy data and auth-disabled mode |
2025-10-28 | Winston |
| ArgoCD for K8s deployment | Already in use, GitOps workflow, automatic sync from k8s-argocd/ manifests | 2025-10-28 | Winston |
Document Status: ✅ Complete - Ready for Story Manager and Developer handoff
Last Updated: October 28, 2025 Next Review: After Story 1 implementation (Frontend Foundation)