Event resolution
event-resolution-1
This contract defines the behaviour of events that land at the same moment: turn order, an initiative tie, or a chain reaction.
It decides what your turn order does when two things land at once: which goes first and how a tie breaks.
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 8 questions. Some appear only after earlier answers.
- An action cannot happen exactly as proposed. What happens by default?
- Two events of the same kind are ready together. What decides which goes first?
- A win and a loss land at the same moment. Which ending does the game record?
- Can an animation or sound delay an event, and can another event pass it?
- Two events would each remove the same target at this moment. What happens to the second one?
- An event happening now causes another event due at this moment. When does the new event resolve?
- A reaction can stop or replace an event already happening. When does it cut in?
- An event loses the source or target it needs. What happens by default?
Try the answers
Pick answers to see which rules and tests apply. Nothing is saved here: the ZIP and the authoring tool start unanswered.
An action cannot happen exactly as proposed. What happens by default?
Why this is asked
The attempt may fail, spend a resource, use time, or continue at a smaller scale. Particular cases can choose another result in their own rows.
Two events of the same kind are ready together. What decides which goes first?
Why this is asked
The event rank cannot separate two events from one class. Their order can change targets, rewards, and later chains.
A win and a loss land at the same moment. Which ending does the game record?
- Asked when
- the terminal collisions list has at least one row.
- If not asked
- No declared ending pair can produce a win and a loss at the same instant.
Why this is asked
Ending checks may arrive through different events. This answer decides the recorded result after both conditions are known.
Can an animation or sound delay an event, and can another event pass it?
- Asked when
- the presentation driven events list has at least one row.
- If not asked
- No visual or sound delays an event or changes event order.
Why this is asked
A visual delay and a rules delay are different decisions. The answer fixes whether only time changes or order changes too.
Two events would each remove the same target at this moment. What happens to the second one?
- Asked when
- the same target cases list has at least one row, or the same target exceptions list has at least one row.
- If not asked
- No two events in this adoption can each remove the same target at one instant.
Why this is asked
The second event may vanish, still count, or create another ending. Particular target kinds can choose a different result.
An event happening now causes another event due at this moment. When does the new event resolve?
- Asked when
- the caused event kinds list has at least one row.
- If not asked
- No non-interrupt event in this adoption causes another event due at the same instant.
Why this is asked
A chain can continue immediately, join the normal order, or wait for the next game moment.
A reaction can stop or replace an event already happening. When does it cut in?
- Asked when
- the interrupts list has at least one row.
- If not asked
- No event in this adoption stops or replaces another event once it has been selected to resolve, at any point including before its first effect.
Why this is asked
An interrupt needs a fixed entry point before it can stop or replace the event already in progress.
An event loses the source or target it needs. What happens by default?
- Asked when
- the orphan cases list has at least one row.
- If not asked
- No event in this adoption can lose its required source or target while waiting or resolving.
Why this is asked
A queued card effect or tactics shot may outlive a source or target. The result must not depend on which object was cleaned up first.
Numbers and rulesno numbers, 1 rule
Numbers
This contract has no numbers to set.
Rules
-
Forbidden when Within class order is No visible order, and Two events one target is Only first resolves. (a warning, not an error)
Lists11 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.
Event classes
event-classes
The event kinds ordered at one instant. Lower rank resolves first; a higher-first game inverts its numbers once in this list. Rank may repeat only when one rank-ties row declares the shared rank. An ending event's resolution records nothing.
An empty list means: An empty event-classes list is never a behavior choice: this adoption requires at least one row, and a reviewer rejects a file without it.
Each row is: id, rank, label, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable game-facing name for the event class, such as card-effects or enemy-removals. |
rank |
integer | Required | The class position, lowest first. Equal ranks are allowed only with one matching rank-ties row. |
label |
string | Required | The event class in the game's own words. A card duel might use triggered effects. |
declared-in |
reference | Required | The Fixed game rule that names the class and the events belonging to it. |
Within class rules
within-class-rules
Classes that use an order different from the general answer or must name the data that answer compares. A class using a stable number, map order, clockwise order, declared random draw, or custom game rule has a row whenever a visible tie can occur.
An empty list means: Every event class uses the general within-class answer.
Each row is: id, class-id, order, index-name, second-index-name, grid-declared-in, rule-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable name for this class-specific order. |
class-id |
string | Required | The id of the affected event class. |
order |
choice: stable-index, arrival-order, map-reading-order, clockwise, no-visible-order, declared-random, game-rule | Required | The class-specific order. A custom game rule is available here, not as the general answer. |
index-name |
string | Present when row order is Stable index or Clockwise. | For stable-index, the first named number. For clockwise, the stable number that breaks an equal angle and distance. |
second-index-name |
string | Optional | An optional stable second number that breaks an equal first number under stable-index. Omit it for every other order. |
grid-declared-in |
reference | Present when row order is Map reading order or Clockwise. | The adopted Grid and direction rule that supplies the grid's own first row and first column, or the centre, first direction, and clockwise sense. |
rule-declared-in |
reference | Present when row order is Declared random or Game rule. | For declared-random, the complete draw that produces one total order for the instant. For game-rule, one total deterministic order. The Fixed rule never points back here. |
Rank ties
rank-ties
Every rank shared by two or more event classes, with one tie-break for those classes.
An empty list means: No two event classes share a rank.
Each row is: id, rank, class-ids, tie-break, index-name, second-index-name, grid-declared-in, rule-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable name for the shared-rank group. |
rank |
integer | Required | The rank shared by the named classes. |
class-ids |
string | Required | The comma-separated ids of every event class at this rank, each listed once. |
tie-break |
choice: stable-index, arrival-order, map-reading-order, clockwise, no-visible-order, declared-random, game-rule | Required | The order used across all events of the tied classes at this rank. |
index-name |
string | Present when row tie break is Stable index or Clockwise. | The stable number compared across tied classes, or the stable number that breaks an equal clockwise position. |
second-index-name |
string | Optional | An optional stable second number that breaks an equal first number under stable-index. Omit it for every other tie-break. |
grid-declared-in |
reference | Present when row tie break is Map reading order or Clockwise. | The adopted Grid and direction rule that supplies the grid's own first row and first column, or the centre, first direction, and clockwise sense. |
rule-declared-in |
reference | Present when row tie break is Declared random or Game rule. | For declared-random, the complete draw that produces one total order for the instant. For game-rule, one total deterministic order. The Fixed rule never points back here. |
Rejection cases
rejection-cases
Named action-proposal cases that override the default answer or supply the scale or clock citation that answer requires.
An empty list means: No named case overrides the default. A reviewer rejects an empty list when a derated or clock-advancing rejection can occur, because that result requires its citation row.
Each row is: id, result, declared-in, scale-rule-declared-in, clock-rule-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | The proposal case in game language, such as blocked-movement or low-power-crafting. |
result |
choice: nothing-changes, cost-taken, clock-advances, cost-and-clock, derate | Required | The result for this case. It may repeat the default only to carry a required scale or clock citation. A case that never rejects is not a rejection case and has no row. |
declared-in |
reference | Required | The Fixed game rule identifying this rejection case and when it applies. |
scale-rule-declared-in |
reference | Present when row result is Derate. | The Fixed rule that scales the complete effect and cost. |
clock-rule-declared-in |
reference | Present when row result is Clock advances or Cost and clock. | The Fixed clock or turn rule naming exactly one advance caused by this rejection. |
Terminal collisions
terminal-collisions
Pairs of win and loss conditions that can become true in one instant.
An empty list means: A win and a loss cannot land together in this adoption.
Each row is: id, win-condition, loss-condition, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable name for this ending collision. |
win-condition |
string | Required | The winning condition in game language, such as boss defeated. |
loss-condition |
string | Required | The losing condition in game language, such as hero defeated. |
declared-in |
reference | Required | The Fixed game rules that name both ending conditions and show how they can meet. |
Same target cases
same-target-cases
Target kinds for which two events can each be enough to remove the same target at one instant.
An empty list means: No general same-target removal case is declared; any same-target-exceptions rows are the only declared collisions.
Each row is: id, target-kind, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable name for the target case. |
target-kind |
string | Required | The target kind, such as arena enemies or breakable cover. |
declared-in |
reference | Required | The Fixed game rule showing how two same-instant events can each remove this target kind. |
Same target exceptions
same-target-exceptions
Target kinds that use a result different from the general same-target answer.
An empty list means: Every declared same-target case uses the general answer.
Each row is: id, target-kind, resolution, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable name for the exception. |
target-kind |
string | Required | The non-overlapping target kind covered by this exception. |
resolution |
choice: only-first-resolves, all-resolve-one-ending, all-resolve-each-ending | Required | The result used for this target kind instead of the general answer. |
declared-in |
reference | Required | The Fixed game rule naming the target kind and its same-instant collision. |
Presentation driven events
presentation-driven-events
Events whose relation to a visual or sound is explicitly declared, including events declared never to wait.
An empty list means: No presentation timing rule is declared for an event in this adoption, so presentation does not delay an event or change event order.
Each row is: id, event-class, presentation-cue, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable name for the event and presentation case. |
event-class |
string | Required | The id of the event class whose timing is compared with presentation. |
presentation-cue |
string | Required | The visual or sound in game language, such as a card attack animation. |
declared-in |
reference | Required | The Fixed game rule relating the event's game timing to its presentation cue and showing that the cue finishes in finite game or real time. |
Caused event kinds
caused-event-kinds
Non-interrupt events that can create another event due during the instant that created it.
An empty list means: No non-interrupt event creates another event due in the same instant.
Each row is: id, event-class, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | A stable name for the chain, such as enemy-activation-to-attack. |
event-class |
string | Required | The class of the newly caused event. |
declared-in |
reference | Required | The Fixed game rule naming the cause, the new event, and the finite bound on repeated caused events. |
Interrupts
interrupts
Events created through the interrupt path that can stop or replace another event at a declared effect boundary, including the boundary before its first effect.
An empty list means: No event stops or replaces another event after resolution begins or before its first effect.
Each row is: id, active-class, interrupt-class, boundary-granularity, result, declared-in, replacement-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | The interrupt in game language, such as counter-secret or sword-parry. |
active-class |
string | Required | The event class that can be interrupted. |
interrupt-class |
string | Required | The event class that cuts in. |
boundary-granularity |
string | Required | The smallest named boundary the interrupt can use, such as before the first effect, after each hit, or at each crossed tile edge. |
result |
choice: stop-original, replace-remaining-effects | Required | Whether the interrupt ends the active event or substitutes a cited set of effects for what remains. |
declared-in |
reference | Required | The Fixed game rule naming the validity window, effect boundaries, and stop result. |
replacement-declared-in |
reference | Present when row result is Replace remaining effects. | The Fixed game rule stating every replacement effect and its order. |
Orphan cases
orphan-cases
Events that can lose a required source or target while waiting or resolving. Each row selects its result, so opposite policies share one adoption.
An empty list means: No event can lose a required source or target while waiting or resolving.
Each row is: id, event-class, missing, resolution, declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | The missing-object case in game language, such as trigger-after-source-loss. |
event-class |
string | Required | The event class that may become orphaned. |
missing |
choice: source, target, source-or-target | Required | Which required game object may become unavailable while the event waits or resolves. |
resolution |
choice: default, resolves-what-remains, is-cancelled | Required | Use the adoption's default orphan answer, or choose the result for this case. |
declared-in |
reference | Required | The Fixed game rule identifying this orphan case, when it applies, the captured payload, and the source or target requirement. |
For builders
Exact mechanism wording and 83 pack tests
Exact mechanism wording
This is the single normative authority for how a proposed action becomes a resolved event, how waiting events are ordered, where ties break, where an interrupt enters, and what happens to an orphan. Questions and rows supply choices and game rules; they do not define another sequence.
An instant is one moment the game treats as simultaneous. A proposal is an action requested by an actor. A waiting event has been accepted for an instant but has not begun resolving. An active event is currently applying its ordered effects. An effect boundary is a point named by a game rule at which an interrupt may enter; one exists before the event's first effect. An orphan is an event whose required source or target is no longer available. An ending event represents a possible match outcome, but its resolution records nothing. Step 15 is the sole outcome-recording step and reads final settled state: a single ending records there through the game's own cited rule, and a declared collision records through terminal-precedence.
A move through three tiles can be modelled as one effect per crossed tile edge. An overwatch shot can then name the edge where it enters. Each interrupt row carries that boundary granularity instead of leaving the decomposition implicit.
Turn-based games ask three of these in turn words: a tie on initiative is the same-instant question, a skipped turn is a rejected action, and a turn boundary is an instant like any other.
### Propose and admit
1. Read the proposed action against its Fixed game rules. A matching rejection-cases row supplies its result; otherwise apply the default rejected-action-effect once. nothing-changes, cost-taken, clock-advances, and cost-and-clock end the proposal without creating an event. derate accepts a scaled action and continues. not-applicable admits every proposal in this family. Repeating nothing-changes from the same state produces the same result because the first rejection left nothing behind. For every answer, the same proposal rejected from an identical pre-attempt state produces the same result. This idempotence is an obligation of the adoption, not a description of every observed game. 2. For an accepted action, commit its ordinary cost at the point named by its game rule. Create its event payload once. The payload captures every value that must survive later source loss; uncaptured state is read only when an effect resolves. 3. Assign every event to its declared class and due instant. Events already due when the instant opens enter its waiting set. An event created after the instant opens has one of two admission paths. A valid interrupts row creates an interrupt event; the interrupt entry answer governs it. Every other newly created event follows caused-events. The caused-event rows and their otherwise sentence exclude declared interrupts.
### Order the waiting set
4. Select the lowest rank among eligible waiting events. If several classes share that rank, the matching rank-ties row produces one total order over all events in those tied classes. A no-visible-order tie may use any order only because the result cannot expose it. 5. Within each class's remaining events at the selected rank, apply that class's within-class-rules row or the general within-class-order answer, and select the first event without changing its payload. Container order in the adoption file never selects an event. Where a rank-ties row produced one total order over the tied classes' events in step 4, that order already fixes each tied class's internal sequence; a tied class under such an order carries no within-class-rules row, and a reviewer rejects one as inert. 6. Apply presentation waiting to the selected event. presentation-timing.otherwise admits it immediately. Under may-delay, an unfinished cue holds that event and every event behind it in the order from steps 4–5. Under may-delay-and-reorder, temporarily skip only the named event and return to step 4; later eligible events may pass it. Under never, presentation does not hold it. A held event becomes eligible again when its cited cue finishes. The instant waits and cannot close while any presentation-held event remains. Carrying it to a later instant would invent a new game-time rule, so this branch waits instead. 7. Form any same-target collision group containing the selected event. Under only-first-resolves, only the first event keeps the target. Under all-resolve-one-ending, removal waits until the complete group resolves. Under all-resolve-each-ending, every event keeps its own removal consequence. A matching exception row replaces the general answer.
### Check the event and resolve it
8. Settle the same-target decision before the general orphan check. Later events suppressed by only-first-resolves apply nothing to that target. The other two answers keep the target available to every member of the collision group. A removal inside that group never turns another member into an orphan. Until an all-resolve-one-ending group ends, its target is live for non-member rules too; a non-member resolving before deferred removal therefore reads a live target. 9. Check the selected event's required source and target after its collision group is known, before its first effect, and again at every effect boundary. The matching orphan-cases row selects its own result or the adoption's default orphaned-events answer. resolves-what-remains skips only effects that require the missing object. is-cancelled removes a waiting event or discards an active event's remaining effects. This continuous gate covers a unit killed midway through a cast. A missing object outside the declared cases is an invalid adoption, not an implied result. 10. Make the selected event active and visit the boundary before its first effect. If it continues, apply effects in the order stated by its Fixed game rule. After each effect, commit that effect before reaching the next declared boundary. An ending event follows the same ordering and boundary rules, but its resolution records nothing. 11. At each boundary, discover every valid interrupt and create it through the interrupt path in step 3. When several are valid, select lowest rank first, apply the shared-rank event order when needed, then the selected class's within-class order. Under before-next-effect, the selected interrupt enters before the next effect, including before the first. Under after-current-effect, the just-finished effect remains committed. Under at-normal-rank, place it by the same current-or-next-instant rule as waits-for-its-place, then return to step 4. The active event advances only to boundaries its interrupt row permits while that interrupt waits. 12. An interrupt entering at the current boundary keeps presentation waiting, same-target collision grouping, continuous orphan checks, and its own boundaries: it passes through steps 6–11 before its result changes the interrupted event. stop-original discards every remaining original effect. replace-remaining-effects discards them and installs the complete cited replacement. Already committed effects and costs remain. The cited interrupt rule supplies a finite chain bound, and only one selected interrupt resolves at a time. A presentation skip of an interrupt returns to the interrupted event's boundary, not to step 4. 13. When an effect causes another event due now, apply caused-events. resolves-now resolves it at the current boundary before the active event continues. waits-for-its-place adds it to the current waiting set when its declared class is current or has not passed, otherwise to the next instant. next-instant always adds it to the next instant. Every route creates the caused event once and obeys the row's finite chain bound. The standard end-of-instant-sink model gives caused work one last class and drains that class to closure. 14. Finish the active event. Apply any deferred target removal required by its same-target group, record each selected consequence once, and remove the event from the waiting set. Return to step 4. If only presentation-held events remain, wait for a cited cue; a may-delay-and-reorder skip ends as soon as that event's cue finishes. Continue until the waiting set is empty.
### Settle the instant
15. After the waiting set is empty, the game's own cited ending rules record any single ending that holds in the final settled state; this contract does not re-derive them. Then read each terminal-collisions row's win-condition and loss-condition from that state. When both hold, record only the loss, only the win, or both according to terminal-precedence, overriding the single-ending recording for that pair. This is the only step at which a match outcome is recorded; class rank and ending-event resolution never override it. 16. Commit the instant's final state and the next-instant waiting set together. No event from the closed instant may later re-enter it. A presentation-held event never faces that rule, because step 14 forbids closure while it remains held. Presentation may continue after commitment only when its cited rule cannot change gameplay state or order.
Every settlement report carries the instant, event id, class, rank, tie-break when used, within-class order, source and target availability, effects applied, interrupt and replacement when present, caused-event destination, removal result, and terminal result when present.
Verification pack
sha256:571ce2328736c902d7f553fe4b00b2a762faf451393fbf8760e9f67a3fa39f1c
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.
83 pack tests
Placeholders are filled from the adoption's answers, values, rows, and verification inputs.
an instant is one simultaneous moment
instant-and-turn-boundary
Applies for every adoption
An instant is one moment the game treats as simultaneous. A turn boundary the adoption can construct is an instant like any other; where there is no turn boundary, that clause asserts nothing.
- Given
events at one moment
Instancetreats as simultaneous, including a turn boundary where the adoption has one- When
- the moment is resolved
- Then
- all events belong to one instant and follow one lifecycle
- a constructed turn boundary is handled as an instant like any other; where no turn boundary exists, that clause asserts nothing
- Diagnostics
Instance-instant-trace
waiting and active events are distinguishable
waiting-active-and-first-boundary
Applies for every adoption
A waiting event is accepted but has not begun. An active event is applying ordered effects. Every active event visits an effect boundary before its first effect.
- Given
an accepted event before and during resolution
- When
- the event enters the waiting set and is selected
- Then
- before selection it is recorded as a waiting event that has not begun
- during ordered effect application it is recorded as the active event
- the active event visits an effect boundary before its first effect
- Diagnostics
Instance-waiting-setInstance-event-trace
ending events record no outcome while resolving
ending-event-records-nothing
Applies for every adoption
Each ending event the adoption can construct follows the ordinary event lifecycle but records no outcome when it resolves. Only step 15 records an outcome, after the waiting set is empty. Where none exists, this test asserts nothing.
- Given
each ending event the adoption can construct whose effects make an ending condition hold
- When
- the ending event resolves and the instant later reaches settlement
- Then
- resolving the ending event records no match outcome
- an outcome is recorded only after the waiting set is empty at step 15
- the ending record distinguishes event resolution from outcome recording
- where no ending event exists, this test asserts nothing
- Diagnostics
Instance-event-traceInstance-ending-record
container order never decides event resolution
file-order-never-decides-resolution
Applies for every adoption
Changing container order or document order without changing declarations never changes event resolution. Rank, a rank tie, and within-class order decide the sequence; document order never does. Step 5 says container order in the adoption file never selects an event.
- Given
two equivalent
Instanceadoption documents whose container order or document order differs, with the same recorded random inputs where a declared random order is used- When
- the same instant is resolved from the same pre-instant state under each document
- Then
- the two runs select and resolve the same events in the same declared order
- no event order is taken from container order or document order
- Diagnostics
Instance-order-traceInstance-settlement-report
Row.id rejects with nothing-changes
rejection-case-nothing-changes
Applies when row result is Nothing changes.
Row.id overrides or repeats the default with nothing-changes: it creates no event, changes no game state, spends no cost, and advances no clock because of the rejection. Row.declared in identifies the case; the test names the address and restates nothing from it.
- Given
a proposal that meets the rejection case at
Row.declared in- When
- the proposal is checked from a recorded pre-attempt state
- Then
- the proposal ends without creating an event
- no game state changes, no cost is spent, and no clock advances because of the rejection
- the proposal log distinguishes this rejection from an accepted action that later produces no effect
- Diagnostics
Instance-proposal-logInstance-state-before-after
Row.id rejects with cost-taken
rejection-case-cost-taken
Applies when row result is Cost taken.
Row.id rejects and applies the complete declared cost once, creates no event, produces no action effect, and advances no clock because of the rejection. Row.declared in identifies the case; the test names the address and restates nothing from it.
- Given
a proposal that meets the rejection case at
Row.declared inwith a distinguishable complete declared cost- When
- the proposal is checked
- Then
- the proposal ends without creating an event
- the complete declared cost is applied once, no action effect is produced, and no clock advances because of the rejection
- the proposal log distinguishes rejection with cost from acceptance followed by failure
- Diagnostics
Instance-proposal-logInstance-cost-log
Row.id rejects and advances its cited clock
rejection-case-clock-advances
Applies when row result is Clock advances.
Row.id rejects, spends no cost, produces no action effect, and advances once the clock selected by Row.clock rule declared in. The test demands that observable consequence, names the address, and restates nothing from it or Row.declared in.
- Given
a proposal that meets the rejection case at
Row.declared inand a distinguishable clock state governed atRow.clock rule declared in- When
- the proposal is checked
- Then
- the proposal ends without creating an event
- the clock selected by
Row.clock rule declared inadvances once, no cost is applied, and no action effect is produced - the proposal log distinguishes this rejection-driven advance from independently advancing time
- Diagnostics
Instance-proposal-logInstance-clock-trace
Row.id rejects with its cost and cited clock advance
rejection-case-cost-and-clock
Applies when row result is Cost and clock.
Row.id rejects, applies the complete declared cost once, advances once the clock selected by Row.clock rule declared in, and produces no action effect. The test names both addresses and restates nothing from them.
- Given
a proposal that meets the rejection case at
Row.declared in, its complete declared cost, and a distinguishable clock state governed atRow.clock rule declared in- When
- the proposal is checked
- Then
- the proposal ends without creating an event
- the complete declared cost is applied once and the clock selected by
Row.clock rule declared inadvances once - no action effect is produced and the proposal log distinguishes rejection from acceptance
- Diagnostics
Instance-proposal-logInstance-cost-logInstance-clock-trace
Row.id accepts a scaled action
rejection-case-derates-and-enters-lifecycle
Applies when row result is Derate.
Row.id accepts a scaled action rather than rejecting it. Row.scale rule declared in supplies the scale; the accepted action creates one payload once and continues through the event lifecycle. The test names both addresses and restates nothing from them.
- Given
a proposal that meets the case at
Row.declared inand can be scaled byRow.scale rule declared in- When
- the proposal is checked and the accepted event settles
- Then
- the scale rule at
Row.scale rule declared inproduces the action's complete scaled effect and cost - the proposal is recorded as accepted rather than rejected, creates one payload once, and continues through the event lifecycle
- the proposal log distinguishes the accepted scaled action from a rejected action
- the scale rule at
- Diagnostics
Instance-proposal-logInstance-event-traceInstance-cost-log
the rejected-action default governs cases without rows
rejection-default-applies-without-row
Applies when Rejected action effect is Nothing changes or Cost taken or Not applicable.
Bind text
- Given
Bind given- When
- the proposal is checked
- Then
Bind result
- Diagnostics
Instance-proposal-logInstance-cost-logInstance-clock-trace
a rejected proposal is repeatable from identical state
rejection-is-repeatable-from-identical-state
Applies for every adoption
The same proposal rejected from an identical pre-attempt state produces the same result. The comparison resets the whole pre-attempt state; it does not repeat from state changed by an earlier attempt.
- Given
two executions of each rejecting proposal the adoption can construct from identical recorded pre-attempt states
- When
- the proposal is checked in each execution
- Then
- both executions produce the same rejection result and the same recorded cost and clock consequence
- the comparison starts from identical pre-attempt state rather than the state left by the first execution
- where no rejecting proposal exists, this test asserts nothing
- Diagnostics
Instance-proposal-logInstance-state-before-after
an accepted proposal commits once and creates one event
accepted-proposal-creates-one-event
Applies for every adoption
An accepted proposal creates one payload once and enters its declared event class at its due instant. Where it has an ordinary cost, that cost commits once at the point its rule names; otherwise the cost clause asserts nothing. The payload captures every value that must survive later source loss; where no such loss can occur, that observation asserts nothing.
- Given
a valid proposal with distinguishable payload values, event class, due instant, and an ordinary cost where its Fixed rule declares one
- When
- the proposal is accepted and its event is admitted
- where the adoption can construct later source loss, the source becomes unavailable before a captured value is used
- Then
- where an ordinary cost is declared, it is committed once at the point its Fixed game rule names; otherwise the cost clause asserts nothing
- one event payload is created once and enters its declared event class at its due instant
- the payload contains every value required to survive later source loss, while uncaptured state is read only when an effect resolves
- where later source loss cannot be constructed, the payload-survival observation asserts nothing
- Diagnostics
Instance-proposal-logInstance-cost-logInstance-waiting-setInstance-event-trace
a new event uses the interrupt path or caused-event path
new-event-uses-one-admission-path
Applies for every adoption
After an instant opens, a valid declared interrupt enters only through the interrupt path. Every other newly created event due now follows caused-events. An unavailable branch asserts nothing, and no event uses both paths.
- Given
events created after an instant opens, including valid declared interrupts and other new events where the adoption can construct them
- When
- each new event is admitted
- Then
- an event backed by a valid interrupts row enters only through the interrupt path and is governed by interrupt-entry
- every other new event due now follows caused-events
- a branch the adoption cannot construct asserts nothing and no event uses both paths
- Diagnostics
Instance-proposal-logInstance-interrupt-reportInstance-caused-event-report
the lowest eligible rank resolves first
lowest-eligible-rank-resolves-first
Applies for every adoption
At every selection, the lowest eligible rank resolves first without changing the selected event's payload. Where no instant has two eligible ranks, the comparison asserts nothing. Step 4 selects the lowest eligible rank; step 5 selects within the class without changing the payload.
- Given
each instant the adoption can construct with eligible waiting events from at least two declared ranks
- When
- the next waiting event is selected repeatedly
- Then
- each selection comes from the lowest rank that is eligible at that selection
- selection does not change the selected event's payload
- where no instant has two eligible ranks, the comparison asserts nothing
- Diagnostics
Instance-waiting-setInstance-order-trace
Row.id at rank Row.rank never passes a lower rank
event-class-never-passes-lower-rank
Applies for every adoption
An event of Row.id at rank Row.rank never resolves before an eligible lower-rank event in the same instant. Where the adoption cannot construct that pairing, the test asserts nothing.
- Given
an eligible
Row.idevent and an eligible event of a lower declared rank in the same instant- When
- the waiting set is selected
- Then
- the lower-rank event is selected before the
Row.idevent - where no lower-rank event is eligible with
Row.id, this test asserts nothing
- the lower-rank event is selected before the
- Diagnostics
Instance-waiting-setInstance-order-trace
Row.class id uses stable index order
within-class-stable-index
Applies when row order is Stable index.
Within Row.class id, lower Row.index name resolves first. Where the row names a second index, equal first numbers resolve by it; otherwise equal first numbers cannot arise or cannot change the result.
- Given
two eligible
Row.class idevents with differentRow.index namevalues, plus equal first values where the row names a second index and the adoption can construct them- When
- their within-class order is selected
- Then
- the event with the lower
Row.index nameresolves first - where the row names a second index, equal first numbers resolve by the lower second number; otherwise equal first numbers cannot arise or cannot change the result
- the order trace distinguishes selection by stable index from selection by rank or container order
- the event with the lower
- Diagnostics
Instance-order-trace
Row.class id uses stable arrival order
within-class-arrival-order
Applies when row order is Arrival order.
Within Row.class id, earlier admission resolves first, and admission order remains stable for the complete instant.
- Given
two eligible
Row.class idevents admitted at distinguishable times in one instant- When
- their within-class order is selected more than once during the instant
- Then
- the earlier admitted event resolves first
- admission order remains stable for the complete instant and never changes with container order
- Diagnostics
Instance-proposal-logInstance-order-trace
Row.class id follows its cited map reading order
within-class-map-reading-order
Applies when row order is Map reading order.
Within Row.class id, the grid at Row.grid declared in supplies its own first row and first column. The first row resolves first, then the first column. The test names the address and restates nothing from it.
- Given
eligible
Row.class idevents in different rows and columns of the grid cited atRow.grid declared in- When
- their within-class order is selected
- Then
- the event in the grid's own first row resolves first and, within one row, the event in its own first column resolves first
- the order trace attributes the result to map reading order rather than container order
- Diagnostics
Instance-order-trace
Row.class id follows its cited clockwise order
within-class-clockwise-order
Applies when row order is Clockwise.
Within Row.class id, the grid at Row.grid declared in supplies the centre, first direction, and clockwise sense. Clockwise angle orders the events, and lower Row.index name breaks equal angle and distance. The test names the address and restates nothing from it.
- Given
eligible
Row.class idevents around the centre and first direction of the grid atRow.grid declared in, including equal angle and distance- When
- their within-class order is selected
- Then
- events resolve by clockwise angle from the grid's centre and first direction
- equal angle and distance resolve by lower
Row.index name - the order trace attributes the result to clockwise order and its stable-index tie-break
- Diagnostics
Instance-order-trace
Row.class id exposes no within-class order
within-class-no-visible-order
Applies when row order is No visible order.
Row.class id exposes no within-class order: no event observes another of that class, and every permitted order yields the same game state and player-facing result. If two cannot be ready together, the comparison asserts nothing.
- Given
every permitted execution order of eligible
Row.class idevents from the same pre-instant state- When
- the instant settles under each permitted order
- Then
- no
Row.class idevent observes another event of that class during the instant - every permitted order produces the same game state and player-facing result
- where two such events cannot be ready together, the comparison asserts nothing
- no
- Diagnostics
Instance-order-traceInstance-settlement-report
Row.class id uses its cited random order
within-class-declared-random-order
Applies when row order is Declared random.
Within Row.class id, the random rule at Row.rule declared in produces one total order for the instant; container order never decides it. The test demands the produced order and restates nothing from the cited rule.
- Given
eligible
Row.class idevents and recorded random inputs for the rule atRow.rule declared in- When
- the rule produces their within-class order
- Then
- one total order is produced for the instant and the events resolve in it
- container order never selects or changes the result
- the order trace records the cited rule and the order it produced
- Diagnostics
Instance-order-traceInstance-random-record
Row.class id uses its cited game rule order
within-class-game-rule-order
Applies when row order is Game rule.
Within Row.class id, Row.rule declared in produces one total deterministic order; container order never decides it. The test demands the produced order and restates nothing from the cited rule.
- Given
eligible
Row.class idevents whose order is governed atRow.rule declared in- When
- their within-class order is selected
- Then
- the cited rule produces one total deterministic order and the events resolve in it
- container order never selects or changes the result
- the order trace records the cited rule and produced order
- Diagnostics
Instance-order-trace
Row.id orders its tied classes by stable index
rank-tie-stable-index
Applies when row tie break is Stable index.
At rank Row.rank, Row.id produces one total order over Row.class ids with lower Row.index name first. Where the row names a second index, equal first numbers resolve by it; otherwise equal first numbers cannot arise or cannot change the result.
- Given
eligible events of the classes listed by
Row.class idsat shared rankRow.rankwith differentRow.index namevalues, plus equal first values where the row names a second index- When
- the shared-rank order is selected
- Then
- one total order over all events of all listed classes is produced with lower
Row.index namefirst - where the row names a second index, equal first numbers resolve by the lower second number; otherwise equal first numbers cannot arise or cannot change the result
- the order trace distinguishes the rank tie from ordinary within-class selection
- one total order over all events of all listed classes is produced with lower
- Diagnostics
Instance-order-trace
Row.id orders its tied classes by stable arrival
rank-tie-arrival-order
Applies when row tie break is Arrival order.
At rank Row.rank, Row.id produces one total order over Row.class ids with earlier admission first, and admission order stays stable for the instant.
- Given
events of the classes listed by
Row.class idsadmitted at distinguishable times at shared rankRow.rank- When
- the shared-rank order is selected
- Then
- one total order over all events of all listed classes is produced with earlier admission first
- admission order remains stable for the complete instant
- Diagnostics
Instance-proposal-logInstance-order-trace
Row.id follows its cited map reading order
rank-tie-map-reading-order
Applies when row tie break is Map reading order.
For Row.id, the grid at Row.grid declared in supplies its own first row and first column and produces one total order over Row.class ids. The test names the address and restates nothing from it.
- Given
eligible events of
Row.class idsin different rows and columns of the grid atRow.grid declared in- When
- the shared-rank order is selected
- Then
- one total order over all events of all listed classes follows the grid's own first row and then its own first column
- the order trace distinguishes the rank tie from container order
- Diagnostics
Instance-order-trace
Row.id follows its cited clockwise order
rank-tie-clockwise-order
Applies when row tie break is Clockwise.
For Row.id, Row.grid declared in supplies the centre, first direction, and clockwise sense for one total order over Row.class ids; lower Row.index name breaks equal angle and distance. The test names the address and restates nothing from it.
- Given
eligible events of
Row.class idsaround the centre and first direction ofRow.grid declared in, including equal angle and distance- When
- the shared-rank order is selected
- Then
- one total order over all events of all listed classes follows clockwise angle from the grid's centre and first direction
- equal angle and distance resolve by lower
Row.index name
- Diagnostics
Instance-order-trace
Row.id exposes no shared-rank order
rank-tie-no-visible-order
Applies when row tie break is No visible order.
For Row.id, any total order over Row.class ids is permitted only because no tied event observes another and every permitted order yields the same state and player-facing result. An unavailable pairing asserts nothing.
- Given
every permitted total order of eligible events from
Row.class idsat rankRow.rank- When
- the instant settles under each permitted order
- Then
- no event in the tied classes observes another tied event during the instant
- every permitted total order produces the same game state and player-facing result
- where events from two listed classes cannot be ready together, that comparison asserts nothing
- Diagnostics
Instance-order-traceInstance-settlement-report
Row.id uses its cited random order
rank-tie-declared-random-order
Applies when row tie break is Declared random.
For Row.id, the random rule at Row.rule declared in produces one total order over Row.class ids; container order never decides it. The test demands the produced order and restates nothing from the cited rule.
- Given
eligible events of
Row.class idsand recorded random inputs forRow.rule declared in- When
- the shared-rank order is selected
- Then
- the cited rule produces one total order over all listed classes for the instant and the events resolve in it
- container order never selects or changes the result
- Diagnostics
Instance-order-traceInstance-random-record
Row.id uses its cited game rule order
rank-tie-game-rule-order
Applies when row tie break is Game rule.
For Row.id, Row.rule declared in produces one total deterministic order over Row.class ids; container order never decides it. The test demands the produced order and restates nothing from the cited rule.
- Given
eligible events of
Row.class idsgoverned atRow.rule declared in- When
- the shared-rank order is selected
- Then
- the cited rule produces one total deterministic order over all listed classes and the events resolve in it
- container order never selects or changes the result
- Diagnostics
Instance-order-trace
the general within-class answer covers classes without another order
general-within-class-order
Applies when Within class order is Stable index or Arrival order or Map reading order or Clockwise or No visible order or Declared random.
For every class without a class row and without a shared rank, Bind order. Where no such class or pair exists, this test asserts nothing.
- Given
each event class with no within-class-rules row and no shared rank
- When
- two events of that class are ready together where the adoption can construct them
- Then
Bind order- where no such class or pair exists, this test asserts nothing
- Diagnostics
Instance-order-traceInstance-settlement-report
Row.event class never waits for Row.presentation cue
presentation-never-holds-event
Applies when Presentation timing is Never.
Row.event class events never wait for Row.presentation cue. Row.declared in names the cue rule; the test names the address and restates nothing from it.
- Given
a selected
Row.event classevent whileRow.presentation cueis unfinished- When
- presentation waiting is checked
- Then
- the event is admitted immediately and never waits for the cue
- the instant's order and game timing are unchanged by that cue
- Diagnostics
Instance-order-traceInstance-presentation-trace
Row.event class waits for Row.presentation cue without reordering
presentation-delay-holds-following-events
Applies when Presentation timing is May delay.
An unfinished Row.presentation cue holds Row.event class and every event behind it until the cue finishes; none passes it, and the instant cannot close. Row.declared in names the cue rule; the test names the address and restates nothing from it.
- Given
a selected
Row.event classevent with unfinishedRow.presentation cueand a later eligible event- When
- the cue remains unfinished and then finishes under
Row.declared in
- the cue remains unfinished and then finishes under
- Then
- the selected event and every event behind it remain held until the cue finishes
- no later event passes it, and the held event then resumes with its original payload
- the instant remains open while the event is held
- Diagnostics
Instance-waiting-setInstance-presentation-traceInstance-order-trace
Row.event class may be passed while Row.presentation cue is unfinished
presentation-delay-skips-only-held-event
Applies when Presentation timing is May delay and reorder.
While Row.presentation cue is unfinished, only the selected Row.event class event is skipped; later eligible events pass it, its original payload remains, and the instant cannot close. Row.declared in names the cue rule; the test names the address and restates nothing from it.
- Given
a selected
Row.event classevent with unfinishedRow.presentation cueand a later eligible event- When
- presentation waiting skips the selected event and the cue later finishes under
Row.declared in
- presentation waiting skips the selected event and the cue later finishes under
- Then
- only the held event is skipped and selection returns to the waiting set
- the later eligible event resolves before it, while the held event keeps its original payload
- the held event becomes eligible when the cue finishes and the instant remains open until it resolves
- Diagnostics
Instance-waiting-setInstance-presentation-traceInstance-order-trace
events with no presentation row wait for no cue of their own
unnamed-event-has-no-presentation-wait
Applies for every adoption
A selected event named by no presentation-driven-events row never waits for a cue of its own; where the adoption answers may-delay and it stands behind a held event, it waits with that event; otherwise it is admitted at once. Where every selected class has a row, this test asserts nothing. This follows the presentation-timing option semantics and step 6.
- Given
each selected event class not named by a presentation-driven-events row
- When
- presentation waiting is checked
- Then
- the event never waits for a cue of its own; where the adoption answers may-delay and it stands behind a held event, it waits with that event; otherwise it is admitted at once
- where every selected class is named by a presentation row, this test asserts nothing
- Diagnostics
Instance-presentation-traceInstance-order-trace
declaration check: terminal-collision rows cover every ending pair
terminal-collision-rows-cover-ending-pairs
Applies for every adoption
This declaration check reads the adoption and its Fixed ending rules, not the running game. A terminal-collisions row must exist for every win-and-loss pair that can meet at one instant; the collection's when-empty sentence supplies the empty direction. A constructible pair with no row is a defect this test fails by construction; where no pair can meet, the check asserts nothing.
- Given
the
Instanceadoption and the ending pairs its Fixed rules can construct, not the running game- When
- a reviewer compares every pair with terminal-collisions
- Then
- a terminal-collisions row exists for every pair that can produce a win and a loss at the same instant
- the terminal-collisions when-empty sentence supplies the empty direction
- a constructible pair with no row is a defect this test fails by construction; where no pair can meet, this check asserts nothing
- Diagnostics
Instance-declaration-recordInstance-ending-record
declaration check: same-target rows cover every removal collision
same-target-rows-cover-removal-collisions
Applies for every adoption
This declaration check reads the adoption and its Fixed removal rules, not the running game. A same-target-cases or same-target-exceptions row must exist for every target kind with a same-instant removal collision; the row sets' when-empty sentences supply the empty direction. A constructible target kind with no row is a defect this test fails by construction; where none can occur, the check asserts nothing. This says nothing about a shared target with no removal.
- Given
the
Instanceadoption and the target-removal cases its Fixed rules can construct, not the running game- When
- a reviewer compares every target kind with same-target-cases and same-target-exceptions
- Then
- a same-target-cases or same-target-exceptions row exists for every target kind for which two events can each remove one target at one instant
- the two row sets' when-empty sentences supply the empty direction
- a constructible target kind with no row is a defect this test fails by construction; where no such collision can occur, this check asserts nothing
- Diagnostics
Instance-declaration-recordInstance-collision-report
declaration check: caused-event rows cover every due-now cause
caused-event-rows-cover-due-now-causes
Applies for every adoption
This declaration check reads the adoption and its Fixed cause rules, not the running game. A caused-event-kinds row must exist for every non-interrupt event caused due in the same instant; the collection's when-empty sentence supplies the empty direction. A constructible due-now caused event with no row is a defect this test fails by construction; where none exists, the check asserts nothing.
- Given
the
Instanceadoption and the non-interrupt event causes its Fixed rules can construct, not the running game- When
- a reviewer compares every newly caused due-now kind with caused-event-kinds
- Then
- a caused-event-kinds row exists for every non-interrupt event caused due in the same instant
- the caused-event-kinds when-empty sentence supplies the empty direction
- a constructible due-now caused event with no row is a defect this test fails by construction; where no such event exists, this check asserts nothing
- Diagnostics
Instance-declaration-recordInstance-caused-event-report
declaration check: interrupt rows cover every stop and replacement
interrupt-rows-cover-stops-and-replacements
Applies for every adoption
This declaration check reads the adoption and its Fixed interaction rules, not the running game. An interrupts row must exist for every event that stops or replaces another after selection, including before its first effect; the collection's when-empty sentence supplies the empty direction. A constructible stopping or replacement interaction with no row is a defect this test fails by construction; where none exists, the check asserts nothing.
- Given
the
Instanceadoption and the event interactions its Fixed rules can construct after resolution starts, not the running game- When
- a reviewer compares every stopping or replacement interaction with interrupts
- Then
- an interrupts row exists for every event that stops or replaces another after selection, including before its first effect
- the interrupts when-empty sentence supplies the empty direction
- a constructible stopping or replacement interaction with no row is a defect this test fails by construction; where no such interaction exists, this check asserts nothing
- Diagnostics
Instance-declaration-recordInstance-interrupt-report
Row.target kind uses the general collision result
same-target-general-resolution
Applies when Two events one target is Only first resolves or All resolve one ending or All resolve each ending.
For Row.target kind, Bind result. Row.declared in identifies the collision case; the test names the address and restates nothing from it.
- Given
two events in one instant that can each remove one
Row.target kindunderRow.declared in- When
- their collision group resolves
- Then
Bind result- the collision report distinguishes this result from an orphan result or an ordinary event with no effect
- Diagnostics
Instance-collision-reportInstance-event-trace
Row.target kind uses its collision exception
same-target-exception-resolution
Applies when row resolution is Only first resolves or All resolve one ending or All resolve each ending.
Row.target kind is an exception: Bind result. The row replaces the general answer only for this target kind. Row.declared in identifies the collision; the test names the address and restates nothing from it.
- Given
two events in one instant that can each remove one
Row.target kindunderRow.declared in- When
- their collision group resolves
- Then
Bind result- this row replaces the general answer only for
Row.target kind - the collision report distinguishes this result from an orphan result
- Diagnostics
Instance-collision-reportInstance-event-trace
same-target grouping precedes the orphan check
collision-precedes-orphan-check
Applies for every adoption
For each same-target collision group the adoption can construct, grouping settles before the orphan check and removal inside it never orphans another member. Under all-resolve-one-ending, the target stays live for members and for a non-member that resolves before the group ends. An unavailable case asserts nothing.
- Given
each same-target collision group the adoption can construct, plus each non-member event that can resolve before deferred removal
- When
- the group is settled and source and target availability are checked
- Then
- the same-target decision is settled before the general orphan check
- removal inside the group never turns another group member into an orphan
- under all-resolve-one-ending, the target remains live for group members and any non-member that resolves before the group ends
- where no such group or non-member exists, the corresponding clause asserts nothing
- Diagnostics
Instance-collision-reportInstance-orphan-reportInstance-event-trace
Row.id resolves what remains
orphan-override-resolves-what-remains
Applies when row resolution is Resolves what remains.
For Row.id, a missing Bind object leaves the captured payload in place. Only effects needing that object are skipped; every independent effect resolves. Row.declared in identifies the case; the test names the address and restates nothing from it.
- Given
a waiting and then active
Row.event classevent whose requiredBind objectbecomes unavailable underRow.declared in- When
- availability is checked before the first effect and at every later effect boundary
- Then
- the event keeps its captured payload and skips only effects requiring the missing object
- every independent remaining effect resolves in declared order
- the orphan report distinguishes this route from cancellation and from an event that independently had no applicable effect
- Diagnostics
Instance-orphan-reportInstance-event-trace
Row.id is cancelled
orphan-override-is-cancelled
Applies when row resolution is Is cancelled.
For Row.id, losing the required Bind object removes a waiting event or discards an active event's remaining effects. Committed costs and effects remain. Row.declared in identifies the case; the test names the address and restates nothing from it.
- Given
waiting and active
Row.event classevents whose requiredBind objectbecomes unavailable underRow.declared in- When
- availability is checked before the first effect and at every later effect boundary
- Then
- a waiting event is removed and an active event discards every remaining effect
- no committed cost or effect is restored
- the orphan report distinguishes cancellation from resolving what remains and from an event that independently produced no effect
- Diagnostics
Instance-orphan-reportInstance-event-traceInstance-cost-log
Row.id uses the orphan default
orphan-default-row
Applies when Orphaned events is Resolves what remains or Is cancelled and row resolution is Default.
Row.id selects the adoption default for a missing Bind object: the event Bind result. Row.declared in identifies the case; the test names the address and restates nothing from it.
- Given
a waiting and then active
Row.event classevent whose requiredBind objectbecomes unavailable underRow.declared in- When
- availability is checked before the first effect and at every later effect boundary
- Then
- the event
Bind result - the orphan report identifies use of the adoption default and distinguishes its observable result from the other route
- the event
- Diagnostics
Instance-orphan-reportInstance-event-traceInstance-cost-log
declaration check: an undeclared missing object has no implied result
undeclared-orphan-is-invalid
Applies for every adoption
This declaration check reads the adoption, not the running game. Every event that can lose a required source or target has an orphan-cases row. Outside those rows, missing-object behavior is invalid rather than implied and is a defect this test fails by construction. Where no event can become an orphan, this test asserts nothing.
- Given
each event that can lose a required source or target while waiting or resolving
- When
- a reviewer compares that case with orphan-cases before the build is audited
- Then
- every such case has a matching orphan-cases row
- a missing object outside those rows is an invalid adoption and receives no implied cancellation or remaining-effects result
- an undeclared case is a defect this test fails by construction; where no event can lose a required object, this test asserts nothing
- Diagnostics
Instance-orphan-reportInstance-declaration-record
an active event commits each effect before the next boundary
active-event-commits-effects-in-order
Applies for every adoption
An active event visits the boundary before its first effect, applies effects in its Fixed rule's order, and commits each effect before the next boundary. If no multi-effect event exists, the between-effects observation asserts nothing.
- Given
an eligible event with two or more ordered effects where the adoption can construct one
- When
- the event becomes active and applies its effects
- Then
- the event visits the boundary before its first effect
- effects are applied in the order stated by the event's Fixed game rule
- each effect commits before the next declared boundary is visited
- where no multi-effect event exists, the between-effects observation asserts nothing
- Diagnostics
Instance-event-traceInstance-interrupt-report
Row.id enters and stops the original event
interrupt-stops-original
Applies when Interrupt entry is Before next effect or After current effect or At normal rank and row result is Stop original.
For an active Row.active class event whose Row.boundary granularity boundaries are named at Row.declared in, Row.id creates one valid Row.interrupt class interrupt offered at a named boundary and Bind entry. Where the interrupt enters at a boundary of the active event, event order selects one valid interrupt, the active event advances only to permitted boundaries while it waits, and the interrupt passes through steps 6 to 11 before changing that event; where it joins the next instant instead, the active event runs to completion in this one. Then Bind result. A presentation skip returns to the interrupted boundary; where none is possible, that clause asserts nothing. Row.declared in supplies validity and the finite chain; the test names the address and restates nothing from it.
- Given
an active
Row.active classevent whoseRow.boundary granularityboundaries are named atRow.declared in, and a validRow.interrupt classinterrupt offered at one of them- When
- the valid interrupt is discovered, selected, and resolved
- Then
- one interrupt event is created through the interrupt path and
Bind entry - where the interrupt enters at a boundary of the active event: when several interrupts are valid, event rank, the shared-rank order, and then within-class order select one; the active event advances only to boundaries
Row.declared inpermits while it waits; and the interrupt passes through presentation waiting, collision grouping, orphan checks, and its own boundaries before changing that event - where the interrupt joins the next instant instead, the active event runs to completion in this one
Bind result- only one selected interrupt resolves at a time and the report distinguishes a valid interrupt from an invalid offer
- where presentation skips the interrupt, control returns to the interrupted event's boundary rather than step 4; where no such skip is possible, this clause asserts nothing
- one interrupt event is created through the interrupt path and
- Diagnostics
Instance-interrupt-reportInstance-event-traceInstance-cost-log
Row.id enters and replaces the remaining effects
interrupt-replaces-remaining-effects
Applies when Interrupt entry is Before next effect or After current effect or At normal rank and row result is Replace remaining effects.
For an active Row.active class event whose Row.boundary granularity boundaries are named at Row.declared in, Row.id creates one valid Row.interrupt class interrupt offered at a named boundary and Bind entry. Where the interrupt enters at a boundary of the active event, event order selects one valid interrupt, the active event advances only to permitted boundaries while it waits, and the interrupt passes through steps 6 to 11 before changing that event; where it joins the next instant instead, the active event runs to completion in this one. Then Bind result. A presentation skip returns to the interrupted boundary; where none is possible, that clause asserts nothing. The test names both addresses and restates nothing from them.
- Given
an active
Row.active classevent whoseRow.boundary granularityboundaries are named atRow.declared in, and a validRow.interrupt classinterrupt offered at one of them- When
- the valid interrupt is discovered, selected, and resolved
- Then
- one interrupt event is created through the interrupt path and
Bind entry - where the interrupt enters at a boundary of the active event: when several interrupts are valid, event rank, the shared-rank order, and then within-class order select one; the active event advances only to boundaries
Row.declared inpermits while it waits; and the interrupt passes through presentation waiting, collision grouping, orphan checks, and its own boundaries before changing that event - where the interrupt joins the next instant instead, the active event runs to completion in this one
Bind result- only one selected interrupt resolves at a time, and the report distinguishes replacement from an invalid offer
- where presentation skips the interrupt, control returns to the interrupted event's boundary rather than step 4; where no such skip is possible, this clause asserts nothing
- one interrupt event is created through the interrupt path and
- Diagnostics
Instance-interrupt-reportInstance-event-traceInstance-cost-log
Row.id refuses an invalid interrupt offer
invalid-interrupt-does-not-enter
Applies when Interrupt entry is Before next effect or After current effect or At normal rank.
An interrupt of Row.interrupt class offered outside the validity window named at Row.declared in, or at a point that is not one of the Row.boundary granularity boundaries, creates no interrupt event. The active Row.active class event advances unchanged, and the interrupt report distinguishes the invalid offer from a valid interrupt that was not selected. Where the adoption cannot construct an invalid offer, this test asserts nothing.
- Given
an interrupt of
Row.interrupt classoffered outside the validity window named atRow.declared in, or at a point that is not one of theRow.boundary granularityboundaries- When
- the interrupt offer is checked
- Then
- no interrupt event is created
- the active
Row.active classevent advances unchanged - the interrupt report distinguishes an invalid offer from a valid interrupt that was not selected
- where the adoption cannot construct an invalid offer, this test asserts nothing
- Diagnostics
Instance-interrupt-reportInstance-event-trace
Row.id creates one caused event on its declared route
caused-event-follows-declared-route
Applies when Caused events is Resolves now or Waits for its place or Next instant.
Row.id creates one caused event of class Row.event class once; it Bind route, and no chain runs past the bound named at Row.declared in. The test names the address and restates nothing from it.
- Given
an effect that causes
Row.iddue now under the finite chain rule atRow.declared in- When
- the causing effect commits and the caused event is admitted
- Then
- one caused event of class
Row.event classis created once andBind route - no chain runs past the bound named at
Row.declared in - the caused-event report distinguishes this accepted route from rejection and from an interrupt
- one caused event of class
- Diagnostics
Instance-caused-event-reportInstance-event-traceInstance-waiting-set
a finished event returns resolution to the waiting set
active-event-finishes-and-loop-continues
Applies for every adoption
Finishing an active event applies any due deferred removal, records each selected consequence once, removes the event, and returns to step 4. The instant drains the waiting set and waits for any held cue; unavailable branches assert nothing.
- Given
each active event, including a collision-group member where the adoption can construct one
- When
- the active event finishes
- Then
- any deferred target removal due at that point is applied and each selected consequence is recorded once
- the event is removed from the waiting set and selection returns to step 4
- the instant continues until the waiting set is empty, waiting for a cited cue when only presentation-held events remain
- where no deferred removal or held event exists, the corresponding clause asserts nothing
- Diagnostics
Instance-event-traceInstance-waiting-setInstance-collision-report
a single ending records from final settled state
single-ending-records-after-waiting-set-empties
Applies for every adoption
After the waiting set is empty, a single ending that holds in final settled state is recorded once through the game's cited ending rule. Earlier ending-event resolution and class rank do not record or override it. If no single ending can hold, this test asserts nothing.
- Given
each instant the adoption can construct whose final settled state makes one ending hold outside every declared terminal collision
- When
- the waiting set becomes empty and step 15 runs
- Then
- the game's cited ending rule records that ending once from final settled state
- no earlier ending-event resolution or class rank records or overrides it
- where no such single ending can hold, this test asserts nothing
- Diagnostics
Instance-waiting-setInstance-ending-record
Row.id records its selected ending result
terminal-collision-follows-precedence
Applies when Terminal precedence is Loss only or Win only or Both recorded.
When Row.win condition and Row.loss condition both hold in final settled state, Row.id Bind ending, regardless of rank or detection order. Row.declared in identifies the pair; the test names the address and restates nothing from it.
- Given
an instant whose final settled state makes
Row.win conditionandRow.loss conditionboth hold underRow.declared in- When
- the waiting set becomes empty and step 15 reads the pair
- Then
- the lifecycle
Bind ending - the result is unchanged by event rank or the order in which the two conditions were detected
- the ending record distinguishes this terminal collision from single-ending recording
- the lifecycle
- Diagnostics
Instance-ending-recordInstance-settlement-report
the instant commits state and next-instant work together
instant-commits-state-and-next-waiting-set-together
Applies for every adoption
Step 16 commits final state and the next-instant waiting set together. No event from a closed instant can re-enter it. Where there is no next-instant event, that membership observation asserts nothing.
- Given
an instant with distinguishable final state and next-instant waiting events where the adoption can construct them
- When
- step 16 closes the instant
- Then
- the final state and next-instant waiting set commit together
- no event from the closed instant later re-enters it
- where no next-instant event exists, its membership observation asserts nothing
- Diagnostics
Instance-instant-traceInstance-waiting-set
each settlement report carries the lifecycle record
settlement-report-carries-lifecycle-fields
Applies for every adoption
Every settlement report carries the instant, event id, class, rank, tie-break when used, within-class order, source and target availability, applied effects, interrupt and replacement when present, caused-event destination, removal result, and terminal result when present. An unavailable optional circumstance asserts nothing.
- Given
each event settled by
Instance, with optional tie, interrupt, replacement, caused event, removal, and terminal result where present- When
- its settlement report is read
- Then
- the report carries instant, event id, class, rank, tie-break when used, within-class order, source and target availability, effects applied, interrupt and replacement when present, caused-event destination, removal result, and terminal result when present
- an optional circumstance the adoption cannot construct asserts nothing
- Diagnostics
Instance-settlement-report
declaration check: Row.class id names an existing event class
within-class-row-class-join
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.class id must name exactly one event class in this adoption. Any other shape is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.class idwith event-classes ids
- a reviewer compares
- Then
Row.class idnames exactly one event-classes row in this adoption; any other shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.event class names an existing event class
presentation-row-class-join
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.event class must name exactly one event class in this adoption. Any other shape is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.event classwith event-classes ids
- a reviewer compares
- Then
Row.event classnames exactly one event-classes row in this adoption; any other shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.event class names an existing event class
caused-row-class-join
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.event class must name exactly one event class in this adoption. Any other shape is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.event classwith event-classes ids
- a reviewer compares
- Then
Row.event classnames exactly one event-classes row in this adoption; any other shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.event class names an existing event class
orphan-row-class-join
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.event class must name exactly one event class in this adoption. Any other shape is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.event classwith event-classes ids
- a reviewer compares
- Then
Row.event classnames exactly one event-classes row in this adoption; any other shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.active class names an existing event class
interrupt-active-class-join
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.active class must name exactly one event class in this adoption. Any other shape is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.active classwith event-classes ids
- a reviewer compares
- Then
Row.active classnames exactly one event-classes row in this adoption; any other shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.interrupt class names an existing event class
interrupt-class-join
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.interrupt class must name exactly one event class in this adoption. Any other shape is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.interrupt classwith event-classes ids
- a reviewer compares
- Then
Row.interrupt classnames exactly one event-classes row in this adoption; any other shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: shared ranks and rank-tie rows match exactly
rank-tie-rows-match-shared-ranks
Applies for every adoption
This declaration check reads the adoption, not the running game. Shared ranks and rank-ties rows must match one-for-one. Each comma-separated class-ids string lists every and only event class at that rank; the class-ids description requires each id to be listed once. Any other shape is a defect this test fails by construction; with no shared rank and no row, the check asserts nothing.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer groups event-classes rows by rank and compares the groups with rank-ties rows
- Then
- every rank shared by two or more event classes has exactly one rank-ties row, and every rank-ties row names a rank shared by at least two event classes
- each rank-ties class-ids string lists every and only event-classes id at that rank; the class-ids description requires each id to be listed once
- any other shape is a defect this test fails by construction; when no rank is shared and no rank-ties row exists, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: tied classes have no class-specific order row
tied-classes-have-no-within-class-row
Applies for every adoption
This declaration check reads the adoption, not the running game. A class already ordered by a rank-ties row must have no within-class-rules row. An inert class row is a defect this test fails by construction; with no rank tie, the check asserts nothing.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares every class named by rank-ties with within-class-rules class-id fields
- Then
- no event class named by a rank-ties row has a within-class-rules row
- a matching class row is inert and is a defect this test fails by construction; with no rank tie, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: collision cases and exceptions do not overlap
same-target-kinds-do-not-overlap
Applies for every adoption
This declaration check reads the adoption, not the running game. same-target-cases and same-target-exceptions must not name the same target kind. An overlap is a defect this test fails by construction; with either set empty, the comparison asserts nothing.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares target-kind across same-target-cases and same-target-exceptions
- Then
- no target kind is named in both row sets
- any overlap is a defect this test fails by construction; when either set is empty, the cross-set comparison asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: only-first collisions have a visible order
only-first-needs-visible-order
Applies for every adoption
This declaration check reads the adoption, not the running game. Every event class that can supply two events to a collision resolved by only-first-resolves, through the general answer or a same-target-exceptions row, must have a visible class-row, rank-tie, or general order. A no-visible-order path or any other shape is a defect this test fails by construction; where no target kind uses only-first-resolves, the check asserts nothing. The only-first-resolves semantics supplies this duty.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer finds every event class that can supply two events to a collision resolved by only-first-resolves through the general answer or a same-target-exceptions row
- Then
- every such class has a visible order: a within-class-rules row whose order is not no-visible-order, a rank-ties row whose tie-break is not no-visible-order, or a general within-class-order answer other than no-visible-order
- any other shape is a defect this test fails by construction; where no target kind is resolved by only-first-resolves, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: each same-target exception differs from the general answer
same-target-exception-differs-from-general
Applies when Two events one target is Only first resolves or All resolve one ending or All resolve each ending.
This declaration check reads the adoption, not the running game. No same-target-exceptions row may repeat the general two-events-one-target answer. An inert exception is a defect this test fails by construction; with no exception row, the check asserts nothing. The same-target-exceptions description supplies this duty.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares every same-target-exceptions resolution with the general two-events-one-target answer
- Then
- no same-target-exceptions row names the same resolution as the general answer
- an inert exception is a defect this test fails by construction; with no exception row, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: stable indexes settle equal first numbers
stable-index-second-index-duty
Applies for every adoption
This declaration check reads the adoption and its Fixed event rules, not the running game. Every stable-index class row or rank tie must name a second index or belong to a class or tied group that cannot produce equal first numbers that change the result. Any other shape is a defect this test fails by construction; with no stable-index row, the check asserts nothing.
- Given
the
Instanceadoption document and its Fixed event rules, not the running game- When
- a reviewer checks every within-class-rules row and every rank-ties row using stable-index
- Then
- every such row either names a second index or belongs to a class or tied group that cannot produce equal first numbers that change the result
- any other shape is a defect this test fails by construction; with no stable-index row, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: visible ties have class rows when named data is needed
visible-tie-needs-class-row
Applies for every adoption
This declaration check reads the adoption and its Fixed event rules, not the running game. A class that can have a visible tie outside a rank tie must have a within-class-rules row when the general answer is stable-index, map-reading-order, clockwise, or declared-random. Any other shape is a defect this test fails by construction; for arrival-order or no-visible-order, or with no such class, the check asserts nothing.
- Given
the
Instanceadoption document and the event classes its Fixed rules can tie visibly, not the running game- When
- a reviewer compares each such class outside a rank tie with within-class-rules and the general within-class-order answer
- Then
- every class that can have a visible tie and is not in a rank tie has a within-class-rules row when the general answer needs named data: stable-index, map-reading-order, clockwise, or declared-random
- any other shape is a defect this test fails by construction; where the general answer is arrival-order or no-visible-order, or no such class exists, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: citing rejection defaults have rows for every case
rejection-default-citations-have-rows
Applies when Rejected action effect is Derate or Clock advances or Cost and clock.
This declaration check reads the adoption, not the running game. Every rejecting case under this default must have a rejection-cases row carrying Bind duty. A missing row or citation is a defect this test fails by construction; if no rejecting case exists, the check asserts nothing.
- Given
the
Instanceadoption document and every proposal case that can take the selected default, not the running game- When
- a reviewer compares those cases with rejection-cases rows
- Then
- every case that can take the selected default has a rejection-cases row carrying
Bind duty - a missing row or citation is a defect this test fails by construction; where no rejecting case exists, this check asserts nothing
- every case that can take the selected default has a rejection-cases row carrying
- Diagnostics
Instance-declaration-record
declaration check: event-classes covers every event due at an instant
event-class-list-is-complete
Applies for every adoption
This declaration check reads the adoption and its Fixed event rules, not the running game. event-classes must cover every event due at an instant exactly once, must name event classes rather than simulation stages, and must invert authored numbers once when the game's source convention is higher-first. An omission, category error, or runtime reversal is a defect this test fails by construction.
- Given
the
Instanceadoption and its Fixed event rules, not the running game- When
- a reviewer compares every event due at an instant with event-classes
- Then
- every event due at an instant belongs to exactly one event-classes row
- a game whose source convention is higher-first has inverted its authored numbers once in event-classes rather than reversing them at runtime
- an omitted event class or a list of simulation stages presented as classes is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the citation for Row.id names its class and members
event-class-citation-states-membership
Applies for every adoption
This declaration check reads the adoption and Row.declared in, not the running game. The citation must name Row.id, labelled Row.label in the game's own words, and the events belonging to it. Another meaning 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 innamesRow.id, labelledRow.labelin the game's own words, and the events belonging to it- another meaning is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the grid citation for Row.id supplies its order frame
within-class-grid-citation-duty
Applies when row order is Map reading order or Clockwise.
This declaration check reads the adoption and Row.grid declared in, not the running game. The citation must supply the order frame selected by 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.grid declared in, not the running game- When
- a reviewer checks the cited Grid and direction rule
- Then
- the citation supplies the row's required first row and first column, or centre, first direction, and clockwise sense
- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the rule citation for Row.id supplies one total order
within-class-rule-citation-duty
Applies when row order is Declared random or Game rule.
This declaration check reads the adoption and Row.rule declared in, not the running game. The citation must supply one complete total-order rule and never point back to this row. 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.rule declared in, not the running game- When
- a reviewer checks the cited random or custom order rule
- Then
- the citation supplies the complete draw or deterministic rule that produces one total order for the instant and never points back to this row
- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the grid citation for Row.id supplies its order frame
rank-tie-grid-citation-duty
Applies when row tie break is Map reading order or Clockwise.
This declaration check reads the adoption and Row.grid declared in, not the running game. The citation must supply the order frame selected by 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.grid declared in, not the running game- When
- a reviewer checks the cited Grid and direction rule
- Then
- the citation supplies the row's required first row and first column, or centre, first direction, and clockwise sense
- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the rule citation for Row.id supplies one total order
rank-tie-rule-citation-duty
Applies when row tie break is Declared random or Game rule.
This declaration check reads the adoption and Row.rule declared in, not the running game. The citation must supply one complete total-order rule and never point back to this row. 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.rule declared in, not the running game- When
- a reviewer checks the cited random or custom order rule
- Then
- the citation supplies the complete draw or deterministic rule that produces one total order for the instant and never points back to this row
- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the scale citation for Row.id covers effect and cost
rejection-scale-citation-duty
Applies when row result is Derate.
This declaration check reads the adoption and Row.scale rule declared in, not the running game. The citation must scale the complete effect and cost. 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.scale rule declared in, not the running game- When
- a reviewer checks the cited scale rule
- Then
- the citation supplies how the complete effect and cost are scaled
- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the clock citation for Row.id names one advance
rejection-clock-citation-duty
Applies when row result is Clock advances or Cost and clock.
This declaration check reads the adoption and Row.clock rule declared in, not the running game. The citation must name exactly one advance caused by this rejection. 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.clock rule declared in, not the running game- When
- a reviewer checks the cited clock or turn rule
- Then
- the citation names exactly one clock advance caused by this rejection
- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the presentation citation for Row.id supplies a finite cue
presentation-cue-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.declared in, not the running game. The citation must relate the game timing of Row.event class to Row.presentation cue and show that the cue finishes in finite game or real time, keeping an instant from waiting forever. 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.declared in, not the running game- When
- a reviewer checks the cited presentation rule
- Then
Row.declared inrelates the game timing ofRow.event classtoRow.presentation cueand shows the cue finishes in finite game or real time, which is what keeps an instant from waiting forever- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the caused-event citation for Row.id supplies its bound
caused-event-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.declared in, not the running game. The citation must name the cause, the new Row.event class event, and the finite bound on repeated caused events. 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.declared in, not the running game- When
- a reviewer checks the cited caused-event rule
- Then
Row.declared innames the cause, the newRow.event classevent, and the finite bound on repeated caused events- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the interrupt citation for Row.id supplies its entry rule
interrupt-citation-duty
Applies for every adoption
This declaration check reads the adoption and Row.declared in, not the running game. The citation must name the validity window, the Row.boundary granularity effect boundaries, and the stop result. 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.declared in, not the running game- When
- a reviewer checks the cited interrupt rule
- Then
Row.declared innames the validity window, theRow.boundary granularityeffect boundaries, and the stop result- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the replacement citation for Row.id supplies every effect in order
interrupt-replacement-citation-duty
Applies when row result is Replace remaining effects.
This declaration check reads the adoption and Row.replacement declared in, not the running game. The citation must state every replacement effect and its order. 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.replacement declared in, not the running game- When
- a reviewer checks the cited replacement rule
- Then
Row.replacement declared instates every replacement effect and its order- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: the orphan citation for Row.id supplies its case
orphan-case-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 case, when it applies, the captured payload, and the source or target requirement. 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.declared in, not the running game- When
- a reviewer checks the cited orphan rule
- Then
Row.declared inidentifies the case, when it applies, the captured payload, and the source or target requirement- a missing duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
event resolution holds for the whole run
resolution-holds
Applies for every adoption
Across Inputs scope, lower eligible ranks never resolve late, each tie and within-class order holds, each proposal follows its case or default, each accepted proposal creates one payload, each valid interrupt takes effect at its entry point, each caused event follows its route, each orphan follows its row, and each ending records once at step 15. An instant shared with another adoption asserts nothing here. A case the adoption cannot construct asserts nothing.
- Holds
for every instant of the audited run that this adoption owns in full, every event resolved at or after every eligible lower-rank event; every rank tie and within-class selection followed its declared order; every rejection followed its matching case or default; every accepted proposal created one payload once; every valid interrupt entered at its declared point and took effect; every caused event was created once and followed its route; every orphan followed its row; every ending was recorded once at step 15; an instant shared with another adoption asserts nothing here; a case the adoption cannot construct asserts nothing
- Seeds
Inputs seeds- Scope
Inputs scope- Diagnostics
Instance-instant-traceInstance-proposal-logInstance-order-traceInstance-collision-reportInstance-orphan-reportInstance-interrupt-reportInstance-ending-recordInstance-settlement-reportInstance-first-ordering-violation