second-brain/src/second_brain
Travis Herbranson 33ae5a6f7d pipeline split: tower transcribe worker + claim queue + faster-whisper
Splits pull+transcribe (now tower-side, eager) from extract+embed
(stays on the dev scheduler). Three machine-coordination pieces land
together because they reference each other:

- v3 migration adds sources.claimed_by + claimed_at — observability +
  stale-claim recovery columns. The actual race-safety primitive is
  `SELECT ... FOR UPDATE SKIP LOCKED` in the new claim helper, so two
  machines can poll the queue without doubling work.

- src/second_brain/claim.py owns the claim dance (claim_next_source,
  release_claim, reap_stale_claims). Both stage gates filter by
  source_type so the tower never grabs articles and the dev side never
  grabs videos.

- src/second_brain/transcribe.py wraps faster-whisper (lazy-imported so
  it stays out of the dev install). resolve_settings() reads env >
  [whisper] block > defaults, falling back to int8 on cpu / float16 on
  cuda when compute_type is unspecified. Default model large-v3.

- src/second_brain/scheduler/transcribe_worker.py is the long-running
  poll loop. Reads pipeline_settings every iteration so the dashboard's
  enable/window/max-items/max-video-length take effect within one
  cycle. Reaps stale claims at startup. SIGTERM-clean. DB-unreachable
  backs off with a log line; never crash-loops.

- adapters/youtube.py drops the torch-whisper transcribe path; pull
  stays. Removes openai-whisper from the default deps and gates
  faster-whisper behind a new `tower` extra (uv sync --extra tower).

- main.py: new `second-brain transcribe-worker` (--once for ad-hoc).
  `process` now article-only on the pull side but still picks up
  TRANSCRIBED of any source_type for the extract step.

Live-verified: migration applies clean, transcribe-worker --once
honors transcription_enabled=false gate.
2026-05-25 10:11:37 -04:00
..
adapters pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
compiler gauntlet: fix lint — drop unused imports + reorder models.py + add dev deps 2026-05-24 22:52:08 -04:00
context gauntlet: fix lint — drop unused imports + reorder models.py + add dev deps 2026-05-24 22:52:08 -04:00
embeddings embeddings: register pool close() at interpreter exit 2026-05-24 23:33:13 -04:00
extractor gauntlet: fix lint — drop unused imports + reorder models.py + add dev deps 2026-05-24 22:52:08 -04:00
llm switch extractor to Claude CLI backend + pipeline fixes 2026-05-24 21:09:20 -04:00
scheduler pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
web web: dashboard + settings editor (HTMX save) + pipeline observability 2026-05-25 08:15:29 -04:00
__init__.py project init 2026-05-22 19:08:22 -04:00
claim.py pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
config.py pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
database.py postgres migration: schema, models, embeddings, alembic 2026-05-24 22:46:48 -04:00
main.py pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
models.py pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00
settings_store.py settings: v2 migration + ORM + settings_store helper 2026-05-25 08:11:53 -04:00
transcribe.py pipeline split: tower transcribe worker + claim queue + faster-whisper 2026-05-25 10:11:37 -04:00