transcripts: harden delete surface + segment_path create flag
Summary: ship CPO req_2qn22qml for transcripts-hardening by replacing the transcripts delete confirm() flow with a proper modal, hoisting STREAM_RE into think.utils and validating transcript stream path params, adding is_supervisor_up() plus DELETE-time search_index_warning signaling, and teaching segment_path() to skip mkdir on read paths so missing segments stop materializing phantom chronicle directories.
segment_path audit: apps/speakers/routes.py:434,494,572,613,659 — read — set create=False; apps/speakers/discovery.py:116,223,249 — read — set create=False; apps/speakers/owner.py:345 — read — set create=False; apps/speakers/attribution.py:210 — read — set create=False; apps/activities/routes.py:269,357 — read — set create=False; apps/transcripts/routes.py:254 — read — set create=False; talent/activity_state.py:127 — read — set create=False; talent/activities.py:49,64 — read — set create=False; think/cluster.py:522 — read — set create=False; apps/transcripts/routes.py:509 — rmtree-adjacent — set create=False; apps/transcripts/routes.py:508 — read/day precheck — set day_path(create=False). apps/speakers/routes.py:809,911,1022 — write — left default; apps/speakers/call.py:251 — write — left default; apps/speakers/discovery.py:388 — write — left default; apps/speakers/owner.py:143 — write — left default; apps/speakers/bootstrap.py:151,616 — write — left default; apps/speakers/attribution.py:567 — write — left default; apps/observer/routes.py:432,609 — write — left default; talent/speaker_attribution.py:39,189 — write — left default; convey/chat_stream.py:57 — write — left default.
Known unrelated red gates: make test-app APP=speakers still fails 21 tests on main and 22 on this branch; the +1 delta is resolved by merging main commit fc5d6ac7. make test-app APP=observer fails identically to main from pre-existing chronicle fixture drift. make verify-api only fails on search/search, search/day-results, and graph/graph score/recency drift, while browser verify remains 19/19 green including transcripts/smoke.
T2 carry-forward: the modal now promises "~30 seconds to undo," but the server still shutil.rmtree()s immediately; T2 lands the server-authoritative undo window.
Co-Authored-By: Codex <codex@openai.com>