Commit graph

260 commits

Author SHA1 Message Date
d4841a7eb5 docs(07): create phase 7 engagement overview plans 2026-05-03 22:38:21 -04:00
71b20612b2 docs(07): UI design contract 2026-05-03 22:27:13 -04:00
8b6e8b27b1 docs(07): UI design contract for Engagement Overview 2026-05-03 22:22:41 -04:00
192eeb5bb6 docs(state): record phase 7 context session 2026-05-03 22:18:33 -04:00
c85e6347c7 docs(07): capture phase context (auto mode) 2026-05-03 22:18:28 -04:00
97a54fd8d8 docs(phase-06): evolve PROJECT.md after phase completion 2026-05-03 21:44:49 -04:00
2f56d7c808 docs(phase-06): complete phase execution 2026-05-03 21:44:21 -04:00
d26ddc1fae test(06): persist human verification items as UAT 2026-05-03 21:44:13 -04:00
cddf9cac8c docs(06-03): complete mobile analyzer detail page plan summary
- Documents title/company omission from identity block (D-25/D-36 conflict resolution)
- Documents IDOR posture T-06P03-02 as accept-and-flag with STATE.md follow-up recommendation
- Confirms no desktop files touched, TypeScript clean
2026-05-03 21:37:50 -04:00
aa4ff00065 feat(06-03): add mobile analyzer detail page /mobile/analyzer/[id]
- Real segment route reading GET /api/analyzer/analyses/[id] (D-25, reused as-is)
- Three content sections: Summary / Next Step / Next Step Rationale (D-21, ANL-03)
- Identity block: ticket# badge, completed-at relative time, stage pips, confidence badge, Review pill
- Header: back chevron (router.back()) + breadcrumb 'Analyzer / #{ticketNumber}' + external link (D-19)
- Footer: 'View full analysis' link to /analyzer/analysis/[id] with ExternalLink icon, min-h-[44px] (D-22, ANL-04)
- Read-only enforcement: zero form/edit/re-run/cancel controls (D-23, ANL-05)
- Loading skeleton, 404 state, error state with toast (D-28)
- Title/company omitted from identity block per D-25/D-36 (PersistedAnalysis lacks those fields)
2026-05-03 21:36:49 -04:00
86369bd6ab docs(06-02): complete analyzer feed UI components + page plan summary 2026-05-03 21:32:50 -04:00
c8aa69baf6 feat(06-02): replace analyzer placeholder with real feed list page
- Replaces 'coming soon' placeholder with full read-only feed
- useState/useEffect/fetch only (no SWR/react-query per CLAUDE.md D-38)
- IntersectionObserver sentinel with rootMargin 200px for auto-load
- Load more fallback button with aria-label, min-h-[44px] touch target
- 5 AnalyzerRowSkeleton instances on initial load (D-28)
- Empty state with dashed border, Sparkles icon, Open desktop Analyzer link
- toast.error on load failures; Load more flips to Retry on error
- No edit/re-run/prompt-tuning controls (ANL-05)
2026-05-03 21:31:21 -04:00
9c1a74009b feat(06-02): add AnalyzerStagePips, ConfidenceBadge, AnalyzerRowSkeleton, AnalyzerFeedRow components
- AnalyzerStagePips: 3-dot stage indicator with caret separators, sr-only accessibility label
- ConfidenceBadge: High/Medium/Low buckets (0.85/0.65) with green/amber/slate tones, dark mode
- AnalyzerRowSkeleton: Card-wrapped skeleton matching row shape (no border-l-4 per D-11)
- AnalyzerFeedRow: Full card row with header/title/summary/footer, Link to /mobile/analyzer/[id]
2026-05-03 21:30:17 -04:00
fe4fedace0 docs(06-01): complete analyzer feed API plan summary
- Document exported types, SQL approach, kiosk scoping, cursor encoding
- Include notes for Plan 06-02 executors (import path, sample URL)
- Self-check passed: file exists, commit 75238c1 verified, tsc exits 0
2026-05-03 21:25:49 -04:00
75238c12bb feat(06-01): add GET /api/mobile/analyzer/feed endpoint
- Create cursor-paginated analyzer feed endpoint for mobile
- Export AnalyzerFeedRow and AnalyzerFeedResponse types (D-26)
- Implement DISTINCT ON CTE for latest-per-ticket analysis (D-02)
- Apply kiosk_settings company scoping via getMobileCompanyFilter() (D-04)
- Cursor keyset pagination on (completed_at, id) with base64 JSON encoding (D-06)
- Server-side limit cap at 25 (D-05); LIMIT n+1 trick for hasMore detection
- Ordering: completed_at DESC NULLS LAST, id DESC (D-03)
- Manual snake_case to camelCase transform per CLAUDE.md conventions
- Payload whitelist: only 12 AnalyzerFeedRow fields; no model_traces, itglue_docs_referenced, or human_review_reasons (T-06-05)
- requireAuth() gate before any DB query (T-06-01)
2026-05-03 21:25:01 -04:00
010aadcc81 docs(06): create phase plans (3 plans, 3 waves) 2026-05-03 21:22:01 -04:00
9119846ea7 docs(06): UI design contract 2026-05-03 21:07:09 -04:00
4b2e030ca3 docs(06): UI design contract 2026-05-03 21:04:58 -04:00
a44f28d71b docs(state): record phase 6 context session 2026-05-03 21:01:10 -04:00
d6c15e0d21 docs(06): capture phase context (auto mode) 2026-05-03 21:01:06 -04:00
1979463d05 docs(phase-5): evolve PROJECT.md after phase completion 2026-05-03 20:29:11 -04:00
62668ce8df docs(phase-5): complete phase execution 2026-05-03 20:28:51 -04:00
a7759e3029 test(05): persist human verification items as UAT 2026-05-03 20:02:36 -04:00
3b582ace53 docs(05-02): complete finance page restyle plan summary
- Finance page rewritten to Phase 5 visual contract (FIN-01, FIN-02)
- 4 KpiCardMobile tiles, 2 shadcn Collapsibles, stacked revenue list
- All 23 locked decisions (D-01 through D-23) delivered
- Phase 5 complete: both plans committed and summarized
2026-05-03 19:58:15 -04:00
a9a5a987f4 feat(05-02): rewrite mobile finance page to Phase 5 visual contract
- Replace AR Hero gradient + standalone Revenue YTD with 4 KpiCardMobile tiles (2x2 grid)
- Drop bar chart; add monthly-revenue stacked list (D-09 / DASH-04 precedent)
- Add shadcn Collapsible for Open Invoices and Recent Payments (D-15, D-16)
- Aging row uses locked amber/orange/destructive palette (D-08)
- Top AR by Customer rendered as stacked list with proportion bars (D-07)
- toast.success + toast.error on sync outcomes (D-17, D-18)
- FinanceSkeleton on initial load; destructive retry card on error (D-17, D-18)
- D-19 empty state when total_ar===0 and open_invoices.length===0
- D-23: no page H1; header controls row with aria-labels (D-14)
- No font-medium, no font-bold, no raw red/yellow/green Tailwind classes
2026-05-03 19:56:36 -04:00
1ce80371d1 docs(05-01): complete FinanceRow + FinanceSkeleton plan
- FinanceRow: 2-line stacked row with amountTone variants (D-06)
- FinanceSkeleton: initial-load placeholder matching full page layout (D-17)
- Both components type-check clean, no files outside components/mobile/ modified
2026-05-03 19:53:14 -04:00
5f7fc29e67 feat(05-01): create FinanceSkeleton component
- Initial-load placeholder for /mobile/finance (D-17)
- 2x2 KPI grid (h-20) + 3-cell aging row (h-16) + 2x list-row blocks (3 rows each)
- Uses Skeleton primitive from components/ui/skeleton
- Locked spacing tokens: px-4 py-4, space-y-6, gap-3, gap-2, space-y-3
- No props, no Card wrapper, no custom animation per UI-SPEC
2026-05-03 19:52:25 -04:00
180ab517e6 feat(05-01): create FinanceRow component
- 2-line stacked row for invoice and payment lists (D-06)
- Exports FinanceRow + FinanceRowProps per UI-SPEC contract
- Supports amountTone destructive/positive/default variants
- No priority stripe, no interactive handlers (read-only per D-22)
- Phase comment block per Phase 3/4 convention
2026-05-03 19:52:02 -04:00
a0ccd14044 docs(05): create phase plan 2026-05-03 19:48:15 -04:00
6a4a55cb9c docs(05): UI design contract 2026-05-03 19:41:38 -04:00
91987ccaa1 docs(05): UI design contract for finance restyle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 19:32:54 -04:00
cdfa527ebd docs(05): capture phase context 2026-05-03 19:29:54 -04:00
322900dafe docs(phase-4): evolve PROJECT.md after phase completion 2026-05-03 19:28:03 -04:00
5206d8d2ef docs(phase-4): complete phase execution 2026-05-03 19:27:45 -04:00
5b6a8ff5d5 test(04): persist human verification items as UAT 2026-05-03 18:17:18 -04:00
5d87455e49 feat(04-02): rewrite mobile tickets list page with URL-synced filters, priority stripes, and IntersectionObserver infinite scroll
Cherry-picked from 04-02 worktree (b27db7d, 4ba89a0). The full worktree merge
included unrelated regressions of phase 2/3 work — only the intended changes
(app/mobile/tickets/page.tsx + SUMMARY.md) were kept.

- Suspense wrapper for useSearchParams (Next.js 16 requirement)
- URL-synced filter state via router.replace
- TicketFilterStrip wired with controlled props
- Priority-stripe rows (border-l-4 with red/orange/amber/slate)
- IntersectionObserver infinite scroll + Load more fallback
- toast.error() in load catch blocks per D-21
- Empty states per D-20
2026-05-03 18:12:00 -04:00
422ea2bd0e chore: merge executor worktree (04-03) 2026-05-03 18:04:35 -04:00
bbcb04fe3b docs(04-01): complete cursor-pagination API and filter components plan summary 2026-05-03 18:03:14 -04:00
9e10d654ad feat(04-01): add TicketRowSkeleton and TicketFilterStrip presentational components
TicketRowSkeleton (D-21):
- border-l-4 border-muted stripe + 3 Skeleton lines matching ticket row layout
- 5 instances rendered during initial load

TicketFilterStrip (D-01 through D-04):
- Sticky top-0 container with always-visible search input
- Collapsible panel with status chips (Open/In Progress/Waiting), priority chips
  (Critical/High/Medium/Low), queue Select, and mine Switch
- Controlled component — URL sync is parent's responsibility (D-05)
- Active filter count badge in Filters button
- Clear all button appears only when isFiltered (D-04)
- Exports TicketFilterValue and QueueOption interfaces for Plan 02 import
2026-05-03 18:02:13 -04:00
9658640c04 fix(04-01): restore phase 2/3 work lost by worktree soft-reset
The soft reset to 77073ba inadvertently staged deletions of all phase 2
and 3 artifacts. This commit restores them from their source commits so
subsequent task commits build on the complete prior-phase foundation:
- components/mobile/{BottomNav,HeaderBar,KpiCardMobile,MoreDrawer,NeedsAttentionStrip,WorkerStatusRow}
- app/mobile/layout.tsx, dashboard/page.tsx, analyzer/page.tsx
- app/api/mobile/dashboard/route.ts
- All .planning/** files from phases 01-04
- CLAUDE.md, app/layout.tsx, app/styles/brand.css, public/manifest.json
2026-05-03 18:01:14 -04:00
6268d1fe37 feat(04-01): rewrite /api/mobile/tickets with cursor pagination and exported interfaces
- Replace page/offset pagination with opaque base64 cursor (last_activity_date, id)
- Export MobileTicket and MobileTicketListResponse interfaces for Plan 02 import
- Add requireAuth() gate (T-04-03: legacy route lacked auth)
- Server-side limit cap at 25 rows (D-11, T-04-04)
- Default status filter [1,8,7] when no status param supplied (matches legacy t.status != 5)
- Preserve getMobileCompanyFilter() helper verbatim
- Support status/priority arrays, queue, mine, and search filters
- Cursor seek predicate: (last_activity_date, id) < (cursor) for stable keyset order
2026-05-03 17:59:54 -04:00
2ce26da290 docs(04-03): complete detail header reskin plan summary 2026-05-03 17:59:34 -04:00
b1ff8660d4 feat(04-03): reskin /mobile/tickets/[id] in-page header per D-18
- Add ExternalLink to lucide-react imports
- Replace legacy 'Back' button with three-slot header bar:
  back chevron + 'Tickets' label (router.back()), breadcrumb
  'Tickets / #{ticket_number}', ExternalLink icon to /analyzer/ticket/{id}
- rel='noopener noreferrer' + target='_blank' on external link (T-04-11)
- Detail body (badges, title, stats grid, description, timeline) unchanged per D-19
2026-05-03 17:58:51 -04:00
77073bac97 docs(04): create phase plan 2026-05-03 17:53:50 -04:00
bf780790d5 docs(04): UI design contract 2026-05-03 17:45:42 -04:00
16bc4aa5c9 docs(04): UI design contract for tickets-restyle phase
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 17:40:16 -04:00
83f326c3d1 docs(state): record phase 4 context session 2026-05-03 17:37:10 -04:00
28b5845ee8 docs(04): capture phase context 2026-05-03 17:37:05 -04:00
05a3d44045 docs(phase-3): evolve PROJECT.md after phase completion 2026-05-03 17:09:34 -04:00
7374b94db5 docs(phase-3): complete phase execution 2026-05-03 17:09:13 -04:00