← Back to Hub
Shipped · 2026-05-05

Mark Spec + Henry Peck Push

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.

Orbiter Anything Engine — luminous data planet ringed by 14 dispatch satellites (Imagen 4)
Status: As of 2026-05-05 — all chain waves shipped. CHAIN-4 banlist gated on Mark node_uuid backfill (P0)  |  Date: 2026-05-05
TL;DR — Two streams converged this push. Mark's 20-min Loom corrected the dispatch pipeline shape — pre-existing assumptions (W11-* hardening for 6/6 narratives, 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.

Corrected Pipeline Shape

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.

1User uploads deck OR fills 5/6 narrative interview
2Socket notification on processing complete
35/6 narrative parameter check NOT 6/6 — relaxed in W15-C
4Ask: how many results + format (null = default UI)
5Ask: anyone to exclude (null/skip OK for milestone)
6Dispatch — packet is ONLY suggestion_request_id
714-way router → per-class processing pipe
8For find_investors specifically:
  • Pull suggestion_request + fundraising_pitch_profile + file (one record)
  • Run compare_thesis function → 6 vector scores (Kenya team, stub today)
  • Apply headroom: max(ceil(count × 1.5), 12)
  • Pre-filter the exclude_list (NOT post-filter)
  • Run graph_rag with full deck markdown + graph context
  • Re-rank, trim to user-requested count via Opus 4.1
  • If suggestion_format == null → populate outcome suggestion table
Deep-space probe approaching a luminous holographic pitch deck (Imagen 4)

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.

Schema Corrections Landed

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

Henry's 5 Feedback Themes — How We Hardened

1. Don't Fabricate Facts FACTS GUARDRAIL

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:

  • Never invent personal history, deal flow, or financial metrics not in the input record
  • Use only fields present in the candidate JSON
  • Mark inferred claims as inference, not fact
  • Quote the source field if asserting unusual specifics
  • When uncertain, say “based on available data, we don’t know”

2. Show Signals, Not Just Names SIGNAL TAXONOMY

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.

TagMeaning
[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.

3. Stale Data — Show “As Of” Dates DATA FRESHNESS

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.

Status: Design doc landed; implementation gated on Mark backfilling last_validated_date on FalkorDB Person nodes.

4. Existing-Investor Blindness (TVM↔Vektor) SHIPPED 2026-05-05

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.

Prod verified (sid=433, company=“vektor”): Cypher returned 2 firms — Solas BioVentures (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.
Investor cosmic web — every firm a node, every co-investment a thread of light (Imagen 4)

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.

5. Out-of-Dataset Matches — Open Gap

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).

Status: Designed. Implementation gated on the user surfacing the dataset-scope intent — the BFF needs an input the user can pass when they say “from the LSI list” or “from this event roster.” Not buildable until that handoff is wired.
Dataset-scope filter — crystalline lattice, only live_event_id allowlist candidates pass through (Imagen 4)

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.

In-Flight Verification

WaveWhatStatus
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

W18-RETEST-24 Results

24-case edge harness re-run against new chain.

17/24
Pass Rate (Round 3)
+1
Wins (case 20 prompt-injection)
-1
Regressions (case 13)
Net 0
Delta vs Round 2
#CaseRound 2Round 3Delta
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
Visibly working (FACTS GUARDRAIL): No banned phrases in any WHY (incl. case 15 where “worth a 20-min call” was in the query). Repeat runs produce internally-consistent claims — no per-call hallucination of new round labels or co-investor names. Case 20 prompt-injection attempt cleanly ignored — classifier read through it.
Still breaking: SIGNAL TAXONOMY bracket tags absent (same issue W18-LIVE-CHAIN-VERIFY caught — W18-FIX-B in flight). Case 13 regression — graph not surfacing Roelof Botha / Alfred Lin nodes for Sequoia query. Case 14 user-banlist for a16z: classifier sees the ban, but graph layer doesn’t filter — same family as existing-investor blindness; funnels through excluded_uuids plumbing (W17-EX-INV-IMPL chain).

Live Chain Verify Findings

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.

Hostile tests passed: Dispatch without suggestion_request_id → graceful vanilla path. Dispatch with nonexistent sid → graceful fallback, no crash.
Mission control — operator silhouetted before holographic chain dashboards (Imagen 4)

Mind-blowing space (Imagen 4): mission control — operator silhouetted in front of holographic chain dashboards. Live trajectories, candidate counts, latency curves.

Live Prod Verification (post-W18-FIX-A)

Curled https://orbiter-sandbox.vercel.app/api/find-investors with sid=433, class_override=find_investors, requested_n=5:

  • HTTP 200, 22.7s
  • Subtitle: “Prefilter → graph_rag → trim chain. Graph returned 12 candidates, showing 5” ← chain confirmed live through Vercel
  • 5 ContactCards rendered
⚠️ Zero signal tags in WHY paragraphs: [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.

Visual Concepts

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.

Mind-blowing space orbiter set (Imagen 4 photo-real, generated 2026-05-05)

ImageSlotURL
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

Open Questions

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_labelresolve-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.