diff --git a/docs/MCP+A2A/DOMAIN_PRODUCTS.md b/docs/MCP+A2A/DOMAIN_PRODUCTS.md index 0574bf6b..e17b13eb 100644 --- a/docs/MCP+A2A/DOMAIN_PRODUCTS.md +++ b/docs/MCP+A2A/DOMAIN_PRODUCTS.md @@ -1,80 +1,348 @@ # Domain — Product Repos (MCP + A2A Opportunities) -This document captures product-specific “where MCP/A2A helps” patterns, without duplicating each product’s full architecture docs. +This document captures **concrete, code-grounded** MCP/A2A touchpoints per product. +Each section lists what exists today (real files/APIs) and where MCP tools or A2A agents add leverage. -## Cross-product recurring needs +--- -- Debugging: telemetry clusters + remote diagnostics sessions -- Platform controls: kill switch, feature flags, maintenance -- Content intelligence: extraction tasks -- Release readiness: build/test/typecheck workflows +## Cross-product baseline (all 6 products) + +Every product already wires these platform-service capabilities: + +| Capability | Client module | Status | +| ------------------ | -------------------------------------------- | ------------------------------------ | +| Telemetry events | `@bytelyst/telemetry-client` | ✅ Live in all 6 | +| Feature flags | `/api/flags/poll` | ✅ Live in web/RN/iOS/Android | +| Kill switch | `@bytelyst/kill-switch-client` | ✅ Live in NomGap, LysnrAI, JarvisJr | +| Auth / JWT | `@bytelyst/auth-client` or platform wrappers | ✅ All products | +| Remote diagnostics | `@bytelyst/diagnostics-client` | ⬜ Not yet wired in product apps | +| Extraction service | `@bytelyst/extraction` | ✅ MindLyst + LysnrAI (partial) | + +**Biggest common gap:** `@bytelyst/diagnostics-client` is not initialised in any product app yet. Adding it is the cheapest per-product MCP win — enables SupportTriageAgent to start remote debug sessions from a single MCP tool call. + +--- ## ChronoMind (`learning_ai_clock`) -- **Opportunities** - - Telemetry-driven quality tracking for timer engine + NL parsing. - - A2A “routine regression” agent: detect changes that affect scheduling. -- **MCP hooks** - - telemetry tools for PWA - - platform-service jobs/webhooks for timer sharing integrations +### What exists today + +**`web/src/lib/`** (scanned): + +- `telemetry.ts` — `@bytelyst/telemetry-client`, productId `chronomind`, tracks timer events +- `feature-flags.ts` — polls `/api/flags/poll`, 5-min interval, flags: `routines_enabled`, `focus_mode_enabled`, `calendar_import_enabled`, `cloud_sync_enabled` +- `platform-sync.ts` — offline queue + conflict detection for timers + routines (batch sync DTOs with `syncVersion`) +- `nl-parser.ts` (13 KB) — full natural-language → timer parsing engine (local, no LLM) +- `adaptive-snooze.ts` — learns snooze patterns per-user +- `billing-client.ts`, `auth-api.ts`, `use-sync.ts` + +**Backend modules** (`backend/src/modules/`): +`timers/`, `routines/`, `shared-timers/`, `households/`, `webhooks/` + +### MCP tools + +``` +chronomind.timers.list(userId) +chronomind.timers.create(input) +chronomind.timers.delete(id) +chronomind.routines.list(userId) +chronomind.routines.validate(routineId) ← verify no step duration overflow +chronomind.sharedTimers.share(timerId, targets) +chronomind.households.listMembers(householdId) +chronomind.syncStatus(userId) ← returns offline queue depth + last sync +``` + +### A2A agents + +- **NLParserEvalAgent**: submits sample phrases to `nl-parser.ts` (or its extraction task equivalent), validates parsed timer fields, flags regressions after engine changes. +- **SyncConflictDiagnosticsAgent**: monitors `telemetry` for `sync_conflict` events → auto-starts a diagnostics session targeting the affected user; collects logs and generates a conflict report. +- **RoutineQualityAgent**: runs routine templates against the scheduler engine; flags routines that exceed household sleep time, overlap with calendar events, or have zero completion rates. +- **CalendarImportAgent**: automates `.ics` ingest + validation + conflict detection on import. + +### Highest-ROI first + +1. Add `@bytelyst/diagnostics-client` init to `web/src/app/layout.tsx` (unlocks SupportTriageAgent) +2. Create `nl-timer-parse` extraction task (moves NL parsing to server-side model, enables eval loop) +3. `chronomind.syncStatus` MCP tool (direct ops value for support) + +--- ## NomGap (`learning_ai_fastgap`) -- **Opportunities** - - React Native offline-first flows map well onto offline queue + platform-client. - - A2A “protocol tuning” agent: uses telemetry + extraction to correlate adherence patterns. -- **MCP hooks** - - telemetry + kill switch clients already exist; MCP can standardize their usage. +### What exists today + +**`src/api/`** (scanned): + +- `fasting-api.ts` — sessions CRUD, `getUserStats()`, `getWeeklyStats()` +- `push-api.ts` — 7 typed trigger functions: `fireStreakRisk`, `fireFastMilestone`, `fireStageTransition`, `fireSocialInvite`, `fireWeeklyDigest`, `fireAchievementUnlocked`, `fireRefeedingReminder` +- `social-api.ts`, `meal-api.ts`, `blob-api.ts`, `billing-api.ts` + +**`src/lib/`** (scanned): + +- `telemetry.ts` — `@bytelyst/telemetry-client`, MMKV-backed storage for `installId`, mobile/RN transport +- `kill-switch.ts` — `@bytelyst/kill-switch-client`, fail-open +- `feature-flags.ts` — delegated to `@bytelyst/feature-flag-client` + +**Backend modules**: `fasting-sessions/`, `fasting-protocols/`, `body-stages/`, `meal-log/`, `push-triggers/`, `social-fasting/` + +### MCP tools + +``` +nomgap.fasting.createSession(userId, protocolId) +nomgap.fasting.getSession(id) +nomgap.fasting.getUserStats(userId) ← streak, longestFast, completionRate +nomgap.fasting.getWeeklyStats(userId) +nomgap.push.fire(type, userId, variables?) ← wraps all 7 trigger types +nomgap.protocols.list() +nomgap.protocols.get(id) +nomgap.bodyStages.list() ← stage thresholds + descriptions +nomgap.social.listGroupFasts(userId) +``` + +### A2A agents + +- **EngagementAgent**: monitors `streak_risk` signals from telemetry → calls `nomgap.push.fire('streak_risk', userId)` proactively; escalates to `weekly_digest` if streak drops to zero. +- **SafetyMonitorAgent**: watches for fasts approaching 48 h threshold → fires `refeeding_reminder` at 24 h, 48 h (safety-critical). Can be A2A-chained from the `ExtendedFastDetectionAgent`. +- **SocialFastCoordinatorAgent**: when a user creates a group fast, A2A: notify all members (`fireSocialInvite`), schedule milestone push at each stage transition, send `weekly_digest` summary. +- **ProtocolTuningAgent**: uses telemetry completion-rate data + extraction to identify which protocol parameters correlate with abandonment; proposes protocol adjustments. + +### Highest-ROI first + +1. `nomgap.push.fire` MCP tool (directly replaces manual push management) +2. SafetyMonitorAgent (safety-critical, high product trust) +3. `@bytelyst/diagnostics-client` init in `App/_layout.tsx` (NomGap-specific: captures stage transition failures) + +--- ## PeakPulse (`learning_ai_peakpulse`) -- **Opportunities** - - Sync reliability: a diagnostics session targeted at a user’s device can capture network failures. - - A2A “safety alerts correctness” agent using telemetry to validate thresholds. -- **MCP hooks** - - platform-service telemetry/diagnostics - - product backend endpoints for session uploads (via sync engine) +### What exists today -## MindLyst (`learning_multimodal_memory_agents`) +**Backend modules** (scanned): -- **Opportunities** - - Extraction-service is core to triage and insight enrichment; prompt/task iteration loop is high ROI. - - A2A “triage regression” agent that runs eval suites. -- **MCP hooks** - - extraction tools - - telemetry for web + native apps +- `peak-sessions/` — `PeakSessionDoc`: activityType (`hiking`|`skiing`), GPS `TrackPointDoc[]` (lat/lon/alt/speed/accuracy), `HapticEventDoc[]`, `WeatherSnapshotDoc` (temp, wind, UV), `SkiMetricsDoc` (runCount, verticalDescent, liftTime), `locationName`, `barometerUsed`, `unitPreference` +- `peak-routes/` — route documents + +**iOS Platform/** (scanned): + +- `PlatformSyncManager.swift` — `BLSyncEngine` wrapper; uploads sessions, downloads, handles 401 token refresh +- `TelemetryService.swift` — `BLTelemetryClient` wrapper; tracks session events + milestones + errors +- `AuthService.swift`, `FeatureFlagService.swift`, `KillSwitchService.swift`, `KeychainHelper.swift` + +### MCP tools + +``` +peakpulse.sessions.list(userId, activityType?) +peakpulse.sessions.get(sessionId) +peakpulse.sessions.export(sessionId, format) ← GPX or JSON +peakpulse.routes.list(userId) +peakpulse.routes.get(routeId) +peakpulse.syncStatus(userId) ← upload queue depth + last sync +peakpulse.weather.getSnapshot(sessionId) ← WeatherSnapshotDoc for a session +``` + +### A2A agents + +- **RouteSafetyAssessmentAgent**: given a completed session's GPS track + `WeatherSnapshotDoc`, calls extraction service for risk assessment (elevation gain + UV + wind), produces a safety brief. +- **SyncDiagnosticsAgent**: when `sync_upload_failed` telemetry event is detected → starts a diagnostics session targeting that device; collects network traces during next sync attempt. +- **GoalCoachingAgent**: queries `GoalsEngine` data + session history; proposes next goal based on performance trends. +- **SkiRunAnalystAgent**: given `SkiMetricsDoc` (runCount, verticalDescent, liftTime, skiTime), identifies run quality trends across sessions; flags anomalies (e.g., sudden speed drop on a known run). + +### Highest-ROI first + +1. `peakpulse.sessions.export` MCP tool (most-requested feature: share route) +2. SyncDiagnosticsAgent (sync reliability is the top iOS support ticket type for GPS apps) +3. RouteSafetyAssessmentAgent (extraction service, no new infra required) + +--- ## JarvisJr (`learning_ai_jarvis_jr`) -- **Opportunities** - - Multi-agent product: A2A patterns can be applied to its own internal coaching “crew”. - - Marketplace + certification workflows can be agent-automated. -- **MCP hooks** - - platform-service for auth/telemetry - - product backend for marketplace modules +### What exists today (this product IS a multi-agent platform) + +**`web/src/lib/`** (scanned): + +- `agent-client.ts` — `listAgents`, `getAgent`, `createAgent`, `updateAgent`, `deleteAgent`, `duplicateAgent` +- `session-client.ts` — `SessionRecord` includes `transcript`, `summary`, `coachingNotes[]`, `exercises[]`, `skillMetrics: Record`, `getSessionStats()` +- `marketplace-client.ts` — full lifecycle: `browseCatalog`, `getListingDetail`, `installListing`, `uninstallListing`, `listInstalled`, `addReview`, `createListing`, `listMyListings`, `submitForReview` + +**Backend modules** (scanned): + +- `jarvis-agents/` — `AgentConfig` (systemPrompt, voiceId, coachingFramework, accentColor, difficultyLevel, privacyLevel, checkInSchedule) +- `jarvis-sessions/` — session with transcript + coaching artefacts +- `jarvis-memory/` — `JarvisMemoryDoc` with `type` (skill_note/preference/goal/context/exercise), `importance: 0–1`, `expiresAt` +- `jarvis-teams/` — enterprise team management +- `marketplace/` — `ListingDoc` (status: draft→pending→published→suspended, `isVerified`, cert statuses: pending/approved/rejected) + +**iOS Shared/Engine/** (5 files): +SessionEngine, PromptBuilder, ArtifactExtractor, MemoryManager, (+ 1 more) + +**iOS Shared/Voice/** (3 files): +VoiceSessionManager, AudioSessionHelper, VAD + +### MCP tools + +``` +jarvis.agents.list(userId) +jarvis.agents.create(config) +jarvis.agents.duplicate(agentId) +jarvis.sessions.list(userId, agentId?) +jarvis.sessions.getStats(userId) ← totalSessions, streak, perAgent +jarvis.memory.list(agentId, type?, minImportance?) +jarvis.memory.create(agentId, sessionId, type, content, importance) +jarvis.memory.prune(agentId, maxItems, minImportance) ← memory hygiene +jarvis.marketplace.listPending() ← admin: listings awaiting review +jarvis.marketplace.certify(listingId) +jarvis.marketplace.suspend(listingId, reason) +jarvis.marketplace.feature(listingId, featured) +jarvis.teams.listMembers(teamId) +``` + +### A2A agents + +This product's own coaching "crew" maps naturally to A2A: + +- **MarketplaceCertificationPipeline** (A2A workflow): + 1. `SubmissionIngestionAgent` — ingests listing draft, validates required fields (systemPrompt, coachingFramework, category, tags). + 2. `ContentSafetyAgent` — checks systemPrompt + description for policy violations via extraction. + 3. `QualityEvalAgent` — runs a sample session against the agent config, evaluates coherence. + 4. `CertificationDecisionAgent` — aggregates results, sets `isVerified`, notifies author. +- **MemoryCurationAgent**: periodically queries agent memories with `minImportance < 0.3`, decays or expires stale entries, promotes high-importance items. +- **ProgressAnalystAgent**: given `skillMetrics` across N sessions, identifies plateaus, recommends difficulty level changes or supplementary agents. +- **TeamProvisioningAgent**: when a new `jarvis-teams` member joins, A2A: recommends starter agents, seeds initial memories, schedules first check-in. + +### Highest-ROI first + +1. `MarketplaceCertificationPipeline` A2A workflow (core product need, no manual cert process exists today) +2. `jarvis.memory.prune` MCP tool (memory hygiene is critical at scale) +3. `ProgressAnalystAgent` (directly enhances coaching value prop) + +--- + +## MindLyst (`learning_multimodal_memory_agents`) + +### What exists today + +**`web/src/lib/`** (scanned): + +- `extraction-client.ts` — **three live task IDs**: `triage`, `memory-insight`, `reflection-enrichment` — backed by extraction-service +- `telemetry.ts` — `@bytelyst/telemetry-client`, web/beacon, productId `mindlyst` +- `feature-flags.ts`, `billing-client.ts`, `cosmos.ts` (direct Cosmos in web) + +**Backend modules** (scanned): + +- `memory/` — `MemoryItemDoc` with `TriageResult` (contentType, urgencyScore 0–1, emotionScore −1–+1, confidenceScore 0–1, suggestedBrainId, entities[], suggestedActions[]), sourceType (voice/image/link/email/text), captureSurface (app/widget/share_sheet/siri/email/web/notification_reply), blob media refs (audio + image) +- `brains/` — role-based "Brain" CRUD +- `reflections/` — reflection journal entries +- `daily-briefs/` — `DailyBriefDoc`: greeting, priorityItems[], brainSummaries (brainId → summary text), streakMessage, motivationalQuote +- `streaks/` — engagement streak tracking + +### MCP tools + +``` +mindlyst.memory.list(userId, brainId?, filter?) ← filter: forgotten | completed_today +mindlyst.memory.get(itemId) +mindlyst.memory.getTriageResult(itemId) ← TriageResult with all scores +mindlyst.memory.retriage(itemId) ← re-run extraction on stale triage +mindlyst.brains.list(userId) +mindlyst.briefs.generate(userId, date) ← trigger daily-brief generation +mindlyst.briefs.get(userId, date) +mindlyst.streaks.get(userId) +mindlyst.extractions.run(taskId, text) ← direct extraction (all 3 task IDs) +``` + +### A2A agents + +- **DailyBriefGenerationPipeline** (A2A workflow): + 1. `MemoryCollectorAgent` — queries recent memory items per brain, ranked by urgencyScore. + 2. `SummaryAgent` — calls `extraction.extract(text, 'memory-insight')` per brain. + 3. `BriefComposerAgent` — assembles DailyBriefDoc (greeting + priorityItems + brainSummaries). + 4. `DeliveryAgent` — stores brief + triggers push notification. +- **TriageQualityAgent**: queries memory items with `confidenceScore < 0.5`, re-runs extraction, proposes updated brain routing. +- **BrainOverflowAgent**: detects brains with >N items, no completions in T days → suggests archiving or reassignment. +- **ReflectionSynthesisAgent**: given recent reflections, runs `reflection-enrichment` extraction, surfaces themes and proposes weekly summary. + +### Highest-ROI first + +1. `DailyBriefGenerationPipeline` A2A workflow (the core "morning brief" product feature IS this pipeline) +2. `TriageQualityAgent` (confidenceScore is already persisted; agent needs only a query + retriage call) +3. `mindlyst.memory.retriage` MCP tool (single tool, high product impact) + +--- ## LysnrAI (`learning_voice_ai_agent`) -- **Opportunities** - - Support/debug workflows are already telemetry-heavy (keyboard + desktop). - - A2A “keyboard bug triage” agent that starts diagnostics sessions + drafts fixes. -- **MCP hooks** - - platform-service telemetry/diagnostics - - admin dashboard tooling +### What exists today -## Product-specific MCP server (optional) +**Backend modules** (scanned): -For each product, you can optionally add a small MCP namespace that calls the product backend (`backend/` in each repo) for domain actions. +- `transcripts/` — `TranscriptDoc`: rawText, cleanedText, wordCount, duration, tokensUsed, context, source, `extractions[]`, `extractionMetadata`, `extractedAt` ← extraction pipeline is **partially wired** (fields exist, not always populated) +- `sessions/` — dictation session lifecycle +- `organizations/` — team/org management +- `api-tokens/` — API token CRUD +- `themes/` — UI theme management +- `export/` — data export module +- `webhooks/` — webhook subscriptions -Examples: +**`src/audio/`** (scanned): -- ChronoMind: `timers.list/create`, `routines.run/validate` -- PeakPulse: `sessions.upload`, `routes.export` -- JarvisJr: `agents.list/publish`, `marketplace.certify` +- `stt_router.py` — connectivity-aware STT router: Azure Speech SDK (online) / local Whisper (offline) automatic fallback +- `azure_stt.py` — Azure Speech SDK integration -## Recommended first A2A workflows to ship per product +**`src/llm/`** (scanned): -- **All products**: Support Debug Pack (telemetry + diagnostics) -- **MindLyst**: Extraction task design + eval loop -- **JarvisJr**: Marketplace certification assistant -- **NomGap**: Offline queue flush assistant / sync reliability assistant +- `llm_factory.py` — cloud-agnostic factory: `create_llm_client()` returns `openai.OpenAI` or `openai.AzureOpenAI` depending on `LLM_PROVIDER` env var / endpoint URL auto-detection + +**`src/cloud/`**: `blob_client.py`, `telemetry.py`, `crash_reporter.py`, `api_sync.py`, `cosmos_client.py` + +### MCP tools + +``` +lysnrai.transcripts.list(userId, limit?, after?) +lysnrai.transcripts.get(id) +lysnrai.transcripts.runExtraction(id) ← populate extractions[] field +lysnrai.transcripts.exportBatch(userId, format) ← JSON / TXT via export module +lysnrai.sessions.stats(userId) +lysnrai.orgs.list() +lysnrai.orgs.get(orgId) +lysnrai.apiTokens.list(userId) +lysnrai.apiTokens.rotate(tokenId) +lysnrai.stt.getBackendStatus() ← online (Azure) vs offline (Whisper) +``` + +### A2A agents + +- **KeyboardDiagnosticsAgent**: monitors `error` telemetry events from iOS keyboard extension → auto-creates a targeted diagnostics session for that `anonymousInstallId`; collects logs until the error reproduces; drafts a bug report. +- **TranscriptExtractionPipelineAgent**: queries transcripts where `extractedAt IS NULL` → calls extraction service for each → updates `extractions[]` + `extractionMetadata` in batch. (Fills the existing schema fields that today often remain empty.) +- **STTFallbackMonitorAgent**: watches telemetry for `stt_provider=whisper` events (offline fallback) vs expected Azure events; if offline rate exceeds threshold → triggers a diagnostics session to capture network state. +- **OrgProvisioningAgent**: when a new org is created (webhook event) → A2A: create default API token, apply default theme, seed initial users. + +### Highest-ROI first + +1. `TranscriptExtractionPipelineAgent` (the extraction fields already exist in schema — just need the pipeline to run) +2. `KeyboardDiagnosticsAgent` (keyboard errors are the #1 LysnrAI support surface — very high ROI) +3. `lysnrai.stt.getBackendStatus` MCP tool (instant ops visibility, one endpoint to add) + +--- + +## Recommended first A2A workflows to ship (re-prioritised) + +| Priority | Product | Workflow | Why first | +| -------- | ---------- | ------------------------------------------------- | --------------------------------------------------------- | +| 1 | All | SupportTriageAgent + DiagnosticsOrchestratorAgent | Zero per-product code; needs only diagnostics-client init | +| 2 | MindLyst | DailyBriefGenerationPipeline | Core product feature; extraction already live | +| 3 | LysnrAI | TranscriptExtractionPipelineAgent | Schema ready; fills real user-facing gap | +| 4 | JarvisJr | MarketplaceCertificationPipeline | Blocks marketplace launch; no manual process exists | +| 5 | NomGap | SafetyMonitorAgent | Safety-critical; push trigger API ready | +| 6 | ChronoMind | SyncConflictDiagnosticsAgent | Sync conflicts are top ChronoMind support ticket | +| 7 | PeakPulse | RouteSafetyAssessmentAgent | Extraction + GPS data; new UX capability | + +## Product-specific MCP namespace summary + +| Product | Backend port | Key namespaces | +| ---------- | ------------ | ---------------------------------------------------------------------------------------------- | +| ChronoMind | 4011 | `chronomind.timers`, `chronomind.routines`, `chronomind.sharedTimers`, `chronomind.households` | +| NomGap | 4013 | `nomgap.fasting`, `nomgap.push`, `nomgap.protocols`, `nomgap.social` | +| PeakPulse | 4010 | `peakpulse.sessions`, `peakpulse.routes`, `peakpulse.weather` | +| JarvisJr | 4012 | `jarvis.agents`, `jarvis.sessions`, `jarvis.memory`, `jarvis.marketplace`, `jarvis.teams` | +| MindLyst | 4014 | `mindlyst.memory`, `mindlyst.brains`, `mindlyst.briefs`, `mindlyst.extractions` | +| LysnrAI | 4015 | `lysnrai.transcripts`, `lysnrai.sessions`, `lysnrai.orgs`, `lysnrai.apiTokens`, `lysnrai.stt` | diff --git a/docs/MCP+A2A/WORKSPACE_USE_CASE_CATALOG.md b/docs/MCP+A2A/WORKSPACE_USE_CASE_CATALOG.md index 8e4ae29f..5e92ac02 100644 --- a/docs/MCP+A2A/WORKSPACE_USE_CASE_CATALOG.md +++ b/docs/MCP+A2A/WORKSPACE_USE_CASE_CATALOG.md @@ -161,6 +161,34 @@ - **MCP tool** - `dev.generateTelemetryDataset(shape, size, seed)` +## Key findings from product code scan (2026-03-05) + +See [`DOMAIN_PRODUCTS.md`](./DOMAIN_PRODUCTS.md) for the full per-product breakdown. + +**Critical cross-product gap found:** + +- `@bytelyst/diagnostics-client` is **not initialised in any of the 6 product apps**. + - Adding it to each app's bootstrap is the cheapest MCP win: it immediately enables `SupportTriageAgent` to start remote debug sessions from a single tool call — no per-product code beyond a one-line init. + +**Extraction pipeline gaps found:** + +- **LysnrAI**: `TranscriptDoc.extractions[]` + `extractedAt` fields exist in schema but are **not reliably populated** — the extraction pipeline needs a backfill agent. +- **ChronoMind**: `nl-parser.ts` is a local 13 KB rule engine — good candidate for an extraction task (`nl-timer-parse`) to enable server-side model improvement + eval loop. + +**New P0 additions from scan:** + +### 11) LysnrAI transcript extraction backfill + +- **Why**: `TranscriptDoc` already has `extractions[]`, `extractionMetadata`, `extractedAt`. The fields are empty for most historical transcripts. +- **MCP tool**: `lysnrai.transcripts.runExtraction(transcriptId)` +- **A2A agent**: `TranscriptExtractionPipelineAgent` — batch queries `extractedAt IS NULL`, calls extraction-service, updates docs. + +### 12) Diagnostics-client bootstrap for all product apps + +- **Why**: Enables SupportTriageAgent for all 6 products with near-zero per-product work. +- **Action**: Add `DiagnosticsClient.getInstance({...}).start()` in each app's layout/main bootstrap. +- **Products**: ChronoMind (`web/src/app/layout.tsx`), NomGap (`src/app/_layout.tsx`), MindLyst (`mindlyst-native/web/src/app/layout.tsx`), JarvisJr (`web/src/app/layout.tsx`), LysnrAI (`user-dashboard-web/src/app/layout.tsx`), PeakPulse (iOS `PeakPulseApp.swift`). + ## Cross-product patterns that MCP/A2A should standardize - **Telemetry**