Daf Yomi · Techie Talmid · On-Ramp

Zevachim 100

On-RampTechie TalmidDecember 23, 2025

The "Onen" Exception: Debugging Paschal Offering Logic (Zevachim 100a)

Greetings, fellow data-devotees and halachic algorithm architects! Today, we're diving deep into Zevachim 100a, where we encounter a classic "bug report" in the Halachic OS concerning the OnenStatus and its interaction with the PaschalOfferingProtocol. It's a delightful cascade of conditional logic and system re-architectures, just begging for a systems-thinking breakdown.

Problem Statement – The Bug Report

Our core problem statement, or rather, our "bug report," originates from conflicting outputs for the OnenStatus on the 14th of Nisan (Erev Pesach), specifically concerning the consumption of the Paschal offering at night. Rabbi Shimon, a venerable API designer, seems to have two different outputs for the same core IsOnenOnPaschalEveNight query.

  • Conflicting Output_A: In a baraita (Zevachim 100a:1), Rabbi Shimon implies an Onen cannot send his Paschal offering. This suggests that Aninut (acute mourning) on the night of the 15th of Nisan is a TORAH_LAW constraint, overriding the Paschal offering.
  • Conflicting Output_B: Yet, in a Mishna in Pesachim (Zevachim 100a:2), Rabbi Shimon teaches that an Onen immerses and partakes of the Paschal offering in the evening. This implies Aninut on the night of the 15th of Nisan is a RABBINIC_DECREE (which can be suspended or overridden).

This is a classic if (OnenStatus.IsActive(PaschalEveNight)) scenario yielding both ALLOW_PASCHAL_OFFERING = FALSE and ALLOW_PASCHAL_OFFERING = TRUE. Our mission, should we choose to accept it, is to debug this apparent inconsistency and refactor the underlying AninutDecisionEngine.

Text Snapshot

Let's anchor our analysis to the source code:

  • The Contradiction (implicitly from Rabbi Shimon):

    • "לא קשיא. הכא, במתניתין דר' שמעון דקתני אונן לא מייתי פסח..." (Zevachim 100a:1) – "It is not difficult. Here, in the baraita where Rabbi Shimon holds an acute mourner may not send a Paschal offering..." (Output A: Prohibited).
    • "התם, במתניתין דפסחים דקתני אונן טובל ואוכל פסחו לערב..." (Zevachim 100a:2) – "There, the ruling in the mishna in tractate Pesaḥim, which teaches that an acute mourner immerses and partakes of the Paschal offering in the evening..." (Output B: Permitted).
  • Rav Mari's Initial Resolution (Zevachim 100a:3-4):

    • "הכא כשמת וקברו בי"ד, דיום מיתה דאורייתא ותפיס לילו מדאורייתא..." – "Here, where his relative died on the fourteenth day of Nisan and he buried him on the fourteenth itself, his acute mourning is due to the day of death and is therefore by Torah law. Consequently, it takes hold of its following night by Torah law..."
    • "התם, כשמת בי"ג וקברו בי"ד, דיום קבורה דרבנן ותפיס לילו מדרבנן." – "By contrast, in a case where his relative died on the thirteenth day of Nisan and he buried him on the fourteenth of Nisan, the fourteenth is only the day of burial, and his acute mourning is therefore by rabbinic law. Consequently, it takes hold of its following night only by rabbinic law..."
  • Abaye's Resolution (Zevachim 100a:6):

    • "לא קשיא. הכא, כשמת לו מת קודם חצות. התם, כשמת לו מת לאחר חצות." – "It is not difficult. Here, in the baraita... it is referring to a case where his relative died before midday on the fourteenth of Nisan. There, the ruling in the mishna... it is a case where his relative died after midday on the fourteenth of Nisan."
  • Rava's Resolution (Zevachim 100a:18):

    • "לא קשיא. הכא, קודם שישחטו ויזרקו עליו. התם, לאחר ששחטו וזרקו עליו." – "It is not difficult. Here, his relative died before the priests would have slaughtered the Paschal offering and sprinkled its blood on his account... There, the relative died after the priests slaughtered the Paschal offering and sprinkled its blood on his account."

Flow Model – The AninutDecisionEngine

Let's visualize the conflicting logic paths as a decision tree, mapping the various proposed resolution_algorithms to the AninutDecisionEngine on Erev Pesach night.

graph TD
    A[Is Onen on Paschal Eve Night?] --> B{Contradiction! Output A vs Output B};

    B --> C1(Rav Mari's Resolution: "Death Date vs Burial Date");
    C1 --> C1a{Death & Burial on 14th?};
    C1a -- Yes --> C1a1[Aninut D'Oraita, holds for Night];
    C1a -- No (Death 13th, Burial 14th) --> C1a2[Aninut D'Rabanan, holds for Night];

    B --> C2(Abaye's Resolution: "Time of Death on 14th");
    C2 --> C2a{Death before Midday?};
    C2a -- Yes --> C2a1[Aninut Applies, No Paschal];
    C2a -- No (Death after Midday) --> C2a2[Aninut Suspended for Paschal];

    B --> C3(Rava's Resolution: "Paschal Offering Lifecycle Stage");
    C3 --> C3a{Death before Slaughter/Sprinkling?};
    C3a -- Yes --> C3a1[Aninut Applies, No Paschal];
    C3a -- No (Death after Slaughter/Sprinkling) --> C3a2[Aninut Suspended for Paschal];

    C1a1 --> D1[Cannot Partake Paschal];
    C1a2 --> D2[Can Partake Paschal (after Immersion)];
    C2a1 --> D1;
    C2a2 --> D2;
    C3a1 --> D1;
    C3a2 --> D2;

This decision tree illustrates how different conditional checks lead to the divergent outcomes. Each resolution attempts to add a new if/else branch to resolve the initial ambiguity.

Two Implementations: Algorithm A vs. Algorithm B

Let's compare Rav Mari's and Rava's solutions as distinct algorithmic approaches to resolving the OnenPaschalStatus contradiction.

Algorithm A: Rav Mari's AninutSourceResolver

Rav Mari proposes that the source of the Aninut determines its halachic_weight and whether it extends into the night with TORAH_LAW or RABBINIC_DECREE severity.

  • Class/Module: AninutSourceResolver
  • Input Parameters:
    • death_date: Date of the relative's passing.
    • burial_date: Date of the relative's interment.
    • current_date: Always 14th of Nisan for this context.
    • event_time: NIGHT (after sunset).
  • Internal Logic (resolveAninutSeverity method, Zevachim 100a:3-4):
    function resolveAninutSeverity(death_date, burial_date, current_date, event_time) {
        if (event_time !== 'NIGHT') {
            return 'TORAH_LAW'; // Aninut during the day is always D'Oraita
        }
    
        if (death_date === current_date && burial_date === current_date) {
            // Case 1: Death and burial both on the 14th
            // Source: "Day of Death" - Aninut status is D'Oraita.
            // "takes hold of its following night by Torah law."
            return 'TORAH_LAW';
        } else if (death_date === (current_date - 1) && burial_date === current_date) {
            // Case 2: Death on 13th, burial on 14th
            // Source: "Day of Burial" - Aninut status is D'Rabanan.
            // "takes hold of its following night only by rabbinic law."
            return 'RABBINIC_DECREE';
        } else {
            // Unhandled or other Aninut scenarios
            return 'UNKNOWN';
        }
    }
    
  • Output: AninutSeverity (TORAH_LAW or RABBINIC_DECREE).
  • Final Decision:
    • If AninutSeverity is TORAH_LAW: ALLOW_PASCHAL_OFFERING = FALSE.
    • If AninutSeverity is RABBINIC_DECREE: ALLOW_PASCHAL_OFFERING = TRUE (after immersion).

Critique of Algorithm A: Rav Mari's model is elegant in its distinction based on the aninut_source. However, Rav Ashi immediately identifies a critical proof_validation_failure (Zevachim 100a:5). Rabbi Shimon's own proof for aninut at night being RABBINIC_DECREE is that an Onen eats the Paschal offering but not other sacrifices. If Rav Mari's distinction is correct, Rabbi Shimon's proof would be invalid, as the baraita (prohibiting) would be TORAH_LAW (day of death) and the Mishna (permitting) would be RABBINIC_DECREE (day of burial). You can't use a RABBINIC_DECREE scenario to prove a point about a TORAH_LAW scenario. This essentially means Rav Mari's AninutSourceResolver does not adequately explain Rabbi Shimon's methodology, even if its internal logic is sound.

Algorithm B: Rava's PaschalOfferingLifecycleResolver

Rava's approach shifts the focus from the source of the Aninut to the lifecycle stage of the Paschal offering itself, introducing a crucial indispensability_flag.

  • Class/Module: PaschalOfferingLifecycleResolver
  • Input Parameters:
    • death_time: Time of the relative's passing on the 14th of Nisan.
    • paschal_offering_status: Current state of the offering (PRE_SLAUGHTER_SPRINKLING, POST_SLAUGHTER_SPRINKLING).
    • event_time: NIGHT (after sunset).
    • is_paschal_offering: Boolean flag (implicitly TRUE here).
  • Internal Logic (resolvePaschalOfferingAccess method, Zevachim 100a:18-20):
    def resolvePaschalOfferingAccess(death_time, paschal_offering_status, event_time, is_paschal_offering):
        if event_time == 'DAY':
            return False # Aninut applies universally during the day
    
        if not is_paschal_offering:
            return False # Aninut generally prohibits other sacrifices at night (D'Rabanan)
    
        # At night, Aninut is generally D'Rabanan (Zevachim 100a:24, final conclusion)
        # So we need a specific override for Paschal offering.
    
        if paschal_offering_status == 'PRE_SLAUGHTER_SPRINKLING':
            # Relative died before the offering was officially designated/sacrificed for this individual.
            # "before the priests would have slaughtered and sprinkled on his account"
            return False # Aninut applies, no sending/partaking.
        elif paschal_offering_status == 'POST_SLAUGHTER_SPRINKLING':
            # Relative died after the offering was officially designated/sacrificed.
            # "after they slaughtered and sprinkled on his account"
            # Crucial insight: "Partaking of Paschal offering is indispensable" (Zevachim 100a:20-21)
            # This 'indispensability' acts as a system override for D'Rabanan Aninut.
            return True # Aninut is suspended, can partake (after immersion).
        else:
            return False # Invalid status or other unhandled state.
    
  • Output: ALLOW_PASCHAL_OFFERING (Boolean).

Critique of Algorithm B: Rava's algorithm is more robust because it directly addresses the PaschalOfferingProtocol's unique properties, specifically its indispensability (חובה בלעדית – Zevachim 100a:20). The Gemara elaborates extensively on this indispensability_flag through the discussion of Rabba bar Rav Huna's baraita (Zevachim 100a:21 onwards), which, despite its own internal contradictions and multiple attempted resolutions, ultimately circles back to this critical concept. Rava's model successfully reconciles Rabbi Shimon's statements by positing that the Aninut in both cases (prohibited/permitted) is RABBINIC_DECREE at night, but the Paschal offering's unique status allows an override if it has already entered a certain lifecycle stage. This is a powerful exception_handling mechanism.

Edge Cases

Let's consider two inputs that might trip up a naive Aninut logic and see how our more refined algorithms handle them. A naive Aninut logic might simply state: If (is_onen) Then (cannot_partake_sacrifices).

  1. Input: current_date = 14th_Nisan, event_time = NIGHT, death_date = 13th_Nisan, burial_date = 14th_Nisan, sacrifice_type = PASCHAL_OFFERING.

    • Naive Logic Output: cannot_partake_sacrifices (because is_onen is TRUE).
    • Expected Output (per Rava's final accepted model, and even Rav Mari's D'Rabanan path): can_partake_sacrifices.
    • Explanation: This input perfectly fits Rav Mari's "day of burial, D'Rabanan" path, and Rava's "after slaughter/sprinkling, indispensable" path (as the Paschal offering would have been slaughtered by nightfall). The key here is the D'Rabanan nature of aninut at night in these specific circumstances, and the indispensability of the Paschal offering. The naive logic fails to differentiate the severity_level of aninut or the priority_level of the sacrifice_type.
  2. Input: current_date = 14th_Nisan, event_time = NIGHT, death_date = 14th_Nisan, burial_date = 14th_Nisan, sacrifice_type = REGULAR_PEACE_OFFERING.

    • Naive Logic Output: cannot_partake_sacrifices.
    • Expected Output (per Rava's final accepted model, and even Rav Mari's D'Oraita path): cannot_partake_sacrifices.
    • Explanation:
      • Rav Mari's model: This is a "day of death" scenario, meaning Aninut holds D'Oraita for the night, thus prohibiting any sacrifice.
      • Rava's model: Even though aninut at night is D'Rabanan (as per the Gemara's final conclusion from Rabbi Yehuda HaNasi, Zevachim 100a:24), the indispensability_flag is FALSE for a REGULAR_PEACE_OFFERING. Therefore, the D'Rabanan prohibition of aninut at night would still apply. The nuanced interaction of severity_level and sacrifice_type_properties is crucial. A simple is_onen check is insufficient.

Refactor – Clarifying the Rule

The ultimate refactor hinges on the nuanced understanding of Aninut's nocturnal extension and the PaschalOfferingProtocol's unique status.

  • Minimal Change: Introduce a PaschalOverrideFlag into the AninutDecisionEngine that is conditionally TRUE only for the Paschal offering under specific circumstances.

  • Revised AninutDecisionEngine Pseudo-code:

    function determineSacrificeEligibility(sacrifice_type, aninut_status_day, aninut_status_night, paschal_offering_lifecycle_stage):
        if current_time_of_day == 'DAY':
            # Aninut always applies during the day (D'Oraita)
            return False # Cannot partake
    
        elif current_time_of_day == 'NIGHT':
            # At night, Aninut is generally D'Rabanan (rabbinic decree)
            # This is the base state, but can be overridden for Paschal offering.
    
            if sacrifice_type == 'PASCHAL_OFFERING':
                # Check for the Paschal Override condition
                if paschal_offering_lifecycle_stage == 'POST_SLAUGHTER_SPRINKLING' and is_paschal_offering_indispensable:
                    return True # Override: Can partake (after immersion)
                else:
                    return False # No override, Aninut applies
            else:
                # For all other sacrifices, D'Rabanan Aninut at night applies.
                return False # Cannot partake
    

This refactor makes explicit the unique exception_handling for the Paschal offering, which is the cornerstone of Rava's final, accepted resolution in the Gemara. It clarifies that while Aninut at night is generally D'Rabanan, it only gets suspended for the Paschal offering due to its unique indispensability (and only after it's been processed).

Takeaway

What a journey through the data structures of Halakha! This sugya on Zevachim 100a exemplifies the iterative, rigorous process of halachic development. We started with a seemingly contradictory API, a "bug report" in Rabbi Shimon's statements. We then saw multiple dev_teams (Rav Mari, Abaye, Rava) propose different resolution_algorithms, each adding layers of conditional logic (if/else statements) based on new data points (death date, burial date, time of day, offering status).

The final, accepted algorithm (Rava's, leveraging the indispensability_flag for the Paschal offering) highlights that the Halachic system is not a simplistic set of binary rules. Instead, it's a sophisticated, multi-layered decision engine, where:

  1. Context is King: The exact circumstances (death_date, burial_date, time_of_day) are critical inputs.
  2. Severity Levels Matter: TORAH_LAW vs. RABBINIC_DECREE dictates the flexibility of the system.
  3. Special Properties Override: Unique attributes of certain mitzvot (like the indispensability of the Paschal offering) can trigger exception_handling protocols, suspending general rules for higher-priority objectives.

Debugging the OnenPaschalStatus wasn't just about finding a simple fix; it was about understanding the intricate object_oriented_programming of Jewish law, where each halacha_object has its own properties, methods, and interactions within a complex, yet beautifully logical, system. Keep coding that Halacha, my friends!