Extends the system spec beyond the core pipeline to the 8 surfaces outside it: - X6 UI↔API contract + design rules (INV-UI1..6) - X7 Paperclip client & connection params (INV-INT4..8) - X8 field-population & extraction provenance (INV-FP1..5) - X9 MCP tool contract — 71 tools (INV-TOOL1..6) - X10 deploy/env/secrets (INV-ENV1..5) - ui-audit.md — page-by-page UI audit (13 pages) - 02-data-model: derived-entity invariants (INV-DM4..6) - X4-agents: tool-grant map + INV-AG3 - gap-audit: GAP-24..62 → FU-9..15; cycle-1 (FU-1..8b) marked done - constitution §7 + README index (X1..X10) Planning/spec artifacts only — no application code. All engineering invariants backed by ≥3 sources; every finding carries verified file:line. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7.8 KiB
7.8 KiB
UI-Audit — ביקורת דף-אחר-דף של ה-web-ui
מסמך זה הוא מפת-הממצאים של ה-frontend (web-ui), מקביל ל-gap-audit.md אך ברמת-הדף/הרכיב.
הוא תוצר סריקה word-for-word של 13 הדפים (5 cases-flow + 5 knowledge + 3 admin) + השכבה המשותפת.
כל ממצא נושא: invariant מופר (מ-X6/X8) · severity ·
file:line · תיקון. severity = הערכה הנדסית; priority = היו"ר.
איך הופק: סקירת 13 הדפים + src/lib/api/* + src/components/*, מאומת מול הקוד. התיקון מקובץ ל-FU-10.
דפים שנסרקו: dashboard, cases/new, cases/[caseNumber], cases/[caseNumber]/compose, archive · precedents, precedents/[id], training, methodology, missing-precedents · settings, skills, diagnostics. נווט מלא: כל 13 הדפים נגישים מ-app-shell.tsx — אין דף-יתום.
1. מוגדר-לא-נכון (Wrong Definitions)
| ID | כותרת | invariant | severity | file:line | תיקון |
|---|---|---|---|---|---|
| UI-A1 | PracticeArea מוגדר ב-3 מקומות עם ערכים שונים — lib/practice-area.ts:12 (appeals_committee/national_insurance/labor_law — שאריות מפרויקט אחר!), lib/api/precedent-library.ts:26 (rishuy_uvniya/...), ו-components/precedents/practice-area.ts |
UI1, G2 | CRITICAL | 3 קבצים | SSoT יחיד; הסרת שאריות national_insurance/labor_law |
| UI-A2 | key_quote חסר מטיפוס Precedent; גישה דרך as {key_quote?:string} |
UI1/UI2 | CRITICAL | precedents/[id]/page.tsx:178, precedent-edit-sheet.tsx:94 | הוספת key_quote לטיפוס/OpenAPI |
| UI-A3 | תווית לא-עקבית לאותו ערך: "פיצויים (197)" מול "פיצויים לפי ס' 197" | UI1 | High | precedents/[id]/page.tsx:26-35 מול practice-area.ts | תווית מ-SSoT יחיד |
| UI-A4 | enum נצרך לא-נגזר-מטיפוס (zod ידחה subtype חדש) | UI1 | High | schemas/case.ts:78-86 | zod נגזר מ-PracticeArea/AppealSubtype |
| UI-A5 | expectedOutcomes/set_outcome — אוצר-מילים לא-תואם בק (rejected/accepted/partial מול rejection/.../betterment_levy) |
UI1, G2 | High | schemas/case.ts:35-41; בק block_writer.py:442/lessons.py:11 |
SSoT יחיד ל-enum-תוצאה |
2. כפילות (Duplication)
| ID | כותרת | invariant | severity | file:line | תיקון |
|---|---|---|---|---|---|
| UI-B1 | CaseStatus + STATUS_LABELS + STATUS_TONE ב-3 מקומות |
UI1, G2 | CRITICAL | cases.ts:16-33, status-badge.tsx:11-29,77-95, status-changer.tsx:18-24 | enum+labels+tones מ-SSoT, ייבוא |
| UI-B2 | STATUS_LABELS של מסמכים משוכפל (ולא-שלם) |
UI1 | High | upload-sheet.tsx:39-46, documents-panel.tsx:39-46 | ל-lib/doc-types.ts |
| UI-B3 | פירמוט-תאריך משוכפל ×5 | UI/§6 | Medium | archive.tsx, case-header.tsx, documents-panel.tsx (+2) | lib/format.ts משותף |
| UI-B4 | תוויות practice-area/source-type משוכפלות | UI1 | High | precedents/[id]/page.tsx:26-35 | ייבוא מ-practice-area.ts |
| UI-B5 | boilerplate העלאת-קבצים (FormData+fetch) ×4 | §6/G2 | Medium | documents.ts, training.ts, exports.ts, missing-precedents.ts | uploadMultipart<T>() ב-client.ts |
| UI-B6 | כרטיס-שגיאה משוכפל ×3 | UI4 | Medium | detail/library/missing pages | <ErrorCard> משותף |
3. מיותר / מת (Redundancy / Dead)
| ID | כותרת | invariant | severity | file:line | תיקון |
|---|---|---|---|---|---|
| UI-C1 | 3 דפי-פסיקה חופפים (/precedents, /training, /missing-precedents) — גבולות מטושטשים | G2 | Medium | 3 דפים | הגדרת אחריות; שקילת איחוד |
| UI-C2 | כפתור "חלץ מטא-דאטה" שלא מרענן, מפנה ל-CLI ידני | UI5/FP5 | Medium | precedent-edit-sheet.tsx:130 | auto-refresh/poll על תור-החילוץ |
| UI-C3 | useCase refetch כל 5ש' גם במנוחה/בעריכה |
UI5 | Low | cases.ts:150-152 | interval מותנה-סטטוס |
| UI-C4 | magic-numbers (intervals) מפוזרים ב-18 מודולים | UI5/§6 | Low | כל lib/api/* |
lib/api/query-config.ts |
4. אי-עקביות + הפרת-כללים (Inconsistency / Rule-Violations)
| ID | כותרת | invariant | severity | file:line | תיקון |
|---|---|---|---|---|---|
| UI-D1 | ~60% endpoints unknown → טיפוסים ידניים-סוטים |
UI1/UI2 | CRITICAL | cases.ts:1-9 (מתועד מפורשות) + בק | Pydantic models + api:types |
| UI-D2 | שדות-Opus מוצגים ללא חיווי "חולץ-אוטומטית"; היו"ר לא יודע מה לאמת | UI6/FP1 | High | precedents/[id]/page.tsx:160-185 | badge "מולא-ע"י-Opus" |
| UI-D3 | אין חיווי searchable; הלכות pending_review לא מובלטות בדף-הפרט |
UI6/FP3 | High | precedents/[id]/page.tsx | חיווי searchable + אזהרת-pending |
| UI-D4 | fallback SSE מסתיר כישלון כ-"completed"; TTL 5ש'↔300ש' | UI4/UI5 | Medium | documents.ts:226-232 | terminal-state מפורש |
| UI-D5 | query-keys לא-עקביים (חלק .all, חלק לא; חלק exported, חלק לא) |
§6 | Low | agents.ts, feedback.ts (+) | convention אחיד |
| UI-D6 | URLs קשיחים (PAPERCLIP_BASE, coolify, frontend) |
UI3/ENV3 | Low | app-shell.tsx:70 | env (ראה X10) |
5. סיכום ל-FU-10
- SSoT ל-enums/תוויות/tones (UI-A1..A5, UI-B1/B2/B4) — תיקון-השורש של רוב הממצאים.
- Pydantic models + OpenAPI=SSoT (UI-D1) — מבטל את הטיפוסים-הידניים.
- helpers משותפים (UI-B3/B5/B6, UI-C4) — תאריך, upload, error-card, query-config.
- שקיפות-מקור-מילוי (UI-D2/D3) — נגזר מ-X8/X6 INV-UI6.
- ניקוי redundancy (UI-C1..C3).
6. הפניות-אחיות
- X6-ui-api-contract.md — ה-invariants (UI1–UI6) שממצאים אלו מפרים.
- X8-field-provenance.md — מקור-מילוי (בסיס ל-UI-D2/D3).
- gap-audit.md — GAP-30..34 (התקבילים ברמת-הארכיטקטורה) + FU-10.
- 00-constitution.md — G2, G4, G9.