Update ROADMAP: lawn reference learnings, A7.3 in progress, infrastructure status

- Fix lawn reference URL to https://github.com/pingdotgg/lawn
- Document lawn architecture analysis and adopted/not-adopted patterns
- Mark A7.3 (Timestamped Video Annotations) as in progress
- Update infrastructure built section with video annotation layer details
- Mark Annotation schema fields as complete in data model status

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leivur Djurhuus 2026-03-18 15:00:34 -05:00
parent 4e654b6fed
commit dd7db58c2f

View file

@ -3,7 +3,7 @@
> Single source of truth for project status and remaining work.
> Previous planning documents (IMPLEMENTATION_PLAN.md, UPGRADE_PLAN.md) are archived in `docs/archive/`.
*Last updated: 2026-03-16*
*Last updated: 2026-03-18*
---
@ -134,6 +134,12 @@ The review tool lives at its own dedicated page (`/projects/[projectId]/delivera
- "Review" button on stage cards in deliverable detail page
- Review sessions: session builder, presenter mode, summary grid, decision recording
- `ReviewSession` + `ReviewSessionItem` models in schema
- Video upload with HLS streaming (A7.1) + custom video player (A7.2)
- Video annotation layer with auto-pause, timestamped annotations, timeline markers (A7.3 in progress)
- `Annotation.timestampSeconds` + `Annotation.frameThumbnailUrl` fields in schema
- Feedback item cards show timestamp badges for video annotations
- Revisions auto-poll when video status is "processing"
- `next.config.ts` configured with `proxyClientMaxBodySize: "500mb"` for video uploads
**New dependency for all stages:** `sharp` (server-side PNG alpha compositing + image processing)
@ -421,7 +427,16 @@ enum ReviewDecision { APPROVED CHANGES_REQUESTED REJECTED }
Extend the review tool to support video. Artists submit MP4 renders; reviewers scrub to a frame, pause, and draw spatial annotations (reusing the existing annotation tools) tied to that timestamp. Optional reference video for side-by-side comparison. Self-hosted transcoding via FFmpeg — no external services.
**Reference implementation:** [lawn-video-reviewer](https://github.com/) — React video player with HLS streaming, timestamped comments, and timeline markers. Key patterns to adapt: HLS-first streaming for instant playback and smooth seeking, custom video player with frame-accurate seeking, comment markers on the scrub timeline, and keyboard-driven playback controls.
**Reference implementation:** [lawn (pingdotgg/lawn)](https://github.com/pingdotgg/lawn) — React + Convex + Mux video reviewer with HLS streaming, timestamped text comments, and timeline markers.
**Learnings from Lawn (reviewed 2026-03-18):**
- Lawn is a **time-only** comment system — no spatial annotations or drawing on video frames. Our drawing-on-frame annotation feature (SVG overlay + annotation tools) goes beyond Lawn's scope.
- **Timeline marker grouping**: Lawn deduplicates markers within 1% of the timeline to prevent visual clutter. Markers are green (resolved) / orange (unresolved) with an active ring when playback is within 1.5s.
- **Player architecture**: Custom player on raw `<video>` + HLS.js (no third-party player SDK). Uses `forwardRef` + `useImperativeHandle` to expose `seekTo(time)` for sidebar→player communication. All playback state is local `useState`.
- **Dual playback sources**: Shows raw original immediately while transcoded video processes, with a quality switcher. User is never blocked waiting for encoding.
- **Controls auto-hide**: Controls fade after 2.5s during playback, re-shown on mouse move.
- **Key patterns adopted**: HLS-first streaming, timeline markers with dedup + color coding, comment-to-player seek via timestamp badges, graceful fallback when transcoding unavailable.
- **Key patterns NOT adopted**: Mux (we self-host with FFmpeg), Convex real-time DB (we use Prisma + TanStack Query), Clerk auth (we use Auth.js).
**New dependency:** `ffmpeg` (added to Docker image for HLS transcoding, frame extraction, and metadata parsing)
@ -553,7 +568,7 @@ A custom video player built for frame-accurate review, embedded in the existing
---
##### A7.3 — Timestamped Video Annotations `[ ]`
##### A7.3 — Timestamped Video Annotations `[~]`
The core differentiator: pause a video at any frame, draw spatial annotations on that frame using the existing annotation tools, and have those annotations tied to both a timestamp and image coordinates.
@ -1226,7 +1241,7 @@ Note: `Dockerfile` and `docker-compose.yml` already exist in the repo root — r
| Model | Feature |
|---|---|
| Annotation (+ `timestampSeconds`, `frameThumbnailUrl` fields) | A3, A7.3 |
| ~~Annotation (+ `timestampSeconds`, `frameThumbnailUrl` fields)~~ | ~~A3, A7.3~~ |
| FeedbackItem | A5 |
| ~~ReviewSession, ReviewSessionItem~~ | ~~A6~~ ✅ |
| ApprovalChain, ApprovalStep, ApprovalRecord | D2 |