VIBN Frontend for Coolify deployment

This commit is contained in:
2026-02-15 19:25:52 -08:00
commit 40bf8428cd
398 changed files with 76513 additions and 0 deletions

209
BROKEN_FLOW_ANALYSIS.md Normal file
View File

@@ -0,0 +1,209 @@
# BROKEN FLOW - ROOT CAUSE ANALYSIS
## Problem Summary
User uploads document → Checklist shows 0 documents → Project immediately in `extraction_review` mode
## The 3 Issues
### Issue 1: Document Upload May Be Failing Silently
**Upload Endpoint:** `/api/projects/[projectId]/knowledge/upload-document`
**What Should Happen:**
1. File uploaded to Firebase Storage
2. `knowledge_item` created with `sourceType: 'imported_document'`
3. `contextSources` subcollection updated
4. Returns success with chunk count
**What's Probably Broken:**
- Upload endpoint may be throwing an error
- `knowledge_item` not being created
- User sees toast success but backend failed
**Check:**
```
Browser Console → Network tab → upload-document request → Status code?
Server logs → Any errors during upload?
```
---
### Issue 2: Checklist Query Returns 0 Even If Documents Exist
**Checklist Query:**
```typescript
collection(db, 'knowledge_items')
.where('projectId', '==', projectId)
.where('sourceType', '==', 'imported_document')
```
**Possible Causes:**
1. **Firestore Index Missing** - Composite index for `(projectId, sourceType)` may still be building
- Just deployed 5 minutes ago
- Can take 5-15 minutes to build
- Check: Firebase Console → Firestore → Indexes
2. **Security Rules Block Client Query** - Rules were deployed but may have error
- Check browser console for permission errors
- Check: Firestore rules allow read where projectId matches user's project
3. **Documents Don't Exist** - Upload actually failed
- Check: Firebase Console → Firestore → knowledge_items collection
4. **Wrong Collection/Field Names** - Mismatch between write and read
- Backend writes to: `knowledge_items` with `sourceType: 'imported_document'`
- Frontend reads from: `knowledge_items` where `sourceType == 'imported_document'`
- Should match ✓
---
### Issue 3: Project Immediately in `extraction_review` Phase
**Current State:**
```
currentPhase: 'extraction_review'
readyForNextPhase: undefined
```
**Why This Happened:**
1. User said "I connected github" → AI detected "that's everything"
2. Fallback phrase detection triggered: `'perfect! let me analyze'`
3. Backend extraction ran with 0 documents
4. Created empty extraction handoff
5. Transitioned to `extraction_review` phase
**The Flow:**
```
User: "I connected github"
AI: "Perfect, I can see your GitHub repo..."
Fallback detection: reply contains "Perfect!"
readyForExtraction = true
Backend extraction triggered
No documents found → empty handoff
currentPhase = 'extraction_review'
```
**Root Cause:**
The fallback phrase detection is TOO aggressive:
```typescript
const confirmPhrases = [
'perfect! let me analyze', // ← TOO BROAD
'perfect! i\'m starting',
//...
];
```
The AI said "Perfect, I can see your GitHub repo" which matches `'perfect!'` prefix, triggering the handoff prematurely.
---
## Fixes Needed
### Fix 1: Check Upload Endpoint Errors
Add better error handling and logging:
```typescript
try {
const knowledgeItem = await createKnowledgeItem({...});
console.log('[upload-document] SUCCESS:', knowledgeItem.id);
} catch (error) {
console.error('[upload-document] FAILED:', error);
throw error; // Don't swallow
}
```
### Fix 2: Wait for Firestore Index
The index was just deployed. Give it 10-15 minutes to build.
OR: Change checklist to use simpler query without `sourceType` filter:
```typescript
// Simple query (no index needed)
collection(db, 'knowledge_items')
.where('projectId', '==', projectId)
// Then filter in memory:
const docs = snapshot.docs.filter(d => d.data().sourceType === 'imported_document');
```
### Fix 3: Make Fallback Detection More Specific
Change from:
```typescript
'perfect! let me analyze', // Too broad
```
To:
```typescript
'perfect! let me analyze what you', // More specific
'i\'ll start digging into',
'i\'m starting the analysis',
```
And check for EXACT phrases, not prefixes:
```typescript
const replyLower = reply.reply.toLowerCase();
const exactMatch = confirmPhrases.some(phrase =>
replyLower.includes(phrase) && // Contains phrase
replyLower.includes('analyze') || replyLower.includes('digging') // AND mentions analysis
);
```
---
## Immediate Actions
1. **Check Browser Network Tab**
- Did `/api/projects/.../knowledge/upload-document` return 200 or 500?
- Check response body for errors
2. **Check Firestore Console**
- Go to Firebase Console → Firestore
- Look at `knowledge_items` collection
- Are there ANY documents for projectId `Rcj5OY2xpQFHAzqUyMim`?
3. **Wait for Index**
- Firestore indexes take 5-15 minutes to build
- Check: Firebase Console → Firestore → Indexes tab
- Look for `knowledge_items (projectId, sourceType)` status
4. **Fix Aggressive Fallback**
- Update phrase detection to be more specific
- Require both "perfect/okay" AND "analyze/digging/start"
---
## Test Plan
1. **Reset the project phase to `collector`:**
```typescript
// Firebase Console or API call
projects/Rcj5OY2xpQFHAzqUyMim
{
currentPhase: 'collector',
'phaseData.phaseHandoffs.collector': null
}
```
2. **Upload a document**
- Watch Network tab
- Check for 200 response
- Verify console log: `[upload-document] SUCCESS: xxx`
3. **Wait 30 seconds**
- Firestore listener should update
- Checklist should show "1 of 3 complete"
4. **Send "that's everything to analyze"** (explicit phrase)
- Should trigger handoff
- Should NOT trigger on "Perfect!" alone
---
## Date
November 17, 2025