חבילה משפטית לאתר בישראל

אתר או 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. רשימה קצרה לבעל העסק של מה שנשאר ידני.

איך מתקינים

  1. צרו תיקייה בשם israeli-legal-pack בתוך ‎.claude/skills/‎ בפרויקט, או בתיקיית הבית לשימוש בכל הפרויקטים.
  2. שמרו בתוכה את הקובץ בשם SKILL.md.
  3. זהו. אין צורך להפעיל כלום, והוא ייטען לבד כשהמשימה תתאים לתיאור.