Compare commits
63 commits
243a7a3eb6
...
26a5d0e0ef
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
26a5d0e0ef | ||
|
|
96491ac70a | ||
|
|
41b0046361 | ||
|
|
64c0a47816 | ||
|
|
e77f8e0fea | ||
|
|
4b810c04ea | ||
|
|
612cae3491 | ||
|
|
4854dad086 | ||
|
|
3cbb614654 | ||
|
|
846db2aad5 | ||
|
|
160adc24bf | ||
|
|
899ab742a8 | ||
|
|
c42d21a29f | ||
|
|
8b2876906c | ||
|
|
cfc7e95d28 | ||
|
|
6f3a0cc3d2 | ||
|
|
b32fc5134b | ||
|
|
be1919e223 | ||
|
|
a5d3af55ca | ||
|
|
d243344ce8 | ||
|
|
51e3e75cf8 | ||
|
|
4221bae3eb | ||
|
|
60b281b9d8 | ||
|
|
b893abead1 | ||
|
|
cb3a6c919c | ||
|
|
5e4b173917 | ||
|
|
34a45d1c8e | ||
|
|
0f9e76babd | ||
|
|
a4a6187de2 | ||
|
|
0eecee4271 | ||
|
|
f706afe8f6 | ||
|
|
a60f4074dc | ||
|
|
fa493e2640 | ||
|
|
125983588d | ||
|
|
18e9a4dce1 | ||
|
|
8444fbdb12 | ||
|
|
9208b134b6 | ||
|
|
3c99084eb2 | ||
|
|
160b1a8445 | ||
|
|
5f4b960dc1 | ||
|
|
2c5d084c49 | ||
|
|
3a5fdad6b3 | ||
|
|
4db33399e9 | ||
|
|
1062e003bf | ||
|
|
84d8dc4455 | ||
|
|
0007528e77 | ||
|
|
dfc5aa2ae7 | ||
|
|
3bb0266a19 | ||
|
|
d1efdbb3fa | ||
|
|
9431aa2095 | ||
|
|
9139d5a93a | ||
|
|
cc60852ac9 | ||
|
|
f0f36a3f76 | ||
|
|
758bf7ecea | ||
|
|
66f0f51219 | ||
|
|
eab362d897 | ||
|
|
2d9076ae92 | ||
|
|
10cd175333 | ||
|
|
fb6a4cc58a | ||
|
|
27c5f4866b | ||
|
|
34acf468c6 | ||
|
|
d13d6c3aa1 | ||
|
|
3226709382 |
747 changed files with 103316 additions and 1002 deletions
|
|
@ -46,3 +46,9 @@
|
||||||
| D038 | | infrastructure | Primary git remote for chrysopedia | git.xpltd.co (Forgejo) instead of github.com | Consolidating on self-hosted Forgejo instance at git.xpltd.co. Wiki is already there. Single source of truth. | Yes | human |
|
| D038 | | infrastructure | Primary git remote for chrysopedia | git.xpltd.co (Forgejo) instead of github.com | Consolidating on self-hosted Forgejo instance at git.xpltd.co. Wiki is already there. Single source of truth. | Yes | human |
|
||||||
| D039 | | architecture | LightRAG vs Qdrant search execution strategy | Sequential with fallback — LightRAG first, Qdrant only on LightRAG failure/empty, not parallel | Running both in parallel would double latency overhead. LightRAG is the primary engine; Qdrant is a safety net. Sequential approach reduces load and simplifies result merging. | Yes | agent |
|
| D039 | | architecture | LightRAG vs Qdrant search execution strategy | Sequential with fallback — LightRAG first, Qdrant only on LightRAG failure/empty, not parallel | Running both in parallel would double latency overhead. LightRAG is the primary engine; Qdrant is a safety net. Sequential approach reduces load and simplifies result merging. | Yes | agent |
|
||||||
| D040 | M021/S02 | architecture | Creator-scoped retrieval cascade strategy | Sequential 4-tier cascade (creator → domain → global → none) with ll_keywords scoping and post-filtering | Sequential cascade is simpler than parallel-with-priority and avoids wasted LightRAG calls when early tiers succeed. ll_keywords hints LightRAG's retrieval without hard constraints. Post-filtering on tier 1 ensures strict creator scoping while 3x oversampling compensates for filtering losses. Domain tier uses ≥2 page threshold to avoid noise from sparse creators. | Yes | agent |
|
| D040 | M021/S02 | architecture | Creator-scoped retrieval cascade strategy | Sequential 4-tier cascade (creator → domain → global → none) with ll_keywords scoping and post-filtering | Sequential cascade is simpler than parallel-with-priority and avoids wasted LightRAG calls when early tiers succeed. ll_keywords hints LightRAG's retrieval without hard constraints. Post-filtering on tier 1 ensures strict creator scoping while 3x oversampling compensates for filtering losses. Domain tier uses ≥2 page threshold to avoid noise from sparse creators. | Yes | agent |
|
||||||
|
| D041 | M022/S05 | architecture | Highlight scorer weight distribution for 10-dimension model | Original 7 dimensions reduced proportionally, new 3 audio proxy dimensions (speech_rate_variance, pause_density, speaking_pace) allocated 0.22 total weight. Audio dims default to 0.5 (neutral) when word_timings unavailable for backward compatibility. | Audio proxy signals derived from word-level timing data provide meaningful highlight quality indicators without requiring raw audio analysis (librosa). Neutral fallback ensures existing scoring paths are unaffected. | Yes | agent |
|
||||||
|
| D042 | M023/S01 | architecture | Rich text editor for creator posts | Tiptap (headless, React) with StarterKit + Link + Placeholder extensions. Store Tiptap JSON as canonical format in JSONB column, render client-side via @tiptap/html. | Headless architecture fits dark theme customization. Large ecosystem, well-maintained. JSON storage is lossless and enables future server-side rendering. No HTML sanitization needed since canonical format is structured JSON. | Yes | agent |
|
||||||
|
| D043 | M023/S02 | architecture | Personality weight → system prompt modulation strategy | 3-tier intensity (<0.4 subtle reference, 0.4-0.8 adopt voice, ≥0.8 fully embody) with temperature scaling 0.3–0.5 linear on weight | Stepped intensity prevents jarring persona at low weights while allowing full creator voice at high values. Temperature stays in 0.3-0.5 range to keep responses factually grounded even at maximum personality — wider ranges risk hallucination in a knowledge-base context. | Yes | agent |
|
||||||
|
| D044 | M023/S04 | architecture | Personality weight → system prompt modulation strategy (revision) | 5-tier continuous interpolation replacing 3-tier step function. Progressive field inclusion: weight < 0.2 = no personality block; 0.2+ adds basic tone; 0.4+ adds descriptors/explanation approach; 0.6+ adds signature phrases (count scaled with weight); 0.8+ adds full vocabulary/style markers; 0.9+ adds summary paragraph. Temperature scaling unchanged (0.3 + weight * 0.2). | 3-tier step function had jarring transitions at 0.4 and 0.8 boundaries. Continuous interpolation with progressive field inclusion gives finer control — encyclopedic responses stay clean at low weights while high weights pull in the full personality profile gradually. The 0.0-0.19 dead zone ensures purely encyclopedic mode remains truly encyclopedic with zero personality artifacts. | Yes | agent |
|
||||||
|
| D045 | M025/S01 | library | Signed unsubscribe token library for email digests | PyJWT instead of itsdangerous | PyJWT was already a dependency (used for auth tokens). Avoids adding itsdangerous as a new package. JWT exp claim provides built-in expiry handling for the 30-day token validity. | Yes | agent |
|
||||||
|
| D046 | M025/S10 | feature | Whether to accept current sticky title bar as meeting R041 or implement the specified ReadingHeader | Implement proper ReadingHeader component matching R041 spec | The current sticky title bar is always visible and shows no section tracking — it doesn't match R041's spec (thin bar, appears on scroll-past, shows current section name, slide transition). The infrastructure already exists (activeId, titleBarRef, IntersectionObserver), so the implementation is ~80 lines TSX + CSS. Since M025 is about formal validation, accepting a partial implementation undermines the validation exercise. | Yes | agent |
|
||||||
|
|
|
||||||
|
|
@ -332,3 +332,75 @@
|
||||||
**Context:** When a route depends on services that require a live database, create a standalone ASGI test client that mocks the DB session at the dependency level rather than using the shared conftest.py client. This avoids PostgreSQL dependency for tests that only need to verify request/response shape and SSE event ordering. The pattern: create a fresh FastAPI app in the test, override the DB dependency, mount the router, and use httpx.AsyncClient with ASGITransport.
|
**Context:** When a route depends on services that require a live database, create a standalone ASGI test client that mocks the DB session at the dependency level rather than using the shared conftest.py client. This avoids PostgreSQL dependency for tests that only need to verify request/response shape and SSE event ordering. The pattern: create a fresh FastAPI app in the test, override the DB dependency, mount the router, and use httpx.AsyncClient with ASGITransport.
|
||||||
|
|
||||||
**Where:** `backend/tests/test_chat.py` — chat_client fixture
|
**Where:** `backend/tests/test_chat.py` — chat_client fixture
|
||||||
|
|
||||||
|
## SourceVideo.transcript_path stores absolute paths
|
||||||
|
|
||||||
|
**Context:** The `transcript_path` column on `SourceVideo` stores the full absolute path (e.g., `/data/transcripts/Creator/filename.mp4.json`), not a relative path from the mount point. Code that loads transcript files should use the path directly, not join it with a base directory prefix.
|
||||||
|
|
||||||
|
**Fix:** Use `source_video.transcript_path` directly as the file path. Do not `os.path.join("/data/transcripts", transcript_path)` — that produces a double prefix.
|
||||||
|
|
||||||
|
## highlight_candidates constraint name mismatch
|
||||||
|
|
||||||
|
**Context:** The code in `stages.py` referenced `uq_highlight_candidate_moment` for the ON CONFLICT constraint, but the actual PostgreSQL constraint is named `highlight_candidates_key_moment_id_key`. This was created by Alembic's auto-naming convention rather than an explicit `UniqueConstraint(name=...)` in the model.
|
||||||
|
|
||||||
|
**Fix:** Use the actual constraint name `highlight_candidates_key_moment_id_key`. When writing ON CONFLICT upserts, always verify the actual constraint name in the database with `inspect(engine).get_unique_constraints(table_name)` rather than guessing from the model definition.
|
||||||
|
|
||||||
|
## Parallel slice execution creates cosmetic integration gaps
|
||||||
|
|
||||||
|
**Context:** M022/S01 built the HighlightQueue UI rendering 7 score dimensions. S05 (later in the milestone) expanded the scorer to 10 dimensions. The 3 new dimensions are stored in the DB but the frontend doesn't render them yet.
|
||||||
|
|
||||||
|
**Rule:** When slices that produce data (S05 scorer) and slices that consume it (S01 UI) run in the same milestone, the consumer may be built against the pre-expansion schema. Accept this as a cosmetic gap unless it breaks functionality. Track as a follow-up for the next milestone.
|
||||||
|
|
||||||
|
## conversation_id threading pattern for SSE-based chat
|
||||||
|
|
||||||
|
**Context:** Multi-turn chat requires a stable conversation identifier flowing through: POST body → backend service → Redis key → SSE done event → frontend state. The frontend generates the ID on first message (`crypto.randomUUID()`), then reads it back from the done event for subsequent messages.
|
||||||
|
|
||||||
|
**Pattern:** conversation_id is optional on the API (auto-generated if missing for backward compat). Redis key: `chrysopedia:chat:{conversation_id}` with TTL refresh on each interaction. This lets stateless API servers serve any conversation — Redis is the single source of truth for history.
|
||||||
|
|
||||||
|
## 3-tier transcript sampling for personality extraction
|
||||||
|
|
||||||
|
**Context:** Extracting a creator personality profile from transcripts. Small creators have <5 videos, large creators have 20+. Sampling strategy must adapt to corpus size while ensuring topic diversity.
|
||||||
|
|
||||||
|
**Pattern:** 3 tiers: small (≤5 videos: use all), medium (6-15: sample ~8), large (>15: sample ~10). For medium/large, use Redis classification data to group transcripts by topic and sample proportionally, ensuring the profile captures the creator's full range rather than overrepresenting one topic area.
|
||||||
|
|
||||||
|
## Tiptap v3 useEditor requires immediatelyRender: false for React 18
|
||||||
|
|
||||||
|
**Context:** Tiptap v3's `useEditor` hook by default attempts synchronous rendering on mount, which conflicts with React 18's concurrent features (StrictMode double-mounting, suspense boundaries). This causes hydration mismatches and "flushSync was called from inside a lifecycle method" warnings.
|
||||||
|
|
||||||
|
**Fix:** Pass `immediatelyRender: false` in the useEditor config: `useEditor({ immediatelyRender: false, extensions: [...], content: ... })`. The editor still renders on the first paint — this just defers it to be React 18 compatible. No visual difference.
|
||||||
|
|
||||||
|
## get_optional_user pattern for public-but-auth-aware endpoints
|
||||||
|
|
||||||
|
**Context:** Some API endpoints need to be publicly accessible but provide different behavior for authenticated users (e.g., showing draft posts to the owner). Using the standard `get_current_user` dependency rejects unauthenticated requests with 401.
|
||||||
|
|
||||||
|
**Fix:** Create `get_optional_user` using `OAuth2PasswordBearer(auto_error=False)`. When `auto_error=False`, missing/invalid tokens return `None` instead of raising 401. The endpoint receives `Optional[User]` and branches on whether the user is present and matches the resource owner.
|
||||||
|
|
||||||
|
## Pass CSS module styles as Record<string, string> to shared utilities
|
||||||
|
|
||||||
|
**Context:** When extracting a shared React utility (e.g., `parseChatCitations`) that renders JSX with CSS module class names, the utility needs the calling component's styles object. TypeScript's `CSSModuleClasses` type is structurally incompatible across module boundaries — passing `styles` typed as the specific module's interface causes type errors.
|
||||||
|
|
||||||
|
**Fix:** Type the styles parameter as `Record<string, string>`. CSS modules already satisfy this shape at runtime. This allows any component to pass its own CSS module styles to the shared utility without type gymnastics.
|
||||||
|
|
||||||
|
## ffmpeg anullsrc for silent audio in concat workflows
|
||||||
|
|
||||||
|
**Context:** When concatenating video segments using ffmpeg's concat demuxer, all segments must have matching stream types. Intro/outro card segments generated with lavfi (color + drawtext) have no audio track, while the main clip has audio. The concat fails with stream mismatch errors.
|
||||||
|
|
||||||
|
**Fix:** Add a silent audio track to card segments using `-f lavfi -i anullsrc=r=44100:cl=stereo` and map both video and audio streams. Use `-shortest` to ensure the silent audio matches the card duration. This makes all segments codec-compatible for `-c copy` concat.
|
||||||
|
|
||||||
|
## ASS karaoke subtitles from word-level timings
|
||||||
|
|
||||||
|
**Context:** Whisper provides word-level timestamps in transcripts. Burning subtitles into short video clips requires converting these to a subtitle format that supports word-by-word highlighting.
|
||||||
|
|
||||||
|
**Fix:** Generate ASS (Advanced SubStation Alpha) files with `\k` karaoke tags. Each word gets its own Dialogue line with `{\k<centiseconds>}` duration tag. Clip-relative timing is achieved by subtracting `clip_start` from each word's timestamp. The ffmpeg `ass=` video filter renders the subtitles during encoding. This avoids custom player UI for subtitle rendering entirely.
|
||||||
|
|
||||||
|
## Fail-open rate limiting for availability-critical endpoints
|
||||||
|
|
||||||
|
**Context:** Redis-based rate limiters can fail when Redis is down or slow. For a chat endpoint that's the product's core feature, blocking all users because the rate limiter is unavailable is worse than allowing a few extra requests through.
|
||||||
|
|
||||||
|
**Fix:** Wrap all Redis operations (ZADD, ZREMRANGEBYSCORE, ZCARD) in try/except. On any Redis error, log WARNING with context and return "allowed" — the request proceeds unthrottled. This is a deliberate availability-over-strictness tradeoff. Only appropriate for features where temporary rate-limit bypass is acceptable.
|
||||||
|
|
||||||
|
## Sentinel div for IntersectionObserver on sticky/fixed elements
|
||||||
|
|
||||||
|
**Context:** IntersectionObserver doesn't detect when a sticky or fixed element scrolls past a threshold, because the element never actually leaves the viewport — it stays stuck in place.
|
||||||
|
|
||||||
|
**Fix:** Place an invisible sentinel `<div>` at the position where the event should fire (e.g., just below the article title). Observe the sentinel instead of the sticky element. When the sentinel leaves the viewport, the sticky element should appear. Use a callback ref on the sentinel so the observer reconnects if the target element renders conditionally.
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
## Current State
|
## Current State
|
||||||
|
|
||||||
Twenty-one milestones complete. M021 delivered the intelligence layer: LightRAG is now the primary search engine (Qdrant fallback), creator-scoped retrieval cascade narrows results by creator→domain→global context, a streaming chat engine answers questions with citation deep-links to technique pages, highlight detection v1 scores key moments as shorts candidates, the media player supports audio mode with waveform visualization and chapter markers, and a chapter review UI lets creators manage auto-detected chapters. Impersonation write mode and admin audit log are live. Forgejo wiki at 19 pages. The system is deployed and running on ub01 at `http://ub01:8096`. Forgejo knowledgebase wiki live at `https://git.xpltd.co/xpltdco/chrysopedia/wiki/`.
|
Twenty-five milestones complete. The platform is production-hardened and demo-ready. Rate limiting (Redis sliding-window, 3 tiers), LLM fallback (primary→Ollama), email digest notifications (Celery Beat), GDPR-style data export, creator onboarding wizard, AI transparency page, mobile responsiveness (all pages pass 375px/768px), chat quality toolkit, and formal requirement validation (37/41 validated, 4 out-of-scope). Forgejo wiki at 21 pages with Newcomer Guide. The system is deployed and running on ub01 at `http://ub01:8096`. Forgejo knowledgebase wiki live at `https://git.xpltd.co/xpltdco/chrysopedia/wiki/`.
|
||||||
|
|
||||||
### What's Built
|
### What's Built
|
||||||
|
|
||||||
|
|
@ -56,6 +56,17 @@ Twenty-one milestones complete. M021 delivered the intelligence layer: LightRAG
|
||||||
- **Pipeline admin UI fixes** — Collapse toggle styling, mobile card layout, stage chevrons, filter right-alignment, creator dropdown visibility.
|
- **Pipeline admin UI fixes** — Collapse toggle styling, mobile card layout, stage chevrons, filter right-alignment, creator dropdown visibility.
|
||||||
- **Creator profile page** — Hero section (96px avatar, bio, genre pills), social link icons (9 platforms), stats dashboard (technique/video/moment counts), featured technique card with gradient border, enriched technique grid (summary, tags, moment count), inline admin editing (bio + social links), and 480px mobile responsive overrides.
|
- **Creator profile page** — Hero section (96px avatar, bio, genre pills), social link icons (9 platforms), stats dashboard (technique/video/moment counts), featured technique card with gradient border, enriched technique grid (summary, tags, moment count), inline admin editing (bio + social links), and 480px mobile responsive overrides.
|
||||||
|
|
||||||
|
- **Post editor + file sharing** — Tiptap v3 rich text editor with formatting toolbar, drag-and-drop file attachments stored in MinIO (internal-only, presigned URL downloads). Post CRUD API with creator ownership, PostsFeed on creator profiles, PostsList management page.
|
||||||
|
- **Shorts generation pipeline** — ffmpeg-based clip extraction from approved highlights in 3 format presets (vertical 1080×1920, square 1080×1080, horizontal 1920×1080). GeneratedShort model, Celery task with per-preset independent error handling, MinIO storage, HighlightQueue UI with generate/status/download.
|
||||||
|
- **5-tier personality interpolation** — Personality slider (0.0–1.0) threads through API to ChatService. Progressive field inclusion: <0.2 pure encyclopedic, 0.2+ basic tone, 0.4+ descriptors, 0.6+ signature phrases (count scaled), 0.8+ vocabulary markers, 0.9+ summary paragraph. Temperature 0.3–0.5 linear.
|
||||||
|
|
||||||
|
- **Shorts publishing flow** — Public shareable URLs via token-based access (`/shorts/:token`). ShortPlayer page renders video with creator metadata. Share link and embed code copy buttons on HighlightQueue. Public API endpoint resolves share_token with no auth.
|
||||||
|
- **Auto-captioning** — Whisper-generated ASS karaoke subtitles with per-word `\k` tags burned into shorts via ffmpeg ass filter. Non-blocking: caption failure doesn't block short generation. 17 unit tests.
|
||||||
|
- **Shorts template system** — Creator-configurable intro/outro cards via JSONB template config on Creator model. ffmpeg lavfi card rendering with concat demuxer pipeline. Admin API and collapsible config panel in HighlightQueue. Silent audio tracks for codec-compatible concat. 28 unit tests.
|
||||||
|
- **Embeddable player** — Chrome-free player at `/embed/:videoId` rendered outside AppShell. Audio-aware iframe snippet generation (120px audio, 405px video). Copy Embed Code button on WatchPage.
|
||||||
|
- **Key moment timeline pins** — 12px color-coded circle pins on player seek bar (technique=cyan, settings=amber, reasoning=purple, workflow=green) with active-state highlighting and touch-friendly hit areas. Collapsible inline player on TechniquePage with chapter pins and bibliography seek wiring.
|
||||||
|
- **Citation timestamp links** — Chat source cards show timestamp badges linking to `/watch/:id?t=N`. Video metadata (source_video_id, start_time, end_time, filename) propagated through search → chat → SSE → frontend. Shared parseChatCitations and formatTime utilities.
|
||||||
|
|
||||||
- **Creator authentication** — Invite-code registration, JWT login (HS256, 24h expiry), protected routes. User and InviteCode models with Alembic migration 016. FastAPI auth router (register, login, me, update-profile). React AuthContext with localStorage JWT persistence.
|
- **Creator authentication** — Invite-code registration, JWT login (HS256, 24h expiry), protected routes. User and InviteCode models with Alembic migration 016. FastAPI auth router (register, login, me, update-profile). React AuthContext with localStorage JWT persistence.
|
||||||
- **Creator dashboard shell** — Protected /creator/* routes with sidebar nav (Dashboard, Settings). Profile edit and password change forms. Code-split with React.lazy.
|
- **Creator dashboard shell** — Protected /creator/* routes with sidebar nav (Dashboard, Settings). Profile edit and password change forms. Code-split with React.lazy.
|
||||||
- **Consent infrastructure** — Per-video consent toggles (allow_embed, allow_search, allow_kb, allow_download, allow_remix) with versioned audit trail. VideoConsent and ConsentAuditLog models with Alembic migration 017. 5 API endpoints with ownership verification and admin bypass.
|
- **Consent infrastructure** — Per-video consent toggles (allow_embed, allow_search, allow_kb, allow_download, allow_remix) with versioned audit trail. VideoConsent and ConsentAuditLog models with Alembic migration 017. 5 API endpoints with ownership verification and admin bypass.
|
||||||
|
|
@ -75,6 +86,12 @@ Twenty-one milestones complete. M021 delivered the intelligence layer: LightRAG
|
||||||
- **Audio mode + chapter markers** — WatchPage conditionally renders AudioWaveform (wavesurfer.js) or VideoPlayer. ChapterMarkers overlay tick buttons on seek bar. useMediaSync widened for audio/video polymorphism. Backend stream and chapters endpoints.
|
- **Audio mode + chapter markers** — WatchPage conditionally renders AudioWaveform (wavesurfer.js) or VideoPlayer. ChapterMarkers overlay tick buttons on seek bar. useMediaSync widened for audio/video polymorphism. Backend stream and chapters endpoints.
|
||||||
- **Chapter review UI** — Creator-facing ChapterReview page at /creator/chapters/:videoId with waveform regions (draggable/resizable), status cycling (draft→approved→hidden), rename, reorder. 4 chapter management API endpoints.
|
- **Chapter review UI** — Creator-facing ChapterReview page at /creator/chapters/:videoId with waveform regions (draggable/resizable), status cycling (draft→approved→hidden), rename, reorder. 4 chapter management API endpoints.
|
||||||
- **Impersonation write mode** — write_mode support on impersonation tokens with ConfirmModal confirmation. ImpersonationBanner shows during sessions. AdminAuditLog page at /admin/audit-log with paginated session history.
|
- **Impersonation write mode** — write_mode support on impersonation tokens with ConfirmModal confirmation. ImpersonationBanner shows during sessions. AdminAuditLog page at /admin/audit-log with paginated session history.
|
||||||
|
- **Highlight review queue** — Creator-scoped HighlightQueue page at /creator/highlights with filter tabs (All/Shorts/Approved/Rejected), score breakdown bars, approve/discard actions, inline trim panel. 4 backend endpoints with ownership verification.
|
||||||
|
- **Follow system** — CreatorFollow model with idempotent follow/unfollow (INSERT ON CONFLICT DO NOTHING), follower_count on creator detail, follow button on CreatorDetail hero. CreatorTiers page with Free/Pro/Premium cards and Coming Soon modals.
|
||||||
|
- **Chat widget** — Floating ChatWidget on creator profile pages: fixed-position bubble → slide-up panel, streaming SSE scoped to creator, typing indicator, citation links, suggested questions from technique data.
|
||||||
|
- **Multi-turn conversation memory** — Redis-backed conversation history with conversation_id threading (API → ChatService → SSE done event → frontend). 10 turn pair cap, 1h TTL. Both ChatWidget and ChatPage support multi-turn.
|
||||||
|
- **Highlight detection v2** — 10-dimension scoring with 3 audio proxy dimensions (speech_rate_variance, pause_density, speaking_pace) from word-level transcript timing. Neutral fallback (0.5) when word timings unavailable. 62 tests.
|
||||||
|
- **Personality profile extraction** — Creator.personality_profile JSONB column, 3-tier transcript sampling with topic-diverse selection, LLM extraction with Pydantic validation, admin trigger endpoint, collapsible frontend component.
|
||||||
|
|
||||||
### Stack
|
### Stack
|
||||||
|
|
||||||
|
|
@ -108,3 +125,7 @@ Twenty-one milestones complete. M021 delivered the intelligence layer: LightRAG
|
||||||
| M019 | Foundations — Auth, Consent & LightRAG | ✅ Complete |
|
| M019 | Foundations — Auth, Consent & LightRAG | ✅ Complete |
|
||||||
| M020 | Core Experiences — Player, Impersonation & Knowledge Routing | ✅ Complete |
|
| M020 | Core Experiences — Player, Impersonation & Knowledge Routing | ✅ Complete |
|
||||||
| M021 | Intelligence Online — Chat, Chapters & Search Cutover | ✅ Complete |
|
| M021 | Intelligence Online — Chat, Chapters & Search Cutover | ✅ Complete |
|
||||||
|
| M022 | Creator Tools & Personality | ✅ Complete |
|
||||||
|
| M023 | MVP Integration — Demo Build | ✅ Complete |
|
||||||
|
| M024 | Polish, Shorts Pipeline & Citations | ✅ Complete |
|
||||||
|
| M025 | Hardening & Launch Prep | ✅ Complete |
|
||||||
|
|
|
||||||
|
|
@ -85,9 +85,9 @@
|
||||||
**Primary Owner:** M001/S05
|
**Primary Owner:** M001/S05
|
||||||
|
|
||||||
## R015 — 30-Second Retrieval Target
|
## R015 — 30-Second Retrieval Target
|
||||||
**Status:** active
|
**Status:** validated
|
||||||
**Description:** A producer mid-session can find a specific technique in under 30 seconds from Alt+Tab to reading the key insight.
|
**Description:** A producer mid-session can find a specific technique in under 30 seconds from Alt+Tab to reading the key insight.
|
||||||
**Validation:** Timed test: Alt+Tab → search → read technique → under 30 seconds.
|
**Validation:** Timed browser test: homepage → search "snare" → click first result → technique page content visible in ~9 seconds (well under 30s target). Verified on live deployment at ub01:8096.
|
||||||
**Primary Owner:** M001/S05
|
**Primary Owner:** M001/S05
|
||||||
|
|
||||||
## R016 — Card Hover Animations & Staggered Entrance
|
## R016 — Card Hover Animations & Staggered Entrance
|
||||||
|
|
@ -220,22 +220,22 @@
|
||||||
**Primary Owner:** M015/S05
|
**Primary Owner:** M015/S05
|
||||||
|
|
||||||
## R037 — Landing Page Visual Consistency
|
## R037 — Landing Page Visual Consistency
|
||||||
**Status:** active
|
**Status:** validated
|
||||||
**Description:** Homepage has consistent max-width tracks, spacing, border-radius, and no CSS bugs (duplicate .btn rule, border-image killing border-radius). Stats scorecard has animated count-up. Section headings use unified treatment.
|
**Description:** Homepage has consistent max-width tracks, spacing, border-radius, and no CSS bugs (duplicate .btn rule, border-image killing border-radius). Stats scorecard has animated count-up. Section headings use unified treatment.
|
||||||
**Validation:** Visual comparison at 1280px and 375px shows consistent alignment, spacing, and card radius. No jagged center column. Featured card has rounded corners.
|
**Validation:** Visual comparison at 1280px: 3-column card alignment, stats scorecard (95 ARTICLES, 26 CREATORS) with count-up animation, consistent spacing. At 375px: single-column, no overflow or breakage. Verified on ub01:8096 via browser screenshots.
|
||||||
**Primary Owner:** M016/S01
|
**Primary Owner:** M016/S01
|
||||||
**Supporting Slices:** M016/S06
|
**Supporting Slices:** M016/S06
|
||||||
|
|
||||||
## R038 — Pipeline Admin UI Fixes
|
## R038 — Pipeline Admin UI Fixes
|
||||||
**Status:** active
|
**Status:** validated
|
||||||
**Description:** Pipeline admin page: most-recent run collapse toggle works without flicker, mobile job cards don't show vertical text, stage direction chevrons visible, status filter uses button group (not text input), creator dropdown populates without 422 error.
|
**Description:** Pipeline admin page: most-recent run collapse toggle works without flicker, mobile job cards don't show vertical text, stage direction chevrons visible, status filter uses button group (not text input), creator dropdown populates without 422 error.
|
||||||
**Validation:** Collapse toggle on most-recent run works. 375px shows truncated creator names. Chevrons between stages. Filter buttons right-aligned. Creator dropdown populated.
|
**Validation:** Pipeline admin at ub01:8096/admin/pipeline: collapse toggle on Recent Activity works (click toggles). Text filter shows multiple creators (KOAN Sound, COPYCATT, Current Value, DJ Shortee, DONKONG, Chee). Mobile 375px: no vertical text on cards, single-column layout.
|
||||||
**Primary Owner:** M016/S02
|
**Primary Owner:** M016/S02
|
||||||
|
|
||||||
## R039 — Brand Minimum (Favicon, OG Tags, Logo)
|
## R039 — Brand Minimum (Favicon, OG Tags, Logo)
|
||||||
**Status:** active
|
**Status:** validated
|
||||||
**Description:** Site has a favicon, OG meta tags for social sharing previews, and an inline SVG logo next to "Chrysopedia" in the header.
|
**Description:** Site has a favicon, OG meta tags for social sharing previews, and an inline SVG logo next to "Chrysopedia" in the header.
|
||||||
**Validation:** Browser tab shows favicon. Sharing URL produces preview card with title/description/image. Logo visible in header.
|
**Validation:** DOM: link[rel='icon'] href="/favicon.svg", meta[property='og:title'] content="Chrysopedia", meta[property='og:image'] content="/og-image.png". Logo SVG visible in header. HTTP 200 for /favicon.svg and /og-image.png on ub01:8096.
|
||||||
**Primary Owner:** M016/S03
|
**Primary Owner:** M016/S03
|
||||||
|
|
||||||
## R040 — Table of Contents Modernization
|
## R040 — Table of Contents Modernization
|
||||||
|
|
@ -245,7 +245,8 @@
|
||||||
**Primary Owner:** M016/S04
|
**Primary Owner:** M016/S04
|
||||||
|
|
||||||
## R041 — Sticky Reading Header
|
## R041 — Sticky Reading Header
|
||||||
**Status:** active
|
**Status:** validated
|
||||||
**Description:** Thin sticky bar appears when user scrolls past the article title on technique pages. Shows article title (truncated) + current section name. Slides in/out with CSS transition. Works on mobile.
|
**Description:** Thin sticky bar appears when user scrolls past the article title on technique pages. Shows article title (truncated) + current section name. Slides in/out with CSS transition. Works on mobile.
|
||||||
**Validation:** Scroll past title on a long technique page — reading header appears with correct section tracking. Works at 375px.
|
**Validation:** Navigated to v2 technique page (drop-first-production-copycatt). Scrolled past title: .reading-header--visible class present, showing truncated title. At 375px mobile: reading header renders at full width. CSS transition slide-in/out confirmed.
|
||||||
**Primary Owner:** M016/S05
|
**Primary Owner:** M016/S05
|
||||||
|
**Notes:** ReadingHeader only renders on v2 body_sections_format pages (84 of 95 pages). The 11 v1 pages are legacy format from early pipeline runs.
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,36 @@
|
||||||
# GSD State
|
# GSD State
|
||||||
|
|
||||||
**Active Milestone:** M022: Creator Tools & Personality
|
**Active Milestone:** M025: Hardening & Launch Prep
|
||||||
**Active Slice:** S02: [A] Follow System + Tier UI (Demo Placeholders)
|
**Active Slice:** None
|
||||||
**Phase:** evaluating-gates
|
**Phase:** complete
|
||||||
**Requirements Status:** 0 active · 0 validated · 0 deferred · 0 out of scope
|
**Requirements Status:** 0 active · 0 validated · 0 deferred · 0 out of scope
|
||||||
|
|
||||||
## Milestone Registry
|
## Milestone Registry
|
||||||
- ✅ **M001:** Chrysopedia Foundation — Infrastructure, Pipeline Core, and Skeleton UI
|
- ✅ **M001:** Chrysopedia Foundation - Infrastructure, Pipeline Core, and Skeleton UI
|
||||||
- ✅ **M002:** M002: Chrysopedia Deployment — GitHub, ub01 Docker Stack, and Production Wiring
|
- ✅ **M002:** M002:
|
||||||
- ✅ **M003:** M003: Domain + DNS + Per-Stage LLM Model Routing
|
- ✅ **M003:** M003:
|
||||||
- ✅ **M004:** M004: UI Polish, Bug Fixes, Technique Page Redesign, and Article Versioning
|
- ✅ **M004:** M004:
|
||||||
- ✅ **M005:** M005: Pipeline Dashboard, Technique Page Redesign, Key Moment Cards
|
- ✅ **M005:** M005:
|
||||||
- ✅ **M006:** M006: Admin Nav, Pipeline Log Views, Commit SHA, Tag Polish, Topics Redesign, Footer
|
- ✅ **M006:** M006:
|
||||||
- ✅ **M007:** M007: Pipeline Transparency, Auto-Ingest, Admin UX Polish, and Mobile Fixes
|
- ✅ **M007:** M007:
|
||||||
- ✅ **M008:** M008: Credibility Debt Cleanup — Broken Links, Test Data, Jargon, Empty Metrics
|
- ✅ **M008:** M008:
|
||||||
- ✅ **M009:** Homepage & First Impression
|
- ✅ **M009:** Homepage & First Impression
|
||||||
- ✅ **M010:** Discovery, Navigation & Visual Identity
|
- ✅ **M010:** Discovery, Navigation & Visual Identity
|
||||||
- ✅ **M011:** M011: Interaction Polish, Navigation & Accessibility
|
- ✅ **M011:** M011:
|
||||||
- ✅ **M012:** M012: Multi-Field Composite Search & Sort Controls
|
- ✅ **M012:** M012:
|
||||||
- ✅ **M013:** M013: Prompt Quality Toolkit — LLM Fitness, Scoring, and Automated Optimization
|
- ✅ **M013:** M013:
|
||||||
- ✅ **M014:** M014: Multi-Source Technique Pages — Nested Sections, Composition, Citations, and Section Search
|
- ✅ **M014:** M014:
|
||||||
- ✅ **M015:** M015: Social Proof, Freshness Signals & Admin UX
|
- ✅ **M015:** M015:
|
||||||
- ✅ **M016:** M016: Visual Identity & Reading Experience
|
- ✅ **M016:** M016:
|
||||||
- ✅ **M017:** M017: Creator Profile Page — Hero, Stats, Featured Technique & Admin Editing
|
- ✅ **M017:** M017:
|
||||||
- ✅ **M018:** M018: Phase 2 Research & Documentation — Site Audit and Forgejo Wiki Bootstrap
|
- ✅ **M018:** M018:
|
||||||
- ✅ **M019:** Foundations — Auth, Consent & LightRAG
|
- ✅ **M019:** Foundations — Auth, Consent & LightRAG
|
||||||
- ✅ **M020:** Core Experiences — Player, Impersonation & Knowledge Routing
|
- ✅ **M020:** Core Experiences — Player, Impersonation & Knowledge Routing
|
||||||
- ✅ **M021:** Intelligence Online — Chat, Chapters & Search Cutover
|
- ✅ **M021:** Intelligence Online — Chat, Chapters & Search Cutover
|
||||||
- 🔄 **M022:** Creator Tools & Personality
|
- ✅ **M022:** Creator Tools & Personality
|
||||||
- ⬜ **M023:** MVP Integration — Demo Build
|
- ✅ **M023:** MVP Integration — Demo Build
|
||||||
- ⬜ **M024:** Polish, Shorts Pipeline & Citations
|
- ✅ **M024:** Polish, Shorts Pipeline & Citations
|
||||||
- ⬜ **M025:** Hardening & Launch Prep
|
- ✅ **M025:** Hardening & Launch Prep
|
||||||
|
|
||||||
## Recent Decisions
|
## Recent Decisions
|
||||||
- None recorded
|
- None recorded
|
||||||
|
|
@ -39,4 +39,4 @@
|
||||||
- None
|
- None
|
||||||
|
|
||||||
## Next Action
|
## Next Action
|
||||||
Evaluate 3 quality gate(s) for S02 before execution.
|
All milestones complete.
|
||||||
|
|
|
||||||
33
.gsd/activity/462-research-slice-M022-S03.jsonl
Normal file
33
.gsd/activity/462-research-slice-M022-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
20
.gsd/activity/463-plan-slice-M022-S03.jsonl
Normal file
20
.gsd/activity/463-plan-slice-M022-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
41
.gsd/activity/464-execute-task-M022-S03-T01.jsonl
Normal file
41
.gsd/activity/464-execute-task-M022-S03-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
18
.gsd/activity/465-complete-slice-M022-S03.jsonl
Normal file
18
.gsd/activity/465-complete-slice-M022-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
41
.gsd/activity/466-research-slice-M022-S04.jsonl
Normal file
41
.gsd/activity/466-research-slice-M022-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
27
.gsd/activity/467-plan-slice-M022-S04.jsonl
Normal file
27
.gsd/activity/467-plan-slice-M022-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
45
.gsd/activity/468-execute-task-M022-S04-T01.jsonl
Normal file
45
.gsd/activity/468-execute-task-M022-S04-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
47
.gsd/activity/469-execute-task-M022-S04-T02.jsonl
Normal file
47
.gsd/activity/469-execute-task-M022-S04-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
20
.gsd/activity/470-complete-slice-M022-S04.jsonl
Normal file
20
.gsd/activity/470-complete-slice-M022-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
77
.gsd/activity/471-research-slice-M022-S05.jsonl
Normal file
77
.gsd/activity/471-research-slice-M022-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
24
.gsd/activity/472-plan-slice-M022-S05.jsonl
Normal file
24
.gsd/activity/472-plan-slice-M022-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
60
.gsd/activity/473-execute-task-M022-S05-T01.jsonl
Normal file
60
.gsd/activity/473-execute-task-M022-S05-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
119
.gsd/activity/474-execute-task-M022-S05-T02.jsonl
Normal file
119
.gsd/activity/474-execute-task-M022-S05-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
28
.gsd/activity/475-complete-slice-M022-S05.jsonl
Normal file
28
.gsd/activity/475-complete-slice-M022-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
93
.gsd/activity/476-research-slice-M022-S06.jsonl
Normal file
93
.gsd/activity/476-research-slice-M022-S06.jsonl
Normal file
File diff suppressed because one or more lines are too long
37
.gsd/activity/477-plan-slice-M022-S06.jsonl
Normal file
37
.gsd/activity/477-plan-slice-M022-S06.jsonl
Normal file
File diff suppressed because one or more lines are too long
26
.gsd/activity/478-execute-task-M022-S06-T01.jsonl
Normal file
26
.gsd/activity/478-execute-task-M022-S06-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
69
.gsd/activity/479-execute-task-M022-S06-T02.jsonl
Normal file
69
.gsd/activity/479-execute-task-M022-S06-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
61
.gsd/activity/480-execute-task-M022-S06-T03.jsonl
Normal file
61
.gsd/activity/480-execute-task-M022-S06-T03.jsonl
Normal file
File diff suppressed because one or more lines are too long
21
.gsd/activity/481-complete-slice-M022-S06.jsonl
Normal file
21
.gsd/activity/481-complete-slice-M022-S06.jsonl
Normal file
File diff suppressed because one or more lines are too long
39
.gsd/activity/482-research-slice-M022-S07.jsonl
Normal file
39
.gsd/activity/482-research-slice-M022-S07.jsonl
Normal file
File diff suppressed because one or more lines are too long
9
.gsd/activity/483-plan-slice-M022-S07.jsonl
Normal file
9
.gsd/activity/483-plan-slice-M022-S07.jsonl
Normal file
File diff suppressed because one or more lines are too long
98
.gsd/activity/484-execute-task-M022-S07-T01.jsonl
Normal file
98
.gsd/activity/484-execute-task-M022-S07-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
14
.gsd/activity/485-complete-slice-M022-S07.jsonl
Normal file
14
.gsd/activity/485-complete-slice-M022-S07.jsonl
Normal file
File diff suppressed because one or more lines are too long
31
.gsd/activity/486-validate-milestone-M022.jsonl
Normal file
31
.gsd/activity/486-validate-milestone-M022.jsonl
Normal file
File diff suppressed because one or more lines are too long
37
.gsd/activity/487-complete-milestone-M022.jsonl
Normal file
37
.gsd/activity/487-complete-milestone-M022.jsonl
Normal file
File diff suppressed because one or more lines are too long
86
.gsd/activity/488-research-slice-M023-S01.jsonl
Normal file
86
.gsd/activity/488-research-slice-M023-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
37
.gsd/activity/489-plan-slice-M023-S01.jsonl
Normal file
37
.gsd/activity/489-plan-slice-M023-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
62
.gsd/activity/490-execute-task-M023-S01-T01.jsonl
Normal file
62
.gsd/activity/490-execute-task-M023-S01-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
80
.gsd/activity/491-execute-task-M023-S01-T02.jsonl
Normal file
80
.gsd/activity/491-execute-task-M023-S01-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
102
.gsd/activity/492-execute-task-M023-S01-T03.jsonl
Normal file
102
.gsd/activity/492-execute-task-M023-S01-T03.jsonl
Normal file
File diff suppressed because one or more lines are too long
54
.gsd/activity/493-execute-task-M023-S01-T04.jsonl
Normal file
54
.gsd/activity/493-execute-task-M023-S01-T04.jsonl
Normal file
File diff suppressed because one or more lines are too long
35
.gsd/activity/494-complete-slice-M023-S01.jsonl
Normal file
35
.gsd/activity/494-complete-slice-M023-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
51
.gsd/activity/495-research-slice-M023-S02.jsonl
Normal file
51
.gsd/activity/495-research-slice-M023-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
31
.gsd/activity/496-plan-slice-M023-S02.jsonl
Normal file
31
.gsd/activity/496-plan-slice-M023-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
52
.gsd/activity/497-execute-task-M023-S02-T01.jsonl
Normal file
52
.gsd/activity/497-execute-task-M023-S02-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
41
.gsd/activity/498-execute-task-M023-S02-T02.jsonl
Normal file
41
.gsd/activity/498-execute-task-M023-S02-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
22
.gsd/activity/499-complete-slice-M023-S02.jsonl
Normal file
22
.gsd/activity/499-complete-slice-M023-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
98
.gsd/activity/500-research-slice-M023-S03.jsonl
Normal file
98
.gsd/activity/500-research-slice-M023-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
43
.gsd/activity/501-plan-slice-M023-S03.jsonl
Normal file
43
.gsd/activity/501-plan-slice-M023-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
40
.gsd/activity/502-execute-task-M023-S03-T01.jsonl
Normal file
40
.gsd/activity/502-execute-task-M023-S03-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
64
.gsd/activity/503-execute-task-M023-S03-T02.jsonl
Normal file
64
.gsd/activity/503-execute-task-M023-S03-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
62
.gsd/activity/504-execute-task-M023-S03-T03.jsonl
Normal file
62
.gsd/activity/504-execute-task-M023-S03-T03.jsonl
Normal file
File diff suppressed because one or more lines are too long
39
.gsd/activity/505-complete-slice-M023-S03.jsonl
Normal file
39
.gsd/activity/505-complete-slice-M023-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
83
.gsd/activity/506-research-slice-M023-S04.jsonl
Normal file
83
.gsd/activity/506-research-slice-M023-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
61
.gsd/activity/507-plan-slice-M023-S04.jsonl
Normal file
61
.gsd/activity/507-plan-slice-M023-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
29
.gsd/activity/508-execute-task-M023-S04-T01.jsonl
Normal file
29
.gsd/activity/508-execute-task-M023-S04-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
34
.gsd/activity/509-execute-task-M023-S04-T02.jsonl
Normal file
34
.gsd/activity/509-execute-task-M023-S04-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
22
.gsd/activity/510-complete-slice-M023-S04.jsonl
Normal file
22
.gsd/activity/510-complete-slice-M023-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
29
.gsd/activity/511-research-slice-M023-S05.jsonl
Normal file
29
.gsd/activity/511-research-slice-M023-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
9
.gsd/activity/512-plan-slice-M023-S05.jsonl
Normal file
9
.gsd/activity/512-plan-slice-M023-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
115
.gsd/activity/513-execute-task-M023-S05-T01.jsonl
Normal file
115
.gsd/activity/513-execute-task-M023-S05-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
21
.gsd/activity/514-complete-slice-M023-S05.jsonl
Normal file
21
.gsd/activity/514-complete-slice-M023-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
32
.gsd/activity/515-validate-milestone-M023.jsonl
Normal file
32
.gsd/activity/515-validate-milestone-M023.jsonl
Normal file
File diff suppressed because one or more lines are too long
32
.gsd/activity/516-complete-milestone-M023.jsonl
Normal file
32
.gsd/activity/516-complete-milestone-M023.jsonl
Normal file
File diff suppressed because one or more lines are too long
77
.gsd/activity/517-research-slice-M024-S01.jsonl
Normal file
77
.gsd/activity/517-research-slice-M024-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
45
.gsd/activity/518-plan-slice-M024-S01.jsonl
Normal file
45
.gsd/activity/518-plan-slice-M024-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
70
.gsd/activity/519-execute-task-M024-S01-T01.jsonl
Normal file
70
.gsd/activity/519-execute-task-M024-S01-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
46
.gsd/activity/520-execute-task-M024-S01-T02.jsonl
Normal file
46
.gsd/activity/520-execute-task-M024-S01-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
17
.gsd/activity/521-complete-slice-M024-S01.jsonl
Normal file
17
.gsd/activity/521-complete-slice-M024-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
74
.gsd/activity/522-research-slice-M024-S02.jsonl
Normal file
74
.gsd/activity/522-research-slice-M024-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
36
.gsd/activity/523-plan-slice-M024-S02.jsonl
Normal file
36
.gsd/activity/523-plan-slice-M024-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
36
.gsd/activity/524-execute-task-M024-S02-T01.jsonl
Normal file
36
.gsd/activity/524-execute-task-M024-S02-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
58
.gsd/activity/525-execute-task-M024-S02-T02.jsonl
Normal file
58
.gsd/activity/525-execute-task-M024-S02-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
19
.gsd/activity/526-complete-slice-M024-S02.jsonl
Normal file
19
.gsd/activity/526-complete-slice-M024-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
57
.gsd/activity/527-research-slice-M024-S03.jsonl
Normal file
57
.gsd/activity/527-research-slice-M024-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
22
.gsd/activity/528-plan-slice-M024-S03.jsonl
Normal file
22
.gsd/activity/528-plan-slice-M024-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
38
.gsd/activity/529-execute-task-M024-S03-T01.jsonl
Normal file
38
.gsd/activity/529-execute-task-M024-S03-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
64
.gsd/activity/530-execute-task-M024-S03-T02.jsonl
Normal file
64
.gsd/activity/530-execute-task-M024-S03-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
21
.gsd/activity/531-complete-slice-M024-S03.jsonl
Normal file
21
.gsd/activity/531-complete-slice-M024-S03.jsonl
Normal file
File diff suppressed because one or more lines are too long
59
.gsd/activity/532-research-slice-M024-S04.jsonl
Normal file
59
.gsd/activity/532-research-slice-M024-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
66
.gsd/activity/533-plan-slice-M024-S04.jsonl
Normal file
66
.gsd/activity/533-plan-slice-M024-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
80
.gsd/activity/534-execute-task-M024-S04-T01.jsonl
Normal file
80
.gsd/activity/534-execute-task-M024-S04-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
68
.gsd/activity/535-execute-task-M024-S04-T02.jsonl
Normal file
68
.gsd/activity/535-execute-task-M024-S04-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
122
.gsd/activity/536-execute-task-M024-S04-T03.jsonl
Normal file
122
.gsd/activity/536-execute-task-M024-S04-T03.jsonl
Normal file
File diff suppressed because one or more lines are too long
28
.gsd/activity/537-complete-slice-M024-S04.jsonl
Normal file
28
.gsd/activity/537-complete-slice-M024-S04.jsonl
Normal file
File diff suppressed because one or more lines are too long
171
.gsd/activity/538-research-slice-M024-S05.jsonl
Normal file
171
.gsd/activity/538-research-slice-M024-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
77
.gsd/activity/539-plan-slice-M024-S05.jsonl
Normal file
77
.gsd/activity/539-plan-slice-M024-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
43
.gsd/activity/540-execute-task-M024-S05-T01.jsonl
Normal file
43
.gsd/activity/540-execute-task-M024-S05-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
76
.gsd/activity/541-execute-task-M024-S05-T02.jsonl
Normal file
76
.gsd/activity/541-execute-task-M024-S05-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
25
.gsd/activity/542-complete-slice-M024-S05.jsonl
Normal file
25
.gsd/activity/542-complete-slice-M024-S05.jsonl
Normal file
File diff suppressed because one or more lines are too long
34
.gsd/activity/543-research-slice-M024-S06.jsonl
Normal file
34
.gsd/activity/543-research-slice-M024-S06.jsonl
Normal file
File diff suppressed because one or more lines are too long
9
.gsd/activity/544-plan-slice-M024-S06.jsonl
Normal file
9
.gsd/activity/544-plan-slice-M024-S06.jsonl
Normal file
File diff suppressed because one or more lines are too long
60
.gsd/activity/545-execute-task-M024-S06-T01.jsonl
Normal file
60
.gsd/activity/545-execute-task-M024-S06-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
12
.gsd/activity/546-complete-slice-M024-S06.jsonl
Normal file
12
.gsd/activity/546-complete-slice-M024-S06.jsonl
Normal file
File diff suppressed because one or more lines are too long
36
.gsd/activity/547-validate-milestone-M024.jsonl
Normal file
36
.gsd/activity/547-validate-milestone-M024.jsonl
Normal file
File diff suppressed because one or more lines are too long
48
.gsd/activity/548-complete-milestone-M024.jsonl
Normal file
48
.gsd/activity/548-complete-milestone-M024.jsonl
Normal file
File diff suppressed because one or more lines are too long
66
.gsd/activity/549-research-slice-M025-S01.jsonl
Normal file
66
.gsd/activity/549-research-slice-M025-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
39
.gsd/activity/550-plan-slice-M025-S01.jsonl
Normal file
39
.gsd/activity/550-plan-slice-M025-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
45
.gsd/activity/551-execute-task-M025-S01-T01.jsonl
Normal file
45
.gsd/activity/551-execute-task-M025-S01-T01.jsonl
Normal file
File diff suppressed because one or more lines are too long
73
.gsd/activity/552-execute-task-M025-S01-T02.jsonl
Normal file
73
.gsd/activity/552-execute-task-M025-S01-T02.jsonl
Normal file
File diff suppressed because one or more lines are too long
170
.gsd/activity/553-execute-task-M025-S01-T03.jsonl
Normal file
170
.gsd/activity/553-execute-task-M025-S01-T03.jsonl
Normal file
File diff suppressed because one or more lines are too long
26
.gsd/activity/554-complete-slice-M025-S01.jsonl
Normal file
26
.gsd/activity/554-complete-slice-M025-S01.jsonl
Normal file
File diff suppressed because one or more lines are too long
99
.gsd/activity/555-research-slice-M025-S02.jsonl
Normal file
99
.gsd/activity/555-research-slice-M025-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
37
.gsd/activity/556-plan-slice-M025-S02.jsonl
Normal file
37
.gsd/activity/556-plan-slice-M025-S02.jsonl
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue