Traversal affordances
traversal-affordances · an adoption of Action legibility, version 1
Use in your game
Opens the authoring tool with these answers and settings already filled in. You still add your game's own rules and tuning.
What is in the ZIP
The ZIP holds the adoption and its acceptance tests. In the authoring tool, choose Add contract and pick this ZIP. If you keep your design as files, put them in contracts/.
The contract behind it
Covers which actions players can discover in each situation, how availability is presented, and what an unavailable action shows. It also covers which action is offered when one control signal has several candidate actions. Physical controls, input timing help, displayed game facts, and event order stay elsewhere.
Questions
The supplied answer is marked on each question. Pick other answers to see what changes. Nothing is saved here: the ZIP and the authoring tool use the supplied answers.
How can players normally discover an action while it matters?
- Asked when
- the action cases list has at least one row.
- If not asked
- With no action case, this adoption makes no game-wide discovery promise.
Why this is asked
Different actions may need different help. This answer supplies the ordinary choice before a particular action states another one.
What normally appears when an action cannot be used?
- Asked when
- the action cases list has at least one row.
- If not asked
- With no action case, this adoption makes no game-wide unavailable-action promise.
Why this is asked
A missing prompt, a dimmed control, and an explanation create different expectations. This answer supplies the ordinary choice.
Numbersno numbers
This contract has no numbers to set.
Rules1 rule
A rule is a check between the numbers. Validation reports a rule that fails.
-
Forbidden when Action discovery default is None, and Unavailable action default is Reason is shown.
Lists3 lists
Each list holds the rows this adoption supplies. A list can be empty.
Action cases
action-cases
| Id | Action declared in | Situation declared in | Discoverability | When unavailable | Presentation rule declared in |
|---|---|---|---|---|---|
jump-at-gap | traversal.jump | traversal.jumpable-gap | use-game-default | use-game-default | traversal.jump-gap-presentation |
climb-marked-wall | traversal.climb | traversal.climbable-wall | use-game-default | shown-unavailable | traversal.climb-wall-presentation |
squeeze-through-opening | traversal.squeeze-through | traversal.narrow-opening | explanation-on-demand | reason-is-shown | traversal.squeeze-presentation |
Availability presentations
availability-presentations
| Id | Action case | Channel | Platform declared in | Channel rule declared in |
|---|---|---|---|---|
jump-gap-shape | jump-at-gap | shape | — | art.jump-gap-shape |
jump-gap-audio | jump-at-gap | audio-cue | — | audio.jump-gap-cue |
climb-wall-contrast | climb-marked-wall | outline-or-contrast | — | art.climb-wall-contrast |
climb-wall-icon | climb-marked-wall | icon | — | ui.climb-wall-icon |
squeeze-opening-text | squeeze-through-opening | text | — | ui.squeeze-opening-text |
Shared input cases
shared-input-cases
This adoption declares no shared input cases.
Test inputsscope and seeds
Some tests need a scope or seeds from the adoption before they can run.
This adoption supplies none; every test uses its defaults.
Acceptance tests54 tests apply
The contract comes with 52 tests. A test that runs once per row is counted once for each row. Tests that do not apply to these answers are still listed, with the reason.
action-legibility-vocabulary
action legibility uses one action input, action cases, candidates, and offered actions
Applies to traversal-affordances.
An action input is one game-facing signal from Control options when that contract is adopted, otherwise from the game's Fixed control rule. An action case is one action in one cited situation. A candidate is an action the input carries whose permission or forgiveness acceptance holds at the accepted moment. An action is offered when selection identifies it to the player.
Test steps and diagnostics
- Given
where the adoption or its cited control rules name an action input; where none is named, this trial asserts nothing; the
traversal-affordancesadoption and a player-facing physical control- When
- the control path, matching action cases, candidate actions, and offered result are identified
- Then
- the action input is one game-facing signal from Control options when adopted and otherwise from the game's Fixed control rule
- each action case is one action in one cited situation
- a candidate is an action the input carries whose binding context, when one exists, holds and whose ordinary permission or Input forgiveness acceptance holds at the accepted moment
- an action is offered only when it is identified to the player as the result of selection
- Diagnostics
traversal-affordances-candidate-settraversal-affordances-offered-action
no-action-case-makes-no-promise
no matching action case makes no action-legibility promise
Applies to traversal-affordances.
Where no matching action case exists because the adoption has no action-cases row, the adoption makes no discovery, unavailable-presentation, or availability promise and both game-wide answers are absent. Where an action case exists, this test asserts nothing.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption, its action-cases rows, and its game-wide answers- When
- the adoption's action-legibility promises are read
- Then
- where no matching action case exists because the adoption has no action-cases row, the adoption makes no discovery, unavailable-presentation, or availability promise and the game-wide discovery and unavailable-action answers are both absent; where an action case exists, this test asserts nothing
- Diagnostics
traversal-affordances-declaration-record
action-case-matches-cited-situation · jump-at-gap
jump-at-gap applies exactly in its cited situations
Applies to the jump-at-gap row.
Action case jump-at-gap applies in every situation named at traversal.jumpable-gap and does not apply in any situation excluded there. It applies on every platform the adoption covers; platform variation lives only in availability-presentations rows. The test leaves the rule's content to that citation. A situation the citation does not classify asserts nothing.
Test steps and diagnostics
- Given
the action case
jump-at-gapand the Fixed situation rule attraversal.jumpable-gap- When
- the cited covered situations and the nearest similar excluded situations are each reached
- Then
jump-at-gapapplies in every situation the citation coversjump-at-gapdoes not apply in any situation the citation excludesjump-at-gapapplies on every platform the adoption covers; platform variation lives only in availability-presentations rows- a situation the citation neither covers nor excludes asserts nothing
- Diagnostics
traversal-affordances-situation-trace
action-case-matches-cited-situation · climb-marked-wall
climb-marked-wall applies exactly in its cited situations
Applies to the climb-marked-wall row.
Action case climb-marked-wall applies in every situation named at traversal.climbable-wall and does not apply in any situation excluded there. It applies on every platform the adoption covers; platform variation lives only in availability-presentations rows. The test leaves the rule's content to that citation. A situation the citation does not classify asserts nothing.
Test steps and diagnostics
- Given
the action case
climb-marked-walland the Fixed situation rule attraversal.climbable-wall- When
- the cited covered situations and the nearest similar excluded situations are each reached
- Then
climb-marked-wallapplies in every situation the citation coversclimb-marked-walldoes not apply in any situation the citation excludesclimb-marked-wallapplies on every platform the adoption covers; platform variation lives only in availability-presentations rows- a situation the citation neither covers nor excludes asserts nothing
- Diagnostics
traversal-affordances-situation-trace
action-case-matches-cited-situation · squeeze-through-opening
squeeze-through-opening applies exactly in its cited situations
Applies to the squeeze-through-opening row.
Action case squeeze-through-opening applies in every situation named at traversal.narrow-opening and does not apply in any situation excluded there. It applies on every platform the adoption covers; platform variation lives only in availability-presentations rows. The test leaves the rule's content to that citation. A situation the citation does not classify asserts nothing.
Test steps and diagnostics
- Given
the action case
squeeze-through-openingand the Fixed situation rule attraversal.narrow-opening- When
- the cited covered situations and the nearest similar excluded situations are each reached
- Then
squeeze-through-openingapplies in every situation the citation coverssqueeze-through-openingdoes not apply in any situation the citation excludessqueeze-through-openingapplies on every platform the adoption covers; platform variation lives only in availability-presentations rows- a situation the citation neither covers nor excludes asserts nothing
- Diagnostics
traversal-affordances-situation-trace
discovery-looks-usable-override
Row.id looks usable by its row answer
Does not apply to traversal-affordances: no row in action-cases matches discoverability looks usable.
discovery-looks-usable-default · jump-at-gap
jump-at-gap looks usable by the game default
Applies to the jump-at-gap row.
Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: while jump-at-gap is available, at least one matching availability presentation identifies the action as attemptable before the attempt.
Test steps and diagnostics
- Given
jump-at-gapavailable in a situation attraversal.jumpable-gap, before an attempt- When
- an observer examines the matching availability presentations
- Then
- at least one presentation identifies
jump-at-gapas an action that can be attempted in the current situation before the attempt
- at least one presentation identifies
- Diagnostics
traversal-affordances-jump-at-gap-observer-resulttraversal-affordances-presentation-trace
discovery-looks-usable-default · climb-marked-wall
climb-marked-wall looks usable by the game default
Applies to the climb-marked-wall row.
Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: while climb-marked-wall is available, at least one matching availability presentation identifies the action as attemptable before the attempt.
Test steps and diagnostics
- Given
climb-marked-wallavailable in a situation attraversal.climbable-wall, before an attempt- When
- an observer examines the matching availability presentations
- Then
- at least one presentation identifies
climb-marked-wallas an action that can be attempted in the current situation before the attempt
- at least one presentation identifies
- Diagnostics
traversal-affordances-climb-marked-wall-observer-resulttraversal-affordances-presentation-trace
discovery-explanation-on-demand-override · squeeze-through-opening
squeeze-through-opening has an explanation route by its row answer
Applies to the squeeze-through-opening row.
Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: while squeeze-through-opening matters, the route at traversal.squeeze-presentation is available in the situation, names the action, and explains how to attempt it. The test restates nothing from the cited rule.
Test steps and diagnostics
- Given
squeeze-through-openingmatters in a situation attraversal.narrow-opening- When
- an observer uses the discovery route declared at
traversal.squeeze-presentation
- an observer uses the discovery route declared at
- Then
- the route is available in the current situation
- the route names the action and explains how to attempt it
- Diagnostics
traversal-affordances-squeeze-through-opening-observer-result
discovery-explanation-on-demand-default
Row.id has an explanation route by the game default
Does not apply to traversal-affordances: action discovery default is looks usable, not explanation on demand.
discovery-current-binding-override
Row.id shows the current device control by its row answer
Does not apply to traversal-affordances: no row in action-cases matches discoverability current binding is shown.
discovery-current-binding-default
Row.id shows the current device control by the game default
Does not apply to traversal-affordances: action discovery default is looks usable, not current binding is shown.
discovery-assistive-name-override
Row.id exposes its name and role by its row answer
Does not apply to traversal-affordances: no row in action-cases matches discoverability assistive tech can name it.
discovery-assistive-name-default
Row.id exposes its name and role by the game default
Does not apply to traversal-affordances: action discovery default is looks usable, not assistive tech can name it.
discovery-none-override
Row.id promises no discovery route by its row answer
Does not apply to traversal-affordances: no row in action-cases matches discoverability none.
discovery-none-default
Row.id promises no discovery route by the game default
Does not apply to traversal-affordances: action discovery default is looks usable, not none.
action-permission-remains-cited · jump-at-gap
jump-at-gap uses its cited ordinary permission
Applies to the jump-at-gap row.
Ordinary permission for jump-at-gap stays at traversal.jump. This contract grants none and does not make an unavailable action succeed. Where the cited rule admits no unavailable state, that comparison asserts nothing. The test restates nothing from the cited action rule.
Test steps and diagnostics
- Given
the action at
traversal.jumpin an ordinarily permitted state and, where the cited action rule admits one, an ordinarily unavailable state in a covered situation- When
- the player attempts the action in each state
- Then
- ordinary permission is read from
traversal.jump - this contract grants no permission
- where an unavailable state exists, the unavailable attempt does not succeed because of any discovery route, availability presentation, or shared-input selection; where none exists, this clause asserts nothing
- ordinary permission is read from
- Diagnostics
traversal-affordances-permission-trace
action-permission-remains-cited · climb-marked-wall
climb-marked-wall uses its cited ordinary permission
Applies to the climb-marked-wall row.
Ordinary permission for climb-marked-wall stays at traversal.climb. This contract grants none and does not make an unavailable action succeed. Where the cited rule admits no unavailable state, that comparison asserts nothing. The test restates nothing from the cited action rule.
Test steps and diagnostics
- Given
the action at
traversal.climbin an ordinarily permitted state and, where the cited action rule admits one, an ordinarily unavailable state in a covered situation- When
- the player attempts the action in each state
- Then
- ordinary permission is read from
traversal.climb - this contract grants no permission
- where an unavailable state exists, the unavailable attempt does not succeed because of any discovery route, availability presentation, or shared-input selection; where none exists, this clause asserts nothing
- ordinary permission is read from
- Diagnostics
traversal-affordances-permission-trace
action-permission-remains-cited · squeeze-through-opening
squeeze-through-opening uses its cited ordinary permission
Applies to the squeeze-through-opening row.
Ordinary permission for squeeze-through-opening stays at traversal.squeeze-through. This contract grants none and does not make an unavailable action succeed. Where the cited rule admits no unavailable state, that comparison asserts nothing. The test restates nothing from the cited action rule.
Test steps and diagnostics
- Given
the action at
traversal.squeeze-throughin an ordinarily permitted state and, where the cited action rule admits one, an ordinarily unavailable state in a covered situation- When
- the player attempts the action in each state
- Then
- ordinary permission is read from
traversal.squeeze-through - this contract grants no permission
- where an unavailable state exists, the unavailable attempt does not succeed because of any discovery route, availability presentation, or shared-input selection; where none exists, this clause asserts nothing
- ordinary permission is read from
- Diagnostics
traversal-affordances-permission-trace
presentation-applies-on-covered-platforms · jump-gap-shape
jump-gap-shape applies on its covered platform scope
Applies to the jump-gap-shape row.
Availability presentation jump-gap-shape applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation.
Test steps and diagnostics
- Given
availability presentation
jump-gap-shapefor the case namedjump-at-gap- When
- the case is reached on each platform it covers
- Then
- the row applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation
- Diagnostics
traversal-affordances-presentation-trace
presentation-applies-on-covered-platforms · jump-gap-audio
jump-gap-audio applies on its covered platform scope
Applies to the jump-gap-audio row.
Availability presentation jump-gap-audio applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation.
Test steps and diagnostics
- Given
availability presentation
jump-gap-audiofor the case namedjump-at-gap- When
- the case is reached on each platform it covers
- Then
- the row applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation
- Diagnostics
traversal-affordances-presentation-trace
presentation-applies-on-covered-platforms · climb-wall-contrast
climb-wall-contrast applies on its covered platform scope
Applies to the climb-wall-contrast row.
Availability presentation climb-wall-contrast applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation.
Test steps and diagnostics
- Given
availability presentation
climb-wall-contrastfor the case namedclimb-marked-wall- When
- the case is reached on each platform it covers
- Then
- the row applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation
- Diagnostics
traversal-affordances-presentation-trace
presentation-applies-on-covered-platforms · climb-wall-icon
climb-wall-icon applies on its covered platform scope
Applies to the climb-wall-icon row.
Availability presentation climb-wall-icon applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation.
Test steps and diagnostics
- Given
availability presentation
climb-wall-iconfor the case namedclimb-marked-wall- When
- the case is reached on each platform it covers
- Then
- the row applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation
- Diagnostics
traversal-affordances-presentation-trace
presentation-applies-on-covered-platforms · squeeze-opening-text
squeeze-opening-text applies on its covered platform scope
Applies to the squeeze-opening-text row.
Availability presentation squeeze-opening-text applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation.
Test steps and diagnostics
- Given
availability presentation
squeeze-opening-textfor the case namedsqueeze-through-opening- When
- the case is reached on each platform it covers
- Then
- the row applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation
- Diagnostics
traversal-affordances-presentation-trace
listed-action-presentations-agree
action presentations agree with the cited action cases
Applies to traversal-affordances.
Audit class: observer-judged. An observer, not the running game, judges this. Every player-facing presentation of a covered action agrees with that action case's Fixed action citation and never presents it as another covered action. A presentation outside the stated scope asserts nothing.
Test steps and diagnostics
- Scope
every player-facing prompt, explanation, control reminder, and availability presentation
- Holds
each presentation of an action case agrees with its Fixed action citation and never presents one covered action as another; a player-facing presentation outside this scope asserts nothing
- Diagnostics
traversal-affordances-observer-resulttraversal-affordances-presentation-trace
remapped-prompt-updates-override
Row.id prompts update after a binding change by its row answer
Does not apply to traversal-affordances: no row in action-cases matches discoverability current binding is shown.
remapped-prompt-updates-default
Row.id prompts update after a binding change by the game default
Does not apply to traversal-affordances: action discovery default is looks usable, not current binding is shown.
unavailable-hidden-override
Row.id is hidden while unavailable by its row answer
Does not apply to traversal-affordances: no row in action-cases matches when-unavailable hidden.
unavailable-hidden-default · jump-at-gap
jump-at-gap is hidden while unavailable by the game default
Applies to the jump-at-gap row.
Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: jump-at-gap follows its effective discovery promise while available and its availability presentation is absent while unavailable.
Test steps and diagnostics
- Given
jump-at-gapavailable and then unavailable in a covered situation- When
- an observer compares the player-facing availability presentation in both states
- Then
- the available state follows the case's effective discovery promise
- the action's availability presentation is absent while the action is unavailable
- Diagnostics
traversal-affordances-jump-at-gap-observer-resulttraversal-affordances-presentation-trace
unavailable-shown-override · climb-marked-wall
climb-marked-wall stays identifiable and distinctly unavailable by its row answer
Applies to the climb-marked-wall row.
Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: while unavailable, climb-marked-wall stays identifiable and has a distinct unavailable state.
Test steps and diagnostics
- Given
climb-marked-wallavailable and then unavailable in a covered situation- When
- an observer compares its availability presentation in both states
- Then
- the action remains identifiable while unavailable
- the unavailable presentation is distinct from the available presentation
- Diagnostics
traversal-affordances-climb-marked-wall-observer-resulttraversal-affordances-presentation-trace
unavailable-shown-default
Row.id stays identifiable and distinctly unavailable by the game default
Does not apply to traversal-affordances: unavailable action default is hidden, not shown unavailable.
unavailable-reason-override · squeeze-through-opening
squeeze-through-opening names its current block by its row answer
Applies to the squeeze-through-opening row.
Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: while squeeze-through-opening is unavailable, its presentation identifies it, marks it unavailable, and names the current block under traversal.squeeze-presentation. The test restates nothing from the cited rule.
Test steps and diagnostics
- Given
squeeze-through-openingunavailable for each current block admitted bytraversal.squeeze-through- When
- an observer examines its availability presentation
- Then
- the presentation identifies the action
- the presentation marks the action unavailable
- the presentation names the current blocking reason
- Diagnostics
traversal-affordances-squeeze-through-opening-observer-resulttraversal-affordances-presentation-trace
unavailable-reason-default
Row.id names its current block by the game default
Does not apply to traversal-affordances: unavailable action default is hidden, not reason is shown.
unavailable-unchanged-override
Row.id looks identical across availability states by its row answer
Does not apply to traversal-affordances: no row in action-cases matches when-unavailable unchanged.
unavailable-unchanged-default
Row.id looks identical across availability states by the game default
Does not apply to traversal-affordances: unavailable action default is hidden, not unchanged.
unavailable-never-override
Row.id has no reachable unavailable state by its row answer
Does not apply to traversal-affordances: no row in action-cases matches when-unavailable never unavailable.
unavailable-never-default
Row.id has no reachable unavailable state by the game default
Does not apply to traversal-affordances: unavailable action default is hidden, not never unavailable.
action-channel-announces · jump-gap-shape
jump-gap-shape presents its channel form through a distinct shape or pattern alone
Applies to the jump-gap-shape row.
Audit class: observer-judged. An observer, not the running game, judges this. The channel-rule-declared-in field says a channel is judged by an observer who meets that channel alone. On every platform where this row applies, every other discovery route and availability presentation is removed or held identical, so the observer meets a distinct shape or pattern alone. Where both states are presented, the observer meets at least two presentations of each with the balance undisclosed and order unknown; under hidden, the unavailable form is the absence of this channel and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone. Where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer names availability every time from that channel alone; under unchanged, the observer cannot distinguish the two forms above chance; under never-unavailable, that clause asserts nothing. Where art.jump-gap-shape states that this channel also identifies the action, the observer names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing. The presented form or forms follow art.jump-gap-shape; the test restates nothing from it.
Test steps and diagnostics
- Given
on every platform where this row applies, controlled presentations for the action case named
jump-at-gap: the available and unavailable forms where its effective unavailable answer admits a distinct unavailable form, the available form and its absence under hidden, the available and unavailable state presentations under unchanged, and the available form alone under never-unavailable; every other discovery route and availability presentation is removed or held identical across the states being compared, so the observer meets a distinct shape or pattern alone; developer instrumentation that is not player-facing and a frozen background held identical are not routes- When
- where both states are presented, an observer meets at least two presentations of each with the balance undisclosed and the order unknown; under hidden, the unavailable form is the absence of this channel, and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone
- Then
- where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer correctly names availability every time from a distinct shape or pattern alone; under unchanged, the observer instead cannot distinguish the two forms above chance, and under never-unavailable this clause asserts nothing
- the presented form or forms follow
art.jump-gap-shape - where
art.jump-gap-shapestates that this channel also identifies the action, the observer correctly names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing - where the case this row names has a reachable unavailable state, the channel presents exactly the state its effective unavailable answer requires; where it has none, this clause asserts nothing
- Diagnostics
traversal-affordances-jump-gap-shape-observer-result
action-channel-announces · jump-gap-audio
jump-gap-audio presents its channel form through a non-spatial audio cue alone
Applies to the jump-gap-audio row.
Audit class: observer-judged. An observer, not the running game, judges this. The channel-rule-declared-in field says a channel is judged by an observer who meets that channel alone. On every platform where this row applies, every other discovery route and availability presentation is removed or held identical, so the observer meets a non-spatial audio cue alone. Where both states are presented, the observer meets at least two presentations of each with the balance undisclosed and order unknown; under hidden, the unavailable form is the absence of this channel and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone. Where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer names availability every time from that channel alone; under unchanged, the observer cannot distinguish the two forms above chance; under never-unavailable, that clause asserts nothing. Where audio.jump-gap-cue states that this channel also identifies the action, the observer names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing. The presented form or forms follow audio.jump-gap-cue; the test restates nothing from it.
Test steps and diagnostics
- Given
on every platform where this row applies, controlled presentations for the action case named
jump-at-gap: the available and unavailable forms where its effective unavailable answer admits a distinct unavailable form, the available form and its absence under hidden, the available and unavailable state presentations under unchanged, and the available form alone under never-unavailable; every other discovery route and availability presentation is removed or held identical across the states being compared, so the observer meets a non-spatial audio cue alone; developer instrumentation that is not player-facing and a frozen background held identical are not routes- When
- where both states are presented, an observer meets at least two presentations of each with the balance undisclosed and the order unknown; under hidden, the unavailable form is the absence of this channel, and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone
- Then
- where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer correctly names availability every time from a non-spatial audio cue alone; under unchanged, the observer instead cannot distinguish the two forms above chance, and under never-unavailable this clause asserts nothing
- the presented form or forms follow
audio.jump-gap-cue - where
audio.jump-gap-cuestates that this channel also identifies the action, the observer correctly names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing - where the case this row names has a reachable unavailable state, the channel presents exactly the state its effective unavailable answer requires; where it has none, this clause asserts nothing
- Diagnostics
traversal-affordances-jump-gap-audio-observer-result
action-channel-announces · climb-wall-contrast
climb-wall-contrast presents its channel form through an outline or light-dark contrast alone
Applies to the climb-wall-contrast row.
Audit class: observer-judged. An observer, not the running game, judges this. The channel-rule-declared-in field says a channel is judged by an observer who meets that channel alone. On every platform where this row applies, every other discovery route and availability presentation is removed or held identical, so the observer meets an outline or light-dark contrast alone. Where both states are presented, the observer meets at least two presentations of each with the balance undisclosed and order unknown; under hidden, the unavailable form is the absence of this channel and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone. Where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer names availability every time from that channel alone; under unchanged, the observer cannot distinguish the two forms above chance; under never-unavailable, that clause asserts nothing. Where art.climb-wall-contrast states that this channel also identifies the action, the observer names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing. The presented form or forms follow art.climb-wall-contrast; the test restates nothing from it.
Test steps and diagnostics
- Given
on every platform where this row applies, controlled presentations for the action case named
climb-marked-wall: the available and unavailable forms where its effective unavailable answer admits a distinct unavailable form, the available form and its absence under hidden, the available and unavailable state presentations under unchanged, and the available form alone under never-unavailable; every other discovery route and availability presentation is removed or held identical across the states being compared, so the observer meets an outline or light-dark contrast alone; developer instrumentation that is not player-facing and a frozen background held identical are not routes- When
- where both states are presented, an observer meets at least two presentations of each with the balance undisclosed and the order unknown; under hidden, the unavailable form is the absence of this channel, and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone
- Then
- where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer correctly names availability every time from an outline or light-dark contrast alone; under unchanged, the observer instead cannot distinguish the two forms above chance, and under never-unavailable this clause asserts nothing
- the presented form or forms follow
art.climb-wall-contrast - where
art.climb-wall-contraststates that this channel also identifies the action, the observer correctly names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing - where the case this row names has a reachable unavailable state, the channel presents exactly the state its effective unavailable answer requires; where it has none, this clause asserts nothing
- Diagnostics
traversal-affordances-climb-wall-contrast-observer-result
action-channel-announces · climb-wall-icon
climb-wall-icon presents its channel form through a pictorial symbol alone
Applies to the climb-wall-icon row.
Audit class: observer-judged. An observer, not the running game, judges this. The channel-rule-declared-in field says a channel is judged by an observer who meets that channel alone. On every platform where this row applies, every other discovery route and availability presentation is removed or held identical, so the observer meets a pictorial symbol alone. Where both states are presented, the observer meets at least two presentations of each with the balance undisclosed and order unknown; under hidden, the unavailable form is the absence of this channel and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone. Where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer names availability every time from that channel alone; under unchanged, the observer cannot distinguish the two forms above chance; under never-unavailable, that clause asserts nothing. Where ui.climb-wall-icon states that this channel also identifies the action, the observer names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing. The presented form or forms follow ui.climb-wall-icon; the test restates nothing from it.
Test steps and diagnostics
- Given
on every platform where this row applies, controlled presentations for the action case named
climb-marked-wall: the available and unavailable forms where its effective unavailable answer admits a distinct unavailable form, the available form and its absence under hidden, the available and unavailable state presentations under unchanged, and the available form alone under never-unavailable; every other discovery route and availability presentation is removed or held identical across the states being compared, so the observer meets a pictorial symbol alone; developer instrumentation that is not player-facing and a frozen background held identical are not routes- When
- where both states are presented, an observer meets at least two presentations of each with the balance undisclosed and the order unknown; under hidden, the unavailable form is the absence of this channel, and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone
- Then
- where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer correctly names availability every time from a pictorial symbol alone; under unchanged, the observer instead cannot distinguish the two forms above chance, and under never-unavailable this clause asserts nothing
- the presented form or forms follow
ui.climb-wall-icon - where
ui.climb-wall-iconstates that this channel also identifies the action, the observer correctly names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing - where the case this row names has a reachable unavailable state, the channel presents exactly the state its effective unavailable answer requires; where it has none, this clause asserts nothing
- Diagnostics
traversal-affordances-climb-wall-icon-observer-result
action-channel-announces · squeeze-opening-text
squeeze-opening-text presents its channel form through written text alone
Applies to the squeeze-opening-text row.
Audit class: observer-judged. An observer, not the running game, judges this. The channel-rule-declared-in field says a channel is judged by an observer who meets that channel alone. On every platform where this row applies, every other discovery route and availability presentation is removed or held identical, so the observer meets written text alone. Where both states are presented, the observer meets at least two presentations of each with the balance undisclosed and order unknown; under hidden, the unavailable form is the absence of this channel and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone. Where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer names availability every time from that channel alone; under unchanged, the observer cannot distinguish the two forms above chance; under never-unavailable, that clause asserts nothing. Where ui.squeeze-opening-text states that this channel also identifies the action, the observer names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing. The presented form or forms follow ui.squeeze-opening-text; the test restates nothing from it.
Test steps and diagnostics
- Given
on every platform where this row applies, controlled presentations for the action case named
squeeze-through-opening: the available and unavailable forms where its effective unavailable answer admits a distinct unavailable form, the available form and its absence under hidden, the available and unavailable state presentations under unchanged, and the available form alone under never-unavailable; every other discovery route and availability presentation is removed or held identical across the states being compared, so the observer meets written text alone; developer instrumentation that is not player-facing and a frozen background held identical are not routes- When
- where both states are presented, an observer meets at least two presentations of each with the balance undisclosed and the order unknown; under hidden, the unavailable form is the absence of this channel, and the observer meets at least two presentations of the available form and at least two of its absence; under never-unavailable, the observer meets at least two presentations of the available form alone
- Then
- where the effective unavailable answer of the case this row names admits a distinct unavailable form, the observer correctly names availability every time from written text alone; under unchanged, the observer instead cannot distinguish the two forms above chance, and under never-unavailable this clause asserts nothing
- the presented form or forms follow
ui.squeeze-opening-text - where
ui.squeeze-opening-textstates that this channel also identifies the action, the observer correctly names which action it is and that identity agrees with the case this row names; where it does not, the identity clause asserts nothing - where the case this row names has a reachable unavailable state, the channel presents exactly the state its effective unavailable answer requires; where it has none, this clause asserts nothing
- Diagnostics
traversal-affordances-squeeze-opening-text-observer-result
shared-input-stays-one
one action input stays one signal with its candidates
Applies to traversal-affordances.
Where the adoption or its cited control rules name an action input, one action input is consumed once with all its candidates; where none is named, this trial asserts nothing. With exactly one candidate at the accepted moment, that candidate is offered and no shared-input-cases row is needed, as the contract says. With no candidate or several candidates, that offering clause asserts nothing.
Test steps and diagnostics
- Given
where the adoption or its cited control rules name an action input; where none is named, this trial asserts nothing; one action input carrying its candidate actions at an accepted moment
- When
- the candidate set is read
- Then
- the action input is consumed once with all its candidates and is never split into several inputs
- when exactly one candidate remains, that candidate is offered and no shared-input-cases row is needed, as the contract says
- when no candidate or several candidates remain, the at-most-one clause asserts nothing
- Diagnostics
traversal-affordances-candidate-settraversal-affordances-offered-action
shared-input-rule-selects-one
Row.id offers one rule-selected candidate
Does not apply to traversal-affordances: shared-input-cases has no rows.
shared-input-player-selects-one
Row.id offers one player-selected candidate
Does not apply to traversal-affordances: shared-input-cases has no rows.
buffered-shared-input-reads-accepted-situation
Row.id reads a buffered shared input in its accepted situation
Does not apply to traversal-affordances: shared-input-cases has no rows.
presentation-refreshes-after-change
availability and offered-action presentations refresh after relevant changes
Applies to traversal-affordances.
Where an availability or offered-action presentation exists, a change in availability, situation, platform, binding, or candidate eligibility recomputes it from the fresh situation and declarations. A previous prompt or selection stays current only when the cited rules still select it. Without a presentation, or for a change the adoption cannot construct, the corresponding clause asserts nothing.
Test steps and diagnostics
- Given
where the adoption has a live availability or offered-action presentation, that presentation followed separately by a change in availability, situation, platform, binding, or candidate eligibility; where it has none, this trial asserts nothing
- When
- each change settles
- Then
- the presentation is recomputed from the fresh situation and matching declarations
- the previous prompt or selection remains current only when the cited rules still select it
- a kind of change the adoption cannot construct asserts nothing
- Diagnostics
traversal-affordances-refresh-logtraversal-affordances-prompt-bindingstraversal-affordances-offered-action
action-legibility-authority-order
action legibility keeps its authority order
Applies to traversal-affordances.
The contract reads situation, row defaults, ordinary permission, discovery, unavailable presentation, candidate set, shared-input selection at the accepted moment with its offered-action presentation, one action proposal, current-device binding, and refresh in that order. A part this adoption does not exercise asserts nothing.
Test steps and diagnostics
- Given
a covered action input and situation that exercise every applicable part of the
traversal-affordancesadoption- When
- the action input is settled
- Then
- the game reads situation, row defaults, ordinary permission, discovery, unavailable presentation, candidate set, shared-input selection at the accepted moment with its offered-action presentation, one action proposal, current-device binding, and refresh in that order
- a part the adoption does not exercise asserts nothing
- Diagnostics
traversal-affordances-presentation-tracetraversal-affordances-candidate-settraversal-affordances-offered-actiontraversal-affordances-refresh-log
legibility-boundaries
the adoption makes no promise beyond action legibility
Applies to traversal-affordances.
Physical controls, input timing help, displayed game facts, and event order each assert nothing here. A route that highlights without naming an action or explaining how to attempt it is not a discovery answer. A control layout the game's Fixed rules do not make a cited situation is not a situation of this contract.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and features outside its declared answers and rows- When
- the adoption's promise boundary is reviewed
- Then
- physical controls assert nothing
- input timing help asserts nothing
- displayed game facts assert nothing
- event order asserts nothing
- a route that highlights without naming an action or explaining how to attempt it is not a discovery answer
- a control layout the game's Fixed rules do not make a cited situation is not a situation of this contract
- Diagnostics
traversal-affordances-declaration-record
effective-answers-have-legal-presentation-shape · jump-at-gap
declaration check: jump-at-gap has the presentation shape its effective answers require
Applies to the jump-at-gap row.
This declaration check reads the adoption, not the running game. The action-cases description supplies all three duties. Resolve jump-at-gap's effective answers from its row and the game defaults. For every platform the case covers, every effective discovery answer except none requires an applicable presentation row; none requires no presentation row; and none cannot pair with reason-is-shown. The inapplicable branch asserts nothing. Any other shape is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption, its two answers, and action casejump-at-gap, not the running game- When
- a reviewer resolves the row's effective discovery and unavailable answers
- Then
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
jump-at-gap, as the action-cases description requires; under none, this clause asserts nothing - when the effective discovery answer is none, no availability-presentations row names
jump-at-gap, as the action-cases description requires; under another answer, this clause asserts nothing - the effective answers are never none together with reason-is-shown, as the action-cases description requires
- a missing row, forbidden row, or forbidden effective pair is a defect this test fails by construction
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
- Diagnostics
traversal-affordances-declaration-record
effective-answers-have-legal-presentation-shape · climb-marked-wall
declaration check: climb-marked-wall has the presentation shape its effective answers require
Applies to the climb-marked-wall row.
This declaration check reads the adoption, not the running game. The action-cases description supplies all three duties. Resolve climb-marked-wall's effective answers from its row and the game defaults. For every platform the case covers, every effective discovery answer except none requires an applicable presentation row; none requires no presentation row; and none cannot pair with reason-is-shown. The inapplicable branch asserts nothing. Any other shape is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption, its two answers, and action caseclimb-marked-wall, not the running game- When
- a reviewer resolves the row's effective discovery and unavailable answers
- Then
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
climb-marked-wall, as the action-cases description requires; under none, this clause asserts nothing - when the effective discovery answer is none, no availability-presentations row names
climb-marked-wall, as the action-cases description requires; under another answer, this clause asserts nothing - the effective answers are never none together with reason-is-shown, as the action-cases description requires
- a missing row, forbidden row, or forbidden effective pair is a defect this test fails by construction
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
- Diagnostics
traversal-affordances-declaration-record
effective-answers-have-legal-presentation-shape · squeeze-through-opening
declaration check: squeeze-through-opening has the presentation shape its effective answers require
Applies to the squeeze-through-opening row.
This declaration check reads the adoption, not the running game. The action-cases description supplies all three duties. Resolve squeeze-through-opening's effective answers from its row and the game defaults. For every platform the case covers, every effective discovery answer except none requires an applicable presentation row; none requires no presentation row; and none cannot pair with reason-is-shown. The inapplicable branch asserts nothing. Any other shape is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption, its two answers, and action casesqueeze-through-opening, not the running game- When
- a reviewer resolves the row's effective discovery and unavailable answers
- Then
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
squeeze-through-opening, as the action-cases description requires; under none, this clause asserts nothing - when the effective discovery answer is none, no availability-presentations row names
squeeze-through-opening, as the action-cases description requires; under another answer, this clause asserts nothing - the effective answers are never none together with reason-is-shown, as the action-cases description requires
- a missing row, forbidden row, or forbidden effective pair is a defect this test fails by construction
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
- Diagnostics
traversal-affordances-declaration-record
presentation-action-case-join · jump-gap-shape
declaration check: jump-gap-shape names an action case in this adoption
Applies to the jump-gap-shape row.
This declaration check reads the adoption, not the running game. The action-case field says the value is the id of an action-cases row of this adoption presented through the channel. Availability presentation jump-gap-shape must therefore name an existing action case: jump-at-gap. A missing or misspelled join is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and availability presentationjump-gap-shape, not the running game- When
- a reviewer checks the action-case join
- Then
- an action-cases row with id
jump-at-gapexists in this adoption - a missing or misspelled action case is a defect this test fails by construction
- an action-cases row with id
- Diagnostics
traversal-affordances-declaration-record
presentation-action-case-join · jump-gap-audio
declaration check: jump-gap-audio names an action case in this adoption
Applies to the jump-gap-audio row.
This declaration check reads the adoption, not the running game. The action-case field says the value is the id of an action-cases row of this adoption presented through the channel. Availability presentation jump-gap-audio must therefore name an existing action case: jump-at-gap. A missing or misspelled join is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and availability presentationjump-gap-audio, not the running game- When
- a reviewer checks the action-case join
- Then
- an action-cases row with id
jump-at-gapexists in this adoption - a missing or misspelled action case is a defect this test fails by construction
- an action-cases row with id
- Diagnostics
traversal-affordances-declaration-record
presentation-action-case-join · climb-wall-contrast
declaration check: climb-wall-contrast names an action case in this adoption
Applies to the climb-wall-contrast row.
This declaration check reads the adoption, not the running game. The action-case field says the value is the id of an action-cases row of this adoption presented through the channel. Availability presentation climb-wall-contrast must therefore name an existing action case: climb-marked-wall. A missing or misspelled join is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and availability presentationclimb-wall-contrast, not the running game- When
- a reviewer checks the action-case join
- Then
- an action-cases row with id
climb-marked-wallexists in this adoption - a missing or misspelled action case is a defect this test fails by construction
- an action-cases row with id
- Diagnostics
traversal-affordances-declaration-record
presentation-action-case-join · climb-wall-icon
declaration check: climb-wall-icon names an action case in this adoption
Applies to the climb-wall-icon row.
This declaration check reads the adoption, not the running game. The action-case field says the value is the id of an action-cases row of this adoption presented through the channel. Availability presentation climb-wall-icon must therefore name an existing action case: climb-marked-wall. A missing or misspelled join is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and availability presentationclimb-wall-icon, not the running game- When
- a reviewer checks the action-case join
- Then
- an action-cases row with id
climb-marked-wallexists in this adoption - a missing or misspelled action case is a defect this test fails by construction
- an action-cases row with id
- Diagnostics
traversal-affordances-declaration-record
presentation-action-case-join · squeeze-opening-text
declaration check: squeeze-opening-text names an action case in this adoption
Applies to the squeeze-opening-text row.
This declaration check reads the adoption, not the running game. The action-case field says the value is the id of an action-cases row of this adoption presented through the channel. Availability presentation squeeze-opening-text must therefore name an existing action case: squeeze-through-opening. A missing or misspelled join is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and availability presentationsqueeze-opening-text, not the running game- When
- a reviewer checks the action-case join
- Then
- an action-cases row with id
squeeze-through-openingexists in this adoption - a missing or misspelled action case is a defect this test fails by construction
- an action-cases row with id
- Diagnostics
traversal-affordances-declaration-record
shared-input-completeness
declaration check: Row.id lists every candidate and always selects one
Does not apply to traversal-affordances: shared-input-cases has no rows.
multi-candidate-input-has-one-row
declaration check: every multi-candidate input has exactly one matching row
Applies to traversal-affordances.
This declaration check reads the adoption and its cited prose, not the running game. Every situation where one action input has several candidates must have exactly one matching shared-input-cases row. An input with at most one candidate asserts nothing in that comparison. A missing or duplicate match is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and every cited situation where one action input can have several candidates, not the running game- When
- a reviewer matches shared-input-cases rows to those situations and inputs
- Then
- each action input with several candidates has exactly one matching shared-input-cases row
- an input with at most one candidate needs no row and asserts nothing in the multi-candidate comparison
- a missing or duplicate match is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
rows-do-not-repeat-or-overlap
declaration check: presentation pairs do not repeat and action cases do not overlap
Applies to traversal-affordances.
This declaration check reads the adoption and its cited prose, not the running game. The availability-presentations description forbids a repeated action-case and channel pair, and the action-cases description forbids two cases for the same action in overlapping situations. The contract sets no maximum row count. A repetition or overlap is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption and its cited prose, not the running game- When
- a reviewer compares every presentation-row pair and every pair of action cases
- Then
- no two availability-presentations rows repeat one action-case and channel pair
- no two action-cases rows cover the same action in overlapping situations
- the contract imposes no maximum row count
- a repeated pair or overlapping action case is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-citation-duty · jump-at-gap
declaration check: jump-at-gap's action citation states its duty
Applies to the jump-at-gap row.
This declaration check reads the adoption and traversal.jump, not the running game. The citation must name jump-at-gap's action, ordinary permission, and complete effect. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.jump, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.jumpnames the action, its ordinary permission, and its complete effect- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-citation-duty · climb-marked-wall
declaration check: climb-marked-wall's action citation states its duty
Applies to the climb-marked-wall row.
This declaration check reads the adoption and traversal.climb, not the running game. The citation must name climb-marked-wall's action, ordinary permission, and complete effect. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.climb, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.climbnames the action, its ordinary permission, and its complete effect- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-citation-duty · squeeze-through-opening
declaration check: squeeze-through-opening's action citation states its duty
Applies to the squeeze-through-opening row.
This declaration check reads the adoption and traversal.squeeze-through, not the running game. The citation must name squeeze-through-opening's action, ordinary permission, and complete effect. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.squeeze-through, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.squeeze-throughnames the action, its ordinary permission, and its complete effect- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-situation-citation-duty · jump-at-gap
declaration check: jump-at-gap's situation citation states its duty
Applies to the jump-at-gap row.
This declaration check reads the adoption and traversal.jumpable-gap, not the running game. The citation must name every covered play situation and the nearest similar excluded situations for jump-at-gap. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.jumpable-gap, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.jumpable-gapnames every play situation covered byjump-at-gapand the nearest similar situations excluded from it- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-situation-citation-duty · climb-marked-wall
declaration check: climb-marked-wall's situation citation states its duty
Applies to the climb-marked-wall row.
This declaration check reads the adoption and traversal.climbable-wall, not the running game. The citation must name every covered play situation and the nearest similar excluded situations for climb-marked-wall. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.climbable-wall, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.climbable-wallnames every play situation covered byclimb-marked-walland the nearest similar situations excluded from it- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-situation-citation-duty · squeeze-through-opening
declaration check: squeeze-through-opening's situation citation states its duty
Applies to the squeeze-through-opening row.
This declaration check reads the adoption and traversal.narrow-opening, not the running game. The citation must name every covered play situation and the nearest similar excluded situations for squeeze-through-opening. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.narrow-opening, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.narrow-openingnames every play situation covered bysqueeze-through-openingand the nearest similar situations excluded from it- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-presentation-citation-duty · jump-at-gap
declaration check: jump-at-gap's presentation citation states its duty
Applies to the jump-at-gap row.
This declaration check reads the adoption and traversal.jump-gap-presentation, not the running game. The citation must state every discovery route and unavailable state for jump-at-gap, including an explicit no-route statement where applicable. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.jump-gap-presentation, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.jump-gap-presentationstates every discovery route and unavailable state forjump-at-gap, including an explicit statement when no route exists- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-presentation-citation-duty · climb-marked-wall
declaration check: climb-marked-wall's presentation citation states its duty
Applies to the climb-marked-wall row.
This declaration check reads the adoption and traversal.climb-wall-presentation, not the running game. The citation must state every discovery route and unavailable state for climb-marked-wall, including an explicit no-route statement where applicable. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.climb-wall-presentation, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.climb-wall-presentationstates every discovery route and unavailable state forclimb-marked-wall, including an explicit statement when no route exists- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
action-presentation-citation-duty · squeeze-through-opening
declaration check: squeeze-through-opening's presentation citation states its duty
Applies to the squeeze-through-opening row.
This declaration check reads the adoption and traversal.squeeze-presentation, not the running game. The citation must state every discovery route and unavailable state for squeeze-through-opening, including an explicit no-route statement where applicable. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andtraversal.squeeze-presentation, not the running game- When
- a reviewer checks the citation's meaning
- Then
traversal.squeeze-presentationstates every discovery route and unavailable state forsqueeze-through-opening, including an explicit statement when no route exists- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
presentation-platform-citation-duty
declaration check: Row.id's platform citation states its duty
Does not apply to traversal-affordances: no matching row in availability-presentations has every field this test uses (platform-declared-in).
channel-rule-citation-duty · jump-gap-shape
declaration check: jump-gap-shape's channel citation states its duty
Applies to the jump-gap-shape row.
This declaration check reads the adoption and art.jump-gap-shape, not the running game. The channel-rule-declared-in field requires both forms, or the available form alone for a never-unavailable or unchanged case, and says the citation states whether the channel identifies the action. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andart.jump-gap-shape, not the running game- When
- a reviewer checks the citation's meaning
- Then
art.jump-gap-shapestatesjump-gap-shape's available and unavailable forms, or the available form alone for a never-unavailable or unchanged case, and whether the channel identifies the action- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
channel-rule-citation-duty · jump-gap-audio
declaration check: jump-gap-audio's channel citation states its duty
Applies to the jump-gap-audio row.
This declaration check reads the adoption and audio.jump-gap-cue, not the running game. The channel-rule-declared-in field requires both forms, or the available form alone for a never-unavailable or unchanged case, and says the citation states whether the channel identifies the action. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andaudio.jump-gap-cue, not the running game- When
- a reviewer checks the citation's meaning
- Then
audio.jump-gap-cuestatesjump-gap-audio's available and unavailable forms, or the available form alone for a never-unavailable or unchanged case, and whether the channel identifies the action- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
channel-rule-citation-duty · climb-wall-contrast
declaration check: climb-wall-contrast's channel citation states its duty
Applies to the climb-wall-contrast row.
This declaration check reads the adoption and art.climb-wall-contrast, not the running game. The channel-rule-declared-in field requires both forms, or the available form alone for a never-unavailable or unchanged case, and says the citation states whether the channel identifies the action. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andart.climb-wall-contrast, not the running game- When
- a reviewer checks the citation's meaning
- Then
art.climb-wall-contraststatesclimb-wall-contrast's available and unavailable forms, or the available form alone for a never-unavailable or unchanged case, and whether the channel identifies the action- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
channel-rule-citation-duty · climb-wall-icon
declaration check: climb-wall-icon's channel citation states its duty
Applies to the climb-wall-icon row.
This declaration check reads the adoption and ui.climb-wall-icon, not the running game. The channel-rule-declared-in field requires both forms, or the available form alone for a never-unavailable or unchanged case, and says the citation states whether the channel identifies the action. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andui.climb-wall-icon, not the running game- When
- a reviewer checks the citation's meaning
- Then
ui.climb-wall-iconstatesclimb-wall-icon's available and unavailable forms, or the available form alone for a never-unavailable or unchanged case, and whether the channel identifies the action- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
channel-rule-citation-duty · squeeze-opening-text
declaration check: squeeze-opening-text's channel citation states its duty
Applies to the squeeze-opening-text row.
This declaration check reads the adoption and ui.squeeze-opening-text, not the running game. The channel-rule-declared-in field requires both forms, or the available form alone for a never-unavailable or unchanged case, and says the citation states whether the channel identifies the action. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
traversal-affordancesadoption andui.squeeze-opening-text, not the running game- When
- a reviewer checks the citation's meaning
- Then
ui.squeeze-opening-textstatessqueeze-opening-text's available and unavailable forms, or the available form alone for a never-unavailable or unchanged case, and whether the channel identifies the action- a missing duty is a defect this test fails by construction
- Diagnostics
traversal-affordances-declaration-record
shared-situation-citation-duty
declaration check: the situation citation of Row.id states its duty
Does not apply to traversal-affordances: shared-input-cases has no rows.
shared-actions-citation-duty
declaration check: the candidate citation of Row.id states its duty
Does not apply to traversal-affordances: shared-input-cases has no rows.
shared-action-input-citation-duty
declaration check: the action-input citation of Row.id states its duty
Does not apply to traversal-affordances: shared-input-cases has no rows.
shared-selection-citation-duty
declaration check: the selection citation of Row.id states its duty
Does not apply to traversal-affordances: shared-input-cases has no rows.
shared-presentation-citation-duty
declaration check: the presentation citation of Row.id states its duty
Does not apply to traversal-affordances: shared-input-cases has no rows.
legibility-holds
action legibility holds for the whole run
Applies to traversal-affordances.
Across every covered situation of the audited run on every covered platform, every available covered action meets its effective discovery promise; every unavailable covered action meets its effective unavailable answer; every channel distinguishes the states it promises; every shared input offers exactly one action before the attempt; and no prompt names a stale binding. A case the adoption cannot construct asserts nothing.
Test steps and diagnostics
- Holds
every available covered action met its effective discovery promise; every unavailable covered action met its effective unavailable answer; every availability-presentation channel distinguished the states it promises; every shared input offered exactly one action before the attempt; no prompt named a stale binding; a case the adoption cannot construct asserts nothing
- Seeds
["audit-a","audit-b"]- Scope
every covered situation of the audited run on every covered platform- Diagnostics
traversal-affordances-observer-resulttraversal-affordances-presentation-tracetraversal-affordances-prompt-bindingstraversal-affordances-candidate-settraversal-affordances-offered-actiontraversal-affordances-refresh-log
JSONthe adoption as one file
The adoption file as supplied. Answers you try on this page are not written into it; to change an adoption, open it in the authoring tool.
{
"contract": "action-legibility",
"version": 1,
"summary": "Covers which actions players can discover in each situation, how availability is presented, and what an unavailable action shows. It also covers which action is offered when one control signal has several candidate actions. Physical controls, input timing help, displayed game facts, and event order stay elsewhere.",
"questions": {
"action-discovery-default": {
"asks": "How can players normally discover an action while it matters?",
"rationale": "Different actions may need different help. This answer supplies the ordinary choice before a particular action states another one.",
"when": {
"row-count": {
"action-cases": "non-empty"
}
},
"otherwise": "With no action case, this adoption makes no game-wide discovery promise.",
"options": {
"looks-usable": {
"meaning": "The action looks possible before it is tried. A platformer marks a climbable ledge with a clear edge shape.",
"semantics": "At least one player-facing presentation identifies that the action can be attempted in the current situation before the attempt."
},
"explanation-on-demand": {
"meaning": "An explanation is available while the action matters. An adventure game can name the key needed beside a sealed door.",
"semantics": "A player-facing route available in the current situation names the action and explains how to attempt it."
},
"current-binding-is-shown": {
"meaning": "The action prompt shows its current control. A racing game updates the pit-stop prompt after confirm moves to another button.",
"semantics": "Every prompt for the action names the current device's actual control under the applicable control rule. A wrong-device glyph, an old binding, or a hardware glyph in place of the actual touch region or gesture fails this promise."
},
"assistive-tech-can-name-it": {
"meaning": "Assistive technology can name the action and its purpose. A strategy game's screen reader identifies the end-turn control.",
"semantics": "A player-facing interface element exposes a determinable action name and role to supported assistive technology."
},
"none": {
"meaning": "The game gives no discovery route for the action. A fighting game leaves a secret finisher for players to uncover outside ordinary prompts.",
"semantics": "No player-facing presentation promises the action's identity or availability before it is attempted; accidental discovery and memorable authored content do not violate this answer."
}
}
},
"unavailable-action-default": {
"asks": "What normally appears when an action cannot be used?",
"rationale": "A missing prompt, a dimmed control, and an explanation create different expectations. This answer supplies the ordinary choice.",
"when": {
"row-count": {
"action-cases": "non-empty"
}
},
"otherwise": "With no action case, this adoption makes no game-wide unavailable-action promise.",
"options": {
"hidden": {
"meaning": "The action disappears while unavailable. A racing boost prompt vanishes while the boost meter is empty.",
"semantics": "The action's availability presentation is absent while the action cannot be attempted."
},
"shown-unavailable": {
"meaning": "The action stays visible but clearly unavailable. A card game dims a card that cannot be played this turn.",
"semantics": "The presentation keeps the action identifiable and carries a distinct unavailable state without promising a reason."
},
"reason-is-shown": {
"meaning": "The action stays visible and states why it is unavailable. A survival recipe says that two pieces of wood are missing.",
"semantics": "The presentation identifies the action, marks it unavailable, and states the current blocking reason."
},
"unchanged": {
"meaning": "Nothing changes when the action is unavailable. A mystery game's bookcase gives no hint that its hidden passage is locked.",
"semantics": "The action's player-facing presentation is identical across its available and unavailable states."
},
"never-unavailable": {
"meaning": "Nothing unavailable ever appears, because covered actions stay usable. A rhythm game's pause action works throughout every playable song moment.",
"semantics": "No reachable state in a covered situation makes the action unavailable."
}
}
}
},
"declares": {
"values": {},
"rows": {
"action-cases": {
"description": "Actions in the situations where their discovery and unavailable presentation are promised. A case whose effective discovery answer is not none has, on each platform it covers, at least one availability-presentations row; a case whose effective answer is none has no presentation row; and no case pairs an effective none with an effective reason-is-shown. No two cases cover the same action in overlapping situations.",
"when-empty": "No action receives a legibility promise from this adoption.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A stable game-facing case name, such as open-door-nearby or jump-at-gap."
},
"action-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed rule naming the action, its ordinary permission, and its complete effect."
},
"situation-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed rule naming every play situation covered by this case and the nearest similar situations excluded from it."
},
"discoverability": {
"type": "string",
"required": true,
"options": [
"use-game-default",
"looks-usable",
"explanation-on-demand",
"current-binding-is-shown",
"assistive-tech-can-name-it",
"none"
],
"description": "The minimum discovery promise for this action case, or the game's ordinary answer. A secret arcade command may state that no discovery route exists."
},
"when-unavailable": {
"type": "string",
"required": true,
"options": [
"use-game-default",
"hidden",
"shown-unavailable",
"reason-is-shown",
"unchanged",
"never-unavailable"
],
"description": "What the player-facing presentation does while the action cannot be used, or the game's ordinary answer. A crafting action may remain visible with its missing material named."
},
"presentation-rule-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed rule for every player-facing discovery route and unavailable state in this case, including an explicit statement when no route exists."
}
}
},
"availability-presentations": {
"description": "Independent channels that present one action case's availability. No two rows repeat one action case and channel pair.",
"when-empty": "No action case promises a player-facing availability channel.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A stable name for one action case and one channel, such as jump-at-gap-shape."
},
"action-case": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"description": "The id of the action-cases row of this adoption presented through this channel."
},
"channel": {
"type": "string",
"required": true,
"options": [
"text",
"icon",
"shape",
"outline-or-contrast",
"audio-cue",
"spatial-audio",
"narration",
"audio-description",
"haptic"
],
"description": "The independent presentation channel. Text and icons can name or depict an action; shape, contrast, sound, position, speech, description, and touch can distinguish availability under their cited rules."
},
"platform-declared-in": {
"type": "citation",
"description": "The Fixed platform rule on which this presentation applies. Absence means the presentation applies on every platform covered by the action case."
},
"channel-rule-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed rule for this channel in available and unavailable states; for a case whose effective unavailable answer is never-unavailable or unchanged, the available form alone. It states whether the channel also identifies the action. A channel is judged by an observer who meets that channel alone."
}
}
},
"shared-input-cases": {
"description": "Situations where one game-facing action input can offer several actions and one choice must be made visible.",
"when-empty": "No action input offers several actions in one situation.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A stable situation name, such as porch-interactions."
},
"situation-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed rule naming the situation in which several actions share one action input."
},
"actions-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed list of candidate actions and the conditions that make each candidate eligible."
},
"action-input": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"description": "The name of the one game-facing action input carrying these candidates, such as porch-interact."
},
"action-input-declared-in": {
"type": "citation",
"required": true,
"description": "The game's Fixed control rule naming this shared input and the physical activation that produces it."
},
"selection": {
"type": "string",
"required": true,
"options": [
"rule-selects-one",
"player-selects-one"
],
"description": "Whether the cited rule selects one candidate by ordering or a situation test, or the player chooses before the attempt. A village interact may prefer talking over picking up an item."
},
"selection-rule-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed rule that selects exactly one offered action and breaks every reachable tie."
},
"presentation-rule-declared-in": {
"type": "citation",
"required": true,
"description": "The Fixed rule that identifies the selected action before the shared input becomes an action attempt."
}
}
}
}
},
"rules": {
"secret-default-cannot-explain-a-block": {
"forbid": {
"all": [
{
"flag": {
"action-discovery-default": [
"none"
]
}
},
{
"flag": {
"unavailable-action-default": [
"reason-is-shown"
]
}
}
]
},
"message": "A secret action cannot use a game-wide default that names it and explains why it is blocked."
}
},
"origin": "https://opengdd.org/contracts/action-legibility-1",
"mechanism": [
"This is the single normative authority for action discovery, availability presentation, and shared-input selection. Questions and rows describe choices and cite game rules; they do not define another sequence.",
"An **action input** is one game-facing signal declared by Control options when that contract is adopted; otherwise it comes from the game's Fixed control rule. Control options owns how bindings emit it; this contract consumes one action input and the candidate actions it carries. The current binding comes from the same optional source. An **action case** is one action in one cited situation. A **candidate** is an action carried by the input whose optional binding context holds and whose Fixed permission rule — or a forgiveness acceptance from Input forgiveness — accepts it in the situation at the accepted moment. Forgiveness applies per candidate: each candidate action's forgiveness rows read the shared input as that action's input, and an acceptance shifted for one candidate shifts the accepted moment this settlement reads. An action is **offered** when it is identified to the player as the result of selection.",
"1. Read the current situation and every matching action case — action cases are platform-neutral — then every presentation row whose optional platform citation applies on the current platform. No matching action case creates no legibility promise from this adoption. 2. Resolve each row's effective discovery and unavailable answers. A row value other than `use-game-default` wins; otherwise the matching question answer applies. 3. Read ordinary action permission from the cited Fixed action rule. This contract does not grant permission and does not make an unavailable action succeed. 4. While an action is available, apply its effective discovery promise through the matching presentation rows. Under `none`, no discovery route is promised. 5. While an action is unavailable, apply its effective unavailable answer. Hidden removes its presentation. Shown-unavailable keeps identity and marks the state. Reason-is-shown also names the current block. Unchanged exposes no availability difference. Never-unavailable admits no unavailable state in the cited situation. 6. Read the one action input and all of its candidate actions. This settlement consumes one input carrying its candidates; it never splits one input into several. 7. When the action input has at most one candidate at the accepted moment, that candidate is offered and no shared-input-cases row is needed. A physical input may differ by platform without changing this step. 8. When the action input has several candidates, exactly one matching `shared-input-cases` row applies. Under `rule-selects-one`, its cited rule uses its declared ordering or situation test. Under `player-selects-one`, an explicit choice is required. The row consumes one input with N candidates and offers exactly one. Present that offered action under the row's cited presentation rule before the accepted input becomes an action attempt. Other candidates may remain visible, but none is presented as what will happen now. While an input waits in a buffer, this presentation makes no winner promise; the promise binds at the accepted moment. 9. Physical input → Control options (when adopted) emits the action input → Input forgiveness (when adopted) may shift the accepted moment → this contract selects the offered candidate at the accepted moment → one action proposal. Thus an interact buffered during a cutscene evaluates candidates in the situation where the input is accepted, not the situation where it was pressed. Event resolution owns ordering, rejection, and effects after the proposal. 10. Whenever a presentation shows the current binding, it shows the actual current device control, including the touch region or gesture on a touch platform. 11. When availability, situation, platform, binding, or candidate eligibility changes, recompute the presentation from step 1. A previous prompt or selection does not remain current unless the cited rules still select it.",
"The authority order is therefore: situation, row defaults, ordinary permission, discovery, unavailable presentation, candidate set, shared-input selection at the accepted moment with its offered-action presentation, one action proposal, current-device binding, and refresh."
],
"answers": {
"action-discovery-default": "looks-usable",
"unavailable-action-default": "hidden"
},
"values": {},
"rows": {
"action-cases": [
{
"id": "jump-at-gap",
"action-declared-in": "traversal.jump",
"situation-declared-in": "traversal.jumpable-gap",
"discoverability": "use-game-default",
"when-unavailable": "use-game-default",
"presentation-rule-declared-in": "traversal.jump-gap-presentation"
},
{
"id": "climb-marked-wall",
"action-declared-in": "traversal.climb",
"situation-declared-in": "traversal.climbable-wall",
"discoverability": "use-game-default",
"when-unavailable": "shown-unavailable",
"presentation-rule-declared-in": "traversal.climb-wall-presentation"
},
{
"id": "squeeze-through-opening",
"action-declared-in": "traversal.squeeze-through",
"situation-declared-in": "traversal.narrow-opening",
"discoverability": "explanation-on-demand",
"when-unavailable": "reason-is-shown",
"presentation-rule-declared-in": "traversal.squeeze-presentation"
}
],
"availability-presentations": [
{
"id": "jump-gap-shape",
"action-case": "jump-at-gap",
"channel": "shape",
"channel-rule-declared-in": "art.jump-gap-shape"
},
{
"id": "jump-gap-audio",
"action-case": "jump-at-gap",
"channel": "audio-cue",
"channel-rule-declared-in": "audio.jump-gap-cue"
},
{
"id": "climb-wall-contrast",
"action-case": "climb-marked-wall",
"channel": "outline-or-contrast",
"channel-rule-declared-in": "art.climb-wall-contrast"
},
{
"id": "climb-wall-icon",
"action-case": "climb-marked-wall",
"channel": "icon",
"channel-rule-declared-in": "ui.climb-wall-icon"
},
{
"id": "squeeze-opening-text",
"action-case": "squeeze-through-opening",
"channel": "text",
"channel-rule-declared-in": "ui.squeeze-opening-text"
}
],
"shared-input-cases": []
},
"pack": "sha256:3db629b447d4abfb21e3d23f2610dfa503b36a9da22e671d416145ce62dd1f12"
}