Commit graph

159 commits

Author SHA1 Message Date
jlightner
df0ff28f5e feat: Synced CreatorDetailResponse with backend schema (7 new fields) a…
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/CreatorDetail.tsx"

GSD-Task: S01/T01
2026-04-03 08:50:12 +00:00
jlightner
ea479f093e fix: run card collapse flicker — auto-expand only on first load, not on every re-render
The load callback had expandedRunId in its dependency array, so collapsing
(setting expandedRunId=null) triggered a reload which re-expanded it.
Replaced with a useRef flag that fires once.
2026-04-03 08:21:51 +00:00
jlightner
76e3543a99 fix: revert plugin pill + stats colors to cyan, lower title bar z-index so admin dropdown renders above it 2026-04-03 07:54:15 +00:00
jlightner
74e89e8a3f fix: ToC border-left back to cyan accent (missed purple revert) 2026-04-03 07:46:15 +00:00
jlightner
49e986a142 style: back arrow inline with article title, title bumped to 1.5rem 2026-04-03 07:44:32 +00:00
jlightner
0d91e87232 style: related techniques cards use same recent-card styling as homepage Recently Added 2026-04-03 07:43:03 +00:00
jlightner
953ab008fb fix: revert purple accents, move stats/tags into grid main column, shrink sidebar to 16rem, right-align ToC, fix stray CSS brace 2026-04-03 07:39:28 +00:00
jlightner
f5d35a0162 fix: title bar background var(--color-bg) → var(--color-bg-page) — was transparent, content bled through 2026-04-03 07:26:54 +00:00
jlightner
4d29ec12ce fix: remove overflow-x:hidden from html,body — was creating scroll container that broke position:sticky on title bar 2026-04-03 07:25:44 +00:00
jlightner
2142efece3 fix: remove overflow-x:hidden from .app-main — was breaking position:sticky on title bar 2026-04-03 07:23:11 +00:00
jlightner
0623fcf430 style: purple (#c084fc) accent touches — plugin pills, stat numbers, section labels, ToC border, back-link hover 2026-04-03 07:21:29 +00:00
jlightner
149e4fc147 style: thinner gradient border on featured technique card (2px → 1px) 2026-04-03 07:18:35 +00:00
jlightner
a235fd9e36 feat: restructure technique page — bibliography key moments, ToC-only sidebar, sticky title bar, solid featured border
- Move key moments below prose as bibliography-style sources with [N] indices
- Move signal chains and related techniques to main column below key moments
- Sidebar now dedicated to ToC only, sticky with scroll tracking
- Replace position:fixed reading header with sticky title bar within content area
- ToC smooth-scrolls on click with history.replaceState for hash updates
- Featured technique card: solid cyan-to-purple gradient border (border-image)
- Remove ReadingHeader component (replaced by title bar)
- Hide sidebar ToC on mobile (single-column reading)
- Related techniques grid defaults to 2-column in main content area
2026-04-03 07:16:03 +00:00
jlightner
afd079ece7 fix: move scroll-spy hooks above early returns to fix React hooks ordering crash
M016 added useState/useMemo/useEffect hooks after conditional early
returns (loading/notFound/error), violating React rules of hooks.
Moved all hooks above the early returns so they execute on every render.
2026-04-03 06:46:16 +00:00
jlightner
1b54a86225 feat: Added .section-heading utility class to unify four heading styles…
- "frontend/src/App.css"
- "frontend/src/pages/Home.tsx"

GSD-Task: S06/T02
2026-04-03 06:22:11 +00:00
jlightner
596331156a feat: Lifted scroll-spy state from TableOfContents to TechniquePage, cr…
- "frontend/src/components/ReadingHeader.tsx"
- "frontend/src/components/TableOfContents.tsx"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"

GSD-Task: S05/T01
2026-04-03 06:01:13 +00:00
jlightner
9acfa9bc20 feat: Added IntersectionObserver scroll-spy to ToC highlighting the act…
- "frontend/src/components/TableOfContents.tsx"
- "frontend/src/App.css"

GSD-Task: S04/T02
2026-04-03 05:54:14 +00:00
jlightner
1a7c11cac1 feat: Moved Table of Contents from main prose column to sidebar top; re…
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/components/TableOfContents.tsx"
- "frontend/src/App.css"

GSD-Task: S04/T01
2026-04-03 05:52:47 +00:00
jlightner
ee3cbb74f7 feat: Added inline SVG logo mark (cyan arc + dot from favicon) to heade…
- "frontend/src/App.tsx"
- "frontend/src/App.css"

GSD-Task: S03/T02
2026-04-03 05:47:05 +00:00
jlightner
ab11a00765 fix: Added collapse arrow styling, stage chevrons, filter right-alignme…
- "frontend/src/App.css"
- "frontend/src/pages/AdminPipeline.tsx"

GSD-Task: S02/T01
2026-04-03 05:38:10 +00:00
jlightner
9e31e2b744 feat: Unified homepage layout: 42rem max-width on 5 sections, removed b…
- "frontend/src/App.css"

GSD-Task: S01/T01
2026-04-03 05:31:46 +00:00
jlightner
489ad88893 fix: remove moments from recent cards, pin footer to bottom of card 2026-04-03 05:14:17 +00:00
jlightner
e52506511d fix: admin dropdown hover gap bridge + recent card footer layout (creator left, moments, date right) 2026-04-03 05:07:06 +00:00
jlightner
b4bea10067 feat: Added hover-to-open with 150ms leave delay and matchMedia desktop…
- "frontend/src/components/AdminDropdown.tsx"

GSD-Task: S05/T01
2026-04-03 04:41:04 +00:00
jlightner
82998c6d8d feat: Added Trending Searches section to homepage with real-time popula…
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"

GSD-Task: S04/T01
2026-04-03 04:37:36 +00:00
jlightner
cf90dbb9f0 feat: Homepage displays a stats scorecard showing live article and crea…
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"

GSD-Task: S03/T02
2026-04-03 04:29:21 +00:00
jlightner
051f1046b0 feat: render last-updated dates on creators page and homepage cards 2026-04-03 04:17:53 +00:00
jlightner
5cf50e84de fix: StageTabView limit 500→200 to stay within API max 2026-04-03 03:32:34 +00:00
jlightner
98107c20f5 fix: StageTabView useCallback dependency loop — use ref for initial tab selection 2026-04-03 03:30:45 +00:00
jlightner
80ac367e23 feat: Stage tab view for pipeline runs, rename stale→orphaned pages
- Expanded runs now show horizontal stage tabs (Segment→Extract→Classify→Synthesize→Embed)
- Each tab has status indicator dot (idle/running/done/error) with pulse animation
- Clicking a tab shows that stage's events with summary stats (LLM calls, tokens, duration)
- Error events auto-expanded with monospace error detail block
- Auto-selects the error stage or latest active stage on expand
- Renamed 'stale pages' to 'orphaned pages' in admin header
2026-04-03 03:24:43 +00:00
jlightner
9a8d2ea5c9 feat: Show article + creator count stats on admin techniques page 2026-04-03 02:38:09 +00:00
jlightner
df1d6af84e style: Admin technique pages — full CSS styling, description text 2026-04-03 02:33:23 +00:00
jlightner
7bdba76d50 feat: Added technique_section result rendering with Section badge, deep…
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/components/SearchAutocomplete.tsx"

GSD-Task: S07/T02
2026-04-03 02:15:07 +00:00
jlightner
edfabb037a feat: Built AdminTechniquePages page at /admin/techniques with table, e…
- "frontend/src/pages/AdminTechniquePages.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/App.tsx"
- "frontend/src/components/AdminDropdown.tsx"

GSD-Task: S06/T02
2026-04-03 01:59:49 +00:00
jlightner
304f3bc069 feat: Added format-aware v2 body_sections rendering with nested TOC, ci…
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/components/TableOfContents.tsx"
- "frontend/src/utils/citations.tsx"
- "frontend/src/App.css"

GSD-Task: S05/T01
2026-04-03 01:42:56 +00:00
jlightner
d04b810289 feat: add wipe-all-output admin endpoint and UI button
Deletes all technique pages, versions, links, key moments, pipeline
events/runs, Qdrant vectors, and Redis cache while preserving creators,
videos, and transcript segments. Resets all video status to not_started.
Double-confirm dialog in the UI prevents accidental use.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:17:48 +00:00
jlightner
da0b4b5fd6 feat: add pipeline iteration tooling — offline test harness, stage re-runs, chunking inspector
Drops prompt iteration cycles from 20-30 min to under 5 min by enabling
stage-isolated re-runs and offline prompt testing against exported fixtures.

Phase 1: Offline prompt test harness
- export_fixture.py: export stage 5 inputs from DB to reusable JSON fixtures
- test_harness.py: run synthesis offline with any prompt, no Docker needed
- promote subcommand: deploy winning prompts with backup and optional git commit

Phase 2: Classification data persistence
- Dual-write classification to PostgreSQL + Redis (fixes 24hr TTL data loss)
- Clean retrigger now clears Redis cache keys (fixes stale data bug)
- Alembic migration 011: classification_data JSONB column + stage_rerun enum

Phase 3: Stage-isolated re-run
- run_single_stage Celery task with prerequisite validation and prompt overrides
- _load_prompt supports per-video Redis overrides for testing custom prompts
- POST /admin/pipeline/rerun-stage/{video_id}/{stage_name} endpoint
- Frontend: Re-run Stage modal with stage selector and prompt override textarea

Phase 4: Chunking inspector
- GET /admin/pipeline/chunking/{video_id} returns topic boundaries,
  classifications, and synthesis group breakdowns
- Frontend: collapsible Chunking Inspector panel per video

Phase 5: Prompt deployment & stale data cleanup
- GET /admin/pipeline/stale-pages detects pages from older prompts
- POST /admin/pipeline/bulk-resynthesize re-runs a stage on all completed videos
- Frontend: stale pages indicator badge with one-click bulk re-synth

Phase 6: Automated iteration foundation
- Quality CLI --video-id flag auto-exports fixture from DB
- POST /admin/pipeline/optimize-prompt/{stage} dispatches optimization as Celery task

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:47:46 +00:00
jlightner
2cf9ae9bd6 fix: Retrigger button now uses clean-retrigger (wipes events + re-runs from scratch)
The plain trigger endpoint short-circuits on status=complete — 'nothing to do'.
Retrigger must use clean-retrigger to reset pipeline state first.
2026-04-01 07:34:01 +00:00
jlightner
18de2b3065 fix: Rename 'Trigger (debug)' button to 'Retrigger' 2026-04-01 07:25:20 +00:00
jlightner
c7ac4be860 feat: Store LLM request params (max_tokens, model, modality) in pipeline events
- _make_llm_callback now accepts request_params dict
- All 6 LLM call sites pass max_tokens, model_override, modality, response_model, hard_limit
- request_params stored in payload JSONB on every llm_call event (always, not just debug mode)
- Frontend JSON export includes full payload + request_params at top level
- DebugPayloadViewer shows 'Request Params' section even with debug mode off
- Answers whether max_tokens is actually being sent on pipeline requests
2026-04-01 07:01:57 +00:00
jlightner
5f608b8889 fix: Parallel search with match_context, deterministic Qdrant IDs, raised embedding timeout
- Search now runs semantic + keyword in parallel, merges and deduplicates
- Keyword results always included with match_context explaining WHY matched
- Semantic results filtered by minimum score threshold (0.45)
- match_context shows 'Creator: X', 'Tag: Y', 'Title match', 'Content: ...'
- Qdrant points use deterministic uuid5 IDs (no more duplicates on reindex)
- Embedding timeout raised from 300ms to 2s (Ollama needs it)
- _enrich_qdrant_results reads creator_name from payload before DB fallback
- Frontend displays match_context as highlighted bar on search result cards
2026-04-01 06:54:34 +00:00
jlightner
630d3fa477 feat: Created SortDropdown component and useSortPreference hook, integr…
- "frontend/src/components/SortDropdown.tsx"
- "frontend/src/hooks/useSortPreference.ts"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/pages/SubTopicPage.tsx"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/App.css"

GSD-Task: S02/T02
2026-04-01 06:41:52 +00:00
jlightner
c1cdba14f2 feat: Added partial_matches fallback UI to search results — shows muted…
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/App.css"

GSD-Task: S01/T03
2026-04-01 06:41:52 +00:00
jlightner
89c3f4fcc4 feat: Enrich in-progress stage display and memoize pipeline page
In-progress stages now show:
- Live elapsed time (ticks every second) next to the active stage dot
- Run-level token count so far

Performance: wrapped StageTimeline, StatusFilter, WorkerStatus, and
RecentActivityFeed with React.memo. Memoized filteredVideos with useMemo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 22:10:07 -05:00
jlightner
a216f60093 style: Custom dark-theme checkboxes on pipeline admin page
Replace default browser checkboxes with custom styled versions that blend
with the dark UI — transparent background, muted border, cyan accent on check.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 17:23:33 -05:00
jlightner
0abd11299e feat: Add real-time text search filter on pipeline admin page
Filters video list by filename or creator name as you type. Works
alongside the existing status and creator dropdown filters. Includes
a clear button when text is entered.
2026-03-31 17:38:31 +00:00
jlightner
564eb2a636 feat: Change global search shortcut from Cmd+K to Ctrl+Shift+F 2026-03-31 17:33:09 +00:00
jlightner
604e9711d1 feat: Add tooltips to stage timeline dots showing stage name on hover 2026-03-31 17:30:45 +00:00
jlightner
d7de26b86b feat: Add context labels to multi-call pipeline stages
Stage 3 (extraction) LLM calls now show the topic group label (e.g.,
'Sound Design Basics') and Stage 5 (synthesis) calls show the category
name. Displayed as a cyan italic label in the event row between the
event type badge and model name. Helps admins understand why there are
multiple LLM calls per stage.
2026-03-31 17:27:40 +00:00
jlightner
af3f1a6663 feat: Pipeline runs — per-execution tracking with run-scoped events
Data model:
- New pipeline_runs table (id, video_id, run_number, trigger, status,
  started_at, finished_at, error_stage, total_tokens)
- pipeline_events gains run_id FK (nullable for backward compat)
- Alembic migration 010_add_pipeline_runs

Backend:
- run_pipeline() creates a PipelineRun, threads run_id through all stages
- _emit_event() and _make_llm_callback() accept and store run_id
- Stage 6 (final) calls _finish_run() to mark complete with token totals
- mark_pipeline_error marks run as error
- Revoke marks running runs as cancelled
- Trigger endpoints pass trigger type (manual, clean_reprocess)
- New GET /admin/pipeline/runs/{video_id} — lists runs with event counts
- GET /admin/pipeline/events supports ?run_id= filter

Frontend:
- Expanded video detail now shows RunList instead of flat EventLog
- Each run is a collapsible card showing: run number, trigger type,
  status badge, timestamps, token count, event count
- Latest run auto-expands, older runs collapsed
- Legacy events (pre-run-tracking) shown as separate collapsible section
- Run cards color-coded: cyan border for running, red for error,
  gray for cancelled
- EventLog accepts optional runId prop to scope events to a single run
2026-03-31 17:13:41 +00:00