Use this for the whole Jungle Studio data platform: Mariana Tek ingestion, shared Postgres behavior, dashboard/mobile API semantics, and the data-quality quirks that shape product logic. The maintainable unit is the platform, not separate micro-skills for one report or one admin screen bug.
Two apps share one Postgres database: - jungle dashboard - jungle mobile
Any schema or dedup change must be validated against both apps. Data fixes that look safe for one surface can silently break the other.
/api/ auth/proxy mistakes can make whole dashboards appear empty000/502 while tsx server.ts is booting; wait a few seconds and retry before treating it as a failed deployUse this skill for Jungle physical-product work too: admin product creation, mobile/storefront catalog, Stripe one-time checkout, orders, shipping labels, tracking, and fulfillment state. See references/physical-commerce-product-fulfillment.md for the current file map and durable architecture pattern.
Key rule: Jungle DB owns catalog, order, fulfillment, and tracking state; Stripe owns payment state only. For shippable physical products, Stripe payment success should create a paid order plus an unfulfilled/ready-to-ship fulfillment record โ do not mark physical fulfillment complete just because the PaymentIntent succeeded.
When changing products or checkout, remember dashboard and mobile share the DB but implement product/catalog/Stripe paths in separate files; update both surfaces and any dev duplicate API (vite-plugin-api.ts) when relevant.
See references/instructor-mobile-test-user.md for exact SQL and verification commands.
For ANY Jungle UI restyling, brand alignment, mobile-app theming, or new partner-facing UIs, the canonical brand source is Exxir/jungle-website (Railway service jungle-website in exxir's Projects โ Exxir App), NOT the mobile or dashboard apps. See references/jungle-brand-system.md for: color tokens, the three-family type system (Termina / Magnat Head / Queens), spacing/radii/shadows, the signature arch shape, component patterns observed on the live site, the Tailwind 4 @theme porting strategy, and the token-only vs per-screen-redesign decision split. Use the railway-cli skill to discover the right service and pull the source.
When Alex asks for a test instructor user for the mobile app, create/update both layers in the shared Postgres DB:
- employees: active row with roles = ARRAY['Instructor']::text[]; the mobile instructor APIs require active = true AND 'Instructor' = ANY(roles)
- app_users: row linked by employee_id, with role = 'instructor', status = 'active', and a stable email/auth subject
- Current instructor mobile view is route/API driven, not password-auth driven: /instructor/:id calls GET /api/instructors/:id/mobile, which sets the Zustand role via setInstructorUser(...)
- Verify with local and public GET /api/instructors/ID/mobile, GET /api/employees/instructors, and the SPA route https://jungle-mobile.apps.poofc.com/instructor/ID
- If the test instructor needs useful schedule cards, also assign future rows in class_session_instructors; an instructor with no assignments will still load but shows zero upcoming classes
COUNT(*) when MT duplicates are common