Properties
title: Engineering Ops aliases: [Build & Deploy, Tech Debt] tags: [3netra/wiki, devops, build, tech-debt] product: 3netra Meta Android App source_repository: 3Netra-ai/3n_meta_android source_ref: origin/prod source_revision: b48aada8fd5427b5db0c02945569963c4ae543c8 last_verified: 2026-08-06 up: "[[Home]]"
Engineering Ops
Build & Run (native app)
cd src/frontend # needs: JDK 17 (Android Studio bundled JBR), unset ANDROID_PREFS_ROOT # env: GITHUB_ACTOR + GITHUB_TOKEN (Meta SDK Maven) # local.properties: sdk.dir, SUPABASE_URL, SUPABASE_ANON_KEY, # SARVAM_API_KEY, GOOGLE_WEB_CLIENT_ID, AWS_BACKEND_URL ./gradlew installDebug # physical device required (BLE + Meta SDK)
app/build.gradlealso defines client BuildConfig fields for an OpenAI key and Meta credentials. Do not put server secrets in this app; source contains committed fallback Meta values that need rotation/removal.- Unit tests:
./gradlew testDebugUnitTest· Instrumented command:./gradlew connectedDebugAndroidTest. At the audited ref there are only two weak JVM tests; no instrumented tests were found. - CI:
.github/workflows/android-build.ymlruns only on pushes toprod, writes secrets tolocal.properties, builds a debug APK, and uploads it. It does not run tests or lint. - Deploy runbook:
skills/prod-local-deploy— 8-phase diagnose/build/install/verify against device VortexJK68 (prod branch)
Backend Deploys
- AWS SAM:
src/backend/has a Lambda prototype, but active Android callers use the Supabase Edge Function. Its workflow triggers only frommain(notprod) and supplies only Supabase parameters even though the template requires an OpenAI parameter; deployment is not verified. - Supabase: local dev config identifies project
3nApp-Mobile; no migrations or seed are committed, andschema_pathsis empty. Version schema and policies before treating it as deployable. - Legacy: Firebase Functions (
npm run deployinfunctions/), Vercel (api/)
Documentation reliability at the audited revision
README.mdcontains unresolved merge-conflict markers and retains K–6 positioning.docs/BUILD_AND_DEPLOY.mddescribes the obsolete Expo/rootandroid/route and a stale configuration key; it is not a runnable guide for the maintainedsrc/frontendapp.docs/TESTING.mddescribes PR test/lint behavior that.github/workflows/android-build.ymldoes not implement.- Treat active build files, source, the two test files, and workflow YAML as implementation evidence; treat the remaining docs and PRD as historical/roadmap material until reconciled.
Version History (CHANGELOG)
| Date | Change |
|---|---|
| 2026-07-01–2026-08-03 | Historical CHANGELOG/documentation entries; not independently verified as end-to-end delivery |
| 2026-08-05 | Audited merge PR #11 cleanup (b48aada8…); source still contains the fixed AI-response defect and stale documentation |
Known Quirks & Tech Debt (verified in code)
- Critical:
SupabaseAiServiceinvokeschat-visionbut replaces the returned message with a fixed success string. Scene, chat, and lecture-summary flows cannot supply a verified model answer. dashboardroute orphaned —glassesConfig/chatHistoryunreachable in normal flowStudentOnboardingWizard(voice calibration, emergency contact, battery saver) built but not wired into navigationSettingsScreen.ktlives inui/but declares packageui.student- "Classroom" is a valid scene mode but missing from the mode-chip list; falls through to generic scene prompt
SceneDescriptionScreen.gradeLevelnever passed → always "3rd Grade" (pitch 1.1)- ClassmatesScreen shows hardcoded "92% confidence"; KDoc describes AWS Rekognition/3-photo flow that differs from implementation
- AssistantChatScreen: camera-capture launchers wired but no camera button rendered
- My Story + Chat share one
chatHistoryStateFlow; story timestamps approximated at render - SOS: no trigger wired; GPS + recent-summaries are TODO stubs; emergency contact not persisted
- Wake-word service removed;
WHAT_DO_I_SEE/CLASSROOM_MODEbroadcasts have no broadcaster - Meta SDK fallback credentials are committed in
src/frontend/app/build.gradle— rotate + remove defaults; no values are reproduced here - Ollama endpoint hardcoded to LAN IP
192.168.0.179(dev-only service) OPENAI_API_KEYBuildConfig is defined but unused client-side; ML Kit dependency unused- No Supabase migrations/seed committed; RLS policies not in repo
- Two Android codebases (native vs Expo/RN shell); RN tree unbuildable (missing JS sources)
- Teacher PIN is local-only — needs backend role for real multi-device teacher access
See the severity-ranked register in 12-Risks-Decisions.
Security Notes
- Never log/commit API keys;
local.propertiesis gitignored (but Meta tokens in strings.xml are committed — flag) - Active face flow uses Supabase cloud embeddings; the encrypted 90-day utility is unreferenced.
- Active AI traffic uses the Supabase Edge Function, not the Lambda. Keep provider credentials server-side and rotate/remove committed or app-compiled secrets.
Repo Agent Tooling
skills/synced to.claude/.gemini/.codex/.openrouterviasync_skills.sh- Installed skill:
supabase(best practices); project skills:prod-local-deploy,threenetra-vlm-providers(how to add VLM providers),sync-agent-skills - Agent pointers:
AGENTS.md,CLAUDE.md,GEMINI.md
Key People & Sources
- Dev log: Mayukh (Supabase migration, schema design, Phase 5)
- Org docs: PRD v1.0 (Feb 2026,
.agent_docs/Assets/),docs/16-file suite, JIRA AI-chat story (13 pts) — see 13-Source-Map-Glossary
Tip
Navigation ⬅️ 09-Design-System · 🏠 Home · ➡️ 11-Security-Privacy-Compliance
