jlightner
1013a333b1
chore: remove .gsd/ from tracking, add to .gitignore
2026-04-13 23:50:05 -05:00
jlightner
26a5d0e0ef
fix: crypto.randomUUID fallback for HTTP contexts
...
Chat page and ChatWidget used crypto.randomUUID() for conversation IDs,
which is only available in secure contexts (HTTPS). On HTTP, this throws
'crypto.randomUUID is not a function'. Added generateUUID() utility with
Math.random-based fallback.
2026-04-05 06:05:17 +00:00
jlightner
96491ac70a
fix: LLM config, task time limits, base_url, fallback model, debug Redis caching
...
- Add BASE_URL setting to config.py, replace hardcoded localhost:8096 in notifications
- Fix LLM_FALLBACK_MODEL default from fyn-llm-agent-chat to qwen2.5:7b
- Fix docker-compose LLM_FALLBACK_MODEL to use env var with correct default
- Add BASE_URL env var to API and worker in docker-compose.yml
- Add soft_time_limit/time_limit to all pipeline stage tasks (prevent stuck workers)
- Cache Redis connection in _is_debug_mode() instead of creating per-call
- Remove duplicate test files in backend/tests/notifications/
2026-04-05 06:01:54 +00:00
jlightner
41b0046361
chore: auto-commit after complete-milestone
...
GSD-Unit: M025
2026-04-04 15:42:06 +00:00
jlightner
64c0a47816
feat: Created 198-line Newcomer-Guide.md with 8 sections covering full…
...
- "Newcomer-Guide.md"
GSD-Task: S11/T02
2026-04-04 15:35:39 +00:00
jlightner
e77f8e0fea
docs: Updated 10 Forgejo wiki pages with M025 feature documentation — n…
...
- "Home.md"
- "API-Surface.md"
- "Data-Model.md"
- "Frontend.md"
- "Configuration.md"
- "Chat-Engine.md"
- "Deployment.md"
- "Decisions.md"
GSD-Task: S11/T01
2026-04-04 15:32:48 +00:00
jlightner
4b810c04ea
feat: Browser-validated R015, R037, R038, R039, R041 against live ub01:…
...
- ".gsd/REQUIREMENTS.md"
GSD-Task: S10/T02
2026-04-04 15:22:04 +00:00
jlightner
612cae3491
feat: Added ReadingHeader sticky bar that slides in when scrolling past…
...
- "frontend/src/components/ReadingHeader.tsx"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"
GSD-Task: S10/T01
2026-04-04 15:14:05 +00:00
jlightner
4854dad086
feat: Ran manual chat evaluation against live endpoint, documented qual…
...
- ".gsd/milestones/M025/slices/S09/S09-QUALITY-REPORT.md"
- "backend/pipeline/quality/results/chat_eval_baseline.json"
GSD-Task: S09/T03
2026-04-04 14:50:44 +00:00
jlightner
3cbb614654
test: Rewrote _SYSTEM_PROMPT_TEMPLATE with citation density rules, resp…
...
- "backend/chat_service.py"
GSD-Task: S09/T02
2026-04-04 14:45:09 +00:00
jlightner
846db2aad5
test: Created chat-specific LLM-as-judge scorer (5 dimensions), SSE-par…
...
- "backend/pipeline/quality/chat_scorer.py"
- "backend/pipeline/quality/chat_eval.py"
- "backend/pipeline/quality/fixtures/chat_test_suite.yaml"
- "backend/pipeline/quality/__main__.py"
GSD-Task: S09/T01
2026-04-04 14:43:52 +00:00
jlightner
160adc24bf
test: Created standalone async load test script that fires concurrent c…
...
- "scripts/load_test_chat.py"
GSD-Task: S08/T02
2026-04-04 14:33:29 +00:00
jlightner
899ab742a8
test: Added automatic primary→fallback LLM endpoint switching in ChatSe…
...
- "backend/chat_service.py"
- "backend/tests/test_chat.py"
- "docker-compose.yml"
GSD-Task: S08/T01
2026-04-04 14:31:28 +00:00
jlightner
c42d21a29f
feat: Added Export My Data download button to CreatorDashboard with loa…
...
- "frontend/src/pages/CreatorDashboard.tsx"
- "frontend/src/pages/CreatorDashboard.module.css"
- "frontend/src/api/creator-dashboard.ts"
GSD-Task: S07/T02
2026-04-04 14:19:30 +00:00
jlightner
8b2876906c
chore: Added GET /creator/export endpoint that returns a ZIP archive co…
...
- "backend/routers/creator_dashboard.py"
- "backend/tests/test_export.py"
GSD-Task: S07/T01
2026-04-04 14:16:56 +00:00
jlightner
cfc7e95d28
feat: Wrote NetworkX vs Neo4j benchmark report with production measurem…
...
- "docs/graph-backend-evaluation.md"
GSD-Task: S06/T01
2026-04-04 14:05:55 +00:00
jlightner
6f3a0cc3d2
feat: Built CreatorTransparency page with four collapsible sections, AP…
...
- "frontend/src/api/creator-transparency.ts"
- "frontend/src/pages/CreatorTransparency.tsx"
- "frontend/src/pages/CreatorTransparency.module.css"
- "frontend/src/App.tsx"
- "frontend/src/pages/CreatorDashboard.tsx"
GSD-Task: S05/T02
2026-04-04 13:58:33 +00:00
jlightner
b32fc5134b
feat: Added GET /creator/transparency endpoint returning technique page…
...
- "backend/schemas.py"
- "backend/routers/creator_dashboard.py"
GSD-Task: S05/T01
2026-04-04 13:55:13 +00:00
jlightner
be1919e223
feat: Added GET /admin/usage endpoint with today/week/month token aggre…
...
- "backend/routers/admin.py"
- "frontend/src/api/admin-usage.ts"
- "frontend/src/pages/AdminUsage.tsx"
- "frontend/src/pages/AdminUsage.module.css"
- "frontend/src/App.tsx"
- "frontend/src/components/AdminDropdown.tsx"
- "frontend/src/api/index.ts"
GSD-Task: S04/T02
2026-04-04 13:44:44 +00:00
jlightner
a5d3af55ca
feat: Built Redis sliding-window rate limiter, ChatUsageLog model with…
...
- "backend/rate_limiter.py"
- "backend/models.py"
- "backend/routers/chat.py"
- "backend/chat_service.py"
- "backend/config.py"
- "alembic/versions/031_add_chat_usage_log.py"
GSD-Task: S04/T01
2026-04-04 13:36:29 +00:00
jlightner
d243344ce8
feat: Built 3-step onboarding wizard (Welcome → Consent → Tour), wired…
...
- "frontend/src/pages/CreatorOnboarding.tsx"
- "frontend/src/pages/CreatorOnboarding.module.css"
- "frontend/src/api/auth.ts"
- "frontend/src/context/AuthContext.tsx"
- "frontend/src/pages/Login.tsx"
- "frontend/src/App.tsx"
GSD-Task: S03/T02
2026-04-04 13:16:58 +00:00
jlightner
51e3e75cf8
feat: Added onboarding_completed flag to User model, UserResponse schem…
...
- "backend/models.py"
- "backend/schemas.py"
- "backend/routers/auth.py"
- "alembic/versions/030_add_onboarding_completed.py"
GSD-Task: S03/T01
2026-04-04 13:13:05 +00:00
jlightner
4221bae3eb
feat: Added ≤768px and ≤400px responsive breakpoints for admin pipeline…
...
- "frontend/src/App.css"
GSD-Task: S02/T03
2026-04-04 13:04:42 +00:00
jlightner
60b281b9d8
feat: Added ≤400px responsive breakpoints to ConsentDashboard, CreatorS…
...
- "frontend/src/pages/ConsentDashboard.module.css"
- "frontend/src/pages/CreatorSettings.module.css"
- "frontend/src/pages/Login.module.css"
- "frontend/src/pages/Register.module.css"
GSD-Task: S02/T02
2026-04-04 12:55:34 +00:00
jlightner
b893abead1
feat: Audited all 9 public-facing pages at 375px and 768px viewports —…
...
- "frontend/src/App.css"
GSD-Task: S02/T01
2026-04-04 12:48:08 +00:00
jlightner
cb3a6c919c
test: Added GET/PUT notification preferences endpoints, signed-token un…
...
- "backend/routers/notifications.py"
- "backend/main.py"
- "backend/tests/notifications/test_notifications.py"
- "frontend/src/api/notifications.ts"
- "frontend/src/pages/CreatorSettings.tsx"
GSD-Task: S01/T03
2026-04-04 12:27:18 +00:00
jlightner
5e4b173917
feat: Built send_digest_emails Celery task with per-user content queryi…
...
- "backend/tasks/__init__.py"
- "backend/tasks/notifications.py"
- "backend/worker.py"
- "docker-compose.yml"
GSD-Task: S01/T02
2026-04-04 12:15:43 +00:00
jlightner
34a45d1c8e
chore: Added SMTP config, User notification_preferences JSONB, EmailDig…
...
- "backend/config.py"
- "backend/models.py"
- "backend/schemas.py"
- "backend/services/email.py"
- "alembic/versions/029_add_email_digest.py"
GSD-Task: S01/T01
2026-04-04 12:11:13 +00:00
jlightner
0f9e76babd
chore: auto-commit after complete-milestone
...
GSD-Unit: M024
2026-04-04 12:02:25 +00:00
jlightner
a4a6187de2
docs: Updated 7 Forgejo wiki pages with M024 feature documentation cove…
...
- "Home.md"
- "Data-Model.md"
- "API-Surface.md"
- "Frontend.md"
- "Pipeline.md"
- "Player.md"
- "Chat-Engine.md"
GSD-Task: S06/T01
2026-04-04 11:56:06 +00:00
jlightner
0eecee4271
feat: Extract shared citation parser and formatTime utilities, add time…
...
- "frontend/src/utils/chatCitations.tsx"
- "frontend/src/utils/formatTime.ts"
- "frontend/src/api/chat.ts"
- "frontend/src/pages/ChatPage.tsx"
- "frontend/src/pages/ChatPage.module.css"
- "frontend/src/components/ChatWidget.tsx"
- "frontend/src/components/ChatWidget.module.css"
GSD-Task: S05/T02
2026-04-04 11:46:00 +00:00
jlightner
f706afe8f6
feat: Added source_video_id, start_time, end_time, and video_filename t…
...
- "backend/search_service.py"
- "backend/chat_service.py"
GSD-Task: S05/T01
2026-04-04 11:40:59 +00:00
jlightner
a60f4074dc
chore: Add GET/PUT shorts-template admin endpoints, collapsible templat…
...
- "backend/routers/creators.py"
- "backend/schemas.py"
- "frontend/src/api/templates.ts"
- "frontend/src/pages/HighlightQueue.tsx"
- "frontend/src/pages/HighlightQueue.module.css"
- "backend/routers/shorts.py"
- "backend/pipeline/stages.py"
- "frontend/src/api/shorts.ts"
GSD-Task: S04/T03
2026-04-04 11:25:29 +00:00
jlightner
fa493e2640
feat: Built ffmpeg-based card renderer with concat demuxer pipeline and…
...
- "backend/pipeline/card_renderer.py"
- "backend/pipeline/shorts_generator.py"
- "backend/pipeline/stages.py"
- "backend/models.py"
- "alembic/versions/028_add_shorts_template.py"
- "backend/pipeline/test_card_renderer.py"
GSD-Task: S04/T02
2026-04-04 11:17:38 +00:00
jlightner
125983588d
feat: Created ASS subtitle generator with karaoke word-by-word highligh…
...
- "backend/pipeline/caption_generator.py"
- "backend/pipeline/shorts_generator.py"
- "backend/pipeline/stages.py"
- "backend/models.py"
- "alembic/versions/027_add_captions_enabled.py"
- "backend/pipeline/test_caption_generator.py"
GSD-Task: S04/T01
2026-04-04 11:12:19 +00:00
jlightner
18e9a4dce1
feat: Wired /embed/:videoId route outside AppShell for chrome-free rend…
...
- "frontend/src/App.tsx"
- "frontend/src/pages/WatchPage.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T02
2026-04-04 10:59:14 +00:00
jlightner
8444fbdb12
feat: Extracted shared copyToClipboard utility and created EmbedPlayer…
...
- "frontend/src/utils/clipboard.ts"
- "frontend/src/pages/EmbedPlayer.tsx"
- "frontend/src/pages/EmbedPlayer.module.css"
- "frontend/src/pages/ShortPlayer.tsx"
GSD-Task: S03/T01
2026-04-04 10:55:21 +00:00
jlightner
9208b134b6
feat: Added collapsible inline video player to TechniquePage with chapt…
...
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T02
2026-04-04 10:48:12 +00:00
jlightner
3c99084eb2
feat: Replaced thin 3px line markers with 12px color-coded circle pins,…
...
- "frontend/src/components/ChapterMarkers.tsx"
- "frontend/src/components/PlayerControls.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T01
2026-04-04 10:44:45 +00:00
jlightner
160b1a8445
feat: Added public ShortPlayer page at /shorts/:token with video playba…
...
- "frontend/src/pages/ShortPlayer.tsx"
- "frontend/src/pages/ShortPlayer.module.css"
- "frontend/src/api/shorts.ts"
- "frontend/src/App.tsx"
- "frontend/src/pages/HighlightQueue.tsx"
- "frontend/src/pages/HighlightQueue.module.css"
GSD-Task: S01/T02
2026-04-04 10:35:56 +00:00
jlightner
5f4b960dc1
feat: Added share_token column with migration 026, wired token generati…
...
- "backend/models.py"
- "alembic/versions/026_add_share_token.py"
- "backend/pipeline/stages.py"
- "backend/routers/shorts.py"
- "backend/routers/shorts_public.py"
- "backend/main.py"
GSD-Task: S01/T01
2026-04-04 10:33:00 +00:00
jlightner
2c5d084c49
chore: auto-commit after complete-milestone
...
GSD-Unit: M023
2026-04-04 10:23:20 +00:00
jlightner
3a5fdad6b3
feat: Updated 8 Forgejo wiki pages with M023 features: post editor, Min…
...
- "Home.md (wiki)"
- "Data-Model.md (wiki)"
- "API-Surface.md (wiki)"
- "Frontend.md (wiki)"
- "Chat-Engine.md (wiki)"
- "Decisions.md (wiki)"
- "Configuration.md (wiki)"
- "_Sidebar.md (wiki)"
GSD-Task: S05/T01
2026-04-04 10:17:32 +00:00
jlightner
4db33399e9
feat: Added getTierLabel() helper, gradient track fill via --slider-fil…
...
- "frontend/src/components/ChatWidget.tsx"
- "frontend/src/components/ChatWidget.module.css"
GSD-Task: S04/T02
2026-04-04 10:06:46 +00:00
jlightner
1062e003bf
feat: Replaced 3-tier step function with 5-tier continuous interpolatio…
...
- "backend/chat_service.py"
- "backend/tests/test_chat.py"
GSD-Task: S04/T01
2026-04-04 10:04:47 +00:00
jlightner
84d8dc4455
feat: Added shorts router with generate/list/download endpoints, fronte…
...
- "backend/routers/shorts.py"
- "backend/main.py"
- "frontend/src/api/shorts.ts"
- "frontend/src/pages/HighlightQueue.tsx"
- "frontend/src/pages/HighlightQueue.module.css"
GSD-Task: S03/T03
2026-04-04 09:52:01 +00:00
jlightner
0007528e77
feat: Added shorts_generator.py with 3 format presets and stage_generat…
...
- "backend/pipeline/shorts_generator.py"
- "backend/pipeline/stages.py"
GSD-Task: S03/T02
2026-04-04 09:47:40 +00:00
jlightner
dfc5aa2ae7
chore: Added GeneratedShort model with FormatPreset/ShortStatus enums,…
...
- "backend/models.py"
- "backend/config.py"
- "docker/Dockerfile.api"
- "docker-compose.yml"
- "alembic/versions/025_add_generated_shorts.py"
GSD-Task: S03/T01
2026-04-04 09:43:36 +00:00
jlightner
3bb0266a19
feat: Added personality weight slider (0.0–1.0) to ChatWidget header an…
...
- "frontend/src/api/chat.ts"
- "frontend/src/components/ChatWidget.tsx"
- "frontend/src/components/ChatWidget.module.css"
GSD-Task: S02/T02
2026-04-04 09:30:56 +00:00
jlightner
d1efdbb3fa
feat: Added personality_weight (0.0–1.0) to chat API; modulates system…
...
- "backend/routers/chat.py"
- "backend/chat_service.py"
- "backend/tests/test_chat.py"
GSD-Task: S02/T01
2026-04-04 09:28:35 +00:00
jlightner
9431aa2095
feat: Added PostsFeed component to creator profile pages with Tiptap HT…
...
- "frontend/src/components/PostsFeed.tsx"
- "frontend/src/components/PostsFeed.module.css"
- "frontend/src/pages/PostsList.tsx"
- "frontend/src/pages/PostsList.module.css"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/App.tsx"
- "frontend/src/pages/CreatorDashboard.tsx"
GSD-Task: S01/T04
2026-04-04 09:17:30 +00:00
jlightner
9139d5a93a
feat: Built Tiptap rich text post editor with file attachments, multipa…
...
- "frontend/src/pages/PostEditor.tsx"
- "frontend/src/pages/PostEditor.module.css"
- "frontend/src/api/posts.ts"
- "frontend/src/api/client.ts"
- "frontend/src/App.tsx"
- "frontend/src/pages/CreatorDashboard.tsx"
GSD-Task: S01/T03
2026-04-04 09:13:48 +00:00
jlightner
cc60852ac9
feat: Built post CRUD and file upload/download API routers with auth, o…
...
- "backend/routers/posts.py"
- "backend/routers/files.py"
- "backend/minio_client.py"
- "backend/auth.py"
- "backend/main.py"
GSD-Task: S01/T02
2026-04-04 09:07:35 +00:00
jlightner
f0f36a3f76
feat: Added MinIO Docker service, Post/PostAttachment models with migra…
...
- "docker-compose.yml"
- "backend/config.py"
- "backend/minio_client.py"
- "backend/models.py"
- "backend/schemas.py"
- "backend/requirements.txt"
- "docker/nginx.conf"
- "alembic/versions/024_add_posts_and_attachments.py"
GSD-Task: S01/T01
2026-04-04 09:02:40 +00:00
jlightner
758bf7ecea
chore: auto-commit after complete-milestone
...
GSD-Unit: M022
2026-04-04 08:51:47 +00:00
jlightner
66f0f51219
feat: Forgejo wiki updated with 9 files (1 new, 8 modified) covering M0…
...
- "Personality-Profiles.md"
- "Home.md"
- "Highlights.md"
- "Chat-Engine.md"
- "Data-Model.md"
- "API-Surface.md"
- "Frontend.md"
- "Decisions.md"
GSD-Task: S07/T01
2026-04-04 08:46:09 +00:00
jlightner
eab362d897
feat: Added collapsible PersonalityProfile component to CreatorDetail p…
...
- "frontend/src/components/PersonalityProfile.tsx"
- "frontend/src/api/creators.ts"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/App.css"
GSD-Task: S06/T03
2026-04-04 08:31:37 +00:00
jlightner
2d9076ae92
feat: Added personality extraction pipeline: prompt template, 3-tier tr…
...
- "prompts/personality_extraction.txt"
- "backend/pipeline/stages.py"
- "backend/schemas.py"
- "backend/routers/admin.py"
GSD-Task: S06/T02
2026-04-04 08:28:18 +00:00
jlightner
10cd175333
feat: Added personality_profile JSONB column to Creator model with migr…
...
- "backend/models.py"
- "backend/schemas.py"
- "backend/routers/creators.py"
- "alembic/versions/023_add_personality_profile.py"
GSD-Task: S06/T01
2026-04-04 08:24:44 +00:00
jlightner
fb6a4cc58a
feat: Wired word-timing extraction into stage_highlight_detection — 62…
...
- "backend/pipeline/stages.py"
- ".gsd/KNOWLEDGE.md"
GSD-Task: S05/T02
2026-04-04 08:11:32 +00:00
jlightner
27c5f4866b
test: Added 3 audio proxy scoring functions, extract_word_timings utili…
...
- "backend/pipeline/highlight_scorer.py"
- "backend/pipeline/highlight_schemas.py"
- "backend/pipeline/test_highlight_scorer.py"
GSD-Task: S05/T01
2026-04-04 08:05:22 +00:00
jlightner
34acf468c6
feat: Updated streamChat() API, ChatWidget, and ChatPage to thread conv…
...
- "frontend/src/api/chat.ts"
- "frontend/src/components/ChatWidget.tsx"
- "frontend/src/pages/ChatPage.tsx"
- "frontend/src/pages/ChatPage.module.css"
GSD-Task: S04/T02
2026-04-04 07:53:50 +00:00
jlightner
d13d6c3aa1
test: Added multi-turn conversation memory with Redis-backed history (1…
...
- "backend/chat_service.py"
- "backend/routers/chat.py"
- "backend/tests/test_chat.py"
GSD-Task: S04/T01
2026-04-04 07:50:30 +00:00
jlightner
3226709382
feat: Built floating ChatWidget with streaming responses, citation link…
...
- "frontend/src/components/ChatWidget.tsx"
- "frontend/src/components/ChatWidget.module.css"
- "frontend/src/pages/CreatorDetail.tsx"
GSD-Task: S03/T01
2026-04-04 07:41:59 +00:00
jlightner
243a7a3eb6
feat: Follow system + tier config page (M022/S02)
...
- CreatorFollow model + pure SQL migration 022
- Follow router: POST/DELETE /follows/{creator_id}, GET /follows/me, GET /follows/{id}/status
- follower_count on creator detail endpoint
- Follow button on CreatorDetail (authenticated users only)
- CreatorTiers page with Free/Pro/Premium cards, Coming Soon modals
- Tiers link in creator sidebar nav
- Route /creator/tiers (protected)
2026-04-04 07:34:03 +00:00
jlightner
56920ae7c5
fix: remove leftover op.add_column/create_index calls from migration 020
2026-04-04 07:22:41 +00:00
jlightner
ed8bdedbc9
fix: make migrations 019/020 fully idempotent with IF NOT EXISTS guards
2026-04-04 07:20:48 +00:00
jlightner
f8fecf79ac
fix: use pure SQL for migrations 019/020 — bypasses all SQLAlchemy enum hooks
2026-04-04 07:19:01 +00:00
jlightner
9c307c663d
fix: use String column + ALTER TYPE cast for enum migrations (avoids SQLAlchemy before_create hook)
2026-04-04 07:17:34 +00:00
jlightner
b9f042f400
fix: use raw SQL for enum creation in migrations 019/020 to avoid SQLAlchemy double-create
2026-04-04 07:16:22 +00:00
jlightner
198170d999
fix: prevent double enum creation in migrations 019/020 (create_type=False)
2026-04-04 07:14:16 +00:00
jlightner
ddeaf9ac41
fix: resolve TS errors in ChapterReview and HighlightQueue (noUncheckedIndexedAccess)
2026-04-04 07:09:39 +00:00
jlightner
3bea232a1c
chore: M022/S01 complete — highlight queue UI shipped
2026-04-04 07:06:17 +00:00
jlightner
ce08d729cd
feat: Built HighlightQueue page with filter tabs, candidate cards with…
...
- "frontend/src/api/highlights.ts"
- "frontend/src/pages/HighlightQueue.tsx"
- "frontend/src/pages/HighlightQueue.module.css"
- "frontend/src/App.tsx"
- "frontend/src/pages/CreatorDashboard.tsx"
GSD-Task: S01/T02
2026-04-04 07:01:57 +00:00
jlightner
c05e4da594
feat: Add creator-scoped highlight review endpoints (list/detail/status…
...
- "backend/models.py"
- "alembic/versions/021_add_highlight_trim_columns.py"
- "backend/routers/creator_highlights.py"
- "backend/main.py"
GSD-Task: S01/T01
2026-04-04 06:58:28 +00:00
jlightner
29c2a58843
chore: auto-commit after complete-milestone
...
GSD-Unit: M021
2026-04-04 06:50:34 +00:00
jlightner
79e144ff89
feat: Pushed 3 new wiki pages (Chat-Engine, Search-Retrieval, Highlight…
...
- "Chat-Engine.md"
- "Search-Retrieval.md"
- "Highlights.md"
- "Home.md"
- "Architecture.md"
- "Data-Model.md"
- "API-Surface.md"
- "Frontend.md"
GSD-Task: S08/T01
2026-04-04 06:42:02 +00:00
jlightner
4bda29705d
feat: Added AdminAuditLog page with paginated impersonation log table,…
...
- "frontend/src/pages/AdminAuditLog.tsx"
- "frontend/src/pages/AdminAuditLog.module.css"
- "frontend/src/App.tsx"
- "frontend/src/components/AdminDropdown.tsx"
GSD-Task: S07/T03
2026-04-04 06:29:47 +00:00
jlightner
4969935c76
feat: Added ConfirmModal component, Edit As button with write-mode conf…
...
- "frontend/src/components/ConfirmModal.tsx"
- "frontend/src/components/ConfirmModal.module.css"
- "frontend/src/api/auth.ts"
- "frontend/src/context/AuthContext.tsx"
- "frontend/src/pages/AdminUsers.tsx"
- "frontend/src/pages/AdminUsers.module.css"
- "frontend/src/components/ImpersonationBanner.tsx"
- "frontend/src/components/ImpersonationBanner.module.css"
GSD-Task: S07/T02
2026-04-04 06:27:38 +00:00
jlightner
ab9dd2aa1b
feat: Added write_mode support to impersonation tokens with conditional…
...
- "backend/auth.py"
- "backend/models.py"
- "backend/routers/admin.py"
- "backend/tests/test_impersonation.py"
GSD-Task: S07/T01
2026-04-04 06:24:04 +00:00
jlightner
f822415f6f
feat: Wired ChapterReview into App routes (/creator/chapters, /creator/…
...
- "frontend/src/App.tsx"
- "frontend/src/pages/CreatorDashboard.tsx"
- "frontend/src/pages/ChapterReview.tsx"
- "frontend/src/pages/ChapterReview.module.css"
GSD-Task: S06/T03
2026-04-04 06:12:10 +00:00
jlightner
7b111a7ded
feat: Built ChapterReview page with WaveSurfer waveform (draggable/resi…
...
- "frontend/src/pages/ChapterReview.tsx"
- "frontend/src/pages/ChapterReview.module.css"
- "frontend/src/api/videos.ts"
- "frontend/src/App.tsx"
GSD-Task: S06/T02
2026-04-04 06:07:23 +00:00
jlightner
ed9aa7a83a
feat: Added ChapterStatus enum, sort_order column, migration 020, chapt…
...
- "backend/models.py"
- "backend/schemas.py"
- "alembic/versions/020_add_chapter_status_and_sort_order.py"
- "backend/routers/creator_chapters.py"
- "backend/routers/videos.py"
- "backend/main.py"
GSD-Task: S06/T01
2026-04-04 06:03:49 +00:00
jlightner
76880d0477
feat: Created ChapterMarkers overlay component, added RegionsPlugin cha…
...
- "frontend/src/components/ChapterMarkers.tsx"
- "frontend/src/components/PlayerControls.tsx"
- "frontend/src/components/AudioWaveform.tsx"
- "frontend/src/pages/WatchPage.tsx"
- "frontend/src/App.css"
GSD-Task: S05/T03
2026-04-04 05:53:19 +00:00
jlightner
96608a3d8f
feat: Installed wavesurfer.js, created AudioWaveform component with sha…
...
- "frontend/src/components/AudioWaveform.tsx"
- "frontend/src/hooks/useMediaSync.ts"
- "frontend/src/pages/WatchPage.tsx"
- "frontend/src/App.css"
- "frontend/package.json"
GSD-Task: S05/T02
2026-04-04 05:49:40 +00:00
jlightner
e44ec1d1d5
feat: Added media streaming endpoint and chapters endpoint to videos ro…
...
- "backend/routers/videos.py"
- "backend/schemas.py"
- "frontend/src/api/videos.ts"
GSD-Task: S05/T01
2026-04-04 05:47:16 +00:00
jlightner
6f12d5a240
feat: Wired stage_highlight_detection Celery task with bulk upsert, 4 a…
...
- "backend/pipeline/stages.py"
- "backend/routers/highlights.py"
- "backend/main.py"
GSD-Task: S04/T03
2026-04-04 05:36:10 +00:00
jlightner
2d7b812c6a
test: Implemented pure-function scoring engine with 7 weighted dimensio…
...
- "backend/pipeline/highlight_scorer.py"
- "backend/pipeline/test_highlight_scorer.py"
GSD-Task: S04/T02
2026-04-04 05:33:04 +00:00
jlightner
289e707799
feat: Added HighlightCandidate ORM model, Alembic migration 019, and Py…
...
- "backend/models.py"
- "alembic/versions/019_add_highlight_candidates.py"
- "backend/pipeline/highlight_schemas.py"
GSD-Task: S04/T01
2026-04-04 05:30:36 +00:00
jlightner
9bdb5b0e4a
feat: Built ChatPage with SSE streaming client, real-time token display…
...
- "frontend/src/api/chat.ts"
- "frontend/src/pages/ChatPage.tsx"
- "frontend/src/pages/ChatPage.module.css"
- "frontend/src/App.tsx"
GSD-Task: S03/T02
2026-04-04 05:22:43 +00:00
jlightner
a9589bfc93
test: Built ChatService with retrieve-prompt-stream pipeline, POST /api…
...
- "backend/chat_service.py"
- "backend/routers/chat.py"
- "backend/main.py"
- "backend/tests/test_chat.py"
GSD-Task: S03/T01
2026-04-04 05:19:44 +00:00
jlightner
195ba6e0a7
test: Added 6 integration tests covering creator-scoped cascade tiers (…
...
- "backend/tests/test_search.py"
GSD-Task: S02/T02
2026-04-04 05:07:24 +00:00
jlightner
a976129179
feat: Added 4-tier creator-scoped cascade (creator → domain → global →…
...
- "backend/search_service.py"
- "backend/schemas.py"
- "backend/routers/search.py"
GSD-Task: S02/T01
2026-04-04 05:02:30 +00:00
jlightner
dcd949a25b
test: Added 7 LightRAG integration tests verifying primary search path…
...
- "backend/tests/test_search.py"
GSD-Task: S01/T02
2026-04-04 04:50:40 +00:00
jlightner
17b43d9778
feat: Added LightRAG /query/data as primary search engine with file_sou…
...
- "backend/config.py"
- "backend/search_service.py"
GSD-Task: S01/T01
2026-04-04 04:44:24 +00:00
jlightner
4115c8add0
feat: Built ConsentDashboard page with per-video consent toggles, expan…
...
- "frontend/src/pages/ConsentDashboard.tsx"
- "frontend/src/pages/ConsentDashboard.module.css"
- "frontend/src/pages/CreatorDashboard.tsx"
- "frontend/src/App.tsx"
GSD-Task: S03/T02
2026-04-04 00:24:17 +00:00
jlightner
31638b5a3a
feat: Created TypeScript consent API client with 5 fetch functions and…
...
- "frontend/src/api/consent.ts"
- "frontend/src/components/ToggleSwitch.tsx"
- "frontend/src/components/ToggleSwitch.module.css"
- "frontend/src/api/index.ts"
GSD-Task: S03/T01
2026-04-04 00:21:13 +00:00
jlightner
da29a2a723
feat: Replaced 3 placeholder cards with real creator dashboard: 4 stat…
...
- "frontend/src/api/creator-dashboard.ts"
- "frontend/src/pages/CreatorDashboard.tsx"
- "frontend/src/pages/CreatorDashboard.module.css"
- "frontend/src/api/index.ts"
GSD-Task: S02/T02
2026-04-04 00:13:48 +00:00
jlightner
0fc0df1d29
feat: Added GET /api/v1/creator/dashboard returning video_count, techni…
...
- "backend/routers/creator_dashboard.py"
- "backend/schemas.py"
- "backend/main.py"
- "alembic/versions/016_add_users_and_invite_codes.py"
GSD-Task: S02/T01
2026-04-04 00:09:19 +00:00
jlightner
8417f0e9e0
feat: Built WatchPage with video player, synced transcript sidebar, laz…
...
- "frontend/src/api/videos.ts"
- "frontend/src/components/TranscriptSidebar.tsx"
- "frontend/src/pages/WatchPage.tsx"
- "frontend/src/App.tsx"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"
GSD-Task: S01/T03
2026-04-03 23:50:15 +00:00
jlightner
8069e9e2a3
perf: Built useMediaSync hook, VideoPlayer with HLS lazy-loading and na…
...
- "frontend/src/hooks/useMediaSync.ts"
- "frontend/src/components/VideoPlayer.tsx"
- "frontend/src/components/PlayerControls.tsx"
- "frontend/src/App.css"
- "frontend/package.json"
GSD-Task: S01/T02
2026-04-03 23:46:03 +00:00
jlightner
87cb667848
test: Added GET /videos/{video_id} and GET /videos/{video_id}/transcrip…
...
- "backend/routers/videos.py"
- "backend/schemas.py"
- "backend/tests/test_video_detail.py"
GSD-Task: S01/T01
2026-04-03 23:42:43 +00:00
jlightner
3710c3f8bb
chore: auto-commit after complete-milestone
...
GSD-Unit: M019
2026-04-03 23:30:13 +00:00
jlightner
38c606f358
feat: Updated 5 existing Forgejo wiki pages and created new Authenticat…
...
- "Architecture.md (wiki)"
- "Data-Model.md (wiki)"
- "API-Surface.md (wiki)"
- "Deployment.md (wiki)"
- "_Sidebar.md (wiki)"
- "Authentication.md (wiki
- new)"
- ".gsd/KNOWLEDGE.md"
GSD-Task: S06/T01
2026-04-03 23:24:38 +00:00
jlightner
dbc4afcf42
feat: Normalized /topics and /videos endpoints from bare lists to pagin…
...
- "backend/schemas.py"
- "backend/routers/topics.py"
- "backend/routers/videos.py"
- "frontend/src/api/topics.ts"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/pages/Home.tsx"
GSD-Task: S05/T03
2026-04-03 23:09:33 +00:00
jlightner
1bbcb8f5bf
feat: Replaced 6 static page imports with React.lazy + Suspense in App.…
...
- "frontend/src/App.tsx"
GSD-Task: S05/T02
2026-04-03 23:06:39 +00:00
jlightner
39e169b4ce
feat: Split 945-line public-client.ts into 10 domain API modules with s…
...
- "frontend/src/api/client.ts"
- "frontend/src/api/index.ts"
- "frontend/src/api/search.ts"
- "frontend/src/api/techniques.ts"
- "frontend/src/api/creators.ts"
- "frontend/src/api/topics.ts"
- "frontend/src/api/stats.ts"
- "frontend/src/api/reports.ts"
GSD-Task: S05/T01
2026-04-03 23:04:56 +00:00
jlightner
9e0006ea6a
feat: Deployed reindex script to ub01 via image rebuild, started full 9…
...
- "backend/scripts/reindex_lightrag.py"
GSD-Task: S04/T02
2026-04-03 22:53:18 +00:00
jlightner
338be29e92
feat: Created reindex_lightrag.py that extracts technique pages from Po…
...
- "backend/scripts/reindex_lightrag.py"
GSD-Task: S04/T01
2026-04-03 22:37:30 +00:00
jlightner
bfb303860b
test: Add 22 integration tests for consent endpoints covering auth, own…
...
- "backend/tests/test_consent.py"
- "backend/tests/conftest.py"
GSD-Task: S03/T03
2026-04-03 22:16:31 +00:00
jlightner
db135f738e
feat: Added consent API router with 5 endpoints (list, get, upsert with…
...
- "backend/routers/consent.py"
- "backend/schemas.py"
- "backend/main.py"
GSD-Task: S03/T02
2026-04-03 22:11:36 +00:00
jlightner
8487af0282
feat: Added VideoConsent and ConsentAuditLog models with ConsentField e…
...
- "backend/models.py"
- "alembic/versions/017_add_consent_tables.py"
GSD-Task: S03/T01
2026-04-03 22:09:27 +00:00
jlightner
c60fc8c3b3
feat: Added ProtectedRoute component, CreatorDashboard with sidebar nav…
...
- "frontend/src/components/ProtectedRoute.tsx"
- "frontend/src/pages/CreatorDashboard.tsx"
- "frontend/src/pages/CreatorDashboard.module.css"
- "frontend/src/pages/CreatorSettings.tsx"
- "frontend/src/pages/CreatorSettings.module.css"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
- "frontend/src/pages/Login.tsx"
GSD-Task: S02/T04
2026-04-03 22:02:04 +00:00
jlightner
b344307a89
feat: Added AuthContext provider with JWT persistence, auth API client…
...
- "frontend/src/context/AuthContext.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/Login.tsx"
- "frontend/src/pages/Login.module.css"
- "frontend/src/pages/Register.tsx"
- "frontend/src/pages/Register.module.css"
- "frontend/src/App.tsx"
GSD-Task: S02/T03
2026-04-03 21:58:08 +00:00
jlightner
77f44b0b48
test: Implemented auth API router with register/login/me/update-profile…
...
- "backend/routers/auth.py"
- "backend/main.py"
- "backend/auth.py"
- "backend/requirements.txt"
- "backend/tests/conftest.py"
- "backend/tests/test_auth.py"
GSD-Task: S02/T02
2026-04-03 21:54:11 +00:00
jlightner
a06ea946b1
chore: Added User/InviteCode models, Alembic migration 016, auth utilit…
...
- "backend/models.py"
- "backend/auth.py"
- "backend/schemas.py"
- "backend/requirements.txt"
- "alembic/versions/016_add_users_and_invite_codes.py"
GSD-Task: S02/T01
2026-04-03 21:47:01 +00:00
jlightner
d77b749cfb
fix: Deployed LightRAG on ub01, fixed healthcheck (curl missing from im…
...
- "docker-compose.yml"
- ".gsd/KNOWLEDGE.md"
GSD-Task: S01/T02
2026-04-03 21:35:10 +00:00
jlightner
80097df4da
chore: Added chrysopedia-lightrag service to docker-compose.yml with Qd…
...
- "docker-compose.yml"
- ".env.lightrag"
GSD-Task: S01/T01
2026-04-03 21:26:26 +00:00
jlightner
75693f3b35
chore: auto-commit after complete-milestone
...
GSD-Unit: M018
2026-04-03 21:17:47 +00:00
jlightner
31b72c731c
feat: Compiled 467-line Site Audit Report merging source code research…
...
- ".gsd/milestones/M018/slices/S01/SITE-AUDIT-REPORT.md"
GSD-Task: S01/T02
2026-04-03 19:49:14 +00:00
jlightner
35c9fad8ef
feat: Audited all 12 frontend routes and 22 API endpoints on live Chrys…
...
- ".gsd/milestones/M018/slices/S01/AUDIT-FINDINGS.md"
GSD-Task: S01/T01
2026-04-03 19:45:34 +00:00
jlightner
69335d8d6d
chore: remove 2,367 lines of dead code — orphaned CSS, unused imports, stale files
...
Deleted files:
- generate_stage5_variants.py (874 lines) — superseded by pipeline.quality toolkit
- PROJECT_CONTEXT.md (461 lines) — stale, .gsd/PROJECT.md is the living doc
- CHRYSOPEDIA-ASSESSMENT.md (654 lines) — M011 triage artifact, all findings actioned
CSS cleanup (364 lines):
- 20 orphaned block groups from deleted review queue/old components
- Duplicate .btn base rule, .btn--warning, @keyframes stagePulse
Python imports:
- routers/pipeline.py: uuid, literal_column, over, text
- tests/test_pipeline.py: 9 unused imports (PropertyMock, create_engine, etc.)
Build verified: tsc --noEmit clean, npm run build clean (59 modules, 0 warnings).
2026-04-03 09:43:37 +00:00
jlightner
ab210b62fd
chore: auto-commit after complete-milestone
...
GSD-Unit: M017
2026-04-03 09:24:16 +00:00
jlightner
ca3d33ba34
feat: Added 480px media query with 15 rule overrides for stats bar, fea…
...
- "frontend/src/App.css"
GSD-Task: S04/T02
2026-04-03 09:20:13 +00:00
jlightner
18eb4e0ee8
feat: Added updateCreatorProfile() API client and inline bio/social-lin…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/App.css"
GSD-Task: S04/T01
2026-04-03 09:18:39 +00:00
jlightner
47014f5a3f
feat: Featured technique card with gradient border and enriched recent-…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T02
2026-04-03 09:10:14 +00:00
jlightner
539274ce58
feat: Added summary, topic_tags, and key_moment_count fields to Creator…
...
- "backend/schemas.py"
- "backend/routers/creators.py"
GSD-Task: S03/T01
2026-04-03 09:07:34 +00:00
jlightner
0234a87429
feat: Added SocialIcons component with 9 platform SVG icons, rendered s…
...
- "frontend/src/components/SocialIcons.tsx"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T02
2026-04-03 09:00:34 +00:00
jlightner
cafbd0afb1
feat: Added moment_count field to CreatorDetail schema, router query (K…
...
- "backend/schemas.py"
- "backend/routers/creators.py"
- "frontend/src/api/public-client.ts"
GSD-Task: S02/T01
2026-04-03 08:58:05 +00:00
jlightner
bef8d5939d
feat: Replaced compact creator header with full hero section: 96px avat…
...
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/App.css"
GSD-Task: S01/T02
2026-04-03 08:52:06 +00:00
jlightner
74a4f25402
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
3c3ed8090c
add robots.txt — disallow all crawlers from indexing the site
2026-04-03 08:31:33 +00:00
jlightner
c6a1d32498
fix: route LLM calls through OpenWebUI tracked proxy for analytics
...
Changed LLM_API_URL and LLM_FALLBACK_URL from /api/v1 to /api so
requests hit OpenWebUI's /api/chat/completions (tracked) instead of
/api/v1/chat/completions (passthrough with no analytics).
2026-04-03 08:27:53 +00:00
jlightner
ff351b38d7
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
906b6491fe
fix: static 96k max_tokens for all pipeline stages — dynamic estimator was truncating thinking model output
...
The dynamic token estimator calculated max_tokens from input size × stage ratio,
which produced ~9k for stage 5 compose calls. Thinking models consume unpredictable
budget for internal reasoning, leaving 0 visible output tokens.
Changed: hard_limit 32768→96000, estimate_max_tokens now returns hard_limit directly.
2026-04-03 08:18:28 +00:00
jlightner
ed3c09ab18
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
27e3b88371
fix: ToC border-left back to cyan accent (missed purple revert)
2026-04-03 07:46:15 +00:00
jlightner
97abc7c80c
style: back arrow inline with article title, title bumped to 1.5rem
2026-04-03 07:44:32 +00:00
jlightner
1d210faf68
style: related techniques cards use same recent-card styling as homepage Recently Added
2026-04-03 07:43:03 +00:00
jlightner
71183639ea
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
ffd50a76df
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
e1a29f5650
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
f79d197dd4
fix: remove overflow-x:hidden from .app-main — was breaking position:sticky on title bar
2026-04-03 07:23:11 +00:00
jlightner
342a62ca6b
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
e5badbbf75
style: thinner gradient border on featured technique card (2px → 1px)
2026-04-03 07:18:35 +00:00
jlightner
b132c4ac7b
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
6d910f504a
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
4f8f612d77
chore: auto-commit after complete-milestone
...
GSD-Unit: M016
2026-04-03 06:27:26 +00:00
jlightner
c3e5a8fe86
feat: add embed-status endpoint for per-video embedding/Qdrant detail
...
GET /admin/pipeline/embed-status/{video_id} returns technique pages
linked to the video, Qdrant vector count, and last stage 6 event —
provides data for the currently non-functional Embed tab in admin UI.
2026-04-03 06:24:58 +00:00
jlightner
7d4168c048
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
e98f43193e
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
a16559e668
fix: add /app to sys.path for Celery forked workers importing services.avatar
2026-04-03 05:58:14 +00:00
jlightner
44e5905bd7
feat: auto-avatar integration with TheAudioDB
...
- Added avatar_url, avatar_source, avatar_fetched_at columns to Creator
model with Alembic migration 014
- New backend/services/avatar.py — TheAudioDB lookup with token-based
name similarity scoring and genre overlap bonus
- New Celery task fetch_creator_avatar for background avatar fetching
- Admin endpoints: POST /creators/{id}/fetch-avatar (single) and
POST /creators/fetch-all-avatars (batch for missing avatars)
- Wired avatar_url into CreatorRead, CreatorInfo, and CreatorBrowseItem
schemas so all API responses include avatar data
2026-04-03 05:55:42 +00:00
jlightner
89ef2751fa
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
0743d80b6a
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
61546bf25b
perf: eliminate N+1 queries in stale-pages, add videos pagination, cache related techniques
...
- Rewrote stale-pages endpoint to use a single query with row_number
window function instead of per-page queries for latest version + creator
- Added optional offset/limit/status/creator_id params to videos endpoint
(backward compatible — defaults return all results)
- Added 1-hour Redis cache to _find_dynamic_related technique scoring
2026-04-03 05:50:53 +00:00
jlightner
46983ae43b
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
094e832032
feat: Added favicon (SVG + 32px PNG), apple-touch-icon, OG social image…
...
- "frontend/public/favicon.svg"
- "frontend/public/favicon-32.png"
- "frontend/public/apple-touch-icon.png"
- "frontend/public/og-image.png"
- "frontend/index.html"
GSD-Task: S03/T01
2026-04-03 05:45:51 +00:00
jlightner
657d604e5b
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
5b9612e03f
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
caedc9c224
fix: remove moments from recent cards, pin footer to bottom of card
2026-04-03 05:14:17 +00:00
jlightner
00cb865507
fix: admin dropdown hover gap bridge + recent card footer layout (creator left, moments, date right)
2026-04-03 05:07:06 +00:00
jlightner
c012afc0d3
chore: auto-commit after complete-milestone
...
GSD-Unit: M015
2026-04-03 04:44:59 +00:00
jlightner
4735463649
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
8b912e5a6f
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
3c5985f012
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
1f783c4216
feat: Added GET /api/v1/stats endpoint returning live technique_count (…
...
- "backend/routers/stats.py"
- "backend/main.py"
GSD-Task: S03/T01
2026-04-03 04:25:58 +00:00
jlightner
9f0b0922b0
feat: add GET /api/v1/stats endpoint with technique and creator counts
2026-04-03 04:24:58 +00:00
jlightner
b35082602f
feat: Added "Last updated: Mon D" to creators browse rows and subtle da…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/CreatorsBrowse.tsx"
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T02
2026-04-03 04:19:52 +00:00
jlightner
8d3f9fd74f
feat: render last-updated dates on creators page and homepage cards
2026-04-03 04:17:53 +00:00
jlightner
18c76dd8ec
feat: Added last_technique_at correlated subquery to creators API endpo…
...
- "backend/schemas.py"
- "backend/routers/creators.py"
GSD-Task: S02/T01
2026-04-03 04:16:47 +00:00
jlightner
8c81c472ea
fix: pass last_technique_at through row unpacking
2026-04-03 04:15:39 +00:00
jlightner
acd0567e3c
feat: add last_technique_at to creators API endpoint
2026-04-03 04:12:31 +00:00
jlightner
ea8a77be59
feat: Deployed search logging and popular searches endpoint to ub01, ra…
...
GSD-Task: S01/T02
2026-04-03 04:07:10 +00:00
jlightner
f64a0c1107
perf: Added SearchLog model, Alembic migration 013, Pydantic schemas, f…
...
- "backend/models.py"
- "backend/schemas.py"
- "backend/routers/search.py"
- "alembic/versions/013_add_search_log.py"
GSD-Task: S01/T01
2026-04-03 04:02:55 +00:00
jlightner
6940f172a3
fix: Serialize BodySection Pydantic models to dicts before JSONB storage
...
Stage 5 parses LLM output into list[BodySection] (Pydantic models) but
SQLAlchemy's JSONB column needs plain dicts. Added _serialize_body_sections()
helper that calls .model_dump() on each BodySection before DB write.
Fixes 'Object of type BodySection is not JSON serializable' errors.
2026-04-03 03:38:32 +00:00
jlightner
5a71539a2b
fix: StageTabView limit 500→200 to stay within API max
2026-04-03 03:32:34 +00:00
jlightner
995d0c900d
fix: StageTabView useCallback dependency loop — use ref for initial tab selection
2026-04-03 03:30:45 +00:00
jlightner
c7a4d8aa27
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
fd48435a84
fix: MCP server API URL patterns — path params not JSON body, stage name mapping
2026-04-03 03:07:39 +00:00
jlightner
f27c18b555
fix: MCP server SQL uses correct column names (video_id, not pipeline_run_id)
2026-04-03 03:05:59 +00:00
jlightner
6375ce667e
fix: MCP server port 8097→8101 (8097 already allocated on ub01)
2026-04-03 02:58:57 +00:00
jlightner
567f69a480
feat: Chrysopedia MCP server — 25 tools for pipeline, infra, content, observability, embeddings, prompts
...
Runs as chrysopedia-mcp container in Docker Compose with direct DB, Redis,
Docker socket, and API access. Streamable HTTP transport on port 8097.
Clients connect via http://ub01:8097/mcp
2026-04-03 02:57:27 +00:00
jlightner
bbea843235
feat: Show article + creator count stats on admin techniques page
2026-04-03 02:38:09 +00:00
jlightner
baa2a87243
style: Admin technique pages — full CSS styling, description text
2026-04-03 02:33:23 +00:00
jlightner
8be26d5ad2
chore: auto-commit after complete-milestone
...
GSD-Unit: M014
2026-04-03 02:21:29 +00:00
jlightner
989ca41162
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
57b8705e26
feat: Added per-section embedding to stage 6 for v2 technique pages wit…
...
- "backend/schemas.py"
- "backend/pipeline/stages.py"
- "backend/pipeline/qdrant_client.py"
- "backend/search_service.py"
- "backend/pipeline/test_section_embedding.py"
GSD-Task: S07/T01
2026-04-03 02:12:56 +00:00
jlightner
7d805b80e3
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
495d1fa489
feat: Added paginated GET /admin/pipeline/technique-pages endpoint with…
...
- "backend/routers/pipeline.py"
- "backend/schemas.py"
GSD-Task: S06/T01
2026-04-03 01:55:35 +00:00
jlightner
5a5295ae3f
fix: Deployed v2-aware frontend to ub01 and verified production site lo…
...
GSD-Task: S05/T02
2026-04-03 01:46:22 +00:00
jlightner
48bcf26bee
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
7070ef3f51
test: Added 12 unit tests covering compose prompt construction, branchi…
...
- "backend/pipeline/test_compose_pipeline.py"
GSD-Task: S04/T02
2026-04-03 01:33:16 +00:00
jlightner
d709c9edce
feat: Added _build_compose_user_prompt(), _compose_into_existing(), and…
...
- "backend/pipeline/stages.py"
GSD-Task: S04/T01
2026-04-03 01:29:21 +00:00
jlightner
dc18d0a543
feat: Wired source_videos and body_sections_format into technique detai…
...
- "backend/routers/techniques.py"
GSD-Task: S03/T02
2026-04-03 01:19:32 +00:00
jlightner
bd0dbb4df9
feat: Added body_sections_format column, technique_page_videos associat…
...
- "alembic/versions/012_multi_source_format.py"
- "backend/models.py"
- "backend/schemas.py"
GSD-Task: S03/T01
2026-04-03 01:16:31 +00:00
jlightner
5cd7db8938
test: 16 unit tests covering compose prompt XML structure, citation off…
...
- "backend/pipeline/test_harness_compose.py"
- ".gsd/milestones/M014/slices/S02/tasks/T03-SUMMARY.md"
GSD-Task: S02/T03
2026-04-03 01:08:41 +00:00
jlightner
efe6d7197c
test: Added compose subcommand with build_compose_prompt(), run_compose…
...
- "backend/pipeline/test_harness.py"
GSD-Task: S02/T02
2026-04-03 01:05:25 +00:00
jlightner
709d14802c
feat: Created composition prompt with merge rules, citation re-indexing…
...
- "prompts/stage5_compose.txt"
- ".gsd/milestones/M014/slices/S02/tasks/T01-SUMMARY.md"
GSD-Task: S02/T01
2026-04-03 01:03:01 +00:00
jlightner
44197f550c
test: Updated test_harness.py word-count/section-count logic for list[B…
...
- "backend/pipeline/test_harness.py"
- "backend/pipeline/test_harness_v2_format.py"
GSD-Task: S01/T03
2026-04-03 00:54:27 +00:00
jlightner
ca5aa3dec0
feat: Rewrote stage5_synthesis.txt with v2 body_sections (list-of-objec…
...
- "prompts/stage5_synthesis.txt"
- "prompts/stage5_synthesis.20260403_005044.bak"
GSD-Task: S01/T02
2026-04-03 00:52:48 +00:00
jlightner
15dcab201a
test: Added BodySection/BodySubSection schema models, changed Synthesiz…
...
- "backend/pipeline/schemas.py"
- "backend/pipeline/citation_utils.py"
- "backend/pipeline/test_citation_utils.py"
GSD-Task: S01/T01
2026-04-03 00:50:30 +00:00
jlightner
293d1f4df4
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
06b8bdd6ac
prompt: stage5 synthesis v4 — instructive voice, name discipline, merge thresholds
...
- Rewrote voice from third-person narrative ("Keota does X") to instructive
("Route the effect at 100% wet"). Body prose now reads like a lesson book.
- Hard rule: creator name appears in title/summary only, max once in body
(for quote attribution). Fixed JSON example that modeled heavy name usage.
- Added orientation-first section rhythm: brief definition before diving into
method, prevents run-on feel.
- Page minimum thresholds: 3+ sections, 400+ words, 3+ moments. Prevents
stub pages from thin categories.
- Strengthened merge guidance: prefer fewer rich pages over many stubs.
- Updated all examples to model instructive phrasing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:14:43 +00:00
jlightner
f2efabcc99
fix: shorten alembic revision ID to fit varchar(32) column
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:59:52 +00:00
jlightner
f0d0b8ac1a
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
29f6e74b4f
pipeline: run stages inline instead of Celery chain dispatch
...
Each video now completes all stages (2→6) before the worker picks up the
next queued video. Previously, dispatching celery_chain for multiple videos
caused interleaved execution — nothing finished until everything went through
all stages. Now run_pipeline calls each stage function synchronously within
the same worker task, so videos complete linearly and efficiently.
2026-04-01 11:39:21 +00:00
jlightner
84e617ab64
stage5 prompt: make section ordering a hard constraint with explicit wrong/correct examples
...
Validation/quality-check sections can NEVER precede construction sections.
Added concrete wrong vs correct ordering example using the exact snare design
case that failed. Elevated from 'typically' guidance to non-negotiable rule.
2026-04-01 11:35:59 +00:00
jlightner
78c01b22ca
stage5 prompt: reduce creator name repetition — use pronouns after establishing attribution
2026-04-01 11:25:45 +00:00
jlightner
9e1feae76d
stage5 prompt: add explicit section ordering guidance — follow the workflow
...
Sections should mirror the actual production workflow: foundations before
finishing, construction before glue, sound sources before processing before
mix-bus treatment. Includes the test: 'would a producer follow these steps
in this sequence?' and a natural flow template (framework → construction →
combining/refining → quality checks).
2026-04-01 11:23:20 +00:00
jlightner
2b06828aaa
stage5: replace synthesis prompt with v016 (masterclass-recap) + add 100 variant prompts
...
New prompt combines: embedded documentarian role, distilled-knowledge framing,
conversational authority voice, problem-solution section structure,
context-wrapped specifics, problem-driven teaching rhythm, any-skill-level
reader model, insight-first summary, and engagement emphasis.
100 variant prompts generated across 9 dimensions of variation for future
A/B testing. Generator script included for reproducibility.
2026-04-01 10:49:16 +00:00
jlightner
d75ec80c98
optimize: Stage 5 synthesis prompt — round 0 winner (0.95→1.0 composite)
...
Applied first optimization result: tighter voice preservation instructions,
improved section flow guidance, trimmed redundant metadata instructions.
13382→11123 chars (-17%).
2026-04-01 10:15:24 +00:00
jlightner
0471da0430
chore: auto-commit after complete-milestone
...
GSD-Unit: M013
2026-04-01 09:31:26 +00:00
jlightner
18520f7936
feat: Generalized OptimizationLoop to stages 2-5 with per-stage fixture…
...
- "backend/pipeline/quality/optimizer.py"
- "backend/pipeline/quality/__main__.py"
- "backend/pipeline/quality/scorer.py"
- "backend/pipeline/quality/fixtures/sample_segments.json"
- "backend/pipeline/quality/fixtures/sample_topic_group.json"
- "backend/pipeline/quality/fixtures/sample_classifications.json"
GSD-Task: S04/T02
2026-04-01 09:24:42 +00:00
jlightner
e740798f7c
feat: Added STAGE_CONFIGS registry (stages 2-5) with per-stage rubrics,…
...
- "backend/pipeline/quality/scorer.py"
- "backend/pipeline/quality/variant_generator.py"
GSD-Task: S04/T01
2026-04-01 09:20:24 +00:00
jlightner
84e85a52b3
perf: Added optimize CLI subcommand with leaderboard table, ASCII traje…
...
- "backend/pipeline/quality/__main__.py"
- "backend/pipeline/quality/results/.gitkeep"
GSD-Task: S03/T02
2026-04-01 09:10:42 +00:00
jlightner
c6cbb09dd3
feat: Created PromptVariantGenerator (LLM-powered prompt mutation) and…
...
- "backend/pipeline/quality/variant_generator.py"
- "backend/pipeline/quality/optimizer.py"
GSD-Task: S03/T01
2026-04-01 09:08:01 +00:00
jlightner
15a7afdaff
feat: Added VoiceDial class with 3-band prompt modification and ScoreRu…
...
- "backend/pipeline/quality/voice_dial.py"
- "backend/pipeline/quality/scorer.py"
- "backend/pipeline/quality/__main__.py"
GSD-Task: S02/T02
2026-04-01 08:57:07 +00:00
jlightner
5223772756
feat: Built ScoreRunner with 5-dimension LLM-as-judge scoring rubric, C…
...
- "backend/pipeline/quality/scorer.py"
- "backend/pipeline/quality/__main__.py"
- "backend/pipeline/quality/fixtures/sample_moments.json"
- "backend/pipeline/quality/fixtures/__init__.py"
GSD-Task: S02/T01
2026-04-01 08:53:40 +00:00
jlightner
c27cd77ae6
test: Built pipeline.quality package with FitnessRunner (9 tests, 4 cat…
...
- "backend/pipeline/quality/__init__.py"
- "backend/pipeline/quality/__main__.py"
- "backend/pipeline/quality/fitness.py"
GSD-Task: S01/T01
2026-04-01 08:45:05 +00:00
jlightner
3c1f7a83fb
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
3c2441ae38
fix: Rename 'Trigger (debug)' button to 'Retrigger'
2026-04-01 07:25:20 +00:00
jlightner
fd1fd6c6f9
fix: Pipeline LLM audit — temperature=0, realistic token ratios, structured request_params
...
Audit findings & fixes:
- temperature was never set (API defaulted to 1.0) → now explicit 0.0 for deterministic JSON
- llm_max_tokens=65536 exceeded hard_limit=32768 → aligned to 32768
- Output ratio estimates were 5-30x too high (based on actual pipeline data):
stage2: 0.6→0.05, stage3: 2.0→0.3, stage4: 0.5→0.3, stage5: 2.5→0.8
- request_params now structured as api_params (what's sent to LLM) vs pipeline_config
(internal estimator settings) — no more ambiguous 'hard_limit' in request params
- temperature=0.0 sent on both primary and fallback endpoints
2026-04-01 07:20:09 +00:00
jlightner
d58194ff96
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
a673e641b8
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
8272da430b
fix: Variable ordering bug and stage 5 truncation recovery
...
Two fixes:
1. page_moment_indices was referenced before assignment in the page
persist loop — moved assignment to top of loop body. This caused
"cannot access local variable" errors on every stage 5 run.
2. Stage 5 now catches LLMTruncationError and splits the chunk in
half for retry, instead of blindly retrying the same oversized
prompt. This handles categories where synthesis output exceeds
the model context window.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:51:28 -05:00
jlightner
c0df8a7908
chore: auto-commit after complete-milestone
...
GSD-Unit: M012
2026-04-01 06:41:52 +00:00
jlightner
baef500de6
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
e0c73db8ff
feat: Added sort query parameter (relevance/newest/oldest/alpha/creator…
...
- "backend/routers/search.py"
- "backend/routers/topics.py"
- "backend/routers/techniques.py"
- "backend/search_service.py"
GSD-Task: S02/T01
2026-04-01 06:41:52 +00:00
jlightner
b68775ebfb
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
fa82f1079a
feat: Enriched Qdrant embedding text with creator_name/tags and added r…
...
- "backend/pipeline/stages.py"
- "backend/pipeline/qdrant_client.py"
- "backend/routers/pipeline.py"
GSD-Task: S01/T02
2026-04-01 06:41:52 +00:00
jlightner
84e7a9906c
feat: Refactored keyword_search to multi-token AND with cross-field mat…
...
- "backend/search_service.py"
- "backend/schemas.py"
- "backend/routers/search.py"
- "backend/tests/test_search.py"
GSD-Task: S01/T01
2026-04-01 06:41:52 +00:00
jlightner
c344b8c670
fix: Moment-to-page linking via moment_indices in stage 5 synthesis
...
When the LLM splits a category group into multiple technique pages,
moments were blanket-linked to the last page in the loop, leaving all
other pages as orphans with 0 key moments (48 out of 204 pages affected).
Added moment_indices field to SynthesizedPage schema and synthesis prompt
so the LLM explicitly declares which input moments each page covers.
Stage 5 now uses these indices for targeted linking instead of the broken
blanket approach. Tags are also computed per-page from linked moments
only, fixing cross-contamination (e.g. "stereo imaging" tag appearing
on gain staging pages).
Deleted 48 orphan technique pages from the database.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:34:37 -05:00
jlightner
9b2db11095
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
e80094dc05
feat: Truncation detection, batched classification, and pipeline auto-resume
...
Three resilience improvements to the pipeline:
1. LLMResponse(str) subclass carries finish_reason metadata from the LLM.
_safe_parse_llm_response detects truncation (finish=length) and raises
LLMTruncationError instead of wastefully retrying with a JSON nudge
that makes the prompt even longer.
2. Stage 4 classification now batches moments (20 per call) instead of
sending all moments in a single LLM call. Prevents context window
overflow for videos with many moments. Batch results are merged with
reindexed moment_index values.
3. run_pipeline auto-resumes from the last completed stage on error/retry
instead of always restarting from stage 2. Queries pipeline_events for
the most recent run to find completed stages. clean_reprocess trigger
still forces a full restart.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 17:48:19 -05:00
jlightner
5984129e25
fix: Inflate LLM token estimates and forward max_tokens on retry
...
Stage 4 classification was truncating (finish=length) because the 0.15x
output ratio underestimated token needs. Inflated all stage ratios,
bumped the buffer from 20% to 50%, raised the floor from 2048 to 4096,
and fixed _safe_parse_llm_response to forward max_tokens on retry
instead of falling back to the 65k default.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 17:28:58 -05:00
jlightner
0817e6e957
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
9bc253f2c9
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
11f7ca4fbf
feat: Change global search shortcut from Cmd+K to Ctrl+Shift+F
2026-03-31 17:33:09 +00:00
jlightner
44f2fbd4d6
feat: Add tooltips to stage timeline dots showing stage name on hover
2026-03-31 17:30:45 +00:00
jlightner
c1583820ea
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
c2db9aa011
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
jlightner
cd3b57a156
fix: Clean retrigger preserves transcript_segments (pipeline input data)
...
Deleting transcript_segments left the pipeline with nothing to process —
all stages would skip immediately. Segments come from the ingest step,
not from pipeline stages 2-6. Only pipeline_events and key_moments
(pipeline output) are deleted during clean reprocess.
2026-03-31 16:32:25 +00:00
jlightner
6f1c7dae00
fix: Auto-refresh EventLog every 10s for processing/queued videos
...
Previously the event log only loaded once when the row was expanded,
so mid-pipeline videos only showed start events. Now the EventLog
component accepts a status prop and polls every 10s when the video is
processing or queued, silently updating without showing a loading spinner.
2026-03-31 16:23:33 +00:00
jlightner
b0ad4c2dfc
feat: Add real-time pipeline visibility — auto-refresh, stage timeline, activity feed, bulk log
...
- Backend: Video list now includes active_stage, active_stage_status, and
stage_started_at fields via DISTINCT ON subquery
- Backend: New GET /admin/pipeline/recent-activity endpoint returns
latest stage completions/errors with video context
- Frontend: 15-second auto-refresh with change detection — video rows
flash when status changes
- Frontend: Stage timeline dots on processing/complete/error videos
showing progress through stages 2-5, active stage pulses
- Frontend: Collapsible Recent Activity feed at top showing last 8
stage completions/errors with duration and creator
- Frontend: Bulk operation scrollable log showing per-video results
as they complete
- Frontend: Auto-refresh checkbox toggle in header
2026-03-31 16:12:57 +00:00
jlightner
e17132bd60
feat: Add bulk pipeline reprocessing — creator filter, multi-select, clean retrigger
...
- Backend: POST /admin/pipeline/clean-retrigger/{video_id} endpoint that
deletes pipeline_events, key_moments, transcript_segments, and Qdrant
vectors before retriggering the pipeline
- Backend: QdrantManager.delete_by_video_id() for vector cleanup
- Frontend: Creator filter dropdown on pipeline admin page
- Frontend: Checkbox selection column with select-all
- Frontend: Bulk toolbar with Retrigger Selected and Clean Reprocess
actions, sequential dispatch with progress bar, cancel support
- Bulk dispatch uses 500ms delay between requests to avoid slamming API
2026-03-31 15:24:59 +00:00
jlightner
ee927da426
chore: auto-commit after complete-milestone
...
GSD-Unit: M011
2026-03-31 09:02:53 +00:00
jlightner
261fe91f0b
feat: Created useDocumentTitle hook and wired descriptive, route-specif…
...
- "frontend/src/hooks/useDocumentTitle.ts"
- "frontend/src/pages/Home.tsx"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/pages/SubTopicPage.tsx"
- "frontend/src/pages/CreatorsBrowse.tsx"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/pages/SearchResults.tsx"
GSD-Task: S04/T02
2026-03-31 08:56:16 +00:00
jlightner
5e5961fa92
feat: Demoted nav brand to span, promoted page headings to h1, added sk…
...
- "frontend/src/App.tsx"
- "frontend/src/App.css"
- "frontend/src/pages/Home.tsx"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/pages/CreatorsBrowse.tsx"
- "frontend/src/pages/SubTopicPage.tsx"
- "frontend/src/pages/AdminReports.tsx"
GSD-Task: S04/T01
2026-03-31 08:52:48 +00:00
jlightner
089435a990
feat: Added mobile hamburger menu with 44px touch targets, Escape/outsi…
...
- "frontend/src/App.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T02
2026-03-31 08:45:33 +00:00
jlightner
50675db557
feat: Refactored SearchAutocomplete from heroSize boolean to variant st…
...
- "frontend/src/components/SearchAutocomplete.tsx"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
- "frontend/src/pages/Home.tsx"
- "frontend/src/pages/SearchResults.tsx"
GSD-Task: S03/T01
2026-03-31 08:42:15 +00:00
jlightner
adc86446f1
feat: Created shared TagList component with max-4 overflow, applied acr…
...
- "frontend/src/components/TagList.tsx"
- "frontend/src/pages/Home.tsx"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/pages/SubTopicPage.tsx"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T03
2026-03-31 08:35:07 +00:00
jlightner
caa55381ab
feat: Replaced run-on dot-separated topic stats on CreatorDetail with c…
...
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T02
2026-03-31 08:32:09 +00:00
jlightner
41bf06e431
feat: Topics page loads with all categories collapsed; expand/collapse…
...
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T01
2026-03-31 08:30:55 +00:00
jlightner
717f6c0785
feat: Added GET /api/v1/techniques/random endpoint returning {slug}, fe…
...
- "backend/routers/techniques.py"
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"
GSD-Task: S01/T02
2026-03-31 08:24:38 +00:00
jlightner
d94995453e
feat: Added scale(1.02) hover to all 6 card types, cardEnter stagger an…
...
- "frontend/src/App.css"
- "frontend/src/pages/Home.tsx"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/pages/SubTopicPage.tsx"
- "frontend/src/pages/SearchResults.tsx"
GSD-Task: S01/T01
2026-03-31 08:22:37 +00:00
jlightner
9296cd4df8
chore: auto-commit after complete-milestone
...
GSD-Unit: M010
2026-03-31 06:46:25 +00:00
jlightner
2a8b0b3a84
feat: Extracted inline typeahead from Home.tsx into shared SearchAutoco…
...
- "frontend/src/components/SearchAutocomplete.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/Home.tsx"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/App.css"
GSD-Task: S04/T02
2026-03-31 06:39:01 +00:00
jlightner
1254e173d4
test: Added GET /api/v1/search/suggestions endpoint returning popular t…
...
- "backend/schemas.py"
- "backend/routers/search.py"
- "backend/tests/test_search.py"
GSD-Task: S04/T01
2026-03-31 06:35:37 +00:00
jlightner
ec7e07c705
feat: Added @keyframes pageEnter (opacity 0→1, translateY 8→0, 250ms ea…
...
- "frontend/src/App.css"
GSD-Task: S03/T02
2026-03-31 06:27:12 +00:00
jlightner
4e12689523
feat: Extracted catSlug to shared utility; added category accent border…
...
- "frontend/src/utils/catSlug.ts"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/pages/SubTopicPage.tsx"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T01
2026-03-31 06:26:06 +00:00
jlightner
6de5317416
feat: Replaced plain list rendering of related techniques with a respon…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T02
2026-03-31 06:15:25 +00:00
jlightner
5d0fd05b98
feat: Added scored dynamic related-techniques query returning up to 4 r…
...
- "backend/schemas.py"
- "backend/routers/techniques.py"
- "backend/tests/test_public_api.py"
GSD-Task: S02/T01
2026-03-31 06:13:59 +00:00
jlightner
5e52dd5e9c
feat: Added SubTopicPage with breadcrumbs and creator-grouped technique…
...
- "frontend/src/pages/SubTopicPage.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/App.tsx"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/App.css"
- "frontend/src/pages/Home.tsx"
GSD-Task: S01/T02
2026-03-31 06:03:18 +00:00
jlightner
8661549ab1
test: Added GET /topics/{category_slug}/{subtopic_slug} endpoint filter…
...
- "backend/routers/topics.py"
- "backend/tests/test_public_api.py"
GSD-Task: S01/T01
2026-03-31 05:59:36 +00:00
jlightner
5d71f9825d
chore: auto-commit after complete-milestone
...
GSD-Unit: M009
2026-03-31 05:52:28 +00:00
jlightner
e95bda35ea
feat: Added featured technique spotlight section and converted recently…
...
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T02
2026-03-31 05:48:48 +00:00
jlightner
0b27e5752e
feat: Added sort=random|recent query param to list_techniques endpoint…
...
- "backend/routers/techniques.py"
- "frontend/src/api/public-client.ts"
GSD-Task: S03/T01
2026-03-31 05:46:31 +00:00
jlightner
32114ec360
feat: Added /about page with three content sections (what, how, who) an…
...
- "frontend/src/pages/About.tsx"
- "frontend/src/App.tsx"
- "frontend/src/components/AppFooter.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T01
2026-03-31 05:41:54 +00:00
jlightner
a41efec4e4
feat: Added popular topics pill-link section to homepage that fetches f…
...
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"
GSD-Task: S01/T02
2026-03-31 05:37:10 +00:00
jlightner
07baa5aca1
feat: Added hero tagline "Production Knowledge, Distilled", value propo…
...
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"
GSD-Task: S01/T01
2026-03-31 05:35:30 +00:00
jlightner
3a5e18691b
chore: auto-commit after complete-milestone
...
GSD-Unit: M008
2026-03-31 05:31:25 +00:00
jlightner
59491c7803
feat: Replaced meaningless '0 views' display with topic-category counts…
...
- "frontend/src/pages/CreatorDetail.tsx"
GSD-Task: S03/T02
2026-03-31 05:26:18 +00:00
jlightner
7a3db5212b
feat: replace views stat with topic-category breakdown on creator detail page
2026-03-31 05:24:32 +00:00
jlightner
95b11ae5bc
feat: Added key_moment_count correlated subquery to technique list API…
...
- "backend/schemas.py"
- "backend/routers/techniques.py"
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/Home.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T01
2026-03-31 05:23:37 +00:00
jlightner
deb060cfa3
feat: Removed yellow semantic-search-unavailable banner from search res…
...
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/App.css"
- "frontend/src/components/AppFooter.tsx"
- "frontend/package.json"
GSD-Task: S02/T02
2026-03-31 05:14:58 +00:00
jlightner
127919565a
feat: Added hidden boolean column to Creator model, migration marking T…
...
- "backend/models.py"
- "backend/routers/creators.py"
- "alembic/versions/009_add_creator_hidden_flag.py"
GSD-Task: S02/T01
2026-03-31 05:13:17 +00:00
jlightner
6d4390414a
feat: Key moment search results now link to parent technique page with…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/pages/TechniquePage.tsx"
GSD-Task: S01/T02
2026-03-31 05:04:05 +00:00
jlightner
af250a6f5d
feat: Added technique_page_slug to search results across Qdrant payload…
...
- "backend/schemas.py"
- "backend/search_service.py"
- "backend/pipeline/stages.py"
- "backend/pipeline/qdrant_client.py"
- "backend/tests/test_search.py"
GSD-Task: S01/T01
2026-03-31 05:02:48 +00:00
jlightner
2117687720
feat: add tooltips to Show Payload, System Prompt, User Prompt, and Response in pipeline event log
2026-03-31 03:23:30 +00:00
jlightner
5490999fd1
fix: use gear glyph for LLM call events in pipeline log
2026-03-31 02:56:50 +00:00
jlightner
dc7bb83c9d
fix: swap robot emoji for diamond glyph on LLM call events
2026-03-31 02:52:25 +00:00
jlightner
7127237afe
fix: drop server_default before dropping enum type in migration 008
2026-03-31 02:46:30 +00:00
jlightner
63225a3559
fix: migration 008 — use text column conversion to avoid PG enum transaction restriction
2026-03-31 02:45:54 +00:00
jlightner
35fc699098
fix: correct PG enum type name in migration 008 — processing_status not processingstatus
2026-03-31 02:45:06 +00:00
jlightner
720c2f501f
feat: meaningful pipeline status lifecycle — Not Started → Queued → In Progress → Complete/Errored
...
Replace stage-level statuses (pending/transcribed/extracted/published) with
user-meaningful lifecycle states (not_started/queued/processing/error/complete).
Backend:
- ProcessingStatus enum: not_started, queued, processing, error, complete
- run_pipeline sets 'processing' before dispatching Celery chain
- stage5 sets 'complete' (was 'published')
- stage3 no longer sets intermediate status (stays 'processing')
- New mark_pipeline_error task wired as link_error on chain
- _set_error_status helper marks video on permanent failure
- Ingest sets 'queued' (was 'transcribed')
- Migration 008 renames all existing values
Frontend:
- StatusFilter shows fixed-order lifecycle tabs: Not Started | Queued | In Progress | Errored | Complete
- Per-video badges show friendly labels instead of raw enum values
- Badge colors mapped to new statuses
2026-03-31 02:43:49 +00:00
jlightner
52e7e3bbc2
feat: remove review workflow — unused gate that blocked nothing
...
773 key moments sat at 'pending' with 0 approved/edited/rejected.
review_status was never checked by any public-facing query — all content
was always visible regardless of review state.
Removed:
- backend/routers/review.py (10 endpoints)
- backend/tests/test_review.py
- frontend ReviewQueue, MomentDetail pages
- frontend client.ts (review-only API client)
- frontend ModeToggle, StatusBadge components
- Review link from AdminDropdown, Moments link from pipeline rows
- ReviewStatus, PageReviewStatus enums from models
- review_mode config flag
- review_status columns (migration 007)
- ~80 lines of mode-toggle CSS
Pipeline now always sets processing_status to 'published'.
Migration 007 drops columns, enums, and migrates 'reviewed' → 'published'.
2026-03-31 02:34:12 +00:00
jlightner
1ac3db77a1
feat: add tooltip to Debug Mode toggle explaining its purpose
2026-03-31 02:23:12 +00:00
jlightner
4151e7cd25
feat: deep-link Inspect Pipeline button — auto-expand and scroll to video
...
TechniquePage's 'Inspect pipeline' button passes ?video=<id> to AdminPipeline.
Previously the query param was ignored. Now AdminPipeline reads it on mount,
auto-expands the matching video row, and smooth-scrolls it into view.
2026-03-31 02:16:36 +00:00
jlightner
4b0914b12b
fix: restore complete project tree from ub01 canonical state
...
Auto-mode commit 7aa33cd accidentally deleted 78 files (14,814 lines) during M005
execution. Subsequent commits rebuilt some frontend files but backend/, alembic/,
tests/, whisper/, docker configs, and prompts were never restored in this repo.
This commit restores the full project tree by syncing from ub01's working directory,
which has all M001-M007 features running in production containers.
Restored: backend/ (config, models, routers, database, redis, search_service, worker),
alembic/ (6 migrations), docker/ (Dockerfiles, nginx, compose), prompts/ (4 stages),
tests/, whisper/, README.md, .env.example, chrysopedia-spec.md
2026-03-31 02:10:41 +00:00
jlightner
f6dcc80dbf
merge: reconcile diverged histories — ub01 working tree is source of truth
...
Local auto-mode (M005-M007) and origin/main (M004 manual pushes from ub01) diverged
at e08e8d0 . Commit 7aa33cd accidentally deleted 78 project files during auto-mode.
The ub01 working tree has all features running correctly.
This merge uses 'ours' strategy to record origin/main as an ancestor, then the
following commit overlays the correct file state from ub01.
2026-03-31 02:10:31 +00:00
jlightner
7d4eddce99
chore: auto-commit after complete-milestone
...
GSD-Unit: M007
2026-03-30 19:53:11 +00:00
jlightner
2e2c89ec50
feat: Added flex-wrap, max-width, and tighter mobile gaps to prevent ho…
...
- "frontend/src/App.css"
GSD-Task: S06/T01
2026-03-30 19:48:30 +00:00
jlightner
f2cc72376c
feat: Added overflow: hidden, word-break, max-width: 100%, and min-widt…
...
- "frontend/src/App.css"
GSD-Task: S05/T01
2026-03-30 19:41:41 +00:00
jlightner
9dfa568bb3
feat: Pruned dead UI, renamed view toggle to Oldest/Newest first, added…
...
- "frontend/src/pages/AdminPipeline.tsx"
- "frontend/src/App.css"
GSD-Task: S04/T02
2026-03-30 19:36:47 +00:00
jlightner
44c0df6e08
feat: Added DebugModeToggle component and StatusFilter pill bar to Admi…
...
- "frontend/src/pages/AdminPipeline.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/App.css"
GSD-Task: S04/T01
2026-03-30 19:34:11 +00:00
jlightner
64ff263da2
docs: Rewrite README with information flow stages and updated architecture
...
Replaces outdated README with streamlined version covering all 8 services,
complete API endpoints, 6-stage information flow diagram, and current
project structure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 14:27:02 -05:00
jlightner
97b9f7234a
feat: Added chrysopedia-watcher service to Docker Compose, deployed and…
...
- "docker-compose.yml"
- ".gsd/milestones/M007/slices/S03/tasks/T02-SUMMARY.md"
GSD-Task: S03/T02
2026-03-30 19:24:39 +00:00
jlightner
5e408dff5a
feat: Built backend/watcher.py with PollingObserver-based folder watchi…
...
- "backend/watcher.py"
- "backend/requirements.txt"
GSD-Task: S03/T01
2026-03-30 19:17:47 +00:00
jlightner
07eaa7f309
feat: Added DebugPayloadViewer component with collapsible System Prompt…
...
- "frontend/src/pages/AdminPipeline.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/App.css"
GSD-Task: S02/T01
2026-03-30 19:07:23 +00:00
jlightner
653c927845
feat: DebugPayloadViewer component with copy, export, collapsible sections
2026-03-30 19:01:17 +00:00
jlightner
8c89b5d94c
feat: Wired debug-mode-aware LLM I/O capture into pipeline callback — _…
...
- "backend/pipeline/stages.py"
GSD-Task: S01/T02
2026-03-30 18:54:50 +00:00
jlightner
be6b2d5963
feat: Added 3 TEXT columns to pipeline_events (system_prompt_text, user…
...
- "backend/models.py"
- "backend/config.py"
- "backend/schemas.py"
- "backend/routers/pipeline.py"
- "alembic/versions/006_debug_columns.py"
GSD-Task: S01/T01
2026-03-30 18:23:38 +00:00
jlightner
e8bc3fd9a2
feat(whisper): add batch_transcribe.py and document HAL0022 transcription setup
...
- batch_transcribe.py: recursive multi-creator transcription runner that
walks nested subdirectories, attributes creator from top-level folder name,
writes batch_manifest.json with timing and per-creator results
- README.md: updated with batch mode docs, HAL0022 environment details,
transcript output location (C:\Users\jlightner\chrysopedia\transcripts),
scheduled task usage, and transfer instructions for ub01 ingestion
2026-03-30 11:46:52 -05:00
jlightner
0484c15516
chore: auto-commit after complete-milestone
...
GSD-Unit: M006
2026-03-30 12:13:09 +00:00
jlightner
2e9ef20e24
feat: Updated Dockerfile.web and docker-compose.yml on ub01 to pass VIT…
...
- "docker/Dockerfile.web"
- "docker-compose.yml"
GSD-Task: S06/T02
2026-03-30 12:05:28 +00:00
jlightner
e6ce650487
feat: Added AppFooter component displaying app version, build date, com…
...
- "frontend/src/components/AppFooter.tsx"
- "frontend/vite.config.ts"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
- "frontend/src/vite-env.d.ts"
GSD-Task: S06/T01
2026-03-30 12:00:58 +00:00
jlightner
75332343cb
feat: Rewrote TopicsBrowse.tsx from vertical accordion to responsive 2-…
...
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/App.css"
GSD-Task: S05/T02
2026-03-30 11:48:51 +00:00
jlightner
3f3fe065f8
feat: Added Music Theory as 7th category in canonical_tags.yaml with 8…
...
- "config/canonical_tags.yaml"
- "frontend/src/App.css"
GSD-Task: S05/T01
2026-03-30 11:44:18 +00:00
jlightner
61d52d719e
feat: Reordered technique page sidebar (plugins first), added prominent…
...
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"
GSD-Task: S04/T01
2026-03-30 11:34:14 +00:00
jlightner
b4d4caeda6
feat: Added "Commit" row to version metadata panel on TechniquePage — r…
...
- "frontend/src/pages/TechniquePage.tsx"
GSD-Task: S03/T02
2026-03-30 11:25:47 +00:00
jlightner
12f9fb7334
chore: Added GIT_COMMIT_SHA build arg to Dockerfile.api, compose build…
...
- "docker/Dockerfile.api"
- "docker-compose.yml"
- "backend/config.py"
- "backend/pipeline/stages.py"
GSD-Task: S03/T01
2026-03-30 11:24:34 +00:00
jlightner
ee24731e59
feat: Added Head/Tail segmented toggle to EventLog with order param wir…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/AdminPipeline.tsx"
- "frontend/src/App.css"
GSD-Task: S02/T02
2026-03-30 11:15:21 +00:00
jlightner
bf126f4825
feat: Added order query parameter (asc/desc, default desc) to pipelin…
...
- "backend/routers/pipeline.py"
GSD-Task: S02/T01
2026-03-30 11:10:44 +00:00
jlightner
05c7ba3ca2
feat: Created AdminDropdown component with click-outside/Escape close,…
...
- "frontend/src/components/AdminDropdown.tsx"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
GSD-Task: S01/T01
2026-03-30 11:02:23 +00:00
jlightner
08d7d19d0e
fix: Nginx resolver for Docker DNS — prevent stale upstream IPs
...
Use Docker embedded DNS (127.0.0.11) with 30s TTL and variable-based
proxy_pass so nginx re-resolves the API container IP after recreates
instead of caching the startup IP forever.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 05:55:42 -05:00
jlightner
c6f69019cf
feat: Content hash dedup and prior-page versioning
...
- Add content_hash (SHA-256 of transcript text) to source_videos (migration 005)
- 3-tier duplicate detection at ingest: exact filename, content hash,
then normalized filename + duration (handles yt-dlp re-downloads)
- Snapshot prior technique_page_ids to Redis before pipeline dispatch
- Stage 5 matches prior pages by creator+category before slug fallback,
enabling version snapshots on reprocessing even when LLM generates
different slugs
- Expose content_hash in API responses and admin pipeline dashboard
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 05:55:27 -05:00
jlightner
c6c15defee
feat: Dynamic token estimation for per-stage max_tokens
...
- Add estimate_tokens() and estimate_max_tokens() to llm_client with
stage-specific output ratios (0.3x segmentation, 1.2x extraction,
0.15x classification, 1.5x synthesis)
- Add max_tokens override parameter to LLMClient.complete()
- Wire all 4 pipeline stages to estimate max_tokens from actual prompt
content with 20% buffer and 2048 floor
- Add LLM_MAX_TOKENS_HARD_LIMIT=32768 config (dynamic estimator ceiling)
- Log token estimates alongside every LLM request
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 05:55:17 -05:00
jlightner
df33d15360
feat: Pipeline events, admin dashboard, and version switcher UI
...
- Add pipeline_events table (migration 004) for structured stage logging
- Add PipelineEvent model with token usage tracking
- Admin pipeline dashboard with video list, event log, worker status,
trigger/revoke controls, and collapsible JSON payload viewer
- Version switcher on technique pages — view historical snapshots
with pipeline metadata (model names, prompt hashes)
- Frontend types for pipeline admin and version APIs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 05:55:07 -05:00
jlightner
94460faf9d
chore: auto-commit after complete-milestone
...
GSD-Unit: M005
2026-03-30 09:01:54 +00:00
jlightner
c6efec8363
feat: Split key moment card header into standalone h3 title and flex-ro…
...
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T01
2026-03-30 08:55:48 +00:00
jlightner
aa71387ad5
feat: Added CSS grid layout splitting technique page into prose (left)…
...
- "frontend/src/App.css"
- "frontend/src/pages/TechniquePage.tsx"
GSD-Task: S02/T01
2026-03-30 08:47:55 +00:00
jlightner
26556ba03e
feat: Built AdminPipeline.tsx page at /admin/pipeline with video table,…
...
- "frontend/src/pages/AdminPipeline.tsx"
- "frontend/src/api/public-client.ts"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
GSD-Task: S01/T03
2026-03-30 08:35:11 +00:00
jlightner
b3d405bb84
fix: All five admin pipeline endpoints respond correctly — fix was ngin…
...
- "backend/routers/pipeline.py"
GSD-Task: S01/T02
2026-03-30 08:30:15 +00:00
jlightner
7aa33cd17f
fix: Fixed syntax errors in pipeline event instrumentation — _emit_even…
...
- "backend/pipeline/stages.py"
GSD-Task: S01/T01
2026-03-30 08:27:53 +00:00
jlightner
b3204bece9
feat: Version switcher on technique pages — view historical snapshots with pipeline metadata
...
- Version dropdown appears when version_count > 0 (hidden until first re-run)
- Selecting a historical version overlays snapshot content (title, summary, body, chains, plugins)
- Key moments and related links always show live data (not versioned)
- Pipeline metadata block shows model, capture time, and prompt file hashes (truncated)
- Cyan banner when viewing historical version with "Back to current" button
- fetchTechniqueVersion API function for single version detail
2026-03-30 03:02:31 -05:00
jlightner
324e933670
feat: Content issue reporting — submit from technique pages, manage in admin reports page
...
- ContentReport model with generic content_type/content_id (supports any entity)
- Alembic migration 003: content_reports table with status + content indexes
- POST /reports (public), GET/PATCH /admin/reports (admin triage)
- Report modal on technique pages with issue type dropdown + description
- Admin reports page with status filter, expand/collapse detail, triage actions
- All CSS uses var(--*) tokens, dark theme consistent
2026-03-30 02:53:56 -05:00
jlightner
e08e8d021f
fix: Creators page 422 — limit=200 exceeded API max of 100, also fix error display for Pydantic validation arrays
2026-03-30 02:37:37 -05:00
jlightner
ac45ce7313
chore: auto-commit after complete-milestone
...
GSD-Unit: M004
2026-03-30 07:27:40 +00:00
jlightner
8fb3f199dc
feat: Added TypeScript version types, fetchTechniqueVersions function,…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/TechniquePage.tsx"
GSD-Task: S04/T03
2026-03-30 07:27:40 +00:00
jlightner
44fbbf030f
test: Added version list/detail API endpoints, Pydantic schemas, versio…
...
- "backend/schemas.py"
- "backend/routers/techniques.py"
- "backend/tests/test_public_api.py"
GSD-Task: S04/T02
2026-03-30 07:27:40 +00:00
jlightner
5c3e9b83c8
feat: Added TechniquePageVersion model, Alembic migration 002, pipeline…
...
- "backend/models.py"
- "alembic/versions/002_technique_page_versions.py"
- "backend/pipeline/stages.py"
GSD-Task: S04/T01
2026-03-30 07:27:40 +00:00
jlightner
37426aae77
feat: Redesigned technique page frontend: meta stats line, video filena…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.css"
GSD-Task: S03/T02
2026-03-30 07:27:40 +00:00
jlightner
f99ac1b8b9
prompts: Rewrite all four pipeline stage prompts for quality and domain awareness
...
- Stage 2: Add domain context, granularity guidance, unstructured content handling
- Stage 3: Add extract/skip framework, summary quality standards, fewer-richer directive
- Stage 4: Add production-session classification principles, ambiguity resolution examples
- Stage 5: Add voice/tone guidance, anti-generic section names, signal chain detail, anti-filler rules
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 07:27:35 +00:00
jlightner
39006ca5b6
feat: redesign technique page - meta stats, video filenames, monospace signal chains
2026-03-30 06:54:11 +00:00
jlightner
0c4162a777
feat: Added video_filename field to KeyMomentSummary schema and populat…
...
- "backend/schemas.py"
- "backend/routers/techniques.py"
GSD-Task: S03/T01
2026-03-30 06:50:01 +00:00
jlightner
c575e76861
fix: Added overflow-x:hidden to html/body, fixed mobile overflow on mod…
...
- "frontend/src/App.css"
- "frontend/index.html"
GSD-Task: S02/T02
2026-03-30 06:40:58 +00:00
jlightner
893105abd0
feat: Replaced all 193 hex colors and 24 rgba values in App.css with 77…
...
- "frontend/src/App.css"
GSD-Task: S02/T01
2026-03-30 06:37:08 +00:00
jlightner
76138887d2
fix: Creators endpoint returns paginated response, review queue limit raised to 1000, added GET /review/moments/{id} endpoint
...
- Creators: response_model changed from list to {items, total, offset, limit} matching frontend CreatorBrowseResponse
- Review queue: limit raised from 100 to 1000
- New GET /review/moments/{moment_id} endpoint for direct moment fetch
- MomentDetail uses fetchMoment instead of fetching full queue
- Merge candidates fetch uses limit=100
2026-03-30 01:26:12 -05:00
jlightner
0b0ca598b4
feat: Log LLM response token usage (prompt/completion/total, content_len, finish_reason)
2026-03-30 06:15:24 +00:00
jlightner
17347da87e
feat: Switch to FYN-LLM-Agent models — chat for stages 2/4, think for stages 3/5
2026-03-30 05:42:27 +00:00
jlightner
dfaf0481fe
fix: Reduce Celery worker concurrency from 2 to 1 — concurrent LLM requests cause empty responses
...
Qwen 3.5 397B (quantized) returns empty content when handling two large-context
extraction requests simultaneously, likely due to vLLM memory pressure. Sequential
processing eliminates this failure mode.
2026-03-30 05:37:21 +00:00
jlightner
f67e676264
fix: Bump max_tokens to 65536 (model supports 94K context, extraction needs headroom)
2026-03-30 04:57:44 +00:00
jlightner
6fb497d03a
chore: Bump LLM max_tokens to 32768, commit M002/M003 GSD artifacts
...
- max_tokens bumped from 16384 to 32768 (extraction responses still hitting limits)
- All GSD planning/completion artifacts for M002 (deployment) and M003 (DNS + LLM routing)
- KNOWLEDGE.md updated with XPLTD domain setup flow and container healthcheck patterns
- DECISIONS.md updated with D015 (subnet) and D016 (Ollama for embeddings)
2026-03-30 04:22:45 +00:00
jlightner
cf759f3739
fix: Add max_tokens=16384 to LLM requests (OpenWebUI defaults to 1000, truncating pipeline JSON)
2026-03-30 04:08:29 +00:00
jlightner
8e96fae64f
fix: Set PROMPTS_PATH=/prompts in API and worker containers
2026-03-30 03:46:46 +00:00
jlightner
4aa4b08a7f
feat: Per-stage LLM model routing with thinking modality and think-tag stripping
...
- Added 8 per-stage config fields: llm_stage{2-5}_model and llm_stage{2-5}_modality
- LLMClient.complete() accepts modality ('chat'/'thinking') and model_override
- Thinking modality: appends JSON instructions to system prompt, strips <think> tags
- strip_think_tags() handles multiline, multiple blocks, and edge cases
- Pipeline stages 2-5 read per-stage config and pass to LLM client
- Updated .env.example with per-stage model/modality documentation
- All 59 tests pass including new think-tag stripping test
2026-03-30 02:12:14 +00:00
jlightner
9fdef3b720
docs: Added CLAUDE.md redirect to ub01 canonical path, updated README with deployment section
2026-03-30 01:28:26 +00:00
jlightner
541354d89e
fix: Worker healthcheck uses celery inspect ping instead of HTTP (no web server)
2026-03-30 01:25:24 +00:00
jlightner
1b4b803f6b
fix: web healthcheck uses curl instead of wget (busybox wget fails)
2026-03-30 01:24:05 +00:00
jlightner
b49326147f
fix: alembic env.py sys.path includes parent dir for Docker compatibility
2026-03-30 01:22:30 +00:00
jlightner
8dc4e9137d
fix: Include alembic.ini and alembic/ in API Docker image for migrations
2026-03-30 01:21:41 +00:00
jlightner
7256fe7667
fix: Qdrant healthcheck uses bash /dev/tcp (no wget/curl in image)
2026-03-30 01:20:14 +00:00
jlightner
7c79574a25
fix: Ollama healthcheck uses 'ollama list' instead of curl (not in image)
2026-03-30 01:17:06 +00:00
jlightner
c295384c6a
fix: Corrected compose subnet to 172.32.0.0/24, added Qdrant + Ollama services, web on port 8096
...
- Changed network subnet from 172.24.0.0/24 (used by xpltd_docs) to 172.32.0.0/24
- Added chrysopedia-qdrant (qdrant/qdrant:v1.13.2) with healthcheck
- Added chrysopedia-ollama for embedding model (nomic-embed-text)
- Web UI exposed on 0.0.0.0:8096 (XPLTD port-suffix convention)
- API internal-only (via nginx proxy)
- Added HEALTHCHECK to Dockerfile.api
- Updated .env.example with FYN DGX LLM endpoint
2026-03-30 00:54:18 +00:00
jlightner
3b01bd94ab
chore: auto-commit after complete-milestone
...
GSD-Unit: M001
2026-03-30 00:29:45 +00:00
jlightner
07e85e95d2
feat: Built CreatorsBrowse (randomized default sort, genre filter, name…
...
- "frontend/src/pages/CreatorsBrowse.tsx"
- "frontend/src/pages/CreatorDetail.tsx"
- "frontend/src/pages/TopicsBrowse.tsx"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
- "frontend/src/api/public-client.ts"
GSD-Task: S05/T04
2026-03-30 00:13:11 +00:00
jlightner
3a7f10005b
feat: Built frontend search flow: typed public API client, landing page…
...
- "frontend/src/api/public-client.ts"
- "frontend/src/pages/Home.tsx"
- "frontend/src/pages/SearchResults.tsx"
- "frontend/src/pages/TechniquePage.tsx"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
GSD-Task: S05/T03
2026-03-30 00:09:08 +00:00
jlightner
5b8be50994
test: Added 18 integration tests for search and public API endpoints (t…
...
- "backend/tests/test_search.py"
- "backend/tests/test_public_api.py"
GSD-Task: S05/T02
2026-03-30 00:01:32 +00:00
jlightner
c0df369018
feat: Created async search service with embedding+Qdrant+keyword fallba…
...
- "backend/search_service.py"
- "backend/schemas.py"
- "backend/routers/search.py"
- "backend/routers/techniques.py"
- "backend/routers/topics.py"
- "backend/routers/creators.py"
- "backend/main.py"
GSD-Task: S05/T01
2026-03-29 23:55:52 +00:00
jlightner
2cb0f9c381
feat: Built complete admin review queue UI: queue list page with stats…
...
- "frontend/src/pages/ReviewQueue.tsx"
- "frontend/src/pages/MomentDetail.tsx"
- "frontend/src/components/StatusBadge.tsx"
- "frontend/src/components/ModeToggle.tsx"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
GSD-Task: S04/T03
2026-03-29 23:29:01 +00:00
jlightner
5542ae455f
feat: Bootstrapped React + Vite + TypeScript frontend with typed API cl…
...
- "frontend/package.json"
- "frontend/vite.config.ts"
- "frontend/tsconfig.json"
- "frontend/tsconfig.app.json"
- "frontend/index.html"
- "frontend/src/main.tsx"
- "frontend/src/App.tsx"
- "frontend/src/App.css"
GSD-Task: S04/T02
2026-03-29 23:21:53 +00:00
jlightner
c2edba952c
test: Built 9 review queue API endpoints (queue, stats, approve, reject…
...
- "backend/routers/review.py"
- "backend/schemas.py"
- "backend/redis_client.py"
- "backend/main.py"
- "backend/tests/test_review.py"
GSD-Task: S04/T01
2026-03-29 23:13:43 +00:00
jlightner
2cb10b5db8
test: Added 10 integration tests covering pipeline stages 2-6, trigger…
...
- "backend/tests/test_pipeline.py"
- "backend/tests/fixtures/mock_llm_responses.py"
- "backend/tests/conftest.py"
GSD-Task: S03/T05
2026-03-29 22:51:26 +00:00
jlightner
910e945d9c
feat: Wired automatic run_pipeline.delay() dispatch after ingest commit…
...
- "backend/routers/pipeline.py"
- "backend/routers/ingest.py"
- "backend/main.py"
GSD-Task: S03/T04
2026-03-29 22:41:02 +00:00
jlightner
5c46d1e922
feat: Created sync EmbeddingClient, QdrantManager with idempotent colle…
...
- "backend/pipeline/embedding_client.py"
- "backend/pipeline/qdrant_client.py"
- "backend/pipeline/stages.py"
GSD-Task: S03/T03
2026-03-29 22:39:04 +00:00
jlightner
b5635a09db
feat: Created 4 prompt templates and implemented 5 Celery tasks (stages…
...
- "prompts/stage2_segmentation.txt"
- "prompts/stage3_extraction.txt"
- "prompts/stage4_classification.txt"
- "prompts/stage5_synthesis.txt"
- "backend/pipeline/stages.py"
- "backend/requirements.txt"
GSD-Task: S03/T02
2026-03-29 22:36:06 +00:00
jlightner
12cc86aef9
chore: Extended Settings with 12 LLM/embedding/Qdrant config fields, cr…
...
- "backend/config.py"
- "backend/worker.py"
- "backend/pipeline/schemas.py"
- "backend/pipeline/llm_client.py"
- "backend/requirements.txt"
- "backend/pipeline/__init__.py"
- "backend/pipeline/stages.py"
GSD-Task: S03/T01
2026-03-29 22:30:31 +00:00
jlightner
bef8d95e64
test: Added 6 integration tests proving ingestion, creator auto-detecti…
...
- "backend/tests/conftest.py"
- "backend/tests/test_ingest.py"
- "backend/tests/fixtures/sample_transcript.json"
- "backend/pytest.ini"
- "backend/requirements.txt"
- "backend/models.py"
GSD-Task: S02/T02
2026-03-29 22:16:15 +00:00
jlightner
5bfeb50716
feat: Created POST /api/v1/ingest endpoint that accepts Whisper transcr…
...
- "backend/routers/ingest.py"
- "backend/schemas.py"
- "backend/requirements.txt"
- "backend/main.py"
GSD-Task: S02/T01
2026-03-29 22:09:46 +00:00
jlightner
b3a05b8218
docs: Created comprehensive README.md with architecture diagram, setup…
...
- "README.md"
- "tests/fixtures/sample_transcript.json"
GSD-Task: S01/T05
2026-03-29 22:00:41 +00:00
jlightner
56adf2f2ef
test: Created desktop Whisper transcription script with single-file/bat…
...
- "whisper/transcribe.py"
- "whisper/requirements.txt"
- "whisper/README.md"
GSD-Task: S01/T04
2026-03-29 21:57:42 +00:00
jlightner
07126138b5
chore: Built FastAPI app with DB-connected health check, Pydantic schem…
...
- "backend/main.py"
- "backend/config.py"
- "backend/schemas.py"
- "backend/routers/__init__.py"
- "backend/routers/health.py"
- "backend/routers/creators.py"
- "backend/routers/videos.py"
GSD-Task: S01/T03
2026-03-29 21:54:57 +00:00
jlightner
ad3bccf1f2
fix: Created SQLAlchemy models for all 7 entities, Alembic async migrat…
...
- "backend/models.py"
- "backend/database.py"
- "alembic/versions/001_initial.py"
- "alembic/env.py"
- "alembic.ini"
- "alembic/script.py.mako"
- "docker-compose.yml"
- ".gsd/KNOWLEDGE.md"
GSD-Task: S01/T02
2026-03-29 21:48:36 +00:00
jlightner
cd271c1a8d
feat: Created full Docker Compose project (xpltd_chrysopedia) with Post…
...
- "docker-compose.yml"
- ".env.example"
- "docker/Dockerfile.api"
- "docker/Dockerfile.web"
- "docker/nginx.conf"
- "backend/main.py"
- "backend/requirements.txt"
- "config/canonical_tags.yaml"
GSD-Task: S01/T01
2026-03-29 21:42:56 +00:00
jlightner
e15dd97b73
gsd: plan M001 (Chrysopedia Foundation) with 5 slices and S01 task breakdown
...
Milestone: Chrysopedia Foundation — Infrastructure, Pipeline Core, and Skeleton UI
Slices:
S01: Docker Compose + Database + Whisper Script (5 tasks)
S02: Transcript Ingestion API
S03: LLM Extraction Pipeline + Qdrant Integration
S04: Review Queue Admin UI
S05: Search-First Web UI
Requirements: R001-R015 covering all spec sections.
Decisions: D001 (tech stack), D002 (Docker conventions), D003 (storage layer)
2026-03-29 21:39:04 +00:00