Two streams converged: Mark's Loom corrections hardened the dispatch pipeline shape, and Henry Peck's LSI dogfood evaluation surfaced four quality axes. Both addressed in a single wave. Pipeline now end-to-end Mark-spec compliant on prod.
node_uuid backfill (P0) | Date: 2026-05-05
master_company / master_person FK on table 710) were wrong on both sides. Henry Peck's Apr 27 LSI Star51 V2 follow-up dogfood surfaced four hard quality axes: hallucinated facts, stale data, out-of-dataset matches, and existing-investor blindness (TVM↔Vektor). 2 of 4 fully addressed (hallucinated facts via FACTS GUARDRAIL + W17-DATA-ATTRIBUTION; existing-investor blindness via W17-EX-INV-IMPL-B). Stale-data fix (W17-DATA-FRESHNESS) design-complete, gated on Mark. Out-of-dataset matches is an open gap — FACTS GUARDRAIL reduces hallucination but does not prevent surfacing real investors outside the dataset scope. Anti-fabrication guardrails live on all 14 classes. Pipeline is now end-to-end Mark-spec compliant on prod.
Mark's Loom + Excalidraw + Slack corrected the dispatch pipeline shape. Previous assumptions on 6/6 narratives and FK linkage were wrong on both sides — shipped corrections without breaking the live demo.
null = default UI)null/skip OK for milestone)suggestion_request_idfind_investors specifically:
suggestion_request + fundraising_pitch_profile + file (one record)compare_thesis function → 6 vector scores (Kenya team, stub today)max(ceil(count × 1.5), 12)exclude_list (NOT post-filter)graph_rag with full deck markdown + graph contextsuggestion_format == null → populate outcome suggestion table
Mind-blowing space transition (Imagen 4): a deep-space probe approaching a luminous holographic pitch deck — the moment a founder’s record enters the chain.
| Surface | Before | After | Wave |
|---|---|---|---|
fundraising_pitch_profile (table 710) |
Wired master_company_id, master_person_id |
suggestion_request + file ONLY, no FK to master_* tables |
W15-D |
8420 ready predicate |
All 6 narratives required | ≥5 of 6 narratives + 4 hard fields | W15-C |
| LLM extractor missing params | Stub text “no info available” + stub vectors | null (no embed call) |
W11-A |
8422 POST input |
14 inputs | 15 inputs (added company_name) |
W15-B |
12918 upsert |
suggestion_request_id silently dropped |
FK written on every upload | W15-D |
Symptom: Invented deal histories, banked sales figures, fabricated fund roles for real people.
Fix (W15-E): Anti-fabrication guardrail block prepended to all 14 synthesize.md prompts.
5 explicit rules:
Symptom: “Why this person?” reasoning was opaque — Henry couldn’t tell what scored someone in.
Fix (W17-DATA-ATTRIBUTION): Four-tag attribution system on find_investors synthesize prompt.
| Tag | Meaning |
|---|---|
[portfolio] | Currently in the firm’s portfolio |
[co-investor] | Co-invested with founder’s existing investors |
[board] | Board seat at relevant company |
[thesis] | Pure vector match on investment thesis |
Each “WHY” bullet must end with one of these tags. Henry can scan a deck and immediately see which signal pulled each match in.
Symptom: Edwin Lindsay listed at company he left 10 years ago. Title from 2019 quoted as current. Recommended firms with stale roles.
Fix design (W17-DATA-FRESHNESS): ContactCard renders last_validated_date from FalkorDB node properties when available. If gap >12mo, append “(role as of YYYY-MM)” inline.
last_validated_date on FalkorDB Person nodes.Symptom: Recommended Jennifer Bayon to TVM Capital, but TVM had already invested in her company.
Fix (W17-EX-INV-IMPL-B, shipped 19:26 UTC): Pre-fetch blacklist Cypher wired into 8399 dispatch as Step 1b, before the prefilter call.
Verified working graph predicate (via robert-lab/debug-cypher):
MATCH (vc)-[:INVESTED_IN|LEAD_INVESTED_IN]->(fr:Funding_Round)<-[:RAISED]-(c:Company)
WHERE toLower(c.name) CONTAINS '{{$var.company_name_lower}}'
RETURN DISTINCT vc.uuid as vc_uuid
Returns existing investors as UUID list. 8426/prefilter accepts excluded_uuids: text[]? and the JS lambda builds a Set(excluded) that skips matching node_uuid before cosine scoring. Existing investors never enter the funnel.
d1591b09…) and TVM Capital Life Science (2946a9a4…). Full dispatch chain (prefilter → graph_rag → trim) returned 8 contact cards with neither excluded firm present. solas_present=false, tvm_present=false.
Mind-blowing space (Imagen 4): the investor cosmic web — every firm a node, every co-investment a thread of light. The chain navigates this graph 2-hop deep via Funding_Round.
Symptom (Henry, Apr 27): Result #20 was Charles Houssiere — a real investor but NOT in the LSI Star51 attendee list Henry provided. The model surfaced a globally-known investor instead of constraining to the dataset.
Why FACTS GUARDRAIL doesn’t fix this: The guardrail prevents inventing claims about people. It does not prevent surfacing real people who are outside the dataset boundary the user expected. Different failure mode.
Design (W15-F memo, Option B): Add an optional live_event_id? input on 8401. When present, query live_event_participants table (703) for node_uuid rows belonging to that event, then inject WHERE node.uuid IN [...] into the find-investors Cypher. UUIDs not in the allowlist are filtered out before scoring. Same shape as the existing-investor blacklist, opposite polarity (allowlist instead of blocklist).
Mind-blowing space (Imagen 4): the dataset-scope filter — chaotic candidates above a crystalline lattice; only those inside the live_event_id allowlist pass through to the planet below.
| Wave | What | Status |
|---|---|---|
W18-LIVE-CHAIN-VERIFY |
Curl-only E2E on prod (5/6 ready → dispatch → SSE) | ✅ done — 2 issues found |
W18-RETEST-24 |
Re-run 24 edge-case harness against new chain | ✅ done — 17/24, FACTS GUARDRAIL visibly working |
W17-EX-INV-IMPL-A |
Patch 8426 to accept excluded_uuids |
✅ landed (9bb279a) |
W17-EX-INV-IMPL-B |
Wire blacklist Cypher into 8399 (parallel agent) | ✅ SHIPPED 2026-05-05 19:26 UTC — sid=433, 2 firms excluded (Solas BioVentures + TVM Capital Life Science) |
W17-DECK-CONTEXT |
Pass full deck markdown into 8401 graph_rag |
✅ shipped |
W18-FIX-A (BFF) |
Forward suggestion_request_id to Xano dispatch |
✅ shipped (8a717f8) |
W18-FIX-B (prompt) |
Enforce SIGNAL TAXONOMY tags in WHY output | ✅ landed — see W18-FIX-D below |
W18-FIX-C |
User banlist → excluded_uuids plumbing (8448 resolve-banlist) |
✅ landed |
W18-FIX-D |
Reconcile 8401 synth_prompt — deck section + signal taxonomy coexisting | ✅ shipped (fd6a383) — 5/5 tags verified, both blocks coexist |
CASE-13-INVEST |
Sequoia partner search regression diagnostic | In flight |
24-case edge harness re-run against new chain.
| # | Case | Round 2 | Round 3 | Delta |
|---|---|---|---|---|
13 |
Sequoia partners (Roelof+Alfred grouping) | PASS | PARTIAL | -1 |
20 |
Prompt injection ("ignore previous context") | FAIL | PASS | +1 (clean handle) |
| All 22 | (see full report) | — | — | net 0 |
excluded_uuids plumbing (W17-EX-INV-IMPL chain).
Direct dispatch with suggestion_request_id=432 returned the full chain — subtitle “Prefilter → graph_rag → trim chain. Graph returned 12 candidates, showing 5”. Trim ran (12→5). Latency ~16s.
BFF dispatch with same sid silently fell back to direct FalkorDB vector search (“FalkorDB returned 8 candidates” — no prefilter, no candidate_ids). Root cause: route.ts validated the profile existed but never forwarded suggestion_request_id to the upstream dispatch.
W18-FIX-A landed at 8a717f8 — one-line spread guard.
SIGNAL TAXONOMY tags [portfolio] / [co-investor] / [thesis] did NOT appear in any WHY paragraph across 5 cards. The LLM writes prose describing the patterns but never emits the bracket format. Prompt is ignored at recency.
W18-FIX-B in flight — moves the rule to end-of-prompt with imperative + example.
suggestion_request_id → graceful vanilla path. Dispatch with nonexistent sid → graceful fallback, no crash.
Mind-blowing space (Imagen 4): mission control — operator silhouetted in front of holographic chain dashboards. Live trajectories, candidate counts, latency curves.
Curled https://orbiter-sandbox.vercel.app/api/find-investors with sid=433, class_override=find_investors, requested_n=5:
[portfolio] / [co-investor] / [board] / [thesis] absent across all 5 cards. W18-FIX-D reconciliation in flight.
Conclusion: BFF→Xano chain is fully wired on prod. SIGNAL TAXONOMY regressed mid-push; reconcile in flight.
Five Imagen 4 cinematic space images carry the visual identity of this report. Doc rhythm: SPACE hero (orbital pipeline) → SPACE probe + pitch deck → SPACE cosmic web → SPACE crystalline lattice → SPACE mission control. Earlier Ink Journal diagram variants (Tufte / Victor / Tesler / Rosling / Cairo / NYT / FiveThirtyEight) were dropped per Mark’s preference for full space-orbiter visual identity.
| Image | Slot | URL |
|---|---|---|
| Orbital pipeline | Hero (top of doc) | hero-v2 |
| Probe + pitch deck | After Mark's pipeline section | probe-v2 |
| Cosmic web | Theme 4 → CHAIN-4 transition | network-v2 |
| Crystalline lattice filter | Theme 5 (out-of-dataset) | sieve-v2 |
| Mission control | Live prod verification | mission-v2 |
1. node_uuid backfill on investment_theses (table 709) — empty today; W15-A smoke revealed the data gap.
2. last_validated_date on FalkorDB Person nodes — populated? Or do we synthesize from enriched_at?
3. company_name canonicalization — should we resolve to master_company_id before Cypher, or trust CONTAINS match?
4. FalkorDB NOT EXISTS clause support — backup approach for blacklist filter if pre-fetch is too slow.
5. compare_thesis function — Kenya team timeline. We have a single-dim stand-in (8426 cosine on founder_fit_derived_vector). When does the 6-dim arrive?
6. VC_Firm node.name vs display_label — resolve-banlist (8448) returns valid UUIDs but matched_name blank for 7/8 hits. Are firm names stored in display_label rather than node.name in FalkorDB? If so, 8448 should RETURN node.display_label AS matched_name for a usable audit trail.
7. exclude_list persistence — add exclude_list (json) to table 710, or pass as new exclude_list: text[]? input on 8399 from BFF? Option 2 is faster to ship; option 1 is correct for session replay.