== A. the classifier refuses cardinality > 1 before reading either rule == PASS the reason code is the cross-engine one PASS count 2 with a supported rule is degraded_invalid / duplicate_rrule and nothing else PASS count 2 with a supported rule: resolution state is degraded_invalid PASS count 2 with a supported rule: an RDATE beside the duplicates does not certify them PASS count 3 with a supported rule is degraded_invalid / duplicate_rrule and nothing else PASS count 3 with a supported rule: resolution state is degraded_invalid PASS count 3 with a supported rule: an RDATE beside the duplicates does not certify them PASS count 10 with a supported rule is degraded_invalid / duplicate_rrule and nothing else PASS count 10 with a supported rule: resolution state is degraded_invalid PASS count 10 with a supported rule: an RDATE beside the duplicates does not certify them PASS count 2 with a unsupported rule is degraded_invalid / duplicate_rrule and nothing else PASS count 2 with a unsupported rule: resolution state is degraded_invalid PASS count 2 with a unsupported rule: an RDATE beside the duplicates does not certify them PASS count 3 with a unsupported rule is degraded_invalid / duplicate_rrule and nothing else PASS count 3 with a unsupported rule: resolution state is degraded_invalid PASS count 3 with a unsupported rule: an RDATE beside the duplicates does not certify them PASS count 10 with a unsupported rule is degraded_invalid / duplicate_rrule and nothing else PASS count 10 with a unsupported rule: resolution state is degraded_invalid PASS count 10 with a unsupported rule: an RDATE beside the duplicates does not certify them PASS count 2 with a malformed rule is degraded_invalid / duplicate_rrule and nothing else PASS count 2 with a malformed rule: resolution state is degraded_invalid PASS count 2 with a malformed rule: an RDATE beside the duplicates does not certify them PASS count 3 with a malformed rule is degraded_invalid / duplicate_rrule and nothing else PASS count 3 with a malformed rule: resolution state is degraded_invalid PASS count 3 with a malformed rule: an RDATE beside the duplicates does not certify them PASS count 10 with a malformed rule is degraded_invalid / duplicate_rrule and nothing else PASS count 10 with a malformed rule: resolution state is degraded_invalid PASS count 10 with a malformed rule: an RDATE beside the duplicates does not certify them PASS count 2 with a no FREQ at all is degraded_invalid / duplicate_rrule and nothing else PASS count 2 with a no FREQ at all: resolution state is degraded_invalid PASS count 2 with a no FREQ at all: an RDATE beside the duplicates does not certify them PASS count 3 with a no FREQ at all is degraded_invalid / duplicate_rrule and nothing else PASS count 3 with a no FREQ at all: resolution state is degraded_invalid PASS count 3 with a no FREQ at all: an RDATE beside the duplicates does not certify them PASS count 10 with a no FREQ at all is degraded_invalid / duplicate_rrule and nothing else PASS count 10 with a no FREQ at all: resolution state is degraded_invalid PASS count 10 with a no FREQ at all: an RDATE beside the duplicates does not certify them PASS count 2 with a BYDAY duplicate token is degraded_invalid / duplicate_rrule and nothing else PASS count 2 with a BYDAY duplicate token: resolution state is degraded_invalid PASS count 2 with a BYDAY duplicate token: an RDATE beside the duplicates does not certify them PASS count 3 with a BYDAY duplicate token is degraded_invalid / duplicate_rrule and nothing else PASS count 3 with a BYDAY duplicate token: resolution state is degraded_invalid PASS count 3 with a BYDAY duplicate token: an RDATE beside the duplicates does not certify them PASS count 10 with a BYDAY duplicate token is degraded_invalid / duplicate_rrule and nothing else PASS count 10 with a BYDAY duplicate token: resolution state is degraded_invalid PASS count 10 with a BYDAY duplicate token: an RDATE beside the duplicates does not certify them PASS whichever duplicate is passed as the scalar, the answer is the same (supported vs malformed) PASS whichever duplicate is passed as the scalar, the answer is the same (supported vs unsupported) PASS default count leaves FREQ=DAILY;COUNT=3 exactly as before PASS explicit count 1 leaves FREQ=DAILY;COUNT=3 exactly as before PASS default count leaves FREQ=WEEKLY;BYDAY=MO,MO exactly as before PASS explicit count 1 leaves FREQ=WEEKLY;BYDAY=MO,MO exactly as before PASS default count leaves FREQ=HOURLY;COUNT=3 exactly as before PASS explicit count 1 leaves FREQ=HOURLY;COUNT=3 exactly as before PASS default count leaves FREQ=DAILY;COUNT=0 exactly as before PASS explicit count 1 leaves FREQ=DAILY;COUNT=0 exactly as before PASS default count leaves FREQ=DAILY;COUNT=3;COUNT=3 exactly as before PASS explicit count 1 leaves FREQ=DAILY;COUNT=3;COUNT=3 exactly as before PASS count 0 with no rule is not_recurring PASS count 0 with RDATEs is the RDATE-only series PASS one RRULE stating COUNT twice is duplicate_part, not duplicate_rrule == B. the parser retains RRULE cardinality == PASS calee_calendar_property_count: absent is 0 PASS calee_calendar_property_count: one scalar is 1 PASS calee_calendar_property_count: a repeat is its length PASS calee_calendar_property_count: two identical values are still 2 PASS A two distinct valid rules: the component records rruleCount 2 PASS A two distinct valid rules: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS A two distinct valid rules: normalize_event stamps degraded_invalid PASS B reverse order: the component records rruleCount 2 PASS B reverse order: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS B reverse order: normalize_event stamps degraded_invalid PASS C two identical rules: the component records rruleCount 2 PASS C two identical rules: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS C two identical rules: normalize_event stamps degraded_invalid PASS D supported + unsupported: the component records rruleCount 2 PASS D supported + unsupported: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS D supported + unsupported: normalize_event stamps degraded_invalid PASS D2 unsupported + supported: the component records rruleCount 2 PASS D2 unsupported + supported: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS D2 unsupported + supported: normalize_event stamps degraded_invalid PASS E supported + malformed: the component records rruleCount 2 PASS E supported + malformed: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS E supported + malformed: normalize_event stamps degraded_invalid PASS E2 malformed + supported: the component records rruleCount 2 PASS E2 malformed + supported: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS E2 malformed + supported: normalize_event stamps degraded_invalid PASS three rules: the component records rruleCount 3 PASS three rules: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS three rules: normalize_event stamps degraded_invalid PASS lower-case second property name: the component records rruleCount 2 PASS lower-case second property name: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS lower-case second property name: normalize_event stamps degraded_invalid PASS folded second rule: the component records rruleCount 2 PASS folded second rule: the scalar rrule still holds the FIRST value (the pre-#612 survivor), which is why the count must travel too PASS folded second rule: normalize_event stamps degraded_invalid PASS a single RRULE records rruleCount 1 PASS no RRULE records rruleCount 0 PASS a folded single RRULE records rruleCount 1 PASS ... and its value is the unfolded rule PASS a folded single RRULE with LF-only terminators records rruleCount 1 PASS a folded single RRULE with CR-only terminators records rruleCount 1 PASS a TAB-folded single RRULE records rruleCount 1 == C. the engine: DTSTART alone, degraded_invalid, no identity, order unobservable == PASS A two distinct valid rules: the source DTSTART alone, degraded_invalid, no recurrence identity PASS A two distinct valid rules: exactly one occurrence PASS A two distinct valid rules: rrule is retained so the consumer sees a series was declared PASS A two distinct valid rules: no occurrence stepped from either rule (20260311T090000Z) PASS A two distinct valid rules: no occurrence stepped from either rule (20260312T090000Z) PASS A two distinct valid rules: no occurrence stepped from either rule (20260317T090000Z) PASS A two distinct valid rules: no occurrence stepped from either rule (20260324T090000Z) PASS A two distinct valid rules: no occurrence stepped from either rule (20260313T090000Z) PASS A two distinct valid rules: no occurrence stepped from either rule (20260316T090000Z) PASS A two distinct valid rules: no occurrence stepped from either rule (20260410T090000Z) PASS B reverse order: the source DTSTART alone, degraded_invalid, no recurrence identity PASS B reverse order: exactly one occurrence PASS B reverse order: rrule is retained so the consumer sees a series was declared PASS B reverse order: no occurrence stepped from either rule (20260311T090000Z) PASS B reverse order: no occurrence stepped from either rule (20260312T090000Z) PASS B reverse order: no occurrence stepped from either rule (20260317T090000Z) PASS B reverse order: no occurrence stepped from either rule (20260324T090000Z) PASS B reverse order: no occurrence stepped from either rule (20260313T090000Z) PASS B reverse order: no occurrence stepped from either rule (20260316T090000Z) PASS B reverse order: no occurrence stepped from either rule (20260410T090000Z) PASS C two identical rules: the source DTSTART alone, degraded_invalid, no recurrence identity PASS C two identical rules: exactly one occurrence PASS C two identical rules: rrule is retained so the consumer sees a series was declared PASS C two identical rules: no occurrence stepped from either rule (20260311T090000Z) PASS C two identical rules: no occurrence stepped from either rule (20260312T090000Z) PASS C two identical rules: no occurrence stepped from either rule (20260317T090000Z) PASS C two identical rules: no occurrence stepped from either rule (20260324T090000Z) PASS C two identical rules: no occurrence stepped from either rule (20260313T090000Z) PASS C two identical rules: no occurrence stepped from either rule (20260316T090000Z) PASS C two identical rules: no occurrence stepped from either rule (20260410T090000Z) PASS D supported + unsupported: the source DTSTART alone, degraded_invalid, no recurrence identity PASS D supported + unsupported: exactly one occurrence PASS D supported + unsupported: rrule is retained so the consumer sees a series was declared PASS D supported + unsupported: no occurrence stepped from either rule (20260311T090000Z) PASS D supported + unsupported: no occurrence stepped from either rule (20260312T090000Z) PASS D supported + unsupported: no occurrence stepped from either rule (20260317T090000Z) PASS D supported + unsupported: no occurrence stepped from either rule (20260324T090000Z) PASS D supported + unsupported: no occurrence stepped from either rule (20260313T090000Z) PASS D supported + unsupported: no occurrence stepped from either rule (20260316T090000Z) PASS D supported + unsupported: no occurrence stepped from either rule (20260410T090000Z) PASS D2 unsupported + supported: the source DTSTART alone, degraded_invalid, no recurrence identity PASS D2 unsupported + supported: exactly one occurrence PASS D2 unsupported + supported: rrule is retained so the consumer sees a series was declared PASS D2 unsupported + supported: no occurrence stepped from either rule (20260311T090000Z) PASS D2 unsupported + supported: no occurrence stepped from either rule (20260312T090000Z) PASS D2 unsupported + supported: no occurrence stepped from either rule (20260317T090000Z) PASS D2 unsupported + supported: no occurrence stepped from either rule (20260324T090000Z) PASS D2 unsupported + supported: no occurrence stepped from either rule (20260313T090000Z) PASS D2 unsupported + supported: no occurrence stepped from either rule (20260316T090000Z) PASS D2 unsupported + supported: no occurrence stepped from either rule (20260410T090000Z) PASS E supported + malformed: the source DTSTART alone, degraded_invalid, no recurrence identity PASS E supported + malformed: exactly one occurrence PASS E supported + malformed: rrule is retained so the consumer sees a series was declared PASS E supported + malformed: no occurrence stepped from either rule (20260311T090000Z) PASS E supported + malformed: no occurrence stepped from either rule (20260312T090000Z) PASS E supported + malformed: no occurrence stepped from either rule (20260317T090000Z) PASS E supported + malformed: no occurrence stepped from either rule (20260324T090000Z) PASS E supported + malformed: no occurrence stepped from either rule (20260313T090000Z) PASS E supported + malformed: no occurrence stepped from either rule (20260316T090000Z) PASS E supported + malformed: no occurrence stepped from either rule (20260410T090000Z) PASS E2 malformed + supported: the source DTSTART alone, degraded_invalid, no recurrence identity PASS E2 malformed + supported: exactly one occurrence PASS E2 malformed + supported: rrule is retained so the consumer sees a series was declared PASS E2 malformed + supported: no occurrence stepped from either rule (20260311T090000Z) PASS E2 malformed + supported: no occurrence stepped from either rule (20260312T090000Z) PASS E2 malformed + supported: no occurrence stepped from either rule (20260317T090000Z) PASS E2 malformed + supported: no occurrence stepped from either rule (20260324T090000Z) PASS E2 malformed + supported: no occurrence stepped from either rule (20260313T090000Z) PASS E2 malformed + supported: no occurrence stepped from either rule (20260316T090000Z) PASS E2 malformed + supported: no occurrence stepped from either rule (20260410T090000Z) PASS three rules: the source DTSTART alone, degraded_invalid, no recurrence identity PASS three rules: exactly one occurrence PASS three rules: rrule is retained so the consumer sees a series was declared PASS three rules: no occurrence stepped from either rule (20260311T090000Z) PASS three rules: no occurrence stepped from either rule (20260312T090000Z) PASS three rules: no occurrence stepped from either rule (20260317T090000Z) PASS three rules: no occurrence stepped from either rule (20260324T090000Z) PASS three rules: no occurrence stepped from either rule (20260313T090000Z) PASS three rules: no occurrence stepped from either rule (20260316T090000Z) PASS three rules: no occurrence stepped from either rule (20260410T090000Z) PASS lower-case second property name: the source DTSTART alone, degraded_invalid, no recurrence identity PASS lower-case second property name: exactly one occurrence PASS lower-case second property name: rrule is retained so the consumer sees a series was declared PASS lower-case second property name: no occurrence stepped from either rule (20260311T090000Z) PASS lower-case second property name: no occurrence stepped from either rule (20260312T090000Z) PASS lower-case second property name: no occurrence stepped from either rule (20260317T090000Z) PASS lower-case second property name: no occurrence stepped from either rule (20260324T090000Z) PASS lower-case second property name: no occurrence stepped from either rule (20260313T090000Z) PASS lower-case second property name: no occurrence stepped from either rule (20260316T090000Z) PASS lower-case second property name: no occurrence stepped from either rule (20260410T090000Z) PASS folded second rule: the source DTSTART alone, degraded_invalid, no recurrence identity PASS folded second rule: exactly one occurrence PASS folded second rule: rrule is retained so the consumer sees a series was declared PASS folded second rule: no occurrence stepped from either rule (20260311T090000Z) PASS folded second rule: no occurrence stepped from either rule (20260312T090000Z) PASS folded second rule: no occurrence stepped from either rule (20260317T090000Z) PASS folded second rule: no occurrence stepped from either rule (20260324T090000Z) PASS folded second rule: no occurrence stepped from either rule (20260313T090000Z) PASS folded second rule: no occurrence stepped from either rule (20260316T090000Z) PASS folded second rule: no occurrence stepped from either rule (20260410T090000Z) PASS reversing the two lines changes nothing PASS supported/unsupported order changes nothing PASS supported/malformed order changes nothing PASS I: a duplicate master whose DTSTART is outside the window emits nothing PASS I: no later instance of either rule fills the window == D. duplicate RRULE is not duplicate BYDAY == PASS BYDAY=MO,MO is ONE RRULE property PASS BYDAY=MO,MO;COUNT=4 is supported and de-duplicated (#613) PASS ... identical to BYDAY=MO PASS two identical RRULE:FREQ=WEEKLY;BYDAY=MO properties are refused, not merged into one == E. explicit source evidence under a duplicate master == PASS J: an EXDATE naming the preserved DTSTART suppresses it PASS J: EXDATEs naming alleged later instances of either rule change nothing PASS RDATE: DTSTART plus the explicit RDATE, nothing stepped PASS RDATE: every occurrence reports the degraded series state PASS RDATE: every occurrence reports the degraded series state PASS RDATE: the DTSTART still mints nothing PASS override naming the preserved DTSTART: the override replaces it, no twin survives PASS override naming the preserved DTSTART: at its moved position PASS override naming the preserved DTSTART: keeps its explicit RECURRENCE-ID identity PASS override naming the preserved DTSTART: an override with no rule of its own is not_recurring (per-component derivation) PASS override naming an alleged later instance: preserved DTSTART plus the orphan, nothing else PASS an override with its own duplicate RRULE is neither erased nor de-identified, and nothing is stepped from its rule == F. identity == PASS the preserved DTSTART has recurrenceId = null PASS the preserved DTSTART mints no Event Link identity PASS the identity a first-wins expansion used to mint for 11 March is not minted by anything PASS the identity a last-wins expansion used to mint for 17 March is not minted by anything == G. defence in depth == PASS a parsed duplicate-RRULE event that lies about its resolution is still refused by the expander PASS a hand-built raw component with two RRULE values normalizes to degraded_invalid PASS the expander re-derives the state from the retained count, not from the stamped field PASS a hand-built event with a scalar rrule and no count is judged as one rule (unchanged) == H. controls: single-RRULE behaviour is byte-for-byte what it was == PASS F: FREQ=DAILY;COUNT=3 -- same occurrences, same identities as before #612 PASS G: no RRULE is not_recurring, unchanged PASS H: a folded single RRULE expands exactly as the unfolded rule PASS H: a folded single RRULE with LF-only terminators is one property PASS H: a folded single RRULE with CR-only terminators is one property PASS a single unsupported rule is still degraded_unsupported, not duplicate_rrule PASS a single malformed rule is still degraded_invalid for its own reason calendar recurrence duplicate RRULE tests passed