Study Buddy on beta

A repeatable test plan and dated evidence for transcripts, streamed answers and video citations.

SP-681 · Verified 27 October 2026 · Desktop, light mode

Status as of 27 October 2026

Verdict
Core short-video flow verified. Full release acceptance remains open.
Environment
beta.skillpixel.vn, isolated QA course, public selling disabled.
Release
PR #602 merged 26 October. Active beta frontend commit and backend image tag: f305ddf3, containing merge 67290b88.
Evidence
Real beta UI, real Gemini calls, real Bunny playback. Synthetic lesson and learner. No SQL or mocked provider responses were used.
Scope
One 75-second English video, 17 transcript cues. This does not establish long-video, Vietnamese, noisy-audio, billing or lecture-video acceptance.
28Passed
3Partial
1Contract mismatch
9Not run

Why this exists

Instructors need a transcript before learners can ask questions about a video. Study Buddy can now generate that transcript or accept an SRT or VTT file. Learners get answers tied to lesson evidence and can jump to the cited time. This report checks those actions on beta and keeps the remaining release checks visible.

What changed, in one picture

1

Prepare a video

Wait until processing completes.

2

Save a transcript

Generate one, or upload an SRT or VTT file.

3

Ask a question

Read provisional text, then the validated answer.

4

Check the source

Click a timestamp to seek in the video.

Beta walkthrough

About 92 seconds, silent. The blue dot is the mouse. This is the deployed beta app with synthetic QA data. The synthetic video has a plain navy picture and spoken lesson audio.

  1. Open the ready learner panel with instructor-provided transcript attribution.
  2. Ask when to review the five new words. Watch provisional text become a validated answer.
  3. Click a timestamp and verify that the real Bunny player moves.
  4. Turn Study Buddy off, reload, then turn it on again. The transcript is reused.
  5. Choose Full course and ask about active recall. This is an extra demonstration, not a full course-retrieval benchmark.

How to test it again

  1. Start with a QA video

    Sign in as an instructor. Open a ready video lesson in an isolated course. Check that the card is off and no transcript exists. Do not use an existing customer lesson.

    Start in the lesson editor. The QA video is ready, and Study Buddy is off with no transcript.
    Start in the lesson editor. The QA video is ready, and Study Buddy is off with no transcript.
  2. Turn Study Buddy on

    Use one toggle action. Expect the pending message, then a ready transcript. This run reached Ready at the 18.07-second polling observation and saved 17 cues in English. Exact job-count and billing reconciliation remain open.

    Turn Study Buddy on. Beta shows that real transcript generation is in progress.
    Turn Study Buddy on. Beta shows that real transcript generation is in progress.
    Generation reached Ready in 18.07 seconds at the polling observation. The card shows English, 17 segments and Automatic origin.
    Generation reached Ready in 18.07 seconds at the polling observation. The card shows English, 17 segments and Automatic origin.
  3. Check uploads and source priority

    Upload a valid SRT, then a valid VTT. Check the language, segment count and instructor origin. Reject invalid timing, a file over 2 MB, the wrong extension and cues past the video end. Confirm each rejection leaves the previous transcript unchanged.

    The test upload reused the machine transcript text. Instructor origin confirms the upload path; it does not mean a human reviewed the wording.

    Upload an SRT file. The card now shows Uploaded by the instructor, with the same 17 cues.
    Upload an SRT file. The card now shows Uploaded by the instructor, with the same 17 cues.
  4. Ask as an enrolled learner

    Open the lesson in a separate learner session. Ask, “When should I review the five new words?” Confirm that partial text appears before final feedback and source controls.

    Open the published QA lesson as an enrolled synthetic learner. The panel has a question input and scope controls. Instructor attribution was checked separately.
    Open the published QA lesson as an enrolled synthetic learner. The panel has a question input and scope controls. Instructor attribution was checked separately.
    The answer is still provisional. Text appears before the final feedback controls.
    The answer is still provisional. Text appears before the final feedback controls.
  5. Check the answer and citation

    The expected intervals are one, three and seven days. Check them against the source cue from 17.8 to 23.1 seconds. Click the timestamp and watch the real player time change.

    The validated answer says one, three and seven days. Timestamp links and feedback controls are now available.
    The validated answer says one, three and seven days. Timestamp links and feedback controls are now available.
    A source click seeks to the review-interval cue at about 17.8 seconds. The player continued to advance during the check.
    A source click seeks to the review-interval cue at about 17.8 seconds. The player continued to advance during the check.
  6. Check visibility and recovery

    Turn Study Buddy off and reload as the learner. The panel must disappear while the video remains playable. Turn it on again and confirm it reuses the saved transcript. Interrupt a reply, then retry the original question explicitly.

    After Study Buddy is turned off and the learner reloads, the question panel is hidden. The transcript remains saved.
    After Study Buddy is turned off and the learner reloads, the question panel is hidden. The transcript remains saved.
  7. Check language changes

    Change only the QA course language. The old transcript must stay unchanged and the instructor must see the language warning. Restore the course language after the check.

    Changing only the QA course to Vietnamese leaves its English transcript unchanged and shows a mismatch warning. Course language was restored.
    Changing only the QA course to Vietnamese leaves its English transcript unchanged and shows a mismatch warning. Course language was restored.

Reading the screen

State or controlWhat it means
AutomaticMachine-generated transcript. The learner sees that it is not yet reviewed by the instructor.
Uploaded by the instructorA file was uploaded. This is a source label, not an independent quality score.
17 segmentsThere are 17 timestamped cues in this QA transcript.
Provisional answerText is still arriving. It has not reached final validation.
Timestamp linkA validated source time. Clicking it seeks in the current video.
Language warningCourse language and existing transcript language differ. Changing the course does not regenerate the transcript.

Why the core result can be trusted

Known answer. The QA cue says to review after one, three and seven days. The observed answer gave those same intervals. Its first citation points to that cue.

Live streaming. The browser showed provisional text at 5.554 seconds and final controls at 6.349 seconds. Measured warm API stream: first text 7.2262s; final 8.405s. No five-second performance target is claimed. Browser sampling and screenshots add overhead. These are single warm observations, not percentile benchmarks.

Real access checks. Student management attempts and unenrolled chat requests were denied. An actual other-tenant hostname was also denied. That request stopped at the entitlement check; other tenant-boundary branches remain outside this smoke test.

Follow-up and refusal. A follow-up explained active recall using lesson cues. A stock-price question was refused because the lesson does not contain that information.

Test plan and execution results

41 cases. P0 is a release gate. P1 covers edge cases and wider acceptance. Expand a case to compare its expected and observed behavior. Not run means no beta proof was collected.

41 cases shown

CaseResultSteps, expected result and evidence
REL-01
P0
Pass
Confirm merge and active beta deployment

Expected. PR 602 is merged; deployed frontend commit contains it.

Observed. PR 602 merged 26 Oct 2026 at 16:11 UTC. DigitalOcean deployment 6b424a77 is ACTIVE; frontend commit and backend image tag are f305ddf3. Git ancestry confirms that commit contains merge 67290b88.

CFG-01
P0
Pass
Open a ready video lesson

Expected. Study Buddy card shows off, no transcript, and an upload control.

Observed. Beta lesson editor shows the off/empty card and upload control.

GEN-01
P0
Partial
Turn on a ready video without a transcript

Expected. Pending state appears; exactly one job is requested.

Observed. Real beta UI changed to generating after one switch action. Job-count accounting is not verified. One UI toggle request was sent. Exact job and billed-call counts were not read from the ledger.

GEN-02
P0
Pass
Wait for real Gemini transcription

Expected. Ready state shows machine origin, language and nonempty segments.

Observed. Real transcription completed in 18.07s; origin=machine_generated, segments=17, language=en-US.

GEN-03
P0
Pass
Enable again with a saved transcript

Expected. Existing transcript is reused; no new generation is pending.

Observed. Repeated enable reuses transcript: HTTP 200

UP-01
P0
Pass
Upload a valid SRT

Expected. Instructor origin replaces machine origin; timings and cue count match.

Observed. SRT uploaded through the beta lesson editor; 17 cues, instructor origin, en-US. The file reuses machine text for format testing, not independent review.

UP-02
P1
Pass
Upload a valid VTT

Expected. VTT is parsed; instructor origin and cue count are correct.

Observed. Valid VTT upload returned HTTP 200, 17 cues and instructor origin.

UP-03
P0
Pass
Upload reversed cue timing

Expected. 400 with a stable error; previous transcript stays available.

Observed. Reverse cue: HTTP 400; saved transcript unchanged=True

UP-04
P1
Pass
Upload a file over 2 MB

Expected. 413; previous transcript stays available.

Observed. Oversized file: HTTP 413; saved transcript unchanged=True

UP-05
P1
Pass
Upload text with an unsupported extension

Expected. 400; previous transcript stays available.

Observed. Unsupported extension: HTTP 400; saved transcript unchanged=True

UP-06
P1
Pass
Upload a cue after the video ends

Expected. 400; previous transcript stays available.

Observed. Past video duration: HTTP 400; saved transcript unchanged=True

VIS-01
P0
Pass
Open the lesson while enabled and ready

Expected. Enrolled learner sees attribution, question input and suggestions.

Observed. Enrolled synthetic learner sees input, scope and instructor attribution on beta.

VIS-02
P0
Pass
Turn off, then reload as learner

Expected. Panel is hidden; video still plays; saved transcript remains.

Observed. After disabling and reload, panel is absent, saved transcript remains, and Bunny video element remains. Playback decoding is checked separately. Panel hidden while actual HTML5 playback advanced 0.01s to 1.78s, readyState 4, no playback error.

VIS-03
P0
Pass
Turn on again, then reload

Expected. Panel returns without regeneration.

Observed. Panel returns after re-enable; saved transcript reused, generation state none.

ANS-01
P0
Pass
Ask for the three review intervals

Expected. Answer includes one, three and seven days and a valid source.

Observed. Answer checked against cue 5: review after one, three and seven days.

ANS-02
P0
Pass
Ask a follow-up about active recall

Expected. Answer uses earlier context and the correct lesson evidence.

Observed. Follow-up returned a validated final answer about retrieval from memory with lesson citations. Manual spot check is recorded in the report.

ANS-03
P0
Pass
Ask an unrelated question

Expected. Answer refuses or clearly says the lesson does not support it.

Observed. Unrelated stock-price question received a lesson-scope refusal without a price.

STR-01
P0
Pass
Observe the real beta reply stream

Expected. Ordered version-1 start/status/text/final events arrive; text precedes final.

Observed. Beta endpoint returned application/x-ndjson; 9 ordered events. First event 0.5533s, first text 7.2262s, final 8.405s.

STR-02
P0
Pass
Observe learner answer during delivery

Expected. Provisional text is visible before final; final answer enables source controls.

Observed. Provisional answer observed before final feedback controls. First observed text=5.554s; final=6.349s. Browser sampling includes screenshot overhead.

CIT-01
P0
Pass
Click a timestamp in a validated answer

Expected. Bunny player seeks to the cited time; evidence supports the answer.

Observed. Clicked Jump to Spaced repetition and active recall at [00:17]; player time changed 14.75s → 19.93s; target 17s.

CAN-01
P1
Pass
Leave the lesson during a reply

Expected. Request cancels; no stale answer appears in the next lesson.

Observed. Used the course sidebar to change lessons during an answer. Stream failure observed: ['net::ERR_ABORTED']; original question remains on destination=False. Backend provider cancellation was not traced.

REC-01
P1
Partial
Interrupt the browser network during a reply

Expected. Clear retry state; retry uses the original question; no automatic paid resend.

Observed. Network interruption was injected; full retry check did not complete: TimeoutError

SEC-01
P0
Fail
Read config without authentication

Expected. 401 before any sensitive config is returned.

Observed. Anonymous config: HTTP 403 Access was safely denied with Not authenticated. The mismatch is 403 versus the planned 401, not an authentication bypass.

SEC-02
P0
Pass
Read and change config as a student

Expected. 403; student cannot manage transcript or toggle.

Observed. Student config: HTTP 403 Student toggle: HTTP 403

SEC-03
P0
Pass
Ask as a student without course enrolment

Expected. 403 before stream headers and provider work.

Observed. Unenrolled student context: HTTP 403 Unenrolled student stream: HTTP 403

SEC-04
P0
Pass
Use the QA resource under another tenant host

Expected. Request fails and returns no QA lesson or transcript.

Observed. Actual other-tenant hostname returned HTTP 403. Request was denied by the other tenant entitlement. This does not isolate every ownership or membership branch. A header-only probe on the default host was discarded because the actual Host takes precedence.

SEC-05
P1
Pass
Request a nonexistent resource

Expected. 404 without leaking another resource.

Observed. Unknown video: HTTP 404

VAL-01
P1
Pass
Send an empty question

Expected. 422 before a provider call.

Observed. Blank question: HTTP 422

SRC-01
P1
Pass
Try JSON replacement after instructor upload

Expected. 409; instructor transcript remains the source.

Observed. JSON/API transcript replacement after instructor upload returned HTTP 409.

CAP-01
P1
Partial
Inspect Bunny captions after saving transcript

Expected. Caption track is attached in transcript language and selectable.

Observed. Bunny exposes caption tracks [{'language': 'en', 'label': 'English'}]; HTML5 readiness=4, duration=75.264s. English caption file fetched with HTTP 200. Player caption-menu selection was not exercised.

LANG-01
P1
Pass
Change course language after an upload

Expected. Existing transcript stays unchanged; instructor sees a mismatch warning.

Observed. Changed only the QA course to Vietnamese. Existing en-US transcript and update timestamp stayed unchanged; beta instructor card displayed the language warning. Restored course language to en-US afterward.

LEC-01
P0
Not run
Create a fresh lecture-video lesson in the QA course

Expected. Narration transcript is saved automatically with lecture_script origin.

Observed. Fresh lecture-video generation was not run. The uploaded-video path does not prove automatic lecture_script reuse.

ERR-01
P1
Not run
Use a QA-only failed transcription fixture, then retry

Expected. Readable error; Retry succeeds; video remains playable.

Observed. No isolated failed-generation fixture. The shared tenant configuration was not changed.

QUO-01
P0
Not run
Exhaust credit on a separate QA tenant

Expected. 429 AI_ALLOWANCE_USED before stream headers; no provider work.

Observed. No separate quota tenant. Shared beta credit was not exhausted.

KEY-01
P1
Not run
Use a separate own-key tenant without Gemini

Expected. Upload remains available; automatic transcription explains the missing key.

Observed. No separate own-key/no-Gemini tenant was configured.

RATE-01
P1
Not run
Reach the configured request rate on a separate QA tenant

Expected. 429; no second billed request is started.

Observed. Shared beta rate limits were not driven to exhaustion.

RACE-01
P1
Not run
Upload while a QA transcription is pending

Expected. Instructor upload wins; late machine result cannot overwrite it.

Observed. Pending-generation/upload race was not injected on beta.

PERF-01
P1
Pass
Measure first event, first text and final completion

Expected. Record actual timings; do not claim the deferred five-second target.

Observed. Measured warm API stream: first text 7.2262s; final 8.405s. No five-second performance target is claimed.

BILL-01
P1
Not run
Compare QA operation usage with ledger and provider invoice

Expected. Call count, token usage and charged amount reconcile.

Observed. Provider invoice and operation-level ledger reconciliation were not performed.

QUAL-01
P1
Not run
Grade Vietnamese, noisy and long audio with an independent reviewer

Expected. Use declared thresholds and report every failure; no broad quality claim from this short clip.

Observed. Only one short English synthetic clip was used. No independent human grading, long-video or Vietnamese/noisy-audio acceptance.

FB-01
P1
Not run
Vote on one validated answer in a tagged QA session

Expected. Expected rating/answer/lesson/request identifiers arrive; no conversation text.

Observed. No QA-tagged live feedback event was sent or checked in PostHog.

Known limits and open gates

Decisions taken

QuestionChoice
Where to test?An isolated beta QA course, public selling disabled. Existing lessons and shared credit settings were not changed.
Where to publish?Hoan’s Personal Cloudflare account, as requested. This site is separate from the earlier local LangGraph report.
What counts as a pass?Dated live evidence for the stated case. Local automated checks, a merge and a deployed image alone do not prove a beta flow.
What remains after testing?QA course, synthetic uploaded video, one video lesson, one navigation reading if created, and one enrolled synthetic learner. Private session files stay outside the report and repository.

Rollout checklist