Every requirement Mark wrote in his Mintlify docs, Slack threads, and verbatim prompts — checked against the current frontend behavior + the backend endpoint state. Use this when you need a single source of truth for "is the AE Mark-compliant yet?"
"Frontend" column = does the live UI honor this spec at HEAD ef2649c?
"Backend" column = does Xano honor this spec today (Mark territory)?
The note column explains the nuance — many specs are frontend-ready but waiting on Mark’s backend.
| Mark spec | Frontend | Backend | Note |
|---|---|---|---|
| MCQ-FIRST interview pattern (every question has discrete chips) | YES | YES | InterviewTurn primitive renders MCQ chips when ep 8411/8484 returns options[]. |
| PATH A (deck upload) / PATH B (interview-only) fork at first turn | YES | PARTIAL | chat-shell renders the fork. Canvas (ep 8506) skips the deck-first opening move — $prompt_find_investors in Xano needs update. |
| Multi-select MCQ + allow free-text entry | YES | YES | multi_select + allow_freetext flags honored in InterviewTurn. |
| 5/6 narrative gate before dispatch (was 6/6, corrected May 5) | YES | YES | DispatchConfirmation card enforces gate. Gate text shown. |
| Result count picker BEFORE dispatch | YES | YES | Canvas + chat-shell both render the count picker turn after ready=true. |
| Format picker BEFORE dispatch (suggestion / collection / csv / pdf) | YES | PARTIAL | Frontend ships the picker + sends output_format on dispatch payload. Backend only honors "suggestion" today — collection/csv/pdf paths not wired in Xano. |
| Editable confirmation card before dispatch (system rewrites on edit) | PARTIAL | NO | Card renders + raise/company fields editable. Re-summarize-on-edit needs Xano /summarize endpoint Mark hasn’t built. Interview-gate auto-dispatch fix proposal awaiting Robert approval. |
| Interview converges in 3-4 turns (not 7+) | N/A | VERBOSE | Backend prompt issue. Today verifiable at 7 turns to ready=true. Not a frontend concern. |
| Mark spec | Frontend | Backend | Note |
|---|---|---|---|
| Zep memory keys on user_id (per-user, not per-session) | YES | PARTIAL | Frontend now sends authenticated useAuth().user.id on every BFF that touches user state. Backend ignores the field on most endpoints — Mark needs to add user_id input declaration + Zep wire-up at his pace. |
| Zep mem_used flips true on turn 2 (proves continuity) | YES | PARTIAL | Surfaced in dispatch response. mem_used=true visible after backend Zep accepts user_id. |
| No cross-account user attribution leaks | YES | YES | 2 hardcoded "15" leak bugs fixed this session (chat-shell + upload-files-fn). See user_id audit. |
| suggestion_request rows associate to authenticated user | YES | PARTIAL | startOutcomeFn passes user_id. ep 8417 needs to write user_id to the row. |
| Uploaded decks attribute to authenticated user | YES | PARTIAL | uploadFilesFn now sends user_id in multipart form (was hardcoded "15"). ep 8420 needs to honor it server-side. |
| Mark spec | Frontend | Backend | Note |
|---|---|---|---|
| FLIP avatar travel: cubic-bezier(0.22, 1, 0.36, 1) at 0.45s (Mark tell #1) | BYTE-EXACT | N/A | avatar-travel-clone.tsx preserved byte-exact. 550 ms safety timer + indigo glow drop-shadow. |
| Frosted-glass dialog chrome: 85vw × 90vh, blur(40px) saturate(180%) | YES | N/A | Reference impl in copilot-manager.tsx; pattern reused across AE. |
| Mic 3-state arc (idle / listening pulse / 8-arm sun) | YES | N/A | mic-button.tsx + composer recording glow keyframe. |
| Dynamic conversation starters (4 slots, never static) | YES | N/A | use-conversation-starters.tsx (487 LOC). Calendar / active-work / network-intel / time-of-day. Capped at 3 for clean grid. |
| DiceBear notionists fallback avatars (kebab-seed, no grey circles) | YES | N/A | avatar.tsx wired across canvas + chat-shell ContactCards. |
| No internal class jargon visible to user (find_talent, find_advisors strings) | YES | DEFENSIVE | sanitizeAskBackReasoning() helper strips backend leaks. Real fix is Mark tightening $prompt_classify voice rules. |
| Hide routing reasoning ("Routed → find_investors...") from user | YES | N/A | eventsToSse + sanitize helpers strip reasoning text. |
| Wider canvas (60% → 78-80% at 1440) | YES | N/A | network/index.tsx grid: right-rail capped at minmax(200px, 280px) for AE. |
| Class | Frontend | Backend | Note |
|---|---|---|---|
| find_investors | YES | FULL | Mark’s golden class. 25 real cards verified. Opus 4.1 synth. All 5 spec files (interview, synthesize, sample-result, thesis-extract, voice-rules). |
| find_talent | YES | PARTIAL | Dedicated ep 8484 with verbatim Mark prompt. Title-exact queries only today. |
| find_customers | YES | WRONG ENTITY | Returns VC firms / accelerators instead of SaaS prospects. Vector search needs entity-type filter. |
| find_partners | YES | CLOSE | Real company names, strong synthesis. Mostly there. |
| find_advisors | YES | ZERO RESULTS | FalkorDB graph data gap. No advisor nodes exist. |
| find_journalists | YES | ZERO RESULTS | Same FalkorDB gap. No journalist nodes. |
| find_deal_flow | YES | CLARIFY-STUCK | No synthesize.md prompt — never reaches data pipeline. |
| find_cofounder | YES | CLARIFY-STUCK | No synthesize.md. |
| find_collaborators | YES | CLARIFY-STUCK | No synthesize.md. |
| find_acquisition | YES | CLARIFY-STUCK | No synthesize.md. |
| find_speakers | YES | CLARIFY-STUCK | No synthesize.md. |
| find_job | YES | CLARIFY-STUCK | No synthesize.md. |
| make_purchase | YES | CLARIFY-STUCK | No synthesize.md. |
| purchase_real_estate | VIA MAKE_PURCHASE | N/A | Intentionally absent — Mark only writes it as a make_purchase sub-category. |
| get_advice | YES | CLARIFY-STUCK | No synthesize.md. |
| ask_back (meta-class for low-confidence routing) | YES | YES | Confidence < 0.7 → "ask_back" with clarifying question. |
Only 1 of 15 classes ships real cards reliably (find_investors). 1 close (find_partners). 1 partial (find_talent). 2 zero-results (find_advisors, find_journalists — FalkorDB data gap). 1 wrong entity (find_customers). 9 stuck at clarify gate — all missing synthesize.md prompt, which is exactly the file Mark would write per class.
| Mark spec | Frontend | Backend | Note |
|---|---|---|---|
| Conversation history persists (refresh = continue, not reset) | YES | YES | Both canvas + chat-shell write copilot_chat_messages rows. Truncation P0 fixed. |
| Conversation titles are coherent (not raw MCQ fragments) | YES | PARTIAL | coerceConversationTitle helper kills MCQ-fragment titles for new convos. Backend update_conversation_title endpoint needed for full re-titling. |
| 15 outcome tiles visible from welcome state (hamburger toggle to expand) | YES | N/A | "Show all 15 outcomes" button expands the grid. Default 3 dynamic + 3 static visible. |
| Per-class context floors (preload baseline before user types) | YES | YES | use-preload-context.ts pre-fetches user + company baseline on Outcomes tab open. |
| Auto-classify file uploads (no user "what is this?" ask) | YES | YES | Apr 28 directive. classifyFn fired on upload + filename keyword bias as fallback. |
| No demos — closure requires end-to-end real-user dogfood | YES | N/A | Verification gate enforced. agent-browser screenshot dogfood after every chunk this session. |
The frontend honors every spec it can without backend dependencies. The remaining gaps are all backend — either prompts you haven’t written (synthesize.md for 8 classes), data you haven’t backfilled (FalkorDB advisor/journalist nodes), entity filters you haven’t added (find_customers), or endpoints you haven’t built (update_conversation_title, format-picker handlers, fn 12918 enrichment).
1. Wire user_id into the input blocks of ep 8411/8417/8420/8484/8506 + the Zep memory writes. 2. Write synthesize.md for 8 classes (find_acquisition, find_cofounder, find_collaborators, find_deal_flow, find_job, find_speakers, make_purchase, get_advice). 3. Backfill FalkorDB with advisor + journalist nodes (or gate those classes for v0). 4. Add entity-type filter to find_customers vector search. 5. Update $prompt_find_investors with the deck-first opening move. 6. Build the format-picker backend paths (csv / pdf / collection) when ready.