210 lines
5.5 KiB
Markdown
210 lines
5.5 KiB
Markdown
# 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
|
|
|