Arukh HaShulchan Yomi · Techie Talmid · Deep-Dive
Arukh HaShulchan, Orach Chaim 190:6-192:2
Oh, the glorious dance of Birkat Hamazon! It's like a finely tuned distributed system, isn't it? Each participant a node, processing a sequence of sacred operations, all culminating in that beautiful, collective acknowledgment of Divine sustenance. But, as any seasoned developer knows, even the most elegant protocols can harbor subtle "bugs"—edge cases where the system state becomes ambiguous, or the expected flow breaks down. Today, we're diving deep into Arukh HaShulchan, Orach Chaim 190:6-192:2, to debug one such fascinating challenge: the synchronization of zimun (the quorum invitation) and mayim acharonim (the final handwashing). Get ready to don your systems architect hat, because we're about to refactor some ancient wisdom!
Problem Statement: The Zimun State Inconsistency Bug Report
The Core Bug — Race Condition Between Zimun.start() and MayimAcharonim.complete()
Imagine a distributed system, let's call it BirkatHamazonProtocol, designed for a group of participants to collectively invoke a BirkatHamazon service. A critical preliminary step in this protocol, when three or more participants are present, is the Zimun ritual. This Zimun acts as a distributed consensus mechanism, confirming the group's readiness and commitment to perform the BirkatHamazon together.
Now, here's where our "bug" emerges. There's another important, albeit individual, preparatory step: MayimAcharonim (final handwashing). This action cleanses the hands before uttering the blessings, a crucial hygienic and spiritual prerequisite for BirkatHamazon. The BirkatHamazonProtocol spec clearly states that MayimAcharonim must be completed before BirkatHamazon itself.
The bug report we're examining centers on the ordering of these two operations: Zimun.start() and MayimAcharonim.complete(). Which one should precede the other? Or, more precisely, what is the required state of all participant nodes with respect to MayimAcharonim when the Zimun.start() command is issued?
Current System Behavior (Pre-Bug):
- Participants finish their meal.
- A
mezamen(leader node) checks for a quorum (participants.count >= 3). - If quorum exists,
mezameninitiatesZimun.start(). - All other participant nodes (
omerim) respond, indicating collective agreement. - All participant nodes then proceed with
MayimAcharonim.complete(). - Finally, all nodes invoke
BirkatHamazon.start().
The Bug Report:
The problem arises because MayimAcharonim is an individual action, whereas Zimun is a collective one. If the system allows individual nodes to perform MayimAcharonim.complete() before Zimun.start(), several undesirable side effects can occur:
- State Inconsistency: A participant node that has completed
MayimAcharonimmight feel "done" with the preparatory steps, potentially disengaging from the group or even physically leaving the table beforeZimun.start()is initiated. This breaks the integrity of the quorum. TheZimunrequires a collective, present, and engaged state. - Reduced Collective Focus: The act of zimun is meant to unite the group in shared intention. If some participants are already engaged in
MayimAcharonim(which involves leaving the table, washing, returning), their attention is diverted, weakening theZimun's collective spiritual "bandwidth." - Race Condition: What if
mezamentries to callZimun.start()whileparticipantXis in the middle ofMayimAcharonim.complete()? DoesparticipantXpause their washing, respond tozimun, then resume? Or do they defer their response? The protocol becomes ambiguous, leading to potential deadlocks or missed responses. CommitIssues: TheZimuncan be seen as aCOMMIToperation for the collective mitzvah of Birkat Hamazon. If preparatory steps are still outstanding or being performed asynchronously by individuals at thisCOMMITpoint, the integrity of the transaction is compromised.
The Arukh HaShulchan, with its characteristic precision, identifies these potential failure states and attempts to define a robust protocol to prevent them. It grapples with the tension between individual preparatory actions and the collective initiation of a sacred ritual, essentially trying to prevent a ZimunStateCorrupted exception. This is not just about avoiding "bad data" but about ensuring the spiritual integrity and communal coherence of the mitzvah. The "bug" isn't a simple error; it's a design challenge in a complex, multi-agent system where human behavior, rather than just code, dictates state transitions.
The core question the Arukh HaShulchan addresses is: How do we synchronize Zimun.start() with MayimAcharonim.complete() across all participant nodes to maintain system integrity and optimal spiritual performance? This isn't just about "doing things in order"; it's about defining the precise preconditions and postconditions for critical system functions, especially when those functions involve human agents with varying states and intentions.
Flow Model: The BirkatHamazonProtocol Decision Tree
Let's model the Arukh HaShulchan's logic for the Zimun and MayimAcharonim interaction as a decision tree. This allows us to visualize the conditional logic and state transitions, much like an if-else cascade or a switch statement in code. This model is based primarily on Arukh HaShulchan, Orach Chaim 190:6-7, which directly addresses the timing and conditional handling.
BEGIN BirkatHamazonProtocol_Initiation_Flow
1. // System Check: Quorum detection
`IF (Participants.count() < 3)`
* `THEN`:
* Each participant node executes `IndividualBirkatHamazon.start()`.
* `END Protocol`.
2. `ELSE IF (Participants.count() >= 3)` // Zimun is required.
* `// State Assessment: Mayim Acharonim Status of all nodes`
* `LET ma_completed_count = Participants.filter(p => p.has_completed_MayimAcharonim).count()`
* `LET total_participants = Participants.count()`
* `LET ma_not_completed_count = total_participants - ma_completed_count`
* `// Decision Branch 1: Ideal State - No one has done Mayim Acharonim`
* `IF (ma_completed_count == 0)`
* `THEN`:
* `Zimun.start()` is immediately initiated by `mezamen`.
* All participant nodes (`omerim`) respond.
* All participant nodes execute `MayimAcharonim.complete()`.
* All participant nodes execute `BirkatHamazon.start()`.
* `END Protocol`.
* `// Decision Branch 2: Majority has NOT done Mayim Acharonim` (A.H. 190:7, 'ואם יש מעטים שעשו')
* `ELSE IF (ma_not_completed_count > ma_completed_count)` // i.e., majority has NOT done MA
* `THEN`:
* `Zimun.start()` is immediately initiated by `mezamen`.
* All participant nodes (`omerim`) respond.
* `// Conditional Handling for 'ma_completed' nodes`
* `FOR EACH participant_node IN Participants:`
* `IF (participant_node.has_completed_MayimAcharonim)`
* `THEN`: `participant_node.await(ZimunResponseCompletion)`. // Await zimun response, but do not re-wash.
* `ELSE`:
* `participant_node.execute(MayimAcharonim.complete())`.
* All participant nodes execute `BirkatHamazon.start()`.
* `END Protocol`.
* `// Decision Branch 3: Majority HAS done Mayim Acharonim` (A.H. 190:7, 'ואם רובן עשו')
* `ELSE IF (ma_completed_count >= ma_not_completed_count)` // i.e., majority HAS done MA
* `THEN`:
* `Zimun.start()` is immediately initiated by `mezamen`.
* All participant nodes (`omerim`) respond.
* `// Conditional Handling for 'ma_not_completed' nodes`
* `FOR EACH participant_node IN Participants:`
* `IF (participant_node.has_completed_MayimAcharonim)`
* `THEN`: `participant_node.await(ZimunResponseCompletion)`.
* `ELSE`:
* `participant_node.execute(MayimAcharonim.complete())`. // They do it *after* zimun.
* All participant nodes execute `BirkatHamazon.start()`.
* `END Protocol`.
END BirkatHamazonProtocol_Initiation_Flow
Explanation of the Flow Model:
This model highlights the Arukh HaShulchan's sophisticated approach to dynamic state management. The key insights are:
- Precondition Check (
Participants.count()): The first step is always to determine ifZimunis even necessary. This is a basic system check. - Dynamic State Assessment (
ma_completed_count): IfZimunis required, the system doesn't assume a uniform state. Instead, it queries theMayimAcharonimstatus of all individual participant nodes. This is crucial for handling real-world scenarios where not everyone is perfectly synchronized. - Conditional Execution Paths: Based on the
MayimAcharonimstatus, the protocol branches into different execution paths.- Ideal Path (Branch 1): If
ma_completed_count == 0, the system prioritizesZimun.start()before anyMayimAcharonim.complete(). This is the purest implementation of the rule thatzimunshould precedemayim acharonimto ensure collective focus and prevent pre-emptive departures. This rule is explicitly stated in Arukh HaShulchan 190:6: "דאין לעשות מים אחרונים קודם הזמון... משום דהזמון מצוה ברוב עם..." (One should not do mayim acharonim before zimun... because zimun is a mitzvah with a multitude...). - Compromise Paths (Branches 2 & 3): These branches handle the non-ideal, but common, scenario where participants are not perfectly synchronized. The Arukh HaShulchan in 190:7 provides a pragmatic solution.
- If the majority has not done
MayimAcharonim(Branch 2),Zimun.start()proceeds immediately. Those who have done it simply wait (theirMayimAcharonimis still valid). Those who haven't then perform it afterZimun.start()but beforeBirkatHamazon.start(). This prioritizes theZimun's collective nature while accommodating individual states. - If the majority has done
MayimAcharonim(Branch 3),Zimun.start()still proceeds immediately. This is to avoid unnecessary delay, as the majority is already in aready_for_birkat_hamazonstate. The minority who haven't doneMayimAcharonimwill perform it afterZimun.start(). This is a significant point: the Arukh HaShulchan permitsMayimAcharonimafterZimunfor the minority in this specific scenario, demonstrating a flexible approach to maintain system throughput when a majority is ready.
- If the majority has not done
- Ideal Path (Branch 1): If
This decision tree illustrates how the Arukh HaShulchan provides a robust, fault-tolerant protocol. It defines an ideal state but also specifies recovery mechanisms and alternative valid paths when the ideal cannot be met due to asynchronous individual actions, ensuring that the core Zimun operation remains transactional and consistent. The problem isn't just about what should happen, but what to do when the system isn't in its pristine initial state.
Full Experience in the App
Listen. Chat. Go deeper.
Audio playback, interactive chevruta, Hebrew tools, and every daily learning track — only in Derekh Learning.
Text Snapshot: Core Data Points from Arukh HaShulchan
To ground our system analysis, let's look at the critical lines of code (err, text) from the Arukh HaShulchan, Orach Chaim, which serve as our primary specification documents.
Arukh HaShulchan, Orach Chaim 190:6
"אין לעשות מים אחרונים קודם הזמון אלא אחר הזמון מפני שהזמון מצוה ברוב עם ואם יעשו מים אחרונים קודם הזמון יש לחוש שמא יסיחו דעתן או יצאו משם ואז יתבטל הזמון" (One should not do mayim acharonim before zimun, but rather after zimun, because zimun is a mitzvah with a multitude, and if they do mayim acharonim before zimun, there is concern that they might distract their minds or leave from there, and then the zimun will be nullified.) Sefaria Permalink: Arukh HaShulchan, Orach Chaim 190:6
- Anchor Point 190.6a: "אין לעשות מים אחרונים קודם הזמון אלא אחר הזמון" - Establishes the primary
Zimun-Then-MayimAcharonimordering. This is our default, ideal sequence. - Anchor Point 190.6b: "מפני שהזמון מצוה ברוב עם ואם יעשו מים אחרונים קודם הזמון יש לחוש שמא יסיחו דעתן או יצאו משם ואז יתבטל הזמון" - Provides the
System.Rationale(): PreventingZimunStateCorrupteddue toParticipantDistractionorParticipantDeparture. This is the corebugprevention logic.
Arukh HaShulchan, Orach Chaim 190:7
"ואם יש מעטים שעשו מים אחרונים אין בכך כלום וימתינו עד שיעשו כולם ויזמנו אבל אם רובן עשו מים אחרונים יש לזמן מיד ואותן המעטים שלא עשו יעשו מים אחרונים אחר הזמון" (If there are a few who have done mayim acharonim, there is no issue, and they should wait until everyone performs it, and then they make zimun. But if the majority have done mayim acharonim, one should make zimun immediately, and those few who have not done it should perform mayim acharonim after zimun.) Sefaria Permalink: Arukh HaShulchan, Orach Chaim 190:7
- Anchor Point 190.7a: "ואם יש מעטים שעשו מים אחרונים אין בכך כלום וימתינו עד שיעשו כולם ויזמנו" - Defines behavior for
MinorityMayimAcharonimCompletestate: The minority waits, andZimunproceeds after the majority completesMayimAcharonim. This implies aZimun.start()after allMayimAcharonim.complete(). - Anchor Point 190.7b: "אבל אם רובן עשו מים אחרונים יש לזמן מיד ואותן המעטים שלא עשו יעשו מים אחרונים אחר הזמון" - Defines behavior for
MajorityMayimAcharonimCompletestate:Zimun.start()immediately, with the minority performingMayimAcharonimafterZimun. This is a crucial override of the general rule in 190.6a.
Arukh HaShulchan, Orach Chaim 190:8
"אחד מן השלשה שזמנו ועמד והלך קודם ברכת המזון כיון שנתחייב בזמון הרי הוא בכללם וצריך לשמוע ברכת המזון מאותו שמברך ואין לו לברך לעצמו" (One of the three who made zimun and stood up and left before Birkat Hamazon: Since he became obligated in zimun, he is included in them, and must hear Birkat Hamazon from the one who blesses, and should not bless for himself.) Sefaria Permalink: Arukh_HaShulchan%2C_Orach_Chaim.190.8
- Anchor Point 190.8a: "כיון שנתחייב בזמון הרי הוא בכללם וצריך לשמוע ברכת המזון מאותו שמברך" - Establishes
Zimun.Commit()as a binding operation. Once zimun is performed, the participant's state shifts toObligatedToHearBirkatHamazon, regardless of physical presence at the table. This is critical for understanding transactional integrity.
These text snippets are the source code for our analysis. They define the desired system behavior, the reasons for those behaviors, and the conditional logic for handling deviations from the ideal.
Multiple Implementations: Algorithms for Zimun Synchronization
The Arukh HaShulchan, while presenting a unified psak (ruling), often synthesizes or reflects different underlying algorithmic approaches from earlier authorities (Rishonim) or even different logical priorities. We can model these as distinct BirkatHamazonProtocol implementations, each with its own optimization strategy and robustness profile. Let's explore four such algorithms.
Implementation A: StrictPreconditionProtocol (The "Fail Fast" Approach)
This algorithm prioritizes the integrity of the Zimun as a fully synchronized, collective event. It adopts a "fail-fast" or "strict precondition" model, akin to a database transaction that requires all preparatory steps to be completed before the COMMIT command.
Design Philosophy:
This approach emphasizes the chashash (concern) mentioned in Arukh HaShulchan 190:6b: "שמא יסיחו דעתן או יצאו משם ואז יתבטל הזמון" (lest they distract their minds or leave from there, and then the zimun will be nullified). To mitigate this risk, StrictPreconditionProtocol mandates that all individual preparatory actions, specifically MayimAcharonim.complete(), must be finalized before Zimun.start() can be invoked. It treats the entire group as a single, atomic unit for the Zimun phase.
Operational Steps:
ZimunEligibilityCheck:mezamenchecksParticipants.count() >= 3.MayimAcharonimPreconditionCheck:mezamenbroadcasts aQUERY_MAYIM_ACHARONIM_STATUSto allomerimnodes.- Each
omernode responds withMA_COMPLETEorMA_PENDING.
- Each
PreconditionEnforcement:IF (ALL participants.status == MA_COMPLETE OR ALL participants.status == MA_PENDING):- If all are
MA_PENDING(ideal state),mezamenissuesZimun.start(). - If some are
MA_PENDINGand some areMA_COMPLETE(mixed state):IF (minority_is_MA_COMPLETE): Themezamenissues aWAIT_FOR_MA_COMPLETIONcommand to theMA_PENDINGnodes. TheMA_COMPLETEnodes enterAWAIT_ZIMUNstate.Zimun.start()is delayed until allMA_PENDINGnodes becomeMA_COMPLETE. This aligns with Arukh HaShulchan 190:7a where a minority who completedMAwaits for the rest.ELSE IF (majority_is_MA_COMPLETE): This is whereStrictPreconditionProtocoldiffers from Arukh HaShulchan 190:7b. A strictly "fail-fast" approach would still wait for allMA_PENDINGnodes to completeMayimAcharonimbeforeZimun.start(). It would prioritize uniform state over immediate progression. This is a more rigid interpretation of 190:6a, where no one should doMAbeforeZimun, implyingZimunonly starts whenMAis uniformly addressed (either universally pending or universally completed).
- If all are
ZimunExecution: Once all preconditions are met (allMAeither done or pending for all, and the decision is made to proceed),Zimun.start()is invoked.BirkatHamazonExecution: All participants proceed withBirkatHamazon.start().
Pros:
- High Integrity: Ensures the
Zimunis performed with maximum collective focus and commitment, minimizing distractions or departures. - Predictable State: The system state regarding
MayimAcharonimis always known and uniform at theZimun.start()point. - Reduced Race Conditions: By enforcing strict sequencing, it avoids ambiguities about who does what when.
Cons:
- Low Throughput/User Experience: Can lead to delays if even one participant is slow in performing
MayimAcharonim. This creates a bottleneck. - Rigidity: Less adaptable to real-world scenarios where perfect synchronization is hard to achieve.
- Potential for Deadlock: If a participant node fails to complete
MayimAcharonim(e.g., gets distracted indefinitely), theZimunmight never start.
This protocol aligns with a more conservative view, prioritizing the ideal order and preventing potential issues, even at the cost of flexibility. It's like a transactional system that rolls back if any part of the commit sequence isn't perfectly aligned.
Implementation B: OptimisticAsynchronousProtocol (The "Flexible First, Fix Later" Approach)
This algorithm takes a more pragmatic, "optimistic" approach, seeking to minimize delays and optimize for throughput. It allows for a degree of asynchronous operation, addressing individual MayimAcharonim status dynamically rather than as a strict global precondition.
Design Philosophy:
This approach leans into the flexibility seen in Arukh HaShulchan 190:7b, which allows MayimAcharonim after Zimun for a minority. It assumes that participants are generally committed and that minor deviations in individual state can be resolved without halting the collective process. It prioritizes the timely initiation of Zimun to maintain momentum.
Operational Steps:
ZimunEligibilityCheck:mezamenchecksParticipants.count() >= 3.ImmediateZimunInitiation:mezamenimmediately issuesZimun.start(), without a prior comprehensiveMayimAcharonimstatus check. This is the core difference.AsynchronousMayimAcharonimResolution:- All
omerimnodes respond toZimun.start(). FOR EACH participant_node IN Participants:IF (participant_node.has_completed_MayimAcharonim):participant_node.state = READY_FOR_BIRKAT_HAMAZON.ELSE (participant_node.has_NOT_completed_MayimAcharonim):participant_node.execute(MayimAcharonim.complete())now, afterZimun.start(). This is permitted because theZimuncommitment has already been made.
- All
BirkatHamazonExecution: Once all individualMayimAcharonimtasks are completed (asynchronously in parallel, if needed), all participants proceed withBirkatHamazon.start().
Pros:
- High Throughput/User Experience: Minimizes delays, allowing
Zimunto start quickly even if some participants are not fully synchronized. - Flexibility: Adapts well to real-world scenarios where perfect initial synchronization is rare.
- Reduced Bottlenecks: No single participant can hold up the entire
Zimunprocess.
Cons:
- Lower Initial Integrity: The
Zimunmight start with some participants still in a "preparatory" state, potentially reducing the initial collective focus. - Increased Risk of
ParticipantDistraction: WhileZimunbinds them, the act of going to wash afterZimunstill presents an opportunity for distraction or delay before Birkat Hamazon. - State Management Complexity: Requires careful handling of individual states after
Zimun.start()to ensure everyone eventually completesMayimAcharonim.
This protocol represents an interpretation that prioritizes immediate Zimun and trusts participants to complete their individual obligations promptly thereafter. It aligns with the idea that the Zimun itself is the primary commitment, and mayim acharonim can be a post-Zimun individual task if necessary, as long as it's done before Birkat Hamazon. This is essentially what Arukh HaShulchan 190:7b prescribes for the minority.
Implementation C: HybridMajorityConsensusProtocol (The "Arukh HaShulchan Synthesis" Approach)
This algorithm represents the actual synthesis presented by the Arukh HaShulchan, combining elements of strictness and flexibility. It's a nuanced approach that uses a dynamic threshold (majority/minority) to determine the optimal flow, trying to achieve both robustness and efficiency.
Design Philosophy:
The Arukh HaShulchan seeks to honor the spirit of 190:6 (Zimun before Mayim Acharonim) while providing practical guidance for when that ideal state is not present, as seen in 190:7. This protocol is designed to be robust against common deviations and optimize for the most common scenarios. It's a "smart" protocol that adapts its behavior based on the current system state, specifically the MayimAcharonim status of its nodes.
Operational Steps:
ZimunEligibilityCheck:mezamenchecksParticipants.count() >= 3.MayimAcharonimStateAssessment:mezamenqueries allomerimnodes for theirMayimAcharonimstatus, calculatingma_completed_countandma_not_completed_count.ConditionalZimunInitiation:- Scenario 1: Ideal State (All
MA_PENDING) (A.H. 190:6a, implicitly)IF (ma_completed_count == 0):mezamenissuesZimun.start().- All
omerimrespond. - All
omerimperformMayimAcharonim.complete().
- Scenario 2: Minority
MA_COMPLETE(A.H. 190:7a)ELSE IF (ma_not_completed_count > ma_completed_count): // Majority has NOT done MA- The
mezameninstructs theMA_COMPLETEminority toAWAIT_MAYIM_ACHARONIM_COMPLETIONfrom the majority. - The
MA_NOT_COMPLETEmajority performsMayimAcharonim.complete(). - Once all participants are
MA_COMPLETE,mezamenissuesZimun.start().
- The
- Scenario 3: Majority
MA_COMPLETE(A.H. 190:7b)ELSE IF (ma_completed_count >= ma_not_completed_count): // Majority HAS done MAmezamenimmediately issuesZimun.start().- All
omerimrespond. - The
MA_NOT_COMPLETEminority performsMayimAcharonim.complete()afterZimun.start().
- Scenario 1: Ideal State (All
BirkatHamazonExecution: Once all individualMayimAcharonimtasks are completed andZimunis done, all participants proceed withBirkatHamazon.start().
Pros:
- Optimized Balance: Strikes a balance between strictness and flexibility, achieving both integrity and efficiency.
- Adaptive Behavior: Dynamically adjusts the protocol flow based on the current state of the participant nodes.
- Practicality: Reflects a realistic approach to group dynamics, acknowledging that perfect synchronization isn't always achievable.
- Robustness: Handles common deviations gracefully without breaking the ritual.
Cons:
- Increased Complexity: The conditional logic (
if/else if) is more intricate than the simpler "always strict" or "always optimistic" models. - Requires State Query: Necessitates an initial query of
MayimAcharonimstatus from all nodes, which adds a step. - Potential for Misinterpretation: The nuanced rules might be misapplied if the majority/minority conditions aren't correctly assessed.
This HybridMajorityConsensusProtocol is the most sophisticated and, arguably, the most "production-ready" algorithm, as it directly mirrors the Arukh HaShulchan's comprehensive ruling. It intelligently navigates the trade-offs between ideal behavior and practical necessity.
Implementation D: TransactionalCommitProtocol (The "Binding Obligation" Approach)
While the previous protocols focused on the ordering of Zimun and Mayim Acharonim, this implementation focuses on the binding nature of Zimun itself, as illuminated by Arukh HaShulchan 190:8. It views Zimun as a transaction that, once committed, fundamentally alters the state and obligations of all participants.
Design Philosophy:
This algorithm treats Zimun.start() as a COMMIT operation in a database. Once this COMMIT is executed, the Zimun is considered "locked-in." Any participant who was part of the quorum at the time of Zimun.start() transitions to a STATE: OBLIGATED_FOR_BIRKAT_HAMAZON. This state persists even if physical presence or individual readiness changes after the Zimun. The emphasis is on the meta-state of commitment rather than just the physical or preparatory state.
Operational Steps:
ZimunEligibilityCheck:mezamenchecksParticipants.count() >= 3.Pre-Zimun State Preparation: (This step can incorporate elements from A, B, or C regardingMayimAcharonimtiming, but the core focus is on what happens afterZimunis committed). For simplicity, let's assumeHybridMajorityConsensusProtocolforMayimAcharonimhandling.Zimun.start()&COMMIT:mezameninitiatesZimun.start().- All currently present and eligible
omerimrespond. - At this point, the
ZimunisCOMMITTED. All participants who responded are now inSTATE: OBLIGATED_FOR_BIRKAT_HAMAZON. This state is robust against subsequent physical changes.
Post-Commit Individual Actions:- If
MayimAcharonimis still pending for any participant (per the logic of Protocol C), they complete it now. - Crucially: If a participant (e.g.,
participantX) leaves the table afterZimun.start()but beforeBirkatHamazon.start(), theirSTATEremainsOBLIGATED_FOR_BIRKAT_HAMAZON.participantX.obligation = HEAR_BIRKAT_HAMAZON_FROM_MEZAMEN.participantX.self_blessing_allowed = FALSE. (A.H. 190:8a)
- If
BirkatHamazonExecution: ThemezamenperformsBirkatHamazon.start(). AllOBLIGATED_FOR_BIRKAT_HAMAZONnodes (even remote ones) fulfill their obligation by hearing the blessing.
Pros:
- High Transactional Integrity: Ensures that once the
Zimuncommitment is made, the collective mitzvah cannot be undermined by subsequent individual actions or departures. - Clear Obligation Model: Defines precise obligations for participants post-
Zimun, regardless of their physical status. - Robustness against Disconnections: Analogous to a distributed system that ensures data consistency even if nodes go offline after a commit. The obligation remains.
Cons:
- Potential for User Frustration: A participant who leaves might feel inconvenienced by the continued obligation to hear the blessing.
- Relies on External Factors: For the obligation to be fulfilled, the departing participant must actually hear the blessing, which might require physical proximity or active listening (e.g., via speakerphone in a modern context, though not explicitly discussed in A.H.).
- Less Focus on Pre-Commit State: This protocol primarily addresses post-
Zimunbehavior, assuming theZimunitself was correctly initiated (which would draw on protocols A, B, or C).
This TransactionalCommitProtocol underscores the profound legal and spiritual implications of Zimun. It's not just a declaration; it's a binding contract that establishes a new, persistent state for all involved parties, ensuring the mitzvah is fully realized even across spatial or temporal discontinuities, much like a blockchain transaction is immutable once committed.
The Arukh HaShulchan, through these various rules, effectively builds a multi-layered protocol, addressing initial state, dynamic state changes, and the ultimate binding nature of the Zimun itself. It’s a masterclass in designing a resilient, human-centric distributed system.
Edge Cases: Inputs That Stress the BirkatHamazonProtocol
Now let's throw some curveballs at our BirkatHamazonProtocol implementations. These "edge cases" are critical for understanding the robustness and specific behavior of each algorithm when faced with non-ideal, but common, real-world scenarios. We'll examine how each of our four protocols (A: StrictPreconditionProtocol, B: OptimisticAsynchronousProtocol, C: HybridMajorityConsensusProtocol, D: TransactionalCommitProtocol) handles these inputs.
Edge Case 1: The LateJoiner
Input: A group of 3 (Alice, Bob, Carol) finishes eating and initiates Zimun. Just as the mezamen (Alice) starts the Zimun call ("Rabotai Nevarech!"), a fourth person (David) finishes his meal and approaches the table, wanting to join the Zimun. David has not done Mayim Acharonim.
Expected Output for Each Algorithm:
- Algorithm A (
StrictPreconditionProtocol):- Behavior: This algorithm is highly rigid. Since
Zimunhas started, the quorum is "locked" with Alice, Bob, and Carol. David is too late. Even if David could be added, the protocol would then need to check hisMayim Acharonimstatus, and since he hasn't done it, it would delay the entire process for Alice, Bob, and Carol, which is not permitted mid-Zimun. - Outcome: David cannot join the current
Zimun. He would need to performBirkat Hamazonindividually. The original three proceed without him. The system favors the integrity of the initiatedZimunover expanding the quorum dynamically.
- Behavior: This algorithm is highly rigid. Since
- Algorithm B (
OptimisticAsynchronousProtocol):- Behavior: This protocol prioritizes getting
Zimunstarted. WhileZimunhas just begun, it's possible a highly optimistic system might attempt to incorporate David. However, givenZimunis a call-and-response, adding a participant mid-response is problematic. The most likely scenario is that theZimunproceeds with the original three, and David performsBirkat Hamazonindividually. If David were to join beforeZimunbegan, this algorithm would likely allow it, and David would doMayim AcharonimafterZimun(along with anyone else who hadn't). But mid-Zimun, it's too late for a clean integration. - Outcome: David performs
Birkat Hamazonindividually. The existingZimunwith three participants continues.
- Behavior: This protocol prioritizes getting
- Algorithm C (
HybridMajorityConsensusProtocol):- Behavior: This protocol is based on the Arukh HaShulchan's synthesis. The Arukh HaShulchan 190:8 implies that once
Zimunis initiated andנתחייב בזמון(became obligated in zimun), the participants are fixed. ALateJoinerafterZimun.start()is not accommodated. The pre-Zimunstate assessment (majority/minorityMayim Acharonim) happens beforeZimunbegins, and David missed that window. - Outcome: David performs
Birkat Hamazonindividually. TheZimunwith Alice, Bob, and Carol proceeds.
- Behavior: This protocol is based on the Arukh HaShulchan's synthesis. The Arukh HaShulchan 190:8 implies that once
- Algorithm D (
TransactionalCommitProtocol):- Behavior: This protocol emphasizes the
COMMITnature ofZimun. OnceZimun.start()is invoked, the transaction is effectively in progress, and the participant list is 'frozen'. Attempting to add a new participant at this stage would violate the transactional integrity. - Outcome: David cannot join the
Zimunand performsBirkat Hamazonindividually. The initial quorum is locked.
- Behavior: This protocol emphasizes the
Consensus: All protocols generally agree: a LateJoiner after Zimun.start() cannot join the ongoing Zimun. The system prioritizes the integrity of the initiated collective ritual.
Edge Case 2: The EarlyLeaver (Post-Zimun, Pre-Birkat Hamazon)
Input: A group of 3 (Alice, Bob, Carol) completes Zimun. The mezamen (Alice) has said "Nevarech," and Bob and Carol have responded "Yehi Shem Hashem..." Now, before Alice begins Birkat Hamazon, Carol announces she must leave immediately.
Expected Output for Each Algorithm:
- Algorithm A (
StrictPreconditionProtocol):- Behavior: This protocol, while strict on preconditions, doesn't explicitly define post-
Zimunleaving behavior. However, its underlying philosophy would suggest that any action that compromises the collective integrity before the mitzvah is fully completed (i.e., Birkat Hamazon said) is problematic. It would likely view Carol's departure as a quorum loss mid-mitzvah. - Outcome: This is ambiguous. A strict interpretation might argue that the Birkat Hamazon now proceeds with only two, invalidating the zimun aspect, or requiring Alice and Bob to restart with a new third (if available). However, the Arukh HaShulchan 190:8 explicitly addresses this. Without that specific rule, a strict protocol might struggle.
- Behavior: This protocol, while strict on preconditions, doesn't explicitly define post-
- Algorithm B (
OptimisticAsynchronousProtocol):- Behavior: This protocol is flexible, but
Zimunitself is a collective declaration. AnEarlyLeaverafterZimunbut before Birkat Hamazon is a problem for any protocol that values the quorum for the full mitzvah. This protocol would also likely struggle without a specific rule like A.H. 190:8. - Outcome: Similar ambiguity as Protocol A.
- Behavior: This protocol is flexible, but
- Algorithm C (
HybridMajorityConsensusProtocol):- Behavior: This protocol incorporates Arukh HaShulchan 190:8 directly. Once
Zimunis performed, Carol isנתחייב בזמון(obligated in zimun). Her departure does not nullify theZimunfor the remaining two (Alice and Bob), who can continue. Carol herself is still bound by theZimunand must hear Alice'sBirkat Hamazon(e.g., by remaining within earshot or returning briefly). - Outcome: Alice and Bob proceed with
Birkat Hamazonwith zimun. Carol must still hear Alice's blessing.
- Behavior: This protocol incorporates Arukh HaShulchan 190:8 directly. Once
- Algorithm D (
TransactionalCommitProtocol):- Behavior: This is the exact scenario this protocol is designed for.
Zimun.start()is theCOMMITpoint. Once Carol responded toZimun, herSTATEbecameOBLIGATED_FOR_BIRKAT_HAMAZON. Her physical departure does not revert this state. The remaining quorum (Alice and Bob, who are alsoOBLIGATED) continues withBirkat Hamazon. Carol must fulfill her obligation to hear Alice's blessing. - Outcome: Alice and Bob proceed with
Birkat Hamazonwith zimun. Carol must still hear Alice's blessing, fulfilling herOBLIGATEDstate.
- Behavior: This is the exact scenario this protocol is designed for.
Consensus: Protocols C and D (which explicitly incorporate A.H. 190:8) handle this gracefully, maintaining the Zimun's validity and the leaver's obligation. Protocols A and B would likely lead to ambiguity or require a "restart" if A.H. 190:8 wasn't considered.
Edge Case 3: The MayimAcharonimAsynchronousPerformer (Mixed State)
Input: A group of 5 (Alice, Bob, Carol, David, Eve) finishes eating. Alice, Bob, and Carol have already performed Mayim Acharonim. David and Eve have not. The mezamen (Alice) wants to initiate Zimun.
Expected Output for Each Algorithm:
- Algorithm A (
StrictPreconditionProtocol):- Behavior: This protocol is very strict. It would require all participants to be in a uniform state. Since David and Eve have not done
Mayim Acharonim,Zimuncannot proceed. Alice would instruct David and Eve to completeMayim Acharonimfirst. Only once all 5 are inMA_COMPLETEstate wouldZimun.start()be allowed. - Outcome:
Zimunis delayed. David and Eve must performMayim AcharonimbeforeZimuncan begin.
- Behavior: This protocol is very strict. It would require all participants to be in a uniform state. Since David and Eve have not done
- Algorithm B (
OptimisticAsynchronousProtocol):- Behavior: This protocol prioritizes immediate
Zimun. Alice would initiateZimun.start()immediately. All 5 respond. Then, David and Eve would performMayim AcharonimafterZimunbut beforeBirkat Hamazon. Alice, Bob, and Carol (who already didMA) simply wait. - Outcome:
Zimunstarts immediately. David and Eve performMayim AcharonimafterZimun.
- Behavior: This protocol prioritizes immediate
- Algorithm C (
HybridMajorityConsensusProtocol):- Behavior: This is the specific scenario Arukh HaShulchan 190:7 addresses.
ma_completed_count = 3(Alice, Bob, Carol)ma_not_completed_count = 2(David, Eve)- Since
ma_completed_count(3) is greater thanma_not_completed_count(2), the majority has performedMayim Acharonim. - Therefore,
mezamen(Alice) initiatesZimun.start()immediately (A.H. 190:7b). All 5 respond. David and Eve then performMayim AcharonimafterZimun.
- Outcome:
Zimunstarts immediately. David and Eve performMayim AcharonimafterZimun. This matches Protocol B for this specific input.
- Behavior: This is the specific scenario Arukh HaShulchan 190:7 addresses.
- Algorithm D (
TransactionalCommitProtocol):- Behavior: This protocol's primary focus is on the binding nature of
Zimun. It would likely follow theMayim Acharonimtiming rules of Protocol C (its underlyingPre-Zimun State Preparation). - Outcome: Identical to Protocol C:
Zimunstarts immediately, David and Eve performMayim AcharonimafterZimun.
- Behavior: This protocol's primary focus is on the binding nature of
Consensus: Protocols B, C, and D (through C) allow Zimun to proceed immediately, with the minority performing Mayim Acharonim after Zimun. Protocol A would delay Zimun until all perform Mayim Acharonim first.
Edge Case 4: The InterruptedZimun
Input: A group of 10 starts Zimun. The mezamen (Rabbi Goldstein) says "Nevarech," and 9 others respond "Yehi Shem Hashem..." Just as Rabbi Goldstein is about to begin the Birkat Hamazon proper, a fire alarm blares loudly, requiring everyone to evacuate the building immediately. After 15 minutes, the alarm is cleared, and everyone returns to the table.
Expected Output for Each Algorithm:
- Algorithm A (
StrictPreconditionProtocol):- Behavior: This protocol is highly sensitive to state integrity. A significant interruption like a fire alarm, especially before
Birkat Hamazonitself, would likely be seen as a state corruption. The collective focus and continuous flow are broken. It would likely require a full restart. - Outcome: The
Zimunis considered invalid due to the interruption. A newZimunmust be initiated from scratch (if conditions allow).
- Behavior: This protocol is highly sensitive to state integrity. A significant interruption like a fire alarm, especially before
- Algorithm B (
OptimisticAsynchronousProtocol):- Behavior: While optimistic, a total evacuation is a major disruption. The "optimism" typically applies to individual
Mayim Acharonimtiming, not a complete system halt and dispersion. TheZimunrelies on collective presence and attention. A 15-minute break and physical relocation would likely break theZimun's continuity. - Outcome: The
Zimunis considered invalid. A newZimunmust be initiated.
- Behavior: While optimistic, a total evacuation is a major disruption. The "optimism" typically applies to individual
- Algorithm C (
HybridMajorityConsensusProtocol):- Behavior: The Arukh HaShulchan doesn't explicitly discuss interruptions of this magnitude. However, the underlying rationale for
Zimun(being amitzvah b'rov am– with a multitude, requiring focus) suggests that a complete disruption would negate it. The spirit of 190:6b ("שמא יסיחו דעתן") is very relevant here – a fire alarm is the ultimate distraction. - Outcome: The
Zimunis considered invalid. A newZimunmust be initiated.
- Behavior: The Arukh HaShulchan doesn't explicitly discuss interruptions of this magnitude. However, the underlying rationale for
- Algorithm D (
TransactionalCommitProtocol):- Behavior: This protocol states that once
Zimunis committed, the obligation remains (A.H. 190:8). However, this applies to individual departure, not a collective system shutdown. A system-wide event like an evacuation fundamentally breaks the communal context. The obligation for Birkat Hamazon still exists, but the zimun aspect, which requires a collective, continuous presence for its fulfillment, is likely lost. TheCOMMITwas for the zimun itself, but the delivery of the subsequentBirkat Hamazonwas interrupted. - Outcome: The
Zimunis considered invalid as a collective act. Participants are still obligated to sayBirkat Hamazonindividually. A newZimuncannot simply resume; it would need to be re-initiated if they desire to do so (and quorum is still present).
- Behavior: This protocol states that once
Consensus: All protocols would likely agree that a severe, collective interruption like an evacuation nullifies the prior Zimun. The emphasis on rov am (multitude) and continuous attention (prevention of הסחת הדעת) is paramount. The system state has been so dramatically altered that a RESET is necessary.
Edge Case 5: The PartialQuorumDegradation
Input: A group of 10 starts Zimun for 10. They all respond. Then, 5 people immediately leave (post-Zimun, pre-Birkat Hamazon). Then, 2 more people leave. Now only 3 remain (the original mezamen and two others).
Expected Output for Each Algorithm:
- Algorithm A (
StrictPreconditionProtocol):- Behavior: This protocol is not robust to post-
Zimunchanges. The initialZimunwas for 10. While themezamenand two others remain, the significant degradation of the quorum (from 10 to 3) might challenge the initialZimun's spirit, even if not its technical validity (per A.H. 190:8). - Outcome: Ambiguous. Without A.H. 190:8, this would be a major problem. With A.H. 190:8 (which is really part of C and D), the remaining 3 could proceed with zimun, and the others are obligated to hear.
- Behavior: This protocol is not robust to post-
- Algorithm B (
OptimisticAsynchronousProtocol):- Behavior: Similar to Protocol A, this focuses on initial flexibility, not post-
Zimunquorum maintenance. It would face the same ambiguity without explicit rules for post-Zimunquorum changes. - Outcome: Ambiguous.
- Behavior: Similar to Protocol A, this focuses on initial flexibility, not post-
- Algorithm C (
HybridMajorityConsensusProtocol):- Behavior: This protocol incorporates Arukh HaShulchan 190:8. The
Zimunwas initiated for 10. OnceZimunis performed, all 10 areOBLIGATED. Even if 7 leave, theZimunfor 10 is still considered valid, and the remaining 3 can proceed. The 7 who left are still obligated to hear theBirkat Hamazonfrom themezamen. The fact that the physical presence degraded to a minimum quorum of 3 doesn't invalidate the originalZimunfor 10. - Outcome: The remaining 3 proceed with
Birkat Hamazonwith zimun (for 10). The 7 who left are still obligated to hear theBirkat Hamazon.
- Behavior: This protocol incorporates Arukh HaShulchan 190:8. The
- Algorithm D (
TransactionalCommitProtocol):- Behavior: This is a perfect test for this protocol. The
Zimunfor 10 was theCOMMIT. All 10 are now inSTATE: OBLIGATED_FOR_BIRKAT_HAMAZON. The physical departure of 7 nodes does not roll back thisCOMMIT. The remaining 3 nodes are sufficient to executeBirkatHamazon.start(), and the 7 departed nodes remainOBLIGATEDto listen. - Outcome: The remaining 3 proceed with
Birkat Hamazonwith zimun (for 10). The 7 who left are still obligated to hear theBirkat Hamazon.
- Behavior: This is a perfect test for this protocol. The
Consensus: Protocols C and D, which leverage the TransactionalCommitProtocol aspect from A.H. 190:8, handle this scenario robustly. The Zimun's validity is maintained, and the obligation of all participants is preserved, despite physical quorum degradation. Protocols A and B, without explicitly adopting 190:8, would struggle here.
These edge cases demonstrate the subtle complexities inherent in designing a protocol for a ritual involving human agents. The Arukh HaShulchan's rulings are not just prescriptive; they are deeply insightful about system behavior under stress, offering nuanced solutions that balance ideal states with practical realities.
Refactor: Introducing the ZimunTransaction.Lock() Mechanism
The core "bug" identified in our problem statement is the race condition and state inconsistency potential between Zimun.start() and MayimAcharonim.complete(), particularly when participants are not perfectly synchronized. The Arukh HaShulchan's HybridMajorityConsensusProtocol (our Algorithm C) already provides a sophisticated solution. However, we can distill its essence into a single, clarifying refactor that makes the underlying principle even more explicit and robust.
The Proposed Refactor: ZimunTransaction.Lock()
My proposed refactor is to explicitly introduce a ZimunTransaction.Lock() mechanism. This "lock" is a conceptual state that, once acquired, prevents certain actions and enables others, clearly defining the boundaries of the Zimun operation.
Current Implicit Logic (A.H. 190:6-7): The Arukh HaShulchan states:
- Ideally,
Mayim AcharonimafterZimun(190:6a). - Rationale: Prevent
ParticipantDistractionorParticipantDeparture(190:6b). - If a minority has done
MA: Wait for the majority to doMA, thenZimun(190:7a). This effectively meansMAbeforeZimunfor the majority. - If a majority has done
MA:Zimunimmediately, minority doesMAafterZimun(190:7b).
This creates a dynamic decision point, but it's still based on individual MA states before Zimun is fully committed. The challenge is the transition from individual readiness to collective commitment.
The Refactored Rule:
Instead of asking "who has done MA?" and then deciding, we introduce a universal state:
"The Zimun transaction is initiated by the mezamen through a ZimunTransaction.Lock() operation. This lock can only be acquired if the mezamen determines that Zimun can proceed without immediate risk of ParticipantDistraction or ParticipantDeparture due to Mayim Acharonim status. Once ZimunTransaction.Lock() is acquired and confirmed by the omerim responses, all participants are bound, and any remaining MayimAcharonim.complete() operations become post-lock individual tasks, to be executed before BirkatHamazon.start()."
How ZimunTransaction.Lock() Clarifies the Rule:
- Clear Transaction Boundary:
ZimunTransaction.Lock()establishes a definitivestartpoint for the collectiveZimunobligation. Before the lock, individualMayim Acharonimstatus is crucial. After the lock, it transitions to an individual post-Zimuntask. LockPrecondition (mezamen's Determination): Themezamen's role is not just to countMAstatuses but to make a judgment call: "Can I acquire theZimunlock now without breaking the collective?"- Scenario 1 (All MA Pending):
mezamensees no one has doneMA. The risk of distraction/departure beforeZimunis high ifMAis allowed first. So,mezamenacquiresZimunTransaction.Lock(). AllMAis then performed after the lock, as per 190:6a. - Scenario 2 (Minority MA Complete):
mezamensees a minority has doneMA. The risk of distraction/departure from them is low (they are ready). The majority hasn't doneMA. IfZimunproceeds immediately, the majority would doMAafterZimun, risking distraction. Therefore, themezamendelays acquiringZimunTransaction.Lock()until the majority performsMA. This aligns with 190:7a. Here, themezamendetermines that the risk to the majority's focus outweighs the benefit of immediateZimun. - Scenario 3 (Majority MA Complete):
mezamensees a majority has doneMA. The risk ofParticipantDistractionorParticipantDeparturefor the majority is now associated with waiting for the minority. To maintain the momentum and commitment of the majority, themezamenimmediately acquiresZimunTransaction.Lock(). The minority performsMAafter the lock. This aligns with 190:7b. Here, themezamendetermines that the risk of delaying the majority outweighs the risk of the minority doingMAlater.
- Scenario 1 (All MA Pending):
- Binding Effect (
Transaction.Commit()): OnceZimunTransaction.Lock()is successfully acquired (i.e.,Zimunis completed with responses), it behaves like ourTransactionalCommitProtocol. All participants areOBLIGATED_FOR_BIRKAT_HAMAZON, regardless of subsequent individual actions or departures (A.H. 190:8). This makes theZimunoperation truly atomic from the perspective of commitment.
Why This Minimal Change Works:
This refactor doesn't change the halakha, but it clarifies the decision-making process and the state transitions. It provides a single, overarching principle: the mezamen's role is to assess the system's "readiness for ZimunTransaction.Lock()" based on the potential for disruption.
- Simplicity: Instead of memorizing three branching rules, one conceptual lock mechanism explains all three scenarios in 190:6-7. The
mezamenis trying to achieve theZimunTransaction.Lock()in the safest, most efficient way. - Predictability: It makes the system's behavior more predictable by clearly defining when the
Zimun"transaction" begins and what its implications are. - Encapsulation: It encapsulates the concerns of
ParticipantDistractionandParticipantDeparture(A.H. 190:6b) directly into the precondition for acquiring thelock. - Extensibility: This model could easily be extended to other
Zimunrelated halakhot, treatingZimunas a robust, state-changing operation with specific preconditions and post-conditions.
By conceptualizing Zimun as a transaction with an explicit Lock() phase, we gain a clearer, more systematic understanding of the Arukh HaShulchan's nuanced guidance. It's a beautiful example of how seemingly complex rules can often be distilled into elegant, underlying system design principles.
Takeaway + Citations
Phew! What a journey through the distributed system of Birkat Hamazon! We've seen how the Arukh HaShulchan, with the precision of a master architect, designs a robust protocol to ensure the spiritual integrity and communal coherence of zimun and mayim acharonim. It's not just about rules; it's about managing state, preventing race conditions, and handling edge cases in a multi-agent system where human factors are paramount.
From the StrictPreconditionProtocol to the OptimisticAsynchronousProtocol, and finally to the HybridMajorityConsensusProtocol (which is the Arukh HaShulchan's brilliant synthesis) and the TransactionalCommitProtocol (highlighting the binding nature of zimun), we've debugged the Zimun state inconsistency. The elegance lies in its adaptability: defining an ideal flow while providing intelligent recovery mechanisms for when the ideal isn't met. The ultimate goal is always to facilitate the mitzvah in the most spiritually effective and practically viable way.
The lessons from this sugya extend far beyond the dining table. They teach us about designing resilient systems, understanding the trade-offs between rigidity and flexibility, and recognizing that even in the most ancient of traditions, there's a sophisticated "logic engine" at play, constantly optimizing for optimal performance and integrity. Keep coding, keep learning, and keep building beautiful systems—both in the digital realm and in the sacred architecture of halakha!
Citations
- Arukh HaShulchan, Orach Chaim 190:6: https://www.sefaria.org/Arukh_HaShulchan%2C_Orach_Chaim.190.6?lang=he&p2=Arukh_HaShulchan%2C_Orach_Chaim.190.6&lang2=he
- Arukh HaShulchan, Orach Chaim 190:7: https://www.sefaria.org/Arukh_HaShulchan%2C_Orach_Chaim.190.7?lang=he&p2=Arukh_HaShulchan%2C_Orach_Chaim.190.7&lang2=he
- Arukh HaShulchan, Orach Chaim 190:8: https://www.sefaria.org/Arukh_HaShulchan%2C_Orach_Chaim.190.8?lang=he&p2=Arukh_HaShulchan%2C_Orach_Chaim.190.8&lang2=he
- Arukh HaShulchan, Orach Chaim 191:1: https://www.sefaria.org/Arukh_HaShulchan%2C_Orach_Chaim.191.1?lang=he&p2=Arukh_HaShulchan%2C_Orach_Chaim.191.1&lang2=he
- Arukh HaShulchan, Orach Chaim 191:2: https://www.sefaria.org/Arukh_HaShulchan%2C_Orach_Chaim.191.2?lang=he&p2=Arukh_HaShulchan%2C_Orach_Chaim.191.2&lang2=he
- Arukh HaShulchan, Orach Chaim 192:1: https://www.sefaria.org/Arukh_HaShulchan%2C_Orach_Chaim.192.1?lang=he&p2=Arukh_HaShulchan%2C_Orach_Chaim.192.1&lang2=he
- Arukh HaShulchan, Orach Chaim 192:2: https://www.sefaria.org/Arukh_HaShulchan%2C_Orach_Chaim.192.2?lang=he&p2=Arukh_HaShulchan%2C_Orach_Chaim.192.2&lang2=he
derekhlearning.com