Three related bugs fixed:
1. Form save buttons silently failing — valueAsNumber on empty number inputs
produced NaN, which Zod rejected without visible errors on hidden tabs.
Replaced with setValueAs that converts empty strings to undefined.
2. Unique constraint violation on deliverable stage creation — dynamic pipeline
stages without matching global template slugs all fell back to
globalTemplates[0], creating duplicate (deliverableId, templateId) pairs.
Changed constraint from @@unique([deliverableId, templateId]) to
@@unique([deliverableId, stageDefinitionId]).
3. Stage names showing wrong template — all UI components read
stage.template.name exclusively, ignoring stageDefinition from the dynamic
pipeline system. Updated 13 components, 6 services, and all relevant Prisma
queries to prefer stageDefinition over template for display.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Video upload now works without FFmpeg on PATH — metadata extraction
returns defaults, thumbnail is skipped, HLS transcoding is skipped,
and video is marked as ready with raw MP4 serving only. A one-time
warning is logged. Full HLS pipeline activates when FFmpeg is present
(Docker or local install).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Custom video player with hls.js for instant HLS playback with MP4
fallback. Full keyboard-driven controls matching NLE conventions:
Space/K play/pause, J/L skip 5s, arrow/comma/period frame step,
[/] speed, F fullscreen, M mute. Timecode display in HH:MM:SS:FF.
Components:
- video-player.tsx: Core player with HLS/MP4 source loading
- video-controls.tsx: Play, seek, speed, volume, fullscreen, loop
- video-timeline.tsx: Scrub bar with hover time preview + marker slots
- video-frame-display.tsx: Timecode display (HH:MM:SS:FF)
- video-upload-zone.tsx: Drag-drop upload with progress bar (XHR)
- use-video-player.ts: Player state hook with keyboard shortcuts
Review page integration:
- Auto-detects video vs image attachments per revision
- Image/Video toggle when both exist on same revision
- Upload panel extended with video + reference video zones
- VideoPlayer renders in place of ImageViewer when in video mode
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FFmpeg in Docker for transcoding, thumbnail extraction, and metadata
parsing. Videos stored in /data/uploads (mounted volume), served via
streaming API route with Range headers and HLS segment caching. Upload
flow: stream-write MP4 → ffprobe metadata → thumbnail → async HLS
transcode → update revision status to ready.
New files:
- video-service.ts: FFmpeg/ffprobe wrapper (HLS, thumbnails, metadata)
- /api/uploads/[...path]: streaming file server with Range support
Modified:
- upload-service.ts: video handling, 500MB limit, async HLS pipeline
- upload route: accepts video/referenceVideo types
- Dockerfile: ffmpeg + /data/uploads directory
- docker-compose.yml: uploads_data volume
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Implemented SessionPresenter and SessionSummary components for managing review sessions.
- Created AlertDialog component for modal dialogs.
- Developed hooks for managing review sessions, including fetching, creating, updating, and deleting sessions.
- Added service functions for review session operations in the backend.
- Introduced validation schemas for review session inputs using Zod.
Replace FeedbackSeverity enum (Critical/Major/Minor/Suggestion) with a
simple isActionItem boolean. Annotations default to action items (things
the artist must fix). Any item can be toggled to an info callout (context
that doesn't need action). Progress bar and carry-forward only count
action items. Screenshot paste limited to 5MB with user notification.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
A4 — Revision History Timeline:
- Collapsible right panel with vertical timeline of all revision rounds
- Each node shows thumbnail, status badge, timestamp, annotation count,
comment summary, and decision record
- Keyboard navigation (up/down arrows), auto-scroll to active round
- Filter by rounds with feedback, "Compare from here" action
- Enriched revision data hook aggregating annotations + comments
A5 — Feedback Checklist:
- FeedbackItem model with severity (Critical/Major/Minor/Suggestion),
status flow (Open → In Progress → Resolved → Verified), and
carry-forward between revision rounds
- Auto-creation from annotations (non-blocking, post-transaction)
- Checklist panel in review page with progress bar, severity grouping,
resolve-with-note flow, verify/reopen actions
- FeedbackIndicator badge on stage cards in deliverable detail page
- CRUD API routes + TanStack Query hooks
- Prisma schema additions (requires db push)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Canvas-based image viewer with zoom-to-cursor, pan, retina support, and
minimap navigation. Image upload API with PNG alpha compositing (sharp)
for CG renders with transparent backgrounds, TIFF-to-PNG conversion,
and auto-generated thumbnails. Review page accessible from stage cards
on the deliverable detail page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Implemented `stage-resolver.ts` to unify old and new pipeline stage definitions.
- Created `org-scope.ts` for organization access verification and scoping queries.
- Added role-based permissions management in `permissions.ts` and `rbac-service.ts`.
- Introduced invitation management in `invitation-service.ts` with validation schemas.
- Developed custom field and notification rule services with respective validators.
- Established pipeline template CRUD operations in `pipeline-template-service.ts`.
- Added Zustand store for managing pipeline builder state in `pipeline-builder-store.ts`.
- Implemented GET endpoint for weekly report data retrieval.
- Created components for displaying various sections of the weekly report:
- At-Risk Projects
- Completed Deliverables
- Deadline Compliance
- KPI Strip
- Pipeline Snapshot
- Upcoming Deliverables
- Report Header
- Added a custom hook for fetching weekly report data using React Query.
- Developed service functions to generate weekly report data from the database.
- Enhanced UI with responsive design and improved accessibility features.
- Add PATCH endpoint to handle date overrides and clear manual overrides in the stage API.
- Introduce hooks for overriding stage dates and clearing overrides.
- Enhance the stage dependency engine to allow reopening from terminal states.
- Update stage status transitions to support reopening stages.
- Implement scheduling logic to auto-schedule stages based on due dates, considering manual overrides.
- Create a new component for managing stage dates with a popover interface.
- Add database migration for new fields related to manual scheduling and schedule conflicts.
- Document the executive overview and producer guide for the HP CG Production Tracker.
- Added CalendarDayDetail component for displaying detailed event information for a selected day.
- Created CalendarEventPill component to represent individual events in a compact format.
- Introduced CalendarFilters component to filter events by project, stage type, and status.
- Developed CalendarGrid component to render the calendar layout and manage event interactions.
- Implemented CalendarView component to manage the overall calendar state and navigation.
- Added useCalendar hook to fetch calendar events based on specified filters.
- Created calendar-service to handle fetching events from the database with filtering capabilities.
- Updated data model to include necessary fields for calendar events and filters.
- Added system prompt and tools for AI assistant to manage calendar-related tasks.
- Implemented entity card extraction from tool results in the chat API.
- Added new EntityCard interface to define the structure of entity cards.
- Enhanced chat panel to display navigable entity cards for projects, deliverables, and users.
- Introduced status color helper for better visual representation of entity statuses.
- Updated chat message structure to include extracted entities.
- Improved chat formatting guidelines to avoid markdown tables and utilize bullet points.
- Added Tailwind Typography plugin for improved text styling in the application.
Each iteration of the tool-calling loop was appending the assistant's
tool_use blocks to conversationMessages but not the corresponding
tool_result blocks. On the next iteration, Claude saw orphaned tool_use
IDs without matching tool_results, causing a 400 error.
Now tool_result blocks are appended directly to conversationMessages
after each iteration, so the full conversation is always well-formed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ollama can't use tools so it was never useful as a chat fallback — it
just caused confusing "both providers unavailable" errors. The chat
now uses Claude exclusively with clear error messages on failure.
- Remove chatWithOllama(), checkOllamaHealth()
- Simplify chat() to call Claude directly
- Remove Ollama UI indicators and "Limited mode" warning
- Clean up provider types (remove "ollama" union member)
Note: Ollama is still used for embedding generation (nomic-embed-text)
via the embedding service — only the LLM chat fallback is removed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude's API requires every tool_use block to be followed by a matching
tool_result. Since tool interactions are fully resolved server-side within
a single request, the client should only send plain text in conversation
history — never structured content blocks that contain tool_use references.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace word-level text matching with pgvector cosine similarity search
for projects and deliverables. The search query is embedded via Ollama's
nomic-embed-text model and compared against stored 768-dim vectors, so
natural language queries like "manx beetroot mauve" match "[BPS] ManxR2 -
Beetroot Mauve" through semantic proximity.
- Primary: pgvector cosine similarity (projects + deliverables)
- Fallback: word-level text search when Ollama is unavailable
- Users: text search only (no embedding column on users table)
- Results filtered by relevance score > 0.3, sorted by similarity
- Stage details fetched for top deliverable matches
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add SSE streaming to chat API so users see real-time tool call progress
instead of waiting for the full response
- Enrich system prompt with full data model, pipeline stages, enums, and
domain knowledge so Claude makes fewer errors
- Implement word-level fuzzy search in search_entities — splits queries into
individual terms and scores results by match count, so "manx beetroot mauve"
finds "[BPS] ManxR2 - Beetroot Mauve"
- Add clickable entity suggestion chips when search returns multiple candidates,
eliminating the need to retype exact names
- Move page context from fake conversation turns into the system prompt param
- Preserve structured content blocks (tool_use/tool_result) in client-side
message history for proper multi-turn context
- Remove dryRun confirmation pattern — mutations execute directly
- Increase Claude API timeout from 30s to 60s and max tool iterations from 5 to 10
- Show Ollama fallback warning ("Limited mode — no tool access") in UI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add event bus for dispatching automation events with handlers.
- Create rule engine to evaluate events against defined triggers.
- Introduce chat provider to interface with Claude API and Ollama fallback.
- Define tool schemas for Claude-compatible operations.
- Implement tool executor to map tool calls to service layer functions.
- Develop automation service for CRUD operations on rules and event handling.
- Implemented Smart Search Panel component for enhanced project and deliverable search functionality.
- Introduced useSemanticSearch and useOllamaHealth hooks for managing search queries and AI availability.
- Developed embedding-service to generate and store vector embeddings for projects and deliverables.
- Created semantic-search-service to handle vector search, structural query detection, and LLM summarization.
- Added support for hybrid search combining structural filters and semantic queries.
- Integrated UI components for displaying search results and user interactions.
- Implemented `CapacityCell`, `CapacityDetailPopover`, and `CapacityGrid` components for displaying user workload and capacity.
- Created `UtilizationHeatmap` component to visualize team member utilization over weeks.
- Added hooks for managing skills (`useSkills`, `useCreateSkill`, `useDeleteSkill`, `useUserSkills`, `useSetUserSkill`, `useRemoveUserSkill`, `useStageSuggestions`) and workload (`useWorkload`, `useUpdateCapacity`).
- Developed services for skill management (`skill-service.ts`) and workload management (`workload-service.ts`) to interact with the database.
- Introduced logic for calculating user workload, including active assignments and capacity overload detection.
- Enhanced UI with tooltips and badges for better user experience.
- Updated CommandItem component to use rounded-lg for better aesthetics.
- Modified DialogOverlay and DialogContent to improve backdrop and border radius.
- Changed DropdownMenuItem, DropdownMenuCheckboxItem, and DropdownMenuRadioItem to use rounded-md for consistency.
- Enhanced SelectItem with rounded-md for a more modern look.
- Updated SheetOverlay to improve backdrop styling.
- Adjusted Toaster component border radius for a more refined appearance.
- Enhanced Table component with rounded-xl and shadow for better visual hierarchy.
- Added assignment display feature in DeliverableTable and KanbanBoard components, showing assigned users with badges.
- Updated deliverable service to include assignments in the data fetching process.
- Created a new seed script for tracker data to facilitate testing and development.
- Implement PPTXSchemaValidator for validating PowerPoint presentation XML files against XSD schemas.
- Create RedliningValidator to check tracked changes in Word documents, ensuring proper author tracking.
- Introduce recalc.py script to recalculate Excel formulas using LibreOffice, including error handling for Excel-specific errors.
- Add UI components for collapsible sections and tabs using Radix UI.
- Implement stage validation schema using Zod for managing project stages.
Dynamic imports for heavy components (Kanban, Gantt, CommandPalette),
skip-to-content link, ARIA landmarks/labels on sidebar, breadcrumbs,
topbar notifications, kanban board, gantt timeline, and pipeline
progress. Focus-visible ring styles for keyboard navigation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Deadline service checks deliverables and stages for approaching
(within 3 days) and overdue deadlines. API endpoint for fetching
deadlines and optionally generating notifications for producers.
Visual overdue indicators (red text + warning icon) on stage cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Export: multi-sheet styled workbook (Overview + Pipeline detail)
with color-coded status cells via ExcelJS.
Import: upload Excel with preview/validation step, then commit.
Supports Name, Priority, Due Date, Notes columns with flexible
column name matching. Import dialog on project detail page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dashboard service aggregates project/deliverable/stage stats.
KPI cards for active projects, deliverables, overdue count, and
pipeline completion rate. Recharts pie chart for status distribution,
stacked bar chart for stage completion by template type.
Overdue deliverables table and recent completions feed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>