We hit a familiar private-AI wall: intake worked. The corpus started filling. Full-text search existed. Daily ingest was wired. And still the useful question was not “what graph should we build?” It was:
How do we get good conclusions out?
This post documents that pivot for a Bob-owned Supabase research library used by a private research assistant (Roxy). No credentials, no client content, no schema dump — just the product lesson and the multi-model advice we collected before spending another week on structure.
What “good data in” looked like
Operational snapshot as of August 11, 2026 (agent-reported, not a fresh independent probe in this writeup):
| Layer | State |
|---|---|
| Host | Bob-owned Supabase Pro · schema v1 · FTS previously smoked |
| Corpus | 28 full-text research newsletters from a real mail path |
| Ingest discipline | 105 attempts · 28 inserted · 56 deduped · 21 empty skips |
| Automation | Daily library ingest scheduled; separate human HTML digest also exists |
| Still open | Bob-felt proof of cited answers + honest “not in library” misses |
That is a real library start. It is also a trap: empty shelves force honesty; half-full shelves invite architecture hobbies.
The wrong next move
We already had a thoughtful design for relationship extraction and a citation-backed knowledge layer: entities, aliases, proposed edges, evidence rows, temporal validity, access tiers, acceptance tests. Relational-first Postgres. No premature Neo4j. Sensible long-term engineering.
James rejected it as the near-term product axis. Correctly.
The right product definition
Four frontier/local-ish reviewers agreed on the reframe (Opus 5, Gemini 3.1 Pro Preview, Kimi K2.6, DeepSeek V4 Pro):
Missing product = answers with receipts — on demand first, on a schedule later.
A trusted “conclusion” for research work is not Roxy’s opinion. It is:
verbatim claim
+ who said it
+ when
+ link / citation into the library
…or: “not in your library”
That collapses a false gate. “Prove cite + honest-miss” is not a checkbox before conclusions work. It is the minimum conclusions product.
Interaction preference locked for this library: ask (pull). Bob asks. Roxy answers from the corpus. Push digests are optional after pull feels trustworthy.
Ranked ways to get value out
| # | Surface | Why it earns its keep | Risk |
|---|---|---|---|
| 1 | Cited Q&A (quote-or-refuse) | Matches “ask.” Lowest build cost. Highest trust test: click the citation. | Medium if synthesis is loose; low if quotes are hard |
| 2 | Weekly sourced digest | Habit surface. Every bullet linked. Bob feels the library without querying. | Low if bullets stay claim-linked |
| 3 | Flat claim ledger | Table of verbatim claims + author + date + doc. Backbone for everything fancier. | Low if claims stay literal |
| 4 | Contradiction report | “Author A said X; Author B said not-X.” High signal for competing research feeds. | Medium if forced; low once ledger exists |
| 5 | Topic coverage map | Honesty instrument: what the shelf covers and ignores. | Low |
| 6 | Watchlist alerts | Only after Bob names entities/topics worth watching. | Medium noise |
What reviewers agreed to never build next
- Sentiment scores, confidence theater, predictions, buy/sell language
- Knowledge-graph / entity-resolution projects before a flat claim ledger is useful
- Unsourced “the assistant concludes…” paragraphs
- Pouring more media/events into the DB to fix weak text conclusions — more input never fixes weak output
Precompute vs ask-time
The cheap split that kept surviving review:
| When | Store / do | Do not |
|---|---|---|
| At ingest | Source metadata, short summary, 3–7 verbatim claim sentences, flat entity mentions | Opinions, edges-as-truth, investment takes |
| At ask-time | Retrieve, rank, assemble citations, refuse when absent | Silently promote query-time guesses into the permanent store |
A two-session shape (still a plan)
- Session 1 — ask. Bob asks a few real questions against the live corpus. Success is not “the model sounded smart.” Success is: he clicks a citation and the quote is exactly right — or the miss is honest.
- Session 2 — optional push. Only after pull works: backfill a claim ledger and try one Monday digest where every bullet has a receipt. Success is Bob using an item unprompted, not another green infrastructure check.
Where the graph work goes
Not in the trash. Parked. Relationship mapping remains a later layer over durable claims and mentions — after cited answers are boringly trustworthy. Postgres stays the store. Recursive SQL is enough for a long time. A separate graph database is a measured-need decision, not a brand decision.
Open questions we did not fake-resolve
- After cited Q&A works, is the next felt win the digest or the browsable claim ledger?
- Should contradictions ship with the first digest, or wait until the ledger is dense?
- On honest misses: pure absence, or also “nearest related thing / source to add”?
- When do event transcripts deserve to be a product deliverable versus a single captions-first fixture?
Practical takeaway
If your Supabase research library is filling and you feel no value:
- Stop expanding the ontology.
- Make the assistant answer from the shelf with hard citations.
- Make refusal a feature.
- Only then precompute verbatim claims so digests and disagreements become cheap.
- Treat graphs, sentiment, and “AI conclusions” as late privileges earned by receipts.
Data in is plumbing. Value out is a librarian who can show you the page — or admit the page is not there.