{
  "version": 1,
  "status": "Complete proposed annual design calendar. Five-day spirit week and Hearthday closure retained; year length, birthdays and annual occasions are authored proposals, not runtime implementation.",
  "year": {
    "days": 120,
    "weeks": 24,
    "seasons": 4,
    "daysPerSeason": 30,
    "weeksPerSeason": 6,
    "daysPerWeek": 5,
    "start": "Spring 1 · Rootday",
    "end": "Winter 30 · Hearthday",
    "rollover": "Winter 30 is followed by Spring 1 of the next year; no extra intercalary day or leap day.",
    "dateFormat": "Season + day number, optionally weekday; no extra month-name vocabulary."
  },
  "week": {
    "length": 5,
    "days": [
      {
        "id": 1,
        "name": "Rootday",
        "theme": "Ordinary work, repairs and planning",
        "spirit": {
          "name": "The Root",
          "associations": "Ancestry, endurance and belonging",
          "symbol": "root"
        },
        "memory": "Grow"
      },
      {
        "id": 2,
        "name": "Riverday",
        "theme": "Larger market and exchanges",
        "spirit": {
          "name": "The River",
          "associations": "Movement, exchange and change",
          "symbol": "wave"
        },
        "memory": "Travel"
      },
      {
        "id": 3,
        "name": "Emberday",
        "theme": "Focused work, training and the long delivery route",
        "spirit": {
          "name": "The Ember",
          "associations": "Making, courage and transformation",
          "symbol": "ember"
        },
        "memory": "Make"
      },
      {
        "id": 4,
        "name": "Bloomday",
        "theme": "Social visits and a small optional music evening",
        "spirit": {
          "name": "The Bloom",
          "associations": "Expression, generosity and fleeting beauty",
          "symbol": "flower"
        },
        "memory": "Celebrate"
      },
      {
        "id": 5,
        "name": "Hearthday",
        "theme": "All shops closed; essential care, households and optional seasonal gatherings",
        "spirit": {
          "name": "The Hearth",
          "associations": "Shelter, kinship and rest",
          "symbol": "hearth"
        },
        "memory": "Rest"
      }
    ],
    "memoryAid": "Grow → travel → make → celebrate → rest",
    "naming": "Days use familiar domains of the five great spirits; no ceremonial names need to be memorised. Spirit personalities and deeper lore remain open."
  },
  "seasons": [
    {
      "name": "Spring",
      "index": 1,
      "startDay": 1,
      "endDay": 30,
      "startWeek": 1,
      "endWeek": 6,
      "turnId": "turn-spring"
    },
    {
      "name": "Summer",
      "index": 2,
      "startDay": 31,
      "endDay": 60,
      "startWeek": 7,
      "endWeek": 12,
      "turnId": "turn-summer"
    },
    {
      "name": "Autumn",
      "index": 3,
      "startDay": 61,
      "endDay": 90,
      "startWeek": 13,
      "endWeek": 18,
      "turnId": "turn-autumn"
    },
    {
      "name": "Winter",
      "index": 4,
      "startDay": 91,
      "endDay": 120,
      "startWeek": 19,
      "endWeek": 24,
      "turnId": "turn-winter"
    }
  ],
  "rules": {
    "birthdays": "One proposed date for each of the 40 residents, ten per season. No birthdays coincide with a season-turn day or a large festival. Dates repeat annually; do not infer automatic age progression or any real person’s birthday. A greeting is sufficient; gifts and attendance are optional.",
    "birthdayRoutine": "Normal workday routines continue until the small personal celebration. Evening hosting duties yield to the birthday: Agnes has no public inn evening on Winter 2; Hesta has no cooked inn supper on Summer 20, which is already Hearthday; Riven performs no ordinary set on Summer 7; Tovin skips his ordinary inn visit on Autumn 12. Notices are posted in advance. No replacement worker invented.",
    "wren": "Wren’s Spring 23 birthday replaces her and Elian’s afternoon green outing from 16:00 with a celebration at their shared home. Elian stays with her; bedtime remains 20:00. Other parent contact is private and optional, not a new named resident.",
    "closures": "All 24 Hearthdays close every shop, market stall, routine paid service, order collection and public office. Birthdays and festivals never reopen them. Essential animal, plant and storage care, urgent healthcare and necessary watch duties continue.",
    "occasions": "One assigned Hearthday character per week. Twenty are small or quiet; only four are larger seasonal festivals. Participation is optional and does not require purchases, paid entry, gifts or profession-based unpaid labour.",
    "precedence": "Urgent safety and dependent care → accepted excursion or actual travel absence → personal birthday commitments → opted-in seasonal occasion → normal five-day routine. Skipping an event restores the personal Hearthday, not commerce.",
    "travel": "No resident birthdays fall during Evren or Seraphine’s Emberday route. Weather may still delay return; never teleport a traveller for a celebration. An acknowledgement can wait until they return.",
    "birthdayOnHearthday": "Khaeli, Hesta, Orin and Vesper have Hearthday birthdays. Players prepare gifts beforehand if they want them; a conversation is enough. Birthday plans do not reopen services or compel festival attendance.",
    "newYear": "The Long Night is on Winter 30. First Green follows on Spring 1 with normal opening hours. These are two parts of the same annual turn, not two extra days off.",
    "player": "The player chooses a birthday during character creation or later configuration. It may share a resident’s date; it does not reserve a 41st villager birthday.",
    "unbornChild": "No due date or birthday assigned to Asmo and Khaeli’s unborn child. Birth, ageing and time progression remain separate decisions.",
    "seasonTurns": "The first day of each season is a brief optional observance before normal work, not another shop-closure day. Calendar turns do not force instant weather changes."
  },
  "dateOverrides": [
    {
      "dayOfYear": 2,
      "residentId": "villager.lys",
      "placeId": "address.lys",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Enjoys a small, imperfect bunch of flowers chosen thoughtfully.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 4,
      "residentId": "villager.solan",
      "placeId": "address.carpenters-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Would like an afternoon when his own unfinished project gets attention.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 7,
      "residentId": "villager.elian",
      "placeId": "address.archive-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A family breakfast and one gloriously bad paper invention.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 9,
      "residentId": "villager.maris",
      "placeId": "address.maris",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A quiet visit and a remembered preference matter more than a crowd.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 12,
      "residentId": "villager.fen",
      "placeId": "address.fen",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Time off after animal care and company that does not need tack repaired.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 16,
      "residentId": "villager.maelle",
      "placeId": "address.maelle",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A favourite board game, played seriously rather than letting her win.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 18,
      "residentId": "villager.odel",
      "placeId": "address.farmhouse",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A small supper and a game whose score he pretends not to keep.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 20,
      "residentId": "villager.khaeli",
      "placeId": "address.leadership",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "An intimate supper with Asmo, music and a restful day; no surprise crowd.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 23,
      "residentId": "villager.wren",
      "placeId": "address.archive-household",
      "window": "16:00–18:00, with Elian",
      "activity": "Paper dragons, a handmade map and cake with Elian; celebration ends before bedtime.",
      "optionalSocialParticipation": true,
      "phase": "afternoon",
      "from": "16:00",
      "to": "18:00"
    },
    {
      "dayOfYear": 23,
      "residentId": "villager.elian",
      "placeId": "address.archive-household",
      "window": "16:00–18:00, with Elian",
      "activity": "Celebrate Wren’s birthday at home and remain responsible for her supervision.",
      "optionalSocialParticipation": true,
      "phase": "afternoon",
      "from": "16:00",
      "to": "18:00"
    },
    {
      "dayOfYear": 27,
      "residentId": "villager.joren",
      "placeId": "address.joren",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A meal somebody else cooks, followed by singing if he feels like it.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 32,
      "residentId": "villager.lira",
      "placeId": "address.lira",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A story of a new place and a picnic safely ashore.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 34,
      "residentId": "villager.mira",
      "placeId": "address.mira",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Someone else makes the cake; she is a guest, not the baker on duty.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 37,
      "residentId": "villager.riven",
      "placeId": "address.riven",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "An evening when he can listen without being asked to perform.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 39,
      "residentId": "villager.tamsin",
      "placeId": "address.tamsin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Dancing in comfortable shoes and a bold splash of colour.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 42,
      "residentId": "villager.pip",
      "placeId": "address.pip",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A tabletop game and a meal with absolutely no mushrooms.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 46,
      "residentId": "villager.evren",
      "placeId": "address.inn-lodging",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A letter worth keeping and no request for one more delivery.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 48,
      "residentId": "villager.bram",
      "placeId": "address.bram",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A small, odd bird and an evening free of repair requests.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 50,
      "residentId": "villager.hesta",
      "placeId": "address.inn-lodging",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A meal cooked by friends, with no kitchen cleanup handed back to her.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 53,
      "residentId": "villager.nils",
      "placeId": "address.nils",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "An appreciative look at a finished invention, not another urgent repair.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 57,
      "residentId": "villager.seraphine",
      "placeId": "address.seraphine",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A plain welcome home and a gift with no trade attached.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 62,
      "residentId": "villager.oren",
      "placeId": "address.farmhouse",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A seasonal supper with Odel and a story about an imperfect harvest.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 64,
      "residentId": "villager.selka",
      "placeId": "address.selka",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A daring colour pairing and time to make something for herself.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 67,
      "residentId": "villager.korvin",
      "placeId": "address.korvin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A model admired as a pleasure rather than assessed as a commission.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 69,
      "residentId": "villager.mirelle",
      "placeId": "address.clinic-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A plant grown simply because it is beautiful and a quiet hour.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 72,
      "residentId": "villager.tovin",
      "placeId": "address.tovin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A modest gathering where a plain true story is enough.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 76,
      "residentId": "villager.nessa",
      "placeId": "address.nessa",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Repairing a treasured household object with permission, not replacing it.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 78,
      "residentId": "villager.vela",
      "placeId": "address.vela",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A thoughtful sketch and a warm place to sit after putting tools down.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 80,
      "residentId": "villager.orin",
      "placeId": "address.orin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Remember the date; accept his thanks without bargaining or repayment.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 83,
      "residentId": "villager.garrick",
      "placeId": "address.garrick",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A wooden toy, shared memories and company without rank.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 87,
      "residentId": "villager.thorne",
      "placeId": "address.thorne",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A direct invitation to a small supper, with no fuss if he stays quiet.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 92,
      "residentId": "villager.agnes",
      "placeId": "address.agnes",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "An evening when someone listens to her story and she is not hosting.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 94,
      "residentId": "villager.edda",
      "placeId": "address.edda",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A book chosen for pleasure and privacy for a small celebration.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 97,
      "residentId": "villager.asmo",
      "placeId": "address.leadership",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Music with Khaeli and a birthday that is not a public leadership duty.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 99,
      "residentId": "villager.lucien",
      "placeId": "address.archive-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "An intriguing page and a conversation allowed to wander.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 102,
      "residentId": "villager.elowen",
      "placeId": "address.elowen",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "Something cheerful and ordinary; her birthday need not be about grief.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 106,
      "residentId": "villager.freya",
      "placeId": "address.freya",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A challenging puzzle and a meal without an assessment of her readiness.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 108,
      "residentId": "villager.ysra",
      "placeId": "address.clinic-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A terrible card trick, good food and no expectation of free consultations.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 110,
      "residentId": "villager.nyx",
      "placeId": "address.nyx",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A small unexpected cake, without asking whether she foresaw it.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 113,
      "residentId": "villager.torren",
      "placeId": "address.carpenters-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "An unhurried shared supper and appreciation of his domestic handiwork.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    },
    {
      "dayOfYear": 117,
      "residentId": "villager.kael",
      "placeId": "address.kael",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "activity": "A clear handover, a quiet cup and permission to leave reports unopened.",
      "optionalSocialParticipation": true,
      "phase": "evening",
      "from": "18:00",
      "to": "20:00"
    }
  ],
  "seasonTurns": [
    {
      "id": "turn-spring",
      "season": "Spring",
      "day": 1,
      "dayOfYear": 1,
      "weekday": "Rootday",
      "title": "First Green",
      "description": "Notice the first new growth; a short optional greeting on the green before ordinary opening hours.",
      "window": "08:00–08:30, optional",
      "placeId": "site.green",
      "participants": [],
      "attendance": "Voluntary drop-in; no resident is automatically taken away from essential morning care.",
      "shopsClosed": false,
      "previousSeason": "Winter",
      "previousFestival": "winter-longnight",
      "weather": "A calendar boundary changes the season; weather and plant appearance transition gradually. No guaranteed frost, thaw or bloom on this exact date."
    },
    {
      "id": "turn-summer",
      "season": "Summer",
      "day": 1,
      "dayOfYear": 31,
      "weekday": "Rootday",
      "title": "High Sun",
      "description": "Welcome summer with a brief morning gathering and a reminder to keep water available for people and animals.",
      "window": "08:00–08:30, optional",
      "placeId": "site.green",
      "participants": [],
      "attendance": "Voluntary drop-in; no resident is automatically taken away from essential morning care.",
      "shopsClosed": false,
      "previousSeason": "Spring",
      "previousFestival": "spring-lanterns",
      "weather": "A calendar boundary changes the season; weather and plant appearance transition gradually. No guaranteed frost, thaw or bloom on this exact date."
    },
    {
      "id": "turn-autumn",
      "season": "Autumn",
      "day": 1,
      "dayOfYear": 61,
      "weekday": "Rootday",
      "title": "First Gold",
      "description": "Mark the change into autumn with a brief appreciation of the season’s first harvest; ordinary work follows.",
      "window": "08:00–08:30, optional",
      "placeId": "site.green",
      "participants": [],
      "attendance": "Voluntary drop-in; no resident is automatically taken away from essential morning care.",
      "shopsClosed": false,
      "previousSeason": "Summer",
      "previousFestival": "summer-riverlights",
      "weather": "A calendar boundary changes the season; weather and plant appearance transition gradually. No guaranteed frost, thaw or bloom on this exact date."
    },
    {
      "id": "turn-winter",
      "season": "Winter",
      "day": 1,
      "dayOfYear": 91,
      "weekday": "Rootday",
      "title": "First Frost",
      "description": "Welcome winter with a brief shared light at the hall; check practical warmth and supplies without assuming instant snow.",
      "window": "08:00–08:30, optional",
      "placeId": "site.hall",
      "participants": [],
      "attendance": "Voluntary drop-in; no resident is automatically taken away from essential morning care.",
      "shopsClosed": false,
      "previousSeason": "Autumn",
      "previousFestival": "autumn-lasttable",
      "weather": "A calendar boundary changes the season; weather and plant appearance transition gradually. No guaranteed frost, thaw or bloom on this exact date."
    }
  ],
  "hearthdays": [
    {
      "id": "spring-blossoms",
      "season": "Spring",
      "seasonPosition": "Early",
      "title": "First-blossom picnic",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [
        "villager.lys",
        "villager.maris",
        "villager.khaeli",
        "villager.asmo"
      ],
      "activity": "Bring food prepared at home, notice the first flowers and share an unhurried picnic. Khaeli can sit or skip the outing.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 5,
      "dayOfYear": 5,
      "weekOfSeason": 1,
      "weekOfYear": 1,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "spring-paper",
      "season": "Spring",
      "seasonPosition": "Middle",
      "title": "Paper creatures and village maps",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.archive-school",
      "participants": [
        "villager.elian",
        "villager.wren",
        "villager.edda",
        "villager.lucien"
      ],
      "activity": "Voluntary paper creatures and playful maps, with Elian supervising Wren. Library lending and clerk services stay closed.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 10,
      "dayOfYear": 10,
      "weekOfSeason": 2,
      "weekOfYear": 2,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "spring-seeds",
      "season": "Spring",
      "title": "Seeds and stories",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [
        "villager.oren",
        "villager.pip",
        "villager.mirelle",
        "villager.odel"
      ],
      "activity": "Compare last year’s growing mishaps and share stories; no seed sales or order collection.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 15,
      "dayOfYear": 15,
      "weekOfSeason": 3,
      "weekOfYear": 3,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "spring-river",
      "season": "Spring",
      "seasonPosition": "Late",
      "title": "River stories",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.landing",
      "participants": [
        "villager.lira",
        "villager.nessa",
        "villager.seraphine",
        "villager.riven"
      ],
      "activity": "Share memories of the river from a safe bank; no fishing expedition, ferry service or trade.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 20,
      "dayOfYear": 20,
      "weekOfSeason": 4,
      "weekOfYear": 4,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "spring-doorstep",
      "season": "Spring",
      "title": "A doorstep Hearthday",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [],
      "activity": "No organised event. Private invitations, household meals and short doorstep chats mark the week.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 25,
      "dayOfYear": 25,
      "weekOfSeason": 5,
      "weekOfYear": 5,
      "scale": "quiet-week",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "spring-lanterns",
      "season": "Spring",
      "title": "Flowers & Lanterns",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [
        "villager.lys",
        "villager.asmo",
        "villager.khaeli",
        "villager.riven",
        "villager.elian",
        "villager.wren"
      ],
      "activity": "A larger but optional farewell to spring: flowers and an early lantern gathering, with music before dusk. No stalls or paid services. Elian accompanies Wren and takes her home before 20:00.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 30,
      "dayOfYear": 30,
      "weekOfSeason": 6,
      "weekOfYear": 6,
      "scale": "seasonal-festival",
      "window": "15:00–19:00, with breaks and early departures",
      "phases": [
        "afternoon",
        "evening"
      ]
    },
    {
      "id": "summer-colours",
      "season": "Summer",
      "seasonPosition": "Early",
      "title": "Colour walk",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [
        "villager.lys",
        "villager.selka",
        "villager.tamsin"
      ],
      "activity": "An easy walk to notice colours and clothes without taking commissions.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 5,
      "dayOfYear": 35,
      "weekOfSeason": 1,
      "weekOfYear": 7,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "summer-games",
      "season": "Summer",
      "seasonPosition": "Middle",
      "title": "Games under the trees",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [
        "villager.elowen",
        "villager.pip",
        "villager.maelle",
        "villager.thorne",
        "villager.garrick"
      ],
      "activity": "Bring a familiar board game and a picnic. Quiet company counts as participation; nobody is asked to perform their profession.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 10,
      "dayOfYear": 40,
      "weekOfSeason": 2,
      "weekOfYear": 8,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "summer-shade",
      "season": "Summer",
      "title": "A day in the shade",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [],
      "activity": "No organised gathering. Rest, reading and household meals; essential animal water checks still happen.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 15,
      "dayOfYear": 45,
      "weekOfSeason": 3,
      "weekOfYear": 9,
      "scale": "quiet-week",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "summer-music",
      "season": "Summer",
      "seasonPosition": "Late",
      "title": "A little music for its own sake",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.hall",
      "participants": [
        "villager.asmo",
        "villager.khaeli",
        "villager.riven",
        "villager.evren",
        "villager.tamsin"
      ],
      "activity": "Piano, harp or violin, lute and optional dancing; no public office, tickets, catering or expected performance from tired residents.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 20,
      "dayOfYear": 50,
      "weekOfSeason": 4,
      "weekOfYear": 10,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "summer-sketches",
      "season": "Summer",
      "title": "Sketches beside the water",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.landing",
      "participants": [
        "villager.solan",
        "villager.odel",
        "villager.vela",
        "villager.lira"
      ],
      "activity": "Bring a sketchbook or simply sit on the safe bank. Nobody has to be good at drawing and nothing is for sale.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 25,
      "dayOfYear": 55,
      "weekOfSeason": 5,
      "weekOfYear": 11,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "summer-riverlights",
      "season": "Summer",
      "title": "Riverlights",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.landing",
      "participants": [
        "villager.lira",
        "villager.nessa",
        "villager.seraphine",
        "villager.riven",
        "villager.kael",
        "villager.fen"
      ],
      "activity": "Farewell to summer with reusable lanterns along the bank, river stories and a small shared meal. Nothing is released into the water. Unsafe conditions cancel the waterside gathering; shops remain closed.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 30,
      "dayOfYear": 60,
      "weekOfSeason": 6,
      "weekOfYear": 12,
      "scale": "seasonal-festival",
      "window": "15:00–19:00, with breaks and early departures",
      "phases": [
        "afternoon",
        "evening"
      ]
    },
    {
      "id": "autumn-table",
      "season": "Autumn",
      "seasonPosition": "Early",
      "title": "A shared harvest table",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [
        "villager.oren",
        "villager.odel",
        "villager.joren",
        "villager.mira",
        "villager.hesta"
      ],
      "activity": "Bring a dish made voluntarily beforehand; essential animal care happens first. Hesta and Roska attend as guests, not cooks on duty.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 5,
      "dayOfYear": 65,
      "weekOfSeason": 1,
      "weekOfYear": 13,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "autumn-mending",
      "season": "Autumn",
      "seasonPosition": "Middle",
      "title": "Mend something of your own",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.craft-yard",
      "participants": [
        "villager.bram",
        "villager.solan",
        "villager.nils",
        "villager.vela",
        "villager.korvin"
      ],
      "activity": "An optional low-key gathering for personal objects, stories and sharing a simple technique. No customer intake, payment, orders or compulsory favours.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 10,
      "dayOfYear": 70,
      "weekOfSeason": 2,
      "weekOfYear": 14,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "autumn-kitchen",
      "season": "Autumn",
      "title": "A day for home kitchens",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [],
      "activity": "Private household meals and voluntary supper invitations; no public catering rota or new orders.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 15,
      "dayOfYear": 75,
      "weekOfSeason": 3,
      "weekOfYear": 15,
      "scale": "quiet-week",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "autumn-memories",
      "season": "Autumn",
      "seasonPosition": "Late",
      "title": "Stories of those remembered",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.cemetery",
      "participants": [
        "villager.elowen",
        "villager.maelle",
        "villager.lys",
        "villager.agnes"
      ],
      "activity": "A short voluntary remembrance walk. Quiet listening and declining to speak are welcome; no scheduled service fees or demanded disclosures.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 20,
      "dayOfYear": 80,
      "weekOfSeason": 4,
      "weekOfYear": 16,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "autumn-warmth",
      "season": "Autumn",
      "title": "Blankets and tall tales",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.hall",
      "participants": [
        "villager.agnes",
        "villager.hesta",
        "villager.tovin",
        "villager.edda",
        "villager.garrick"
      ],
      "activity": "Bring a blanket and a tale. Hesta and Agnes are guests; refreshments come from voluntary preparations, not an inn shift.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 25,
      "dayOfYear": 85,
      "weekOfSeason": 5,
      "weekOfYear": 17,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "autumn-lasttable",
      "season": "Autumn",
      "title": "The Last Harvest Table",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [
        "villager.oren",
        "villager.odel",
        "villager.joren",
        "villager.maris",
        "villager.mira",
        "villager.hesta"
      ],
      "activity": "An optional end-of-autumn shared table. Households bring food prepared by choice; nobody is assigned professional catering. Finish before essential evening care.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 30,
      "dayOfYear": 90,
      "weekOfSeason": 6,
      "weekOfYear": 18,
      "scale": "seasonal-festival",
      "window": "15:00–19:00, with breaks and early departures",
      "phases": [
        "afternoon",
        "evening"
      ]
    },
    {
      "id": "winter-stories",
      "season": "Winter",
      "seasonPosition": "Early",
      "title": "Stories by the hearth",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.hall",
      "participants": [
        "villager.agnes",
        "villager.edda",
        "villager.riven",
        "villager.elian",
        "villager.wren"
      ],
      "activity": "Bring a story or simply listen. Elian accompanies Wren and leaves well before bedtime; no paid inn service.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 5,
      "dayOfYear": 95,
      "weekOfSeason": 1,
      "weekOfYear": 19,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "winter-cards",
      "season": "Winter",
      "seasonPosition": "Middle",
      "title": "Cards and terrible tricks",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.hall",
      "participants": [
        "villager.ysra",
        "villager.mirelle",
        "villager.hesta",
        "villager.orin",
        "villager.seraphine"
      ],
      "activity": "A small card afternoon with food brought from home. No trading; Ysra may leave for urgent care without ending everyone’s gathering.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 10,
      "dayOfYear": 100,
      "weekOfSeason": 2,
      "weekOfYear": 20,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "winter-puzzles",
      "season": "Winter",
      "title": "Puzzles by the fire",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.hall",
      "participants": [
        "villager.freya",
        "villager.nils",
        "villager.korvin",
        "villager.edda"
      ],
      "activity": "Bring a favourite puzzle or watch others reason it out. No repairs, commissions or entrance fee.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 15,
      "dayOfYear": 105,
      "weekOfSeason": 3,
      "weekOfYear": 21,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "winter-quiet",
      "season": "Winter",
      "seasonPosition": "Late",
      "title": "A quiet Hearthday",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.green",
      "participants": [],
      "activity": "No scheduled gathering. Small household traditions, private invitations and a short walk make this week distinct without another event.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel outdoor gatherings in unsafe weather; participants keep their personal Hearthday. Do not assume an unplanned indoor venue has room.",
      "seasonDay": 20,
      "dayOfYear": 110,
      "weekOfSeason": 4,
      "weekOfYear": 22,
      "scale": "quiet-week",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "winter-letters",
      "season": "Winter",
      "title": "Letters before the turning",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.archive-school",
      "participants": [
        "villager.elian",
        "villager.wren",
        "villager.lucien",
        "villager.evren"
      ],
      "activity": "Write or draw personal letters, with Elian supervising Wren. This is a social gathering, not clerk hours, school or paid courier collection.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 25,
      "dayOfYear": 115,
      "weekOfSeason": 5,
      "weekOfYear": 23,
      "scale": "small-gathering",
      "window": "A short visit within 14:00–18:00",
      "phases": [
        "afternoon"
      ]
    },
    {
      "id": "winter-longnight",
      "season": "Winter",
      "title": "The Long Night",
      "day": 5,
      "phase": "afternoon",
      "placeId": "site.hall",
      "participants": [
        "villager.asmo",
        "villager.khaeli",
        "villager.riven",
        "villager.maelle",
        "villager.elowen",
        "villager.elian",
        "villager.wren"
      ],
      "activity": "A larger year-end evening of warm light, music and remembered kindnesses. The family portion ends before Wren’s bedtime; no one must stay until midnight. Next morning begins Spring 1.",
      "optional": true,
      "commerce": false,
      "weatherFallback": "Cancel unsafe outdoor gatherings; personal Hearthday routines remain available. Do not assume a new indoor venue.",
      "seasonDay": 30,
      "dayOfYear": 120,
      "weekOfSeason": 6,
      "weekOfYear": 24,
      "scale": "seasonal-festival",
      "window": "16:00–20:00 family gathering; optional adult music afterward",
      "phases": [
        "afternoon",
        "evening"
      ]
    }
  ],
  "birthdays": [
    {
      "residentId": "villager.lys",
      "name": "Aveline",
      "season": "Spring",
      "day": 2,
      "dayOfYear": 2,
      "weekday": "Riverday",
      "weekOfYear": 1,
      "placeId": "address.lys",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Enjoys a small, imperfect bunch of flowers chosen thoughtfully.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.solan",
      "name": "Dain",
      "season": "Spring",
      "day": 4,
      "dayOfYear": 4,
      "weekday": "Bloomday",
      "weekOfYear": 1,
      "placeId": "address.carpenters-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Would like an afternoon when his own unfinished project gets attention.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.elian",
      "name": "Elian",
      "season": "Spring",
      "day": 7,
      "dayOfYear": 7,
      "weekday": "Riverday",
      "weekOfYear": 2,
      "placeId": "address.archive-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A family breakfast and one gloriously bad paper invention.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.maris",
      "name": "Maris",
      "season": "Spring",
      "day": 9,
      "dayOfYear": 9,
      "weekday": "Bloomday",
      "weekOfYear": 2,
      "placeId": "address.maris",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A quiet visit and a remembered preference matter more than a crowd.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.fen",
      "name": "Fen",
      "season": "Spring",
      "day": 12,
      "dayOfYear": 12,
      "weekday": "Riverday",
      "weekOfYear": 3,
      "placeId": "address.fen",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Time off after animal care and company that does not need tack repaired.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.maelle",
      "name": "Maelle",
      "season": "Spring",
      "day": 16,
      "dayOfYear": 16,
      "weekday": "Rootday",
      "weekOfYear": 4,
      "placeId": "address.maelle",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A favourite board game, played seriously rather than letting her win.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.odel",
      "name": "Odel",
      "season": "Spring",
      "day": 18,
      "dayOfYear": 18,
      "weekday": "Emberday",
      "weekOfYear": 4,
      "placeId": "address.farmhouse",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A small supper and a game whose score he pretends not to keep.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.khaeli",
      "name": "Khaeli",
      "season": "Spring",
      "day": 20,
      "dayOfYear": 20,
      "weekday": "Hearthday",
      "weekOfYear": 4,
      "placeId": "address.leadership",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "An intimate supper with Asmo, music and a restful day; no surprise crowd.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": true
    },
    {
      "residentId": "villager.wren",
      "name": "Wren",
      "season": "Spring",
      "day": 23,
      "dayOfYear": 23,
      "weekday": "Emberday",
      "weekOfYear": 5,
      "placeId": "address.archive-household",
      "window": "16:00–18:00, with Elian",
      "celebration": "Paper dragons, a handmade map and cake with Elian; celebration ends before bedtime.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.joren",
      "name": "Joren",
      "season": "Spring",
      "day": 27,
      "dayOfYear": 27,
      "weekday": "Riverday",
      "weekOfYear": 6,
      "placeId": "address.joren",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A meal somebody else cooks, followed by singing if he feels like it.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.lira",
      "name": "Lira",
      "season": "Summer",
      "day": 2,
      "dayOfYear": 32,
      "weekday": "Riverday",
      "weekOfYear": 7,
      "placeId": "address.lira",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A story of a new place and a picnic safely ashore.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.mira",
      "name": "Roska",
      "season": "Summer",
      "day": 4,
      "dayOfYear": 34,
      "weekday": "Bloomday",
      "weekOfYear": 7,
      "placeId": "address.mira",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Someone else makes the cake; she is a guest, not the baker on duty.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.riven",
      "name": "Riven",
      "season": "Summer",
      "day": 7,
      "dayOfYear": 37,
      "weekday": "Riverday",
      "weekOfYear": 8,
      "placeId": "address.riven",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "An evening when he can listen without being asked to perform.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.tamsin",
      "name": "Tamsin",
      "season": "Summer",
      "day": 9,
      "dayOfYear": 39,
      "weekday": "Bloomday",
      "weekOfYear": 8,
      "placeId": "address.tamsin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Dancing in comfortable shoes and a bold splash of colour.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.pip",
      "name": "Merrit",
      "season": "Summer",
      "day": 12,
      "dayOfYear": 42,
      "weekday": "Riverday",
      "weekOfYear": 9,
      "placeId": "address.pip",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A tabletop game and a meal with absolutely no mushrooms.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.evren",
      "name": "Evren",
      "season": "Summer",
      "day": 16,
      "dayOfYear": 46,
      "weekday": "Rootday",
      "weekOfYear": 10,
      "placeId": "address.inn-lodging",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A letter worth keeping and no request for one more delivery.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.bram",
      "name": "Bram",
      "season": "Summer",
      "day": 18,
      "dayOfYear": 48,
      "weekday": "Emberday",
      "weekOfYear": 10,
      "placeId": "address.bram",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A small, odd bird and an evening free of repair requests.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.hesta",
      "name": "Hesta",
      "season": "Summer",
      "day": 20,
      "dayOfYear": 50,
      "weekday": "Hearthday",
      "weekOfYear": 10,
      "placeId": "address.inn-lodging",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A meal cooked by friends, with no kitchen cleanup handed back to her.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": true
    },
    {
      "residentId": "villager.nils",
      "name": "Nils",
      "season": "Summer",
      "day": 23,
      "dayOfYear": 53,
      "weekday": "Emberday",
      "weekOfYear": 11,
      "placeId": "address.nils",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "An appreciative look at a finished invention, not another urgent repair.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.seraphine",
      "name": "Seraphine",
      "season": "Summer",
      "day": 27,
      "dayOfYear": 57,
      "weekday": "Riverday",
      "weekOfYear": 12,
      "placeId": "address.seraphine",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A plain welcome home and a gift with no trade attached.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.oren",
      "name": "Halric",
      "season": "Autumn",
      "day": 2,
      "dayOfYear": 62,
      "weekday": "Riverday",
      "weekOfYear": 13,
      "placeId": "address.farmhouse",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A seasonal supper with Odel and a story about an imperfect harvest.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.selka",
      "name": "Sabine",
      "season": "Autumn",
      "day": 4,
      "dayOfYear": 64,
      "weekday": "Bloomday",
      "weekOfYear": 13,
      "placeId": "address.selka",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A daring colour pairing and time to make something for herself.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.korvin",
      "name": "Korvin",
      "season": "Autumn",
      "day": 7,
      "dayOfYear": 67,
      "weekday": "Riverday",
      "weekOfYear": 14,
      "placeId": "address.korvin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A model admired as a pleasure rather than assessed as a commission.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.mirelle",
      "name": "Ivara",
      "season": "Autumn",
      "day": 9,
      "dayOfYear": 69,
      "weekday": "Bloomday",
      "weekOfYear": 14,
      "placeId": "address.clinic-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A plant grown simply because it is beautiful and a quiet hour.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.tovin",
      "name": "Tovin",
      "season": "Autumn",
      "day": 12,
      "dayOfYear": 72,
      "weekday": "Riverday",
      "weekOfYear": 15,
      "placeId": "address.tovin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A modest gathering where a plain true story is enough.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.nessa",
      "name": "Nessa",
      "season": "Autumn",
      "day": 16,
      "dayOfYear": 76,
      "weekday": "Rootday",
      "weekOfYear": 16,
      "placeId": "address.nessa",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Repairing a treasured household object with permission, not replacing it.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.vela",
      "name": "Vela",
      "season": "Autumn",
      "day": 18,
      "dayOfYear": 78,
      "weekday": "Emberday",
      "weekOfYear": 16,
      "placeId": "address.vela",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A thoughtful sketch and a warm place to sit after putting tools down.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.orin",
      "name": "Orin",
      "season": "Autumn",
      "day": 20,
      "dayOfYear": 80,
      "weekday": "Hearthday",
      "weekOfYear": 16,
      "placeId": "address.orin",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Remember the date; accept his thanks without bargaining or repayment.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": true
    },
    {
      "residentId": "villager.garrick",
      "name": "Garrick",
      "season": "Autumn",
      "day": 23,
      "dayOfYear": 83,
      "weekday": "Emberday",
      "weekOfYear": 17,
      "placeId": "address.garrick",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A wooden toy, shared memories and company without rank.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.thorne",
      "name": "Thorne",
      "season": "Autumn",
      "day": 27,
      "dayOfYear": 87,
      "weekday": "Riverday",
      "weekOfYear": 18,
      "placeId": "address.thorne",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A direct invitation to a small supper, with no fuss if he stays quiet.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.agnes",
      "name": "Agnes",
      "season": "Winter",
      "day": 2,
      "dayOfYear": 92,
      "weekday": "Riverday",
      "weekOfYear": 19,
      "placeId": "address.agnes",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "An evening when someone listens to her story and she is not hosting.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.edda",
      "name": "Edda",
      "season": "Winter",
      "day": 4,
      "dayOfYear": 94,
      "weekday": "Bloomday",
      "weekOfYear": 19,
      "placeId": "address.edda",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A book chosen for pleasure and privacy for a small celebration.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.asmo",
      "name": "Asmo",
      "season": "Winter",
      "day": 7,
      "dayOfYear": 97,
      "weekday": "Riverday",
      "weekOfYear": 20,
      "placeId": "address.leadership",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Music with Khaeli and a birthday that is not a public leadership duty.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.lucien",
      "name": "Lucien",
      "season": "Winter",
      "day": 9,
      "dayOfYear": 99,
      "weekday": "Bloomday",
      "weekOfYear": 20,
      "placeId": "address.archive-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "An intriguing page and a conversation allowed to wander.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.elowen",
      "name": "Morwen",
      "season": "Winter",
      "day": 12,
      "dayOfYear": 102,
      "weekday": "Riverday",
      "weekOfYear": 21,
      "placeId": "address.elowen",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "Something cheerful and ordinary; her birthday need not be about grief.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.freya",
      "name": "Freya",
      "season": "Winter",
      "day": 16,
      "dayOfYear": 106,
      "weekday": "Rootday",
      "weekOfYear": 22,
      "placeId": "address.freya",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A challenging puzzle and a meal without an assessment of her readiness.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.ysra",
      "name": "Ysra",
      "season": "Winter",
      "day": 18,
      "dayOfYear": 108,
      "weekday": "Emberday",
      "weekOfYear": 22,
      "placeId": "address.clinic-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A terrible card trick, good food and no expectation of free consultations.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.nyx",
      "name": "Vesper",
      "season": "Winter",
      "day": 20,
      "dayOfYear": 110,
      "weekday": "Hearthday",
      "weekOfYear": 22,
      "placeId": "address.nyx",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A small unexpected cake, without asking whether she foresaw it.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": true
    },
    {
      "residentId": "villager.torren",
      "name": "Torren",
      "season": "Winter",
      "day": 23,
      "dayOfYear": 113,
      "weekday": "Emberday",
      "weekOfYear": 23,
      "placeId": "address.carpenters-household",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "An unhurried shared supper and appreciation of his domestic handiwork.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    },
    {
      "residentId": "villager.kael",
      "name": "Kael",
      "season": "Winter",
      "day": 27,
      "dayOfYear": 117,
      "weekday": "Riverday",
      "weekOfYear": 24,
      "placeId": "address.kael",
      "window": "18:00–20:00, a short optional greeting or invitation",
      "celebration": "A clear handover, a quiet cup and permission to leave reports unopened.",
      "status": "Proposed fictional birthday; not inferred from a real person",
      "shopsClosed": false
    }
  ],
  "days": [
    {
      "dayOfYear": 1,
      "season": "Spring",
      "seasonDay": 1,
      "weekOfSeason": 1,
      "weekOfYear": 1,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": "turn-spring",
      "reminders": []
    },
    {
      "dayOfYear": 2,
      "season": "Spring",
      "seasonDay": 2,
      "weekOfSeason": 1,
      "weekOfYear": 1,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.lys",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 3,
      "season": "Spring",
      "seasonDay": 3,
      "weekOfSeason": 1,
      "weekOfYear": 1,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 4,
      "season": "Spring",
      "seasonDay": 4,
      "weekOfSeason": 1,
      "weekOfYear": 1,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.solan",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 5,
      "season": "Spring",
      "seasonDay": 5,
      "weekOfSeason": 1,
      "weekOfYear": 1,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "spring-blossoms",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 6,
      "season": "Spring",
      "seasonDay": 6,
      "weekOfSeason": 2,
      "weekOfYear": 2,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 7,
      "season": "Spring",
      "seasonDay": 7,
      "weekOfSeason": 2,
      "weekOfYear": 2,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.elian",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 8,
      "season": "Spring",
      "seasonDay": 8,
      "weekOfSeason": 2,
      "weekOfYear": 2,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 9,
      "season": "Spring",
      "seasonDay": 9,
      "weekOfSeason": 2,
      "weekOfYear": 2,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.maris",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 10,
      "season": "Spring",
      "seasonDay": 10,
      "weekOfSeason": 2,
      "weekOfYear": 2,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "spring-paper",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 11,
      "season": "Spring",
      "seasonDay": 11,
      "weekOfSeason": 3,
      "weekOfYear": 3,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 12,
      "season": "Spring",
      "seasonDay": 12,
      "weekOfSeason": 3,
      "weekOfYear": 3,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.fen",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 13,
      "season": "Spring",
      "seasonDay": 13,
      "weekOfSeason": 3,
      "weekOfYear": 3,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 14,
      "season": "Spring",
      "seasonDay": 14,
      "weekOfSeason": 3,
      "weekOfYear": 3,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 15,
      "season": "Spring",
      "seasonDay": 15,
      "weekOfSeason": 3,
      "weekOfYear": 3,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "spring-seeds",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 16,
      "season": "Spring",
      "seasonDay": 16,
      "weekOfSeason": 4,
      "weekOfYear": 4,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": "villager.maelle",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 17,
      "season": "Spring",
      "seasonDay": 17,
      "weekOfSeason": 4,
      "weekOfYear": 4,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 18,
      "season": "Spring",
      "seasonDay": 18,
      "weekOfSeason": 4,
      "weekOfYear": 4,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.odel",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 19,
      "season": "Spring",
      "seasonDay": 19,
      "weekOfSeason": 4,
      "weekOfYear": 4,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 20,
      "season": "Spring",
      "seasonDay": 20,
      "weekOfSeason": 4,
      "weekOfYear": 4,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": "villager.khaeli",
      "hearthdayId": "spring-river",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 21,
      "season": "Spring",
      "seasonDay": 21,
      "weekOfSeason": 5,
      "weekOfYear": 5,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 22,
      "season": "Spring",
      "seasonDay": 22,
      "weekOfSeason": 5,
      "weekOfYear": 5,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 23,
      "season": "Spring",
      "seasonDay": 23,
      "weekOfSeason": 5,
      "weekOfYear": 5,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.wren",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 24,
      "season": "Spring",
      "seasonDay": 24,
      "weekOfSeason": 5,
      "weekOfYear": 5,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 25,
      "season": "Spring",
      "seasonDay": 25,
      "weekOfSeason": 5,
      "weekOfYear": 5,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "spring-doorstep",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 26,
      "season": "Spring",
      "seasonDay": 26,
      "weekOfSeason": 6,
      "weekOfYear": 6,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 27,
      "season": "Spring",
      "seasonDay": 27,
      "weekOfSeason": 6,
      "weekOfYear": 6,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.joren",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 28,
      "season": "Spring",
      "seasonDay": 28,
      "weekOfSeason": 6,
      "weekOfYear": 6,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 29,
      "season": "Spring",
      "seasonDay": 29,
      "weekOfSeason": 6,
      "weekOfYear": 6,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 30,
      "season": "Spring",
      "seasonDay": 30,
      "weekOfSeason": 6,
      "weekOfYear": 6,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "spring-lanterns",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 31,
      "season": "Summer",
      "seasonDay": 1,
      "weekOfSeason": 1,
      "weekOfYear": 7,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": "turn-summer",
      "reminders": []
    },
    {
      "dayOfYear": 32,
      "season": "Summer",
      "seasonDay": 2,
      "weekOfSeason": 1,
      "weekOfYear": 7,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.lira",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 33,
      "season": "Summer",
      "seasonDay": 3,
      "weekOfSeason": 1,
      "weekOfYear": 7,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 34,
      "season": "Summer",
      "seasonDay": 4,
      "weekOfSeason": 1,
      "weekOfYear": 7,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.mira",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 35,
      "season": "Summer",
      "seasonDay": 5,
      "weekOfSeason": 1,
      "weekOfYear": 7,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "summer-colours",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 36,
      "season": "Summer",
      "seasonDay": 6,
      "weekOfSeason": 2,
      "weekOfYear": 8,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 37,
      "season": "Summer",
      "seasonDay": 7,
      "weekOfSeason": 2,
      "weekOfYear": 8,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.riven",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 38,
      "season": "Summer",
      "seasonDay": 8,
      "weekOfSeason": 2,
      "weekOfYear": 8,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 39,
      "season": "Summer",
      "seasonDay": 9,
      "weekOfSeason": 2,
      "weekOfYear": 8,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.tamsin",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 40,
      "season": "Summer",
      "seasonDay": 10,
      "weekOfSeason": 2,
      "weekOfYear": 8,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "summer-games",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 41,
      "season": "Summer",
      "seasonDay": 11,
      "weekOfSeason": 3,
      "weekOfYear": 9,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 42,
      "season": "Summer",
      "seasonDay": 12,
      "weekOfSeason": 3,
      "weekOfYear": 9,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.pip",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 43,
      "season": "Summer",
      "seasonDay": 13,
      "weekOfSeason": 3,
      "weekOfYear": 9,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 44,
      "season": "Summer",
      "seasonDay": 14,
      "weekOfSeason": 3,
      "weekOfYear": 9,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 45,
      "season": "Summer",
      "seasonDay": 15,
      "weekOfSeason": 3,
      "weekOfYear": 9,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "summer-shade",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 46,
      "season": "Summer",
      "seasonDay": 16,
      "weekOfSeason": 4,
      "weekOfYear": 10,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": "villager.evren",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 47,
      "season": "Summer",
      "seasonDay": 17,
      "weekOfSeason": 4,
      "weekOfYear": 10,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 48,
      "season": "Summer",
      "seasonDay": 18,
      "weekOfSeason": 4,
      "weekOfYear": 10,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.bram",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 49,
      "season": "Summer",
      "seasonDay": 19,
      "weekOfSeason": 4,
      "weekOfYear": 10,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 50,
      "season": "Summer",
      "seasonDay": 20,
      "weekOfSeason": 4,
      "weekOfYear": 10,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": "villager.hesta",
      "hearthdayId": "summer-music",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 51,
      "season": "Summer",
      "seasonDay": 21,
      "weekOfSeason": 5,
      "weekOfYear": 11,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 52,
      "season": "Summer",
      "seasonDay": 22,
      "weekOfSeason": 5,
      "weekOfYear": 11,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 53,
      "season": "Summer",
      "seasonDay": 23,
      "weekOfSeason": 5,
      "weekOfYear": 11,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.nils",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 54,
      "season": "Summer",
      "seasonDay": 24,
      "weekOfSeason": 5,
      "weekOfYear": 11,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 55,
      "season": "Summer",
      "seasonDay": 25,
      "weekOfSeason": 5,
      "weekOfYear": 11,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "summer-sketches",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 56,
      "season": "Summer",
      "seasonDay": 26,
      "weekOfSeason": 6,
      "weekOfYear": 12,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 57,
      "season": "Summer",
      "seasonDay": 27,
      "weekOfSeason": 6,
      "weekOfYear": 12,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.seraphine",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 58,
      "season": "Summer",
      "seasonDay": 28,
      "weekOfSeason": 6,
      "weekOfYear": 12,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 59,
      "season": "Summer",
      "seasonDay": 29,
      "weekOfSeason": 6,
      "weekOfYear": 12,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 60,
      "season": "Summer",
      "seasonDay": 30,
      "weekOfSeason": 6,
      "weekOfYear": 12,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "summer-riverlights",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 61,
      "season": "Autumn",
      "seasonDay": 1,
      "weekOfSeason": 1,
      "weekOfYear": 13,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": "turn-autumn",
      "reminders": []
    },
    {
      "dayOfYear": 62,
      "season": "Autumn",
      "seasonDay": 2,
      "weekOfSeason": 1,
      "weekOfYear": 13,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.oren",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 63,
      "season": "Autumn",
      "seasonDay": 3,
      "weekOfSeason": 1,
      "weekOfYear": 13,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 64,
      "season": "Autumn",
      "seasonDay": 4,
      "weekOfSeason": 1,
      "weekOfYear": 13,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.selka",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 65,
      "season": "Autumn",
      "seasonDay": 5,
      "weekOfSeason": 1,
      "weekOfYear": 13,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "autumn-table",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 66,
      "season": "Autumn",
      "seasonDay": 6,
      "weekOfSeason": 2,
      "weekOfYear": 14,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 67,
      "season": "Autumn",
      "seasonDay": 7,
      "weekOfSeason": 2,
      "weekOfYear": 14,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.korvin",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 68,
      "season": "Autumn",
      "seasonDay": 8,
      "weekOfSeason": 2,
      "weekOfYear": 14,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 69,
      "season": "Autumn",
      "seasonDay": 9,
      "weekOfSeason": 2,
      "weekOfYear": 14,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.mirelle",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 70,
      "season": "Autumn",
      "seasonDay": 10,
      "weekOfSeason": 2,
      "weekOfYear": 14,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "autumn-mending",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 71,
      "season": "Autumn",
      "seasonDay": 11,
      "weekOfSeason": 3,
      "weekOfYear": 15,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 72,
      "season": "Autumn",
      "seasonDay": 12,
      "weekOfSeason": 3,
      "weekOfYear": 15,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.tovin",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 73,
      "season": "Autumn",
      "seasonDay": 13,
      "weekOfSeason": 3,
      "weekOfYear": 15,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 74,
      "season": "Autumn",
      "seasonDay": 14,
      "weekOfSeason": 3,
      "weekOfYear": 15,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 75,
      "season": "Autumn",
      "seasonDay": 15,
      "weekOfSeason": 3,
      "weekOfYear": 15,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "autumn-kitchen",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 76,
      "season": "Autumn",
      "seasonDay": 16,
      "weekOfSeason": 4,
      "weekOfYear": 16,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": "villager.nessa",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 77,
      "season": "Autumn",
      "seasonDay": 17,
      "weekOfSeason": 4,
      "weekOfYear": 16,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 78,
      "season": "Autumn",
      "seasonDay": 18,
      "weekOfSeason": 4,
      "weekOfYear": 16,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.vela",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 79,
      "season": "Autumn",
      "seasonDay": 19,
      "weekOfSeason": 4,
      "weekOfYear": 16,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 80,
      "season": "Autumn",
      "seasonDay": 20,
      "weekOfSeason": 4,
      "weekOfYear": 16,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": "villager.orin",
      "hearthdayId": "autumn-memories",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 81,
      "season": "Autumn",
      "seasonDay": 21,
      "weekOfSeason": 5,
      "weekOfYear": 17,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 82,
      "season": "Autumn",
      "seasonDay": 22,
      "weekOfSeason": 5,
      "weekOfYear": 17,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 83,
      "season": "Autumn",
      "seasonDay": 23,
      "weekOfSeason": 5,
      "weekOfYear": 17,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.garrick",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 84,
      "season": "Autumn",
      "seasonDay": 24,
      "weekOfSeason": 5,
      "weekOfYear": 17,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 85,
      "season": "Autumn",
      "seasonDay": 25,
      "weekOfSeason": 5,
      "weekOfYear": 17,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "autumn-warmth",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 86,
      "season": "Autumn",
      "seasonDay": 26,
      "weekOfSeason": 6,
      "weekOfYear": 18,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 87,
      "season": "Autumn",
      "seasonDay": 27,
      "weekOfSeason": 6,
      "weekOfYear": 18,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.thorne",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 88,
      "season": "Autumn",
      "seasonDay": 28,
      "weekOfSeason": 6,
      "weekOfYear": 18,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 89,
      "season": "Autumn",
      "seasonDay": 29,
      "weekOfSeason": 6,
      "weekOfYear": 18,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 90,
      "season": "Autumn",
      "seasonDay": 30,
      "weekOfSeason": 6,
      "weekOfYear": 18,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "autumn-lasttable",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 91,
      "season": "Winter",
      "seasonDay": 1,
      "weekOfSeason": 1,
      "weekOfYear": 19,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": "turn-winter",
      "reminders": []
    },
    {
      "dayOfYear": 92,
      "season": "Winter",
      "seasonDay": 2,
      "weekOfSeason": 1,
      "weekOfYear": 19,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.agnes",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 93,
      "season": "Winter",
      "seasonDay": 3,
      "weekOfSeason": 1,
      "weekOfYear": 19,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 94,
      "season": "Winter",
      "seasonDay": 4,
      "weekOfSeason": 1,
      "weekOfYear": 19,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.edda",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 95,
      "season": "Winter",
      "seasonDay": 5,
      "weekOfSeason": 1,
      "weekOfYear": 19,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "winter-stories",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 96,
      "season": "Winter",
      "seasonDay": 6,
      "weekOfSeason": 2,
      "weekOfYear": 20,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 97,
      "season": "Winter",
      "seasonDay": 7,
      "weekOfSeason": 2,
      "weekOfYear": 20,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.asmo",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 98,
      "season": "Winter",
      "seasonDay": 8,
      "weekOfSeason": 2,
      "weekOfYear": 20,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 99,
      "season": "Winter",
      "seasonDay": 9,
      "weekOfSeason": 2,
      "weekOfYear": 20,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": "villager.lucien",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 100,
      "season": "Winter",
      "seasonDay": 10,
      "weekOfSeason": 2,
      "weekOfYear": 20,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "winter-cards",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 101,
      "season": "Winter",
      "seasonDay": 11,
      "weekOfSeason": 3,
      "weekOfYear": 21,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 102,
      "season": "Winter",
      "seasonDay": 12,
      "weekOfSeason": 3,
      "weekOfYear": 21,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.elowen",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 103,
      "season": "Winter",
      "seasonDay": 13,
      "weekOfSeason": 3,
      "weekOfYear": 21,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 104,
      "season": "Winter",
      "seasonDay": 14,
      "weekOfSeason": 3,
      "weekOfYear": 21,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 105,
      "season": "Winter",
      "seasonDay": 15,
      "weekOfSeason": 3,
      "weekOfYear": 21,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "winter-puzzles",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 106,
      "season": "Winter",
      "seasonDay": 16,
      "weekOfSeason": 4,
      "weekOfYear": 22,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": "villager.freya",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 107,
      "season": "Winter",
      "seasonDay": 17,
      "weekOfSeason": 4,
      "weekOfYear": 22,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 108,
      "season": "Winter",
      "seasonDay": 18,
      "weekOfSeason": 4,
      "weekOfYear": 22,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.ysra",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 109,
      "season": "Winter",
      "seasonDay": 19,
      "weekOfSeason": 4,
      "weekOfYear": 22,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 110,
      "season": "Winter",
      "seasonDay": 20,
      "weekOfSeason": 4,
      "weekOfYear": 22,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": "villager.nyx",
      "hearthdayId": "winter-quiet",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 111,
      "season": "Winter",
      "seasonDay": 21,
      "weekOfSeason": 5,
      "weekOfYear": 23,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 112,
      "season": "Winter",
      "seasonDay": 22,
      "weekOfSeason": 5,
      "weekOfYear": 23,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 113,
      "season": "Winter",
      "seasonDay": 23,
      "weekOfSeason": 5,
      "weekOfYear": 23,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": "villager.torren",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 114,
      "season": "Winter",
      "seasonDay": 24,
      "weekOfSeason": 5,
      "weekOfYear": 23,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 115,
      "season": "Winter",
      "seasonDay": 25,
      "weekOfSeason": 5,
      "weekOfYear": 23,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "winter-letters",
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 116,
      "season": "Winter",
      "seasonDay": 26,
      "weekOfSeason": 6,
      "weekOfYear": 24,
      "weekdayId": 1,
      "weekday": "Rootday",
      "spirit": "The Root",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 117,
      "season": "Winter",
      "seasonDay": 27,
      "weekOfSeason": 6,
      "weekOfYear": 24,
      "weekdayId": 2,
      "weekday": "Riverday",
      "spirit": "The River",
      "shopsOpen": true,
      "birthdayId": "villager.kael",
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 118,
      "season": "Winter",
      "seasonDay": 28,
      "weekOfSeason": 6,
      "weekOfYear": 24,
      "weekdayId": 3,
      "weekday": "Emberday",
      "spirit": "The Ember",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": []
    },
    {
      "dayOfYear": 119,
      "season": "Winter",
      "seasonDay": 29,
      "weekOfSeason": 6,
      "weekOfYear": 24,
      "weekdayId": 4,
      "weekday": "Bloomday",
      "spirit": "The Bloom",
      "shopsOpen": true,
      "birthdayId": null,
      "hearthdayId": null,
      "seasonTurnId": null,
      "reminders": [
        "Tomorrow is Hearthday: all shops and routine paid services close. Buy provisions today."
      ]
    },
    {
      "dayOfYear": 120,
      "season": "Winter",
      "seasonDay": 30,
      "weekOfSeason": 6,
      "weekOfYear": 24,
      "weekdayId": 5,
      "weekday": "Hearthday",
      "spirit": "The Hearth",
      "shopsOpen": false,
      "birthdayId": null,
      "hearthdayId": "winter-longnight",
      "seasonTurnId": null,
      "reminders": []
    }
  ]
}
