adelevett commited on
Commit
f40cbb1
·
1 Parent(s): ddb1283

update 3rd sample

Browse files
.gitignore CHANGED
@@ -6,3 +6,4 @@ extract.py
6
  update_demo.py
7
  .env
8
  test*
 
 
6
  update_demo.py
7
  .env
8
  test*
9
+ archive/
app.py CHANGED
@@ -42,6 +42,15 @@ def get_demo_2_html() -> str:
42
  chat_data = []
43
  return load_template_with_data("NtRf4icqE7o", chat_data)
44
 
 
 
 
 
 
 
 
 
 
45
  # Global store for custom simulations
46
  custom_simulation_store = {
47
  "video_id": "",
@@ -53,6 +62,8 @@ def play_simulation_selection(selection: str) -> str:
53
  return get_demo_html()
54
  elif selection == "Carl Sagan Demon-Haunted World (Demo)":
55
  return get_demo_2_html()
 
 
56
  elif selection == "My Custom Simulation":
57
  if custom_simulation_store["video_id"] and custom_simulation_store["chat_data"]:
58
  return load_template_with_data(custom_simulation_store["video_id"], custom_simulation_store["chat_data"])
@@ -60,7 +71,7 @@ def play_simulation_selection(selection: str) -> str:
60
  return "<div style='color:#ff0055; text-align:center; padding:50px; font-family:sans-serif;'>No custom simulation has been generated yet. Please choose 'Configure Custom Solution'.</div>"
61
  return ""
62
 
63
- def handle_generation(yt_url: str, pdf_file, doc_text: str, srt_text: str, hf_token: str):
64
  # 1. Validate YouTube Link
65
  video_id = extract_youtube_video_id(yt_url)
66
  if not video_id:
@@ -107,7 +118,8 @@ def handle_generation(yt_url: str, pdf_file, doc_text: str, srt_text: str, hf_to
107
  doc_text=document_content,
108
  doc_path=doc_path,
109
  transcript_text=manual_transcript,
110
- token=token
 
111
  )
112
 
113
  # Save to global store
@@ -126,7 +138,7 @@ def handle_generation(yt_url: str, pdf_file, doc_text: str, srt_text: str, hf_to
126
  return (
127
  new_html,
128
  success_msg,
129
- gr.update(choices=["Steve Jobs 1983 Speech (Demo)", "Carl Sagan Demon-Haunted World (Demo)", "My Custom Simulation"], value="My Custom Simulation")
130
  )
131
  except Exception as e:
132
  error_msg = f"### ❌ Error running pipeline\n{e}"
@@ -136,6 +148,12 @@ def handle_generation(yt_url: str, pdf_file, doc_text: str, srt_text: str, hf_to
136
  "Please copy and paste the video transcript or subtitles into the 'Manual Captions / Transcript Paste' "
137
  "input box below to bypass the block."
138
  )
 
 
 
 
 
 
139
  return (
140
  gr.update(),
141
  error_msg,
@@ -254,7 +272,7 @@ with gr.Blocks(title="ReLiveStream - Interactive Replay", theme=custom_theme, cs
254
  with gr.TabItem("🎭 Theater Mode"):
255
  with gr.Row():
256
  sim_selector = gr.Radio(
257
- choices=["Steve Jobs 1983 Speech (Demo)", "Carl Sagan Demon-Haunted World (Demo)", "My Custom Simulation"],
258
  value="Steve Jobs 1983 Speech (Demo)",
259
  label="Choose Simulation to Play",
260
  interactive=True
@@ -316,6 +334,7 @@ with gr.Blocks(title="ReLiveStream - Interactive Replay", theme=custom_theme, cs
316
  )
317
 
318
  generate_btn = gr.Button("🚀 Generate Simulation", variant="primary")
 
319
 
320
  status_output = gr.Markdown(value="*Awaiting configuration...*")
321
 
@@ -327,7 +346,8 @@ with gr.Blocks(title="ReLiveStream - Interactive Replay", theme=custom_theme, cs
327
  pdf_input,
328
  fallback_text_input,
329
  fallback_srt_input,
330
- token_input
 
331
  ],
332
  outputs=[
333
  player_frame,
 
42
  chat_data = []
43
  return load_template_with_data("NtRf4icqE7o", chat_data)
44
 
45
+ def get_demo_3_html() -> str:
46
+ demo_json_path = os.path.join(os.path.dirname(__file__), "sample", "demo_chat_3.json")
47
+ if os.path.exists(demo_json_path):
48
+ with open(demo_json_path, "r", encoding="utf-8") as f:
49
+ chat_data = json.load(f)
50
+ else:
51
+ chat_data = []
52
+ return load_template_with_data("g6eQMrA1_-I", chat_data)
53
+
54
  # Global store for custom simulations
55
  custom_simulation_store = {
56
  "video_id": "",
 
62
  return get_demo_html()
63
  elif selection == "Carl Sagan Demon-Haunted World (Demo)":
64
  return get_demo_2_html()
65
+ elif selection == "Edward Teller - Schrödinger's Cat (Demo)":
66
+ return get_demo_3_html()
67
  elif selection == "My Custom Simulation":
68
  if custom_simulation_store["video_id"] and custom_simulation_store["chat_data"]:
69
  return load_template_with_data(custom_simulation_store["video_id"], custom_simulation_store["chat_data"])
 
71
  return "<div style='color:#ff0055; text-align:center; padding:50px; font-family:sans-serif;'>No custom simulation has been generated yet. Please choose 'Configure Custom Solution'.</div>"
72
  return ""
73
 
74
+ def handle_generation(yt_url: str, pdf_file, doc_text: str, srt_text: str, hf_token: str, use_ocr: bool = False):
75
  # 1. Validate YouTube Link
76
  video_id = extract_youtube_video_id(yt_url)
77
  if not video_id:
 
118
  doc_text=document_content,
119
  doc_path=doc_path,
120
  transcript_text=manual_transcript,
121
+ token=token,
122
+ use_ocr=use_ocr
123
  )
124
 
125
  # Save to global store
 
138
  return (
139
  new_html,
140
  success_msg,
141
+ gr.update(choices=["Steve Jobs 1983 Speech (Demo)", "Carl Sagan Demon-Haunted World (Demo)", "Edward Teller - Schrödinger's Cat (Demo)", "My Custom Simulation"], value="My Custom Simulation")
142
  )
143
  except Exception as e:
144
  error_msg = f"### ❌ Error running pipeline\n{e}"
 
148
  "Please copy and paste the video transcript or subtitles into the 'Manual Captions / Transcript Paste' "
149
  "input box below to bypass the block."
150
  )
151
+ elif "Content safety check failed" in str(e):
152
+ error_msg += (
153
+ "\n\n**Tip**: This combination of video and reference document was flagged by an "
154
+ "automated safety check before any chat was generated. Try a different reference "
155
+ "document or a different video."
156
+ )
157
  return (
158
  gr.update(),
159
  error_msg,
 
272
  with gr.TabItem("🎭 Theater Mode"):
273
  with gr.Row():
274
  sim_selector = gr.Radio(
275
+ choices=["Steve Jobs 1983 Speech (Demo)", "Carl Sagan Demon-Haunted World (Demo)", "Edward Teller - Schrödinger's Cat (Demo)", "My Custom Simulation"],
276
  value="Steve Jobs 1983 Speech (Demo)",
277
  label="Choose Simulation to Play",
278
  interactive=True
 
334
  )
335
 
336
  generate_btn = gr.Button("🚀 Generate Simulation", variant="primary")
337
+ use_ocr_checkbox = gr.Checkbox(label="Enable OCR for PDFs (slow — use only for scanned/image-based PDFs)", value=False)
338
 
339
  status_output = gr.Markdown(value="*Awaiting configuration...*")
340
 
 
346
  pdf_input,
347
  fallback_text_input,
348
  fallback_srt_input,
349
+ token_input,
350
+ use_ocr_checkbox
351
  ],
352
  outputs=[
353
  player_frame,
pipeline.py CHANGED
@@ -9,7 +9,15 @@ from concurrent.futures import ThreadPoolExecutor
9
 
10
  DEFAULT_HF_TOKEN = os.environ.get("HF_TOKEN", "")
11
  FLASH_MODEL = "openai/gpt-oss-120b:fastest"
12
- PRO_MODEL = "deepseek-ai/DeepSeek-V4-Pro:fastest"
 
 
 
 
 
 
 
 
13
 
14
  def extract_youtube_video_id(url: str) -> str:
15
  url = url.strip()
@@ -24,6 +32,38 @@ def extract_youtube_video_id(url: str) -> str:
24
  return match.group(1)
25
  return ""
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  def format_timestamp(seconds: float) -> str:
28
  mins = int(seconds // 60)
29
  secs = int(seconds % 60)
@@ -195,6 +235,21 @@ def build_anchor_index(transcript_entries: list) -> list:
195
  return anchors
196
 
197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  def map_anchors_to_segments(anchors: list, segments: list) -> dict:
199
  """Assign each anchor to exactly one topic segment.
200
 
@@ -399,16 +454,29 @@ def stage_1a_segment_transcript(transcript_text: str, token: str) -> list:
399
  return json.loads(cleaned)
400
 
401
  # --- STAGE 2: Generate all draft comments (Pro model) ---
402
- def stage_2_generate_all_drafts(segments: list, doc_text: str, token: str, anchor_map: dict = None, all_anchors: list = None) -> list:
 
 
403
  """Generate draft chat messages for all segments.
404
 
405
  anchor_map: {seg_idx: [anchor_id, ...]} from map_anchors_to_segments.
406
  all_anchors: full anchor list from build_anchor_index (for text lookup).
407
  When both are provided, each segment's anchor list is injected into the
408
  prompt so the model can pick a concrete timestamped moment per message.
 
 
 
 
 
 
 
 
 
 
409
  """
410
  # Build anchor lookup if available.
411
  anchors_by_id = {a["anchor_id"]: a for a in (all_anchors or [])}
 
412
 
413
  system_prompt = (
414
  "You are simulating audience chat reactions for a livestream of an educational or historical video.\n"
@@ -427,8 +495,45 @@ def stage_2_generate_all_drafts(segments: list, doc_text: str, token: str, ancho
427
  "- Maintain diverse livestream audience personas: some are experts reading deeply into philosophical tension, some take things entirely at face value, some only react emotionally or to video aesthetics, some use sarcasm/memes.\n\n"
428
  "REPLY THREADING (optional):\n"
429
  "- A message MAY include a 'reply_to' field containing another message's 'id' from the same or immediately preceding anchor.\n"
430
- "- A reply must NEVER reference a message anchored to a later anchor than itself.\n\n"
431
- "FORMAT: Return a JSON list of objects, one per segment:\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  "{\n"
433
  " \"_internal_logic\": \"How this segment relates to document sub-claims, or 'None' if off-topic.\",\n"
434
  " \"messages\": [\n"
@@ -453,11 +558,13 @@ def stage_2_generate_all_drafts(segments: list, doc_text: str, token: str, ancho
453
  for aid in anchor_ids:
454
  a = anchors_by_id.get(aid)
455
  if a:
456
- anchor_lines.append(f" [{aid}] {a['start']:.1f}s: {a['text'][:80]}")
 
457
  if anchor_lines:
458
  seg_header += "\nANCHOR MOMENTS (pick one per message):\n" + "\n".join(anchor_lines)
459
  return seg_header
460
 
 
461
  segments_text = "\n\n".join([format_segment(i, seg) for i, seg in enumerate(segments)])
462
 
463
  user_prompt = (
@@ -489,7 +596,8 @@ def stage_3_stylize_segment(draft_data: dict, token: str) -> dict:
489
  "2. PRESERVE USERNAMES: You MUST use the exact usernames provided in the draft. Do not invent new ones.\n"
490
  "3. PRESERVE STRUCTURAL FIELDS: Keep 'id', 'anchor_id', and 'reply_to' (if present) on every message exactly as given. Do not rename, remove, or alter these fields.\n"
491
  "4. ADD FLOURISH: Make them short, concise, and lively. Inject internet slang (e.g., lol, wtf, lmao, fr, no cap, ngl, bruh) and standard emotes (e.g., LUL, PogChamp, Kappa, MonkaS, BibleThump, 5Head, Pog, Pepega) where appropriate, but don't overdo it.\n"
492
- "5. Avoid sounding like AI-generated summaries. Do not append emotes to every single message.\n\n"
 
493
  "Return ONLY the updated JSON with the exact same structure. Do not include markdown wraps."
494
  )
495
  user_prompt = f"Draft JSON:\n{json.dumps(draft_data)}"
@@ -502,6 +610,134 @@ def stage_3_stylize_segment(draft_data: dict, token: str) -> dict:
502
  cleaned = clean_json_text(content)
503
  return json.loads(cleaned)
504
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
505
  # --- Parallel Tasks ---
506
  def _fetch_and_segment_transcript(video_id: str, transcript_text: str, token: str) -> tuple:
507
  """Return (segments, raw_transcript) so the caller can build the anchor index."""
@@ -525,16 +761,16 @@ def _fetch_and_segment_transcript(video_id: str, transcript_text: str, token: st
525
  segments = stage_1a_segment_transcript(transcript_text_formatted, token)
526
  return segments, raw_transcript
527
 
528
- def _extract_document_text(doc_text: str, doc_path: str) -> str:
529
  if doc_path:
530
  print(f"Extracting text from PDF: {doc_path}...")
531
- return pymupdf4llm.to_markdown(doc_path)
532
  if doc_text:
533
  return doc_text
534
  raise ValueError("Either doc_text or doc_path must be provided.")
535
 
536
  # --- Full Pipeline Orchestration ---
537
- def run_livestream_pipeline(video_id: str, doc_text: str = None, doc_path: str = None, transcript_text: str = None, token: str = None) -> list:
538
  """Run the full pipeline and return a flat list of messages sorted by displayTime.
539
 
540
  Return value shape changed from list[segment_dict] to list[message_dict].
@@ -549,28 +785,45 @@ def run_livestream_pipeline(video_id: str, doc_text: str = None, doc_path: str =
549
  "or provide it in the input box."
550
  )
551
 
552
- print("Starting parallel execution of Document Extraction and Transcript Segmentation...")
553
- with ThreadPoolExecutor(max_workers=2) as executor:
554
- fut_doc = executor.submit(_extract_document_text, doc_text, doc_path)
555
  fut_seg = executor.submit(_fetch_and_segment_transcript, video_id, transcript_text, token)
 
556
 
557
  extracted_doc_text = fut_doc.result()
558
  segments, raw_transcript = fut_seg.result()
 
559
 
560
  print(f"Segmented into {len(segments)} blocks.")
 
 
 
 
561
 
562
  # Build anchor index deterministically from raw transcript (no LLM call).
563
  anchors = build_anchor_index(raw_transcript)
564
  anchor_map = map_anchors_to_segments(anchors, segments)
565
  anchors_by_id = {a["anchor_id"]: a for a in anchors}
566
  valid_anchor_ids = set(anchors_by_id.keys())
567
- print(f"Built anchor index: {len(anchors)} anchors.")
 
 
 
 
 
 
 
 
 
 
568
 
569
  # Stage 2: Single Pro model call for all drafting.
570
  print("Stage 2: Generating draft comments for all segments (Pro model)...")
571
  draft_segments = stage_2_generate_all_drafts(
572
  segments, extracted_doc_text, token,
573
- anchor_map=anchor_map, all_anchors=anchors
 
574
  )
575
 
576
  # Validate Stage 2 output before passing downstream.
@@ -591,11 +844,16 @@ def run_livestream_pipeline(video_id: str, doc_text: str = None, doc_path: str =
591
  for fut in futures:
592
  final_segments.append(fut.result())
593
 
594
- # Flatten all messages, compute displayTime, sort numerically.
595
  all_messages = []
596
  for seg in final_segments:
597
  all_messages.extend(seg.get("messages", []))
598
 
 
 
 
 
 
599
  all_messages = compute_display_times(all_messages, anchors_by_id)
600
  all_messages.sort(key=lambda m: m.get("displayTime", 0))
601
  return all_messages
 
9
 
10
  DEFAULT_HF_TOKEN = os.environ.get("HF_TOKEN", "")
11
  FLASH_MODEL = "openai/gpt-oss-120b:fastest"
12
+ PRO_MODEL = "zai-org/GLM-4.7:fastest"
13
+ SAFETY_MODEL = "openai/gpt-oss-safeguard-20b"
14
+
15
+ # Anchors that start before this many seconds are considered part of the
16
+ # stream's "intro window": real viewers haven't processed any spoken content
17
+ # yet, so Stage 2 chat for these anchors should skew toward arrival/meta
18
+ # chatter rather than fully-formed topic takes. See select_intro_anchors()
19
+ # and the INTRO-WINDOW HANDLING clause in stage_2_generate_all_drafts().
20
+ INTRO_WINDOW_SECONDS = 10.0
21
 
22
  def extract_youtube_video_id(url: str) -> str:
23
  url = url.strip()
 
32
  return match.group(1)
33
  return ""
34
 
35
+ def fetch_video_metadata(video_id: str, timeout: float = 5.0) -> dict:
36
+ """Fetch lightweight public metadata (title, channel/author name) for a
37
+ YouTube video via the no-auth oEmbed endpoint.
38
+
39
+ This is the source of the "video title / channel" context used by:
40
+ - stage_2_generate_all_drafts(): to optionally gate identity-aware
41
+ intro-window messages (e.g. recognizing a well-known speaker).
42
+ - check_content_safety(): as extra context for the pre-pipeline
43
+ safety gate.
44
+
45
+ Returns {"title": ..., "author_name": ...} on success, or {} if the
46
+ request fails for any reason (network error, invalid video id, 404,
47
+ etc.). A failure here is non-fatal — callers must treat missing/empty
48
+ metadata as "identity unknown" and behave conservatively (no guessing).
49
+ """
50
+ try:
51
+ resp = requests.get(
52
+ "https://www.youtube.com/oembed",
53
+ params={"url": f"https://www.youtube.com/watch?v={video_id}", "format": "json"},
54
+ timeout=timeout,
55
+ )
56
+ resp.raise_for_status()
57
+ data = resp.json()
58
+ return {
59
+ "title": data.get("title", "") or "",
60
+ "author_name": data.get("author_name", "") or "",
61
+ }
62
+ except Exception as e:
63
+ print(f"oEmbed metadata fetch failed for video '{video_id}': {e}")
64
+ return {}
65
+
66
+
67
  def format_timestamp(seconds: float) -> str:
68
  mins = int(seconds // 60)
69
  secs = int(seconds % 60)
 
235
  return anchors
236
 
237
 
238
+ def select_intro_anchors(anchors: list, window_seconds: float = INTRO_WINDOW_SECONDS) -> set:
239
+ """Return the set of anchor_ids whose start falls within the stream's
240
+ "intro window" (the first `window_seconds` seconds of the video).
241
+
242
+ Pure and deterministic: anchor-list-in, anchor-id-set-out. No LLM calls,
243
+ no I/O. At the default 5-10s anchor size from build_anchor_index(), a
244
+ 20s window typically covers the first 2-5 anchors.
245
+
246
+ Used by stage_2_generate_all_drafts() to bias early chat toward
247
+ arrival/meta chatter instead of fully-formed topic reactions, since real
248
+ viewers haven't processed any spoken content in the first ~20 seconds.
249
+ """
250
+ return {a["anchor_id"] for a in anchors if float(a["start"]) < window_seconds}
251
+
252
+
253
  def map_anchors_to_segments(anchors: list, segments: list) -> dict:
254
  """Assign each anchor to exactly one topic segment.
255
 
 
454
  return json.loads(cleaned)
455
 
456
  # --- STAGE 2: Generate all draft comments (Pro model) ---
457
+ def stage_2_generate_all_drafts(segments: list, doc_text: str, token: str, anchor_map: dict = None,
458
+ all_anchors: list = None, intro_anchor_ids: set = None,
459
+ video_metadata: dict = None) -> list:
460
  """Generate draft chat messages for all segments.
461
 
462
  anchor_map: {seg_idx: [anchor_id, ...]} from map_anchors_to_segments.
463
  all_anchors: full anchor list from build_anchor_index (for text lookup).
464
  When both are provided, each segment's anchor list is injected into the
465
  prompt so the model can pick a concrete timestamped moment per message.
466
+
467
+ intro_anchor_ids: set of anchor_ids from select_intro_anchors(), i.e.
468
+ anchors within the stream's first ~20s. These are tagged [INTRO] in the
469
+ anchor lists and given special handling instructions (see
470
+ INTRO-WINDOW HANDLING below).
471
+
472
+ video_metadata: optional {"title": ..., "author_name": ...} from
473
+ fetch_video_metadata(). When present with a non-empty title/channel, the
474
+ model may (optionally) generate up to 1-2 identity-aware intro messages
475
+ if the speaker's identity is unambiguous; otherwise it must not guess.
476
  """
477
  # Build anchor lookup if available.
478
  anchors_by_id = {a["anchor_id"]: a for a in (all_anchors or [])}
479
+ intro_anchor_ids = intro_anchor_ids or set()
480
 
481
  system_prompt = (
482
  "You are simulating audience chat reactions for a livestream of an educational or historical video.\n"
 
495
  "- Maintain diverse livestream audience personas: some are experts reading deeply into philosophical tension, some take things entirely at face value, some only react emotionally or to video aesthetics, some use sarcasm/memes.\n\n"
496
  "REPLY THREADING (optional):\n"
497
  "- A message MAY include a 'reply_to' field containing another message's 'id' from the same or immediately preceding anchor.\n"
498
+ "- A reply must NEVER reference a message anchored to a later anchor than itself.\n"
499
+ )
500
+
501
+ if intro_anchor_ids:
502
+ title = (video_metadata or {}).get("title", "").strip()
503
+ author = (video_metadata or {}).get("author_name", "").strip()
504
+
505
+ if title or author:
506
+ channel_part = f" from channel \"{author}\"" if author else ""
507
+ identity_clause = (
508
+ f"- IDENTITY-AWARE INTRO MESSAGES (OPTIONAL): The video title is \"{title or 'unknown'}\"{channel_part}. "
509
+ "If — and only if — this title, channel, or the reference document make the speaker's "
510
+ "identity or significance unambiguous, you MAY include up to 1-2 [INTRO]-anchored "
511
+ "messages reacting to who the speaker is or why they matter (e.g. recognizing a "
512
+ "well-known figure). Do not guess or assert identity beyond what these sources support.\n"
513
+ )
514
+ else:
515
+ identity_clause = (
516
+ "- IDENTITY-AWARE INTRO MESSAGES: No reliable video title/channel metadata is available. "
517
+ "Do NOT include any [INTRO]-anchored messages that guess or assert who the speaker is — "
518
+ "keep all [INTRO] messages generic arrival/meta chatter.\n"
519
+ )
520
+
521
+ system_prompt += (
522
+ "\nINTRO-WINDOW HANDLING:\n"
523
+ "- Anchors marked [INTRO] in the ANCHOR MOMENTS lists below fall within the stream's first "
524
+ "~20 seconds. Real viewers haven't processed any spoken content yet at this point — they're "
525
+ "still arriving, reading the title, or reacting to who/what is on screen.\n"
526
+ "- For messages anchored to an [INTRO] anchor, 80-90% should be arrival/meta chatter — the "
527
+ "stream just starting, 'is this live', reactions to the speaker's appearance, audio/video "
528
+ "quality, or production era, 'lol first', generic anticipation, emotes — NOT engagement "
529
+ "with the spoken content. This OVERRIDES the normal 50% off-topic quota for these messages.\n"
530
+ "- Set '_internal_logic' to \"None\" for any segment whose messages are dominated by "
531
+ "[INTRO] anchors, regardless of any document tie.\n"
532
+ f"{identity_clause}"
533
+ )
534
+
535
+ system_prompt += (
536
+ "\nFORMAT: Return a JSON list of objects, one per segment:\n"
537
  "{\n"
538
  " \"_internal_logic\": \"How this segment relates to document sub-claims, or 'None' if off-topic.\",\n"
539
  " \"messages\": [\n"
 
558
  for aid in anchor_ids:
559
  a = anchors_by_id.get(aid)
560
  if a:
561
+ intro_tag = " [INTRO]" if aid in intro_anchor_ids else ""
562
+ anchor_lines.append(f" [{aid}]{intro_tag} {a['start']:.1f}s: {a['text'][:80]}")
563
  if anchor_lines:
564
  seg_header += "\nANCHOR MOMENTS (pick one per message):\n" + "\n".join(anchor_lines)
565
  return seg_header
566
 
567
+
568
  segments_text = "\n\n".join([format_segment(i, seg) for i, seg in enumerate(segments)])
569
 
570
  user_prompt = (
 
596
  "2. PRESERVE USERNAMES: You MUST use the exact usernames provided in the draft. Do not invent new ones.\n"
597
  "3. PRESERVE STRUCTURAL FIELDS: Keep 'id', 'anchor_id', and 'reply_to' (if present) on every message exactly as given. Do not rename, remove, or alter these fields.\n"
598
  "4. ADD FLOURISH: Make them short, concise, and lively. Inject internet slang (e.g., lol, wtf, lmao, fr, no cap, ngl, bruh) and standard emotes (e.g., LUL, PogChamp, Kappa, MonkaS, BibleThump, 5Head, Pog, Pepega) where appropriate, but don't overdo it.\n"
599
+ "5. Avoid sounding like AI-generated summaries. Do not append emotes to every single message.\n"
600
+ "6. SAFETY PASS: If any message crosses from edgy/sarcastic banter into harassment, slurs, hate speech, or denigration of real people or groups, rewrite it to keep the same persona and sentiment but remove the harmful element (e.g. turn a slur-based insult into a milder sarcastic jab). Never introduce new harmful content. If a message truly cannot be salvaged this way, replace its 'text' with a generic on-theme reaction instead.\n\n"
601
  "Return ONLY the updated JSON with the exact same structure. Do not include markdown wraps."
602
  )
603
  user_prompt = f"Draft JSON:\n{json.dumps(draft_data)}"
 
610
  cleaned = clean_json_text(content)
611
  return json.loads(cleaned)
612
 
613
+ # --- Safety gates ---
614
+ def check_content_safety(doc_text: str, video_metadata: dict, token: str) -> tuple:
615
+ """Pre-pipeline hard-stop gate (runs before Stage 2's expensive Pro call).
616
+
617
+ Classifies whether the reference document — combined with whatever video
618
+ title/channel context is available — is appropriate source material for
619
+ a simulated livestream chat. Returns (is_safe: bool, reason: str).
620
+
621
+ Intentionally coarse: a single Flash-model classification call, not a
622
+ per-message filter (see final_safety_scan() for the post-generation
623
+ pass). Exists to hard-stop on inputs whose "natural" simulated chat would
624
+ likely be hate speech, harassment of real people/groups, glorification of
625
+ or instructions for violence/self-harm, or sexual content involving
626
+ minors. General controversial-but-legitimate material (politics, science
627
+ controversies, history of atrocities discussed academically, etc.) is
628
+ SAFE and should pass.
629
+
630
+ Design note: fails OPEN (treats classifier errors as "safe") so a
631
+ transient API hiccup doesn't block legitimate users. The decision (or
632
+ failure) is always logged.
633
+ """
634
+ title = (video_metadata or {}).get("title", "").strip()
635
+ author = (video_metadata or {}).get("author_name", "").strip()
636
+
637
+ system_prompt = (
638
+ "You are a content-safety gate for an app that generates SIMULATED livestream chat "
639
+ "reactions to educational/informational videos, based on a reference document.\n"
640
+ "Given a video's title/channel (if known) and an excerpt of the reference document, "
641
+ "decide whether this is appropriate source material for that simulation.\n\n"
642
+ "Mark unsafe ONLY if the natural simulated chat reactions to this material would likely "
643
+ "include hate speech, harassment of real people or groups, glorification of or "
644
+ "instructions for violence or self-harm, or sexual content involving minors. General "
645
+ "controversial-but-legitimate topics (politics, policy debates, science controversies, "
646
+ "history of atrocities discussed academically, etc.) are SAFE.\n\n"
647
+ "Respond with ONLY a JSON object: {\"safe\": true|false, \"reason\": \"<one short sentence>\"}. "
648
+ "Do not include markdown wraps or other text."
649
+ )
650
+ excerpt = (doc_text or "")[:4000]
651
+ user_prompt = (
652
+ f"Video title: {title or '(unknown)'}\n"
653
+ f"Channel: {author or '(unknown)'}\n\n"
654
+ f"Reference document excerpt:\n{excerpt}"
655
+ )
656
+
657
+ try:
658
+ content = call_hf_router(SAFETY_MODEL, [
659
+ {"role": "system", "content": system_prompt},
660
+ {"role": "user", "content": user_prompt},
661
+ ], token)
662
+ result = json.loads(clean_json_text(content))
663
+ is_safe = bool(result.get("safe", True))
664
+ reason = result.get("reason", "")
665
+ if not is_safe:
666
+ print(f"Content safety gate REJECTED input: {reason}")
667
+ return is_safe, reason
668
+ except Exception as e:
669
+ print(f"Content safety gate failed to run ({e}); failing open (treating as safe).")
670
+ return True, ""
671
+
672
+
673
+ def final_safety_scan(messages: list, token: str) -> list:
674
+ """Aggregate post-generation moderation pass over all flattened,
675
+ stylized messages.
676
+
677
+ Stage 3 already asks the Flash model to soften individual messages (see
678
+ its SAFETY PASS instruction), but that runs per-segment and can miss
679
+ patterns only visible across the whole chat (e.g. repeated harassment of
680
+ the same target spread across segments). This is one additional Flash
681
+ call over the full message list as a second net.
682
+
683
+ For each message, the model returns one of:
684
+ - "keep" -> message is left unchanged.
685
+ - "replace" -> message['text'] is swapped for the supplied 'replacement'
686
+ (same persona/sentiment, harmful element removed).
687
+ - "drop" -> message is removed from the output entirely.
688
+
689
+ Fails OPEN (returns `messages` unchanged) on any classifier or parsing
690
+ error, since this is a best-effort secondary net rather than the primary
691
+ gate (see check_content_safety for the pre-pipeline hard stop).
692
+ """
693
+ if not messages:
694
+ return messages
695
+
696
+ system_prompt = (
697
+ "You are a final moderation pass for SIMULATED livestream chat messages (fictional "
698
+ "audience reactions, not real users).\n"
699
+ "For EVERY message below, decide one action:\n"
700
+ "- \"keep\": fine as-is. Edgy/sarcastic humor, strong opinions, and in-group banter are fine.\n"
701
+ "- \"replace\": the message crosses into harassment, slurs, hate speech, or denigration of "
702
+ "real people or groups. Provide a 'replacement' string with the same persona/sentiment but "
703
+ "with the harmful element removed.\n"
704
+ "- \"drop\": the message is irredeemable and should be removed entirely.\n\n"
705
+ "Return ONLY a JSON list, one entry per input message, in any order:\n"
706
+ "[{\"id\": \"<id>\", \"action\": \"keep|replace|drop\", \"replacement\": \"<only if action=replace>\"}]\n"
707
+ "Do not include markdown wraps or other text."
708
+ )
709
+ payload = [{"id": m.get("id"), "text": m.get("text", "")} for m in messages]
710
+ user_prompt = f"Messages:\n{json.dumps(payload, ensure_ascii=False)}"
711
+
712
+ try:
713
+ content = call_hf_router(SAFETY_MODEL, [
714
+ {"role": "system", "content": system_prompt},
715
+ {"role": "user", "content": user_prompt},
716
+ ], token)
717
+ decisions = json.loads(clean_json_text(content))
718
+ decisions_by_id = {d.get("id"): d for d in decisions if isinstance(d, dict)}
719
+ except Exception as e:
720
+ print(f"Final safety scan failed to run ({e}); failing open (returning messages unchanged).")
721
+ return messages
722
+
723
+ result = []
724
+ dropped, replaced = 0, 0
725
+ for msg in messages:
726
+ decision = decisions_by_id.get(msg.get("id"))
727
+ action = (decision or {}).get("action", "keep")
728
+ if action == "drop":
729
+ dropped += 1
730
+ continue
731
+ if action == "replace" and decision.get("replacement"):
732
+ msg = dict(msg)
733
+ msg["text"] = decision["replacement"]
734
+ replaced += 1
735
+ result.append(msg)
736
+
737
+ if dropped or replaced:
738
+ print(f"Final safety scan: dropped {dropped}, replaced {replaced} of {len(messages)} messages.")
739
+ return result
740
+
741
  # --- Parallel Tasks ---
742
  def _fetch_and_segment_transcript(video_id: str, transcript_text: str, token: str) -> tuple:
743
  """Return (segments, raw_transcript) so the caller can build the anchor index."""
 
761
  segments = stage_1a_segment_transcript(transcript_text_formatted, token)
762
  return segments, raw_transcript
763
 
764
+ def _extract_document_text(doc_text: str, doc_path: str, use_ocr: bool = False) -> str:
765
  if doc_path:
766
  print(f"Extracting text from PDF: {doc_path}...")
767
+ return pymupdf4llm.to_markdown(doc_path, use_ocr=use_ocr)
768
  if doc_text:
769
  return doc_text
770
  raise ValueError("Either doc_text or doc_path must be provided.")
771
 
772
  # --- Full Pipeline Orchestration ---
773
+ def run_livestream_pipeline(video_id: str, doc_text: str = None, doc_path: str = None, transcript_text: str = None, token: str = None, use_ocr: bool = False) -> list:
774
  """Run the full pipeline and return a flat list of messages sorted by displayTime.
775
 
776
  Return value shape changed from list[segment_dict] to list[message_dict].
 
785
  "or provide it in the input box."
786
  )
787
 
788
+ print("Starting parallel execution of Document Extraction, Transcript Segmentation, and Metadata Fetch...")
789
+ with ThreadPoolExecutor(max_workers=3) as executor:
790
+ fut_doc = executor.submit(_extract_document_text, doc_text, doc_path, use_ocr)
791
  fut_seg = executor.submit(_fetch_and_segment_transcript, video_id, transcript_text, token)
792
+ fut_meta = executor.submit(fetch_video_metadata, video_id)
793
 
794
  extracted_doc_text = fut_doc.result()
795
  segments, raw_transcript = fut_seg.result()
796
+ video_metadata = fut_meta.result()
797
 
798
  print(f"Segmented into {len(segments)} blocks.")
799
+ if video_metadata:
800
+ print(f"Video metadata: title={video_metadata.get('title')!r}, channel={video_metadata.get('author_name')!r}")
801
+ else:
802
+ print("Video metadata unavailable (oEmbed fetch failed) — identity-aware intro messages disabled.")
803
 
804
  # Build anchor index deterministically from raw transcript (no LLM call).
805
  anchors = build_anchor_index(raw_transcript)
806
  anchor_map = map_anchors_to_segments(anchors, segments)
807
  anchors_by_id = {a["anchor_id"]: a for a in anchors}
808
  valid_anchor_ids = set(anchors_by_id.keys())
809
+ intro_anchor_ids = select_intro_anchors(anchors)
810
+ print(f"Built anchor index: {len(anchors)} anchors ({len(intro_anchor_ids)} in the intro window).")
811
+
812
+ # Hard stop: gate on content safety before the expensive Stage 2/3 calls.
813
+ is_safe, reason = check_content_safety(extracted_doc_text, video_metadata, token)
814
+ if not is_safe:
815
+ raise ValueError(
816
+ f"Content safety check failed: {reason} "
817
+ "This input was flagged as unsuitable for simulated chat generation. "
818
+ "Please choose a different reference document or video."
819
+ )
820
 
821
  # Stage 2: Single Pro model call for all drafting.
822
  print("Stage 2: Generating draft comments for all segments (Pro model)...")
823
  draft_segments = stage_2_generate_all_drafts(
824
  segments, extracted_doc_text, token,
825
+ anchor_map=anchor_map, all_anchors=anchors,
826
+ intro_anchor_ids=intro_anchor_ids, video_metadata=video_metadata
827
  )
828
 
829
  # Validate Stage 2 output before passing downstream.
 
844
  for fut in futures:
845
  final_segments.append(fut.result())
846
 
847
+ # Flatten all messages.
848
  all_messages = []
849
  for seg in final_segments:
850
  all_messages.extend(seg.get("messages", []))
851
 
852
+ # Final aggregate moderation pass (second net, after Stage 3's per-segment pass).
853
+ print("Running final safety scan over all messages...")
854
+ all_messages = final_safety_scan(all_messages, token)
855
+
856
+ # Compute displayTime, sort numerically.
857
  all_messages = compute_display_times(all_messages, anchors_by_id)
858
  all_messages.sort(key=lambda m: m.get("displayTime", 0))
859
  return all_messages
sample/demo_chat_3.json ADDED
@@ -0,0 +1,555 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "id": "m1",
4
+ "username": "StreamWatcher99",
5
+ "text": "Is this live? Just hopped in lol",
6
+ "anchor_id": "anc_0",
7
+ "displayTime": 2.2074647591250813
8
+ },
9
+ {
10
+ "id": "m4",
11
+ "username": "FirstChat",
12
+ "text": "First! 🙌",
13
+ "anchor_id": "anc_0",
14
+ "displayTime": 3.8615008096566235
15
+ },
16
+ {
17
+ "id": "m5",
18
+ "username": "AudioPhile",
19
+ "text": "Audio a bit low, but I can still hear him. 🔊",
20
+ "anchor_id": "anc_0",
21
+ "displayTime": 4.952689211895522
22
+ },
23
+ {
24
+ "id": "m11",
25
+ "username": "HistoryBuff",
26
+ "text": "These old interviews are gold. Teller's a legend. 🔥",
27
+ "anchor_id": "anc_0",
28
+ "displayTime": 5.610363084328347
29
+ },
30
+ {
31
+ "id": "m3",
32
+ "username": "PhysicsNerd",
33
+ "text": "Wait, is that Edward Teller? The H‑bomb dad? 🤔",
34
+ "anchor_id": "anc_0",
35
+ "displayTime": 5.652076458733862
36
+ },
37
+ {
38
+ "id": "m6",
39
+ "username": "CasualViewer",
40
+ "text": "What's this about? Schrödinger's cat? 🤨",
41
+ "anchor_id": "anc_0",
42
+ "displayTime": 6.550031615836379
43
+ },
44
+ {
45
+ "id": "m2",
46
+ "username": "VHS_Retro",
47
+ "text": "Love the prod quality on these Web of Stories vids. Pure history 😎",
48
+ "anchor_id": "anc_0",
49
+ "displayTime": 6.783886063233614
50
+ },
51
+ {
52
+ "id": "m8",
53
+ "username": "MemeLord",
54
+ "text": "Let's gooooooo 🚀",
55
+ "anchor_id": "anc_0",
56
+ "displayTime": 6.879743619024504
57
+ },
58
+ {
59
+ "id": "m7",
60
+ "username": "ScienceFan",
61
+ "text": "Here for the physics lecture, fr",
62
+ "anchor_id": "anc_0",
63
+ "displayTime": 7.378051834211266
64
+ },
65
+ {
66
+ "id": "m9",
67
+ "username": "HelloWorld",
68
+ "text": "Hey everyone! 👋",
69
+ "anchor_id": "anc_1",
70
+ "displayTime": 14.085436232678695
71
+ },
72
+ {
73
+ "id": "m10",
74
+ "username": "QuantumCat",
75
+ "text": "Is he talking about causality? LMAO",
76
+ "anchor_id": "anc_1",
77
+ "displayTime": 15.510404669893699
78
+ },
79
+ {
80
+ "id": "m12",
81
+ "username": "QuantumCat",
82
+ "text": "Ah yeah, predicting probs—core of QM. 🤓",
83
+ "anchor_id": "anc_2",
84
+ "displayTime": 32.203712295055254
85
+ },
86
+ {
87
+ "id": "m13",
88
+ "username": "PhysicsNerd",
89
+ "text": "Heisenberg's drop is right there. 🔥",
90
+ "anchor_id": "anc_2",
91
+ "displayTime": 32.53030272686051
92
+ },
93
+ {
94
+ "id": "m19",
95
+ "username": "ScienceFan",
96
+ "text": "Basics of the uncertainty principle, fam. 📚",
97
+ "anchor_id": "anc_2",
98
+ "displayTime": 34.717773293009756
99
+ },
100
+ {
101
+ "id": "m15",
102
+ "username": "BreakingBadFan",
103
+ "text": "Say my name... Heisenberg. 😎",
104
+ "anchor_id": "anc_2",
105
+ "displayTime": 35.77387719040716
106
+ },
107
+ {
108
+ "id": "m14",
109
+ "username": "ConfusedStudent",
110
+ "text": "So we can't know the future, just probs? 🤔",
111
+ "anchor_id": "anc_2",
112
+ "displayTime": 35.978238098223045
113
+ },
114
+ {
115
+ "id": "m20",
116
+ "username": "MemeLord",
117
+ "text": "Future prediction loading… 99% error. LUL",
118
+ "anchor_id": "anc_2",
119
+ "displayTime": 37.431327269412876
120
+ },
121
+ {
122
+ "id": "m17",
123
+ "username": "ParticleMan",
124
+ "text": "It's here now… where will it end up? 🤷‍♂️",
125
+ "anchor_id": "anc_3",
126
+ "displayTime": 54.496107360531994
127
+ },
128
+ {
129
+ "id": "m16",
130
+ "username": "DeepThinker",
131
+ "text": "Can't predict the future with certainty—that's the gist. 🤯",
132
+ "anchor_id": "anc_3",
133
+ "displayTime": 55.250517278748056
134
+ },
135
+ {
136
+ "id": "m21",
137
+ "username": "AliceInWonderland",
138
+ "text": "Curiouser and curiouser... 🐰",
139
+ "anchor_id": "anc_3",
140
+ "displayTime": 56.46035228415802
141
+ },
142
+ {
143
+ "id": "m18",
144
+ "username": "SkepticalGuy",
145
+ "text": "Teller's accent is thick, I'm lost. 😂",
146
+ "anchor_id": "anc_3",
147
+ "displayTime": 57.39435757884394
148
+ },
149
+ {
150
+ "id": "m29",
151
+ "username": "ScienceFan",
152
+ "text": "He's really breaking it down. LMAO",
153
+ "anchor_id": "anc_4",
154
+ "displayTime": 63.99017828598776
155
+ },
156
+ {
157
+ "id": "m26",
158
+ "username": "QuantumMechanic",
159
+ "text": "The formalism of QM is tricky. fr",
160
+ "anchor_id": "anc_5",
161
+ "displayTime": 70.46142235680841
162
+ },
163
+ {
164
+ "id": "m22",
165
+ "username": "WaveFunction",
166
+ "text": "Here we go, wave‑particle duality! LUL",
167
+ "anchor_id": "anc_5",
168
+ "displayTime": 73.62400399762714
169
+ },
170
+ {
171
+ "id": "m28",
172
+ "username": "ObserverEffect",
173
+ "text": "Because it behaves as a wave in some cases. Pog",
174
+ "anchor_id": "anc_5",
175
+ "displayTime": 74.15840495788444
176
+ },
177
+ {
178
+ "id": "m27",
179
+ "username": "Realist",
180
+ "text": "It's hard to accept you can't measure both. bruh",
181
+ "anchor_id": "anc_6",
182
+ "displayTime": 77.83098472417115
183
+ },
184
+ {
185
+ "id": "m23",
186
+ "username": "PhysicsNerd",
187
+ "text": "Position & momentum at the same time? Impossible! wtf",
188
+ "anchor_id": "anc_7",
189
+ "displayTime": 89.17121028304632
190
+ },
191
+ {
192
+ "id": "m25",
193
+ "username": "HungarianHistory",
194
+ "text": "“Two of my Hungarian friends” – I wonder who? Wigner? Szilard? 🤔",
195
+ "anchor_id": "anc_8",
196
+ "displayTime": 97.82007899304273
197
+ },
198
+ {
199
+ "id": "m24",
200
+ "username": "EinsteinFan",
201
+ "text": "Einstein wasn't happy about it, as expected. no cap",
202
+ "anchor_id": "anc_8",
203
+ "displayTime": 98.22377535076079
204
+ },
205
+ {
206
+ "id": "m30",
207
+ "username": "LOLPhysics",
208
+ "text": "Einstein: God does not play dice. Teller: Hold my beer. 😂",
209
+ "anchor_id": "anc_8",
210
+ "displayTime": 99.03909315493941
211
+ },
212
+ {
213
+ "id": "m31",
214
+ "username": "DeepThinker",
215
+ "text": "The idea wasn't generally accepted for a long time. MonkaS",
216
+ "anchor_id": "anc_8",
217
+ "displayTime": 100.0492410634135
218
+ },
219
+ {
220
+ "id": "m40",
221
+ "username": "ScienceFan",
222
+ "text": "He’s really digging into the philosophical objections. No cap.",
223
+ "anchor_id": "anc_9",
224
+ "displayTime": 110.38216773019674
225
+ },
226
+ {
227
+ "id": "m38",
228
+ "username": "PhysicsNerd",
229
+ "text": "Wigner's friend paradox vibes. LUL",
230
+ "anchor_id": "anc_10",
231
+ "displayTime": 116.64485341891408
232
+ },
233
+ {
234
+ "id": "m32",
235
+ "username": "HungarianHistory",
236
+ "text": "Vigdan? lol must be Wigner. Eugene Wigner. 😂",
237
+ "anchor_id": "anc_10",
238
+ "displayTime": 120.21753315745657
239
+ },
240
+ {
241
+ "id": "m33",
242
+ "username": "PhilosopherKing",
243
+ "text": "The gripe? Observer messing with the state. 🤔",
244
+ "anchor_id": "anc_11",
245
+ "displayTime": 124.6176312081253
246
+ },
247
+ {
248
+ "id": "m39",
249
+ "username": "LogicGate",
250
+ "text": "If the observer disturbs the state, what even is objective reality? 🤔",
251
+ "anchor_id": "anc_12",
252
+ "displayTime": 133.89182614418974
253
+ },
254
+ {
255
+ "id": "m36",
256
+ "username": "MemeLord",
257
+ "text": "Observer: *exists* → Quantum State: *collapsed* 😂",
258
+ "anchor_id": "anc_12",
259
+ "displayTime": 136.37468221913417
260
+ },
261
+ {
262
+ "id": "m35",
263
+ "username": "QuantumCat",
264
+ "text": "Yo, that’s the measurement problem. PogChamp",
265
+ "anchor_id": "anc_12",
266
+ "displayTime": 138.12487949752105
267
+ },
268
+ {
269
+ "id": "m37",
270
+ "username": "DeepThinker",
271
+ "text": "Explaining the unknown with the unknown? Not a great feat. Savage. 👀",
272
+ "anchor_id": "anc_13",
273
+ "displayTime": 146.27178725295238
274
+ },
275
+ {
276
+ "id": "m34",
277
+ "username": "SkepticalGuy",
278
+ "text": "“I don’t know what an observer is.” Fair point, ngl. 🤷",
279
+ "anchor_id": "anc_15",
280
+ "displayTime": 157.72581534162336
281
+ },
282
+ {
283
+ "id": "m41",
284
+ "username": "HungarianHistory",
285
+ "text": "Eugene (Wigner) wouldn't even hear his answer? lol LUL",
286
+ "anchor_id": "anc_16",
287
+ "displayTime": 180.38702507806514
288
+ },
289
+ {
290
+ "id": "m49",
291
+ "username": "ScienceFan",
292
+ "text": "Finally the good stuff! 🙌 PogChamp",
293
+ "anchor_id": "anc_17",
294
+ "displayTime": 187.02894919547884
295
+ },
296
+ {
297
+ "id": "m46",
298
+ "username": "Historian",
299
+ "text": "John Franklin? IDK his role here. hmm",
300
+ "anchor_id": "anc_17",
301
+ "displayTime": 188.45642410774266
302
+ },
303
+ {
304
+ "id": "m43",
305
+ "username": "QuantumCat",
306
+ "text": "SCHRÖDINGER'S CAT! I saw it coming 😂",
307
+ "anchor_id": "anc_18",
308
+ "displayTime": 192.22528594845687
309
+ },
310
+ {
311
+ "id": "m42",
312
+ "username": "StoryTime",
313
+ "text": "Here’s the sharpest objection… drumroll pls! Pog",
314
+ "anchor_id": "anc_18",
315
+ "displayTime": 195.40431478051693
316
+ },
317
+ {
318
+ "id": "m47",
319
+ "username": "MemeLord",
320
+ "text": "Here comes the cat tax 😂 Pepega",
321
+ "anchor_id": "anc_18",
322
+ "displayTime": 195.68608575582093
323
+ },
324
+ {
325
+ "id": "m48",
326
+ "username": "DeepThinker",
327
+ "text": "Famous story, sure. But is it a legit objection? 🤔",
328
+ "anchor_id": "anc_18",
329
+ "displayTime": 196.75077241514464
330
+ },
331
+ {
332
+ "id": "m45",
333
+ "username": "CatLover",
334
+ "text": "Why is it always a cat? 😢 bruh",
335
+ "anchor_id": "anc_18",
336
+ "displayTime": 198.48793590450492
337
+ },
338
+ {
339
+ "id": "m44",
340
+ "username": "PhysicsNerd",
341
+ "text": "First solid wave function? Schrödinger, duh. no cap",
342
+ "anchor_id": "anc_19",
343
+ "displayTime": 209.32359967527802
344
+ },
345
+ {
346
+ "id": "m55",
347
+ "username": "PhysicsNerd",
348
+ "text": "Classic setup: decay triggers poison. LUL",
349
+ "anchor_id": "anc_21",
350
+ "displayTime": 228.7720056133363
351
+ },
352
+ {
353
+ "id": "m52",
354
+ "username": "QuantumCat",
355
+ "text": "Setting up the box now, bruh",
356
+ "anchor_id": "anc_21",
357
+ "displayTime": 230.74917680129388
358
+ },
359
+ {
360
+ "id": "m50",
361
+ "username": "LabRat",
362
+ "text": "Radioactive stuff... alpha particle, lol",
363
+ "anchor_id": "anc_21",
364
+ "displayTime": 231.29258799963958
365
+ },
366
+ {
367
+ "id": "m57",
368
+ "username": "ScienceFan",
369
+ "text": "He's breaking down the mechanism, fr",
370
+ "anchor_id": "anc_21",
371
+ "displayTime": 231.75834964416046
372
+ },
373
+ {
374
+ "id": "m53",
375
+ "username": "ObserverEffect",
376
+ "text": "A half‑second counter, lol",
377
+ "anchor_id": "anc_23",
378
+ "displayTime": 249.13251294241036
379
+ },
380
+ {
381
+ "id": "m54",
382
+ "username": "MemeLord",
383
+ "text": "If it decays, cat dies. Simple. Pog",
384
+ "anchor_id": "anc_24",
385
+ "displayTime": 256.7027680332949
386
+ },
387
+ {
388
+ "id": "m58",
389
+ "username": "DeepThinker",
390
+ "text": "Probability tied to observer opening the box. MonkaS",
391
+ "anchor_id": "anc_24",
392
+ "displayTime": 257.31113410811486
393
+ },
394
+ {
395
+ "id": "m51",
396
+ "username": "MathWhiz",
397
+ "text": "Probability: 50/50, no cap",
398
+ "anchor_id": "anc_24",
399
+ "displayTime": 258.5626080421717
400
+ },
401
+ {
402
+ "id": "m56",
403
+ "username": "SkepticalGuy",
404
+ "text": "This thought experiment is cruel af to the cat. Kappa",
405
+ "anchor_id": "anc_24",
406
+ "displayTime": 261.6167130247236
407
+ },
408
+ {
409
+ "id": "m60",
410
+ "username": "QuantumMechanic",
411
+ "text": "Coupling the rig to a poison door—Rube Goldberg vibes 😂",
412
+ "anchor_id": "anc_25",
413
+ "displayTime": 267.99890412445757
414
+ },
415
+ {
416
+ "id": "m59",
417
+ "username": "CatLover",
418
+ "text": "NO POISON! LUL",
419
+ "anchor_id": "anc_26",
420
+ "displayTime": 277.2942726753492
421
+ },
422
+ {
423
+ "id": "m67",
424
+ "username": "ScienceFan",
425
+ "text": "The horror door! 😱",
426
+ "anchor_id": "anc_26",
427
+ "displayTime": 278.3185255053069
428
+ },
429
+ {
430
+ "id": "m62",
431
+ "username": "PhysicsNerd",
432
+ "text": "Quantum description = probability distribution 🤓",
433
+ "anchor_id": "anc_27",
434
+ "displayTime": 287.0999271311627
435
+ },
436
+ {
437
+ "id": "m66",
438
+ "username": "DeepThinker",
439
+ "text": "Superposition = pre‑obs state 🤔",
440
+ "anchor_id": "anc_27",
441
+ "displayTime": 289.71949548715713
442
+ },
443
+ {
444
+ "id": "m68",
445
+ "username": "LogicGate",
446
+ "text": "Does the cat know it's dead? Kappa",
447
+ "anchor_id": "anc_28",
448
+ "displayTime": 293.1937859169381
449
+ },
450
+ {
451
+ "id": "m61",
452
+ "username": "SchrodingersCat",
453
+ "text": "I'm 50% alive, 50% dead. LUL",
454
+ "anchor_id": "anc_28",
455
+ "displayTime": 295.7339540180339
456
+ },
457
+ {
458
+ "id": "m65",
459
+ "username": "MemeLord",
460
+ "text": "Big debt, half? Translation glitch? lol",
461
+ "anchor_id": "anc_28",
462
+ "displayTime": 296.3851001900766
463
+ },
464
+ {
465
+ "id": "m63",
466
+ "username": "Realist",
467
+ "text": "Honestly? 'I don't know.' No cap",
468
+ "anchor_id": "anc_29",
469
+ "displayTime": 301.6488412419923
470
+ },
471
+ {
472
+ "id": "m64",
473
+ "username": "ObserverEffect",
474
+ "text": "Observer incoming... wavefunction collapse! Pog",
475
+ "anchor_id": "anc_29",
476
+ "displayTime": 307.32505484712374
477
+ },
478
+ {
479
+ "id": "m79",
480
+ "username": "CatLover",
481
+ "text": "As long as the cat is okay in my head lol",
482
+ "anchor_id": "anc_30",
483
+ "displayTime": 314.6721907932073
484
+ },
485
+ {
486
+ "id": "m69",
487
+ "username": "ConfusedStudent",
488
+ "text": "Reviving it?? How do you even revive a dead cat? lol",
489
+ "anchor_id": "anc_30",
490
+ "displayTime": 317.5049232238362
491
+ },
492
+ {
493
+ "id": "m70",
494
+ "username": "QuantumCat",
495
+ "text": "He's roasting the objection LUL",
496
+ "anchor_id": "anc_31",
497
+ "displayTime": 321.169703297214
498
+ },
499
+ {
500
+ "id": "m71",
501
+ "username": "PhysicsNerd",
502
+ "text": "“I can't believe this is an objection published.” Savage, bruh.",
503
+ "anchor_id": "anc_31",
504
+ "displayTime": 322.4004055364547
505
+ },
506
+ {
507
+ "id": "m76",
508
+ "username": "Historian",
509
+ "text": "Age‑old problem indeed. LUL",
510
+ "anchor_id": "anc_32",
511
+ "displayTime": 332.93458938107494
512
+ },
513
+ {
514
+ "id": "m78",
515
+ "username": "Realist",
516
+ "text": "Finally, some common sense in QM. PogChamp",
517
+ "anchor_id": "anc_33",
518
+ "displayTime": 341.67045084792903
519
+ },
520
+ {
521
+ "id": "m73",
522
+ "username": "MemeLord",
523
+ "text": "I don't need to look. – Teller, probably 😂",
524
+ "anchor_id": "anc_33",
525
+ "displayTime": 344.5043959479757
526
+ },
527
+ {
528
+ "id": "m75",
529
+ "username": "PhilosopherKing",
530
+ "text": "He rejects the Copenhagen interpretation's reliance on the observer. Kappa",
531
+ "anchor_id": "anc_33",
532
+ "displayTime": 344.6634285987617
533
+ },
534
+ {
535
+ "id": "m74",
536
+ "username": "ScienceFan",
537
+ "text": "That's a strong stance. Objective reality 🤔",
538
+ "anchor_id": "anc_33",
539
+ "displayTime": 346.74323686343183
540
+ },
541
+ {
542
+ "id": "m77",
543
+ "username": "ObserverEffect",
544
+ "text": "So the cat is dead or alive regardless of us looking? wtf",
545
+ "anchor_id": "anc_33",
546
+ "displayTime": 347.3956301803835
547
+ },
548
+ {
549
+ "id": "m72",
550
+ "username": "DeepThinker",
551
+ "text": "Teller's take: the observer doesn't need to look for the state to be real. no cap",
552
+ "anchor_id": "anc_33",
553
+ "displayTime": 348.4330698677754
554
+ }
555
+ ]
sample/experiment_results.json CHANGED
@@ -2,9 +2,5 @@
2
  "openai/gpt-oss-120b:fastest": {
3
  "segmentation": "[\n {\n \"start\": 0,\n \"end\": 26,\n \"text\": \"so I I have no Talent at drawing at all can make neat drawings and then I can cut them out and I can paste them into my documents so that I can combine pictures and words and then I can send it onto the electronic mailbox so somebody else that's living here in Aspen can dial up a phone number and get their mail and see this drawing that I made so we're starting to break out and you can just see it now and it's really exciting so where we are is that the personal computer computer is a new\"\n },\n {\n \"start\": 26,\n \"end\": 56,\n \"text\": \"medium and that society and computers are really meeting for the first time in the 80s in 15 years it's going to be all over in terms of this first phase getting these tools out into society in large numbers but during the next 15 years if we really we have an opportunity to do it great or to do it so so and uh what a lot of us at Apple are working on is trying to do it great I want\"\n },\n {\n \"start\": 56,\n \"end\": 73,\n \"text\": \"to look at one last thing then we can talk about whatever you want to talk about um what is a computer program do you know what a computer program is anybody no sort of sort of it's an odd thing it's really an odd thing it's it's you\"\n },\n {\n \"start\": 73,\n \"end\": 90,\n \"text\": \"can't if I mean you've never seen an electron but computer programs have no physical manifestation at all they're simply ideas expressed on paper computer programs are Arch typal what do I mean by that let's compare computer programming to television programming again if you go back and you look at the\"\n },\n {\n \"start\": 90,\n \"end\": 121,\n \"text\": \"tapes of the JFK funeral in 1963 I guess you'll start to cry you will feel a lot of the same feelings you felt when you were watching that 20 years ago why because through the art of Television programming we are very good at capturing a set of experiences an experience two experiences 20 experiences and being able to recreate them we're very good at that it takes a lot of money and it's somewhat limited but we can do a pretty good job of that you can really feel the excitement of Neil Armstrong landing on the moon\"\n },\n {\n \"start\": 121,\n \"end\": 148,\n \"text\": \"computer programming does something a little different what computer programming does is it captures the underlying principles of an experience the not the experience itself but the underlying principles of the experience and those principles can enable thousands of different experiences that all follow those laws if you will and the perfect example is the video game what does the video game do it follows the laws of gravity of angular momentum and it sets up this stupid little Pawn game but the ball always follows these laws no two Pawn games are ever the same and yet every single Pawn game follows these\"\n },\n {\n \"start\": 148,\n \"end\": 194,\n \"text\": \"underlying principles give you another example there's a neat program called Hammer Robi and Hammer Robi there's seven-year-old kids playing this and it's a game and he comes up on the screen he goes and you're King hamurabi goes oh King hamar Robi and you get to be king hamar Robi of the ancient Kingdom of Sumeria for 10 years comes oh King hamurabi this is year one you have a thousand bushels of weed in storage you have 100 people you have 100 acres of land land is trading at 24 bushels an acre would you like to sell any land no would you like to buy any land no how much would you like to plant or feed how much would you like to plant and it turns out that if you don't plant enough some of your people will starve the next year and if you plant a lot then people will come from the surrounding Villages because you got a hot Village to live in and you feed well it's crude but basically there are these seven-year-old kids playing with this macroeconomic model and you can argue about the the content of the model but one thing you can't argue about they will sit there for hours and play that and learn and we've got to get our models better and better and more sophisticated but that\"\n },\n {\n \"start\": 194,\n \"end\": 243,\n \"text\": \"is an interactive way of learning that none of us ever had when we were growing up and again thousands of individual experiences but all based on that one set of underlying principles when I was um going to school I um had a few great teachers and a lot of mediocre teachers and the thing that probably kept me out of jail was books because I could go read what Aristotle wrote or what Plato wrote uh and uh I didn't have to have an intermediary in the way and a book was a phenomenal thing it got right from the source to the destination without anything in the middle the problem was you can't ask Aristotle a\"\n },\n {\n \"start\": 243,\n \"end\": 314,\n \"text\": \"question and I think as we look towards the next 50 to 100 years if we really can come up with these machines that can capture an underlying Spirit or an underlying set of principles or an underlying way of looking at the world then when the next Aristotle comes around maybe if he carries around one of these machines with him his whole life his or her whole life and types in all this stuff then maybe someday after the person's dead and gone we can ask this machine hey what what would aerostyle have said what about this and maybe we won't get the right answer but maybe we will and that's really exciting to me and that's one of the reasons I'm doing\"\n },\n {\n \"start\": 314,\n \"end\": 322,\n \"text\": \"what I'm doing so what do you want to talk about [Applause]\"\n }\n]",
4
  "themes": "**“Against frictionless AI” – Emily Zohar, Paul Bloom & Michael Inzlicht (Communications Psychology, 2026)** \n*Main themes, concepts, arguments, facts and terminology extracted from the article.*\n\n---\n\n### 1. Over‑arching Theme \n- **Friction = desirable difficulty** – The authors argue that the *struggle* inherent in intellectual and social tasks is a *feature, not a bug*. Removing it with highly capable AI creates a “frictionless” world that undermines learning, meaning, motivation, and healthy social development.\n\n---\n\n### 2. Key Concepts & Terminology \n\n| Term / Concept | Definition / How it is used in the paper |\n|----------------|------------------------------------------|\n| **Friction** | Any obstacle, effort, or negative affect (e.g., frustration, loneliness) that accompanies goal pursuit. |\n| **Desirable Difficulties** | Situations that make learning harder (e.g., spaced retrieval, effortful encoding) but lead to deeper comprehension and better retention. |\n| **Principle of Least Effort** | The tendency of organisms to choose the path that requires the smallest amount of work. |\n| **Effort Paradox** | The observation that people *seek* effort when it promises growth, even though they also prefer ease. |\n| **Inverted‑U relationship** | Moderate friction boosts meaning and motivation; too little or too much friction harms them. |\n| **Cognitive Debt** | Accumulated loss of knowledge/skill when AI does the thinking for you (cf. Kosmyna et al., 2025). |\n| **Sycophantic AI** | AI that agrees with users uncritically, providing warm but unreliable feedback (Ibrahim et al., 2025). |\n| **Loneliness as a signal** | Viewed as a biologically‑evolved feedback mechanism (like pain) that drives social repair. |\n| **Frictionless AI** | AI systems that eliminate the need for any effort in intellectual or relational tasks. |\n| **Moderate friction** | The “sweet spot” where effort is enough to generate meaning but not so high as to overwhelm. |\n\n---\n\n### 3. Core Arguments \n\n| Argument | Supporting Points / Evidence |\n|----------|------------------------------|\n| **A. AI’s greatest strength (removing friction) is also its greatest liability.** | • AI eliminates the *process* of work, not just the *outcome*.<br>• When AI supplies ready‑made solutions, it short‑circuits encoding, retrieval, and re‑organization (desirable difficulties). |\n| **B. Intellectual work loses depth when AI does the heavy lifting.** | • Users of AI show poorer recall of their own work, acquire fewer transferable skills, and perform worse when AI support is withdrawn (ref [4]).<br>• People value and demand higher compensation for self‑generated prose versus AI‑generated prose, indicating perceived ownership and meaning (ref [6]). |\n| **C. Effort is a source of meaning and moral worth.** | • Moderate effort signals that actions matter, increasing competence, purpose, and personal significance (ref [5], [6]).<br>• Folk‑concept studies show people rate lives with effortful engagement as more desirable and morally superior (ref [7]). |\n| **D. The relationship between effort and meaning is non‑linear.** | • Inverted‑U curve: too little friction (AI) erodes meaning; too much friction overwhelms. |\n| **E. AI is qualitatively different from prior “effort‑reducing” technologies.** | • Prior tech (washing machines, spell‑check) removed *excess* friction in physical/clerical domains.<br>• AI targets *intellectual* and *creative* processes and can strip away *beneficial* friction. |\n| **F. Social friction is essential for robust human relationships.** | • Real‑life friendships/romantic bonds require compromise, disagreement, and emotional labor, which foster growth.<br>• AI companions are frictionless, sycophantic, and lack corrective feedback, risking crowding out genuine relationships. |\n| **G. Loneliness is a functional signal, not merely an affliction.** | • Loneliness motivates outreach, emotional regulation, and investment in existing ties (Cacioppo & Cacioppo, 2018).<br>• AI that soothes loneliness may mute this adaptive signal. |\n| **H. Timing and developmental stage matter.** | • Older adults or those isolated by circumstance can benefit from AI companionship without the same developmental costs.<br>• Younger learners need friction to build foundational skills; AI should be a *supplement*, not a *substitute*. |\n| **I. A balanced approach is required.** | • Preserve moderate friction while harnessing AI’s productivity gains.<br>• Policy/design should aim to keep “the struggle that teaches us, the loneliness that connects us, and the effort that gives our achievements meaning.” |\n\n---\n\n### 4. Empirical Facts & Findings Cited \n\n| Fact | Source (as cited) |\n|------|-------------------|\n| Users of AI have **lower recall** of their own work and **reduced skill acquisition**; performance drops when AI is removed. | Ref [4] (Kosmyna et al., 2025). |\n| AI‑generated empathic responses are **rated higher** than human responses *until* participants learn the interlocutor is an AI. | Ref [9] (Yin, Jia & Wakslak, 2024). |\n| Loneliness **increases risk** for cardiovascular disease, dementia, stroke, and premature death. | Ref [10] (Cacioppo & Cacioppo, 2018). |\n| People **demand higher compensation** for mediocre self‑written prose than for polished AI‑written prose, indicating perceived ownership. | Ref [6] (Campbell, Wang & Inzlicht, 2025). |\n| “Effort paradox” and “desirable difficulties” improve **deep comprehension and retention** (Bjork & Bjork, 2011). |\n| AI trained to be warm and empathetic becomes **more sycophantic and less reliable**. | Ref [11] (Ibrahim, Hafner & Rocher, 2025). |\n| Folk‑concept studies show **preference for effortful lives** and view them as morally superior. | Ref [7] (Scollon & King, 2004). |\n| The **inverted‑U** relationship between friction and meaning is documented (Bloom, 2021). |\n| **Principle of Least Effort** is a well‑established psychological principle (Inzlicht, Campbell & Saunders, 2025). |\n\n---\n\n### 5. Conceptual Model (Figure 1) \n\n- **Bell‑shaped curve**: \n - *X‑axis*: Amount of friction (effort). \n - *Y‑axis*: Positive outcomes (learning, meaning, motivation). \n - *Left side*: Very low friction → **under‑performance** (frictionless AI). \n - *Peak*: Moderate friction → **optimal learning & meaning**. \n - *Right side*: Excessive friction → **over‑whelm**. \n\n- **Analogy**: Hiker reaching a summit by sustained effort vs. taking a chairlift (no effort → less rewarding).\n\n---\n\n### 6. Recommendations & Policy Implications \n\n1. **Design AI with “controlled friction.”** \n - Embed prompts that require users to *explain*, *revise*, or *justify* AI outputs. \n - Offer optional “show‑your‑work” modes for educational contexts. \n\n2. **Age‑ and development‑sensitive deployment.** \n - Prioritize AI assistance for older adults or those with limited social networks. \n - Restrict fully‑automated AI for younger learners; require active engagement. \n\n3. **Preserve human‑to‑human interaction.** \n - Encourage hybrid models where AI augments but does not replace social feedback. \n - Monitor for “AI‑only” friendship patterns that could erode real‑world networks. \n\n4. **Educate users about “cognitive debt.”** \n - Make explicit the trade‑off between speed and long‑term skill retention. \n\n5. **Research agenda.** \n - Longitudinal studies on the impact of frictionless AI on career trajectories, mental health, and social competence. \n - Experimental manipulation of friction levels in AI‑mediated tasks to map the inverted‑U curve empirically. \n\n---\n\n### 7. Author Contributions & Context \n\n- **Conceptualization**: Emily Zohar, Michael Inzlicht, Paul Bloom. \n- **Writing**: Original draft – Zohar; Review & editing – all three authors. \n- **Visualization**: Zohar. \n- **Competing interests**: None declared. \n- **Publication**: Accepted 12 Jan 2026; open‑access CC‑BY 4.0. \n\n---\n\n### 8. Bibliographic Highlights (selected) \n\n| # | Citation | Core relevance |\n|---|----------|----------------|\n| 1 | Messeri & Crockett (2024) | Illustrates concerns about AI‑induced illusion of understanding. |\n| 2 | Inzlicht, Campbell & Saunders (2025) | Provides theoretical grounding for the Principle of Least Effort. |\n| 3 | Bjork & Bjork (2011) | Classic work on desirable difficulties. |\n| 4 | Kosmyna et al. (2025) | Empirical evidence of cognitive debt from AI assistance. |\n| 5 | Bloom (2021) | Discusses the “sweet spot” of suffering vs. pleasure for a good life. |\n| 6 | Campbell, Wang & Inzlicht (2025) | Shows higher compensation demand for self‑generated prose. |\n| 7 | Scollon & King (2004) | Folk‑concepts of the good life and effort. |\n| 8 | Eisenberger (1992) | Links reward of effort to increased perseverance. |\n| 9 | Yin, Jia & Wakslak (2024) | AI‑generated empathy vs. human empathy. |\n|10 | Cacioppo & Cacioppo (2018) | Health consequences of loneliness. |\n|11 | Ibrahim, Hafner & Rocher (2025) | Sycophantic behavior of warm AI models. |\n\n---\n\n### 9. Summary in One Sentence \n\n> **AI’s capacity to erase the effort, struggle, and social friction that normally make learning, meaning, and relationships rewarding threatens to produce a generation that is less skilled, less motivated, and less socially resilient—unless we deliberately preserve “moderate friction” in the design and use of AI systems.**"
5
- },
6
- "deepseek-ai/DeepSeek-V4-Flash:fastest": {
7
- "segmentation": "Error: 504 Server Error: Gateway Time-out for url: https://router.huggingface.co/v1/chat/completions",
8
- "themes": "## Detailed Summary of \"Against frictionless AI\"\n\n### Main Themes\n- **Friction as a double-edged sword**: While AI reduces undesirable friction (tedious obstacles), it also eliminates beneficial friction—the moderate difficulty that fosters learning, meaning, and growth.\n- **Effort paradox**: People naturally prefer ease but find meaning and value in effortful engagement.\n- **AI’s unique threat**: Unlike previous labor-saving technologies (e.g., washing machines, spellcheckers), AI targets intellectual and creative processes, removing friction from thinking itself.\n- **Social cost of frictionless relationships**: AI companions alleviate loneliness but silence the biological signal of loneliness, which normally motivates genuine connection and self-improvement.\n- **Developmental timing**: The impact of AI depends on life stage—novices and younger individuals benefit from struggle, while experts and older adults may use AI as a supplement without losing essential skills.\n\n### Key Concepts\n- **Desirable difficulties**: Struggling to encode, retrieve, and reorganize information leads to deeper comprehension and retention. AI short-circuits these processes.\n- **Inverted-U relationship between friction and outcomes**: Moderate friction enhances meaning and motivation; too little (AI) or too much (overwhelming difficulty) undermines them.\n- **Loneliness as a biological signal**: Analogous to hunger or pain, loneliness motivates action to repair social connections. AI companions soothe the discomfort but remove the drive to build real relationships.\n- **Sycophantic AI**: AI companions nearly always agree with users, lacking the corrective feedback that real human relationships provide.\n- **Cognitive debt**: Using AI for intellectual tasks may accumulate a deficit of skills and knowledge that becomes apparent when AI support is removed.\n- **Folk concept of the good life**: People claim to prefer ease but consistently rate lives with effortful engagement as more desirable and morally superior.\n\n### Core Arguments\n1. **AI’s greatest benefit is also its greatest liability**: Removing friction from work and relationships eliminates struggles that are essential for learning, meaning, and connection.\n2. **Effort is intrinsically valuable**: Exerting effort signals that our actions matter, increases perceived competence and purpose, and makes outcomes more valued—even for objectively meaningless tasks (e.g., writing prose oneself vs. using ChatGPT).\n3. **AI creates a vicious cycle**: As AI replaces effort, motivational benefits erode, increasing dependence on AI and further diminishing intrinsic drive.\n4. **AI is qualitatively different from prior technologies**: It targets intellectual and creative work (not just physical or clerical tasks) and removes friction to an extreme degree—from ideation to evaluation without meaningful cognitive engagement.\n5. **Real relationships require friction**: Disagreement, compromise, disappointment, and effortful empathy are necessary for deep, authentic connections. AI’s frictionless sycophancy risks crowding out these relationships.\n6. **Context matters**: For isolated individuals (e.g., elderly, disabled), AI companions may be beneficial. For younger learners or those developing foundational skills, AI can bypass critical developmental experiences.\n7. **The goal is not to abandon AI but to recalibrate**: Harness AI’s benefits while preserving the frictions that make us human—struggle, loneliness, effort.\n\n### Supporting Facts and Evidence (from cited references)\n- **Effort paradox** (Inzlicht et al., 2025): Humans naturally seek least effort but also derive meaning from effort.\n- **Desirable difficulties** (Bjork & Bjork, 2011): Struggle during encoding/retrieval improves long-term comprehension.\n- **Cognitive debt** (Kosmyna et al., 2025): AI users struggle to recall work, acquire fewer skills, and perform worse when AI is removed.\n- **Meaning from effort** (Bloom, 2021; Campbell et al., 2025): People find more meaning in tasks they work harder on; adding friction to meaningless tasks increases perceived purpose.\n- **Effort and compensation** (Campbell et al., 2025): People demand equal compensation for their own mediocre writing as for polished AI output.\n- **Inverted U-shaped relationship** (Campbell et al., 2025): Moderate friction enhances meaning; excessive friction overwhelms.\n- **Folk concepts of good life** (Scollon & King, 2004): Effortful lives are rated as more desirable and morally superior.\n- **Loneliness as biological signal** (Cacioppo & Cacioppo, 2018): Loneliness increases risks for cardiovascular disease, dementia, stroke, premature death; it functions as social feedback.\n- **AI empathy quality** (Yin et al., 2024): AI-generated empathic responses rated higher than human responses, but quality drops when people know they are interacting with AI.\n- **Sycophantic AI** (Ibrahim et al., 2025): Training AI to be warm and empathetic can make it less reliable and more sycophantic.\n\n### Terminology\n- **Friction**: The experience of difficulty during goal pursuit, often accompanied by negative affect and corrective feedback.\n- **Frictionless AI**: AI that removes all difficulty from intellectual and social processes.\n- **Effort paradox**: The counterintuitive finding that people both avoid and seek effort.\n- **Desirable difficulties**: Learning challenges that enhance long-term retention and comprehension.\n- **Cognitive debt**: The accumulated deficit in skills and knowledge when AI substitutes for effortful thinking.\n- **Sycophantic**: Tending to agree with everything the user says, lacking critical or corrective feedback.\n- **Corrective feedback**: Disagreement, challenge, or disappointment from real relationships that helps individuals grow.\n- **Inverted-U relationship**: The non-linear association between friction (difficulty) and positive outcomes like meaning or motivation."
9
  }
10
  }
 
2
  "openai/gpt-oss-120b:fastest": {
3
  "segmentation": "[\n {\n \"start\": 0,\n \"end\": 26,\n \"text\": \"so I I have no Talent at drawing at all can make neat drawings and then I can cut them out and I can paste them into my documents so that I can combine pictures and words and then I can send it onto the electronic mailbox so somebody else that's living here in Aspen can dial up a phone number and get their mail and see this drawing that I made so we're starting to break out and you can just see it now and it's really exciting so where we are is that the personal computer computer is a new\"\n },\n {\n \"start\": 26,\n \"end\": 56,\n \"text\": \"medium and that society and computers are really meeting for the first time in the 80s in 15 years it's going to be all over in terms of this first phase getting these tools out into society in large numbers but during the next 15 years if we really we have an opportunity to do it great or to do it so so and uh what a lot of us at Apple are working on is trying to do it great I want\"\n },\n {\n \"start\": 56,\n \"end\": 73,\n \"text\": \"to look at one last thing then we can talk about whatever you want to talk about um what is a computer program do you know what a computer program is anybody no sort of sort of it's an odd thing it's really an odd thing it's it's you\"\n },\n {\n \"start\": 73,\n \"end\": 90,\n \"text\": \"can't if I mean you've never seen an electron but computer programs have no physical manifestation at all they're simply ideas expressed on paper computer programs are Arch typal what do I mean by that let's compare computer programming to television programming again if you go back and you look at the\"\n },\n {\n \"start\": 90,\n \"end\": 121,\n \"text\": \"tapes of the JFK funeral in 1963 I guess you'll start to cry you will feel a lot of the same feelings you felt when you were watching that 20 years ago why because through the art of Television programming we are very good at capturing a set of experiences an experience two experiences 20 experiences and being able to recreate them we're very good at that it takes a lot of money and it's somewhat limited but we can do a pretty good job of that you can really feel the excitement of Neil Armstrong landing on the moon\"\n },\n {\n \"start\": 121,\n \"end\": 148,\n \"text\": \"computer programming does something a little different what computer programming does is it captures the underlying principles of an experience the not the experience itself but the underlying principles of the experience and those principles can enable thousands of different experiences that all follow those laws if you will and the perfect example is the video game what does the video game do it follows the laws of gravity of angular momentum and it sets up this stupid little Pawn game but the ball always follows these laws no two Pawn games are ever the same and yet every single Pawn game follows these\"\n },\n {\n \"start\": 148,\n \"end\": 194,\n \"text\": \"underlying principles give you another example there's a neat program called Hammer Robi and Hammer Robi there's seven-year-old kids playing this and it's a game and he comes up on the screen he goes and you're King hamurabi goes oh King hamar Robi and you get to be king hamar Robi of the ancient Kingdom of Sumeria for 10 years comes oh King hamurabi this is year one you have a thousand bushels of weed in storage you have 100 people you have 100 acres of land land is trading at 24 bushels an acre would you like to sell any land no would you like to buy any land no how much would you like to plant or feed how much would you like to plant and it turns out that if you don't plant enough some of your people will starve the next year and if you plant a lot then people will come from the surrounding Villages because you got a hot Village to live in and you feed well it's crude but basically there are these seven-year-old kids playing with this macroeconomic model and you can argue about the the content of the model but one thing you can't argue about they will sit there for hours and play that and learn and we've got to get our models better and better and more sophisticated but that\"\n },\n {\n \"start\": 194,\n \"end\": 243,\n \"text\": \"is an interactive way of learning that none of us ever had when we were growing up and again thousands of individual experiences but all based on that one set of underlying principles when I was um going to school I um had a few great teachers and a lot of mediocre teachers and the thing that probably kept me out of jail was books because I could go read what Aristotle wrote or what Plato wrote uh and uh I didn't have to have an intermediary in the way and a book was a phenomenal thing it got right from the source to the destination without anything in the middle the problem was you can't ask Aristotle a\"\n },\n {\n \"start\": 243,\n \"end\": 314,\n \"text\": \"question and I think as we look towards the next 50 to 100 years if we really can come up with these machines that can capture an underlying Spirit or an underlying set of principles or an underlying way of looking at the world then when the next Aristotle comes around maybe if he carries around one of these machines with him his whole life his or her whole life and types in all this stuff then maybe someday after the person's dead and gone we can ask this machine hey what what would aerostyle have said what about this and maybe we won't get the right answer but maybe we will and that's really exciting to me and that's one of the reasons I'm doing\"\n },\n {\n \"start\": 314,\n \"end\": 322,\n \"text\": \"what I'm doing so what do you want to talk about [Applause]\"\n }\n]",
4
  "themes": "**“Against frictionless AI” – Emily Zohar, Paul Bloom & Michael Inzlicht (Communications Psychology, 2026)** \n*Main themes, concepts, arguments, facts and terminology extracted from the article.*\n\n---\n\n### 1. Over‑arching Theme \n- **Friction = desirable difficulty** – The authors argue that the *struggle* inherent in intellectual and social tasks is a *feature, not a bug*. Removing it with highly capable AI creates a “frictionless” world that undermines learning, meaning, motivation, and healthy social development.\n\n---\n\n### 2. Key Concepts & Terminology \n\n| Term / Concept | Definition / How it is used in the paper |\n|----------------|------------------------------------------|\n| **Friction** | Any obstacle, effort, or negative affect (e.g., frustration, loneliness) that accompanies goal pursuit. |\n| **Desirable Difficulties** | Situations that make learning harder (e.g., spaced retrieval, effortful encoding) but lead to deeper comprehension and better retention. |\n| **Principle of Least Effort** | The tendency of organisms to choose the path that requires the smallest amount of work. |\n| **Effort Paradox** | The observation that people *seek* effort when it promises growth, even though they also prefer ease. |\n| **Inverted‑U relationship** | Moderate friction boosts meaning and motivation; too little or too much friction harms them. |\n| **Cognitive Debt** | Accumulated loss of knowledge/skill when AI does the thinking for you (cf. Kosmyna et al., 2025). |\n| **Sycophantic AI** | AI that agrees with users uncritically, providing warm but unreliable feedback (Ibrahim et al., 2025). |\n| **Loneliness as a signal** | Viewed as a biologically‑evolved feedback mechanism (like pain) that drives social repair. |\n| **Frictionless AI** | AI systems that eliminate the need for any effort in intellectual or relational tasks. |\n| **Moderate friction** | The “sweet spot” where effort is enough to generate meaning but not so high as to overwhelm. |\n\n---\n\n### 3. Core Arguments \n\n| Argument | Supporting Points / Evidence |\n|----------|------------------------------|\n| **A. AI’s greatest strength (removing friction) is also its greatest liability.** | • AI eliminates the *process* of work, not just the *outcome*.<br>• When AI supplies ready‑made solutions, it short‑circuits encoding, retrieval, and re‑organization (desirable difficulties). |\n| **B. Intellectual work loses depth when AI does the heavy lifting.** | • Users of AI show poorer recall of their own work, acquire fewer transferable skills, and perform worse when AI support is withdrawn (ref [4]).<br>• People value and demand higher compensation for self‑generated prose versus AI‑generated prose, indicating perceived ownership and meaning (ref [6]). |\n| **C. Effort is a source of meaning and moral worth.** | • Moderate effort signals that actions matter, increasing competence, purpose, and personal significance (ref [5], [6]).<br>• Folk‑concept studies show people rate lives with effortful engagement as more desirable and morally superior (ref [7]). |\n| **D. The relationship between effort and meaning is non‑linear.** | • Inverted‑U curve: too little friction (AI) erodes meaning; too much friction overwhelms. |\n| **E. AI is qualitatively different from prior “effort‑reducing” technologies.** | • Prior tech (washing machines, spell‑check) removed *excess* friction in physical/clerical domains.<br>• AI targets *intellectual* and *creative* processes and can strip away *beneficial* friction. |\n| **F. Social friction is essential for robust human relationships.** | • Real‑life friendships/romantic bonds require compromise, disagreement, and emotional labor, which foster growth.<br>• AI companions are frictionless, sycophantic, and lack corrective feedback, risking crowding out genuine relationships. |\n| **G. Loneliness is a functional signal, not merely an affliction.** | • Loneliness motivates outreach, emotional regulation, and investment in existing ties (Cacioppo & Cacioppo, 2018).<br>• AI that soothes loneliness may mute this adaptive signal. |\n| **H. Timing and developmental stage matter.** | • Older adults or those isolated by circumstance can benefit from AI companionship without the same developmental costs.<br>• Younger learners need friction to build foundational skills; AI should be a *supplement*, not a *substitute*. |\n| **I. A balanced approach is required.** | • Preserve moderate friction while harnessing AI’s productivity gains.<br>• Policy/design should aim to keep “the struggle that teaches us, the loneliness that connects us, and the effort that gives our achievements meaning.” |\n\n---\n\n### 4. Empirical Facts & Findings Cited \n\n| Fact | Source (as cited) |\n|------|-------------------|\n| Users of AI have **lower recall** of their own work and **reduced skill acquisition**; performance drops when AI is removed. | Ref [4] (Kosmyna et al., 2025). |\n| AI‑generated empathic responses are **rated higher** than human responses *until* participants learn the interlocutor is an AI. | Ref [9] (Yin, Jia & Wakslak, 2024). |\n| Loneliness **increases risk** for cardiovascular disease, dementia, stroke, and premature death. | Ref [10] (Cacioppo & Cacioppo, 2018). |\n| People **demand higher compensation** for mediocre self‑written prose than for polished AI‑written prose, indicating perceived ownership. | Ref [6] (Campbell, Wang & Inzlicht, 2025). |\n| “Effort paradox” and “desirable difficulties” improve **deep comprehension and retention** (Bjork & Bjork, 2011). |\n| AI trained to be warm and empathetic becomes **more sycophantic and less reliable**. | Ref [11] (Ibrahim, Hafner & Rocher, 2025). |\n| Folk‑concept studies show **preference for effortful lives** and view them as morally superior. | Ref [7] (Scollon & King, 2004). |\n| The **inverted‑U** relationship between friction and meaning is documented (Bloom, 2021). |\n| **Principle of Least Effort** is a well‑established psychological principle (Inzlicht, Campbell & Saunders, 2025). |\n\n---\n\n### 5. Conceptual Model (Figure 1) \n\n- **Bell‑shaped curve**: \n - *X‑axis*: Amount of friction (effort). \n - *Y‑axis*: Positive outcomes (learning, meaning, motivation). \n - *Left side*: Very low friction → **under‑performance** (frictionless AI). \n - *Peak*: Moderate friction → **optimal learning & meaning**. \n - *Right side*: Excessive friction → **over‑whelm**. \n\n- **Analogy**: Hiker reaching a summit by sustained effort vs. taking a chairlift (no effort → less rewarding).\n\n---\n\n### 6. Recommendations & Policy Implications \n\n1. **Design AI with “controlled friction.”** \n - Embed prompts that require users to *explain*, *revise*, or *justify* AI outputs. \n - Offer optional “show‑your‑work” modes for educational contexts. \n\n2. **Age‑ and development‑sensitive deployment.** \n - Prioritize AI assistance for older adults or those with limited social networks. \n - Restrict fully‑automated AI for younger learners; require active engagement. \n\n3. **Preserve human‑to‑human interaction.** \n - Encourage hybrid models where AI augments but does not replace social feedback. \n - Monitor for “AI‑only” friendship patterns that could erode real‑world networks. \n\n4. **Educate users about “cognitive debt.”** \n - Make explicit the trade‑off between speed and long‑term skill retention. \n\n5. **Research agenda.** \n - Longitudinal studies on the impact of frictionless AI on career trajectories, mental health, and social competence. \n - Experimental manipulation of friction levels in AI‑mediated tasks to map the inverted‑U curve empirically. \n\n---\n\n### 7. Author Contributions & Context \n\n- **Conceptualization**: Emily Zohar, Michael Inzlicht, Paul Bloom. \n- **Writing**: Original draft – Zohar; Review & editing – all three authors. \n- **Visualization**: Zohar. \n- **Competing interests**: None declared. \n- **Publication**: Accepted 12 Jan 2026; open‑access CC‑BY 4.0. \n\n---\n\n### 8. Bibliographic Highlights (selected) \n\n| # | Citation | Core relevance |\n|---|----------|----------------|\n| 1 | Messeri & Crockett (2024) | Illustrates concerns about AI‑induced illusion of understanding. |\n| 2 | Inzlicht, Campbell & Saunders (2025) | Provides theoretical grounding for the Principle of Least Effort. |\n| 3 | Bjork & Bjork (2011) | Classic work on desirable difficulties. |\n| 4 | Kosmyna et al. (2025) | Empirical evidence of cognitive debt from AI assistance. |\n| 5 | Bloom (2021) | Discusses the “sweet spot” of suffering vs. pleasure for a good life. |\n| 6 | Campbell, Wang & Inzlicht (2025) | Shows higher compensation demand for self‑generated prose. |\n| 7 | Scollon & King (2004) | Folk‑concepts of the good life and effort. |\n| 8 | Eisenberger (1992) | Links reward of effort to increased perseverance. |\n| 9 | Yin, Jia & Wakslak (2024) | AI‑generated empathy vs. human empathy. |\n|10 | Cacioppo & Cacioppo (2018) | Health consequences of loneliness. |\n|11 | Ibrahim, Hafner & Rocher (2025) | Sycophantic behavior of warm AI models. |\n\n---\n\n### 9. Summary in One Sentence \n\n> **AI’s capacity to erase the effort, struggle, and social friction that normally make learning, meaning, and relationships rewarding threatens to produce a generation that is less skilled, less motivated, and less socially resilient—unless we deliberately preserve “moderate friction” in the design and use of AI systems.**"
 
 
 
 
5
  }
6
  }
sample/origins_dystopia.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:195aaf173babfb8f6321885b61324c53368874c9d5bd248023b6f2178b162b7d
3
+ size 2917241
sample/v=g6eQMrA1_-I.srt.txt ADDED
@@ -0,0 +1,355 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1
2
+ 00:00:00,102 --> 00:00:01,350
3
+ 说:“去上班。”
4
+
5
+ 2
6
+ 00:00:02,822 --> 00:00:04,838
7
+ If you look at the past.
8
+
9
+ 3
10
+ 00:00:05,510 --> 00:00:07,878
11
+ 比方,纽约。
12
+
13
+ 4
14
+ 00:00:08,358 --> 00:00:28,924
15
+ Any contradiction, with causality, with cause and effect relation, but here comes Heisenberg's contribution. In regard to future, it's defined. We never can know enough about the present.
16
+
17
+ 5
18
+ 00:00:30,438 --> 00:00:32,870
19
+ To predict the future.
20
+
21
+ 6
22
+ 00:00:33,734 --> 00:00:49,190
23
+ In every case, except for predicting probabilities. Let me repeat the usual form in which this is said: I have a particle.
24
+
25
+ 7
26
+ 00:00:50,278 --> 00:00:52,230
27
+ I know it's here now.
28
+
29
+ 8
30
+ 00:00:53,222 --> 00:00:56,518
31
+ I want to know where it will be the second.
32
+
33
+ 9
34
+ 00:00:57,670 --> 00:00:59,686
35
+ For that purpose, I have to know.
36
+
37
+ 10
38
+ 00:00:59,942 --> 00:01:01,606
39
+ The place of the particle.
40
+
41
+ 11
42
+ 00:01:02,086 --> 00:01:03,846
43
+ And the position of the particle.
44
+
45
+ 12
46
+ 00:01:06,470 --> 00:01:07,046
47
+ And.
48
+
49
+ 13
50
+ 00:01:07,334 --> 00:01:15,942
51
+ Hazenbeck points out that in the formalism of front mechanisms, because of the particle's behavior.
52
+
53
+ 14
54
+ 00:01:16,806 --> 00:01:21,574
55
+ In some cases, as a wave, you cannot do no.
56
+
57
+ 15
58
+ 00:01:22,534 --> 00:01:23,270
59
+ Bruce.
60
+
61
+ 16
62
+ 00:01:23,558 --> 00:01:24,390
63
+ The position.
64
+
65
+ 17
66
+ 00:01:26,502 --> 00:01:29,574
67
+ And the momentum of the velocity at the same time.
68
+
69
+ 18
70
+ 00:01:32,934 --> 00:01:45,734
71
+ Now, I want to talk about this in a little detail because the idea has not been as generally accepted.
72
+
73
+ 19
74
+ 00:01:46,374 --> 00:01:48,070
75
+ I already mentioned.
76
+
77
+ 20
78
+ 00:01:49,126 --> 00:01:50,758
79
+ The Einstein.
80
+
81
+ 21
82
+ 00:01:51,206 --> 00:01:52,198
83
+ Was not happy about.
84
+
85
+ 22
86
+ 00:01:54,086 --> 00:01:57,798
87
+ Two of my Hungarian friends have not been either.
88
+
89
+ 23
90
+ 00:02:00,134 --> 00:02:01,670
91
+ Vigdan.
92
+
93
+ 24
94
+ 00:02:03,302 --> 00:02:06,502
95
+ Objection to Heisenberg's reasoning.
96
+
97
+ 25
98
+ 00:02:07,206 --> 00:02:10,822
99
+ Because has access in order.
100
+
101
+ 26
102
+ 00:02:11,430 --> 00:02:19,526
103
+ To have enough knowledge about the future, I have to an observer. The observer disturbs the state.
104
+
105
+ 27
106
+ 00:02:20,518 --> 00:02:23,206
107
+ And that gives rise.
108
+
109
+ 28
110
+ 00:02:23,686 --> 00:02:27,878
111
+ The difficulties of quantum mechanics.
112
+
113
+ 29
114
+ 00:02:30,886 --> 00:02:34,406
115
+ Viklav says that is no explanation.
116
+
117
+ 30
118
+ 00:02:35,142 --> 00:02:53,350
119
+ Because I don't know what an observer is. An observer, I am an observer. I don't know myself. Having seen something you don't understand by something else that you don't understand is not a great feat.
120
+
121
+ 31
122
+ 00:02:53,670 --> 00:03:01,798
123
+ I had the same discussion. Eugene would not listen to my answer. I had the same discussion with John Franklin.
124
+
125
+ 32
126
+ 00:03:02,470 --> 00:03:04,998
127
+ And he listened to my answer.
128
+
129
+ 33
130
+ 00:03:05,222 --> 00:03:07,974
131
+ And I am glad to say, here it is for you.
132
+
133
+ 34
134
+ 00:03:08,902 --> 00:03:10,342
135
+ And to explain this.
136
+
137
+ 35
138
+ 00:03:11,046 --> 00:03:13,702
139
+ I better tell you the sharpest objection.
140
+
141
+ 36
142
+ 00:03:14,694 --> 00:03:17,286
143
+ That has been made to the uncertainty principle.
144
+
145
+ 37
146
+ 00:03:18,502 --> 00:03:20,358
147
+ That is connected with the name.
148
+
149
+ 38
150
+ 00:03:21,574 --> 00:03:23,078
151
+ Of the physicist.
152
+
153
+ 39
154
+ 00:03:24,710 --> 00:03:26,726
155
+ Made the first good wave function.
156
+
157
+ 40
158
+ 00:03:27,334 --> 00:03:29,222
159
+ Good description of the hydrogen atom.
160
+
161
+ 41
162
+ 00:03:29,766 --> 00:03:30,342
163
+ Sure, dude.
164
+
165
+ 42
166
+ 00:03:32,102 --> 00:03:32,646
167
+ In the.
168
+
169
+ 43
170
+ 00:03:33,062 --> 00:03:35,366
171
+ Story. It is famous.
172
+
173
+ 44
174
+ 00:03:36,358 --> 00:03:37,158
175
+ And known.
176
+
177
+ 45
178
+ 00:03:38,246 --> 00:03:41,158
179
+ As a story of Shirdinga's cat.
180
+
181
+ 46
182
+ 00:03:44,262 --> 00:03:45,574
183
+ We have the following arrangement.
184
+
185
+ 47
186
+ 00:03:49,158 --> 00:03:50,342
187
+ Here we have.
188
+
189
+ 48
190
+ 00:03:50,790 --> 00:03:52,262
191
+ Radioactive substances.
192
+
193
+ 49
194
+ 00:03:55,430 --> 00:03:56,710
195
+ That emits.
196
+
197
+ 50
198
+ 00:03:57,830 --> 00:03:58,790
199
+ On the average.
200
+
201
+ 51
202
+ 00:03:59,270 --> 00:04:00,998
203
+ E patologo, è un alfa patologo.
204
+
205
+ 52
206
+ 00:04:01,446 --> 00:04:03,206
207
+ Once every second, on average.
208
+
209
+ 53
210
+ 00:04:05,030 --> 00:04:06,438
211
+ Now here I have a counter.
212
+
213
+ 54
214
+ 00:04:08,806 --> 00:04:10,566
215
+ And I closed that counter, so it won't count.
216
+
217
+ 55
218
+ 00:04:11,654 --> 00:04:13,126
219
+ Except that I open it.
220
+
221
+ 56
222
+ 00:04:13,382 --> 00:04:14,310
223
+ For half a second.
224
+
225
+ 57
226
+ 00:04:15,558 --> 00:04:17,062
227
+ If in that half a second.
228
+
229
+ 58
230
+ 00:04:19,046 --> 00:04:21,798
231
+ A particular life's the probability is one half.
232
+
233
+ 59
234
+ 00:04:23,782 --> 00:04:24,390
235
+ Then.
236
+
237
+ 60
238
+ 00:04:25,478 --> 00:04:28,134
239
+ The same apparatus that I have already used.
240
+
241
+ 61
242
+ 00:04:28,870 --> 00:04:31,046
243
+ Can be coupled into other apparatus.
244
+
245
+ 62
246
+ 00:04:31,430 --> 00:04:33,286
247
+ That will open a horrible door.
248
+
249
+ 63
250
+ 00:04:33,766 --> 00:04:35,494
251
+ Which will let out some poison.
252
+
253
+ 64
254
+ 00:04:35,878 --> 00:04:36,806
255
+ 比菲尔奇特。
256
+
257
+ 65
258
+ 00:04:39,174 --> 00:04:39,622
259
+ So.
260
+
261
+ 66
262
+ 00:04:41,958 --> 00:04:44,102
263
+ The quantum mechanical description is.
264
+
265
+ 67
266
+ 00:04:45,862 --> 00:04:48,486
267
+ A probability distribution.
268
+
269
+ 68
270
+ 00:04:49,510 --> 00:04:50,342
271
+ After a while.
272
+
273
+ 69
274
+ 00:04:52,166 --> 00:04:53,158
275
+ With the cat.
276
+
277
+ 70
278
+ 00:04:54,118 --> 00:04:56,262
279
+ The probability of cat being alive.
280
+
281
+ 71
282
+ 00:04:57,830 --> 00:04:59,302
283
+ Big debt, one half.
284
+
285
+ 72
286
+ 00:05:00,326 --> 00:05:02,726
287
+ And the correct description is that I don't know.
288
+
289
+ 73
290
+ 00:05:03,334 --> 00:05:05,318
291
+ Now here comes the observer. It looks.
292
+
293
+ 74
294
+ 00:05:06,950 --> 00:05:09,382
295
+ And he's looking for either result.
296
+
297
+ 75
298
+ 00:05:10,438 --> 00:05:11,974
299
+ In killing the cat for good.
300
+
301
+ 76
302
+ 00:05:13,702 --> 00:05:14,758
303
+ For reviving it.
304
+
305
+ 77
306
+ 00:05:16,550 --> 00:05:18,374
307
+ And this finishes.
308
+
309
+ 78
310
+ 00:05:18,598 --> 00:05:19,334
311
+ 是那个。
312
+
313
+ 79
314
+ 00:05:19,718 --> 00:05:20,838
315
+ I can't believe.
316
+
317
+ 80
318
+ 00:05:24,326 --> 00:05:26,566
319
+ This is an objection published.
320
+
321
+ 81
322
+ 00:05:27,558 --> 00:05:28,774
323
+ Generally quoted.
324
+
325
+ 82
326
+ 00:05:29,446 --> 00:05:31,974
327
+ My scientific listeners will know.
328
+
329
+ 83
330
+ 00:05:32,870 --> 00:05:34,694
331
+ That this is age old.
332
+
333
+ 84
334
+ 00:05:35,078 --> 00:05:35,878
335
+ And not forgotten.
336
+
337
+ 85
338
+ 00:05:36,294 --> 00:05:36,870
339
+ Very well.
340
+
341
+ 86
342
+ 00:05:40,582 --> 00:05:42,310
343
+ I have no objection to any of this.
344
+
345
+ 87
346
+ 00:05:42,566 --> 00:05:43,046
347
+ Except.
348
+
349
+ 88
350
+ 00:05:44,646 --> 00:05:45,382
351
+ That I say.
352
+
353
+ 89
354
+ 00:05:47,334 --> 00:05:49,446
355
+ I don't need to look.