docs(decisions): add ADR-027 — chat with a video's stored transcript
Records the deeper-dive chat decision before its build: stored-transcript-only (safe by construction — no caption fetch, no rate gate, no YouTube), entered from the summary view, model defaulting to the summary's model and switchable among the ADR-022 chain. Ephemeral v1; show-source verification deferred to v2. Inserted before "Rejected alternatives" so the decision precedes the feature. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -996,6 +996,70 @@ the prior equal-share behaviour. No schema or API change.
|
||||
|
||||
---
|
||||
|
||||
## ADR-027 — Chat with a video's stored transcript (deeper-dive, on an already-summarized video)
|
||||
|
||||
**Status:** Accepted (2026-06-11). **Consumes ADR-021** (the shared, video-keyed transcript
|
||||
store) for the first time beyond summarization; **uses the ADR-022 chain models**; relates to
|
||||
ADR-012 (isolation) and ADR-016 (the Stage-0 gate).
|
||||
|
||||
**Context — observed demand, not hypothetical.** The maintainer read 10+ real pilot summaries
|
||||
and reported the reactions: *many good; some he wanted to dig deeper into; some less useful*
|
||||
(the "less useful" split between weak-*model* output and uninteresting-*video* content). The
|
||||
middle reaction is the signal: a good summary that makes the reader want *more* is the summary
|
||||
succeeding at triage and then hitting a wall — there is nowhere to go deeper short of watching
|
||||
the video. That want is the feature. It is also the cheapest possible feature to satisfy
|
||||
honestly, because ADR-021 already persists the transcript: the deeper-dive runs entirely on
|
||||
stored public-content text + local models, touching **no** caption fetch and **no** YouTube.
|
||||
|
||||
**Decision.** Add a per-video chat that lets the user ask questions against a video's stored
|
||||
transcript.
|
||||
1. **Entry from the summary view only.** A "dig deeper / ask" affordance on a summarized video —
|
||||
the chat lives exactly where the "I want more" reaction happens. No standalone chat surface.
|
||||
2. **Stored-transcript-only (load-bearing constraint).** Chat is available **only** for videos
|
||||
that already have a stored transcript. It never triggers a caption fetch, so it cannot touch
|
||||
the rate gate, the 429 surface, or YouTube at all — the entire account-safety constraint that
|
||||
governs the rest of Tapir is satisfied *by construction* here, not by careful gating. (Entry
|
||||
being "from a summary" guarantees the transcript exists.) On-demand fetch for un-stored videos
|
||||
is explicitly deferred.
|
||||
3. **Model = the summary's model by default; user-switchable among the ADR-022 chain models**
|
||||
(`phi4-mini` / `gemma4-26b` / `mistral-small` to start). This is deliberate: it doubles as
|
||||
live model-comparison instrumentation — ask the same question of the same transcript under two
|
||||
models and the difference is directly felt. This is the mechanism by which the maintainer
|
||||
learns *which* model is worth defaulting to, and it is the multi-model-analysis direction
|
||||
ADR-021 anticipated, arriving as a user-facing capability.
|
||||
- Chat is a **read-bounded retrieval/QA task** (the user supplies the focus), which is
|
||||
*easier* than summarization (the model must decide what matters). So a model that summarizes
|
||||
mediocrely may chat well — chat is plausibly a partial remedy for the weak-summary case, not
|
||||
an inheritor of it.
|
||||
4. **Ephemeral chat (v1).** No persisted history; chat is per-session. Persisting per-user,
|
||||
RLS-scoped history is deferred until there is evidence anyone wants to revisit a conversation.
|
||||
5. **Chat-only, trust-the-model (v1) — with a recorded limitation.** The chat does not expose the
|
||||
raw transcript for verification in v1 (kept simple). **Known limitation:** because some
|
||||
summaries were weak-model output, the user has reason not to fully trust a chat answer's
|
||||
fidelity to the transcript, and v1 gives no in-UI way to check. The model-switcher partially
|
||||
compensates (two models disagreeing on the same question is itself a signal). A
|
||||
"show source / view transcript" verification path is the natural **v2** and is *not*
|
||||
foreclosed — ADR-021's stored transcript already makes it cheap. Recorded so v2 is a known
|
||||
next step, not a rediscovery.
|
||||
|
||||
**Why this is safe and in-scope.** It adds no caption-fetch surface (stored-only), no new
|
||||
non-RLS table (transcripts already shared per ADR-021; ephemeral chat stores nothing), and no
|
||||
auth change. It is additive to the read path. The one genuine product expansion — Tapir becomes
|
||||
an interactive transcript-QA tool, not only a summarizer — is justified by *observed* demand from
|
||||
real reading, which is exactly the kind of evidence the Stage-0 discipline asks for before
|
||||
building.
|
||||
|
||||
**Relation to the Stage-0 gate.** This is **not** a return-nudge (those stay deferred, ADR-020) —
|
||||
it adds nothing that prompts the user to return; it deepens the value *once they are already
|
||||
reading*. It does not contaminate the unprompted-return signal. If anything it strengthens the
|
||||
"useful to me" case the gate measures, by giving a good summary somewhere to lead.
|
||||
|
||||
**Reversibility.** Additive read-path feature over the unchanged engine + the ADR-021 store.
|
||||
Removing the summary-view affordance removes the feature; nothing else depends on it. Ephemeral =
|
||||
no migration, no stored state to unwind. Spec: `docs/specs/chat-with-transcript.md`.
|
||||
|
||||
---
|
||||
|
||||
## Rejected alternatives
|
||||
|
||||
Approaches considered during the 2026-06-02 planning + grill session and **deliberately not
|
||||
|
||||
Reference in New Issue
Block a user