Skip to content

A level-crossing event doesn't state how the party got there: up-stairs read as descents downstream #68

Description

@mmacy

Surfaced by adversarial review of osr-web's phase-1 authored-layer adoption (mmacy/osr-web#44). Filed engine-first per the standing rule.

The gap

A level-crossing LocationEnteredEvent (location_kind="level") is emitted identically for stairs_down and stairs_up: _relocate reports the destination (location_id = dungeon id, level_number) and, since 1.5.0, a gate's narrative success beat — but not how the party got there. The emission site knows (it is executing one command or the other); the event does not say.

Why it matters downstream

A renderer that wants direction in its line — "The party descends to level 2." — has to guess or track prior level in render state. osr-web guessed: its line hard-codes "descends", so the bundled adventure's up-stair (level 2 back to level 1 at (18,1)) currently renders "The party descends to level 1." while the party climbs. Tracking prior level downstream instead is fragile across whole-log re-renders and mid-dungeon restores, and it re-derives at render time a fact the engine had in hand at emission.

The same field would serve trap-transition relocations (slides) and any future transition kind — each reads differently at the table, and today they are indistinguishable on the event.

What downstream needs

An additive field on the level-crossing event naming the means — e.g. via: "stairs_down" | "stairs_up" | "trap" (naming and domain this repo's call), defaulting None so old logs still parse, always filled by the engine at emission.

Downstream in the interim

osr-web moves to the neutral "The party comes to level N." — always true, direction restored when the engine states it. No prior-level tracking will be built in the interim.

https://claude.ai/code/session_01GSYzXCjpPnVDLTC2rpmhTZ

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions