# 06 — Test Cases (Phase 1 + Phase 1b + Phase 2) ## Endur Projection Methods QA — Expected Results **Reference period:** March 2026 (and adjacent months where windows cross boundaries) **GBD definition:** Monday–Friday, **US Holiday Calendar applied** (see File 2 Section 9) **Non-GBD roll note — `-Sat+Sun+MonHol-Hol`:** Token-based — Saturday rolls **backward** to Friday (`−Sat`); Sunday rolls forward (`+Sun`); Monday holiday rolls forward; other holiday rolls backward. --- ## US Holiday Calendar | Date | DoW | Holiday | |---|---|---| | 01/01/2026 | Thu | New Year's Day | | 01/19/2026 | Mon | Martin Luther King Jr. Day | | 02/16/2026 | Mon | Presidents' Day | | 04/03/2026 | Fri | Good Friday | | 05/25/2026 | Mon | Memorial Day | | 07/03/2026 | Fri | Independence Day (observed) | | 09/07/2026 | Mon | Labor Day | | 11/26/2026 | Thu | Thanksgiving Day | | 12/25/2026 | Fri | Christmas Day | --- ## Scenario Key | Scenario | BOL Date | DOW | Description | |---|---|---|---| | TC-A | 03/18/2026 | Wed | Normal mid-week, mid-month | | TC-B | 03/27/2026 | Fri | Friday near end of month | | TC-C | 03/28/2026 | Sat | Saturday — Non-GBD roll mandatory | | TC-D | 03/02/2026 | Mon | First GBD of March — window may cross Feb | | TC-E | 03/31/2026 | Tue | Last day of March | | TC-F | 02/27/2026 | Fri | Last GBD of February — EOM edge case | **February 2026 GBD count:** 19 (Presidents' Day 02/16 excluded) **January 2026 GBD count:** 20 (New Year's Day 01/01 + MLK Day 01/19 excluded) **March 2026 GBD count:** 22 --- ## Family A — Event-Anchored Methods > Roll Rule `-Sat+Sun+MonHol-Hol`: token-based, Saturday → Friday (−Sat), Sunday → Monday (+Sun). --- ### X DAYS ARD Event **Family:** A | **Method:** X DAYS ARD Event | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Pivot Offset:** 0d **Before:** -1 GBD | **After:** +1 GBD | **Incl. Pivot:** Yes | **Num_Days:** 3 **Window:** [BOL − 1 GBD, BOL, BOL + 1 GBD] — symmetric 3-day window | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-001 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/18/2026 | Wed | 03/17/2026 | Tue | 03/19/2026 | Thu | 3 | Yes | Symmetric: day before, BOL, day after | | TC-002 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/27/2026 | Fri | 03/26/2026 | Thu | 03/30/2026 | Mon | 3 | Yes | +1 GBD from Fri skips weekend → Mon | | TC-003 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday — Non-GBD roll | 03/27/2026 | Fri | 03/26/2026 | Thu | 03/30/2026 | Mon | 3 | Yes | BOL Sat → −Sat backward → 03/27 Fri; symmetric ±1 GBD | | TC-004 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 02/27/2026 | Fri | 03/03/2026 | Tue | 3 | Yes | −1 GBD crosses Feb/Mar | | TC-005 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/31/2026 | Tue | 03/30/2026 | Mon | 04/01/2026 | Wed | 3 | Yes | +1 GBD crosses Mar/Apr | | TC-006 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/27/2026 | Fri | 02/26/2026 | Thu | 03/02/2026 | Mon | 3 | Yes | +1 GBD from Fri skips weekend → Mon | --- ### Event Date Only **Family:** A | **Method:** Event Date Only | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Before:** 0 | **After:** 0 | **Incl. Pivot:** Yes | **Num_Days:** 1 | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-007 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/18/2026 | Wed | 03/18/2026 | Wed | 03/18/2026 | Wed | 1 | Yes | Single day = BOL | | TC-008 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/27/2026 | Fri | 03/27/2026 | Fri | 03/27/2026 | Fri | 1 | Yes | Single day = BOL | | TC-009 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday — Non-GBD roll | 03/27/2026 | Fri | 03/27/2026 | Fri | 03/27/2026 | Fri | 1 | Yes | BOL Sat → −Sat backward → 03/27 Fri | | TC-010 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/02/2026 | Mon | 1 | Yes | Single day = BOL | | TC-011 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/31/2026 | Tue | 03/31/2026 | Tue | 03/31/2026 | Tue | 1 | Yes | Single day = BOL | | TC-012 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/27/2026 | Fri | 02/27/2026 | Fri | 02/27/2026 | Fri | 1 | Yes | Single day = BOL | --- ### Event +Xdays_Roll Fwd **Family:** A | **Method:** Event +Xdays_Roll Fwd | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Before:** 0 | **After:** +2 GBDs | **Incl. Pivot:** Yes | **Num_Days:** 3 | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-013 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/18/2026 | Wed | 03/18/2026 | Wed | 03/20/2026 | Fri | 3 | Yes | BOL + 2 GBDs forward | | TC-014 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/27/2026 | Fri | 03/27/2026 | Fri | 03/31/2026 | Tue | 3 | Yes | BOL + 2 GBDs forward | | TC-015 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday — Non-GBD roll | 03/27/2026 | Fri | 03/27/2026 | Fri | 03/31/2026 | Tue | 3 | Yes | BOL Sat → −Sat backward → 03/27 Fri; End=03/27+2GBDs=03/31 Tue | | TC-016 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/04/2026 | Wed | 3 | Yes | BOL + 2 GBDs forward | | TC-017 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/31/2026 | Tue | 03/31/2026 | Tue | 04/02/2026 | Thu | 3 | Yes | BOL + 2 GBDs forward | | TC-018 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/27/2026 | Fri | 02/27/2026 | Fri | 03/03/2026 | Tue | 3 | Yes | BOL + 2 GBDs forward | --- ### Event -Xdays_Roll Back **Family:** A | **Method:** Event -Xdays_Roll Back | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Before:** -2 GBDs | **After:** 0 | **Incl. Pivot:** Yes | **Num_Days:** 3 | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-019 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/18/2026 | Wed | 03/16/2026 | Mon | 03/18/2026 | Wed | 3 | Yes | 2 GBDs back to BOL | | TC-020 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/27/2026 | Fri | 03/25/2026 | Wed | 03/27/2026 | Fri | 3 | Yes | 2 GBDs back to BOL | | TC-021 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday — Non-GBD roll | 03/27/2026 | Fri | 03/25/2026 | Wed | 03/27/2026 | Fri | 3 | Yes | BOL Sat → −Sat backward → 03/27 Fri; Start=03/25 Wed | | TC-022 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 02/26/2026 | Thu | 03/02/2026 | Mon | 3 | Yes | 2 GBDs back — crosses Feb | | TC-023 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/31/2026 | Tue | 03/27/2026 | Fri | 03/31/2026 | Tue | 3 | Yes | 2 GBDs back to BOL | | TC-024 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/27/2026 | Fri | 02/25/2026 | Wed | 02/27/2026 | Fri | 3 | Yes | 2 GBDs back to BOL | --- ### Event Date Roll Early **Family:** A | **Method:** Event Date Roll Early | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Before:** -2 GBDs | **After:** +2 GBDs | **Incl. Pivot:** Yes | **Num_Days:** 5 | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-025 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/18/2026 | Wed | 03/16/2026 | Mon | 03/20/2026 | Fri | 5 | Yes | 5-day window around BOL | | TC-026 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/27/2026 | Fri | 03/25/2026 | Wed | 03/31/2026 | Tue | 5 | Yes | 5-day window around BOL | | TC-027 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday — Non-GBD roll | 03/27/2026 | Fri | 03/25/2026 | Wed | 03/31/2026 | Tue | 5 | Yes | BOL Sat → −Sat backward → 03/27 Fri; Start=03/25 Wed, End=03/31 Tue | | TC-028 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 02/26/2026 | Thu | 03/04/2026 | Wed | 5 | Yes | 5-day window — crosses Feb | | TC-029 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/31/2026 | Tue | 03/27/2026 | Fri | 04/02/2026 | Thu | 5 | Yes | 5-day window — crosses Mar/Apr | | TC-030 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/27/2026 | Fri | 02/25/2026 | Wed | 03/03/2026 | Tue | 5 | Yes | 5-day window — crosses Feb/Mar | --- ### X days after Event_Roll Fwd **Family:** A | **Method:** X days after Event_Roll Fwd | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Before:** 0 | **After:** +2 GBDs | **Incl. Pivot:** **No** | **Num_Days:** 2 | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-031 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/18/2026 | Wed | 03/19/2026 | Thu | 03/20/2026 | Fri | 2 | No | 2 GBDs strictly after BOL | | TC-032 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/27/2026 | Fri | 03/30/2026 | Mon | 03/31/2026 | Tue | 2 | No | 2 GBDs strictly after BOL | | TC-033 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday — Non-GBD roll | 03/27/2026 | Fri | 03/30/2026 | Mon | 03/31/2026 | Tue | 2 | No | BOL Sat → −Sat → 03/27 Fri (excl); +1=03/30 Mon, +2=03/31 Tue | | TC-034 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 03/03/2026 | Tue | 03/04/2026 | Wed | 2 | No | 2 GBDs strictly after BOL | | TC-035 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/31/2026 | Tue | 04/01/2026 | Wed | 04/02/2026 | Thu | 2 | No | 2 GBDs strictly after BOL | | TC-036 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/27/2026 | Fri | 03/02/2026 | Mon | 03/03/2026 | Tue | 2 | No | 2 GBDs strictly after BOL | --- ### X days prior Event_Roll Back **Family:** A | **Method:** X days prior Event_Roll Back | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Before:** -2 GBDs | **After:** 0 | **Incl. Pivot:** **No** | **Num_Days:** 2 | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-037 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/18/2026 | Wed | 03/16/2026 | Mon | 03/17/2026 | Tue | 2 | No | 2 GBDs strictly before BOL | | TC-038 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/27/2026 | Fri | 03/25/2026 | Wed | 03/26/2026 | Thu | 2 | No | 2 GBDs strictly before BOL | | TC-039 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday — Non-GBD roll | 03/27/2026 | Fri | 03/25/2026 | Wed | 03/26/2026 | Thu | 2 | No | BOL Sat → −Sat → 03/27 Fri (excl); −2=03/25 Wed, −1=03/26 Thu | | TC-040 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 02/26/2026 | Thu | 02/27/2026 | Fri | 2 | No | 2 GBDs strictly before BOL — crosses Feb | | TC-041 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/31/2026 | Tue | 03/27/2026 | Fri | 03/30/2026 | Mon | 2 | No | 2 GBDs strictly before BOL | | TC-042 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/27/2026 | Fri | 02/25/2026 | Wed | 02/26/2026 | Thu | 2 | No | 2 GBDs strictly before BOL | --- ## Family B — Calendar-Month Methods > CMANOWE and FX_Ref use Roll Rule `-SatSunHol` (backward). CMAWE uses No Roll. > For CMANOWE/FX_Ref with Saturday BOL: pivot rolls to Friday, but the window (anchored via Pivot_Date_Offset to first GBD of month) is the same regardless of which weekday in the month the BOL falls on. > **February 2026: 19 GBDs** (Presidents' Day 02/16 excluded). **March 2026: 22 GBDs**. --- ### CMANOWE **Family:** B | **Method:** CMANOWE | **Roll Rule:** -SatSunHol | **Pivot Offset:** `1d>-1lom` | **Window:** First GBD to last GBD of BOL month | Roll Boundary=No | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-043 | BOL | -SatSunHol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs | Pivot=first GBD of March | | TC-044 | BOL | -SatSunHol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs | | | TC-045 | BOL | -SatSunHol | 03/28/2026 | Sat | TC-C: Saturday BOL | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs | BOL rolls to Fri 03/27 → still March → same window | | TC-046 | BOL | -SatSunHol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs | | | TC-047 | BOL | -SatSunHol | 03/31/2026 | Tue | TC-E: Last day of March | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs | | | TC-048 | BOL | -SatSunHol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | Full Feb GBDs | Presidents' Day 02/16 excluded → 19 GBDs; 02/28=Sat not GBD | --- ### FX_Ref **Family:** B | **Method:** FX_Ref | **Roll Rule:** -SatSunHol | **Window:** Same as CMANOWE | **Nearby:** 0 (spot) | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-049 | BOL | -SatSunHol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs — spot price | Nearby=0 | | TC-050 | BOL | -SatSunHol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs — spot price | | | TC-051 | BOL | -SatSunHol | 03/28/2026 | Sat | TC-C: Saturday BOL | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs — spot price | BOL rolls → same March window | | TC-052 | BOL | -SatSunHol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs — spot price | | | TC-053 | BOL | -SatSunHol | 03/31/2026 | Tue | TC-E: Last day of March | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/31/2026 | Tue | 22 | Yes | Full March GBDs — spot price | | | TC-054 | BOL | -SatSunHol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | Full Feb GBDs — spot price | Presidents' Day excluded → 19 GBDs | --- ### CMAWE **Family:** B | **Method:** CMAWE | **Roll Rule:** No Roll | **Pivot Offset:** `1cd>-1lom` | **Window:** First calendar day to last calendar day of BOL month (1lom, No Roll) | **Avg:** Notional Weighted **Note:** Window_Start = first calendar day of month (may be Sat/Sun). Reset_Sym_Date=1cd → ALL calendar days are reset dates. Non-GBD volumes stack onto adjacent GBD (Stack_Non_GBD=Yes). | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-055 | BOL | No Roll | 03/18/2026 | Wed | TC-A: Normal weekday | 03/01/2026 | Sun | 03/01/2026 | Sun | 03/31/2026 | Tue | 31 | Yes | Full March — 03/01(Sun) to 03/31(Tue), 31 cal resets (1cd) | 03/01=Sun; vol stacks onto 03/02 Mon (Stack_Non_GBD=Yes) | | TC-056 | BOL | No Roll | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/01/2026 | Sun | 03/01/2026 | Sun | 03/31/2026 | Tue | 31 | Yes | Full March — 31 cal resets (1cd) | | | TC-057 | BOL | No Roll | 03/28/2026 | Sat | TC-C: Saturday | 03/01/2026 | Sun | 03/01/2026 | Sun | 03/31/2026 | Tue | 31 | Yes | Full March — 31 cal resets (1cd) | BOL=Sat + No Roll: pivot resolves to 03/01 Sun (1cd>-1lom = first cal day) | | TC-058 | BOL | No Roll | 03/02/2026 | Mon | TC-D: First GBD of March | 03/01/2026 | Sun | 03/01/2026 | Sun | 03/31/2026 | Tue | 31 | Yes | Full March — 31 cal resets (1cd) | | | TC-059 | BOL | No Roll | 03/31/2026 | Tue | TC-E: Last day of March | 03/01/2026 | Sun | 03/01/2026 | Sun | 03/31/2026 | Tue | 31 | Yes | Full March — 31 cal resets (1cd) | | | TC-060 | BOL | No Roll | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/01/2026 | Sun | 02/01/2026 | Sun | 02/28/2026 | Sat | 28 | Yes | Full Feb — 02/01(Sun) to 02/28(Sat), 28 cal resets (1cd) | 1lom=02/28(Sat), No Roll → stays. 28 cal days. | --- ## Family C — Prior-Month Methods > **February 2026: 19 GBDs**. **January 2026: 20 GBDs** (first GBD = 01/02 Fri). > EventPMANOWE uses `-SatSunHol` but window is anchored to prior month via Pivot_Date_Offset — BOL roll doesn't change the window. --- ### EventPMANOWE **Family:** C | **Method:** EventPMANOWE | **Roll Rule:** -SatSunHol | **Pivot Offset:** `1d>-2lom` | **Window:** First GBD to last GBD of prior calendar month | **Incl. Pivot:** Include | Roll Boundary=No | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-061 | BOL | -SatSunHol | 03/18/2026 | Wed | TC-A: Normal weekday | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | Prior month (Feb) GBDs | Presidents' Day 02/16 excluded → 19 GBDs | | TC-062 | BOL | -SatSunHol | 03/27/2026 | Fri | TC-B: Friday near EOM | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | Prior month (Feb) GBDs | | | TC-063 | BOL | -SatSunHol | 03/28/2026 | Sat | TC-C: Saturday BOL | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | Prior month (Feb) GBDs | BOL rolls → still March → same prior month window | | TC-064 | BOL | -SatSunHol | 03/02/2026 | Mon | TC-D: First GBD of March | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | Prior month = Feb (19 GBDs) | | | TC-065 | BOL | -SatSunHol | 03/31/2026 | Tue | TC-E: Last day of March | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | Prior month (Feb) GBDs | | | TC-066 | BOL | -SatSunHol | 02/27/2026 | Fri | TC-F: Last GBD of February | 01/02/2026 | Fri | 01/02/2026 | Fri | 01/30/2026 | Fri | 20 | Yes | Prior month = Jan (20 GBDs) | New Year's 01/01 + MLK Day 01/19 excluded; first GBD = 01/02 Fri | --- ### EventPMAWE **Family:** C | **Method:** EventPMAWE | **Roll Rule:** No Roll | **Pivot Offset:** `1cd>-2lom` | **Window:** First calendar day to last calendar day of prior month (1lom, No Roll) | **Incl. Pivot:** Include | **Avg:** Notional Weighted | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-067 | BOL | No Roll | 03/18/2026 | Wed | TC-A: Normal weekday | 02/01/2026 | Sun | 02/01/2026 | Sun | 02/28/2026 | Sat | 28 | Yes | Prior month Feb — 02/01(Sun) to 02/28(Sat), 28 cal resets (incl. pivot 02/01) | Feb 2026: Window 02/01(Sun)–02/28(Sat), 1cd. Incl. pivot 02/01 → 28 cal resets. | | TC-068 | BOL | No Roll | 03/27/2026 | Fri | TC-B: Friday near EOM | 02/01/2026 | Sun | 02/01/2026 | Sun | 02/28/2026 | Sat | 28 | Yes | Prior month Feb — 02/01(Sun) to 02/28(Sat), 28 cal resets (incl. pivot) | | | TC-069 | BOL | No Roll | 03/28/2026 | Sat | TC-C: Saturday — No Roll | 02/01/2026 | Sun | 02/01/2026 | Sun | 02/28/2026 | Sat | 28 | Yes | Prior month Feb — 02/01(Sun) to 02/28(Sat), 28 cal resets (incl. pivot) | No Roll: BOL=Sat stays; prior month unchanged | | TC-070 | BOL | No Roll | 03/02/2026 | Mon | TC-D: First GBD of March | 02/01/2026 | Sun | 02/01/2026 | Sun | 02/28/2026 | Sat | 28 | Yes | Prior month Feb — 02/01(Sun) to 02/28(Sat), 28 cal resets (incl. pivot) | | | TC-071 | BOL | No Roll | 03/31/2026 | Tue | TC-E: Last day of March | 02/01/2026 | Sun | 02/01/2026 | Sun | 02/28/2026 | Sat | 28 | Yes | Prior month Feb — 02/01(Sun) to 02/28(Sat), 28 cal resets (incl. pivot) | | | TC-072 | BOL | No Roll | 02/27/2026 | Fri | TC-F: Last GBD of February | 01/01/2026 | Thu | 01/01/2026 | Thu | 01/31/2026 | Sat | 31 | Yes | Prior month Jan — 01/01(Thu) to 01/31(Sat), 31 cal resets (incl. pivot 01/01) | 1lom=01/31(Sat), No Roll → stays. 31 cal days incl. pivot 01/01 = 31. | --- ## Family D — Week-Average Methods > **EventCWA:** Current week (BOL week). **EventPWA:** Prior week (week before BOL week). > ⚠ Good Friday 04/03/2026: 1low=04/03 → −Hol → BACKWARD → 04/02 Thu (affects TC-077, TC-H05). --- ### EventCWA **Family:** D | **Method:** EventCWA | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Pivot Offset:** `0monday` | **Window:** Monday to Friday of BOL week (Window_End rolls per Non-GBD Roll Rule) | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-073 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/16/2026 | Mon | 03/16/2026 | Mon | 03/20/2026 | Fri | 5 | Yes | Mon–Fri of BOL week | | | TC-074 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/23/2026 | Mon | 03/23/2026 | Mon | 03/27/2026 | Fri | 5 | Yes | Mon–Fri of BOL week | | | TC-075 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday | 03/23/2026 | Mon | 03/23/2026 | Mon | 03/27/2026 | Fri | 5 | Yes | Mon–Fri of BOL week | BOL=Sat → −Sat → BACKWARD → 03/27 Fri; Pivot = Mon of 03/27 week = 03/23 Mon. Result unchanged. | | TC-076 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 03/02/2026 | Mon | 03/02/2026 | Mon | 03/06/2026 | Fri | 5 | Yes | Mon–Fri of BOL week | | | TC-077 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/30/2026 | Mon | 03/30/2026 | Mon | 04/02/2026 | Thu | 4 | Yes | Mon–Thu of BOL week (Good Friday) | 1low=04/03 Good Friday → −Hol → BACKWARD → 04/02 Thu. Reset dates: 03/30,03/31,04/01,04/02. | | TC-078 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/23/2026 | Mon | 02/23/2026 | Mon | 02/27/2026 | Fri | 5 | Yes | Mon–Fri of BOL week | | --- ### EventPWA **Family:** D | **Method:** EventPWA | **Roll Rule:** -Sat+Sun+MonHol-Hol | **Pivot Offset:** `-1monday` | **Window:** Monday to Friday of the **PRIOR** week (week before BOL week) | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-079 | BOL | -Sat+Sun+MonHol-Hol | 03/18/2026 | Wed | TC-A: Normal weekday | 03/09/2026 | Mon | 03/09/2026 | Mon | 03/13/2026 | Fri | 5 | Yes | Mon–Fri of prior week (03/09–03/13) | BOL week Mon=03/16; prior week Mon=03/09 | | TC-080 | BOL | -Sat+Sun+MonHol-Hol | 03/27/2026 | Fri | TC-B: Friday near EOM | 03/16/2026 | Mon | 03/16/2026 | Mon | 03/20/2026 | Fri | 5 | Yes | Mon–Fri of prior week (03/16–03/20) | BOL week Mon=03/23; prior week Mon=03/16 | | TC-081 | BOL | -Sat+Sun+MonHol-Hol | 03/28/2026 | Sat | TC-C: Saturday | 03/16/2026 | Mon | 03/16/2026 | Mon | 03/20/2026 | Fri | 5 | Yes | Mon–Fri of prior week | BOL=Sat → −Sat → BACKWARD → 03/27 Fri; week of 03/27 = 03/23; prior week Mon=03/16. Result unchanged. | | TC-082 | BOL | -Sat+Sun+MonHol-Hol | 03/02/2026 | Mon | TC-D: First GBD of March | 02/23/2026 | Mon | 02/23/2026 | Mon | 02/27/2026 | Fri | 5 | Yes | Mon–Fri of prior week (02/23–02/27) | BOL week Mon=03/02; prior week Mon=02/23 | | TC-083 | BOL | -Sat+Sun+MonHol-Hol | 03/31/2026 | Tue | TC-E: Last day of March | 03/23/2026 | Mon | 03/23/2026 | Mon | 03/27/2026 | Fri | 5 | Yes | Mon–Fri of prior week (03/23–03/27) | BOL week Mon=03/30; prior week Mon=03/23; no holiday in that prior week | | TC-084 | BOL | -Sat+Sun+MonHol-Hol | 02/27/2026 | Fri | TC-F: Last GBD of February | 02/16/2026 | Mon | 02/16/2026 | Mon | 02/20/2026 | Fri | 4 | Yes | Mon–Fri of prior week | ⚠ 02/16 = Presidents' Day (holiday); Window_Start = 02/16 Mon (non-GBD); first reset = 02/17 Tue. Num_Days=4 | --- ## Phase 1b — Holiday-Specific Test Cases | Holiday Targeted | Date | Affected TCs | |---|---|---| | Presidents' Day | 02/16/2026 Mon | TC-H01, TC-H03 | | Good Friday | 04/03/2026 Fri | TC-H02, TC-H04, TC-H05, TC-H06 | --- ### TC-H01 — X DAYS ARD Event: backward GBD count skips Presidents' Day **Method:** X DAYS ARD Event | **BOL:** 02/17/2026 Tue (day after Presidents' Day) - −1 GBD from 02/17 = skip 02/16 Mon (Presidents' Day) → **02/13/2026 Fri** - +1 GBD from 02/17 = **02/18/2026 Wed** - Window = [02/13/2026 Fri, 02/17/2026 Tue], Reset_Dates: Fri 02/13, Tue 02/17, Wed 02/18 = 3 GBDs | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-H01 | BOL | -Sat+Sun+MonHol-Hol | 02/17/2026 | Tue | Day after Presidents' Day | 02/17/2026 | Tue | 02/13/2026 | Fri | 02/18/2026 | Wed | 3 | Yes | Symmetric window skips Presidents' Day | −1 GBD: skip 02/16 Mon holiday → 02/13 Fri; +1 GBD = 02/18 Wed | --- ### TC-H02 — Event +Xdays_Roll Fwd: forward GBD count skips Good Friday **Method:** Event +Xdays_Roll Fwd | **BOL:** 04/01/2026 Wed - +1 GBD = 04/02 Thu; +2 GBD = 04/03 Fri = Good Friday → skip → **04/06/2026 Mon** | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-H02 | BOL | -Sat+Sun+MonHol-Hol | 04/01/2026 | Wed | Window end hits Good Friday | 04/01/2026 | Wed | 04/01/2026 | Wed | 04/06/2026 | Mon | 3 | Yes | +2 GBDs skips Good Friday | Good Friday 04/03 excluded; +2 GBD = 04/06 Mon | --- ### TC-H03 — CMANOWE: February month count with Presidents' Day **Method:** CMANOWE | **BOL:** 02/18/2026 Wed | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-H03 | BOL | -SatSunHol | 02/18/2026 | Wed | Full Feb month — Presidents' Day | 02/02/2026 | Mon | 02/02/2026 | Mon | 02/27/2026 | Fri | 19 | Yes | February GBDs = 19 | Presidents' Day 02/16 excluded; would be 20 without holiday calendar | --- ### TC-H04 — Event Date Roll Early: 5-day window with Good Friday gap **Method:** Event Date Roll Early | **BOL:** 04/01/2026 Wed - −2 GBDs = 03/30 Mon (Window_Start) - +1 GBD = 04/02 Thu; +2 GBD = 04/03 Fri = Good Friday → skip → 04/06 Mon (Window_End) - GBDs in [03/30, 04/06]: Mon 03/30, Tue 03/31, Wed 04/01, Thu 04/02, Mon 04/06 = **5 GBDs** | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-H04 | BOL | -Sat+Sun+MonHol-Hol | 04/01/2026 | Wed | 5-day window crosses Good Friday | 04/01/2026 | Wed | 03/30/2026 | Mon | 04/06/2026 | Mon | 5 | Yes | 5-day window skips Good Friday | Good Friday 04/03 excluded; window end = 04/06 Mon. Dates: 03/30,03/31,04/01,04/02,04/06 | --- ### TC-H05 — EventCWA: BOL week ending on Good Friday **Method:** EventCWA | **BOL:** 04/01/2026 Wed - BOL week = 03/30 Mon to 04/04 Sun; 1low = 04/03 Good Friday → −Hol → BACKWARD → **04/02/2026 Thu** | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-H05 | BOL | -Sat+Sun+MonHol-Hol | 04/01/2026 | Wed | BOL week ends on Good Friday | 03/30/2026 | Mon | 03/30/2026 | Mon | 04/02/2026 | Thu | 4 | Yes | Week average — end rolls backward (Good Friday) | 1low=04/03 Good Friday → −Hol → BACKWARD → 04/02 Thu. Reset dates: 03/30,03/31,04/01,04/02. | --- ### TC-H06 — X days after Event: exclude pivot + window end skips Good Friday **Method:** X days after Event_Roll Fwd | **BOL:** 04/01/2026 Wed | **Incl. Pivot:** No - +1 GBD = 04/02 Thu (Window_Start, since BOL excluded); +2 GBD = 04/03 Good Friday → skip → **04/06 Mon** (Window_End) - Reset_Dates: 04/02 Thu, 04/06 Mon = **2 GBDs** | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | Expected_Pivot | Pivot_DoW | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | QA_Notes | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-H06 | BOL | -Sat+Sun+MonHol-Hol | 04/01/2026 | Wed | Exclude pivot + window end skips Good Friday | 04/01/2026 | Wed | 04/02/2026 | Thu | 04/06/2026 | Mon | 2 | No | 2 GBDs after BOL, skipping Good Friday | +2 GBDs from Pivot; Good Friday 04/03 skipped → Window_End = 04/06 Mon | --- ## Phase 2 — TMA Date Sequence Methods > Date sequences are now available (File 2). Calculations below are exact, not approximations. > Both TMA methods use **No Roll** — BOL date is used as-is (no rolling to GBD). > BOL date does NOT affect window boundaries; only its position relative to sequence dates matters. --- ### TMA Argus/Platts **Family:** C2 | **Method:** TMA Argus/Platts | **Roll Rule:** No Roll | **Reset Conv:** arg_trm **Calculation:** currDate = smallest arg_trm date ≥ BOL (if BOL=sequence date: currDate = BOL itself); Pivot_Anchor = currDate −2 entries; Window_End = Pivot_Anchor +1 entry **Window:** NextGBD(Pivot_Anchor) → Window_End | **Incl. Pivot:** Include **Reference sequence dates around March 2026:** - 01/23/2026 (Fri) — Feb-2026 period end - 02/25/2026 (Wed) — Mar-2026 period end - 03/25/2026 (Wed) — Apr-2026 period end - 04/24/2026 (Fri) — May-2026 period end | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | prevDate | currDate | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-TMA-A01 | BOL | No Roll | 03/18/2026 | Wed | TC-A: currDate=03/25; Anchor=01/23; Window=01/26–02/25 | 01/23/2026 | 03/25/2026 | 01/26/2026 | Mon | 02/25/2026 | Wed | 22 | Yes | Anchor=currDate−2=01/23; NextGBD(01/23)=01/26; WE=01/23+1=02/25; 22 GBDs incl. pivot | | TC-TMA-A02 | BOL | No Roll | 03/27/2026 | Fri | TC-B: currDate=04/24; Anchor=02/25; Window=02/26–03/25 | 02/25/2026 | 04/24/2026 | 02/26/2026 | Thu | 03/25/2026 | Wed | 20 | Yes | Anchor=currDate−2=02/25; NextGBD(02/25)=02/26; WE=02/25+1=03/25; 20 GBDs incl. pivot | | TC-TMA-A03 | BOL | No Roll | 03/28/2026 | Sat | TC-C: Saturday BOL — No Roll; same as A02 | 02/25/2026 | 04/24/2026 | 02/26/2026 | Thu | 03/25/2026 | Wed | 20 | Yes | No Roll; BOL 03/28 > 03/25 → currDate=04/24; same window as A02 | | TC-TMA-A04 | BOL | No Roll | 03/02/2026 | Mon | TC-D: Early March; currDate=03/25; same anchor as A01 | 01/23/2026 | 03/25/2026 | 01/26/2026 | Mon | 02/25/2026 | Wed | 22 | Yes | Same currDate=03/25 as A01; Window=01/26–02/25; 22 GBDs | | TC-TMA-A05 | BOL | No Roll | 03/31/2026 | Tue | TC-E: End March; currDate=04/24; same anchor as A02 | 02/25/2026 | 04/24/2026 | 02/26/2026 | Thu | 03/25/2026 | Wed | 20 | Yes | BOL 03/31 > 03/25 → currDate=04/24; Window=02/26–03/25; 20 GBDs | | TC-TMA-A06 | BOL | No Roll | 02/27/2026 | Fri | TC-F: Last Feb GBD; currDate=03/25; same as A01 | 01/23/2026 | 03/25/2026 | 01/26/2026 | Mon | 02/25/2026 | Wed | 22 | Yes | BOL 02/27 > 02/25 → currDate=03/25; Window=01/26–02/25; 22 GBDs | > **TC-TMA-A06 note:** BOL = 02/27 > 02/25 → currDate = 03/25 (next arg_trm after BOL). Pivot_Anchor = currDate−2 = 01/23. Window_Start = NextGBD(01/23) = 01/26 Mon. Window_End = 01/23+1 = 02/25 Wed. --- ### TMA Nymex/CME **Family:** C3 | **Method:** TMA Nymex/CME | **Roll Rule:** No Roll | **Reset Conv:** dmo_one_cme_xxv_minusgbd_three **Calculation:** currDate = smallest CME date ≥ BOL (if BOL=sequence date: currDate = BOL itself); Pivot_Anchor = currDate −2 entries; Window_End = Pivot_Anchor +1 entry **Window:** NextGBD(Pivot_Anchor) → Window_End | **Incl. Pivot:** Include **Reference sequence dates around March 2026:** - 01/20/2026 (Tue) — Feb-2026 expiry - 02/20/2026 (Fri) — Mar-2026 expiry - 03/20/2026 (Fri) — Apr-2026 expiry - 04/21/2026 (Tue) — May-2026 expiry | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | prevDate | currDate | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-TMA-C01 | BOL | No Roll | 03/18/2026 | Wed | TC-A: currDate=03/20; Anchor=01/20; Window=01/21–02/20 | 01/20/2026 | 03/20/2026 | 01/21/2026 | Wed | 02/20/2026 | Fri | 22 | Yes | Anchor=currDate−2=01/20; NextGBD(01/20)=01/21; WE=01/20+1=02/20; 22 GBDs incl. pivot | | TC-TMA-C02 | BOL | No Roll | 03/27/2026 | Fri | TC-B: currDate=04/21; Anchor=02/20; Window=02/23–03/20 | 02/20/2026 | 04/21/2026 | 02/23/2026 | Mon | 03/20/2026 | Fri | 20 | Yes | Anchor=currDate−2=02/20; NextGBD(02/20)=02/23; WE=02/20+1=03/20; 20 GBDs incl. pivot | | TC-TMA-C03 | BOL | No Roll | 03/28/2026 | Sat | TC-C: Saturday BOL — No Roll; same as C02 | 02/20/2026 | 04/21/2026 | 02/23/2026 | Mon | 03/20/2026 | Fri | 20 | Yes | No Roll; BOL 03/28 > 03/20 → currDate=04/21; same window as C02 | | TC-TMA-C04 | BOL | No Roll | 03/02/2026 | Mon | TC-D: Early March; currDate=03/20; same anchor as C01 | 01/20/2026 | 03/20/2026 | 01/21/2026 | Wed | 02/20/2026 | Fri | 22 | Yes | Same currDate=03/20 as C01; Window=01/21–02/20; 22 GBDs | | TC-TMA-C05 | BOL | No Roll | 03/31/2026 | Tue | TC-E: End March; currDate=04/21; same anchor as C02 | 02/20/2026 | 04/21/2026 | 02/23/2026 | Mon | 03/20/2026 | Fri | 20 | Yes | BOL 03/31 > 03/20 → currDate=04/21; Window=02/23–03/20; 20 GBDs | | TC-TMA-C06 | BOL | No Roll | 02/27/2026 | Fri | TC-F: Last Feb GBD; currDate=03/20; same as C01 | 01/20/2026 | 03/20/2026 | 01/21/2026 | Wed | 02/20/2026 | Fri | 22 | Yes | BOL 02/27 > 02/20 → currDate=03/20; Window=01/21–02/20; 22 GBDs | > **TC-TMA-C01/C04/C06 note:** currDate=03/20. Pivot_Anchor=01/20 Tue. NextGBD(01/20) = **01/21/2026 Wed**. Window_End=01/20+1=02/20 Fri. --- ## Phase 2 — Additional TMA Edge Case Tests ### TC-TMA-A07 — TMA Argus: BOL exactly on sequence date **Method:** TMA Argus/Platts | **BOL:** 02/25/2026 Wed (BOL = arg_trm boundary date) - BOL = sequence date → currDate = **BOL itself** = 02/25/2026 (≥ rule, stay on same entry) - Pivot_Anchor = currDate −2 = 12/25/2025 Thu (Christmas); Window_Start = NextGBD(12/25/2025) = 12/26/2025 Fri - Window_End = Pivot_Anchor +1 = 01/23/2026 Fri - Num_Days = GBDs from 12/26/2025 to 01/23/2026 = 19 (excl. New Year's 01/01 and MLK Day 01/19) | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | prevDate | currDate | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-TMA-A07 | BOL | No Roll | 02/25/2026 | Wed | BOL exactly on arg_trm boundary | 12/25/2025 | 02/25/2026 | 12/26/2025 | Fri | 01/23/2026 | Fri | 19 | Yes | BOL=sequence date → currDate=BOL(02/25); Anchor=12/25/2025; WS=12/26/2025; WE=01/23/2026 | --- ### TC-TMA-C07 — TMA CME: BOL exactly on sequence date **Method:** TMA Nymex/CME | **BOL:** 02/20/2026 Fri (BOL = CME expiry date) - BOL = sequence date → currDate = **BOL itself** = 02/20/2026 (≥ rule, stay on same entry) - Pivot_Anchor = currDate −2 = 12/19/2025 Fri; Window_Start = NextGBD(12/19/2025) = 12/22/2025 Mon - Window_End = Pivot_Anchor +1 = 01/20/2026 Tue - Num_Days = GBDs from 12/22/2025 to 01/20/2026 = 19 (excl. Christmas 12/25, New Year's 01/01, MLK Day 01/19) | TC_ID | Pricing_Event | Non_GBD_Roll | BOL_Date | BOL_DoW | Scenario | prevDate | currDate | Window_Start | Start_DoW | Window_End | End_DoW | Num_Days | Incl_Pivot | Expected_Behaviour | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | TC-TMA-C07 | BOL | No Roll | 02/20/2026 | Fri | BOL exactly on CME expiry date | 12/19/2025 | 02/20/2026 | 12/22/2025 | Mon | 01/20/2026 | Tue | 19 | Yes | BOL=sequence date → currDate=BOL(02/20); Anchor=12/19/2025; WS=12/22/2025; WE=01/20/2026 | --- ## Test Case Summary | Phase | Method Name | Family | TCs | Method Logic | |---|---|---|---|---| | 1 | X DAYS ARD Event | A | TC-001–TC-006 | Symmetric: BOL−1 GBD to BOL+1 GBD, Include | | 1 | Event Date Only | A | TC-007–TC-012 | BOL only, 1 day | | 1 | Event +Xdays_Roll Fwd | A | TC-013–TC-018 | BOL to BOL+2 GBDs, Include | | 1 | Event -Xdays_Roll Back | A | TC-019–TC-024 | BOL−2 GBDs to BOL, Include | | 1 | Event Date Roll Early | A | TC-025–TC-030 | BOL−2 to BOL+2 GBDs, 5-day symmetric | | 1 | X days after Event_Roll Fwd | A | TC-031–TC-036 | BOL+1 to BOL+2 GBDs, Exclude BOL | | 1 | X days prior Event_Roll Back | A | TC-037–TC-042 | BOL−2 to BOL−1 GBDs, Exclude BOL | | 1 | CMANOWE | B | TC-043–TC-048 | Full current month GBDs | | 1 | FX_Ref | B | TC-049–TC-054 | Full current month GBDs, Nearby=0 | | 1 | CMAWE | B | TC-055–TC-060 | First cal day to last cal day (1lom, No Roll), Notional Weighted, Num_Days=all cal days | | 1 | EventPMANOWE | C | TC-061–TC-066 | Full prior month GBDs | | 1 | EventPMAWE | C | TC-067–TC-072 | First cal day to last cal day of prior month (1lom, No Roll), incl. pivot, Num_Days=cal days | | 1 | EventCWA | D | TC-073–TC-078 | Mon–Fri of BOL week | | 1 | EventPWA | D | TC-079–TC-084 | Mon–Fri of **prior** week | | 1b | X DAYS ARD Event | A | TC-H01 | Holiday skip in backward GBD count | | 1b | Event +Xdays_Roll Fwd | A | TC-H02 | Holiday skip in forward count | | 1b | CMANOWE | B | TC-H03 | Monthly GBD count = 19, not 20 | | 1b | Event Date Roll Early | A | TC-H04 | 5-day window end skips holiday | | 1b | EventCWA | D | TC-H05 | Week end rolls BACKWARD via −Hol (Good Friday → Thu) | | 1b | X days after Event_Roll Fwd | A | TC-H06 | Exclude pivot + forward count skips holiday | | 2 | TMA Argus/Platts | C2 | TC-TMA-A01–A07 | arg_trm sequence; exact windows computed from File 2 data | | 2 | TMA Nymex/CME | C3 | TC-TMA-C01–C07 | CME sequence; exact windows computed from File 2 data | **Total: 84 Phase 1 + 6 Phase 1b + 14 Phase 2 = 104 test cases** --- *Source: Projection Methods Definition.xlsx, ArgTRM_Dates.xlsx, CME_Dates.xlsx, US Holiday Calendar 2026* *Phase 2 values verified computationally against the actual date sequences*