Product & Architecture Plan · 2026-05-20

NotebookLM
× AirPilot

AirPilot already retrieves grounded knowledge. It just never shows its work. This is the plan to turn a support bot into a cited, audible, source-grounded knowledge system — mostly by connecting pipes that already exist.

Focus  Full notebook workspace Scope  4 workstreams · 4 phases New infra  ~1 model · 1 TTS call
live · grounded answer loop
01 · The premise

What NotebookLM actually is

Strip away the consumer wrapper and NotebookLM is five engineering properties. Each one maps onto something AirPilot already half-builds.

P1

Source-grounded

Answers are constrained to your uploaded sources — not the open model. Hallucination collapses.

P2

Inline citations

Every claim carries a pin back to the exact passage in the exact document.

P3

Synthesis artifacts

Briefing docs, study guides, FAQs and timelines auto-written from the corpus.

P4

Audio overviews

Two AI hosts discuss your sources as a podcast you can listen to on the move.

P5

Notebook workspace

Sources · grounded chat · studio — three panes around one private corpus.

02 · The core insight

AirPilot is already 70% of a NotebookLM

Every column on the left already exists in the codebase on the right. The work is not invention — it is exposure and synthesis.

NotebookLM concept
What already ships in AirPilot
Private source corpus
KnowledgeDocument + per-vendor Qdrant collection airpilot_vendor_{id}, fed by panel import & manual articles.
Grounded retrieval
core/rag/ — chunker (900/200) → embedder → retriever → pipeline, invoked at ChatEngine step 9.
Synthesis artifacts
core/analysis/ — ticket categorize → cluster (cosine 0.8) → FAQGenerator draft FAQs.
Notebook workspace
portal/.../vendor/knowledge/page.tsx — sources table, counts, import & reindex controls.
Grounded chat
ChatEngine.process_message() — 17-step pipeline, RAG context injected into the system prompt.

The four things that are missing are exactly the four things NotebookLM is famous for. Each is a contained workstream — not a rewrite.

03 · Where it slots in

The architecture, with the four gaps lit up

Existing dataflow in slate. The four amber nodes are the only new surface area — watch where each one attaches.

existing dataflow new — the four workstreams the severed citation wire (today)
04 · The four workstreams

What we build, and the simulation of why

Each block: the concrete gap (with the real file and line), the fix, and a running simulation so the behaviour is obvious before a single line is written.

1 Grounded citations

Stop severing the wire at the API boundary

The retriever already knows the document title and external_source_id of every chunk it returns. They simply never leave the engine.

The gap: engine.py:339–349 rebuilds ChatResponse.sources as text[:200] + score + source_type only. external_source_id and title are dropped, so ConversationMessage.retrieved_context stores title-less, id-less stubs. The answer can never link back.
The fix: thread title+external_source_id through retriever → engine → message JSON; teach PromptBuilder to emit inline [n] markers; render clickable source pins in ConversationTranscript.tsx resolving to KnowledgeDocument.

Smallest change, highest trust ROI — and it unblocks everything downstream. Phase 1.

retrieval → answer apply the fix
Retriever
id + title ✓
engine.py:339
strips id/title
Answer
to customer
Your plan renews on the 14th and the price is locked for 12 months1. Refunds are available within 7 days of purchase2.
billing-policy.md · §Renewal  knowledge #418
refund-terms.md · §Window  knowledge #207
core/analysis → studioidle
connectivity ×142 billing ×97 account ×64 refund ×38 technical ×29
2 Studio briefings

Persist the synthesis you already compute

The analysis pipeline already clusters tickets and surfaces common_issues — then throws the narrative away.

The gap: results live only in Job.payload["result"]. There is no AnalysisReport model, so nothing is browsable, diff-able, or feedable to audio.
The fix: add an AnalysisReport model and a step 6 in AnalysisPipeline.run_full_analysis() that asks the LLM to write a narrative Support Health Briefing from common_issues + category distribution. Surface it as a Studio artifact.

Reuses the entire analysis pipeline. Phase 2.

3 Audio overviews

The briefing, as a two-host shift podcast

Once the briefing is persisted text, an audio overview is a thin layer: script it as a dialogue, speak it, store the mp3.

The gap: openai_service.py has no speech method — no create_speech(), no audio job type, no player.
The fix: add OpenAIService.create_speech() (TTS), a dialogue-script generator over the briefing, a briefing_audio job, store the file, play it in the portal.

Use case: a support lead listens to “this week’s support health” on the commute. Phase 3.

briefing → 2-host dialogue → ttsoverview.mp3
Host A
So connectivity tickets jumped 38% this week — what’s driving it?
Host B
One cluster: the new Tokyo node. 142 tickets, same root cause.
Host A
And billing’s steady, but refunds doubled after the price change.
Host B
Right — the recommendation is a proactive FAQ before it escalates.
0:00 / 4:12
vendor/knowledge → notebook workspacescene 1/4

Sources

billing-policy.md
refund-terms.md
tokyo-node-faq.md
setup-guide.md
imported · 312 docs

Grounded chat

“Why was I charged twice this month?”

Studio

Support Health Briefing
Audio overview · 4:12
3 draft FAQs ready
4 Notebook workspace

Re-compose the knowledge page into three panes

No new infrastructure — Sources, grounded Chat and the Studio are all existing endpoints, re-laid-out as one workspace.

The gap: the knowledge UI is a flat table; there’s nowhere to query the corpus, read cited answers, or reach synthesis artifacts in one place.
The fix: evolve vendor/knowledge/page.tsx into Sources | Grounded Chat | Studio, composing WS1–WS3 outputs. Pure front-end re-composition.

The payoff surface — where vendors feel the system. Phase 4.

05 · Sequencing

Four phases, ordered by ROI ÷ effort

Each phase ships standalone value. Citations first — it is the smallest change and the largest trust gain, and every later phase consumes it.

PHASE 1

Grounded citations

Thread id+title end-to-end · inline [n] markers · clickable pins in the transcript.

EFFORT
TRUST IMPACT
PHASE 2

Studio briefings

AnalysisReport model · narrative synthesis step · persisted, browsable.

EFFORT
VALUE
PHASE 3

Audio overviews

create_speech() · dialogue scripting · briefing_audio job · player.

EFFORT
DELIGHT
PHASE 4

Notebook workspace

Three-pane re-composition of the knowledge page — the surface vendors touch.

EFFORT
DIFFERENTIATION
06 · Why it matters

From a deflection bot to a defensible knowledge system

Trust

Cited answers kill hallucination liability

VPN customers ask sensitive billing & connectivity questions. “Here is the source” is a feature vendors will pay for — and an audit trail on every reply.

Moat

Insight, not just deflection

Briefings and audio overviews turn AirPilot into a system support leads use, not a widget they install and forget. Stickier, harder to rip out.

Cheap

Mostly plumbing, not greenfield

Reuses RAG + analysis + openai_service. Net-new: ~one model, one TTS method, one prompt change, one portal re-layout.