Legibility

Action legibility

action-legibility-1

Tests included

This contract defines the behaviour of action prompts: an interact prompt, a greyed-out action, or a shared button.

It decides which actions players can find, what they see when an action is greyed out, and which action a shared button runs.

Use in your game

Opens the authoring tool with this contract added and its questions unanswered. Or download the ZIP and add it later.

What is in the ZIP

The ZIP holds the contract 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/ and fill in the answers there.

Questions

Up to 2 questions. Some appear only after earlier answers.

  1. How can players normally discover an action while it matters?
  2. What normally appears when an action cannot be used?

Try the answers

Pick answers to see which rules and tests apply. Nothing is saved here: the ZIP and the authoring tool start unanswered.

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.
Choices for How can players normally discover an action while it matters?
The action looks possible before it is tried. A platformer marks a climbable ledge with a clear edge shape.

At least one player-facing presentation identifies that the action can be attempted in the current situation before the attempt.

An explanation is available while the action matters. An adventure game can name the key needed beside a sealed door.

A player-facing route available in the current situation names the action and explains how to attempt it.

The action prompt shows its current control. A racing game updates the pit-stop prompt after confirm moves to another button.

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 technology can name the action and its purpose. A strategy game's screen reader identifies the end-turn control.

A player-facing interface element exposes a determinable action name and role to supported assistive technology.

The game gives no discovery route for the action. A fighting game leaves a secret finisher for players to uncover outside ordinary prompts.

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.

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.
Choices for What normally appears when an action cannot be used?
The action disappears while unavailable. A racing boost prompt vanishes while the boost meter is empty.

The action's availability presentation is absent while the action cannot be attempted.

The action stays visible but clearly unavailable. A card game dims a card that cannot be played this turn.

The presentation keeps the action identifiable and carries a distinct unavailable state without promising a reason.

The action stays visible and states why it is unavailable. A survival recipe says that two pieces of wood are missing.

The presentation identifies the action, marks it unavailable, and states the current blocking reason.

Nothing changes when the action is unavailable. A mystery game's bookcase gives no hint that its hidden passage is locked.

The action's player-facing presentation is identical across its available and unavailable states.

Nothing unavailable ever appears, because covered actions stay usable. A rhythm game's pause action works throughout every playable song moment.

No reachable state in a covered situation makes the action unavailable.

Why this is asked

A missing prompt, a dimmed control, and an explanation create different expectations. This answer supplies the ordinary choice.

Numbers and rulesno numbers, 1 rule

Numbers

This contract has no numbers to set.

Rules

  • A secret action cannot use a game-wide default that names it and explains why it is blocked.

    Forbidden when Action discovery default is None, and Unavailable action default is Reason is shown.

Lists3 lists

Some settings are lists of rows.

A reference points to a number or a rule in your design. For a number, use its address in your tuning. For a rule, use its file and heading, such as 02-mechanics.md#recovery. Each field's description says what it needs.

Action cases

action-cases

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.

An empty list means: No action receives a legibility promise from this adoption.

Each row is: id, action-declared-in, situation-declared-in, discoverability, when-unavailable, presentation-rule-declared-in.

Every field
FieldKindWhen it appearsMeaning
id string Required A stable game-facing case name, such as open-door-nearby or jump-at-gap.
action-declared-in reference Required The Fixed rule naming the action, its ordinary permission, and its complete effect.
situation-declared-in reference Required The Fixed rule naming every play situation covered by this case and the nearest similar situations excluded from it.
discoverability choice: use-game-default, looks-usable, explanation-on-demand, current-binding-is-shown, assistive-tech-can-name-it, none Required 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 choice: use-game-default, hidden, shown-unavailable, reason-is-shown, unchanged, never-unavailable Required 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 reference Required 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

availability-presentations

Independent channels that present one action case's availability. No two rows repeat one action case and channel pair.

An empty list means: No action case promises a player-facing availability channel.

Each row is: id, action-case, channel, platform-declared-in, channel-rule-declared-in.

Every field
FieldKindWhen it appearsMeaning
id string Required A stable name for one action case and one channel, such as jump-at-gap-shape.
action-case string Required The id of the action-cases row of this adoption presented through this channel.
channel choice: text, icon, shape, outline-or-contrast, audio-cue, spatial-audio, narration, audio-description, haptic Required 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 reference Optional 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 reference Required 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

shared-input-cases

Situations where one game-facing action input can offer several actions and one choice must be made visible.

An empty list means: No action input offers several actions in one situation.

Each row is: id, situation-declared-in, actions-declared-in, action-input, action-input-declared-in, selection, selection-rule-declared-in, presentation-rule-declared-in.

Every field
FieldKindWhen it appearsMeaning
id string Required A stable situation name, such as porch-interactions.
situation-declared-in reference Required The Fixed rule naming the situation in which several actions share one action input.
actions-declared-in reference Required The Fixed list of candidate actions and the conditions that make each candidate eligible.
action-input string Required The name of the one game-facing action input carrying these candidates, such as porch-interact.
action-input-declared-in reference Required The game's Fixed control rule naming this shared input and the physical activation that produces it.
selection choice: rule-selects-one, player-selects-one Required 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 reference Required The Fixed rule that selects exactly one offered action and breaks every reachable tie.
presentation-rule-declared-in reference Required The Fixed rule that identifies the selected action before the shared input becomes an action attempt.

For builders

Exact mechanism wording and 52 pack tests

Exact mechanism wording

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.

Verification pack

sha256:3db629b447d4abfb21e3d23f2610dfa503b36a9da22e671d416145ce62dd1f12

The format calls an adoption with its matching pack Checked: the tests travel with it, but a game has not necessarily passed them. Without the pack the adoption is Promised: the builder still owes the chosen behavior.

52 pack tests

Placeholders are filled from the adoption's answers, values, rows, and verification inputs.

action legibility uses one action input, action cases, candidates, and offered actions

action-legibility-vocabulary

scenarioonce

Applies for every adoption

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.

Given

where the adoption or its cited control rules name an action input; where none is named, this trial asserts nothing; the Instance adoption 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
  • Instance-candidate-set
  • Instance-offered-action
no matching action case makes no action-legibility promise

no-action-case-makes-no-promise

scenarioonce

Applies for every adoption

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.

Given

the Instance adoption, 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
  • Instance-declaration-record
Row.id applies exactly in its cited situations

action-case-matches-cited-situation

scenarioper action-cases row

Applies for every adoption

Action case Row.id applies in every situation named at Row.situation declared in 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.

Given

the action case Row.id and the Fixed situation rule at Row.situation declared in

When
  • the cited covered situations and the nearest similar excluded situations are each reached
Then
  • Row.id applies in every situation the citation covers
  • Row.id does not apply in any situation the citation excludes
  • Row.id applies 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
  • Instance-situation-trace
Row.id looks usable by its row answer

discovery-looks-usable-override

scenarioper action-cases row

Applies when row discoverability is Looks usable.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: while Row.id is available, at least one matching availability presentation identifies the action as attemptable before the attempt.

Given

Row.id available in a situation at Row.situation declared in, before an attempt

When
  • an observer examines the matching availability presentations
Then
  • at least one presentation identifies Row.id as an action that can be attempted in the current situation before the attempt
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id looks usable by the game default

discovery-looks-usable-default

scenarioper action-cases row

Applies when Action discovery default is Looks usable and row discoverability is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: while Row.id is available, at least one matching availability presentation identifies the action as attemptable before the attempt.

Given

Row.id available in a situation at Row.situation declared in, before an attempt

When
  • an observer examines the matching availability presentations
Then
  • at least one presentation identifies Row.id as an action that can be attempted in the current situation before the attempt
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id has an explanation route by its row answer

discovery-explanation-on-demand-override

scenarioper action-cases row

Applies when row discoverability is Explanation on demand.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: while Row.id matters, the route at Row.presentation rule declared in is available in the situation, names the action, and explains how to attempt it. The test restates nothing from the cited rule.

Given

Row.id matters in a situation at Row.situation declared in

When
  • an observer uses the discovery route declared at Row.presentation rule declared in
Then
  • the route is available in the current situation
  • the route names the action and explains how to attempt it
Diagnostics
  • Instance-Row.id-observer-result
Row.id has an explanation route by the game default

discovery-explanation-on-demand-default

scenarioper action-cases row

Applies when Action discovery default is Explanation on demand and row discoverability is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: while Row.id matters, the route at Row.presentation rule declared in is available in the situation, names the action, and explains how to attempt it. The test restates nothing from the cited rule.

Given

Row.id matters in a situation at Row.situation declared in

When
  • an observer uses the discovery route declared at Row.presentation rule declared in
Then
  • the route is available in the current situation
  • the route names the action and explains how to attempt it
Diagnostics
  • Instance-Row.id-observer-result
Row.id shows the current device control by its row answer

discovery-current-binding-override

scenarioper action-cases row

Applies when row discoverability is Current binding is shown.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: every prompt for Row.id names the actual current device control. An old binding, a wrong-device binding, or a hardware glyph in place of the actual touch region or gesture fails.

Given

every prompt for Row.id on each covered device, including a touch device where covered

When
  • an observer compares the prompt with the current device control under the applicable control rule
Then
  • every prompt names the actual current device control
  • no prompt names an old binding or a wrong-device binding as current
  • on a touch platform, the prompt names the actual touch region or gesture rather than a hardware glyph
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-prompt-bindings
Row.id shows the current device control by the game default

discovery-current-binding-default

scenarioper action-cases row

Applies when Action discovery default is Current binding is shown and row discoverability is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: every prompt for Row.id names the actual current device control. An old binding, a wrong-device binding, or a hardware glyph in place of the actual touch region or gesture fails.

Given

every prompt for Row.id on each covered device, including a touch device where covered

When
  • an observer compares the prompt with the current device control under the applicable control rule
Then
  • every prompt names the actual current device control
  • no prompt names an old binding or a wrong-device binding as current
  • on a touch platform, the prompt names the actual touch region or gesture rather than a hardware glyph
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-prompt-bindings
Row.id exposes its name and role by its row answer

discovery-assistive-name-override

scenarioper action-cases row

Applies when row discoverability is Assistive tech can name it.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: a player-facing interface element for Row.id exposes a determinable action name and role to supported assistive technology.

Given

Row.id available through a player-facing interface element in a covered situation

When
  • an observer inspects that element through each supported assistive technology
Then
  • the assistive interface exposes a determinable action name and role for Row.id
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-assistive-tree
Row.id exposes its name and role by the game default

discovery-assistive-name-default

scenarioper action-cases row

Applies when Action discovery default is Assistive tech can name it and row discoverability is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: a player-facing interface element for Row.id exposes a determinable action name and role to supported assistive technology.

Given

Row.id available through a player-facing interface element in a covered situation

When
  • an observer inspects that element through each supported assistive technology
Then
  • the assistive interface exposes a determinable action name and role for Row.id
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-assistive-tree
Row.id promises no discovery route by its row answer

discovery-none-override

scenarioper action-cases row

Applies when row discoverability is None.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: Row.id promises no identity or availability before the attempt. Accidental discovery and memorable content do not violate this answer; secrecy beyond that promise is outside the contract.

Given

Row.id before an attempt in every situation at Row.situation declared in

When
  • an observer examines every player-facing presentation before the attempt
Then
  • no presentation promises the action's identity or availability before the attempt
  • accidental discovery and memorable authored content do not fail this answer
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id promises no discovery route by the game default

discovery-none-default

scenarioper action-cases row

Applies when Action discovery default is None and row discoverability is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: Row.id promises no identity or availability before the attempt. Accidental discovery and memorable content do not violate this answer; secrecy beyond that promise is outside the contract.

Given

Row.id before an attempt in every situation at Row.situation declared in

When
  • an observer examines every player-facing presentation before the attempt
Then
  • no presentation promises the action's identity or availability before the attempt
  • accidental discovery and memorable authored content do not fail this answer
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id uses its cited ordinary permission

action-permission-remains-cited

scenarioper action-cases row

Applies for every adoption

Ordinary permission for Row.id stays at Row.action declared in. 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.

Given

the action at Row.action declared in in 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 Row.action declared in
  • 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
Diagnostics
  • Instance-permission-trace
Row.id applies on its covered platform scope

presentation-applies-on-covered-platforms

scenarioper availability-presentations row

Applies for every adoption

Availability presentation Row.id applies on every platform its action case covers unless a platform citation narrows it, and that narrower scope is carried by its platform citation.

Given

availability presentation Row.id for the case named Row.action case

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
  • Instance-presentation-trace
action presentations agree with the cited action cases

listed-action-presentations-agree

generalonce

Applies for every adoption

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.

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
  • Instance-observer-result
  • Instance-presentation-trace
Row.id prompts update after a binding change by its row answer

remapped-prompt-updates-override

scenarioper action-cases row

Applies when row discoverability is Current binding is shown.

Audit class: observer-judged. An observer, not the running game, judges this. Where Control options changes Row.id's binding, every later prompt, hint, reminder, and control summary names the new current device control, and none names the old control as current. This contract checks the presentation; Control options performs the remap. Where the adoption cannot construct that change, this trial asserts nothing.

Given

the control source for Row.id and its current device control

When
  • where Control options is adopted and permits a binding change, it changes the action to another supported current device control and an observer compares every later prompt, hint, reminder, and control summary with the configured control; otherwise this trial asserts nothing
Then
  • each later presentation names the new current device control
  • none names the old control as current
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-prompt-bindings
Row.id prompts update after a binding change by the game default

remapped-prompt-updates-default

scenarioper action-cases row

Applies when Action discovery default is Current binding is shown and row discoverability is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. Where Control options changes Row.id's binding, every later prompt, hint, reminder, and control summary names the new current device control, and none names the old control as current. This contract checks the presentation; Control options performs the remap. Where the adoption cannot construct that change, this trial asserts nothing.

Given

the control source for Row.id and its current device control

When
  • where Control options is adopted and permits a binding change, it changes the action to another supported current device control and an observer compares every later prompt, hint, reminder, and control summary with the configured control; otherwise this trial asserts nothing
Then
  • each later presentation names the new current device control
  • none names the old control as current
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-prompt-bindings
Row.id is hidden while unavailable by its row answer

unavailable-hidden-override

scenarioper action-cases row

Applies when row when unavailable is Hidden.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: Row.id follows its effective discovery promise while available and its availability presentation is absent while unavailable.

Given

Row.id available 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
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id is hidden while unavailable by the game default

unavailable-hidden-default

scenarioper action-cases row

Applies when Unavailable action default is Hidden and row when unavailable is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: Row.id follows its effective discovery promise while available and its availability presentation is absent while unavailable.

Given

Row.id available 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
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id stays identifiable and distinctly unavailable by its row answer

unavailable-shown-override

scenarioper action-cases row

Applies when row when unavailable is Shown unavailable.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: while unavailable, Row.id stays identifiable and has a distinct unavailable state.

Given

Row.id available 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
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id stays identifiable and distinctly unavailable by the game default

unavailable-shown-default

scenarioper action-cases row

Applies when Unavailable action default is Shown unavailable and row when unavailable is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: while unavailable, Row.id stays identifiable and has a distinct unavailable state.

Given

Row.id available 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
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id names its current block by its row answer

unavailable-reason-override

scenarioper action-cases row

Applies when row when unavailable is Reason is shown.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: while Row.id is unavailable, its presentation identifies it, marks it unavailable, and names the current block under Row.presentation rule declared in. The test restates nothing from the cited rule.

Given

Row.id unavailable for each current block admitted by Row.action declared in

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
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id names its current block by the game default

unavailable-reason-default

scenarioper action-cases row

Applies when Unavailable action default is Reason is shown and row when unavailable is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: while Row.id is unavailable, its presentation identifies it, marks it unavailable, and names the current block under Row.presentation rule declared in. The test restates nothing from the cited rule.

Given

Row.id unavailable for each current block admitted by Row.action declared in

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
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id looks identical across availability states by its row answer

unavailable-unchanged-override

scenarioper action-cases row

Applies when row when unavailable is Unchanged.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: any player-facing presentation of Row.id that exists is identical while available and unavailable. If none exists, the comparison asserts nothing.

Given

any player-facing presentation of Row.id that exists once the action is available and once it is unavailable in the same covered situation

When
  • an observer compares the two states
Then
  • where a player-facing presentation exists, it is identical across the available and unavailable states; where none exists, this comparison asserts nothing
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id looks identical across availability states by the game default

unavailable-unchanged-default

scenarioper action-cases row

Applies when Unavailable action default is Unchanged and row when unavailable is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: any player-facing presentation of Row.id that exists is identical while available and unavailable. If none exists, the comparison asserts nothing.

Given

any player-facing presentation of Row.id that exists once the action is available and once it is unavailable in the same covered situation

When
  • an observer compares the two states
Then
  • where a player-facing presentation exists, it is identical across the available and unavailable states; where none exists, this comparison asserts nothing
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-presentation-trace
Row.id has no reachable unavailable state by its row answer

unavailable-never-override

scenarioper action-cases row

Applies when row when unavailable is Never unavailable.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the game default: no reachable state in a covered situation makes Row.id unavailable.

Given

every reachable state in every covered situation for Row.id

When
  • an observer checks ordinary permission throughout those states
Then
  • no reachable state makes Row.id unavailable
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-permission-trace
Row.id has no reachable unavailable state by the game default

unavailable-never-default

scenarioper action-cases row

Applies when Unavailable action default is Never unavailable and row when unavailable is Use game default.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the game default: no reachable state in a covered situation makes Row.id unavailable.

Given

every reachable state in every covered situation for Row.id

When
  • an observer checks ordinary permission throughout those states
Then
  • no reachable state makes Row.id unavailable
Diagnostics
  • Instance-Row.id-observer-result
  • Instance-permission-trace
Row.id presents its channel form through Bind channel phrase alone

action-channel-announces

scenarioper availability-presentations row

Applies for every adoption

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 Bind channel phrase 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 Row.channel rule declared in 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 Row.channel rule declared in; the test restates nothing from it.

Given

on every platform where this row applies, controlled presentations for the action case named Row.action case: 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 Bind channel phrase 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 Bind channel phrase 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 Row.channel rule declared in
  • where Row.channel rule declared in states 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
  • Instance-Row.id-observer-result
one action input stays one signal with its candidates

shared-input-stays-one

scenarioonce

Applies for every adoption

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.

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
  • Instance-candidate-set
  • Instance-offered-action
Row.id offers one rule-selected candidate

shared-input-rule-selects-one

scenarioper shared-input-cases row

Applies when row selection is Rule selects one.

For Row.id, the rule at Row.selection rule declared in selects exactly one candidate by its declared ordering or situation test at the accepted moment, after any forgiveness shift. The action is offered under Row.presentation rule declared in before the input becomes an attempt; no other candidate is presented as what will happen now. One action proposal follows. The test restates neither cited rule, and ordering, rejection, and effects after the proposal assert nothing.

Given

action input Row.action input with several candidates from Row.actions declared in in the situation at Row.situation declared in

When
  • the accepted moment arrives, after any Input forgiveness shift
Then
  • Row.selection rule declared in selects exactly one candidate by its ordering or situation test and breaks every reachable tie
  • the selected action is offered under Row.presentation rule declared in before the accepted input becomes an attempt
  • no other candidate is presented as what will happen now
  • one action proposal follows
  • ordering, rejection, and effects after that proposal assert nothing
Diagnostics
  • Instance-candidate-set
  • Instance-offered-action
  • Instance-presentation-trace
Row.id offers one player-selected candidate

shared-input-player-selects-one

scenarioper shared-input-cases row

Applies when row selection is Player selects one.

For Row.id, the player makes the explicit choice required at Row.selection rule declared in at the accepted moment, after any forgiveness shift. Exactly one action is offered under Row.presentation rule declared in before the input becomes an attempt; no other candidate is presented as what will happen now. One action proposal follows. The test restates neither cited rule, and ordering, rejection, and effects after the proposal assert nothing.

Given

action input Row.action input with several candidates from Row.actions declared in in the situation at Row.situation declared in

When
  • the accepted moment arrives, after any Input forgiveness shift, and the player makes the explicit choice required at Row.selection rule declared in
Then
  • the explicit choice completes before the input becomes an attempt and selects exactly one candidate
  • the selected action is offered under Row.presentation rule declared in before the accepted input becomes an attempt
  • no other candidate is presented as what will happen now
  • one action proposal follows
  • ordering, rejection, and effects after that proposal assert nothing
Diagnostics
  • Instance-candidate-set
  • Instance-offered-action
  • Instance-presentation-trace
Row.id reads a buffered shared input in its accepted situation

buffered-shared-input-reads-accepted-situation

scenarioper shared-input-cases row

Applies when row selection is Rule selects one or Player selects one.

For Row.id, a buffered input reads its candidate set and offered action in the accepted situation, not the situation where it was pressed. No candidate is presented as what will happen now while the input waits. Where forgiveness shifts acceptance for one candidate only, the settlement reads that shifted moment. Where the adoption cannot construct a buffered input, this test asserts nothing.

Given

an input pressed in one covered situation and accepted in another after an Input forgiveness shift; where the adoption cannot construct a buffered input, this test asserts nothing

When
  • the input waits and then reaches its accepted moment
Then
  • the candidate set and the offered action are read in the accepted situation
  • no candidate is presented as what will happen now while the input waits
  • where forgiveness shifts acceptance for one candidate only, the settlement reads that shifted moment
Diagnostics
  • Instance-candidate-set
  • Instance-offered-action
  • Instance-presentation-trace
availability and offered-action presentations refresh after relevant changes

presentation-refreshes-after-change

scenarioonce

Applies for every adoption

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.

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
  • Instance-refresh-log
  • Instance-prompt-bindings
  • Instance-offered-action
action legibility keeps its authority order

action-legibility-authority-order

scenarioonce

Applies for every adoption

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.

Given

a covered action input and situation that exercise every applicable part of the Instance adoption

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
  • Instance-presentation-trace
  • Instance-candidate-set
  • Instance-offered-action
  • Instance-refresh-log
the adoption makes no promise beyond action legibility

legibility-boundaries

scenarioonce

Applies for every adoption

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.

Given

the Instance adoption 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
  • Instance-declaration-record
declaration check: Row.id has the presentation shape its effective answers require

effective-answers-have-legal-presentation-shape

scenarioper action-cases row

Applies for every adoption

This declaration check reads the adoption, not the running game. The action-cases description supplies all three duties. Resolve Row.id'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.

Given

the Instance adoption, its two answers, and action case Row.id, 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 Row.id, as the action-cases description requires; under none, this clause asserts nothing
  • when the effective discovery answer is none, no availability-presentations row names Row.id, 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
Diagnostics
  • Instance-declaration-record
declaration check: Row.id names an action case in this adoption

presentation-action-case-join

scenarioper availability-presentations row

Applies for every adoption

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 Row.id must therefore name an existing action case: Row.action case. A missing or misspelled join is a defect this test fails by construction.

Given

the Instance adoption and availability presentation Row.id, not the running game

When
  • a reviewer checks the action-case join
Then
  • an action-cases row with id Row.action case exists in this adoption
  • a missing or misspelled action case is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: Row.id lists every candidate and always selects one

shared-input-completeness

scenarioper shared-input-cases row

Applies for every adoption

This declaration check reads the adoption and its cited prose, not the running game. For Row.id, Row.actions declared in must list every candidate the input can carry in the cited situation and each eligibility condition; Row.selection rule declared in must select exactly one and break every reachable tie. Any other shape is a defect this test fails by construction. The test names the addresses and restates nothing from them.

Given

the Instance adoption and shared-input case Row.id, not the running game

When
  • a reviewer compares the cited candidate and selection rules in every reachable cited situation
Then
  • Row.actions declared in lists every candidate that Row.action input can carry in the situation at Row.situation declared in and states each eligibility condition
  • Row.selection rule declared in selects exactly one candidate and breaks every reachable tie
  • a missing candidate, uncovered result, or reachable tie is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
  • Instance-candidate-set
declaration check: every multi-candidate input has exactly one matching row

multi-candidate-input-has-one-row

scenarioonce

Applies for every adoption

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.

Given

the Instance adoption 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
  • Instance-declaration-record
declaration check: presentation pairs do not repeat and action cases do not overlap

rows-do-not-repeat-or-overlap

scenarioonce

Applies for every adoption

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.

Given

the Instance adoption 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
  • Instance-declaration-record
declaration check: Row.id's action citation states its duty

action-citation-duty

scenarioper action-cases row

Applies for every adoption

This declaration check reads the adoption and Row.action declared in, not the running game. The citation must name Row.id'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.

Given

the Instance adoption and Row.action declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.action declared in names the action, its ordinary permission, and its complete effect
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: Row.id's situation citation states its duty

action-situation-citation-duty

scenarioper action-cases row

Applies for every adoption

This declaration check reads the adoption and Row.situation declared in, not the running game. The citation must name every covered play situation and the nearest similar excluded situations for Row.id. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.

Given

the Instance adoption and Row.situation declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.situation declared in names every play situation covered by Row.id and the nearest similar situations excluded from it
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: Row.id's presentation citation states its duty

action-presentation-citation-duty

scenarioper action-cases row

Applies for every adoption

This declaration check reads the adoption and Row.presentation rule declared in, not the running game. The citation must state every discovery route and unavailable state for Row.id, 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.

Given

the Instance adoption and Row.presentation rule declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.presentation rule declared in states every discovery route and unavailable state for Row.id, including an explicit statement when no route exists
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: Row.id's platform citation states its duty

presentation-platform-citation-duty

scenarioper availability-presentations row

Applies for every adoption

This declaration check reads the adoption and Bind platform citation, not the running game. The citation must name the platform on which Row.id applies, and the row applies only there. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.

Given

the Instance adoption and Bind platform citation, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Bind platform citation names the platform on which Row.id applies
  • the row applies only on that platform
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: Row.id's channel citation states its duty

channel-rule-citation-duty

scenarioper availability-presentations row

Applies for every adoption

This declaration check reads the adoption and Row.channel rule declared in, 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.

Given

the Instance adoption and Row.channel rule declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.channel rule declared in states Row.id'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
  • Instance-declaration-record
declaration check: the situation citation of Row.id states its duty

shared-situation-citation-duty

scenarioper shared-input-cases row

Applies for every adoption

This declaration check reads the adoption and Row.situation declared in, not the running game. The citation must name the situation in which several actions share Row.action input. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.

Given

the Instance adoption and Row.situation declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.situation declared in names the situation in which several actions share Row.action input
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: the candidate citation of Row.id states its duty

shared-actions-citation-duty

scenarioper shared-input-cases row

Applies for every adoption

This declaration check reads the adoption and Row.actions declared in, not the running game. The citation must list every candidate for Row.action input in the cited situation and each eligibility condition. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.

Given

the Instance adoption and Row.actions declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.actions declared in lists every candidate action for Row.action input in the cited situation and the conditions that make each candidate eligible
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: the action-input citation of Row.id states its duty

shared-action-input-citation-duty

scenarioper shared-input-cases row

Applies for every adoption

This declaration check reads the adoption and Row.action input declared in, not the running game. The Fixed control rule must name shared action input Row.action input and the physical activation that produces it. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.

Given

the Instance adoption and Row.action input declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.action input declared in names the shared action input Row.action input and the physical activation that produces it
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: the selection citation of Row.id states its duty

shared-selection-citation-duty

scenarioper shared-input-cases row

Applies for every adoption

This declaration check reads the adoption and Row.selection rule declared in, not the running game. The citation must select exactly one offered action and break every reachable tie. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.

Given

the Instance adoption and Row.selection rule declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.selection rule declared in selects exactly one offered action and breaks every reachable tie
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: the presentation citation of Row.id states its duty

shared-presentation-citation-duty

scenarioper shared-input-cases row

Applies for every adoption

This declaration check reads the adoption and Row.presentation rule declared in, not the running game. The citation must identify the selected offered action before Row.action input becomes an action attempt. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.

Given

the Instance adoption and Row.presentation rule declared in, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • Row.presentation rule declared in identifies the selected offered action before Row.action input becomes an action attempt
  • a missing duty is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
action legibility holds for the whole run

legibility-holds

generalonce

Applies for every adoption

Across Inputs scope, 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.

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

Inputs seeds

Scope

Inputs scope

Diagnostics
  • Instance-observer-result
  • Instance-presentation-trace
  • Instance-prompt-bindings
  • Instance-candidate-set
  • Instance-offered-action
  • Instance-refresh-log

Use this contract in your game ↑