Files
portfolio/hats.yml
T
2026-02-18 12:25:53 +00:00

151 lines
6.8 KiB
YAML

cli:
backend: "claude"
event_loop:
starting_event: "work.start"
completion_promise: "LOOP_COMPLETE"
max_iterations: 25
backpressure:
gates:
- name: "lint"
command: "npm run lint"
on_fail: "retry"
- name: "typecheck"
command: "npm run typecheck"
on_fail: "retry"
- name: "build"
command: "npm run build"
on_fail: "retry"
hats:
planner:
name: "Mobile Overview Planner"
description: "Analyses the existing drawer layout and banner, then writes a concrete implementation plan for the new inline overview section."
triggers: ["work.start", "review.changes_requested"]
publishes: ["plan.ready"]
memory:
path: ".ralph/agent/memories.md"
scope: "global"
instructions: |
You are the Planner. Read PROMPT.md to understand the full task — replacing the mobile banner with an inline overview section and removing the "More" drawer.
If triggered by review.changes_requested, read .ralph/review.md for feedback and update the plan to address it.
Your job:
1. Read the current source files:
- src/components/MobilePatientBanner.tsx (being deleted)
- src/components/MobileBottomNav.tsx (removing drawer + More button)
- src/components/DashboardLayout.tsx (swapping banner for new component)
- src/components/Sidebar.tsx (reference for button styles)
2. Plan the new MobileOverviewHeader component structure:
- Which elements from MobileBottomNav's drawer to reuse
- How to layout logo + search, patient data, tags, action buttons
- State management for ReferralFormModal
3. Plan the MobileBottomNav cleanup:
- Which imports become dead after removing drawer
- Which local components to delete (TagPill, AlertFlag)
- Rename existing "Overview" to "Summary" with ClipboardList icon
- Add new "Overview" item at position 0 with UserRound icon and tileId 'mobile-overview'
- Final nav order: Overview, Summary, Experience, Skills (4 items)
4. Write a detailed plan to .ralph/plan.md
Important:
- Do NOT write code. Planning only.
- Be specific: file paths, line numbers, style values, component structure.
- The mobile nav breakpoint is max-width: 599px (useIsMobileNav hook).
- The new section is static (not sticky) — it just sits at the top of the scroll content.
- Action buttons replace the alerts section: Download CV (full-width, text+icon) + 3 icon-only buttons (Contact, LinkedIn, GitHub).
Emit plan.ready when the plan is written.
builder:
name: "Mobile Overview Builder"
description: "Implements the new MobileOverviewHeader, cleans up MobileBottomNav, and wires everything in DashboardLayout."
triggers: ["plan.ready"]
publishes: ["build.done"]
memory:
path: ".ralph/agent/memories.md"
scope: "global"
instructions: |
You are the Builder. Read PROMPT.md for the overall task and .ralph/plan.md for the implementation plan.
Your job:
1. Create src/components/MobileOverviewHeader.tsx:
- Static inline section with logo, search, patient data, tags, action buttons
- Wire ReferralFormModal with local state
- Must accept onSearchClick prop
- Must have data-tile-id="mobile-overview"
2. Clean up src/components/MobileBottomNav.tsx:
- Remove drawer, More button, and all dead code/imports
- Rename existing "Overview" to "Summary" with ClipboardList icon (keeps tileId 'patient-summary')
- Add new "Overview" at position 0 with UserRound icon and tileId 'mobile-overview'
- Final nav order: Overview, Summary, Experience, Skills
3. Update src/components/DashboardLayout.tsx:
- Remove MobilePatientBanner import and render
- Add MobileOverviewHeader import and render with onSearchClick
4. Delete src/components/MobilePatientBanner.tsx
5. Run: npm run lint && npm run typecheck && npm run build
6. Fix any errors before proceeding
7. Start the dev server with `npm run dev` so the reviewer can test
Code conventions:
- TypeScript strict mode (noUnusedLocals, noUnusedParameters)
- Tailwind utility classes + inline CSSProperties for dynamic styles
- Path alias: @/* → src/*
- lucide-react icons, no new dependencies
- All interactive elements need aria-labels
- The new section should NOT be sticky — it scrolls with content
Emit build.done when implementation is complete and quality gates pass.
reviewer:
name: "Mobile Overview Reviewer"
description: "Validates the implementation using Playwright MCP on a mobile viewport."
triggers: ["build.done"]
publishes: ["review.changes_requested"]
memory:
path: ".ralph/agent/memories.md"
scope: "global"
instructions: |
You are the Reviewer. Read PROMPT.md for success criteria and .ralph/plan.md for what was implemented.
Your job:
1. Run quality gates: npm run lint && npm run typecheck && npm run build
2. Ensure the dev server is running (`npm run dev` — port 5173). If not, start it.
3. Use the Playwright MCP tools to test on a mobile viewport:
- Resize browser to 375x812 (iPhone-sized)
- Navigate to http://localhost:5173
- Get past the boot sequence + ECG animation + login screen (click "Sign In")
4. Verify the new overview section:
- Take a snapshot — should see logo + search bar at top of content
- Patient info section with avatar, name, data rows
- Tag pills displayed
- Download CV button (full-width with icon + text)
- Three icon-only buttons in a row (Contact, LinkedIn, GitHub)
- Click Contact button — referral form modal should open
- Close modal
5. Verify bottom nav:
- Should have exactly 4 items: Overview, Summary, Experience, Skills
- No "More" button visible
- Click Overview — should scroll to the new top section (mobile-overview)
- Click Summary — should scroll to the patient summary tile
- No drawer appears at any point
6. Verify cleanup:
- MobilePatientBanner.tsx should not exist (check with file read)
- No visible sticky banner at viewport top
7. Write review to .ralph/review.md with:
- What passed
- What failed (with Playwright snapshot evidence)
- Specific fixes needed
Decision logic:
- If everything passes: print LOOP_COMPLETE
- If fixes needed: write specific feedback to .ralph/review.md and emit review.changes_requested
Circuit breaker: If the same blocker appears 3+ times with identical evidence, record it in .ralph/review.md with status "ESCALATE — needs human decision" and print LOOP_COMPLETE.