VIBN Frontend for Coolify deployment
This commit is contained in:
209
BROKEN_FLOW_ANALYSIS.md
Normal file
209
BROKEN_FLOW_ANALYSIS.md
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user