Skip to content

Heartleaf: rules docs say dinner is at 6:00 PM, but the simulation tallies at 6:55 PM #35

Description

@arisklar6

Heartleaf's player-facing rules docs state that dinner happens at 6:00 PM, but the simulation resolves dinner parties at 6:55 PM. A player author who schedules against the documented time can be outside the house when the tally runs and score nothing, with no error to explain it.

Evidence

Metta-AI/coworld-heartleaf, src/heartleaf.nim:

DinnerTallyMinutes = DinnerMinutes + 55

with DinnerMinutes* = 18 * 60 in src/heartleaf/common.nim, so the tally minute is 18*60 + 55 = 6:55 PM. It gates the only place score is awarded:

if not sim.dinnerDone and sim.currentDayMinutes() >= DinnerTallyMinutes:
  sim.startDinnerParties()

startDinnerParties requires host.mapIndex == mapIndex and at least one visitor on that same map at that moment, then awards hostFoods.totalItems() * visitors.len.

The docs disagree:

  • docs/rules.md: "Dinner happens at 6:00 PM." — also linked as the game-specific source of truth from the league participate endpoint.
  • docs/game_rules.md: "Dinner Time — Dinner happens at 6:00 PM." and "Resolves all valid 6pm dinner parties in occupied homes."
  • The startDinnerParties docstring itself says "Resolves all valid 6pm dinner parties in occupied homes."

The game's own in-game clock announcements use the correct time ("Dinner is served at 6:55pm sharp"), as does the bundled host_villager starter, whose soul.md says "INSIDE your house at 6:55pm". So the runtime and the starter agree with each other and only the rules docs are wrong.

Failure mode

A player that treats 6:00 PM as the deadline — e.g. gathers until 6:00, hosts, then leaves to resume gathering at 6:15 — is outside its house when startDinnerParties runs at 6:55 and scores 0 for that day. There is no log line, warning, or result field indicating a missed dinner; the day simply scores zero, which is indistinguishable from "hosted but had no guests".

The 55-minute gap is also large in wall-clock terms relative to what it looks like. In the league variant (daySeconds: 100, a 14-hour day), one in-game minute is ~0.119 real seconds, so the entire window between the documented and actual dinner times is only ~6.5 real seconds — easy to lose to pathing if you plan against the wrong constant.

Repro

  • League: league_f831ba75-e81b-4796-b8c6-cd10be18c0bf (Heartleaf), division div_396961a3-58af-4276-abc7-3f45fb7fe337
  • Coworld: cow_5a05d9d3-5911-4552-95d0-4e66969a7edb (heartleaf 0.1.10)
uv run coworld download cow_5a05d9d3-5911-4552-95d0-4e66969a7edb
grep -n "DinnerTallyMinutes" src/heartleaf.nim          # in the coworld-heartleaf repo
grep -rn "6:00 PM\|6pm" docs/rules.md docs/game_rules.md

Suggested fix

Either state 6:55 PM in docs/rules.md and docs/game_rules.md, or state that dinner is served at 6:00 PM but tallied at 6:55 PM and that presence is checked at the tally. Updating the two "6pm dinner parties" docstrings in src/heartleaf.nim would help too, since they are what a reader checks to confirm the docs.

Filed per the Heartleaf participate working agreement, which asks that doc/runtime disagreements be reported here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions