feat: Oracle CRM Page, Synthetic Client Data and Live Snapshot when hitting emotion hotpoint

This commit is contained in:
Sagnik
2026-04-19 00:43:01 +05:30
parent f616a33ab0
commit 4b21c2cad6
197 changed files with 105054 additions and 89 deletions

View File

@@ -0,0 +1,240 @@
# Project Velocity — Agent Execution Log
## Founder CRM and Platform Delivery Pack
**Agent:** Claude Sonnet 4.6 (Thinking)
**Session Start:** 2026-04-18T20:19:11+05:30
**Scope:** Full Sprint 1 delivery pack implementation — production readiness
**Log Format:** Chronological, monolithic truth artifact
---
## Phase 0: Research and Assessment
### 0.1 — Document Audit Complete ✅
All 16 documents in the Founder CRM and Platform Delivery Pack were analyzed.
### 0.2 — Agent Work Assessment (Doc 16) ✅
**Winner:** Kimi 2.5 Thinking — 26 CSV files vs Claude's 19. Kimi has inventory, vehicle events, CCTV links, perception events, whatsapp threads, workflow actions as standalone CSVs.
**Strategy:** Kimi = canonical output. Supplement with Claude's deeper interaction volume data where useful.
### 0.3 — Repo Gap Analysis ✅
- Backend: `leads` + `chat_logs` tables exist (non-canonical). `crm_*`, `intel_*`, `inventory_*`, `workflow_*` = MISSING
- Frontend: CRM module = MISSING from App.tsx. `ModuleId` type does not include `'crm'`
- Oracle.tsx = stub (104 bytes)
---
## Phase 1: Synthetic Data Integration
### Task 1.1 — Copy Kimi canonical dataset to `db assets/synthetic_crm_v1/` ✅
**Done:** 26 CSV files + 8 JSON files from Kimi 2.5 Thinking copied as canonical synthetic dataset
### Task 1.2 — Supplement with Claude JSON artifacts ✅
**Done:** Claude Sonnet 4.6 JSON files (client360_snapshots.json, perception_cctv_events.json) copied to `claude_supplement/`
---
## Phase 2: Canonical Schema
### Task 2.1 — `backend/db/schema_crm_canonical.sql` ✅
**Done:** 460-line canonical schema with:
- crm_people, crm_accounts, crm_households, crm_relationships, crm_leads, crm_opportunities, crm_property_interests, crm_stage_history
- intel_interactions, intel_messages, intel_whatsapp_threads, intel_calls, intel_transcripts, intel_emails, intel_visits, intel_reminders, intel_qd_scores, intel_qd_timeseries, intel_vehicle_events, intel_perception_events, intel_cctv_links
- inventory_projects, inventory_units, inventory_import_jobs
- workflow_actions, workflow_approvals, workflow_writebacks, workflow_import_batches, workflow_agent_runs
- All ENUM types, indexes, auto-updated_at triggers, and 14 canonical Kolkata projects seeded
---
## Phase 3: Backend Services and Routes
### Task 3.1 — `backend/services/imports/__init__.py` ✅
### Task 3.2 — `backend/services/imports/ingest_service.py` ✅
**Done:** Column mapping heuristics (40+ column name variants → canonical fields), CSV parser, NormalizedEntityProposal builder, DB persist functions
### Task 3.3 — `backend/services/client_graph/__init__.py` ✅
### Task 3.4 — `backend/services/client_graph/aggregation_service.py` ✅
**Done:** get_client_360() aggregates identity + lead + opportunities + interactions + property_interests + tasks + QD scores + risk_flags + recommended_next_actions. get_contact_list() paginated query with lateral joins.
### Task 3.5 — `backend/api/routes_crm_imports.py` ✅
**Done:** 10 canonical API routes:
- POST/GET `/api/crm/imports` — batch upload and list
- GET `/api/crm/imports/{id}` — batch detail with proposals
- PUT `/api/crm/imports/{id}/review-proposal` — human approval/rejection
- POST `/api/crm/imports/{id}/commit` — commit approved to canonical
- GET/POST `/api/crm/contacts` — canonical contact list and create
- GET `/api/crm/contacts/{id}` — contact detail
- GET `/api/crm/client-360/{id}` — Client 360 snapshot
- GET `/api/crm/opportunities` — deal pipeline
- GET/POST `/api/crm/tasks` — reminder inbox
- GET `/api/crm/kanban` — canonical kanban from crm_leads
- GET `/api/crm/qd/{id}` — QD score + timeseries
### Task 3.6 — Register in `backend/main.py` ✅
**Done:** `crm_imports_router` registered at `/api` prefix
---
## Phase 4: Frontend CRM Module
### Task 4.1 — `app/src/types/index.ts` — `ModuleId` adds `'crm'` ✅
### Task 4.2 — `app/src/types/crmTypes.ts` — 25+ canonical types ✅
**Done:** CrmContactListItem, CrmPerson, CrmLead, CrmOpportunityCard, InteractionTimelineItem, CrmTask, PropertyInterest, QdScoreEntry, Client360Snapshot, ImportBatchSummary, ImportProposal, KanbanColumn, KanbanCard, and all enums
### Task 4.3 — `app/src/lib/crmApi.ts` ✅
**Done:** 12 typed API client functions — all canonical CRM routes covered with full TypeScript typing, auth-header injection, and error handling
### Task 4.4 — `app/src/components/modules/CRM.tsx` ✅
**Done:** Full module shell featuring:
- ContactListView: searchable/filterable table with QD bars, buyer type badges, status badges, interaction counts, pagination
- KanbanView: horizontal scrollable Kanban from canonical crm_leads
- OpportunitiesView: deal pipeline table with probability bars
- TasksView: priority-sorted reminder inbox with overdue indicators
- ImportsView: CSV drag-and-upload with immediate Api call
- Client360Panel: slide-over dossier with identity, QD scores, property interests, opportunities, interactions, tasks, risk flags, and Oracle signals
### Task 4.5 — `app/src/App.tsx` — `/crm` route registered ✅
### Task 4.6 — `app/src/components/layout/Sidebar.tsx` — CRM Users icon added ✅
---
## Phase 5: Synthetic Data Seed Script
### Task 5.1 — `backend/scripts/seed_synthetic_crm.py` ✅
**Done:** 9-phase seed script:
1. inventory_projects (14 Kolkata projects)
2. crm_people (250 synthetic clients)
3. crm_leads (status normalization, lifecycle tracking)
4. crm_property_interests (project name + budget mapping)
5. intel_interactions (channel normalization)
6. intel_qd_scores (score type normalization, UPSERT)
7. intel_reminders (due date parsing, priority logic)
8. crm_stage_history (stage audit trail)
9. Summary logging
Supports `--dry-run` and `--limit` flags.
---
## Phase 6: Validation
### Task 6.1 — TypeScript type check: `npx tsc --noEmit` ✅
**Result:** 0 errors
### Task 6.2 — Production build: `npm run build` ✅
**Result:** Built in 11.95s, exit code 0. Only non-blocking chunk size warning.
---
## DELIVERY SUMMARY
**Files Created:**
- `backend/db/schema_crm_canonical.sql` — canonical domain schema
- `backend/services/imports/__init__.py` + `ingest_service.py`
- `backend/services/client_graph/__init__.py` + `aggregation_service.py`
- `backend/api/routes_crm_imports.py` — 10 API routes
- `backend/scripts/seed_synthetic_crm.py` — 9-phase seed script
- `app/src/types/crmTypes.ts` — 25+ TypeScript types
- `app/src/lib/crmApi.ts` — 12 typed API client functions
- `app/src/components/modules/CRM.tsx` — full CRM module UI
- `db assets/synthetic_crm_v1/` — 26 CSVs + 8 JSONs + Claude supplements
**Files Modified:**
- `backend/main.py` — registered crm_imports_router
- `app/src/App.tsx` — imported CRM, added /crm route
- `app/src/components/layout/Sidebar.tsx` — added Users icon for /crm
- `app/src/types/index.ts` — added 'crm' to ModuleId
**Build Status:** ✅ Production build passing
**TS Status:** ✅ Zero type errors
---
*Log completed: 2026-04-18T21:05:00+05:30*
---
## Phase 7: Production Validation and Hardening
### Task 7.1 - Linux-origin deployment verification complete ✅
Validated on host `192.168.1.2`:
- deployed repo root: `/opt/desineuron-velocity-site/repo`
- active frontend/site revision: `f616a33ab01bd56dfb31a5825b8fc955a367786a`
- backend service: `desineuron-velocity-backend` active
- nginx: active
- backend listener: `127.0.0.1:8001`
- PostgreSQL container: `desineuron-ops-db` exposed on `5435`
### Task 7.2 - Public API route validation complete ✅
Verified live against `https://velocity.desineuron.in`:
- `POST /api/auth/login` -> 200
- `GET /api/auth/me` -> 200
- `GET /api/crm/contacts` -> 200
- `GET /api/crm/kanban` -> 200
- `GET /api/crm/tasks` -> 200
- `GET /api/crm/opportunities` -> 200
### Task 7.3 - Founder login setup validated and hardened ✅
Initial state found in production:
- all four founder/admin accounts existed
- all four were active
- all four shared the same password
Hardening applied:
- rotated the four founder/admin users to distinct passwords
- regenerated local temp SQL artifacts so they match the live credentials instead of the older shared-password state
Accounts validated live:
- `sagnik@desineuron.in`
- `sayan@desineuron.in`
- `sourik@desineuron.in`
- `abantika@desineuron.in`
All four successfully authenticated after rotation.
### Task 7.4 - Oracle/mobile-edge schema gap fixed in production ✅
Observed production defect:
- backend logs showed `UndefinedTableError: relation "insight_recommendations" does not exist`
- `/api/mobile-edge/alerts` and `/api/mobile-edge/insights/{lead_id}` returned 500 before remediation
Root cause:
- `backend/oracle/schema_extension_v2.sql` existed in repo but had not been applied to the live PostgreSQL database
Remediation:
- applied `backend/oracle/schema_oracle.sql`
- applied `backend/oracle/schema_extension_v2.sql`
Validation after apply:
- `insight_recommendations` table exists in production
- `GET /api/mobile-edge/alerts` -> 200
- `GET /api/mobile-edge/insights/test-lead` -> 200 (empty list, expected with no seeded insights)
### Task 7.5 - Production readiness assessment ⚠️
Founder CRM slice status:
- canonical schema present in repo
- canonical schema loaded in production
- canonical CRM routes live
- synthetic CRM data loaded in production
- frontend build passes locally
- public auth flow works
Still not fully complete from a platform standpoint:
- founder-pack and related `.Agent Context` documents are still untracked in git locally
- canonical import workflow is coded but not yet exercised in production
- `workflow_import_batches` and `workflow_actions` remain at `0` in production, so import review/commit is not yet operationally proven
- public API health is not exposed at `/api/health`; current backend health route is `/health` at the app layer, not on the public same-origin API surface
### Task 7.6 - Cleanup complete ✅
Cleaned local and remote helper scripts used during validation/hardening so only the intended SQL artifacts remain.