Skip to content

Commit 67b5add

Browse files
W105.3 — Fold in the vehicle transport waiver from games/03-game-design.md sec16.4
The user supplied the companion game design doc directly, revealing "Transport ... waived if the player owns a vehicle" -- an asymmetry the original W105.3 amendment missed (transportCents was unconditional, same as utilitiesCents). Added a reserved "vehicle" tag on ItemDefinition.tags that housing checks against player.inventory; utilitiesCents keeps no such waiver, matching sec16.4's own asymmetry. Revised the 90-decisions.md entry in place rather than superseding it, since the PR hasn't merged.
1 parent af11535 commit 67b5add

3 files changed

Lines changed: 35 additions & 3 deletions

File tree

design/20-contract.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5087,7 +5087,7 @@ value this kind computes rather than stores.
50875087
**`utilitiesCents`/`transportCents` (W105.3; [issue #109](https://github.com/The-Running-Dev/SubZeroDev.GameOfLife/issues/109)).**
50885088
Charged separately from rent means itemized as distinct cost lines a player can see, not a
50895089
separate consequence track: the `housing` end-of-week system (§3) charges
5090-
`weeklyCostCents + utilitiesCents + transportCents` as one combined levy against
5090+
`weeklyCostCents + utilitiesCents + effectiveTransportCents` as one combined levy against
50915091
`cashCents`, unconditionally, in the same pass and by the same rule §3's own W53/W55 decision
50925092
already gives rent alone (`90-decisions.md`, 2026-08-08 entry) — `cashCents` may go negative,
50935093
proving the same "wages before costs" ordering claim. `missedCents` is computed from that
@@ -5099,6 +5099,20 @@ content that declares neither is unaffected. `HousingState` (§6.9) gains matchi
50995099
`weeklyCostCents` already is — a `kindVersion` bump and `Kind.migrateState` default both to `0`
51005100
for a save with no such fields (§10.2).
51015101

5102+
**`transportCents` is waived when the player owns a vehicle; `utilitiesCents` is not.** The
5103+
companion game design (`games/03-game-design.md` §16.4, mirrored from GameOfLife) states this
5104+
asymmetry directly for its own baseline scenario: "Transport ... waived if the player owns a
5105+
vehicle," with no equivalent stated for utilities. `effectiveTransportCents` (above) is
5106+
`0` for a week in which `player.inventory` (§6.10) contains at least one `InventoryItem` with
5107+
`condition > 0` whose `ItemDefinition.tags` (§7.5) includes the reserved literal `"vehicle"`,
5108+
and `HousingState.transportCents` otherwise. **`"vehicle"` is this kind's first
5109+
engine-recognized tag value** — every other `tags: string[]` field in this kind (§7.2, §7.5,
5110+
§7.6, §7.9) is free-text content-author metadata nothing in `src/engine` branches on; this is
5111+
the first tag the `housing` system itself reads, the same kind of reserved-namespace
5112+
precedent `core.reason.*` (04 §12) already sets for reason codes. `housing` (§3) is threaded
5113+
`items: readonly ItemDefinition[]` to evaluate this, the same parameter shape `jobs`/`goalDefs`
5114+
already use for their own end-of-week systems.
5115+
51025116
### 7.5 Items
51035117

51045118
```typescript

design/90-decisions.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1498,7 +1498,11 @@ Chosen (user-selected over the alternative below): two new optional `Cents` fiel
14981498

14991499
Rejected: **Separate arrears tracking** (independent `overdueUtilitiesCents`-style state, no eviction consequence for utilities/transport specifically) — presented to the user as the alternative and declined; more faithful to "separate from rent" as a full consequence split, but adds new runtime state and a second reconciliation rule with no player action (a `pay_bills`-equivalent) specified to clear it, for a distinction (eviction only ever follows unpaid rent, never unpaid utilities) the issue never asked for.
15001500

1501-
Reversibility: cheap as a contract statement; a `kindVersion` bump and `Kind.migrateState` are real once implemented, and the combined-levy choice becomes a compatibility surface for any Stable Life save that predates it.
1501+
**Revised the same day, against new evidence.** The user supplied `games/03-game-design.md` §16.4 directly after this entry was first written from the issue text alone. It states the recurring-cost baseline as a table — Rent $95, Utilities $18 ("scales with housing tier"), Transport $15 ("**waived if the player owns a vehicle**") — and §10.2 independently confirms both W105.1 and W105.2's examples verbatim ("Clothing improves employability or prestige"; "A vehicle reduces travel time but creates fuel, insurance, and repair expenses"). The combined-levy/one-arrears-mechanism call above is unchanged — nothing in §16.4 contradicts it — but the unconditional charge was wrong for `transportCents` specifically: §16.4 states a waiver this entry's original text did not capture, because the source document wasn't available to read. Amended: `effectiveTransportCents` is `0` for a week in which `player.inventory` (§6.10) holds an unbroken `InventoryItem` whose `ItemDefinition.tags` (§7.5) includes the reserved literal `"vehicle"`, and `HousingState.transportCents` otherwise; `utilitiesCents` keeps no such waiver, matching §16.4's own asymmetry (only the Transport row states one). This is this kind's first engine-reserved tag value — every other `tags: string[]` field is free-text content metadata nothing in `src/engine` reads — the same kind of reserved-namespace move `core.reason.*` already made for reason codes (04 §12). `housing` (§3) is threaded `items: readonly ItemDefinition[]`, the same shape `employment`/`goals` already thread `jobs`/`goalDefs`.
1502+
1503+
Rejected (for the amendment): **Record the waiver as a known-and-retained gap instead of amending** — offered to the user as the lower-scope alternative and declined; §16.4 states the behavior plainly enough, and the tag mechanism needed to express it is small and additive rather than speculative. **A `Requirement`-shaped check instead of a reserved tag** — considered and dropped without asking; `Requirement` (§8.1) gates an action or eligibility, not a per-week automatic waiver with no failure code or message to attach, so reusing it would be forcing an ill-fitting shape onto a simpler rule.
1504+
1505+
Reversibility: cheap as a contract statement; a `kindVersion` bump and `Kind.migrateState` are real once implemented, and the combined-levy choice becomes a compatibility surface for any Stable Life save that predates it. The reserved `"vehicle"` tag is a soft convention, not a type — reversible by simply not checking for it, though any campaign that has already tagged an item `"vehicle"` for the waiver would then need a replacement mechanism.
15021506

15031507
### 2026-09-07 — W105.4: `NPCDefinition` gains `startingMemories`
15041508

docs/docs/engine/10-simulation-kind.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1694,7 +1694,7 @@ value this kind computes rather than stores.
16941694
**`utilitiesCents`/`transportCents` (W105.3; [issue #109](https://github.com/The-Running-Dev/SubZeroDev.GameOfLife/issues/109)).**
16951695
Charged separately from rent means itemized as distinct cost lines a player can see, not a
16961696
separate consequence track: the `housing` end-of-week system (§3) charges
1697-
`weeklyCostCents + utilitiesCents + transportCents` as one combined levy against
1697+
`weeklyCostCents + utilitiesCents + effectiveTransportCents` as one combined levy against
16981698
`cashCents`, unconditionally, in the same pass and by the same rule §3's own W53/W55 decision
16991699
already gives rent alone (`90-decisions.md`, 2026-08-08 entry) — `cashCents` may go negative,
17001700
proving the same "wages before costs" ordering claim. `missedCents` is computed from that
@@ -1706,6 +1706,20 @@ content that declares neither is unaffected. `HousingState` (§6.9) gains matchi
17061706
`weeklyCostCents` already is — a `kindVersion` bump and `Kind.migrateState` default both to `0`
17071707
for a save with no such fields (§10.2).
17081708

1709+
**`transportCents` is waived when the player owns a vehicle; `utilitiesCents` is not.** The
1710+
companion game design (`games/03-game-design.md` §16.4, mirrored from GameOfLife) states this
1711+
asymmetry directly for its own baseline scenario: "Transport ... waived if the player owns a
1712+
vehicle," with no equivalent stated for utilities. `effectiveTransportCents` (above) is
1713+
`0` for a week in which `player.inventory` (§6.10) contains at least one `InventoryItem` with
1714+
`condition > 0` whose `ItemDefinition.tags` (§7.5) includes the reserved literal `"vehicle"`,
1715+
and `HousingState.transportCents` otherwise. **`"vehicle"` is this kind's first
1716+
engine-recognized tag value** — every other `tags: string[]` field in this kind (§7.2, §7.5,
1717+
§7.6, §7.9) is free-text content-author metadata nothing in `src/engine` branches on; this is
1718+
the first tag the `housing` system itself reads, the same kind of reserved-namespace
1719+
precedent `core.reason.*` (04 §12) already sets for reason codes. `housing` (§3) is threaded
1720+
`items: readonly ItemDefinition[]` to evaluate this, the same parameter shape `jobs`/`goalDefs`
1721+
already use for their own end-of-week systems.
1722+
17091723
### 7.5 Items
17101724

17111725
```typescript

0 commit comments

Comments
 (0)