Input forgiveness
input-forgiveness-1
This contract defines the behaviour of forgiving inputs: coyote time, a jump buffer, or an early reload press.
It decides what your jump or dodge does when it lands early or late, and which action wins when several come due.
- 1 question
- no numbers
- 4 lists
- 49 tests
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
1 question.
Try the answers
Pick answers to see which rules and tests apply. Nothing is saved here: the ZIP and the authoring tool start unanswered.
When several helped inputs come due together, which ones does the game try?
- Asked when
- the late input windows list has at least one row, or the input buffers list has at least one row, or the target moment windows list has at least one row.
- If not asked
- No forgiveness row can make an input due.
Why this is asked
A landing, beat, or recovery end can make several helped inputs ready. The game must decide which ones to try.
Lists4 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.
Late input windows
late-input-windows
Actions accepted just after ordinary permission ends, such as a platformer jump after leaving walkable ground.
An empty list means: No action remains available through input forgiveness after its ordinary permission ends.
Each row is: id, action, action-declared-in, arms-when-declared-in, window-declared-in, cancels-when-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable game-facing name, such as jump-after-ground. |
action |
string | Required | The game action receiving late forgiveness, such as jump. The reserved all-actions spelling covers the game's complete action set. |
action-declared-in |
reference | Required | The Fixed rule naming the action, its ordinary permission, and its complete effect. For the reserved all-actions spelling, it names these for every action in the set. |
arms-when-declared-in |
reference | Required | The Fixed rule naming every transition that starts this late case and every similar transition that does not. A platformer may name walking off ground and exclude jumping from it. |
window-declared-in |
reference | Required | The game's Fixed timing rule for this late window, including its positive duration, unit, inclusive last moment, clock, pause behaviour, and open-state test. |
cancels-when-declared-in |
reference | Required | The Fixed rule naming every game event that ends this forgiveness before the cited window closes, or stating that no extra event does. |
Input buffers
input-buffers
Early presses saved until an action first becomes ordinarily permitted, such as dodge pressed during attack recovery.
An empty list means: No early press waits for an action to become ordinarily permitted.
Each row is: id, action, action-declared-in, arms-when-declared-in, window-declared-in, fires-when-declared-in, cancels-when-declared-in, waiting-press, held-after-fire.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable game-facing name, such as dodge-during-recovery. |
action |
string | Required | The game action whose early press may wait, such as dodge. The reserved all-actions spelling covers the game's complete action set. |
action-declared-in |
reference | Required | The Fixed rule naming the action, its ordinary permission, and its complete effect. For the reserved all-actions spelling, it names these for every action in the set. |
arms-when-declared-in |
reference | Required | The Fixed rule naming the accepted early states, the excluded states, and the matching action input. A soulslike may accept dodge during recovery but exclude menus, stun, and defeat. |
window-declared-in |
reference | Required | The game's Fixed timing rule for this saved press, including its positive duration, unit, inclusive last moment, clock, pause behaviour, and open-state test. |
fires-when-declared-in |
reference | Required | The Fixed rule naming the first ordinary permission event that releases the saved action. A landing may release jump; recovery end may release dodge. |
cancels-when-declared-in |
reference | Required | The Fixed rule naming every event that discards the saved press before it fires, or stating that no extra event does. |
waiting-press |
choice: first-press-stays, latest-press-replaces | Required | Which matching press survives while this row already holds one: the first stays, or the latest replaces it. A menu confirm may keep the first click or replace it with the second. |
held-after-fire |
choice: fresh-press-required, hold-can-repeat | Required | Whether an uninterrupted hold needs a release and fresh press or may prepare another action after this buffer fires. A racing boost may repeat from one hold. |
Target moment windows
target-moment-windows
Inputs accepted near a cited target moment, such as a rhythm beat or an incoming strike's impact.
An empty list means: No input is forgiven because it falls near a target moment.
Each row is: id, action, action-declared-in, target-moment-declared-in, arms-when-declared-in, window-declared-in, result-declared-in, cancels-when-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable game-facing name, such as lead-note-hit or sword-impact-parry. |
action |
string | Required | The game action judged against the target moment, such as hit-note or parry. The reserved all-actions spelling covers the game's complete action set. |
action-declared-in |
reference | Required | The Fixed rule naming the action input, its ordinary permission, and its complete attempt. This target row grades an attempt; it does not grant permission. For the reserved all-actions spelling, it names these for every action in the set. |
target-moment-declared-in |
reference | Required | The Fixed rule naming the target moment. |
arms-when-declared-in |
reference | Required | The Fixed rule naming the event that creates the current target instance and which input events are associated with it. |
window-declared-in |
reference | Required | The game's one Fixed timing rule for the outer target-relative window, including its early and late bounds of positive width, inclusive last moments, unit, clock, pause behaviour, and open-state test. |
result-declared-in |
reference | Required | The Fixed result rule for an accepted input. It owns any grade boundaries inside this row's one outer window and states any departure from first-accepted settlement; a rhythm note may record perfect, great, or good. |
cancels-when-declared-in |
reference | Required | The Fixed rule naming every event that stops this target instance from accepting input before the cited window closes, or stating that no extra event does. |
Competition rules
competition-rules
Situations where several forgiven inputs are ready together and one fixed game priority selects a single attempt. Rows exist only under the declared-priority answer; an adoption answering otherwise, or answering nothing, has none.
An empty list means: No competition priority rule is declared.
Each row is: id, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable game-facing name, such as recovery-end-actions. |
declared-in |
reference | Required | The Fixed rule identifying the situation and giving one total priority over every forgiven input that can be ready there. |
For builders
Exact mechanism wording and 49 pack tests
Exact mechanism wording
This is the single normative authority for when forgiveness arms, what input it captures or accepts, how repeated and competing inputs settle, when an action fires, and what clears the forgiveness state. Questions and rows describe the game's choices and cite its rules; they do not define another sequence.
An action or input not matched by a row in the current situation receives no forgiveness from this adoption, and no cited game rule outside these rows promises it any.
An action input is the game-facing input event supplied after Control options maps a physical control. Ordinary permission is the action's legal state before any forgiveness. A ready forgiven input is either an input accepted for immediate submission by a late or target row, or a saved buffered press whose cited firing event has arrived. A target moment is the cited beat, impact, cue, or comparable game instant against which input timing is judged. A target instance is settled when it may accept no further input; the first accepted input settles it unless the cited result rule says otherwise. A press is the arrival of the action input, whichever physical edge the cited action rule uses — a release-triggered action counts. For every family, when §4's agreeing Timed window adoption exists for a cited window, runtime openness reads from it; otherwise the cited Fixed timing rule decides.
### Arm forgiveness windows
1. Arming runs on game events, not on input receipt. Whenever a row's cited arming event occurs, it creates one window instance under the cited Fixed timing rule: a late event creates one instance for that loss of permission, and a target event creates one per-target instance, in both cases before and independently of any input. A buffer's per-press instance is the exception: the qualifying press itself creates it at the moment step 6 stores the press. This contract owns those instance scopes.
### Receive an action input
2. Map the physical control to its game action through Control options. Read the action's ordinary permission and every matching row for the current situation. Physical device identity does not change a row's settlement. By default, a control already held when a late or target row arms creates no action input; the cited action rule may explicitly define a different input. 3. Ordinary permission gates only late-input and buffer evaluation. When the action is ordinarily permitted, do not evaluate those two families. Do not submit yet: the target branch in step 4 runs whether ordinary permission is present or absent. 4. Evaluate every matching target row for its associated target instance, regardless of ordinary permission. An open row can grade only an otherwise-legal attempt; it never grants ordinary permission. The accepted input becomes ready now, and the first accepted input settles the target unless that result rule says otherwise. Two rows of one family matching one input in the same situation are an invalid adoption rather than an implicit choice. 5. If a target row accepted this input, end this receipt. If no target row accepts and ordinary permission exists, submit the ordinary attempt without forgiveness and end this receipt. Otherwise — ordinary permission is absent — a matching late row may accept after its cited arming event while its window is open. An accepted late input becomes ready now. 6. If neither immediate family accepts, a matching input-buffer row may save the press only while its cited arming rule holds. Storing the press creates its per-press window instance. The row stores at most one press, its action, input moment, and that instance. For a row whose action is the reserved all-actions spelling, a press of any covered action is a matching press of that row. If one already waits, apply that row's waiting-press field: first-press-stays ignores the later press, while latest-press-replaces clears the earlier press and creates a fresh instance for the later one.
### Advance, fire, and clear rows
7. A live late-input row ends when its action executes, ordinary permission returns, the cited timing window closes, or its cited early-clearing event occurs. Action execution cannot arm a replacement late window. 8. A waiting buffer clears without firing when its cited timing window closes or its cited early-clearing event occurs. If neither happens, the first cited ordinary permission event makes it ready. No later input poll or extra delay is inserted. 9. A target-moment row accepts no further input for a target instance after the cited timing window closes, the target is settled, or its cited early-clearing event occurs. Whether the window was open at the input moment follows the openness rule in this section's definitions. 10. Collect every ready forgiven input at this game moment. A ready input exists once; a repeated update cannot create another copy from the same stored press or accepted input. When two adoptions of this contract produce ready inputs at one moment, settle each adoption independently, then submit all inputs selected by either adoption together.
### Settle competition and submit attempts
11. Under all-ready-actions, submit every ready forgiven input once. Under declared-priority, find the one matching competition row and submit only its highest-priority input; every situation in which forgiven inputs can be ready together has exactly one such row; the cited priority holds stable for the whole settlement moment. Clear every lower-priority ready input without submitting it. Under cannot-coincide, two ready inputs invalidate the design claim. 12. Submit selected inputs as action proposals at this moment. Event resolution owns the order of proposals that share the moment. The action's Fixed rules own cost, effect, and any rejection after submission. Forgiveness does not force an otherwise conflicting action to succeed. 13. Clear each submitted or competition-losing buffered press immediately. Clear a submitted late window. A competition-losing late window survives until its own close or clearing event; while it remains open it may accept a new press, and the cleared input is not restored. A losing target instance stays open until settled or closed; under the default first-accepted rule it is already settled. A target input has no saved press after submission. 14. Apply the firing buffer row's held-after-fire field only after its action fires and its saved press has been cleared. Under fresh-press-required, held state creates nothing until release and a fresh press. Under hold-can-repeat, the uninterrupted hold creates one new press when that row's arming condition next holds. If its cited window later closes while the hold and arming condition still hold, clear it and create one fresh waiting press immediately. At most one waits in the row. 15. A rejected action proposal does not restore its cleared forgiveness state. A new attempt needs a new qualifying arming event or press. Event resolution owns the consequences of the rejection; this contract owns only the cleared forgiveness state.
The authority order is therefore: arming, physical input mapping, ordinary permission, target acceptance, late acceptance, buffer capture, repeated-press choice, cited open-window and early-clearing state, firing event, competition selection, same-moment event order, action rules, clearing, and held-input renewal. A later stage never rewrites an earlier input moment or target moment.
Verification pack
sha256:dc06d707164dbb72befb35426803f2adc6e4bedee5496e3a30a9c8a9c2491120
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.
49 pack tests
Placeholders are filled from the adoption's answers, values, rows, and verification inputs.
input forgiveness uses game-facing input and cited openness
forgiveness-vocabulary-and-openness
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
For a declared row, an action input is the game-facing event after Control options maps a physical control; device identity does not change settlement. Ordinary permission is the action's legal state before forgiveness, and a press uses the edge named by the cited action rule. Openness comes from the agreeing Timed window adoption where one exists, otherwise from the cited Fixed timing rule. A family this adoption does not declare asserts nothing in the clause that names it.
- Given
a physical control mapped through Control options to an action input that reaches a declared forgiveness row
- When
- the row reads ordinary permission, its input edge, and whether its window instance is open
- Then
- the action input is the game-facing event after mapping, independent of physical device identity
- ordinary permission is the action's legal state before forgiveness
- the press arrives on the edge named by the cited action rule, including a release edge where that rule names one
- openness comes from the agreeing Timed window adoption where one exists and otherwise from the row's cited Fixed timing rule
- an accepted late or target input, or a saved press whose firing event has arrived, is one ready forgiven input
- a family this adoption does not declare asserts nothing in the clause that names it
- Diagnostics
Instance-input-receiptInstance-window-instancesInstance-ready-set
an unmatched action input receives no forgiveness
unmatched-input-receives-no-forgiveness
Applies for every adoption
An action input with no matching row in the current situation receives no forgiveness. Ordinary permission alone decides whether the action is submitted.
- Given
an action input with no matching late-input-windows, input-buffers, or target-moment-windows row in the current situation
- When
- the game receives that action input
- Then
- ordinary permission alone decides whether the action is submitted
- the adoption creates no ready forgiven input, saved press, or target grade for it
- Diagnostics
Instance-input-receiptInstance-ready-setInstance-waiting-press-state
empty row families create no forgiveness state
empty-row-families-create-no-forgiveness
Applies for every adoption
An empty late-input-windows set keeps no action available after ordinary permission ends; an empty input-buffers set means no early press waits for an action to become ordinarily permitted; an empty target-moment-windows set forgives no input near a target moment; and an empty competition-rules set declares no priority. Where the named set has a row, that clause asserts nothing. If all three forgiveness families are empty, no forgiveness row can make an input due and the competition-rules description requires no competition rows; any row is a defect this test fails by construction. Where any forgiveness family has a row, that last clause asserts nothing.
- Given
the
Instanceadoption document and its row sets- When
- each empty row set's declared consequence is read
- Then
- where late-input-windows is empty, no action remains available through forgiveness after ordinary permission ends; where a row exists, this clause asserts nothing
- where input-buffers is empty, no early press waits for an action to become ordinarily permitted; where a row exists, this clause asserts nothing
- where target-moment-windows is empty, no input is forgiven because it falls near a target moment; where a row exists, this clause asserts nothing
- where competition-rules is empty, no competition priority rule is declared; where a row exists, this clause asserts nothing
- where all three forgiveness row families are empty, no forgiveness row can make an input due; where any family has a row, this clause asserts nothing
- where all three forgiveness row families are empty, competition-rules has no rows and any row is a defect this test fails by construction; where any family has a row, this clause asserts nothing
- Diagnostics
Instance-declaration-record
Row.id arms one late window on its cited event
late-window-arms-on-cited-event
Applies for every adoption
The loss-of-permission event at Row.arms when declared in creates one Row.id window instance under Row.window declared in before and independently of input. A similar transition excluded by the arming citation creates none.
- Given
two trials, one with the loss-of-permission transition cited at
Row.arms when declared inand one with a similar transition that citation excludes- When
- each transition occurs before any action input
- Then
- the cited arming event creates one
Row.idwindow instance for that loss of permission underRow.window declared inbefore and independently of input - the excluded transition creates no
Row.idwindow instance
- the cited arming event creates one
- Diagnostics
Instance-arming-logInstance-window-instances
Row.id creates one instance for each cited target
target-instance-arms-on-cited-event
Applies for every adoption
For every target moment at Row.target moment declared in, the event at Row.arms when declared in creates one separate Row.id target instance under Row.window declared in before and independently of input.
- Given
two distinct target moments named by
Row.target moment declared in- When
- the creating event at
Row.arms when declared inoccurs for each target before any associated action input
- the creating event at
- Then
- each target receives one separate
Row.idtarget instance underRow.window declared in - each instance exists before and independently of its associated input
- each target receives one separate
- Diagnostics
Instance-arming-logInstance-window-instances
Row.id creates no instance before its qualifying press
buffer-arms-on-qualifying-press
Applies for every adoption
Row.id has no window instance before a qualifying press. When a qualifying press named by Row.arms when declared in is stored, it creates one per-press instance under Row.window declared in at that input moment.
- Given
the early state and matching action input named by
Row.arms when declared in- When
- the early state begins and then the qualifying press is stored
- Then
- no
Row.idper-press window instance exists merely because the early state began - storing the qualifying press creates one
Row.idinstance at that press's input moment underRow.window declared in
- no
- Diagnostics
Instance-arming-logInstance-waiting-press-stateInstance-window-instances
input receipt maps the control before reading forgiveness
receipt-maps-before-settlement
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
Control options maps a physical control before forgiveness reads ordinary permission and matching rows. Device identity does not change settlement. A control already held when a late or target row arms creates no action input unless its cited action rule defines one; without either family, that observation asserts nothing.
- Given
two physical devices mapped by Control options to the same action input, plus a control already held when a late or target row arms where the adoption can construct one
- When
- the game receives each mapped input and observes the already-held control
- Then
- both mapped action inputs read the same ordinary permission and matching rows regardless of device identity
- the already-held control creates no action input at arming unless the cited action rule explicitly defines one
- where the adoption has no late or target row, the already-held observation asserts nothing
- Diagnostics
Instance-input-receiptInstance-arming-log
target, late, buffer, and ordinary receipt keep their fixed order
receipt-family-order
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
A receipt evaluates target rows first whether ordinary permission exists or not. If none accepts and permission exists, it submits the ordinary attempt without forgiveness. Without permission, late rows run next and a buffer captures only if neither immediate family accepts. A family this adoption does not declare asserts nothing in the clause that names it.
- Given
action-input receipts that exercise every forgiveness family the
Instanceadoption declares- When
- ordinary permission is present in one receipt and absent in another
- Then
- every matching target row is evaluated regardless of ordinary permission before any late or buffer row
- ordinary permission prevents late and buffer evaluation but does not prevent target evaluation
- if no target row accepts and ordinary permission exists, the ordinary attempt is submitted without forgiveness and the receipt ends
- with no ordinary permission, late rows run before buffer rows, and a buffer captures only if neither immediate family accepts
- a family absent from this adoption asserts nothing in the clauses that name it
- Diagnostics
Instance-input-receiptInstance-submission-logInstance-waiting-press-state
Row.id accepts and grades only an open, otherwise-legal attempt
target-input-accepts-and-grades
Applies for every adoption
While Row.window declared in records a Row.id target instance open, including its cited early and late inclusive moments, an otherwise-legal Row.action input is accepted, becomes ready now, and is graded by Row.result declared in. An otherwise-illegal input while open is not accepted, becomes no ready forgiven input, receives no result, and gains no ordinary permission. An input before the cited early bound or after that target instance closes is not accepted. The first accepted input settles that target instance unless the cited result rule declares otherwise, and acceptance ends the receipt.
- Given
four associated
Row.actioninputs for separateRow.idtarget instances: an otherwise-legal input whileRow.window declared inrecords its own target instance open, including its cited early and late inclusive moments, an otherwise-illegal input while that target instance is open, an otherwise-legal input after that target instance closes, and an otherwise-legal input before the cited early bound- When
- each input is evaluated against its target instance
- Then
- the open otherwise-legal input is accepted, becomes ready now, and receives the result at
Row.result declared in - the otherwise-illegal input while open is not accepted, becomes no ready forgiven input, and receives no result at
Row.result declared in; the row grants it no ordinary permission - the closed instance accepts and grades nothing
- the input before the cited early bound is not accepted by
Row.id - the first accepted input settles its target instance unless
Row.result declared indeclares a different settlement - acceptance ends that action-input receipt before late or buffer evaluation
- the open otherwise-legal input is accepted, becomes ready now, and receives the result at
- Diagnostics
Instance-input-receiptInstance-ready-setInstance-target-gradesInstance-window-instances
Row.id accepts through its cited last moment and not later
late-input-accepts-only-while-open
Applies for every adoption
After the event at Row.arms when declared in, Row.id accepts a Row.action input without ordinary permission while Row.window declared in records the instance open, including its cited last moment, and makes it ready now. The first input after that rule records the instance closed is not accepted.
- Given
two
Row.actioninput trials without ordinary permission, and for which no target row accepts, after the arming event atRow.arms when declared in- When
- one input arrives while
Row.window declared inrecords the instance open, including its cited inclusive last moment, and the other arrives at the first moment it records closed
- one input arrives while
- Then
- the open-window input is accepted and becomes one ready forgiven input now
- the closed-window input is not accepted by
Row.id
- Diagnostics
Instance-input-receiptInstance-window-instancesInstance-ready-set
Row.id stores one press and follows Row.waiting press
buffer-captures-one-press
Applies for every adoption
While Row.arms when declared in holds, Row.id stores one qualifying press of an action this row covers (Row.action), its input moment, and one instance under Row.window declared in. If another matching press arrives, Bind repeat result. The row holds at most one press; a press outside the cited early state is not saved. For a named action, a press of a different action asserts nothing; for the reserved all-actions spelling, the contract makes a press of any covered action a matching press, so it follows the repeated-press clause above.
- Given
a press of an action this row covers (
Row.action) for which no target or late row accepts, plus a second matching press while one already waits and a separate press whileRow.arms when declared indoes not hold- When
- the first press arrives while
Row.arms when declared inholds, the repeated press arrives, and the separate outside-state press is received
- the first press arrives while
- Then
- the first qualifying press stores its action, input moment, and one per-press instance under
Row.window declared in Bind repeat result- the row holds at most one saved press
- the outside-state press is not saved by
Row.id - where this row's action is the reserved all-actions spelling, a press of any covered action is a matching press of this row and follows the repeated-press clause above; for a named action, a press of a different action asserts nothing
- the first qualifying press stores its action, input moment, and one per-press instance under
- Diagnostics
Instance-input-receiptInstance-waiting-press-stateInstance-window-instancesInstance-clearing-log
Row.id ends on execution, permission, close, or early clearing
late-window-clears-on-four-ends
Applies for every adoption
A live Row.id instance ends when Row.action executes, ordinary permission returns, Row.window declared in closes it, or the event at Row.cancels when declared in occurs. It accepts nothing afterward, and execution does not arm a replacement.
- Given
four otherwise identical live
Row.idinstances- When
Row.actionexecutes in one, ordinary permission returns in one,Row.window declared inrecords one closed, and the early-clearing event atRow.cancels when declared inoccurs in one
- Then
- each affected
Row.idinstance ends at its named event and accepts no later input - the action execution creates no replacement
Row.idinstance
- each affected
- Diagnostics
Instance-clearing-logInstance-window-instancesInstance-input-receipt
Row.id fires once at its first cited event or clears without firing
buffer-fires-or-clears-at-first-boundary
Applies for every adoption
If neither clearing path arrives first, Row.id fires once at the first event named by Row.fires when declared in, with no later poll or extra delay. A prior close at Row.window declared in or early event at Row.cancels when declared in clears it without firing. The records distinguish firing from each clearing path.
- Given
three otherwise identical waiting
Row.idsaved presses- When
- the first ordinary permission event at
Row.fires when declared inarrives before clearing in one trial,Row.window declared incloses before firing in another, and the event atRow.cancels when declared inoccurs before firing in the third
- the first ordinary permission event at
- Then
- the first trial makes the saved press ready exactly once at that firing event with no later input poll or extra delay
- the window-close trial clears the saved press and submits nothing from it
- the early-clearing trial clears the saved press and submits nothing from it
- the firing, window-close, and early-clearing records distinguish the three results
- Diagnostics
Instance-waiting-press-stateInstance-ready-setInstance-clearing-logInstance-submission-log
Row.id accepts nothing after close, settlement, or early clearing
target-instance-stops-accepting
Applies for every adoption
Row.id accepts nothing for a target instance after Row.window declared in closes it, Row.result declared in settles it, or Row.cancels when declared in ends it early. Openness is read at the recorded input moment.
- Given
three
Row.idtarget instances, one closed byRow.window declared in, one settled underRow.result declared in, and one ended byRow.cancels when declared in- When
- an otherwise-legal associated
Row.actioninput reaches each instance afterward
- an otherwise-legal associated
- Then
- none of the three instances accepts the later input or creates another target grade
- the recorded input moment, not a later update, decides whether the cited window was open
- Diagnostics
Instance-input-receiptInstance-window-instancesInstance-target-grades
each ready forgiven input exists once
ready-input-exists-once
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
A stored press or accepted input contributes one ready forgiven input, and repeated updates create no copy. If two adoptions produce ready inputs at one moment, each settles independently and both selected sets are submitted together; where that case cannot occur, the clause asserts nothing.
- Given
a stored press or accepted input that becomes ready, plus two adoptions producing ready inputs at one moment where the game can construct that case
- When
- the game updates the ready state repeatedly and settles the moment
- Then
- the same stored press or accepted input contributes exactly one ready forgiven input
- a repeated update creates no copy
- where two adoptions contribute, each settles independently and the inputs selected by both are submitted together
- where no shared-adoption moment can occur, the shared-adoption clause asserts nothing
- Diagnostics
Instance-ready-setInstance-submission-log
all-ready-actions submits every ready input once
all-ready-actions-submit-every-input
Applies when Ready together is All ready actions.
Under all-ready-actions, every ready forgiven input is submitted exactly once at the settlement moment. Input forgiveness removes none by priority.
- Given
two or more ready forgiven inputs at one game moment
- When
- the adoption settles their competition
- Then
- every ready forgiven input is submitted exactly once as an action proposal at that moment
- none is removed by an input-forgiveness priority
- Diagnostics
Instance-ready-setInstance-submission-log
declared-priority submits one stable winner
declared-priority-submits-one-winner
Applies when Ready together is Declared priority.
Under declared-priority, the one matching competition row supplies a priority that stays stable for the settlement moment. Exactly its highest-priority ready input is submitted once, and every lower-priority ready input is cleared without submission.
- Given
two or more ready forgiven inputs in a situation covered by its one matching competition-rules row
- When
- the adoption settles their competition
- Then
- the cited priority remains stable for the whole settlement moment
- exactly the highest-priority input is submitted once
- every lower-priority ready input is cleared without submission
- Diagnostics
Instance-ready-setInstance-submission-logInstance-clearing-log
cannot-coincide rejects a reachable pair of ready inputs
cannot-coincide-invalidates-two-ready-inputs
Applies when Ready together is Cannot coincide.
Under cannot-coincide, no reachable game state has two ready forgiven inputs at one moment. One observed pair invalidates the design claim; this contract does not choose a winner.
- Given
the adoption's reachable-state claim for ready forgiven inputs
- When
- the audit searches for a game moment with two ready forgiven inputs
- Then
- no reachable game state contains that pair
- one observed pair invalidates the design claim rather than selecting an implicit winner
- Diagnostics
Instance-ready-setInstance-coincidence-violation
selected inputs become proposals at this moment
selected-inputs-stop-at-proposal-boundary
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
A selected input becomes an action proposal at the current game moment. Event resolution owns same-moment proposal order, and the action's Fixed rules own cost, effect, and rejection. This contract stops at submission and does not force a conflicting action to succeed.
- Given
one or more inputs selected for submission
- When
- input forgiveness submits them
- Then
- each selected input enters Event resolution as an action proposal at the current game moment
- the input-forgiveness trace performs no ordering of proposals that share the moment
- cost, effect, conflict rejection, and proposal order are absent from input-forgiveness settlement and remain owned by the cited action rules and Event resolution
- Diagnostics
Instance-submission-logInstance-ready-set
Row.id clears after submission
buffer-clears-after-submission
Applies for every adoption
A selected Row.id saved press clears immediately on submission.
- Given
one ready
Row.idsaved press selected for submission- When
- the selected press is submitted
- Then
- the selected saved press clears immediately on submission
- Diagnostics
Instance-submission-logInstance-waiting-press-stateInstance-clearing-log
Row.id clears after competition loss
buffer-clears-after-competition-loss
Applies when Ready together is Declared priority.
When a ready Row.id input loses to a ready forgiven input from a different row, its saved press clears immediately without submission.
- Given
one ready
Row.idinput at a settlement moment that also carries a ready forgiven input from a different row- When
- the other input is selected and the
Row.idinput loses
- the other input is selected and the
- Then
- the competition-losing saved press clears immediately without submission
- Diagnostics
Instance-submission-logInstance-waiting-press-stateInstance-clearing-log
Row.id clears on submission
late-window-clears-after-submission
Applies for every adoption
Submission clears the accepting Row.id window immediately.
- Given
one ready input accepted by
Row.idand selected for submission- When
- the selected input is submitted
- Then
- the submitted input's
Row.idwindow clears immediately
- the submitted input's
- Diagnostics
Instance-submission-logInstance-window-instancesInstance-clearing-log
Row.id is not ended by a competition loss
late-window-survives-competition-loss
Applies when Ready together is Declared priority.
A competition loss does not end the Row.id window; it still ends only at its own four ends: execution, ordinary permission returning, Row.window declared in closing, or the event at Row.cancels when declared in. While the window remains open, a new Row.action input without ordinary permission is accepted, and the cleared losing input is not restored.
- Given
one ready
Row.idinput at a settlement moment that also carries a ready forgiven input from a different row- When
- the other input is selected and the
Row.idinput loses
- the other input is selected and the
- Then
- the competition loss does not end the
Row.idwindow; it still ends only at its own four ends: execution, ordinary permission returning,Row.window declared inclosing, or the event atRow.cancels when declared in - while that window remains open, a new
Row.actioninput without ordinary permission is accepted byRow.id - the cleared losing input is not restored
- the competition loss does not end the
- Diagnostics
Instance-input-receiptInstance-ready-setInstance-window-instancesInstance-clearing-log
Row.id leaves no saved press after submission
target-input-after-submission
Applies for every adoption
A selected Row.id target input leaves no saved press after submission.
- Given
one input accepted by
Row.idand selected for submission- When
- the selected target input is submitted
- Then
- the target input leaves no saved press after submission
- Diagnostics
Instance-submission-logInstance-waiting-press-state
Row.id remains open after competition loss until settled or closed
target-instance-after-competition-loss
Applies when Ready together is Declared priority.
After a competition loss, an unsettled Row.id target instance stays open until settlement, close at Row.window declared in, or the event at Row.cancels when declared in. Under the default first-accepted rule it is already settled, so a new input is not accepted.
- Given
one ready
Row.idinput at a settlement moment that also carries a ready forgiven input from a different row- When
- the other input is selected and the
Row.idinput loses
- the other input is selected and the
- Then
- where
Row.result declared inleaves the accepted input unsettled, that target instance stays open until it is settled,Row.window declared incloses it, or the event atRow.cancels when declared inclears it - under the default first-accepted rule, that target instance is already settled and accepts no new input
- where
- Diagnostics
Instance-input-receiptInstance-ready-setInstance-window-instancesInstance-target-gradesInstance-clearing-log
Row.id follows Row.held after fire after its action fires
held-control-after-buffer-fire
Applies for every adoption
The contract starts held-input handling only after Row.id's action fires and its saved press has been cleared. Then Bind held result. The course reads the arming condition at Row.arms when declared in, the window at Row.window declared in, and the firing event at Row.fires when declared in. At most one press waits. The test reads both waiting state and submissions so renewal and a fresh physical press remain distinguishable.
- Given
Row.idhas submitted its saved press, the action fires, and the physical control remains held- When
Bind held course
- Then
- held-input handling begins only after the action fires and the saved press has been cleared
Bind held result- at most one press waits in
Row.id - the waiting-press state and submission log distinguish renewal from a fresh physical press
- Diagnostics
Instance-waiting-press-stateInstance-submission-logInstance-clearing-log
a rejected proposal restores no forgiveness state
rejected-proposal-restores-nothing
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
Rejecting a submitted action proposal restores no cleared forgiveness state. A new attempt needs a new qualifying arming event or press. Rejection consequences belong to Event resolution and assert nothing here.
- Given
a submitted forgiven action proposal after the submission-time clearing for its family
- When
- the cited action rule or Event resolution rejects the proposal
- Then
- the cleared forgiveness state remains absent
- a new attempt appears only after a new qualifying arming event or press
- the consequences of rejection assert nothing in this contract
- Diagnostics
Instance-submission-logInstance-clearing-logInstance-window-instancesInstance-waiting-press-state
the forgiveness authority order never rewrites earlier moments
forgiveness-authority-order
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
Arming, input mapping, ordinary permission, target acceptance, late acceptance, buffer capture, repeated-press choice, open and early-clearing state, firing, competition, Event resolution order, action rules, clearing, and held-input renewal remain in that authority order. No later stage rewrites an earlier input moment or target moment. A stage absent from the case asserts nothing.
- Given
a receipt and settlement trace with distinguishable arming, mapped input, ordinary permission, acceptance or capture, open state, firing, competition, submission, action result, clearing, and held-input records where those stages occur
- When
- the trace is compared with the mechanism's authority order
- Then
- each stage reads the result of every earlier applicable stage in the listed order
- no later stage rewrites an earlier input moment or target moment
- a stage absent from the constructed case asserts nothing
- Diagnostics
Instance-input-receiptInstance-arming-logInstance-ready-setInstance-submission-logInstance-clearing-log
declaration check: no family has two rows matching one input
row-families-do-not-overlap
Applies when Ready together is All ready actions or Declared priority or Cannot coincide.
This declaration check reads the adoption and its cited prose, not the running game. The contract makes two rows of one family matching one input in the same situation an invalid adoption rather than an implicit choice. An overlapping pair is a defect this test fails by construction. For a family with fewer than two rows, its pair comparison asserts nothing.
- Given
the
Instanceadoption and its cited prose, not the running game- When
- a reviewer compares every pair of rows within late-input-windows, input-buffers, and target-moment-windows
- Then
- no two rows in one family can match one action input in the same situation
- an overlapping pair is a defect this test fails by construction; for a family with fewer than two rows, its pair comparison asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: declared-priority has one matching competition row
declared-priority-has-one-matching-rule
Applies when Ready together is Declared priority.
This declaration check reads the adoption and its cited prose, not the running game. The contract requires exactly one matching competition-rules row for every situation where forgiven inputs can be ready together under declared-priority. A missing or duplicate match is a defect this test fails by construction. Where no such situation exists, the situation comparison asserts nothing.
- Given
the
Instanceadoption and its cited prose, not the running game- When
- a reviewer lists every situation where forgiven inputs can be ready together and compares the list with competition-rules
- Then
- every listed situation has exactly one matching competition-rules row
- a missing or multiply matching row is a defect this test fails by construction; where no situation can make inputs ready together, the situation comparison asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: non-priority answers declare no competition rows
non-priority-answers-have-no-competition-rows
Applies when Ready together is All ready actions or Cannot coincide.
This declaration check reads the adoption, not the running game. The competition-rules description says rows exist only under declared-priority, so under all-ready-actions or cannot-coincide the set must be empty. Any row is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer counts competition-rules rows
- Then
- competition-rules has no rows
- any competition-rules row is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: unmatched actions have no external forgiveness promise
no-external-rule-promises-forgiveness
Applies for every adoption
This declaration check reads the adoption and its cited prose, not the running game. The contract says no cited game rule outside these rows promises forgiveness for an unmatched action or input. Any such promise is a defect this test fails by construction.
- Given
the
Instanceadoption and all prose it cites, not the running game- When
- a reviewer searches outside these rows for a promise that an unmatched action or input receives forgiveness
- Then
- no cited game rule outside these rows promises forgiveness for an unmatched action or input
- any such promise is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's action citation states its duty
late-action-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.action declared in, not the running game. The action-declared-in description requires the citation to identify Row.action as the row's action scope and name ordinary permission and the complete effect; for the reserved all-actions spelling, it names these for every action in the set. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.action declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.action declared inidentifies the row's action scope and names ordinary permission and the complete effect; for the reserved all-actions spelling, it names these for every action in the set, as the action-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's arming citation states its duty
late-arming-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.arms when declared in, not the running game. The citation must name every transition that starts Row.id and every similar transition that does not. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.arms when declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.arms when declared innames every transition that startsRow.idand every similar transition that does not- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's window citation states its duty
late-window-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.window declared in, not the running game. The window-declared-in description requires the citation to state a positive duration, unit, inclusive last moment, clock, pause behaviour, and open-state test 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
Instanceadoption and the prose atRow.window declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.window declared instates a positive duration, unit, inclusive last moment, clock, pause behaviour, and open-state test forRow.id, as the window-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's cancellation citation states its duty
late-cancellation-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.cancels when declared in, not the running game. The citation must name every event that ends Row.id before its window closes or state that no extra event does. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.cancels when declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.cancels when declared innames every event that endsRow.idbefore its cited window closes or states that no extra event does- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's action citation states its duty
buffer-action-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.action declared in, not the running game. The action-declared-in description requires the citation to identify Row.action as the row's action scope and name ordinary permission and the complete effect; for the reserved all-actions spelling, it names these for every action in the set. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.action declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.action declared inidentifies the row's action scope and names ordinary permission and the complete effect; for the reserved all-actions spelling, it names these for every action in the set, as the action-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's arming citation states its duty
buffer-arming-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.arms when declared in, not the running game. The arms-when-declared-in description requires the citation to name every accepted early state, the matching action input, and the excluded cases 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
Instanceadoption and the prose atRow.arms when declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.arms when declared innames every accepted early state, the matching action input, and the excluded cases forRow.id, as the arms-when-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's window citation states its duty
buffer-window-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.window declared in, not the running game. The window-declared-in description requires the citation to state a positive duration, unit, inclusive last moment, clock, pause behaviour, and open-state test 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
Instanceadoption and the prose atRow.window declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.window declared instates a positive duration, unit, inclusive last moment, clock, pause behaviour, and open-state test forRow.id, as the window-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's firing citation states its duty
buffer-firing-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.fires when declared in, not the running game. The citation must name the first ordinary permission event that releases Row.id and add no extra delay. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.fires when declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.fires when declared innames the first ordinary permission event that releasesRow.idand adds no extra delay- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's cancellation citation states its duty
buffer-cancellation-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.cancels when declared in, not the running game. The citation must name every event that discards Row.id before firing or state that no extra event does. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.cancels when declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.cancels when declared innames every event that discardsRow.idbefore firing or states that no extra event does- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's action citation states its duty
target-action-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.action declared in, not the running game. The action-declared-in description requires the citation to identify Row.action as the row's action-input scope and name ordinary permission and the complete attempt; for the reserved all-actions spelling, it names these for every action in the set. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.action declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.action declared inidentifies the row's action-input scope and names ordinary permission and the complete attempt; for the reserved all-actions spelling, it names these for every action in the set, as the action-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's target citation states its duty
target-moment-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.target moment declared in, not the running game. The citation must name the target moment 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
Instanceadoption and the prose atRow.target moment declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.target moment declared innames the target moment forRow.id- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's arming citation states its duty
target-arming-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.arms when declared in, not the running game. The citation must name the event that creates each Row.id target instance and every associated input event. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.arms when declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.arms when declared innames the event that creates eachRow.idtarget instance and every associated input event- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's window citation states its duty
target-window-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.window declared in, not the running game. The window-declared-in description requires the citation to state one outer window with early and late bounds of positive width, inclusive last moments, unit, clock, pause behaviour, and open-state test 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
Instanceadoption and the prose atRow.window declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.window declared instates one outer window with early and late bounds of positive width, inclusive last moments, unit, clock, pause behaviour, and open-state test forRow.id, as the window-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's result citation states its duty
target-result-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.result declared in, not the running game. The result-declared-in description requires the citation to state the result for an accepted Row.id input, every grade boundary inside the outer window, and any departure from first-accepted settlement. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.result declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.result declared instates the result for an acceptedRow.idinput, every grade boundary inside the outer window, and any departure from first-accepted settlement, as the result-declared-in description requires- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's cancellation citation states its duty
target-cancellation-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.cancels when declared in, not the running game. The citation must name every event that stops a Row.id target instance before its window closes or state that no extra event does. A missing duty is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.cancels when declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.cancels when declared innames every event that stops aRow.idtarget instance before its cited window closes or states that no extra event does- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's competition citation states its duty
competition-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.declared in, not the running game. The citation must identify the matching situation and give one total priority over every forgiven input that can be ready there. A missing input, tie, or other incomplete priority is a defect this test fails by construction. The test names the address and restates nothing from it.
- Given
the
Instanceadoption and the prose atRow.declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.declared inidentifies the matching situation and gives one total priority over every forgiven input that can be ready there- a missing input, tie, or other incomplete priority is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
input forgiveness holds for the whole run
forgiveness-holds
Applies for every adoption
Across Inputs scope, every forgiven input follows its row and cited rules; unmatched inputs receive no forgiveness; no row holds more than one press; no press is stored or fired twice; every competition follows its declaration; and rejection restores no cleared state. A case this adoption cannot construct asserts nothing.
- Holds
across every armed window, saved press, and target instance of the audited run, every forgiven input was accepted, stored, fired, submitted, or cleared exactly as its row and cited rules state; no unmatched input received forgiveness; no row held more than one press; no press was stored twice or fired twice; every competition selected as declared; no rejected proposal restored cleared forgiveness state; a case the adoption cannot construct asserts nothing
- Seeds
Inputs seeds- Scope
Inputs scope- Diagnostics
Instance-arming-logInstance-input-receiptInstance-waiting-press-stateInstance-window-instancesInstance-ready-setInstance-submission-logInstance-clearing-logInstance-target-grades