Interaction Vocabulary Review Appendix¶
Status: Non-normative source notes Sources: prior interaction-vocabulary review notes, reviewed during the April 2026 fragment-renderer design pass.
This appendix preserves the useful pressure from the interaction vocabulary
review without making every brainstormed mechanism part of the current contract.
The normative contract lives in
docs/src/design/service/FRAGMENT_STREAM_CONTRACT.md and
docs/src/design/story/INTERACTION_VOCABULARY.md.
Central Framing¶
The review argued that StoryTangl should not try to define a universal game engine vocabulary. The missing layer is narrower and more useful:
a cross-client interaction-rendering vocabulary between authored/runtime logic and concrete UI affordances.
That layer lets a rich web client render cards, zones, hidden hands, and media while a CLI still renders the same interaction as text, state, and numbered choices.
Adjacent Systems¶
The review compared StoryTangl with several neighboring systems.
Reference family |
Useful lesson |
|---|---|
Ludii / ludemes |
Use containers, components, moves, and end conditions as coverage checks. |
GDL / General Game Playing |
Enumerate legal moves, but keep rule reasoning inside the engine. |
Zillions / board-game DSLs |
Borrow board, piece, move, capture, and skinning ideas without centering boards. |
BoardGameGeek mechanisms |
Use mechanism names as coverage tags, not primitive schema fields. |
Inform 7 |
Preserve scope, visibility, and the distinction between observing and changing. |
Ink / Yarn / Twine / Ren’Py |
Keep runner/view separation and graceful line/option degradation. |
Vassal / tabletop platforms |
Use zones, decks, hands, tokens, logs, and permissions as UI surface examples. |
WAI-ARIA |
Compile StoryTangl semantics down to accessible widgets; do not use ARIA as the game vocabulary. |
Machinations / Petri nets |
Model resource loops as places, tokens, transitions, rates, and ledgers. |
ECS |
Prefer small capabilities/components over a subclass for every interaction kind. |
xAPI / Open Game Data |
Treat interaction requests, user actions, and state transitions as auditable records. |
Mechanics Survey Highlights¶
The mechanics survey found a stable engine-side pattern:
Gameis the mutable round state.GameHandleris the stateless rules engine.RoundRecordis immutable history.strategy registries encode opponent behavior and scoring policy.
handlers expose legal moves and resolve committed moves.
Known mechanics already fit this model:
rock-paper-scissors and trivial test games
Blackjack/21/22 sketches
Nim and piece games
Bag RPS typed-resource commitments
credentials/Papers-Please-like inspection loops
Calvin Cards contested card checks
incremental/resource loops
The conclusion was that UI vocabulary should mirror exposed player surfaces rather than invent a second game model.
Adopted Design Pressures¶
These ideas were adopted into the current vocabulary:
separate rules, interaction, presentation, and narrative projection
distinguish affordance from handler-facing move
represent zones and entities as renderable fragments or group members
make hidden/visible/revealed state explicit
keep unavailable choices visible with blocker diagnostics
preserve action history as an audit trail
support graceful degradation from rich widgets to text choices
treat resource and piece pools as first-class interaction surfaces
Deferred Ideas¶
These remain useful but are intentionally deferred:
full Ludii-like formal game descriptions
client-side general game playing or rule inference
universal board topology
full telemetry/xAPI compatibility
a complete interaction record model replacing
RoundRecordpresentation-profile negotiation beyond current
ui_hintsbrowser E2E for rich interaction widgets before the widgets stabilize
Coverage Checklist For Future Fixtures¶
Future fixtures should exercise one interaction family at a time:
visible zone plus selectable piece
hidden card or document with reveal state
unavailable affordance with structured blockers
quantity or resource-spend payload
inspect/reveal action that changes visible state
control update/delete that mutates a prior fragment
result or user-event fragment that explains an outcome
If a fixture cannot still degrade into readable state plus choices, the contract is probably leaking too much client-specific UI structure.