אתר או SaaS בישראל צריך הרבה יותר ממדיניות פרטיות שהועתקה: באנר עוגיות שהסירוב בו באמת עובד, הסכמה לדיוור עם תיעוד, מחיקת חשבון וייצוא נתונים, הצהרת נגישות, ורשימת ספקי משנה. ה-Skill מלמד את Claude לבנות ולבדוק את כל אלה מול מה שהקוד עושה באמת, ומגיע עם דוגמאות קוד מלאות. זהו Skill ל-Claude: תיקייה עם קובץ SKILL.md, שנטענת אוטומטית כשהמשימה מתאימה לתיאור שבראש הקובץ. בניגוד לפרומפט שמדביקים בכל פעם מחדש, Skill מותקן פעם אחת וממשיך לעבוד לבד.
עסק ישראלי · פרטיות · תיקון 13 · 30א · נגישות · עוגיות
---
name: israeli-legal-pack
description: "Full legal layer for an Israeli website or SaaS: privacy policy under Amendment 13, terms, a real cookie banner, marketing consent with proof under section 30A, unsubscribe, data retention and export, accessibility statement and sub-processors. Use when launching or auditing an Israeli site, or when the user asks about privacy, terms, cookies, newsletter consent or accessibility."
---
# החבילה המשפטית, אתר ו-SaaS בישראל
נבנה ונבדק בפרויקט אמיתי (<DOMAIN>) בספטמבר 2026. הקוד ב-`reference/` הוא
הגרסה שעלתה לאוויר, אחרי ניקוי פרטים מזהים (מצייני מקום בסוגריים משולשים).
**לא ייעוץ משפטי.** זה מה שיושם מול החוק כפי שהובן, ולפני השקה כדאי שעורך
דין יקרא את המסמכים.
לביטולים, החזרים וגבייה יש סקיל נפרד: `israeli-cancellation-refunds`.
לאבטחת קלט ופלט: `input-output-security`.
## העיקרון שמעל הכול
**מסמך משפטי שסותר את מה שהמערכת עושה גרוע ממסמך חסר.** בסקירת המוכנות
לעלייה של הפרויקט נמצאו חמש סתירות כאלה, וכולן נכתבו בתום לב:
| מה נכתב | מה היה בפועל |
|---|---|
| "דיוור אך ורק למי שסימן תיבה לא מסומנת" | הסכמה הפכה לתנאי כניסה |
| "רוב הכלים אינם דורשים חשבון" | כל כלי דרש חשבון, ומדיניות הפרטיות אמרה את הנכון |
| "החיוב חד פעמי לכל תקופה" | החודשי היה הוראת קבע |
| "נשלח תזכורת לפני שהתוקף נגמר" | שום מנגנון כזה לא נבנה |
| טופס הרשמה: "לא חובה" | רגע אחרי ההתחברות: חובה |
לכן כל טענה במסמך נגזרת מקבוע בקוד, ויש בדיקה שמשווה ביניהם (ראו "בדיקות").
## המבנה
| נתיב | תוכן | קוד |
|---|---|---|
| `/legal` | מרכז: שורה לכל מסמך, כפתור העדפות פרטיות | `pages/Legal.tsx` |
| `/privacy` | מדיניות פרטיות | `pages/Privacy.tsx` |
| `/terms` | תנאי שימוש | `pages/Terms.tsx` |
| `/refunds` | ביטול והחזרים | בסקיל הביטולים |
| `/subprocessors` | רשימת ספקי המשנה בשמם | `pages/SubProcessors.tsx` |
| `/accessibility` | הצהרת נגישות | `pages/Accessibility.tsx` |
| `/unsubscribe` | הסרה בלי התחברות, לפי טוקן | `pages/Unsubscribe.tsx` |
כולם דרך `components/LegalPage.tsx` (כותרת, תאריך עדכון, סעיפים), וכולם
**בקישור קבוע בפוטר**. לרינדור מקדים (SEO) להוסיף אותם לרשימת העמודים הסטטיים.
### זהות העסק במקום אחד
`components/business.ts`: שם משפטי, ח.פ. או עוסק (עם התווית הנכונה לכל
אחד), כתובת, אימייל, טלפון, רכז נגישות. **שדה ריק לא מוצג.** מציין מקום כמו
"[למילוי]" בהצהרת נגישות גרוע מהיעדר שורה, כי הוא מעיד שההצהרה לא נבדקה.
**שמות ספקים (מודלי AI, סליקה, מייל) מופיעים רק במסמכי החוק**, בעמוד ספקי
המשנה. בקופי של מוצר הם מסגירים את הסטאק.
## פרטיות (חוק הגנת הפרטיות ותיקון 13)
סעיפים חובה במדיניות: מי אנחנו, מה נאסף ולמה (עם בסיס לכל מטרה), מה **לא**
נאסף, עוגיות ומדידה, מי רואה את הנתונים, ספקי משנה, שמירה, הזכויות, יצירת קשר.
**מה שחייב להיות אמיתי, כי זה מה שנבדק:**
1. **שמירה.** אם כתוב "90 יום", צריך קרון שמוחק באמת. בהפרויקט הפונקציה היתה
קיימת ואף אחד לא קרא לה. `sql/02_retention_and_erasure.sql` (`pg_cron`).
2. **מחיקה.** מחיקת חשבון מוחקת גם את נתוני המדידה המקושרים (`purge_subject`
מטריגר על `auth.users`), ולא רק את הפרופיל.
3. **עיון.** כפתור "הורדת כל הנתונים שלי" (`export_my_data`, לפי `auth.uid()`).
4. **זהות במדידה.** "מישהו פתח את הכלי" מרמז על אנונימיות. אם נשמר מזהה
חשבון, לכתוב את זה במפורש, ומה **לא** נשמר (תוכן, קבצים).
5. **מי רואה.** "צוות האתר בלבד, דרך מסך ניהול שדורש הרשאת מנהל ונבדק בשרת."
## דיוור (חוק התקשורת, סעיף 30א)
פיצוי ללא הוכחת נזק של עד 1,000 ש"ח **לכל הודעה**. זו החשיפה הכספית הגדולה
ביותר באתר קטן.
**כל מייל שיווקי:** המילה "פרסומת" בתחילת הכותרת, שם החברה המשפטי וכתובתה,
קישור הסרה **וגם** כתובת מייל להסרה. מייל שירות (אישור חשבון, מסמך עסקה, אישור
ביטול) **לא** מסומן פרסומת, ולכן **אסור שיכיל שיווק**, אחרת ההיתר נעלם.
`functions/broadcast/index.ts` (`subjectFor`, תחתית המייל).
**תיעוד הסכמה:** `marketing_consent`, `consent_at`, `consent_source`,
`unsubscribed_at`. חותמת הזמן נקבעת בשרת ואינה ניתנת לעריכה מהדפדפן.
**המקור נרשם גם בסירוב**, לא רק באישור. "סירב בשער" מול "כיבה בעמוד החשבון"
הם שני סיפורים שונים בתלונה. `sql/03_record_refusal_source.sql`.
**במסך ניהול המשתמשים:** עמודה עם ✓/✗, תאריך, שעה ומקום, ו"לא נשאל" למי שלא
נשאל. `sql/04_admin_consent_column_and_usage.sql`.
### כניסה עם גוגל מדלגת על תיבת הסימון
בהפרויקט אף אחד מהמשתמשים הראשונים לא נשאל, כי התיבה ישבה בטופס המייל בלבד. **חלון שאלה אחרי התחברות** (`components/ConsentGate.tsx`) סוגר את זה.
שני מודלים, וההחלטה של בעל העסק:
| מודל | איך | סיכון |
|---|---|---|
| **חובה לענות** (מומלץ) | שתי תשובות שוות במשקל, "לא תודה" ממשיך לשירות | נמוך. ההסכמה חופשית |
| **חובה להסכים** | מי שמסרב מנותק | הסכמה שמותנית בשירות עלולה להיחשב לא חופשית, ואז הרישום לא מגן |
אם נבחר "חובה להסכים", שלוש הגנות חובה: **הסירוב נרשם לפני הניתוק**; **מנוי
בתשלום שמסרב רואה את דרך ההחזר**; **תקלת רשת לא מציגה את השער** (נזק ודאי מול
סיכון משוער). ואז גם: התנאי כתוב בתקנון ובמדיניות, טופס ההרשמה לא אומר "לא
חובה", ועמוד ההסרה אומר שההסרה מסיימת את הגישה.
**חלון חוסם חייב `max-h-[92vh] overflow-y-auto`.** בטלפון שוכב הכפתורים שלו
נחתכים מתחת למסך, והמשתמש נעול בחוץ בלי דרך לענות.
## עוגיות
באנר עם **שני כפתורים שווים**, אישור ודחייה, ו"מה נמדד". בלי הסכמה, מזהה
המשתמש שנשלח למדידה ריק: המונים המצטברים ממשיכים לעבוד, והזהות לא נשמרת.
**כפתור "העדפות פרטיות" בפוטר** שפותח את הבאנר מחדש, אחרת אין דרך לחזור מהסכמה.
`components/CookieBanner.tsx`, `components/consent.ts`.
## נגישות (תקנות נגישות לשירות, ת"י 5568 / WCAG 2.1 AA)
תביעות נגישות הן התביעה הנפוצה ביותר נגד אתרים קטנים בישראל, והן מתחילות
בסורק אוטומטי. **הצהרת נגישות** עם רכז, דרך פנייה, מה בוצע ומה לא, ו**הסתייגות
מפורשת שאין עמידה מלאה ומאושרת** אם אין כזו.
**סריקה:** `scripts/site-audit.browser.js`. מדביקים בקונסול ומריצים:
```js
const r = await siteAudit(['/', '/pricing', '/terms', /* ...כל העמודים והכלים */])
summarizeAudit(r)
```
בודק axe (WCAG 2.1 AA), גלישה לרוחב, שדות מתחת ל-16px, וכפתורים צפים חופפים.
להריץ בגודל 375 **וגם** 320. בקבוצות של כ-30 עמודים (מגבלת זמן של כלי JS).
**מה נמצא בהפרויקט, לפי סדר שכיחות:**
1. **`text-slate-400` על לבן: 2.63:1** מול 4.5 נדרש. 259 רכיבים ב-50 כלים.
לתקן ל-`slate-500` **רק היכן שנמדד רקע בהיר בזמן ריצה**. על רקע כהה slate-400
הוא הנכון, ו-slate-500 שם נכשל.
2. `slate-500` על רקע בגוון בהיר (טאבים לא נבחרים, תגיות): 4.26-4.45 → `slate-600`.
3. טקסט מצב ריק ב-`slate-300`: **1.48:1**.
4. **בלוק קוד שגולל בלי `tabIndex={0}`**, נעול בפני מי שמנווט במקלדת.
5. **כפתור אייקון בלי `aria-label`**, קורא מסך אומר "כפתור".
6. **צבע שתלוי במצב**: טיימר שהופך לענבר-500 עם טקסט לבן (2.13:1). הסריקה לא
רואה את זה, כי זה מופיע רק באמצע ספירה. לעבור על הקוד.
7. **"הטקסט המהותי" דווקא נכשל**: "כולל מע״מ" ו"ניתן לבטל בכל עת" היו באפור בהיר.
**אסור לחסום זום** (`maximum-scale=1`, `user-scalable=no`). זו הפרה של WCAG 1.4.4.
## נייד
- **שדות מתחת ל-16px**: ספארי מגדיל את הדף בנגיעה ולא מקטין. כלל אחד לנייד,
מחוץ לשכבות של Tailwind, **מועתק כמו שהוא** מ-`reference/mobile-inputs.css`
לסוף ה-CSS הגלובלי. אחרי ההעתקה להריץ `site-audit` ולוודא אפס שדות מתחת
ל-16, ושהשדות הגדולים נשארו גדולים (בהפרויקט: 0 מתוך 282, ו-9 גדולים שלא השתנו).
**`~=` ולא `*=`**: `[class*='xl']` תפס גם `rounded-xl`, והכלל לא חל על אף שדה.
**לא `max(16px, 1em)`**: ב-font-size היחידה em היא של ההורה, ושדה גדול מתכווץ.
- **הלוגו בכותרת `shrink-0`**, אחרת הוא הפריט הגמיש היחיד ונמעך עד שכפתור עולה עליו.
- **כפתור שמיותר בטלפון** (תוסף כרום, שלא עובד בנייד) מוסתר ב-`hidden sm:inline-flex`.
- **כפתורים צפים באותה פינה**: מיקום נגזר מגובה השכן, וזז עם באנר העוגיות
(`bottom: calc(8rem + var(--banner-h, 0px))`), לא `bottom-24` קבוע.
## תווית "בפיתוח"
כלי שמופיע בקטלוג ולא עובד הוא הבטחה בלשון הווה שאינה מתקיימת. שדה `status: 'dev'`
ברשומת הכלי, ורכיב אחד (`components/DevBadge.tsx`) בכל מקום שבו הכלי מוצג:
כרטיס, חיפוש, המלצות, עמוד הכלי (עם הסבר **לפני** הניסיון), וכותרת גוגל
("| בפיתוח" במקום "| חינם"). **הכותרת הסטטית והדינמית חייבות להיות זהות.**
## בדיקות (להוסיף לפרויקט)
- כל עמוד חוק קיים, מרונדר ומקושר מהפוטר.
- אין "חד פעמי לכל תקופה" אם יש קישור תשלום `recurring`. (גזירה מהתצורה.)
- אין "נשלח תזכורת" בלי מנגנון תזכורת.
- אם `REQUIRE_LOGIN` דלוק, התקנון לא אומר "אינם דורשים חשבון".
- מייל `marketing` מכיל "פרסומת", שם משפטי, כתובת ומייל הסרה. מייל `service` לא.
- אין שם ספק מודל מחוץ לעמודי החוק.
- מספרים (כמה כלים, מחירים) **נגזרים** מהרשימה, לא מוקלדים. המספר המוקלד השלישי
פשוט חיכה להתיישן.
- אין מקף ארוך (, ) בקופי עברי שמוצג למשתמש.
- **אחרי כל בדיקה: מוטציה**, ולוודא שהקובץ באמת השתנה בזמן המוטציה.
## סקירת מוכנות לעלייה, הסדר
1. `get_advisors` של Supabase (security), ולבדוק לעומק כל פונקציה חשודה.
2. סריקת סודות בבנדל ובהיסטוריית git (בסקיל האבטחה).
3. **כל טענה בכל מסמך מול המימוש.** grep על "חד פעמי", "מתחדש", "תזכורת",
"לא חובה", "בלי חשבון", "רק למי ש", מספרי כלים.
4. מחירים במחירון מול קישורי התשלום, אחד לאחד.
5. `site-audit` על כל העמודים והכלים, ב-375 וב-320.
6. רשימה קצרה לבעל העסק של מה שנשאר ידני.
כליקס לא הצליח להיטען
נסו קודם לרענן את העמוד. אם בדיוק עלתה גרסה חדשה, רענון פותר את זה מיד.
אם הרענון לא עזר, ייתכן שהדפדפן ישן מדי: כליקס מריץ את הכלים על המכשיר שלכם ולא בשרת, ולכן הוא זקוק לדפדפן מ-2022 ומעלה. מה עושים: לעדכן את Chrome או את Firefox, ולפתוח שוב את klixtools.com.