fix(web-ui): תצוגת זמנים אנושית דטרמיניסטית ב-Asia/Jerusalem (אחסון נשאר UTC) — INV-UI9 (#210) #367
Reference in New Issue
Block a user
Delete Branch "worktree-agent-a441570a4556d14e5"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
מה ולמה
כל חותמת-זמן אנושית ב-web-ui מוצגת כעת דטרמיניסטית ב-Asia/Jerusalem. האחסון נשאר UTC (Postgres
TIMESTAMPTZ, ה-API מחזיר ISO-UTC) — תוקנה שכבת-התצוגה בלבד. עד כה הפירמוט היה ad-hoc (toLocaleDateString("he-IL"),date-fns-lessnew Date(...).get*(),toISOString().slice(0,10)), שתלוי ב-tz של ה-runtime → מציג UTC תחת SSR (הקונטיינר ב-UTC) או בכל runtime לא-ישראלי. נעיצתAsia/Jerusalem(Intl) מבטיחה ש-SSR והדפדפן מסכימים.אין שינוי layout/עיצוב/IA — רק ה-tz. צורת התאריך/שעה הנראית נשמרה זהה. ⇒ שער Claude Design לא חל (תיקון-נכונות-תצוגה, לא שינוי-UI).
TaskMaster
legal-ai#210.מה נעשה
web-ui/src/lib/format-date.ts(G2):formatDate(dd/MM/yyyy) ·formatDateShort·formatDateLong(month long) ·formatDateTime·formatDateTimeFull·formatTime(HH:mm) ·formatIsoDate(YYYY-MM-DD) ·formatRelative("לפני…" ב-3 וריאנטי-ניסוח: long/short/tight) · עוזרי-IsraelgetIsraelYear/israelDayKey/israelMidnightMs/todayIsraelMidnightMs/israelParts. כולם נעוציםtimeZone: "Asia/Jerusalem", localehe-IL.n.toLocaleString) הושאר ללא נגיעה (אינו חותמת-זמן).<input type="datetime-local">(בקרת-burst ב-/operations,toLocalInput/nextSaturday18) הוא ערך ניתן-לכתיבה ע"י המפעיל, לא תצוגת-מאוחסן — נשאר בנייה מקומית (מחוץ לתחום "שכבת-תצוגה בלבד").docs/spec/X6-ui-api-contract.md— אחסון UTC, תצוגה ב-Asia/Jerusalem; ומקור-אמת-יחיד למפרמט-תאריך בכללי-העיצוב.אודיט-נלווה — TZ של הקונטיינר (לא יושם; לבדיקת המפעיל)
האם הגדרת
TZ=Asia/Jerusalemבקונטיינר בטוחה? כמעט-לחלוטין — עם תיקון-קדם אחד:mcp-server/src/legal_mcp/services/audit.py:41—datetime.utcnow()— naive, נכתב ל-TIMESTAMPTZבלי session-tz נעוץ → תחת flip ל-Asia/Jerusalem הערך (wall-clock=UTC) ייקרא כ-Israel-local ויאוחסן 3 שעות שגוי. לתקן ל-datetime.now(timezone.utc)לפני flip.date.today()(drafting / party_claims_summary / block_writer — חותמת-תאריך מודפסת על ההחלטה;court_fetch_supreme.py:91— שנת-cutoff): flip מזיז יום רק בגבול-חצות, ו-Israel-local הוא דווקא הרצוי לוועדת-ירושלים → לא מסכן.datetime.now().isoformat()(research_md.py:357) ו-datetime.fromtimestamp(st_mtime)(research_md.py:194): שדה-תשובה/תצוגה בלבד, לא נשמר ולא מושווה → קוסמטי.web/כבר tz-aware (datetime.now(timezone.utc)/ZoneInfo("Asia/Jerusalem")).Invariants — הצהרה
צ'קליסט — פרוטוקול כתיבת-קוד
docs/spec/00-constitution.md(G2) +X6-ui-api-contract.md+web-ui/AGENTS.mdלפני הכתיבה—/"") על ערך חסר/לא-תקין, כפי שהיהgap-audit.md— לא נגעתי ב-FU/GAP ממופהtsc --noEmitנקי; eslint על הקבצים — רק warnings קיימים-מראש (TanStack Table memoization)אימות
npx tsc --noEmit— נקי (0 שגיאות).2026-06-30T22:30:00ZתחתTZ=UTCותחתTZ=America/New_York— פלט זהה ושל Israel:formatTime → 01:30,formatDate → 01.07.2026,formatIsoDate → 2026-07-01(ולא 22:30/30.06 של UTC).israelMidnightMsממפה את כל הרגעים של יום-ישראלי לאותו midnight-ms, וימים עוקבים נבדלים ב-86400000ms בדיוק (השוואות-הדיון שלcases-tableנשמרות).🤖 Generated with Claude Code