Paste into Workspace Knowledge (Lovable Teams: Settings > Knowledge). Applies to every project. For spec workflow use LOVABLE_CUSTOM_KNOWLEDGE.md as Project Knowledge. When in doubt: ask; default to the safest interpretation. Full reference: AGENTS.md, constitution.md, docs/tools/lovable/LOVABLE_REFERENCE_APPENDIX.md, docs/tools/lovable/LOVABLE_PROMPTS.md.Documentation Index
Fetch the complete documentation index at: https://docs.encoreos.io/llms.txt
Use this file to discover all available pages before exploring further.
1. Context
Multi-tenant healthcare ERP (behavioral health, recovery housing). React 18 + TypeScript, Vite 8 (Rolldown bundler), Tailwind CSS v4 (CSS-first config), shadcn, TanStack Query, Supabase. Platform Foundation (PF) + domain cores (RH, FA, HR, GR, FW, FM, LO, IT, CE, CL, PM). Cores depend only on PF; no core-to-core imports. CL is downstream. Constitution wins on conflict.2. Decision order
- Security & compliance (tenant isolation, PHI, RLS) 2. Architecture boundaries 3. Performance 4. UX 5. Code quality.
3. Architecture (CRITICAL)
- Every feature: owning core (e.g. RH-01, FA-01). Cores depend ONLY on PF.
- Cross-core: Platform Integration Layer (
@/platform/{feature}), events, or API contracts only. No direct core imports. - Do not change auth flow, refactor code, or add deps without explicit instruction.
4. Non-negotiables (NEVER)
- Missing
organization_idon mutations → always.eq('organization_id', orgId). - Reading tenant ID from
user.app_metadata.organization_id→ always useuseOrganization()hook. - Direct core-to-core imports → use
@/platform/{feature}. - Raw
error.messageto users →sanitizeErrorMessage(error). return nullfor loading →<Skeleton />.- Direct route import for pages →
React.lazy(() => import('./Page')). - Hardcoded colors → semantic tokens only (
text-success,bg-destructive). - Schema outside migrations → all changes in
supabase/migrations/. - PHI/PII in prompts or logs → synthetic data only.
- Secrets in code → Lovable Cloud Secrets or env.
- Inline
pf_user_role_assignmentsin edge fns →verifyOrgAccess()/verifyOrgRole()from_shared/auth.ts. - Native dialogs →
Dialog/AlertDialog/toast. Old DataTable →@/platform/table-v2. Hard-coded codes → PF-70 library. Dynamic Supabase import → static at file top. - Modifying the
realtimeschema → strictly prohibited. Enforce RLS on source tables instead.
5. Patterns (use every time)
- Tenant:
.eq('organization_id', orgId)on mutations. - Internal cross-module links: wrap with
prefixPath(path)so the active organization context is preserved. - Form dialogs (Radix): use
key={entityId ?? "new"}to force a full remount; reset state viaonOpenChange. - Routes:
React.lazy+ Suspense. Loading:<Skeleton />. Queries:staleTime: 5*60*1000,gcTime: 10*60*1000. - Auth:
useCurrentUser()from@/platform/auth. Supabase: staticimport { supabase } from '@/integrations/supabase/client'. - Permissions:
useHasPermission('module.entity.action')or<PermissionGate>; never hardcode roles. - Dialogs:
sm:max-w-md/lg/2xl/3xl/4xlwithsm:prefix. Pages:<PageContainer>. - Tables:
DataTablefrom@/platform/table-v2. Overlays:*Dialogor*Sheet, never*Modal. - Migrations: CLI (
npx supabase); MCP for read/schema/types.ts only. Regenerate types.ts after migrations before writing hooks. - Tailwind v4: Use
@import 'tailwindcss'(not@tailwinddirectives). Token mapping:@theme inline { ... }. Dark mode:@custom-variant dark. Animations:tw-animate-css(nottailwindcss-animate). Gradients: preferbg-linear-*over legacybg-gradient-*.
6. DB & RLS
- All business tables:
organization_id(andsite_idwhere applicable).FORCE ROW LEVEL SECURITYon every table (defense-in-depth — applies even to table owners). UPDATE policies needWITH CHECK. Use SECURITY DEFINER helpers (e.g.pf_has_org_access()); every SECURITY DEFINER function mustSET search_path = public, pg_catalog. Migrations only.custom_fields JSONBon business/transaction tables. Soft delete: partial indexWHERE deleted_at IS NULL; queries.is('deleted_at', null). FK columns (includingcreated_by/updated_by) must be indexed.
7. Edge functions
Deno.serve(). Import Supabase vianpm:@supabase/supabase-js@2. No@/orsrc/imports; usesupabase/functions/_shared/. Auth:verifyOrgAccess()/verifyOrgRole()from_shared/auth.ts. UsegetCorsHeaders(),createNotificationIfNew(),createCronHandler()etc. from _shared.deno.json:"lock": false; do not commit deno.lock.
8. Security & UI
- Every mutation:
organization_idfilter. Errors:sanitizeErrorMessage(). Secrets: Lovable Cloud Secrets. AI: via edge functions only; no PHI to AI. - UI: semantic tokens only;
<Skeleton />for loading;<EmptyState />for empty;<PageContainer>; mobile-first 44px touch targets. - Formatting: user-facing dates and currency MUST use
@/platform/formattingutilities. Do not use rawtoLocaleString/toLocaleDateString. - Z-index tokens:
--z-base(0),--z-sticky(40),--z-dropdown(50),--z-overlay(80),--z-modal(100),--z-max(9999). Don’t hardcode arbitrary z values.
9. Lovable-specific
- Do not edit: client.ts, types.ts, config.toml, .env,
tailwind.config.lov.json(auto-generated). Secrets in Settings > Cloud > Secrets. - Supabase reverts: schema does not revert cleanly; after revert validate SQL. Pin version after each working feature; use Visual Edit for small UI tweaks (text, colors, spacing).
- Vite 8 (Rolldown): use inline type signatures for
PreRenderedAsset/PreRenderedChunk(not rollup imports); castsourcemapexplicitly. - Mode rules: Lovable’s Chat / Plan mode is strictly read-only — it cannot edit
.ts,.tsx,.sql, OR.mdfiles. Any prompt that asks for file edits (including doc fixes) MUST run in Default mode. If a prompt says “Chat Mode”, it means analysis only — never edits. - 4-chat workflow for spec implementation: §1 Pre (Chat/Plan, read-only) → §2 Plan+Execute (Default throughout) → §3a Verify+Status (Default) → §3b Browser E2E (Default + browser tools). See LOVABLE_PROMPTS.md.
- Scratchpad discipline: Only
.lovable/rules/is loaded as project context. Do NOT create.lovable/plan.mdor.lovable/scratch/*— both are gitignored. Pass state between chats via the handoff block at the end of each chat (paste it as the first message of the next chat).
10. Lovable platform features
- Run Lovable security checks before publish: RLS analysis, database security check, and dependency audit.
- Use browser testing for real user-flow verification. Trigger phrases: “verify it works”, “test this”, “check if it’s working”.
- Prefer Agent mode for larger end-to-end changes that require implementation plus verification.
- Use frontend tests (Vitest + React Testing Library) for UI rule stability.
- Use edge-function tests (Deno test runner) for backend/business-rule validation.
- Browser-testing limits: unreliable for canvas tools, uploads/downloads, right-click flows, and subtle color-detail verification.
11. Prompting techniques
- End complex prompts with: “Ask me any questions you need to fully understand this feature before writing code.”
- Build by component/workstream, not whole-page rewrites.
- Use real domain content; avoid placeholder text.
- Add explicit guardrails: “Do not edit X or Y; only change Z.”
- After 2-3 failed “Try to Fix” attempts, switch to Plan-mode investigation first.
- Avoid combining large implementation and browser verification in one prompt; build first, verify in follow-up.
12. Brand and copy rules
- Keep user-facing copy professional and clinically appropriate.
- Use sentence case for headings and action labels.
- Do not use placeholder text; use realistic behavioral-health context.
- Use US date presentation (Month Day, Year) unless feature requirements override.
- Use currency/date formatting helpers from
@/platform/formattingfor visible values.