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.
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:with
DinnerMinutes* = 18 * 60insrc/heartleaf/common.nim, so the tally minute is18*60 + 55= 6:55 PM. It gates the only place score is awarded:startDinnerPartiesrequireshost.mapIndex == mapIndexand at least one visitor on that same map at that moment, then awardshostFoods.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."startDinnerPartiesdocstring 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_villagerstarter, whosesoul.mdsays "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
startDinnerPartiesruns 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_f831ba75-e81b-4796-b8c6-cd10be18c0bf(Heartleaf), divisiondiv_396961a3-58af-4276-abc7-3f45fb7fe337cow_5a05d9d3-5911-4552-95d0-4e66969a7edb(heartleaf0.1.10)Suggested fix
Either state 6:55 PM in
docs/rules.mdanddocs/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 insrc/heartleaf.nimwould 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.