jungle-studio-data-platform

/home/avalon/.hermes/skills/devops/jungle-studio-data-platform/SKILL.md · raw

Jungle Studio Data Platform

Overview

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.

When to Use

1. Shared-platform mental model

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.

2. Mariana Tek sync lessons

3. Data semantics that drive the product

4. Operational/app-integration lessons

5. Instructor mobile test-user pattern

See references/instructor-mobile-test-user.md for exact SQL and verification commands.

6. Jungle brand system (visual / styling work)

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

Common Pitfalls

  1. Deleting/deduplicating class sessions without preserving FK relationships
  2. Counting reservations with COUNT(*) when MT duplicates are common
  3. Treating non-reformer zero-spot results as a bug
  4. Forgetting that both apps share the same DB and expectations
  5. Assuming uploaded instructor files automatically show up in client payloads

Verification Checklist