mcpField
S
shabbat-aware-scheduler

shabbat-aware-scheduler

github.com/skills-il生産性26175 回インストール2 週間前に更新
リポジトリ

shabbat-aware-scheduler について

ヘブライ暦の祝日、シャバットの時間帯、イスラエルの営業時間を考慮して日程を判定するスキルです。スクリプトと参考資料を含み、ハラハー上の裁定は行いません。

主な機能

  1. 01HebCal でシャバットと祝日データを取得
  2. 02イスラエルの営業時間を適用
  3. 03祝日とシャバットの時間帯を考慮
  4. 04定期ジョブ向けの現在時間帯チェック
  5. 05スケジューリング用スクリプトと資料

活用シーン

  1. 01チーム会議やイベントの日程調整
  2. 02シャバットを避けたデプロイ計画
  3. 03祝日を除外する定期ジョブの設定
  4. 04通知に適した送信時刻の選定

MCP 対応

場所に応じたシャバットと祝日のデータを取得するため、hebcal MCP サーバーとの併用を推奨しています。利用可能な場合は、固定日付よりそのツールを優先します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/skills-il/localization --skill shabbat-aware-scheduler

インストール後、Claude Code で/shabbat-aware-schedulerを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evidence.json
metadata.json
optimization-log.json
SKILL_HE.md
references/
domain-checklist.md
israeli-holiday-calendar.md
scripts/
check_shabbat.py

詳細

シャバット対応スケジューラー

このツールは、暦の時刻と業務スケジュールのみを計算します。ハラハー上の裁定は行いません。ハラハーに関する質問はラビにご相談ください。

手順

ステップ 1:スケジュールのコンテキストを判断する
コンテキスト主な制約例
会議のスケジュールイスラエルの営業時間(日曜〜木曜)、シャバット、祭日「来週、チーム会議を設定する」
デプロイ計画シャバット、祭日、エレブ・ハグ中はデプロイしない「このリリースはいつデプロイできますか?」
イベント企画ヘブライ暦の制約、会場の空き状況「製品ローンチイベントを企画する」
cron/自動化定期タスクではシャバットと祝日を除外する「シャバット以外は毎日このジョブを実行する」
通知のタイミングシャバット中や夜遅くには送信しない「プッシュ通知キャンペーンをスケジュールする」
ステップ 2:ズマニムと祝日のデータを取得する

HebCal API を使用して、シャバットの時刻と祝日のデータを取得します。 すぐに使えるユーティリティについては、scripts/check_shabbat.py を参照してください。

シャバットの時刻を HebCal API に問い合わせる: 生の座標より geonameid を優先してください。 geonameid を渡すと、Hebcal がその都市固有のキャンドル点火のミンハーグを適用するため、誤った b= 値を指定する心配がありません。緯度/経度と手動で選んだ b= を使うのは、geonameid がない場所に限ってください。

import requests
from datetime import datetime, timedelta

CITY_GEONAMEID = {
    "jerusalem": 281184, "tel_aviv": 293397, "haifa": 294801,
    "beersheba": 295530, "tiberias": 293322, "safed": 293100,
}

def get_shabbat_times(date=None, geonameid=281184):
    """Candle lighting and havdalah for the Shabbat of the week containing `date`."""
    if date is None:
        date = datetime.now()

    # Anchor on the Friday of the CURRENT Shabbat week. Saturday belongs to the
    # Shabbat that started the evening before, so it looks BACK one day. Adding
    # (4 - weekday) % 7 unconditionally returns next week's Shabbat all Saturday,
    # which is 8 days wrong exactly when someone asks "when does Shabbat end?".
    if date.weekday() == 5:
        friday = date - timedelta(days=1)
    else:
        friday = date + timedelta(days=(4 - date.weekday()) % 7)

    response = requests.get("https://www.hebcal.com/shabbat", params={
        "cfg": "json",
        "gy": friday.year, "gm": friday.month, "gd": friday.day,
        "geonameid": geonameid,
        "M": "on",    # Havdalah at tzeit hakochavim (sun 8.5 deg below horizon)
        # Alternative: m=50 or m=72 for a fixed number of minutes after sunset
    })

    data = response.json()
    times = {}
    for item in data.get("items", []):
        if item["category"] == "candles":
            times["candle_lighting"] = item["date"]
        elif item["category"] == "havdalah":
            times["havdalah"] = item["date"]

    return times

Hebcal の b= のデフォルトは、日没の18分前です。エルサレムでは40分前、ハイファとジクロン・ヤアコブでは30分前です。また、同じ時間差はエレブ・シャバットだけでなく、エレブ・ハグ(ロシュ・ハシャナ、ヨム・キプール、スコット、シェミニ・アツェレット、シムハット・トーラー、ペサハ、シャブオット)にも適用されます。

1年分のイスラエルの祝日をすべて取得する:

def get_holidays(year):
    """Get all Israeli holidays for a given year."""
    response = requests.get("https://www.hebcal.com/hebcal", params={
        "v": 1,
        "cfg": "json",
        "year": year,
        "month": "x",  # All months
        "maj": "on",   # Major holidays
        "min": "on",   # Minor holidays
        "mod": "on",   # Modern holidays
        "mf": "on",    # Minor fasts. WITHOUT this, Tzom Gedaliah, Asara
                       # B'Tevet, Ta'anit Esther, Ta'anit Bechorot and
                       # Tzom Tammuz are absent from the response entirely.
        "i": "on",     # Israeli holidays (1-day yom tov)
        "nx": "off",
        "ss": "off"
    })

    data = response.json()
    holidays = []
    for item in data.get("items", []):
        if item["category"] in ["holiday", "roshchodesh"]:
            holidays.append({
                "title": item["title"],
                "date": item["date"],
                "category": item.get("subcat", item["category"]),
                "yomtov": item.get("yomtov", False),
                "memo": item.get("memo", "")
            })

    return holidays
ステップ 3:スケジュールのロジックを実装する

イスラエルの営業時間:

曜日時間備考
日曜日08:00-18:00イスラエルの週の最初の勤務日
月曜日08:00-18:00通常の営業日
火曜日08:00-18:00通常の営業日
水曜日08:00-18:00通常の営業日
木曜日08:00-18:00通常の営業日
金曜日08:00-13:00半日(シャバット前に閉業)
土曜日休業シャバット(業務なし)

スケジュールの中核となる関数:

from datetime import datetime, timedelta, time
import pytz

IL_TZ = pytz.timezone("Asia/Jerusalem")

BUSINESS_HOURS = {
    6: (time(8, 0), time(18, 0)),  # Sunday
    0: (time(8, 0), time(18, 0)),  # Monday
    1: (time(8, 0), time(18, 0)),  # Tuesday
    2: (time(8, 0), time(18, 0)),  # Wednesday
    3: (time(8, 0), time(18, 0)),  # Thursday
    4: (time(8, 0), time(13, 0)),  # Friday (half day)
    5: None,                        # Saturday (Shabbat)
}

# Days the country does not work that Hebcal reports with yomtov=false.
# Filtering on yomtov alone marks every one of these an ordinary business day.
CLOSED_OBSERVANCES = {
    "Yom HaAtzma'ut": "closed",   "Yom HaZikaron": "closed",
    "Tish'a B'Av": "reduced",     "Erev Yom Kippur": "reduced",
    "Erev Rosh Hashana": "reduced", "Erev Pesach": "reduced",
    "Erev Sukkot": "reduced",     "Erev Shavuot": "reduced",
}
JERUSALEM_ONLY = {"Shushan Purim"}   # walled cities only

def _norm(title):
    # Hebcal emits typographic apostrophes, so "Yom HaAtzma\u2019ut" never matches
    # an ASCII-keyed table. This one character is the whole bug.
    return title.replace("\u2019", "'").strip()

def classify_day(date, holidays_cache=None, jerusalem=False):
    """Return (status, reason).

    closed         Shabbat, Yom Tov, or a national shutdown day
    reduced        morning only (erev chag, fast day)
    evening_closed a full working day whose EVENING is restricted: eve of
                   Yom HaZikaron, Yom HaShoah, Tisha B'Av. Distinct from
                   reduced on purpose, or the morning-only clamp would
                   block an ordinary Monday afternoon.
    open           ordinary business day
    """
    if date.weekday() == 5:
        return "closed", "Shabbat"
    if not holidays_cache:
        return "open", "Business day (no holiday data loaded)"

    date_str = date.strftime("%Y-%m-%d")
    status, reason = "open", "Business day"
    for h in holidays_cache:
        if not h["date"].startswith(date_str):
            continue
        title = _norm(h["title"])
        if h.get("yomtov", False):
            return "closed", f"Yom Tov: {title}"
        if title in JERUSALEM_ONLY:
            if jerusalem:
                return "closed", f"{title} (Jerusalem and walled cities)"
            continue
        level = CLOSED_OBSERVANCES.get(title)
        if level == "closed":
            return "closed", title
        if level == "reduced" and status == "open":
            status, reason = "reduced", f"{title} (morning only)"
    return status, reason

ホル・ハモエドは open に分類します。イスラエルでは法的な営業日ですが、出勤者は少なくなります。それ以外の曖昧な場合は、すべて closed と判断してください。実際には休業だった時間枠を提案すると会議の再調整で済みますが、休業日を見落とすと会議そのものが実施できなくなります。

ステップ 4:祝日を考慮した Cron ジョブ

日付のチェックは時刻のチェックではありません。 classify_day() が答えるのは、暦上のDATEについての質問です。シャバットとヨム・トーブは前日の夕方、キャンドル点火の時刻に始まるため、金曜日は営業日である一方、金曜日の19:00にはすでにシャバットです。特定の時刻に実行されるもの(cron、通知の送信、デプロイ)は、実行時の時間帯も追加で確認する必要があります。そうしないと、「営業日」と報告しながら、毎週シャバット中に実行されてしまいます。

def is_shabbat_now(now, times):
    """times = get_shabbat_times(now). Fail closed if the API is unreachable."""
    start = datetime.fromisoformat(times["candle_lighting"])
    end = datetime.fromisoformat(times["havdalah"])
    return start <= now <= end
def should_run_today(holidays_cache=None, skip_friday=False, skip_erev_chag=False,
                     now=None, jerusalem=False, time_aware=True, rest_kwargs=None):
    """Determine if a scheduled job should run RIGHT NOW.

    rest_kwargs is passed to the live-window check (geonameid, or city and
    coordinates). Omitting it evaluates the window for Jerusalem, which is
    22 minutes early for a Tel Aviv caller.
    """
    today = datetime.now(IL_TZ).date()

    # Never run on Shabbat -- the live window, not just the weekday
    if is_shabbat_now(datetime.now(IL_TZ), get_shabbat_times()):
        return False, "Shabbat in progress"
    if today.weekday() == 5:
        return False, "Shabbat"

    # Check holidays
    if holidays_cache:
        date_str = today.strftime("%Y-%m-%d")
        status, reason = classify_day(today, holidays_cache)
        if status == "closed":
            return False, reason

        # Check if tomorrow is Yom Tov (today is Erev Chag)
        if skip_erev_chag:
            tomorrow = today + timedelta(days=1)
            tomorrow_str = tomorrow.strftime("%Y-%m-%d")
            for h in holidays_cache:
                if h["date"].startswith(tomorrow_str) and h["yomtov"]:
                    return False, f"Erev Chag: {h['title']} tomorrow"

    if skip_friday and today.weekday() == 4:
        return False, "Friday (half day)"

    return True, "Business day"
ステップ 5:祝日前および季節ごとの考慮事項
期間日付(おおよその目安)スケジュールへの影響
エレヴ・シャバット(金曜日)毎週季節に応じて13:00〜15:00までに閉店します
エレヴ・ロシュ・ハシャナー9月頃正午までに閉店します
ロシュ・ハシャナーおよびヨム・キプールの期間ティシュレイ月1〜10日10日間、対応可能時間が短縮されます
スッコートの週ティシュレイ月15〜22日休暇を取る人が多く、ホル・ハモエドにあたります
ペサハ前の週ニサン月15日より前掃除や買い出しで非常に忙しくなります
ペサハの週ニサン月15〜22日休暇を取る人が多く、ホル・ハモエドにあたります
三週間(ベイン・ハメツァリーム)タンムーズ月17日〜アヴ月9日(7月頃〜8月初旬)結婚式や祝賀行事は行われず、企業のパーティーは通常延期されます
ティシャ・ベアヴアヴ月9日(7月下旬〜8月初旬頃)断食日です。半休または休業とする人が多くいます
シュシャン・プリムアダル月15日(プリムの翌日)エルサレムなど、歴史的に城壁に囲まれた都市のみが対象です。国全体では平日ですが、エルサレム市内では休業日となります
夏(7〜8月)7〜8月学校が休みとなり、事業活動が縮小します
冬のシャバット11〜2月シャバットの開始が早く(金曜日は早めに閉店します)
夏のシャバット5〜8月シャバットの開始が遅く(金曜日に対応できる時間が長くなります)

予定を立てる際に考慮すべき2026年の主な祝日(イスラエルでの慣例):

祝日グレゴリオ暦の日付(頃)休業日
ペサハ2026年4月1日〜4月8日初日と7日目はヨム・トーヴで、中日はホル・ハモエドです
ヨム・ハショア2026年4月13日〜4月14日(夕方から翌夕方)記念日です。娯楽施設は休業します
ヨム・ハジカロン2026年4月20日〜4月21日記念日です。商業活動が制限されます
ヨム・ハアツマウート2026年4月21日〜4月22日独立記念日です。ほとんどの事業者が休業します
シャブオット2026年5月21日〜5月22日(夕方から翌夕方)イスラエルでは1日間のヨム・トーヴです
ティシャ・ベアヴ2026年7月22日〜7月23日(夕方から翌夕方)断食日です
ロシュ・ハシャナー2026年9月11日〜9月13日初日がシャバットの前日ではなく、シャバット当日(土曜、9月12日)にあたるため、休業期間は土曜と日曜の2日間です。金曜夕方のろうそく点灯とともに始まります
ヨム・キプール2026年9月20日〜9月21日(夕方から翌夕方)国全体が休業します
スッコート2026年9月25日〜10月2日エレヴ・スッコートは9月25日です。ヨム・トーヴはスッコート初日の9月26日のみです。9月27日〜10月2日はホル・ハモエドで、10月2日のホシャナ・ラバも含まれます。この日は平日です
シュミニ・アツェレット(イスラエルではシムハット・トーラー)2026年10月2日〜10月3日スッコートの期間を締めくくるヨム・トーヴで、イスラエルでは1日間です。10月3日のシャバットにあたります
プリム/シュシャン・プリム2026年3月3日および3月4日国全体では3月3日がプリムです。3月4日のシュシャン・プリムはエルサレムなど城壁に囲まれた都市のみで祝われます

日付はHebcal 2026(イスラエルでの慣例)に基づいて確認済みです。ヘブライ暦はグレゴリオ暦に対して11〜19日ずれるため、毎年必ずカレンダーを再確認してください。2026年のヨム・ハアツマウートは本来の日付である5786年イヤル月5日(4月21日〜22日)にあたり、延期はありません。ほかの年は、ヨム・ハアツマウート自体、または必ずその前にあるヨム・ハジカロンがシャバットと重なる場合、前倒しまたは延期されることがあります。そのため、イヤル月5日から日付を直接計算しないでください。

例

例 1:会議の予定を立てる

ユーザー:「来週、チームミーティングを設定して」 結果:イスラエルの営業時間(日曜〜木曜)を確認し、ユダヤ教の祝日がないか確認して、空いている時間帯を提案します。午前中でない限り金曜日は避け、エレヴ・ハグではないことを確認します。

例 2:デプロイ時間帯

ユーザー:「今週、デプロイに最も安全な時間はいつ?」 結果:週の中日でシャバットまでの余裕を最大限に確保できる火曜または水曜の、営業時間内かつ祝日前ではない時間帯を探します。シャバット前にロールバックの時間を最大限確保できるよう、午前中のデプロイを推奨します。

例 3:祝日を考慮したCron

ユーザー:「シャバットと祝日を除外して、毎日のレポートを設定して」 結果:should_run_today()チェックと、その年の祝日キャッシュを事前に読み込む設定を含むCron設定を提示し、実行をスキップした日のログ記録も設定します。

同梱リソース

スクリプト
  • scripts/check_shabbat.py:Hebcal API 経由で、安息日の時刻、イスラエルの祝日、営業日かどうかを照会する単独ユーティリティです。任意の日付を休業/短縮営業/営業に分類します(ヨム・トーブ以外の国全体の休業日と、エルサレムのシュシャン・プリムにも対応)。安息日だけでなくヨム・トーブの開始も対象とする、cron 向けの時刻を考慮した --is-rest-period-now チェックを提供し、検索を開始した時刻を考慮して、次に利用可能なイスラエルの営業枠を見つけます。実行方法:python scripts/check_shabbat.py --help
リファレンス
  • references/domain-checklist.md:このスキルが対応すべき範囲の仕様です。イスラエルのカレンダーに関するスケジュール制約をすべて列挙し、変動する項目(地域ごとの慣習、ハヴダーラーの慣例、ヨム・トーブとホル・ハモエド、ヨム・トーブ以外の国全体の休業日、地域によって異なる祭事、エレヴの半日営業、夏時間、閏年、延期規則)ごとに分類しています。各項目には出典が記載されています。
  • references/israeli-holiday-calendar.md:ヘブライ暦の日付、西暦の概算、スケジュールへの影響度(高/中/低)、服喪期間の制約、エルサレムの月別の季節ごとの安息日ろうそく点灯時刻、2026 年の主要日付、HebCal API エンドポイントのリファレンスを含む、イスラエルの祝日カレンダーの完全版です。祭日を考慮した計画、季節ごとの金曜日の閉業時刻の確認、イベントが服喪期間と重なるかの確認に参照してください。

推奨 MCP サーバー

リアルタイムのヘブライ暦データを利用するには、このスキルと次の MCP サーバーを組み合わせてください。

MCP サーバー提供機能インストール
hebcal公式 Hebcal API を介した、ユダヤ教の祝日、安息日のろうそく点灯時刻、ハヴダーラーの時刻、トーラー朗読、ヘブライ暦と西暦の変換hebcal をインストール

hebcal MCP を利用できる場合は、ハードコードされた値ではなく、そのツールを使って正確な安息日の時刻と祝日の日付を取得してください。この MCP は、イスラエル国内の任意の都市について、場所に応じたろうそく点灯時刻を提供します。

オフラインライブラリ

実行時に Hebcal API に接続できない場合(CI、エアギャップ環境、10 秒あたり 90 リクエストのレート制限など)は、ローカルライブラリを使い、HTTP 呼び出しを省略してください。

ライブラリ言語備考
@hebcal/coreJavaScript / TypeScript活発にメンテナンスされています(2026 年 5 月時点で v6.x)。純粋な JS で、ネットワーク接続は不要です。インストール:npm i @hebcal/core
pyluachPythonヘブライ暦の計算と、ヘブライ暦と西暦の変換に対応しています。安定していますが、更新頻度は低めです(v2.3.0)。日付変換には適していますが、ろうそく点灯時刻は組み込まれていません。日没/ズマニーム用のライブラリと組み合わせるか、事前計算した時刻をキャッシュしてください
hebcal-goGoHebcal チームがメンテナンスしています

非推奨の hebcal-js パッケージ(NPM の hebcal)は @hebcal/core の前身です。新しい作業では使用しないでください。

注意事項

  • イスラエルでは、安息日のキャンドル点灯時刻は都市によって異なります。エルサレムでは日没の40分前、ハイファとジフロン・ヤアコブでは30分前、その他のほとんどの都市では18分前です。イスラエル全土で同じ b= の値を使うと、金曜日の締め切り時刻が10〜22分早すぎたり遅すぎたりします。都市ごとのオフセットをHebcal APIに渡してください。
  • イスラエルの祝日(ハギーム)には、安息日とは異なる就労制限があります。イスラエルではほとんどの祝日が1日ですが、ディアスポラでは2日です(ローシュ・ハシャナーはどちらも2日です)。ディアスポラ向けの祝日カレンダーをイスラエルのスケジュール設定に使うと、実際にはイスラエルでホル・ハモエドにあたる日にまで、余分に就労不可としてしまいます。
  • ヘブライ暦には、19年周期で7回、閏月のアダルIIが加わる閏年があります。エージェントがグレゴリオ暦を使って日付を計算すると、この月を完全に見落とすことがあります。
  • イスラエルの営業時間は日曜日から木曜日までで、金曜日は半日(午後の早い時間まで)です。土曜日が週の休息日で、日曜日ではありません。エージェントが金曜日の午後に会議を設定したり、月曜日の午前を締め切りにしたりする可能性があります。
  • ヨム・ハアツマウトとヨム・ハジカロンは、本来の日付が安息日と重なる場合、延期(ニドヘ)されることがあります。2026年は延期されません(5786年イヤール月5日は4月21日から22日にあたります)。イヤール月5日を直接計算するのではなく、必ずHebcalから日付を取得してください。延期はHebcalが適用します。i=on はイスラエルの1日間のヨム・トーブを選択する別のフラグであり、延期を行うものではありません。
  • Hebcalのハヴダラーのデフォルトは、ツェイト・ハコハビーム(太陽が地平線の下8.5度に沈んだ時点)です。Hebcal独自のズマニームのエンドポイントでエルサレムについて確認すると、これは夏の終わりには日没からおよそ37分後、真冬には39〜40分後であり、よく言われる50分後ではありません。より厳格なラビヌ・タムの慣習に従う人々向けの場合は、適切な m= の値を選んでください。
  • Hebcalで yomtov: true が設定されるのはヨム・トーブだけです。ヨム・ハアツマウト、ヨム・ハジカロン、エレブ・ヨム・キプール、ティシャ・ベアブ、およびすべてのエレブ・ハグは yomtov: false で返されるため、if h["yomtov"] と書かれたフィルターでは、独立記念日が通常の水曜日として扱われます。タイトルも照合してください。また、Hebcalはこれらのタイトルに曲がったアポストロフィ(Yom HaAtzma\u2019ut)を使うため、ASCII文字列をキーにした検索では何も一致しません。
  • マイナーな断食日は、mf=on を指定しないと表示されません。maj / min / mod フラグでは、ツォム・ゲダリヤ、アサラ・ベテベト、タアニト・エステル、タアニト・ベホロト、ツォム・タムズは返されません。ツォム・ゲダリヤはローシュ・ハシャナーの翌日にあたり、ちょうど誰かが埋め合わせの会議を設定する日です。
  • カレンダーデータが欠落している場合は、必ずフェイルクローズにしてください。Hebcalは10秒間に90件のリクエストまでに制限されており、429エラーの際に「営業日」と回答するスケジューラーは、ヨム・キプールに会議を予約してしまいます。空の祝日キャッシュは不明、したがって休業として扱い、営業日として扱わないでください。
  • エレブのステータスは、固定リストから列挙するのではなく、「翌日に yomtov: true が付いている」という条件から導出してください。固定リストでは、毎年シュミニ・アツェレトのエレブにあたるホシャナ・ラバのような例が漏れます。
  • シュシャン・プリム(アダル月15日)は、エルサレムや歴史的に城壁で囲まれていたその他の都市では終日の祝日ですが、それ以外では通常の営業日です。全国向けのスケジューラーではこれを休業日にしてはならず、エルサレム向けのスケジューラーでは見落としてはなりません。都市によってステータスが変わるイスラエルの慣習は、これだけです。
  • イスラエルの夏時間の規則は独自のものです。夏時間は3月最後の日曜日の前の金曜日に始まり、10月最後の日曜日に終わるため、米国ともEUとも切り替え時期が一致しません。2026年は3月27日と10月25日です。どちらの切り替えでも、時計上の金曜日のキャンドル点灯時刻が1時間ずれます。特に注意が必要なのは10月の終了時で、安息日の開始時刻が突然1時間早まります。固定オフセットではなく、Asia/Jerusalem のタイムゾーンデータベースを使用してください。
  • スケジュール設定では、ヨム・キプールは安息日と同様に扱われます(イスラエルでは、世俗的な事業、交通機関、放送メディアを含めて完全に停止します)。25時間の期間内には、何もデプロイしたりスケジュールしたりしないでください。
  • 三週間(タムズ月17日からアブ月9日)は哀悼の期間で、結婚式、コンサート、企業の祝賀イベントは通常延期されます。九日間(アブ月1日から9日)はさらに厳しい期間です。ヨム・トーブではありませんが、「ローンチパーティー禁止」の期間として扱ってください。

トラブルシューティング

エラー:「安息日に会議が予定されています」

原因:タイムゾーンの不一致です。サーバーは UTC、安息日の時刻は現地時間になっています。 解決策:確認する前に、必ず Asia/Jerusalem タイムゾーンに変換してください。安息日の時刻は季節や場所によって異なります。

エラー:「祝日が検出されません」

原因:ヘブライ暦の日付との対応付けを行わず、グレゴリオ暦のみのカレンダーを使用しています。 解決策:ヘブライ暦とグレゴリオ暦の変換に対応している HebCal API を使用してください。祝日データを毎年キャッシュし、ロシュ・ハシャナに更新してください。

エラー:「金曜日の会議が遅すぎます」

原因:季節に関係なく、金曜日の終了時刻を 17:00 に固定しています。 解決策:冬季は、安息日が早ければ 16:00 に始まることがあります。対象の金曜日の実際のろうそく点灯時刻を必ず確認してください。

エラー:「エルサレムのろうそく点灯時刻が間違っています」

原因:エルサレムの座標を指定しているのに、エルサレム独自の慣習である 40 分ではなく、b=18(Hebcal のデフォルト値)を渡しています。 解決策:ユーザーがエルサレムにいる場合は必ず b=40、ハイファとジフロン・ヤアコヴにいる場合は b=30、それ以外の場所では b=18 を渡してください。Hebcal も同じ慣習に対応しています。

エラー:「ハヴダラーの時刻が 8〜30 分ずれているようです」

原因:M=on(ツェト・ハコハビーム。太陽が地平線下 8.5 度にあり、年間を通じてエルサレムでは日没から 37〜40 分後に測定されます)と、ハードコードされた「42 分」または「72 分」という前提を混在させています。 解決策:いずれかの方法を明示的に選択してください。M=on は Hebcal のツェト・ハコハビーム(太陽が地平線下 8.5 度にあり、小さな星が 3 つ見える状態)です。一方、m=N は日没後の固定 N 分を表すため、m=50 と m=72 は星の数ではなく分数です。後続のエージェントが二重にずらさないよう、スケジューラーがどちらの方式を使用するか明記してください。

エラー:「ヨム・ハアツマウト/ティシャ・ベアブ/祭日の前夜に会議が予約されています」

原因:yomtov == true のみを条件に Hebcal フィードを絞り込んでいます。2026 年のイスラエル向けフィードで確認したところ、ヨム・ハジカロン(4 月 21 日)、ヨム・ハアツマウト(4 月 22 日)、ヨム・キプール前夜(9 月 20 日)、ティシャ・ベアブ(7 月 23 日)は、いずれも yomtov: false を返します。 解決策:フラグだけでなくタイトルも使って分類し、まず活字用アポストロフィを正規化してください。scripts/check_shabbat.py の classify_day() を参照してください。

エラー:「金曜日の 19:30 に cron が実行され、安息日中でした」

原因:ガードが曜日だけをチェックしており、ろうそく点灯までは金曜日を営業日として扱っていました。 解決策:現在の時刻を Hebcal が返す、ろうそく点灯からハヴダラーまでの時間帯(is_shabbat_now())と比較してください。API に接続できない場合は、週末に処理を実行しないようフェイルクローズしてください。

コメント