## Your Task 1. Read the full app PRD at `prd-main.md` (in the same directory as this file) 2. Read the PRD at `prd.json` (in the same directory as this file) 3. Read the progress log at `progress.txt` (check Codebase Patterns section first) 4. **DO YOUR JOB** 5. Update the PRD to set `passes: true` for the completed story 6. Append your progress to `progress.txt` ## Progress Report Format APPEND to progress.txt (never replace, always append): ``` ## [Date/Time] - [Story ID] - What was implemented - Files changed - **Learnings for future iterations:** - Patterns discovered (e.g., "this codebase uses X for Y") - Gotchas encountered (e.g., "don't forget to update Z when changing W") - Useful context (e.g., "the evaluation panel is in component X") --- ``` ## USER REQUEST { "id": "US-017", "title": "Fluid Curtain pull-down animation", "description": "As a user, I want to pull down from the top of any view to slide the app panel off-screen and reveal the AI chat layer beneath.", "acceptanceCriteria": [ "framer-motion useMotionValue + useSpring (stiffness: 300, damping: 30) controls a 'y' CSS transform on the main app panel wrapper", "Trigger 1: wheel event listener at document level — when the current route's scroll position is at 0 and deltaY < 0 (overscroll up), animate panel y from 0 to viewport height", "Trigger 2: Cmd/Ctrl+K keyboard shortcut toggles curtain open (y = viewport height) and closed (y = 0)", "AI chat view is rendered as a fixed full-screen layer behind the sliding panel and becomes fully visible when panel slides down", "App panel remains mounted during animation (no unmount/remount, no state loss)", "Returning from chat: wheel event with deltaY > 0 at chat-bottom OR Cmd/Ctrl+K slides panel back to y = 0", "Right-edge vertical 'keep scrolling for AI' label with chevron-down is visible in every section (non-interactive, visual hint only)", "Typecheck passes", "Verify in browser using dev-browser skill" ], "priority": 17, "passes": false, "notes": "" }