State persistence scope
state-persistence-scope-1
This contract defines the behaviour of saved state: campaign progress, settings, or a cloud save.
It decides what your campaign progress and settings survive, from a crash to a new device, and what a damaged save shows.
- 3 questions
- no numbers
- 5 lists
- 85 tests
Use in your game
Opens the authoring tool with this contract added and its questions unanswered. Or download the ZIP and add it later.
What is in the ZIP
The ZIP holds the contract and its acceptance tests. In the authoring tool, choose Add contract and pick this ZIP. If you keep your design as files, put them in contracts/ and fill in the answers there.
Questions
Up to 3 questions. Some appear only after earlier answers.
Try the answers
Pick answers to see which rules and tests apply. Nothing is saved here: the ZIP and the authoring tool start unanswered.
What normally happens when saved state cannot be read?
- Asked when
- the copy kinds list has at least one row.
- If not asked
- No saved copy can be opened later, so unreadable saved state never reaches a load attempt.
Why this is asked
Lost progress is the most visible failure a save system has. Choose the result players should expect first.
What normally happens when an older game build wrote the copy?
- Asked when
- the copy kinds list has at least one row.
- If not asked
- No loadable copy exists, so an older build has no saved state to open.
Why this is asked
Updates can strand a player's progress or change it permanently. Choose how the current build protects that progress.
What normally happens when a newer game build wrote the copy?
- Asked when
- the copy kinds list has at least one row.
- If not asked
- No loadable copy exists, so a newer build has no saved state to open.
Why this is asked
Going back to an older build can erase newer content. Choose whether the player may take that risk.
Lists5 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.
State families
state-families
List each family of state that can change later play and give its observed persistence boundaries.
An empty list means: No changing game state is covered, so this adoption makes no persistence promise.
Each row is: id, state-declared-in, lifetime, scope-starts-in, scope-ends-in, lifetime-event-declared-in, saved-in, after-normal-quit, after-crash, after-death, after-slot-delete, after-local-profile-delete, on-another-device.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | Name the state family in game words, such as campaign-progress, run-inventory, unlocks, or settings. |
state-declared-in |
reference | Required | The fixed game prose naming every field in this family and the points where it can affect later play. For a family that does not return after a quit, a crash, or on another device, it also names the value the family starts from. |
lifetime |
choice: run, session, slot, profile, device, account, until-event, not-kept | Required | Run: the state belongs to one attempt; a roguelike's carried items go when that attempt ends. Session: the state belongs to one continuous visit; a co-op lobby choice goes when the party leaves that lobby. Slot: the state belongs to one player-selected save; campaign progress goes when that slot is deleted. Profile: the state belongs to one local player profile; unlocks go when that profile is deleted. Device: the state belongs to one installation; local settings go when that device data is erased. Account: the state belongs to one account; online settings go when that account is deleted or reset. Until event: the state lasts to one named game event; dropped currency goes at the next death. Not kept: the state does not cross its first named interruption; an enemy's alert meter does not return after quitting. |
scope-starts-in |
reference | Present when row lifetime is Run or Session. | The player-observable start of this attempt or continuous visit. A run may start when the character enters the dungeon; a session may start when the party joins a lobby. |
scope-ends-in |
reference | Present when row lifetime is Run or Session or Slot or Profile or Device or Account or Not kept. | The player-observable ending of this lifetime. It may be an attempt result, leaving a lobby, deleting a player-selected slot, deleting a local profile, erasing device data, deleting an account, or the first interruption that discards the value. |
lifetime-event-declared-in |
reference | Present when row lifetime is Until event. | The named game event that destroys the earlier value. A recovery point may last until the next death after it appears. |
saved-in |
string | Optional | The save kind that restores this family. Absence means no copy restores it. |
after-normal-quit |
choice: returns-last-commit, does-not-return | Required | Whether the last saved point returns after an ordinary quit. A campaign returns its last checkpoint; an unsaved match score does not. |
after-crash |
choice: returns-last-commit, does-not-return | Required | Whether the last saved point returns after a crash. A timer-written world may lose changes since its last write while still returning that write. |
after-death |
choice: keeps-value, clears-value | Required | Whether death keeps this value. Roguelike unlocks may remain while the dead run's inventory clears. |
after-slot-delete |
choice: keeps-value, clears-value, no-slot | Required | Whether deleting the related player-selected save keeps this value. That slot is named by the storage rule for several player-selected saves; a save presented as one current copy answers that no related slot exists. |
after-local-profile-delete |
choice: keeps-value, clears-value, no-profile | Required | Whether deleting the related local player profile keeps this value. That profile is named by the restoring copy's storage rule; a family with no such profile answers that no related profile exists. |
on-another-device |
choice: returns, does-not-return | Required | Whether the value returns when the same eligible player continues on another device. A server profile may return; local settings may not. |
Copy kinds
copy-kinds
List each independently written and loaded save kind, such as campaign slots, profile data, cloud settings, or a server profile.
An empty list means: No saved copy can be opened later. Loading cannot restore state, compare builds, recover damage, or resolve a conflict.
Each row is: id, contains-declared-in, write-trigger, write-rule-declared-in, residence, layout, storage-rule-declared-in, unreadable-copy, older-build-copy, newer-build-copy, mode-gated, mode-rule-declared-in, removed-at, removal-rule-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | Name this save kind in game words, such as campaign-slots, unlock-profile, or account-settings. |
contains-declared-in |
reference | Required | The fixed list of state-family ids written and restored together by this save kind. |
write-trigger |
choice: player-save, checkpoint, continuous, timer, service-owned | Required | What starts a save: a save action, a named checkpoint, each accepted change, a timer, or the service's own rule. |
write-rule-declared-in |
reference | Required | The rule naming exactly when a save begins, what makes it successful, and which later changes a quit or crash can lose. |
residence |
choice: local-device, cloud-synced, server-authoritative | Required | Where the copy that can restore play is authoritative: this device, synced device copies, or a game service. Copies shared through sync can conflict; a profile controlled by the service reads its accepted state. |
layout |
choice: one-current, manual-slots | Required | How the save is presented: one current copy or several player-selected slots. A slot is one named load choice in the storage rule; retained earlier copies belong in the backup list. |
storage-rule-declared-in |
reference | Required | The rule naming copy residence, sync or service authority, and the player-visible selection route. For several player-selected saves it also names each stable slot identity; one current copy names no player-selected slot. |
unreadable-copy |
choice: use-game-default, refuse-load, start-fresh, restore-earlier-copy, repair-readable-state, warn-and-try | Required | Use the game's ordinary answer for a save that cannot be read, or choose a different result for this save kind. |
older-build-copy |
choice: use-game-default, refuse-load, convert-and-load, warn-and-load | Required | Use the game's ordinary answer for a save written by an older build, or choose a different result for this save kind. |
newer-build-copy |
choice: use-game-default, refuse-load, warn-and-load | Required | Use the game's ordinary answer for a save written by a newer build, or choose a different result for this save kind. |
mode-gated |
choice: only-in-named-modes | Optional | This save kind exists only in named player modes. A restore point may exist in a practice mode and a standard mode but not in a challenge mode. |
mode-rule-declared-in |
reference | Present when row mode gated is Only in named modes. | The rule naming every player mode where this save kind exists and confirming that it is absent elsewhere. |
removed-at |
choice: normal-quit, crash, death, slot-delete, local-profile-delete, device-data-delete, account-delete | Optional | The event that removes this copy from later load choices. A permadeath save may vanish when the character dies. For several player-selected saves this names removal of the deleted slot's copy, not of the whole save kind. |
removal-rule-declared-in |
reference | Present when row removed at is Normal quit or Crash or Death or Slot delete or Local profile delete or Device data delete or Account delete. | The rule naming the exact event that removes the copy and what the player sees afterward. |
Backup copies
backup-copies
List save kinds that retain an earlier copy for supported recovery.
An empty list means: No save kind promises an earlier usable copy, so damage cannot be answered by restoring one.
Each row is: id, copy-kind, backup-rule-declared-in, restore-rule-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | Name the earlier-copy family, such as previous-campaign-checkpoint. |
copy-kind |
string | Required | The save kind protected by this earlier copy. |
backup-rule-declared-in |
reference | Required | The rule naming when an earlier copy is retained, how many remain, and what later progress recovery loses. |
restore-rule-declared-in |
reference | Required | The supported route for opening an earlier copy. It names whether recovery is automatic, in the game, or an external file step. |
Copy conflicts
copy-conflicts
List shared save kinds that can present two complete but disagreeing copies. One adoption has at most one row per conflict scope: one for each named save kind and one for all synced kinds.
An empty list means: No shared save kind can present competing copies, so no conflict response runs.
Each row is: id, scope, copy-kind, response, resolution-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | Name the conflict in game words, such as campaign-slot-sync. |
scope |
choice: this-copy-kind, all-synced-kinds | Required | Whether the response settles one save kind or every synced save kind together. One cloud dialog may settle campaign slots and quicksaves as a set. |
copy-kind |
string | Present when row scope is This copy kind. | The one cloud-synced or service save kind whose copies can disagree. |
response |
choice: select-by-rule, player-chooses-copy, refuse-until-resolved | Required | What happens before any disagreeing state becomes active. A fixed rule may always prefer the copy the game service holds; the player may choose between dated copies; or neither copy may open until sync is repaired. |
resolution-declared-in |
reference | Required | The rule detecting disagreement, comparing copy identity, selecting or preserving copies, and naming the event that clears the conflict. |
Earlier point returns
earlier-point-returns
List save kinds that can return to an earlier point of the same continuous play, whether or not the game names a run. One adoption has at most one row per save kind.
An empty list means: No save kind can return to an earlier point of the same continuous play, so reload-to-retry is unavailable.
Each row is: id, copy-kind, after-load, return-rule-declared-in, mode-gated, mode-rule-declared-in.
Every field
| Field | Kind | When it appears | Meaning |
|---|---|---|---|
id |
string | Required | Name the earlier return point in game words, such as dungeon-retry or quicksave. |
copy-kind |
string | Required | The save kind that can return play to the earlier point. |
after-load |
choice: resume-stays, resume-is-used-once, player-mode-decides | Required | Whether the same earlier point remains available after a successful load. A practice mode may keep a boss checkpoint while an iron mode allows one return. |
return-rule-declared-in |
reference | Required | The rule naming the earlier point, successful activation, and whether another load remains possible. |
mode-gated |
choice: only-in-named-modes | Optional | This earlier return point exists only in named player modes. A quicksave may be available in a practice mode but absent in a challenge mode. |
mode-rule-declared-in |
reference | Present when row mode gated is Only in named modes. | The rule naming every player mode where this earlier return point exists and confirming that it is absent elsewhere. |
For builders
Exact mechanism wording and 85 pack tests
Exact mechanism wording
This is the one normative settlement authority for state-family identity, scope starts and endings, commits, loads, damage, build mismatch, copy conflicts, deletion, and device change. Questions and rows supply defaults, overrides, and cited game rules; they do not define another sequence.
A run begins at the player-observable attempt start named by scope-starts-in and ends at the result or exit named by scope-ends-in. Victory, death, and abandonment are common endings, but only the cited game rules decide. A save or load does not start or end a run. A session begins when play enters the world, match, lobby, or profile context named by scope-starts-in and ends at the exit, switch, or reset named by scope-ends-in. It survives a pause, background interval, closure, or relaunch that returns to that same context; a missing commit may still prevent its earlier value from returning.
A commit is one coherent accepted write of a copy kind. A copy is a load candidate with its save-kind id, copy identity, any slot identity, build identity, commit identity, and complete state-family set. A conflict exists when the cited rule finds two accepted shared copies in one declared conflict scope that disagree and neither has already replaced the other. An earlier copy is a retained older commit named by a backup row.
### Change and commit
1. When state changes, keep each state-families row as one family under its cited game rule. The row's lifetime is the maximum scope of that earlier value. An until-event value ends at its cited game event; a shorter boundary result may clear any value sooner only when the row says so. 2. Evaluate run and session starts and endings from their separate cited player-observable events. A save action, automatic write, timer tick, process launch, process close, or load does not create a new run or session by itself. 3. Start a copy-kind commit only at its selected write trigger. A player save follows the cited save action. A checkpoint follows its named game event. Continuous writing follows each accepted change named by its rule. A timer follows the cited interval. A service-owned copy follows its authority's cited acceptance event. 4. A commit becomes loadable only when write-rule-declared-in reports success for the complete contains-declared-in set. A failed or partial write never replaces the last successful commit. Earlier copies are retained and ordered only by their backup and storage rules.
### Quit, crash, and return
5. On an ordinary quit, perform a final commit only when the copy kind's cited write rule calls for one. For each state row, returns-last-commit restores its latest successful commit on return; does-not-return starts from the cited post-quit value. Uncommitted changes do not return. A copy removed at normal quit is no longer a later load choice. 6. On a crash, no unfinished commit succeeds. For each state row, returns-last-commit restores the last commit that succeeded before the crash; does-not-return starts from the cited post-crash value. A timer or checkpoint therefore has an explicit possible loss window. A copy removed at crash is no longer a later load choice. 7. Select the requested slot or profile before activating state. A one-current kind selects its current copy. manual-slots selects the player's named slot. A retained earlier copy is not another layout; the damage response and matching backup rule may select it later, and a backup row's cited restore route is also available to the player directly, independent of any damage response. 8. A local-device copy is available only on that device unless another cited transfer exists outside this adoption. A cloud-synced kind obtains every accepted device and cloud candidate before conflict handling. A server-authoritative kind obtains the service's accepted copy and does not treat an unaccepted local cache as equal authority. Read each candidate's save-kind, slot, build, and commit identity now. A candidate whose identity cannot be read is not a conflict candidate. If no candidate survives, run the requested kind's damage response immediately, without conflict or build comparison. A readable header with an unreadable gameplay body remains a candidate for steps 9 and 10, then reaches the damage response in step 11.
### Conflict, compatibility, and damage
9. If readable shared candidates conflict, apply the matching row's response before reading their gameplay state. A one-kind row settles only that save kind; a whole-set row settles every synced kind together. select-by-rule chooses one complete copy. player-chooses-copy waits for one complete-copy choice. refuse-until-resolved activates neither. No response merges fields. 10. Compare the selected copy's writing build with the running build. Apply the copy-kind override when present; otherwise apply the matching older or newer default. Refusal activates no state. Conversion produces one current-build copy before activation. A warning precedes the attempt and does not promise that it succeeds. If conversion fails, refuse the load and leave the source copy unchanged unless its cited rule says otherwise. 11. Read the selected copy as one coherent unit. If it is unreadable, apply the copy-kind override or unreadable-copy-default. Refusal activates nothing. Fresh start activates the cited fresh state without silently deleting the unreadable copy. Earlier-copy recovery follows the matching backup row, selects the newest usable earlier copy, and reports the lost interval. Repair activates one coherent repaired result and resets every unreadable part under the cited rule; failure to produce a coherent result refuses the load. Warning waits for the player's choice before any attempted activation. 12. Activate all state families in the accepted copy together. State families saved in another copy kind keep the already active value from that kind; a state family without saved-in is never restored by this load. 13. If the accepted copy has a earlier-point-returns row, return continuous play to its cited earlier point. If that point is inside a run, continue the same run identity. Apply after-load only after successful activation: keeping the resume leaves it available, using it once makes it unavailable, and a player-mode answer follows the mode fixed before the load.
### Death, deletion, and another device
14. On death, apply every state's after-death result. clears-value removes the earlier value before later play. keeps-value retains it. If death is also the cited run end, every run-lifetime value clears even if no save action occurs. If it is the cited event for an until-event value, that value clears as well. Longer-lived unlocks, settings, and profile state follow their own rows. A copy with removed-at: death disappears from the load choices after these state results are settled. 15. On slot deletion, clear each clears-value row tied to that slot and keep each keeps-value row. no-slot records that the state has no related player-selected slot. Deleting a local profile applies after-local-profile-delete the same way and includes any slots whose cited rule makes them children of that profile. Device-data deletion ends device-lifetime state under its cited rule. Account deletion or reset ends account-lifetime state through scope-ends-in. At each event, remove every copy whose removed-at value names it. 16. On another eligible device, returns obtains the family from its cloud-synced or server-authoritative copy before activation and still runs conflict handling. does-not-return starts from the cited new-device value. A device change does not by itself delete the source device's copy. 17. After every event, no earlier value affects later play once its lifetime has ended or its selected boundary result cleared it. A later game rule may derive a new value, but that is new state rather than restoration of the cleared value. A mode-gated copy or earlier return point exists only while the cited player mode permits it.
Every settlement report identifies the state-family id, copy-kind id or its absence, event, scope before and after, last successful commit when read, selected copy and build when loaded, override or default used, state result, and any lost interval. Conflict reports also identify both candidate commits and the selected response. Damage reports identify refusal, fresh state, earlier-copy recovery, repaired parts, or warning choice without claiming an unattempted load succeeded.
Verification pack
sha256:86060e861a3d6b10e0019612467e03749328dba98ab1a148bbc54c09e2492cf7
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.
85 pack tests
Placeholders are filled from the adoption's answers, values, rows, and verification inputs.
Row.id begins and ends its run only at the cited events
run-scope-uses-cited-events
Applies when row lifetime is Run.
The run for Row.id begins at Row.scope starts in and ends at Row.scope ends in. Each save, automatic write, timer tick, load, close, or relaunch the adoption can construct does not create either boundary; an unavailable event asserts nothing. The test names the addresses and restates nothing from them.
- Given
a distinguishable
Row.idvalue before, during, and after its run- When
- play crosses the attempt start at
Row.scope starts in, the run ending atRow.scope ends in, and each save, automatic write, timer tick, load, process close, and relaunch to the same context that the adoption can construct
- play crosses the attempt start at
- Then
- the run identity begins only at
Row.scope starts inand ends only atRow.scope ends in - each constructed save, automatic write, timer tick, load, close, and relaunch does not by itself begin or end the run; an event the adoption cannot construct asserts nothing
- the run identity begins only at
- Diagnostics
Instance-state-boundary-traceInstance-run-identity
Row.id keeps one session through returns to the same context
session-scope-uses-cited-events
Applies when row lifetime is Session.
The session for Row.id begins at Row.scope starts in, survives each constructible save, automatic write, timer tick, load, pause, background interval, closure, relaunch to the same context, and another family's run boundary, and ends at Row.scope ends in. An unavailable event or run boundary asserts nothing. Its value still needs the declared commit and boundary result to return. The test names the addresses and restates nothing from them.
- Given
a distinguishable
Row.idvalue in the session that starts atRow.scope starts in- When
- play pauses, enters the background, crosses each constructed save, automatic write, timer tick, and load, closes, relaunches to the same context, and finally crosses
Row.scope ends in - where the adoption declares a run family, play also crosses that family's run boundary
- play pauses, enters the background, crosses each constructed save, automatic write, timer tick, and load, closes, relaunches to the same context, and finally crosses
- Then
- pause, background, closure, and relaunch to the same context retain one session identity
- each constructed save, automatic write, timer tick, load, close, and relaunch does not by itself begin or end the session; an event the adoption cannot construct asserts nothing
- crossing a run boundary declared by another family does not by itself end this session; where the adoption declares no run family, this clause asserts nothing
- the session ends only at
Row.scope ends in; whether its earlier value returns still follows its commit and boundary results
- Diagnostics
Instance-state-boundary-traceInstance-session-identity
Row.id copies carry complete identity and family membership
copy-carries-complete-identity
Applies for every adoption
A copy of kind Row.id is one coherent accepted commit with save-kind, copy, slot when present, build, and commit identities and the complete family set at Row.contains declared in. The test names the address and restates nothing from it.
- Given
one accepted commit of the copy kind named
Row.id- When
- the copy is recorded and later considered as a candidate
- Then
- the copy record carries save-kind id, copy identity, any slot identity, build identity, commit identity, and the complete state-family set named at
Row.contains declared in - the commit record identifies one coherent accepted write rather than a collection of separately accepted fields
- the copy record carries save-kind id, copy identity, any slot identity, build identity, commit identity, and the complete state-family set named at
- Diagnostics
Instance-commit-logInstance-candidate-set
Row.id is a conflict only for two accepted unreplaced copies
conflict-has-two-unreplaced-accepted-copies
Applies for every adoption
Row.id is a conflict only for two accepted shared copies in one declared scope that disagree and have not replaced one another. Row.resolution declared in decides the cited facts; this test names the address and restates nothing from it.
- Given
candidate pairs inside and outside the conflict scope governed by
Row.resolution declared in- When
- the game classifies each pair before reading gameplay state
- Then
- a conflict is recorded only when two accepted shared copies in one declared scope disagree and neither has replaced the other
- an unaccepted, agreeing, out-of-scope, or already replaced pair is not recorded as a conflict
- Diagnostics
Instance-candidate-setInstance-conflict-report
Row.id follows its declared maximum lifetime
state-family-follows-maximum-lifetime
Applies when row lifetime is Run or Session or Slot or Profile or Device or Account or Until event or Not kept.
Row.id has a maximum lifetime of Bind maximum scope. Each shorter boundary follows the row's result, and the trace distinguishes a restored value from an equal value derived later. The family definition is at Row.state declared in; the test names the address and restates nothing from it.
- Given
Row.idchanges from an earlier value to a distinguishable value- When
- the value is read immediately before and after every declared persistence boundary that
Instancecan construct
- the value is read immediately before and after every declared persistence boundary that
- Then
- the earlier value affects play for no longer than
Bind maximum scope - a shorter boundary clears it exactly when
Row.id's selected boundary result says so - the trace identifies restoration of the earlier value separately from a later derivation of an equal value
- the earlier value affects play for no longer than
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id ends at its cited event
until-event-value-ends-at-cited-event
Applies when row lifetime is Until event.
Row.id follows its quit, crash, death, slot-deletion, local-profile-deletion, and device-change results at each boundary the adoption can construct and ends at Row.lifetime event declared in. This test asserts nothing about run or session crossing because an event-bounded value declares no run or session scope. It names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue before the event atRow.lifetime event declared in- When
- play crosses each of quit, crash, death, slot deletion, local-profile deletion, and device change that the adoption can construct, then the cited event; run and session crossing are out of reach because an event-bounded value declares no run or session scope
- Then
- each constructed boundary follows
Row.id's own row result; a boundary the adoption cannot construct asserts nothing - the earlier value ends at
Row.lifetime event declared inand does not affect later play
- each constructed boundary follows
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id never returns after its named interruption
not-kept-value-never-returns
Applies when row lifetime is Not kept.
The earlier Row.id value never returns after Row.scope ends in. An equal value derived later is recorded as new state. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue beforeRow.scope ends in- When
- play crosses
Row.scope ends inand later reaches a point where an equal value can be derived
- play crosses
- Then
- the earlier value never returns after the boundary
- the source record distinguishes a later derived equal value as new state
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id ends at its cited Row.lifetime boundary
slot-and-profile-end-at-cited-event
Applies when row lifetime is Slot or Profile.
The maximum lifetime of Row.id ends at Row.scope ends in. An equal value derived later is new state. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue beforeRow.scope ends in- When
- play crosses the cited lifetime ending
- Then
- the earlier value reaches the end of its maximum lifetime at
Row.scope ends inand cannot affect later play - the source record distinguishes an equal value derived later as new state
- the earlier value reaches the end of its maximum lifetime at
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id starts a commit only at its selected trigger
commit-starts-only-at-selected-trigger
Applies when row write trigger is Player save or Checkpoint or Continuous or Timer or Service owned.
A commit for Row.id begins only at Bind trigger under Row.write rule declared in. The test names the address and restates nothing from it.
- Given
events around the write rule at
Row.write rule declared in- When
- the events occur before, at, and after
Bind trigger
- the events occur before, at, and after
- Then
- one
Row.idcommit starts atBind triggerandBind negative - the commit log records which cited event started it
- one
- Diagnostics
Instance-commit-log
Row.id replaces its last commit only after complete success
commit-loadable-only-after-complete-success
Applies for every adoption
Row.id becomes loadable only when Row.write rule declared in reports success for the complete family set at Row.contains declared in. A failed or partial write leaves the last successful commit in place. The test names both addresses and restates nothing from them.
- Given
a last successful
Row.idcommit and later complete-success, failed, and partial write attempts underRow.write rule declared in- When
- each attempt is followed by a return that requests
Row.id
- each attempt is followed by a return that requests
- Then
- only the attempt reported successful for the complete set at
Row.contains declared inbecomes loadable - a failed or partial attempt never replaces the last successful commit
- the commit and load records distinguish the retained last commit from the rejected attempts
- only the attempt reported successful for the complete set at
- Diagnostics
Instance-commit-logInstance-load-resultInstance-active-state-source
Row.id makes a final quit commit only when its rule calls for one
normal-quit-final-commit-follows-write-rule
Applies for every adoption
On ordinary quit, Row.id makes a final commit only when Row.write rule declared in calls for one. Otherwise the prior successful commit remains last. The test names the address and restates nothing from it.
- Given
each ordinary-quit case the adoption can construct for changed
Row.idstate underRow.write rule declared in- When
- each ordinary quit completes
- Then
- where
Row.write rule declared incalls for a final commit, exactly one starts - where the rule does not call for one, no final commit starts and the previous last successful commit remains; an unavailable branch asserts nothing
- where
- Diagnostics
Instance-commit-log
Row.id returns its last commit after a normal quit
normal-quit-returns-last-commit
Applies when row after normal quit is Returns last commit.
After a normal quit, Row.id returns from the latest successful commit of the copy kind named by saved-in; its uncommitted change does not return. If the row has no saved-in, the restoration clause asserts nothing.
- Given
a committed
Row.idvalue followed by a distinguishable uncommitted change- When
- the game quits normally and returns through the same context
- Then
- where this family names a copy kind at saved-in, the latest successful commit of that kind restores
Row.idand the uncommitted change does not return - where this family has no saved-in, the restoration clause asserts nothing
- where this family names a copy kind at saved-in, the latest successful commit of that kind restores
- Diagnostics
Instance-commit-logInstance-load-resultInstance-active-state-source
Row.id does not return after a normal quit
normal-quit-does-not-return
Applies when row after normal quit is Does not return.
After a normal quit, the earlier Row.id value does not return. Its post-quit value follows Row.state declared in, and the record distinguishes that result from restoration. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue before a normal quit- When
- the game quits normally and returns through its normal flow
- Then
- the earlier value does not become active
Row.idstarts from the post-quit value governed atRow.state declared in- the source record distinguishes that value from restoration of the earlier value
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id returns its last completed commit after a crash
crash-returns-last-commit
Applies when row after crash is Returns last commit.
After a crash, no unfinished commit succeeds. Row.id returns from the last successful commit of the copy kind named by saved-in, without later changes. If the row has no saved-in, the restoration clause asserts nothing.
- Given
a committed
Row.idvalue, then a distinguishable change and an unfinished commit- When
- the game crashes and returns through the same context
- Then
- the unfinished commit does not succeed
- where this family names a copy kind at saved-in, the last commit completed before the crash restores
Row.idand the later change does not return - where this family has no saved-in, the restoration clause asserts nothing
- Diagnostics
Instance-commit-logInstance-load-resultInstance-active-state-source
Row.id does not return after a crash
crash-does-not-return
Applies when row after crash is Does not return.
After a crash, the earlier Row.id value does not return. Any unfinished commit fails; if none can exist, that clause asserts nothing. Its post-crash value follows Row.state declared in. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue and, where the adoption can construct one, an unfinished commit before a crash- When
- the game crashes and returns through its normal flow
- Then
- the earlier value does not become active; where an unfinished commit exists, it does not succeed, and where none can exist that clause asserts nothing
Row.idstarts from the post-crash value governed atRow.state declared in- the source record distinguishes that value from restoration
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id exposes its possible crash loss window
timer-and-checkpoint-have-crash-loss-window
Applies when row write trigger is Timer or Checkpoint.
Row.id has an explicit possible crash loss window under Row.write rule declared in. The interrupted commit fails, and the report identifies the last successful commit and lost interval. The test names the address and restates nothing from it.
- Given
a successful
Row.idcommit, later changes inside the possible loss window atRow.write rule declared in, and a commit interrupted by a crash- When
- the game returns after the crash
- Then
- the interrupted commit does not succeed
- the settlement report identifies the last successful commit and the changes in the cited possible loss window that did not return
- Diagnostics
Instance-commit-logInstance-settlement-report
Row.id selects its requested copy before activation
layout-selects-requested-copy
Applies when row layout is One current or Manual slots.
Before activation, Row.id Bind selection under Row.storage rule declared in. Where an earlier commit is retained, it is not another layout; otherwise that clause asserts nothing. The test names the address and restates nothing from it.
- Given
the player requests
Row.idthrough the selection route atRow.storage rule declared inand, where the adoption retains one, an earlier commit is also available- When
- selection completes before any state activation
- Then
Row.idBind selection- where an earlier commit is retained, it is not treated as another layout choice and remains available only through its matching backup and damage routes; where none is retained, this clause asserts nothing
- Diagnostics
Instance-candidate-setInstance-active-state-source
Row.id obtains candidates from its declared residence
residence-controls-authoritative-candidates
Applies when row residence is Local device or Cloud synced or Server authoritative.
Row.id Bind candidates under Row.storage rule declared in. The test names the address and restates nothing from it.
- Given
the candidate sources the adoption can construct for
Row.idas governed atRow.storage rule declared in- When
- the game builds the candidate set before conflict handling
- Then
Row.idBind candidates
- Diagnostics
Instance-candidate-setInstance-authority-trace
Row.id reads candidate identity before settlement
candidate-identity-precedes-settlement
Applies for every adoption
Row.id reads candidate identity first. An unreadable identity cannot enter conflict handling; no survivor goes directly to the effective damage response; a readable header with an unreadable body reaches damage only after conflict and build comparison.
- Given
Row.idcandidates with readable identity, unreadable identity, and a readable header with an unreadable gameplay body- When
- the game reads candidate identity before conflict, build, or damage settlement
- Then
- save-kind, slot when present, build, and commit identity are read before gameplay state
- an unreadable identity is not a conflict candidate; if no candidate survives, the effective damage response runs immediately without conflict or build comparison
- a readable header with an unreadable body remains a candidate through conflict and build comparison before reaching damage settlement
- Diagnostics
Instance-candidate-setInstance-settlement-traceInstance-damage-report
Row.id has no conflict response without a matching row
missing-conflict-row-runs-no-conflict-response
Applies for every adoption
If Row.id has no matching conflict row, this contract performs no conflict response for it. If it has one, this test asserts nothing.
- Given
a candidate set for
Row.id- When
- the game looks for a matching copy-conflicts row before build comparison
- Then
- where no matching conflict row exists, no candidate is selected, refused, or replaced by a conflict response from this contract
- where a matching row exists, this test asserts nothing
- Diagnostics
Instance-candidate-setInstance-settlement-trace
Row.id settles only Row.copy kind
one-kind-conflict-settles-only-named-kind
Applies when row scope is This copy kind.
Row.id settles only Row.copy kind before gameplay state is read. It never merges fields, and state from other copy kinds remains active. Row.resolution declared in governs the conflict; the test names the address and restates nothing from it.
- Given
a conflict under
Row.idplus non-conflicting active state from another copy kind- When
- the response at
Row.resolution declared inruns before gameplay state is read
- the response at
- Then
- only
Row.copy kindcandidates enter this conflict settlement - the response chooses or refuses complete copies and never merges fields
- the other copy kind keeps its active value
- only
- Diagnostics
Instance-candidate-setInstance-conflict-reportInstance-active-state-source
Row.id settles every synced kind together
all-synced-conflict-settles-whole-set
Applies when row scope is All synced kinds.
Row.id settles every synced copy kind in its declared scope together, before gameplay state is read, and never merges fields. Row.resolution declared in governs the conflict; the test names the address and restates nothing from it.
- Given
accepted disagreeing candidates across the synced copy kinds in
Row.id's scope- When
- the response at
Row.resolution declared inruns before gameplay state is read
- the response at
- Then
- every synced kind in the declared scope enters one settlement
- the response chooses or refuses complete copies and never merges fields
- Diagnostics
Instance-candidate-setInstance-conflict-report
Row.id applies select-by-rule
conflict-select-by-rule
Applies when row response is Select by rule.
For Row.id, select-by-rule runs before gameplay state is read. The rule at Row.resolution declared in selects one complete copy before activation; only that copy proceeds, and fields are never merged. The test names the address and restates nothing from it.
- Given
two accepted complete shared copies that conflict under
Row.resolution declared in- When
- the cited selection rule resolves the conflict
- Then
- the rule at
Row.resolution declared inselects one complete copy before activation - only the selected copy's complete state can proceed; fields from candidates are never merged
- the rule at
- Diagnostics
Instance-candidate-setInstance-conflict-reportInstance-active-state-source
Row.id applies player-chooses-copy
conflict-player-chooses-copy
Applies when row response is Player chooses copy.
For Row.id, player-chooses-copy runs before gameplay state is read. No candidate state activates before the player chooses one complete copy; the chosen copy proceeds, and fields are never merged. The test names the address and restates nothing from it.
- Given
two accepted complete shared copies that conflict under
Row.resolution declared in- When
- the player first waits without choosing and then chooses one candidate
- Then
- no candidate state activates before the player chooses one complete copy
- the chosen complete copy proceeds and fields from candidates are never merged
- Diagnostics
Instance-candidate-setInstance-conflict-reportInstance-active-state-source
Row.id applies refuse-until-resolved
conflict-refuse-until-resolved
Applies when row response is Refuse until resolved.
For Row.id, refuse-until-resolved runs before gameplay state is read. No candidate activates while the conflict remains. After the cited clearing event at Row.resolution declared in, a load of the resulting accepted copy is no longer refused by this conflict. Fields are never merged. The test names the address and restates nothing from it.
- Given
two accepted complete shared copies that conflict under
Row.resolution declared in- When
- a load is attempted before and after the cited conflict-clearing event
- Then
- no candidate activates while the conflict remains
- after the cited clearing event at
Row.resolution declared in, a load of the resulting accepted copy is no longer refused by this conflict - fields are never merged
- Diagnostics
Instance-candidate-setInstance-conflict-reportInstance-active-state-source
Row.id applies its older-build refuse-load override
older-build-override-refuse-load
Applies when row older build copy is Refuse load.
Row.id overrides the older-build default and refuses before any mismatched-build state activates. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by an older build, with no unresolved conflict- When
- the player requests the copy
- Then
- loading stops before any state from the mismatched-build copy activates
- the refusal record distinguishes refusal by build mismatch from an absent or unreadable copy
- Diagnostics
Instance-writer-and-reader-buildsInstance-load-resultInstance-active-state-source
Row.id applies the older-build refuse-load default
older-build-default-refuse-load
Applies when Older build default is Refuse load and row older build copy is Use game default.
Row.id uses the older-build default and refuses before any mismatched-build state activates. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by an older build, with no unresolved conflict- When
- the player requests the copy
- Then
- loading stops before any state from the mismatched-build copy activates
- the refusal record distinguishes refusal by build mismatch from an absent or unreadable copy
- Diagnostics
Instance-writer-and-reader-buildsInstance-load-resultInstance-active-state-source
Row.id applies its older-build convert-and-load override
older-build-override-convert-and-load
Applies when row older build copy is Convert and load.
Row.id overrides the older-build default and converts to one coherent current-build copy before successful activation; a failed conversion refuses and preserves the source unless its cited rule records otherwise. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by an older build, with no unresolved conflict- When
- one conversion succeeds and a second constructed conversion fails
- Then
- the successful conversion produces one coherent current-build copy before all of its carried families activate together
- the failed conversion refuses activation and leaves the source copy unchanged unless its cited rule records another disposition
- the conversion record distinguishes success, refusal, and source-copy disposition
- Diagnostics
Instance-writer-and-reader-buildsInstance-conversion-resultInstance-load-resultInstance-active-state-source
Row.id applies the older-build convert-and-load default
older-build-default-convert-and-load
Applies when Older build default is Convert and load and row older build copy is Use game default.
Row.id uses the older-build default and converts to one coherent current-build copy before successful activation; a failed conversion refuses and preserves the source unless its cited rule records otherwise. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by an older build, with no unresolved conflict- When
- one conversion succeeds and a second constructed conversion fails
- Then
- the successful conversion produces one coherent current-build copy before all of its carried families activate together
- the failed conversion refuses activation and leaves the source copy unchanged unless its cited rule records another disposition
- the conversion record distinguishes success, refusal, and source-copy disposition
- Diagnostics
Instance-writer-and-reader-buildsInstance-conversion-resultInstance-load-resultInstance-active-state-source
Row.id applies its older-build warn-and-load override
older-build-override-warn-and-load
Applies when row older build copy is Warn and load.
Row.id overrides the older-build default and warns before the attempt; cancellation activates nothing, and acceptance is recorded separately from success. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by an older build, with no unresolved conflict- When
- the player first cancels the warning, then accepts a successful attempt, and finally accepts a constructed failed attempt
- Then
- cancelling activates no state
- the warning precedes both accepted attempts; the successful attempt activates every carried family together and the failed attempt activates none
- warning acceptance is recorded separately from load success
- Diagnostics
Instance-writer-and-reader-buildsInstance-warning-choiceInstance-load-resultInstance-active-state-source
Row.id applies the older-build warn-and-load default
older-build-default-warn-and-load
Applies when Older build default is Warn and load and row older build copy is Use game default.
Row.id uses the older-build default and warns before the attempt; cancellation activates nothing, and acceptance is recorded separately from success. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by an older build, with no unresolved conflict- When
- the player first cancels the warning, then accepts a successful attempt, and finally accepts a constructed failed attempt
- Then
- cancelling activates no state
- the warning precedes both accepted attempts; the successful attempt activates every carried family together and the failed attempt activates none
- warning acceptance is recorded separately from load success
- Diagnostics
Instance-writer-and-reader-buildsInstance-warning-choiceInstance-load-resultInstance-active-state-source
Row.id applies its newer-build refuse-load override
newer-build-override-refuse-load
Applies when row newer build copy is Refuse load.
Row.id overrides the newer-build default and refuses before any mismatched-build state activates. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by a newer build, with no unresolved conflict- When
- the player requests the copy
- Then
- loading stops before any state from the mismatched-build copy activates
- the refusal record distinguishes refusal from an absent or unreadable copy
- Diagnostics
Instance-writer-and-reader-buildsInstance-load-resultInstance-active-state-source
Row.id applies the newer-build refuse-load default
newer-build-default-refuse-load
Applies when Newer build default is Refuse load and row newer build copy is Use game default.
Row.id uses the newer-build default and refuses before any mismatched-build state activates. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by a newer build, with no unresolved conflict- When
- the player requests the copy
- Then
- loading stops before any state from the mismatched-build copy activates
- the refusal record distinguishes refusal from an absent or unreadable copy
- Diagnostics
Instance-writer-and-reader-buildsInstance-load-resultInstance-active-state-source
Row.id applies its newer-build warn-and-load override
newer-build-override-warn-and-load
Applies when row newer build copy is Warn and load.
Row.id overrides the newer-build default and warns before the attempt; cancellation activates nothing, and acceptance is recorded separately from success. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by a newer build, with no unresolved conflict- When
- the player first cancels the warning, then accepts a successful attempt, and finally accepts a constructed failed attempt
- Then
- cancelling activates no state
- the warning precedes both accepted attempts; the successful attempt activates every carried family together and the failed attempt activates none
- warning acceptance is recorded separately from load success, and the failed attempt is distinguished from an absent or unreadable copy
- Diagnostics
Instance-writer-and-reader-buildsInstance-warning-choiceInstance-load-resultInstance-active-state-source
Row.id applies the newer-build warn-and-load default
newer-build-default-warn-and-load
Applies when Newer build default is Warn and load and row newer build copy is Use game default.
Row.id uses the newer-build default and warns before the attempt; cancellation activates nothing, and acceptance is recorded separately from success. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected readable copy of kind
Row.idwritten by a newer build, with no unresolved conflict- When
- the player first cancels the warning, then accepts a successful attempt, and finally accepts a constructed failed attempt
- Then
- cancelling activates no state
- the warning precedes both accepted attempts; the successful attempt activates every carried family together and the failed attempt activates none
- warning acceptance is recorded separately from load success, and the failed attempt is distinguished from an absent or unreadable copy
- Diagnostics
Instance-writer-and-reader-buildsInstance-warning-choiceInstance-load-resultInstance-active-state-source
Row.id applies its unreadable-copy refuse-load override
unreadable-copy-override-refuse-load
Applies when row unreadable copy is Refuse load.
Row.id overrides the unreadable-copy default and refuses the load without activating, replacing, or repairing unreadable state. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the player requests the unreadable copy
- Then
- no state from the unreadable copy becomes active
- the unreadable copy is neither replaced nor repaired by this response
- the load result distinguishes refusal from an absent copy
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies the unreadable-copy refuse-load default
unreadable-copy-default-refuse-load
Applies when Unreadable copy default is Refuse load and row unreadable copy is Use game default.
Row.id uses the unreadable-copy default and refuses the load without activating, replacing, or repairing unreadable state. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the player requests the unreadable copy
- Then
- no state from the unreadable copy becomes active
- the unreadable copy is neither replaced nor repaired by this response
- the load result distinguishes refusal from an absent copy
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies its unreadable-copy start-fresh override
unreadable-copy-override-start-fresh
Applies when row unreadable copy is Start fresh.
Row.id overrides the unreadable-copy default and activates the adoption's fresh state without silently deleting or overwriting the unreadable copy. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the player requests the unreadable copy
- Then
- the fresh state fixed by the adoption becomes active instead of state from the unreadable copy
- the unreadable copy is not silently deleted or overwritten
- the source and removal records distinguish a fresh start from deletion
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies the unreadable-copy start-fresh default
unreadable-copy-default-start-fresh
Applies when Unreadable copy default is Start fresh and row unreadable copy is Use game default.
Row.id uses the unreadable-copy default and activates the adoption's fresh state without silently deleting or overwriting the unreadable copy. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the player requests the unreadable copy
- Then
- the fresh state fixed by the adoption becomes active instead of state from the unreadable copy
- the unreadable copy is not silently deleted or overwritten
- the source and removal records distinguish a fresh start from deletion
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies its unreadable-copy restore-earlier-copy override
unreadable-copy-override-restore-earlier-copy
Applies when row unreadable copy is Restore earlier copy.
Row.id overrides the unreadable-copy default and uses the matching backup row to activate the newest usable earlier copy and report the lost interval. Where none can be produced, the result follows the cited recovery rule and activates no state from the unreadable copy. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the supported recovery route selects the newest usable earlier copy under the matching backup row
- Then
- the selected earlier copy becomes active as one complete copy
- the damage report identifies the selected earlier commit and the lost interval
- where no usable earlier copy can be produced, the result follows the cited recovery rule and activates no state from the unreadable copy
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies the unreadable-copy restore-earlier-copy default
unreadable-copy-default-restore-earlier-copy
Applies when Unreadable copy default is Restore earlier copy and row unreadable copy is Use game default.
Row.id uses the unreadable-copy default and uses the matching backup row to activate the newest usable earlier copy and report the lost interval. Where none can be produced, the result follows the cited recovery rule and activates no state from the unreadable copy. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the supported recovery route selects the newest usable earlier copy under the matching backup row
- Then
- the selected earlier copy becomes active as one complete copy
- the damage report identifies the selected earlier commit and the lost interval
- where no usable earlier copy can be produced, the result follows the cited recovery rule and activates no state from the unreadable copy
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies its unreadable-copy repair-readable-state override
unreadable-copy-override-repair-readable-state
Applies when row unreadable copy is Repair readable state.
Row.id overrides the unreadable-copy default and activates one coherent repaired result with every unreadable part reset under the cited rule; failure refuses. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- one repair produces a coherent result and a second constructed repair cannot do so
- Then
- the successful repair activates one coherent result containing every readable part and the fresh value for every unreadable part under the cited repair rule
- the failed repair refuses and activates no state
- the repair record distinguishes retained readable parts, reset parts, and failure
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies the unreadable-copy repair-readable-state default
unreadable-copy-default-repair-readable-state
Applies when Unreadable copy default is Repair readable state and row unreadable copy is Use game default.
Row.id uses the unreadable-copy default and activates one coherent repaired result with every unreadable part reset under the cited rule; failure refuses. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- one repair produces a coherent result and a second constructed repair cannot do so
- Then
- the successful repair activates one coherent result containing every readable part and the fresh value for every unreadable part under the cited repair rule
- the failed repair refuses and activates no state
- the repair record distinguishes retained readable parts, reset parts, and failure
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies its unreadable-copy warn-and-try override
unreadable-copy-override-warn-and-try
Applies when row unreadable copy is Warn and try.
Row.id overrides the unreadable-copy default and waits for an explicit choice; cancellation activates nothing, and acceptance is recorded separately from success. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the player first cancels the warning, then accepts a successful attempt, and finally accepts a constructed failed attempt
- Then
- no copy state activates before the explicit choice and cancellation activates nothing
- the successful accepted attempt activates one coherent copy and the failed accepted attempt activates none
- warning acceptance is recorded separately from load success
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id applies the unreadable-copy warn-and-try default
unreadable-copy-default-warn-and-try
Applies when Unreadable copy default is Warn and try and row unreadable copy is Use game default.
Row.id uses the unreadable-copy default and waits for an explicit choice; cancellation activates nothing, and acceptance is recorded separately from success. The observable consequence is fixed here; the test restates nothing from the adoption's cited rule.
- Given
a selected copy of kind
Row.idwhose gameplay body is unreadable after conflict and build settlement- When
- the player first cancels the warning, then accepts a successful attempt, and finally accepts a constructed failed attempt
- Then
- no copy state activates before the explicit choice and cancellation activates nothing
- the successful accepted attempt activates one coherent copy and the failed accepted attempt activates none
- warning acceptance is recorded separately from load success
- Diagnostics
Instance-damage-reportInstance-load-resultInstance-active-state-sourceInstance-removal-log
Row.id retains and restores earlier copies
backup-retains-orders-and-restores-earlier-copies
Applies for every adoption
Row.id retains and orders earlier copies under Row.backup rule declared in. Its direct player route at Row.restore rule declared in opens the newest usable one and reports the lost interval, independently of damage settlement. The test names both addresses and restates nothing from them.
- Given
several earlier commits for the copy kind named by
Row.copy kind, including usable and unusable candidates- When
- the game applies
Row.backup rule declared inand the player directly usesRow.restore rule declared in
- the game applies
- Then
- earlier commits are retained and ordered only as
Row.backup rule declared inand the storage rule of the copy kind named at copy-kind provide - the newest usable earlier copy becomes active as one complete copy and the lost interval is reported
- the direct route at
Row.restore rule declared inremains available independently of any damage response
- earlier commits are retained and ordered only as
- Diagnostics
Instance-backup-inventoryInstance-load-resultInstance-damage-report
Row.id loads a readable compatible conflict-free copy
readable-compatible-copy-activates-together
Applies for every adoption
A readable, same-build, conflict-free copy of kind Row.id loads successfully and activates every family at Row.contains declared in together from one commit. The test names the address and restates nothing from it.
- Given
a selected readable copy of kind
Row.idfrom the running build with no conflict, carrying distinguishable values for every family atRow.contains declared in- When
- the game loads the copy
- Then
- the load is accepted rather than refused
- every carried state family activates together from one commit
- no partial copy is visible at any point
- Diagnostics
Instance-load-resultInstance-active-state-sourceInstance-activation-trace
loading Row.id preserves state from other copy kinds
load-preserves-families-from-other-kinds
Applies for every adoption
Loading Row.id activates its carried families together and preserves the active value of every family saved in another kind. If no other kind exists, that clause asserts nothing.
- Given
active distinguishable state from
Row.idand, where the adoption declares one, another copy kind- When
- a readable compatible conflict-free copy of kind
Row.idloads successfully
- a readable compatible conflict-free copy of kind
- Then
- families carried by
Row.idactivate together from its selected commit - families saved in another copy kind keep that kind's already active value
- where no other copy kind exists, the second clause asserts nothing
- families carried by
- Diagnostics
Instance-activation-traceInstance-active-state-source
Row.id is never restored when it names no save kind
family-without-saved-in-is-never-restored
Applies for every adoption
For Row.id, when it has no saved-in, no return path restores its earlier value. For Row.id, when it names saved-in, only an accepted load of that copy kind restores its earlier value; no other return path does.
- Given
a distinguishable earlier
Row.idvalue and every return path the adoption can construct- When
- the return paths complete
- Then
- where
Row.idhas no saved-in, none of the return paths restores its earlier value - where
Row.idnames saved-in, its earlier value is restored only by an accepted load of that copy kind and by no other return path
- where
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id follows its after-load result
earlier-point-follows-after-load
Applies when row after load is Resume stays or Resume is used once or Player mode decides.
After successful activation, Row.id returns play to Row.return rule declared in and keeps the run identity when the point is inside a run. Then Bind reuse. The test names the address and restates nothing from it.
- Given
an accepted copy of the copy kind
Row.copy kindand an earlier point atRow.return rule declared in- When
- activation succeeds and the player attempts the return twice
- Then
- continuous play returns to the cited earlier point only after successful activation
- each return the row's after-load result permits retains the same run identity when the point is inside a run
Bind reuse
- Diagnostics
Instance-load-resultInstance-return-pointInstance-run-identityInstance-save-availability-after-load
Row.id returns nowhere without an earlier-point row
missing-earlier-point-row-returns-nowhere
Applies for every adoption
A successful Row.id load returns continuous play nowhere under this contract when no earlier-point row names it. When one does, this test asserts nothing.
- Given
a successful
Row.idload- When
- the game checks for an earlier-point-returns row after activation
- Then
- where no row names
Row.id, this contract returns continuous play to no earlier point - where a row names
Row.id, this test asserts nothing
- where no row names
- Diagnostics
Instance-load-resultInstance-return-point
Row.id exists only in its named modes
earlier-point-mode-gate-controls-existence
Applies when row mode gated is Only in named modes.
Row.id exists only while Row.mode rule declared in permits it. The test asserts nothing about changing the mode mid-profile. It names the address and restates nothing from it.
- Given
modes allowed and excluded by
Row.mode rule declared in- When
- the player looks for
Row.idin each mode before loading
- the player looks for
- Then
Row.idexists in every allowed mode and is absent in every excluded mode- a mode change during an existing profile is outside this declaration and this test asserts nothing about that transition
- Diagnostics
Instance-mode-traceInstance-return-point
Row.id follows its death result
death-follows-family-result
Applies when row after death is Keeps value or Clears value.
On death, Row.id follows its selected result: Bind result.
- Given
a distinguishable
Row.idvalue immediately before death- When
- death settles before any death-triggered copy removal the adoption declares
- Then
Bind result
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id clears when death is its run end
death-at-run-end-clears-run-family
Applies when row lifetime is Run.
If death is the run end at Row.scope ends in, Row.id clears even without a save action. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue before a death, where the run ending atRow.scope ends inis death- When
- death occurs without another save action
- Then
- if the cited end at
Row.scope ends inis death, the earlier run-lifetime value clears before later play even without a save action; if the cited end is not death, this test asserts nothing
- if the cited end at
- Diagnostics
Instance-state-boundary-traceInstance-run-identity
Row.id clears when death is its cited event
death-at-until-event-clears-family
Applies when row lifetime is Until event.
If death is the event at Row.lifetime event declared in, Row.id clears before later play. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue before death- When
- death occurs, where death is the event cited at
Row.lifetime event declared in
- death occurs, where death is the event cited at
- Then
- if the cited event at
Row.lifetime event declared inis death, the earlier value clears before later play; if the cited event is not death, this test asserts nothing
- if the cited event at
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id follows its slot-deletion result
slot-deletion-follows-family-result
Applies when row after slot delete is Keeps value or Clears value or No slot.
On slot deletion, Row.id follows its selected result: Bind result.
- Given
Bind case- When
Bind action
- Then
Bind result
- Diagnostics
Instance-state-boundary-traceInstance-settlement-report
Row.id follows its local-profile-deletion result
local-profile-deletion-follows-family-result
Applies when row after local profile delete is Keeps value or Clears value or No profile.
On local-profile deletion, Row.id follows its selected result: Bind result. Where a related profile exists, child slots are included only as the adoption's cited rule provides; otherwise that clause asserts nothing. The test restates nothing from the cited rule.
- Given
Bind case- When
Bind action
- Then
Bind result
- Diagnostics
Instance-state-boundary-traceInstance-settlement-reportInstance-removal-log
Row.id ends when device data is deleted
device-lifetime-ends-at-device-data-deletion
Applies when row lifetime is Device.
Device-data deletion ends Row.id through Row.scope ends in. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue before device-data deletion- When
- the event at
Row.scope ends indeletes device data
- the event at
- Then
- the earlier device-lifetime value ends and cannot affect later play
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id ends when its account is deleted or reset
account-lifetime-ends-at-account-deletion
Applies when row lifetime is Account.
Account deletion or reset ends Row.id through Row.scope ends in. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue before account deletion or reset- When
- the event at
Row.scope ends indeletes or resets the account
- the event at
- Then
- the earlier account-lifetime value ends and cannot affect later play
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
Row.id returns on another eligible device
another-device-returns-family
Applies when row on another device is Returns.
On another eligible device, Row.id is obtained from its synced or authoritative copy before activation. Conflict handling still runs and applies the response of the conflict row that matches that copy kind; where no row matches, that clause asserts nothing. The device change does not delete any source-device copy; if none exists, that clause asserts nothing.
- Given
a distinguishable
Row.idvalue on one device before the same eligible player continues on another- When
- the new device settles available state
- Then
- the family is obtained from its synced or authoritative copy before activation and conflict handling still runs, applying the response of the conflict row that matches that copy kind; where no conflict row matches it, that clause asserts nothing
- any source-device copy is not deleted by the device change; where none exists, this clause asserts nothing
- Diagnostics
Instance-candidate-setInstance-conflict-reportInstance-active-state-sourceInstance-removal-log
Row.id does not return on another device
another-device-does-not-return-family
Applies when row on another device is Does not return.
On another eligible device, the earlier Row.id value does not return. Its new-device value follows Row.state declared in. The device change does not delete any source-device copy; if none exists, that clause asserts nothing. The test names the address and restates nothing from it.
- Given
a distinguishable
Row.idvalue on one device before the same eligible player continues on another- When
- the new device settles available state
- Then
- the earlier value does not activate and the family starts from the new-device value governed at
Row.state declared in - any source-device copy is not deleted by the device change; where none exists, this clause asserts nothing
- the earlier value does not activate and the family starts from the new-device value governed at
- Diagnostics
Instance-state-boundary-traceInstance-active-state-sourceInstance-removal-log
Row.id disappears at its removal event
removed-copy-disappears-at-selected-event
Applies when row removed at is Normal quit or Crash or Death or Slot delete or Local profile delete or Device data delete or Account delete.
At Bind event, Row.id disappears from later load choices Bind order under Row.removal rule declared in. The record distinguishes removal from refusal or failure. The test names the address and restates nothing from it.
- Given
a visible
Row.idload choice beforeBind event- When
Bind eventoccurs underRow.removal rule declared in
- Then
- the affected copy disappears from later load choices
Bind order - the removal log records the event and distinguishes removal from a refused or failed load
- the affected copy disappears from later load choices
- Diagnostics
Instance-removal-logInstance-load-result
Row.id exists only in its named modes
copy-kind-mode-gate-controls-existence
Applies when row mode gated is Only in named modes.
Row.id exists only while Row.mode rule declared in permits it. The test asserts nothing about changing the mode mid-profile. It names the address and restates nothing from it.
- Given
modes allowed and excluded by
Row.mode rule declared in- When
- the player looks for
Row.idin each mode
- the player looks for
- Then
Row.idexists in every allowed mode and is absent in every excluded mode- a mode change during an existing profile is outside this declaration and this test asserts nothing about that transition
- Diagnostics
Instance-mode-traceInstance-candidate-set
ended and cleared values stay absent
cleared-or-ended-value-never-affects-later-play
Applies for every adoption
After a lifetime ends or a boundary result clears a value, that earlier value never affects later play. An equal value derived later is new state. If no such case can be constructed, the test asserts nothing.
- Given
every event the
Instanceadoption can construct where a lifetime ends or a boundary result clears an earlier value- When
- later play reaches points where an equal value can be derived
- Then
- the earlier value never affects later play after the end or clearing event
- any equal value derived later is recorded as new state rather than restoration
- where the adoption can construct no such event, this test asserts nothing
- Diagnostics
Instance-state-boundary-traceInstance-active-state-source
every settlement report records its complete result
settlement-report-is-complete
Applies for every adoption
Every settlement report carries the mechanism's full identity, boundary, commit, selection, response, result, and loss fields. Conflict and damage reports add their required facts and never claim an unattempted success. A clause for a case the adoption cannot construct asserts nothing.
- Given
each persistence settlement the
Instanceadoption can construct- When
- the settlement completes or refuses
- Then
- the report identifies state-family id, copy-kind id or its absence, event, scope before and after, last successful commit when read, selected copy and build when loaded, override or default used, state result, and any lost interval
- a conflict report also identifies both candidate commits and the selected response
- a damage report identifies refusal, fresh state, earlier-copy recovery, repaired parts, or warning choice and never claims an unattempted load succeeded
- where a conflict, damage case, load, or answered question does not arise, its corresponding clause asserts nothing
- Diagnostics
Instance-settlement-reportInstance-conflict-reportInstance-damage-report
declaration check: Row.id's state citation states its duty
state-family-citation-states-its-duty
Applies for every adoption
This declaration check reads the adoption and cited prose, not the running game. Row.state declared in must name every field in Row.id and every point where it can affect later play. For a family that answers does-not-return after a quit, a crash, or on another device, it must also name the value the family starts from; otherwise that clause asserts nothing. 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.state declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.state declared innames every field in this state family and every point where it can affect later play- where the row answers does-not-return after a quit, a crash, or on another device,
Row.state declared inalso names the value the family starts from; where it never gives that answer for those cases, this clause asserts nothing - another meaning is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id names an existing copy kind when saved
saved-in-joins-a-copy-kind
Applies for every adoption
This declaration check reads the adoption, not the running game. When Row.id has saved-in, it must name exactly one copy kind in this adoption; any other name is a defect this test fails by construction. With no saved-in, this check asserts nothing. It says nothing about a family held in two places at once; one family names one restoring save kind.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer reads
Row.id's saved-in field
- a reviewer reads
- Then
- where saved-in is present, it names exactly one copy-kinds row in this adoption; another name is a defect this test fails by construction
- where saved-in is absent, this join check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: Row.id names an existing copy kind
backup-copy-kind-joins
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.copy kind must name exactly one copy kind in this adoption. Any other name is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.copy kindwith copy-kinds ids
- a reviewer compares
- Then
Row.copy kindnames exactly one copy-kinds row in this adoption; another name is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id names an existing shared copy kind
conflict-copy-kind-joins
Applies when row scope is This copy kind.
This declaration check reads the adoption, not the running game. Row.copy kind must name exactly one shared copy kind 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.copy kindwith copy-kinds ids and residences
- a reviewer compares
- Then
Row.copy kindnames exactly one cloud-synced or server-authoritative copy-kinds row in this adoption; another shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id names an existing copy kind
earlier-point-copy-kind-joins
Applies for every adoption
This declaration check reads the adoption, not the running game. Row.copy kind must name exactly one copy kind in this adoption. Any other name is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.copy kindwith copy-kinds ids
- a reviewer compares
- Then
Row.copy kindnames exactly one copy-kinds row in this adoption; another name is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id names account deletion or reset as its end
account-family-names-account-ending
Applies when row lifetime is Account.
This declaration check reads the adoption and cited prose, not the running game. Row.scope ends in must name account deletion or reset. 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.scope ends in, not the running game- When
- a reviewer checks the meaning of the cited ending
- Then
Row.scope ends innames account deletion or reset; another meaning is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's restore-earlier-copy override has a backup row
restore-earlier-override-has-backup
Applies when row unreadable copy is Restore earlier copy.
This declaration check reads the adoption, not the running game. The Row.id override that restores an earlier copy requires a matching backup row. Absence is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.idwith backup-copies copy-kind fields
- a reviewer compares
- Then
- at least one backup-copies row names
Row.id; absence is a defect this test fails by construction
- at least one backup-copies row names
- Diagnostics
Instance-declaration-record
declaration check: Row.id's restore-earlier-copy default has a backup row
restore-earlier-default-has-backup
Applies when Unreadable copy default is Restore earlier copy and row unreadable copy is Use game default.
This declaration check reads the adoption, not the running game. The Row.id default that restores an earlier copy requires a matching backup row. Absence is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer compares
Row.idwith backup-copies copy-kind fields
- a reviewer compares
- Then
- at least one backup-copies row names
Row.id; absence is a defect this test fails by construction
- at least one backup-copies row names
- Diagnostics
Instance-declaration-record
declaration check: Row.id returns from a shared authority
returning-family-uses-shared-authority
Applies when row on another device is Returns.
This declaration check reads the adoption, not the running game. A returning Row.id family must name exactly one cloud-synced or server-authoritative restoring kind. Any other shape is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer follows
Row.id's saved-in name to a copy-kinds row
- a reviewer follows
- Then
- saved-in is present and names exactly one cloud-synced or server-authoritative copy kind; another shape is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: each conflict scope has at most one row
one-conflict-row-per-scope
Applies for every adoption
This declaration check reads the adoption, not the running game. Each represented conflict scope has at most one row. A duplicate is a defect this test fails by construction. With no conflict rows, the check asserts nothing.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer groups copy-conflicts rows by a this-copy-kind name or the all-synced-kinds scope
- Then
- no declared scope has more than one conflict row; a duplicate scope is a defect this test fails by construction; with no conflict rows, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: each copy kind has at most one earlier-point row
one-earlier-point-row-per-copy-kind
Applies for every adoption
This declaration check reads the adoption, not the running game. Each copy kind has at most one earlier-point row. A duplicate is a defect this test fails by construction. With no such rows, the check asserts nothing.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer groups earlier-point-returns rows by copy-kind
- Then
- no copy kind is named by more than one earlier-point-returns row; a duplicate is a defect this test fails by construction; with no such rows, this check asserts nothing
- Diagnostics
Instance-declaration-record
declaration check: Row.id's required citations state their duties
copy-citations-state-their-duties
Applies for every adoption
This declaration check reads the adoption and cited prose, not the running game. Row.contains declared in, Row.write rule declared in, and Row.storage rule declared in must state their family-set, write-success and loss-window, and applicable residence, authority, identity, and selection duties. A missing duty is a defect this test fails by construction. The test names the addresses and restates nothing from them.
- Given
the
Instanceadoption and the prose atRow.contains declared in,Row.write rule declared in, andRow.storage rule declared in, not the running game- When
- a reviewer checks each citation's meaning
- Then
Row.contains declared innames the complete family set written and restored togetherRow.write rule declared innames the trigger, success condition, final-write behavior, and quit or crash loss windowRow.storage rule declared innames residence, applicable sync or service acceptance and authority, layout, identities, and player selection- a citation missing its duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's backup citations state their duties
backup-citations-state-their-duties
Applies for every adoption
This declaration check reads the adoption and cited prose, not the running game. Row.backup rule declared in must state retention, ordering, usable selection, and loss duties; Row.restore rule declared in must state the direct restore route. A missing duty is a defect this test fails by construction. The test names both addresses and restates nothing from them.
- Given
the
Instanceadoption and the prose atRow.backup rule declared inandRow.restore rule declared in, not the running game- When
- a reviewer checks each citation's meaning
- Then
Row.backup rule declared innames retention, ordering, usable selection, and the possible lost intervalRow.restore rule declared innames the supported direct restore route- a citation missing its duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's resolution citation states its duties
conflict-citation-states-its-duties
Applies for every adoption
This declaration check reads the adoption and cited prose, not the running game. Row.resolution declared in must state disagreement, identity, complete-copy handling, and clearing duties. 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.resolution declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.resolution declared innames disagreement detection, identity comparison, complete-copy selection or preservation, and the conflict-clearing event- a citation missing a duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's return citation states its duties
earlier-return-citation-states-its-duties
Applies for every adoption
This declaration check reads the adoption and cited prose, not the running game. Row.return rule declared in must state the point, activation, run-identity, and reuse duties. 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.return rule declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.return rule declared innames the earlier point, successful activation, run identity when applicable, and whether another load remains possible- a citation missing a duty is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's removal citation states its duty
copy-removal-citation-states-its-duty
Applies when row removed at is Normal quit or Crash or Death or Slot delete or Local profile delete or Device data delete or Account delete.
This declaration check reads the adoption and cited prose, not the running game. Row.removal rule declared in must state the exact removal event and visible result. 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.removal rule declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.removal rule declared innames the exact removal event and what the player sees afterward- another meaning is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's mode citation states its duty
copy-mode-citation-states-its-duty
Applies when row mode gated is Only in named modes.
This declaration check reads the adoption and cited prose, not the running game. Row.mode rule declared in must name all allowed modes and confirm absence elsewhere. 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.mode rule declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.mode rule declared innames every mode where the copy kind exists and confirms absence elsewhere- another meaning is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's player-mode return is mode-gated
player-mode-return-is-mode-gated
Applies when row after load is Player mode decides.
This declaration check reads the adoption, not the running game. Row.id must be mode-gated: only-in-named-modes and cite its mode rule. A player-mode-decides row with no mode gate is a defect this test fails by construction.
- Given
the
Instanceadoption document, not the running game- When
- a reviewer checks the player-mode return's mode gate and mode-rule citation
- Then
Row.idis mode-gated: only-in-named-modes and cites its mode rule; a player-mode-decides row with no mode gate is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
declaration check: Row.id's mode citation states its duty
earlier-point-mode-citation-states-its-duty
Applies when row mode gated is Only in named modes.
This declaration check reads the adoption and cited prose, not the running game. Row.mode rule declared in must name all allowed modes and confirm absence elsewhere. 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.mode rule declared in, not the running game- When
- a reviewer checks the citation's meaning
- Then
Row.mode rule declared innames every mode where the earlier point exists and confirms absence elsewhere- another meaning is a defect this test fails by construction
- Diagnostics
Instance-declaration-record
the persistence mechanism holds for the whole run
persistence-holds
Applies for every adoption
Across Inputs scope, each family's value on both sides of every constructed boundary matches its row and the numbered settlement order holds. Every load the adoption can construct refuses partial state and activates all carried families together only when accepted. A case the adoption cannot construct asserts nothing. The pack's default audit seeds apply unless the adoption supplies its own.
- Holds
every state family's distinguishable value on both sides of every constructed boundary matched its row; every commit, candidate, conflict, build comparison, damage response, activation, earlier return, deletion, device return, and settlement report that the adoption constructed followed the mechanism's numbered order; every constructed load that was partial or refused activated no state; every accepted load activated all carried families together; where the adoption can construct no load, conflict, damage, build mismatch, or earlier return, that clause asserts nothing
- Seeds
Inputs seeds- Scope
Inputs scope- Diagnostics
Instance-state-boundary-traceInstance-commit-logInstance-candidate-setInstance-settlement-traceInstance-load-resultInstance-active-state-sourceInstance-settlement-reportInstance-first-ordering-violation