Roguelike daily run
roguelike-daily-run · an adoption of Replay scope, version 2
Use in your package
The first button opens the authoring tool with these answers and numbers already filled in. You still add the rules and tuning of your own game.
What is in the zip file
The zip file holds the adoption and its acceptance tests. In the authoring tool, choose Add contract and pick this zip file. If you edit your package outside the authoring tool, unpack the zip file in your package folder. The files of the zip file go into contracts/.
The contract that this adoption uses
This contract covers racing ghosts, daily seeds, observer replays, solution shares, and other recorded reruns. It decides what the record contains, whether the game can still play the record after an update, what must match, and what happens at the first difference. This contract does not cover input encoding, random-number methods, storage, cameras, or networking.
Questions
The supplied answer is marked on each question. Pick other answers to see what changes. Nothing is saved here: the zip file and the authoring tool use the supplied answers.
What does this replay need to run again?
Why this is asked
A daily seed recreates a challenge. A racing ghost also needs the driver's recorded inputs.
What happens to a recorded replay after the game updates?
Why this is asked
A patch can change rules, content, or timing. The replay needs a clear version promise before playback starts.
What happens at the first difference between the replay and the record?
Why this is asked
A replay can stop, continue with a warning, or continue without showing the difference.
Numbers1 number
Each value is either a number set here or a reference to a decided number in your tuning. It cannot reference an open number.
Allowed position gap
allowed-position-gap
The greatest allowed distance between recorded and replayed positions, in the position unit named by every position claim in this adoption.
Not used by this adoption. It applies when some reproduction claims row has matching standard Allowed position gap.
Rules1 rule
A rule is a check between the numbers. Validation reports a rule that fails.
-
Forbidden when After an update is Best effort with declared divergence and Divergence response is Continue silently.
Lists2 lists
Each list holds the rows this adoption supplies. A list can be empty.
Replay record
replay-record
| Id | Recording declared in | Input clock declared in | Fixed start declared in | Migration declared in | Cross version divergence declared in | Difference report declared in |
|---|---|---|---|---|---|---|
daily-run | daily.seed-and-reference-capture | — | — | — | — | daily.run-comparison |
Reproduction claims
reproduction-claims
| Id | Artifact | Platform reach | Shifts with live input | Live input dependence declared in | Matching standard | Reproduces | Excludes | Conditions | Comparison points |
|---|---|---|---|---|---|---|---|---|---|
dungeon-layout | daily dungeon layout | every-supported-platform | seed-fixes-this-claim | — | bit-exact-state | daily.dungeon-layout-result | daily.dungeon-layout-exclusions | daily.dungeon-layout-conditions | daily.floor-generation-checks |
boss-reward | daily boss reward | every-supported-platform | live-input-may-shift-this-claim | daily.reward-input-history | outcome-equivalent | daily.boss-reward-result | daily.boss-reward-exclusions | daily.boss-reward-conditions | daily.boss-reward-check |
Test inputsscope and seeds
Some tests need a scope or seeds from the adoption before they can run.
This adoption supplies no test inputs. Every test uses its default inputs.
Acceptance tests43 tests apply
The contract comes with 48 tests. A test that runs once per row is counted once for each row. Tests that do not apply to these answers are still listed, with the reason.
sealed-record-carries-replay-identity · daily-run
daily-run sealed records carry the complete replay identity
Applies to the daily-run row.
Each sealed daily-run record has its own instance identity and carries, as named at daily.seed-and-reference-capture, the replay identity fields and the seed and no input log, together with every claim's captured reference or sealed recomputation source. A reference never comes from live play. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
a sealed record of replay kind
daily-runand its manifest atdaily.seed-and-reference-capture- When
- the record is inspected before playback
- Then
- the record carries its own stable instance identity, recording version, platform, content-set identity, settings and mod identity, the seed and no input log, and every reproduction claim's comparison reference or sealed source data for deterministic recomputation
- each comparison reference is captured during recording or deterministically recomputed from the sealed record, never obtained from live play
- Diagnostics
roguelike-daily-run-record-manifestroguelike-daily-run-reference-source
migrated-record-keeps-source-identity
a migrated record has its own identity and keeps its source
Does not apply to roguelike-daily-run: after an update is same version only, not migrate then replay.
playback-result-uses-closed-vocabulary
the terminal playback result uses the closed vocabulary
Applies to roguelike-daily-run.
roguelike-daily-run playback is in progress until it ends. Its terminal playback result is exactly one of diverged, rejected, or complete.
Test steps and diagnostics
- Given
each
roguelike-daily-runplayback from start until it ends- When
- the playback result is read before and after termination
- Then
- before termination the playback is in progress
- at termination the playback result is exactly one of diverged, rejected, or complete, and never two of them
- Diagnostics
roguelike-daily-run-playback-result
record-establishes-declared-start · daily-run
daily-run records its selected start before claimed results
Applies to the daily-run row.
The recording version, platform, content-set identity, settings, and mod identity are set from daily.seed-and-reference-capture before the first captured seed, start, or input and do not change during the recording. daily-run then captures the seed before any claimed seeded result is generated. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
a new
daily-runrecording about to begin, with its manifest atdaily.seed-and-reference-capture- When
- recording establishes its start
- Then
- the recorder captures the seed before any claimed seeded result is generated
- the recording version, platform, content-set identity, settings, and mod identity are set from
daily.seed-and-reference-capturebefore the first captured seed, start, or input and do not change during the recording
- Diagnostics
roguelike-daily-run-record-manifestroguelike-daily-run-recording-trace
input-log-captures-complete-action-order
Row.id captures every mapped action in cited order
Does not apply to roguelike-daily-run: replay record is seed only, not seed and input log or input log from fixed start.
seed-only-record-captures-no-input · daily-run
daily-run captures no input log
Applies to the daily-run row.
A sealed seed-only daily-run record carries its seed and no input log.
Test steps and diagnostics
- Given
a complete
daily-runrecording with player actions during its lifetime- When
- the sealed record is inspected
- Then
- the record carries its seed and no recorded input log
- Diagnostics
roguelike-daily-run-record-manifestroguelike-daily-run-input-log-trace
claim-records-reference-or-recomputation-source · dungeon-layout
dungeon-layout records its comparison reference source
Applies to the dungeon-layout row.
At every point cited at daily.floor-generation-checks, recording captures the reference dungeon-layout needs or all sealed data that the cited method of the replay-record row needs to recompute it. The record distinguishes those two sources. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
recording reaches each
dungeon-layoutcomparison point cited atdaily.floor-generation-checks- When
- the recorder handles the claim at that point
- Then
- the record captures the comparison reference required by
dungeon-layout's matching standard or all sealed source data required by the cited recomputation method of the replay-record row - the record distinguishes a captured reference from sealed recomputation source data
- the record captures the comparison reference required by
- Diagnostics
roguelike-daily-run-reference-sourceroguelike-daily-run-recording-trace
claim-records-reference-or-recomputation-source · boss-reward
boss-reward records its comparison reference source
Applies to the boss-reward row.
At every point cited at daily.boss-reward-check, recording captures the reference boss-reward needs or all sealed data that the cited method of the replay-record row needs to recompute it. The record distinguishes those two sources. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
recording reaches each
boss-rewardcomparison point cited atdaily.boss-reward-check- When
- the recorder handles the claim at that point
- Then
- the record captures the comparison reference required by
boss-reward's matching standard or all sealed source data required by the cited recomputation method of the replay-record row - the record distinguishes a captured reference from sealed recomputation source data
- the record captures the comparison reference required by
- Diagnostics
roguelike-daily-run-reference-sourceroguelike-daily-run-recording-trace
record-seals-at-boundary · daily-run
daily-run seals one immutable record at its boundary
Applies to the daily-run row.
At the boundary cited at daily.seed-and-reference-capture, daily-run seals its instance identity and contents. Any later edit creates a different instance of the same replay kind. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
one
daily-runrecording approaching the end boundary atdaily.seed-and-reference-capture- When
- capture reaches that boundary and a later edit is requested
- Then
- capture ends at the cited boundary and seals the record's instance identity and contents
- the later edit creates a different record instance of the same replay kind and leaves the sealed record unchanged
- Diagnostics
roguelike-daily-run-record-manifestroguelike-daily-run-recording-trace
record-wide-identity-precedes-consumption · daily-run
daily-run checks record-wide identity before consumption
Applies to the daily-run row.
Before consuming a seed, start, or input, daily-run reads the record identity at daily.seed-and-reference-capture and the cited compatibility conditions. When a record-wide identity that it carries fails, the game refuses the record through daily.run-comparison; neither an unchanged version id nor the update policy overrides a failed identity. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
sealed
daily-runrecords in which each record-wide identity this adoption carries fails in turn — content-set identity, settings, mods, and the fixed start where present — including a content patch whose version id is unchanged- When
- playback selection begins
- Then
- the version, platform, content-set identity, settings, and mod identity at
daily.seed-and-reference-captureand every cited compatibility condition are read before any seed, start, or input is consumed - for each failed record-wide identity that the adoption carries, the game refuses the record and presents the incompatibility report through
daily.run-comparisonbefore any seed, start, or input is consumed - the unchanged version id does not override the failed content identity
- the update policy does not override a failed identity
- the version, platform, content-set identity, settings, and mod identity at
- Diagnostics
roguelike-daily-run-identity-check-traceroguelike-daily-run-rejection-reportroguelike-daily-run-input-log-trace
compatible-record-is-played · daily-run
daily-run plays a compatible record
Applies to the daily-run row.
A sealed daily-run record whose complete replay identity matches the running game and whose cited compatibility conditions hold is played and not refused. Playback consumes the seed, start, or inputs that the record carries and reaches the result complete or diverged, never rejected.
Test steps and diagnostics
- Given
a sealed
daily-runrecord whose version, platform, content-set identity, settings, mods, and start all match the running game and whose cited compatibility conditions hold- When
- playback selection checks the compatible record
- Then
- the game does not refuse the record
- playback consumes the seed, start, or inputs the record carries
- playback reaches a terminal result that is complete or diverged, never rejected
- Diagnostics
roguelike-daily-run-identity-check-traceroguelike-daily-run-playback-result
recorded-platform-only-excludes-other-platforms
Row.id compares only on the recording platform
Does not apply to roguelike-daily-run: no row in reproduction-claims matches platform-reach recorded platform only.
every-supported-platform-excludes-only-unsupported-platforms · dungeon-layout
dungeon-layout compares on every supported platform
Applies to the dungeon-layout row.
Claim dungeon-layout remains eligible on every supported platform. It is excluded without divergence on an unsupported platform, and other eligible claims continue. The comparison log distinguishes exclusion from a match.
Test steps and diagnostics
- Given
dungeon-layoutplayback on each supported platform and on each unsupported running platform the adoption can construct- When
- claim platform reach is selected
- Then
dungeon-layoutremains eligible on every supported platform- on each constructible unsupported running platform it is not compared and cannot cause divergence, while every other eligible claim continues; where no unsupported running platform can be constructed, this test checks nothing in this step
- the comparison log distinguishes unsupported-platform exclusion from a match
- Diagnostics
roguelike-daily-run-platform-matrixroguelike-daily-run-comparison-log
every-supported-platform-excludes-only-unsupported-platforms · boss-reward
boss-reward compares on every supported platform
Applies to the boss-reward row.
Claim boss-reward remains eligible on every supported platform. It is excluded without divergence on an unsupported platform, and other eligible claims continue. The comparison log distinguishes exclusion from a match.
Test steps and diagnostics
- Given
boss-rewardplayback on each supported platform and on each unsupported running platform the adoption can construct- When
- claim platform reach is selected
- Then
boss-rewardremains eligible on every supported platform- on each constructible unsupported running platform it is not compared and cannot cause divergence, while every other eligible claim continues; where no unsupported running platform can be constructed, this test checks nothing in this step
- the comparison log distinguishes unsupported-platform exclusion from a match
- Diagnostics
roguelike-daily-run-platform-matrixroguelike-daily-run-comparison-log
same-version-only-rejects-version-mismatch · daily-run
daily-run refuses a record whose version differs from the running version
Applies to the daily-run row.
When version ids differ, same-version-only refuses the daily-run record through daily.run-comparison before a seed, start, or input is consumed. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
a sealed
daily-runrecord whose recorded version id differs from the running version id- When
- the update policy is applied
- Then
- the playback result becomes rejected and the incompatibility report is presented through
daily.run-comparison - no seed, start, or input is consumed
- the playback result becomes rejected and the incompatibility report is presented through
- Diagnostics
roguelike-daily-run-rejection-reportroguelike-daily-run-input-log-traceroguelike-daily-run-playback-result
migration-runs-once-before-playback
Row.id migrates once or refuses the record
Does not apply to roguelike-daily-run: after an update is same version only, not migrate then replay.
best-effort-presents-known-differences
Row.id presents the known changes between versions before playback
Does not apply to roguelike-daily-run: after an update is same version only, not best effort with declared divergence.
seeded-playback-recreates-start · daily-run
daily-run supplies the recorded seed or refuses the replay
Applies to the daily-run row.
Seeded daily-run playback supplies the recorded seed before generating a claimed seeded result. If the seed cannot be established, the game refuses the replay before any input is consumed.
Test steps and diagnostics
- Given
a playable
daily-runrecord, once with its recorded seed available and once with the required seed unavailable- When
- playback recreates the start
- Then
- the available run supplies the recorded seed before generating a claimed seeded result
- the playback result of the unavailable run becomes rejected before any input is consumed
- Diagnostics
roguelike-daily-run-start-traceroguelike-daily-run-playback-result
fixed-start-playback-verifies-or-restores
Row.id verifies or restores the fixed start
Does not apply to roguelike-daily-run: replay record is seed only, not input log from fixed start.
input-log-playback-consumes-cited-order
Row.id consumes recorded inputs in cited order
Does not apply to roguelike-daily-run: replay record is seed only, not seed and input log or input log from fixed start.
seed-only-playback-accepts-live-input · daily-run
daily-run accepts live input without a recorded log
Applies to the daily-run row.
Seed-only daily-run playback accepts live input and consumes no recorded input log. Each claim follows its own live-input answer.
Test steps and diagnostics
- Given
playable
daily-runrecords with the same seed and different live input histories- When
- playback runs
- Then
- each run accepts its live inputs and consumes no recorded input log
- each reproduction claim follows its own live-input answer
- Diagnostics
roguelike-daily-run-live-input-traceroguelike-daily-run-comparison-log
seed-fixed-claim-ignores-live-input-variation · dungeon-layout
dungeon-layout cannot change when live inputs vary
Applies to the dungeon-layout row.
With the same sealed seed-only record, varying live inputs cannot change dungeon-layout at the points cited at daily.floor-generation-checks. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
playbacks from the same sealed seed-only record with different live input histories
- When
dungeon-layoutis read at each comparison point atdaily.floor-generation-checks
- Then
- the result named for
dungeon-layoutdoes not change between runs
- the result named for
- Diagnostics
roguelike-daily-run-live-input-traceroguelike-daily-run-comparison-log
live-input-shifted-claim-reads-only-cited-facts · boss-reward
boss-reward reads only its cited live-input facts
Applies to the boss-reward row.
Claim boss-reward reads no live-input fact outside daily.reward-input-history. A difference permitted there is not compared and does not diverge; if that rule recomputes the actual-input reference, deterministic recomputation happens first. Comparison points are at daily.boss-reward-check. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
playbacks from the same sealed seed-only record whose live input histories vary inside and outside the facts at
daily.reward-input-history- When
boss-rewardreaches each comparison point atdaily.boss-reward-check
- Then
- the claimed result reads no live-input fact outside
daily.reward-input-history - a result differing only as that citation permits is recorded as not compared and does not diverge
- where that citation recomputes a comparison reference for the actual inputs, the reference is deterministically recomputed from the sealed record before comparison
- the claimed result reads no live-input fact outside
- Diagnostics
roguelike-daily-run-live-input-traceroguelike-daily-run-reference-sourceroguelike-daily-run-comparison-log
claim-reference-comes-from-sealed-record · dungeon-layout
dungeon-layout obtains its reference from the sealed record
Applies to the dungeon-layout row.
At daily.floor-generation-checks, dungeon-layout reads a captured comparison reference or deterministically recomputes it from the sealed record through the cited method of the replay-record row. The reference-source record distinguishes the two and proves live play supplied neither. Where the adoption cannot construct one of the two forms, this test checks nothing for that form. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
dungeon-layoutplaybacks using a captured reference and, where the adoption can construct one, a deterministically recomputed reference- When
- playback reaches the points at
daily.floor-generation-checks
- playback reaches the points at
- Then
- the reference is read from the sealed record or deterministically recomputed from it using the cited method of the replay-record row and
daily.floor-generation-checks - the reference-source record distinguishes capture from recomputation and proves no reference was read from live play
- where the adoption cannot construct one of the two reference forms, this test checks nothing for that form
- the reference is read from the sealed record or deterministically recomputed from it using the cited method of the replay-record row and
- Diagnostics
roguelike-daily-run-reference-sourceroguelike-daily-run-comparison-log
claim-reference-comes-from-sealed-record · boss-reward
boss-reward obtains its reference from the sealed record
Applies to the boss-reward row.
At daily.boss-reward-check, boss-reward reads a captured comparison reference or deterministically recomputes it from the sealed record through the cited method of the replay-record row. The reference-source record distinguishes the two and proves live play supplied neither. Where the adoption cannot construct one of the two forms, this test checks nothing for that form. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
boss-rewardplaybacks using a captured reference and, where the adoption can construct one, a deterministically recomputed reference- When
- playback reaches the points at
daily.boss-reward-check
- playback reaches the points at
- Then
- the reference is read from the sealed record or deterministically recomputed from it using the cited method of the replay-record row and
daily.boss-reward-check - the reference-source record distinguishes capture from recomputation and proves no reference was read from live play
- where the adoption cannot construct one of the two reference forms, this test checks nothing for that form
- the reference is read from the sealed record or deterministically recomputed from it using the cited method of the replay-record row and
- Diagnostics
roguelike-daily-run-reference-sourceroguelike-daily-run-comparison-log
unmet-claim-condition-skips-comparison · dungeon-layout
dungeon-layout reads conditions before comparison
Applies to the dungeon-layout row.
At each constructible point where daily.dungeon-layout-conditions is not met, dungeon-layout is not compared and does not diverge. The game does not refuse the record and does not make playback terminal because of that condition alone. Every other eligible claim, where the adoption declares one, is still compared at its own points, and the logs distinguish the skip from a match. If no such point exists, this test checks nothing. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
each
dungeon-layoutcomparison point this adoption can construct where the conditions atdaily.dungeon-layout-conditionsare not met- When
- playback reaches that point
- Then
- the conditions are read before a comparison is attempted
- the claim is recorded as not compared and does not mark a divergence
- the game does not refuse the record, and playback does not become terminal, because of that claim's unmet condition alone
- every other eligible claim is still compared at its own comparison points; where no other eligible claim exists, this test checks nothing in this step
- where no unmet-condition point can be constructed, this test checks nothing
- Diagnostics
roguelike-daily-run-condition-traceroguelike-daily-run-comparison-logroguelike-daily-run-playback-result
unmet-claim-condition-skips-comparison · boss-reward
boss-reward reads conditions before comparison
Applies to the boss-reward row.
At each constructible point where daily.boss-reward-conditions is not met, boss-reward is not compared and does not diverge. The game does not refuse the record and does not make playback terminal because of that condition alone. Every other eligible claim, where the adoption declares one, is still compared at its own points, and the logs distinguish the skip from a match. If no such point exists, this test checks nothing. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
each
boss-rewardcomparison point this adoption can construct where the conditions atdaily.boss-reward-conditionsare not met- When
- playback reaches that point
- Then
- the conditions are read before a comparison is attempted
- the claim is recorded as not compared and does not mark a divergence
- the game does not refuse the record, and playback does not become terminal, because of that claim's unmet condition alone
- every other eligible claim is still compared at its own comparison points; where no other eligible claim exists, this test checks nothing in this step
- where no unmet-condition point can be constructed, this test checks nothing
- Diagnostics
roguelike-daily-run-condition-traceroguelike-daily-run-comparison-logroguelike-daily-run-playback-result
bit-exact-claim-compares-declared-bytes · dungeon-layout
dungeon-layout compares every included byte
Applies to the dungeon-layout row.
Bit-exact claim dungeon-layout compares every byte named at daily.dungeon-layout-result after subtracting daily.dungeon-layout-exclusions. Excluded state is never compared. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
eligible
dungeon-layoutcomparisons with each included byte changed in turn and, wheredaily.dungeon-layout-exclusionsnames excluded state, that state changed separately- When
- playback compares the result to its comparison reference
- Then
- every state byte named at
daily.dungeon-layout-resultafter subtractingdaily.dungeon-layout-exclusionsis compared bit for bit - each changed included byte fails the matching standard; changed excluded state is never compared; where the cited section says that nothing is excluded, this test checks nothing about excluded state
- every state byte named at
- Diagnostics
roguelike-daily-run-comparison-logroguelike-daily-run-reference-source
outcome-equivalent-claim-compares-declared-fields · boss-reward
boss-reward compares every included outcome field
Applies to the boss-reward row.
Outcome-equivalent claim boss-reward compares every outcome field named at daily.boss-reward-result after subtracting daily.boss-reward-exclusions. Excluded state is never compared. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
eligible
boss-rewardcomparisons with each included outcome field changed in turn and, wheredaily.boss-reward-exclusionsnames excluded state, that state changed separately- When
- playback compares the result to its comparison reference
- Then
- every outcome field named at
daily.boss-reward-resultafter subtractingdaily.boss-reward-exclusionsis compared - each changed included field fails the matching standard; changed excluded state is never compared; where the cited section says that nothing is excluded, this test checks nothing about excluded state
- every outcome field named at
- Diagnostics
roguelike-daily-run-comparison-logroguelike-daily-run-reference-source
position-claim-uses-adoption-gap
Row.id passes only within the declared allowed gap
Does not apply to roguelike-daily-run: allowed-position-gap is not in use for roguelike-daily-run.
seed-fixed-claim-repeats-from-declared-record · dungeon-layout
the daily dungeon layout result repeats from the declared seed record
Applies to the dungeon-layout row.
Across recorded runs where this claim is eligible, the daily dungeon layout result from the same sealed seed-only record satisfies dungeon-layout's matching standard at daily.floor-generation-checks whenever the conditions at daily.dungeon-layout-conditions hold. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Holds
for every case in scope where the conditions at
daily.dungeon-layout-conditionshold, playback using the same sealed seed-only record satisfiesdungeon-layout's selected matching standard at the points cited atdaily.floor-generation-checks- Seeds
["audit-a","audit-b"]- Scope
recorded runs where this claim is eligible- Diagnostics
roguelike-daily-run-record-manifestroguelike-daily-run-comparison-log
live-input-shifted-claim-repeats-within-cited-rule · boss-reward
the daily boss reward result repeats within its cited live-input rule
Applies to the boss-reward row.
Across recorded runs spanning the cited conditions and permitted live-input differences, a daily boss reward case is eligible where the conditions at daily.boss-reward-conditions hold and no difference permitted by daily.reward-input-history applies. In every eligible case, playback from the same sealed seed-only record satisfies the claim's matching standard at daily.boss-reward-check. A result that differs only as the live-input citation permits is recorded as not compared. The test names the addresses and restates nothing from them.
Test steps and diagnostics
- Holds
for every case in scope where the conditions at
daily.boss-reward-conditionshold and no difference permitted bydaily.reward-input-historyapplies, playback from the same sealed seed-only record satisfies the claim's matching standard at the points cited atdaily.boss-reward-check; a result that differs only as that citation permits is recorded as not compared- Seeds
["audit-a","audit-b"]- Scope
recorded runs spanning the cited conditions and permitted live-input differences- Diagnostics
roguelike-daily-run-record-manifestroguelike-daily-run-condition-traceroguelike-daily-run-live-input-traceroguelike-daily-run-comparison-log
seed-and-input-claim-repeats-from-declared-record
the Row.artifact result repeats from the declared seed and input record
Does not apply to roguelike-daily-run: replay record is seed only, not seed and input log.
fixed-start-input-claim-repeats-from-declared-record
the Row.artifact result repeats from the declared fixed start and input record
Does not apply to roguelike-daily-run: replay record is seed only, not input log from fixed start.
outside-conditions-make-no-promise
changes outside cited conditions do not fail this contract
Applies to roguelike-daily-run.
A change outside the cited conditions is never itself a reason to refuse a record or to mark a divergence. A divergence arises only when a claimed result fails its comparison at an eligible comparison point. If the adoption can construct no such change, this test checks nothing.
Test steps and diagnostics
- Given
each change outside the cited conditions that the
roguelike-daily-runadoption can construct- When
- the change is observed during playback
- Then
- no change outside the cited conditions is itself a reason for refusal or for a divergence mark; a divergence arises only from a failed comparison of a claimed result at an eligible comparison point
- where no such change can be constructed, this test checks nothing
- Diagnostics
roguelike-daily-run-condition-traceroguelike-daily-run-comparison-logroguelike-daily-run-playback-result
first-difference-retains-complete-record · daily-run
daily-run retains the first failed eligible comparison
Applies to the daily-run row.
At the first failed eligible comparison, daily-run becomes diverged and retains the claim, point, expected and observed results, versions, platforms, and last consumed input when present. The records distinguish failure from a skipped comparison.
Test steps and diagnostics
- Given
one
daily-runplayback with a first failed eligible comparison, with a last consumed input where this record has one- When
- the comparison fails its claim's matching standard
- Then
- the playback result becomes diverged at that first difference
- the retained divergence record holds the claim id, comparison point, expected result, observed result, recorded and running versions, recorded and running platforms, and last consumed input when present
- the retained record distinguishes this failed comparison from a skipped comparison
- Diagnostics
roguelike-daily-run-divergence-recordroguelike-daily-run-playback-resultroguelike-daily-run-comparison-log
stop-and-report-ends-at-first-difference · daily-run
daily-run reports and stops at the first difference
Applies to the daily-run row.
At the first difference, daily-run presents the retained difference through daily.run-comparison, consumes no later input, and ends diverged. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
one
daily-runplayback whose next eligible comparison is its first difference, with a later recorded or live input where playback can have one- When
- the difference is retained
- Then
- the difference is presented through
daily.run-comparisonbefore any later input is consumed - no later input is consumed and playback ends with result diverged
- the difference is presented through
- Diagnostics
roguelike-daily-run-divergence-recordroguelike-daily-run-difference-reportroguelike-daily-run-input-log-trace
continue-and-flag-keeps-visible-divergence
Row.id reports and continues from playback state
Does not apply to roguelike-daily-run: divergence response is stop and report, not continue and flag.
continue-silently-keeps-internal-divergence
Row.id continues with an internal diverged mark
Does not apply to roguelike-daily-run: divergence response is stop and report, not continue silently.
later-comparisons-never-resynchronize
later comparisons are informational only
Does not apply to roguelike-daily-run: divergence response is stop and report, not continue and flag or continue silently.
complete-means-all-made-comparisons-matched · daily-run
complete means every comparison actually made matched
Applies to the daily-run row.
When daily-run reaches its end at daily.seed-and-reference-capture without an eligible failure, complete means every comparison actually made matched. It promises nothing about excluded claims, unmet conditions, or excluded state, which the log distinguishes from matches. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
one
daily-runrecord reaching the end boundary atdaily.seed-and-reference-capturewith no failed eligible comparison- When
- the terminal playback result is assigned
- Then
- the playback result becomes complete exactly when every comparison actually made matched
- the comparison log separately records excluded claims, unmet conditions, and excluded state, and complete makes no promise about them
- Diagnostics
roguelike-daily-run-playback-resultroguelike-daily-run-comparison-log
same-moment-events-preserve-event-resolution-order
same-moment events preserve Event resolution order
Applies to roguelike-daily-run.
Events at the same replay moment enter in the total order Event resolution supplies. The replay lifecycle introduces no reordering of its own between the supplied order and processing.
Test steps and diagnostics
- Given
two or more events offered at the same
roguelike-daily-runreplay moment in a known total order from Event resolution- When
- the events enter the replay lifecycle
- Then
- the lifecycle processes them in exactly the supplied total order
- the replay lifecycle introduces no reordering of its own between the supplied order and processing
- Diagnostics
roguelike-daily-run-event-order-trace
adoption-declares-exactly-one-replay-record
declaration check: the adoption declares exactly one replay-record row
Applies to roguelike-daily-run.
This declaration check reads the adoption, not the running game. A legal adoption has exactly one replay-record row. With any other count, the adoption is invalid, and this test fails. The validator does not enforce the maximum.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption document, not the running game- When
- a reviewer counts replay-record rows
- Then
- the adoption has exactly one replay-record row; with zero rows or more than one row, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
adoption-declares-at-least-one-reproduction-claim
declaration check: the adoption declares at least one reproduction claim
Applies to roguelike-daily-run.
This declaration check reads the adoption, not the running game. A legal adoption has at least one reproduction claim. With an empty claim list, the adoption is invalid, and this test fails. The validator does not enforce the minimum.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption document, not the running game- When
- a reviewer counts reproduction-claims rows
- Then
- the adoption has at least one reproduction-claims row; with an empty list, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
claim-standard-agrees-with-cited-prose · dungeon-layout
declaration check: dungeon-layout's matching standard agrees with its cited prose
Applies to the dungeon-layout row.
This declaration check reads the adoption and daily.dungeon-layout-result with daily.dungeon-layout-exclusions, not the running game. The cited prose must describe the kind of result selected by dungeon-layout's matching standard. With any other pairing, the adoption is invalid, and this test fails. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the prose atdaily.dungeon-layout-resultanddaily.dungeon-layout-exclusions, not the running game- When
- a reviewer compares the selected matching-standard with the included and excluded result description
- Then
- the prose names bytes for bit-exact-state, outcome fields for outcome-equivalent, or positions and their space for allowed-position-gap, matching the row's selected standard
- with any disagreement, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
claim-standard-agrees-with-cited-prose · boss-reward
declaration check: boss-reward's matching standard agrees with its cited prose
Applies to the boss-reward row.
This declaration check reads the adoption and daily.boss-reward-result with daily.boss-reward-exclusions, not the running game. The cited prose must describe the kind of result selected by boss-reward's matching standard. With any other pairing, the adoption is invalid, and this test fails. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the prose atdaily.boss-reward-resultanddaily.boss-reward-exclusions, not the running game- When
- a reviewer compares the selected matching-standard with the included and excluded result description
- Then
- the prose names bytes for bit-exact-state, outcome fields for outcome-equivalent, or positions and their space for allowed-position-gap, matching the row's selected standard
- with any disagreement, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
every-platform-claim-has-multiple-platform-evidence · dungeon-layout
declaration check: dungeon-layout was tested on more than one platform
Applies to the dungeon-layout row.
This declaration check reads the adoption and existing verification evidence, not the running game. Every-supported-platform claim dungeon-layout is legal only with evidence from more than one supported platform. With narrower evidence, the adoption is invalid, and this test fails.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and its verification evidence, not a new running-game execution- When
- a reviewer checks the evidence for every-supported-platform claim
dungeon-layout
- a reviewer checks the evidence for every-supported-platform claim
- Then
- the evidence records this claim tested on more than one supported platform; with one platform or none, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-platform-matrixroguelike-daily-run-declaration-record
every-platform-claim-has-multiple-platform-evidence · boss-reward
declaration check: boss-reward was tested on more than one platform
Applies to the boss-reward row.
This declaration check reads the adoption and existing verification evidence, not the running game. Every-supported-platform claim boss-reward is legal only with evidence from more than one supported platform. With narrower evidence, the adoption is invalid, and this test fails.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and its verification evidence, not a new running-game execution- When
- a reviewer checks the evidence for every-supported-platform claim
boss-reward
- a reviewer checks the evidence for every-supported-platform claim
- Then
- the evidence records this claim tested on more than one supported platform; with one platform or none, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-platform-matrixroguelike-daily-run-declaration-record
claim-excludes-cites-separate-section · dungeon-layout
declaration check: dungeon-layout has a separate exclusions section
Applies to the dungeon-layout row.
This declaration check reads the adoption and cited prose, not the running game. daily.dungeon-layout-exclusions must be a section separate from daily.dungeon-layout-result and must name exclusions or explicitly say there are none. With any other shape, the adoption is invalid, and this test fails. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the prose atdaily.dungeon-layout-resultanddaily.dungeon-layout-exclusions, not the running game- When
- a reviewer checks the two cited sections
- Then
daily.dungeon-layout-exclusionsnames a section separate fromdaily.dungeon-layout-resultand that section names every exclusion or states explicitly that nothing is excluded- with a shared section, an omitted exclusion, or no statement when nothing is excluded, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
claim-excludes-cites-separate-section · boss-reward
declaration check: boss-reward has a separate exclusions section
Applies to the boss-reward row.
This declaration check reads the adoption and cited prose, not the running game. daily.boss-reward-exclusions must be a section separate from daily.boss-reward-result and must name exclusions or explicitly say there are none. With any other shape, the adoption is invalid, and this test fails. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the prose atdaily.boss-reward-resultanddaily.boss-reward-exclusions, not the running game- When
- a reviewer checks the two cited sections
- Then
daily.boss-reward-exclusionsnames a section separate fromdaily.boss-reward-resultand that section names every exclusion or states explicitly that nothing is excluded- with a shared section, an omitted exclusion, or no statement when nothing is excluded, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
claim-citations-state-their-own-duties · dungeon-layout
declaration check: each of dungeon-layout's four required citations names what its field requires
Applies to the dungeon-layout row.
This declaration check reads the adoption and cited prose, not the running game. daily.dungeon-layout-result, daily.dungeon-layout-exclusions, daily.dungeon-layout-conditions, and daily.floor-generation-checks must respectively state the included result, separate exclusions, conditions, and reference and comparison points. With any wrong meaning, the adoption is invalid, and this test fails. The test names every address and restates nothing from them.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the prose atdaily.dungeon-layout-result,daily.dungeon-layout-exclusions,daily.dungeon-layout-conditions, anddaily.floor-generation-checks, not the running game- When
- a reviewer checks the meaning of each required citation
- Then
- the four addresses respectively name the included result, the separate exclusions, the promise conditions, and the capture-or-recomputation and comparison points
- with a citation that has another meaning, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
claim-citations-state-their-own-duties · boss-reward
declaration check: each of boss-reward's four required citations names what its field requires
Applies to the boss-reward row.
This declaration check reads the adoption and cited prose, not the running game. daily.boss-reward-result, daily.boss-reward-exclusions, daily.boss-reward-conditions, and daily.boss-reward-check must respectively state the included result, separate exclusions, conditions, and reference and comparison points. With any wrong meaning, the adoption is invalid, and this test fails. The test names every address and restates nothing from them.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the prose atdaily.boss-reward-result,daily.boss-reward-exclusions,daily.boss-reward-conditions, anddaily.boss-reward-check, not the running game- When
- a reviewer checks the meaning of each required citation
- Then
- the four addresses respectively name the included result, the separate exclusions, the promise conditions, and the capture-or-recomputation and comparison points
- with a citation that has another meaning, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
live-input-shifted-claim-cites-dependence-rule · boss-reward
declaration check: boss-reward cites its live-input dependence rule
Applies to the boss-reward row.
This declaration check reads the adoption and daily.reward-input-history, not the running game. A live-input-sensitive boss-reward claim is legal only when that citation names every permitted input-history fact and excludes all others. With any other shape, the adoption is invalid, and this test fails. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the prose atdaily.reward-input-history, not the running game- When
- a reviewer checks live-input-may-shift-this-claim row
boss-reward
- a reviewer checks live-input-may-shift-this-claim row
- Then
- the citation names every live-input history fact allowed to change this claimed result, and unlisted live input is excluded
- with a missing citation or a citation that has another meaning, the adoption is invalid, and this test fails
- Diagnostics
roguelike-daily-run-declaration-record
shared-conditions-section-covers-every-citing-claim · dungeon-layout
declaration check: dungeon-layout's shared conditions section covers every citing claim
Applies to the dungeon-layout row.
This declaration check reads the adoption and the cited prose at daily.dungeon-layout-conditions, not the running game. A section cited by more than one claim states the conditions for every citing claim by name. With a shared section that covers only some citing claims, the adoption is invalid, and this test fails. Where no other claim cites the section, this test checks nothing.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the cited prose atdaily.dungeon-layout-conditions, not the running game- When
- a reviewer checks every reproduction claim that cites the same conditions section
- Then
- where the section at
daily.dungeon-layout-conditionsis also cited by another claim in this adoption, it states the conditions for each citing claim by name - where no other claim cites it, this test checks nothing
- with a shared section that covers only some citing claims, the adoption is invalid, and this test fails
- where the section at
- Diagnostics
roguelike-daily-run-declaration-record
shared-conditions-section-covers-every-citing-claim · boss-reward
declaration check: boss-reward's shared conditions section covers every citing claim
Applies to the boss-reward row.
This declaration check reads the adoption and the cited prose at daily.boss-reward-conditions, not the running game. A section cited by more than one claim states the conditions for every citing claim by name. With a shared section that covers only some citing claims, the adoption is invalid, and this test fails. Where no other claim cites the section, this test checks nothing.
Test steps and diagnostics
- Given
the
roguelike-daily-runadoption and the cited prose atdaily.boss-reward-conditions, not the running game- When
- a reviewer checks every reproduction claim that cites the same conditions section
- Then
- where the section at
daily.boss-reward-conditionsis also cited by another claim in this adoption, it states the conditions for each citing claim by name - where no other claim cites it, this test checks nothing
- with a shared section that covers only some citing claims, the adoption is invalid, and this test fails
- where the section at
- Diagnostics
roguelike-daily-run-declaration-record
position-gap-unit-matches-cited-space
declaration check: Row.id's position gap unit matches its cited space
Does not apply to roguelike-daily-run: allowed-position-gap is not in use for roguelike-daily-run.
replay-holds
the replay mechanism holds for the whole run
Applies to roguelike-daily-run.
Across recorded runs across every claim, each platform reach the adoption declares, an update where the adoption allows one, and a first difference where one can be constructed, every playback enters the mechanism's stages in order, leaves them only at a terminal result, and never revisits an earlier stage. References never come from live play; rejected or diverged playback consumes no forbidden input; each terminal result is exactly diverged, rejected, or complete. The pack's default audit seeds apply unless the adoption supplies its own.
Test steps and diagnostics
- Holds
every playback entered the mechanism's numbered stages in order, left them only at a terminal result, and never revisited an earlier stage; no comparison read a comparison reference from live play; no rejected or diverged playback consumed an input that its selected response or its refusal forbade it to consume; every terminal playback result was exactly one of diverged, rejected, or complete
- Seeds
["audit-a","audit-b"]- Scope
recorded runs across every claim, each platform reach the adoption declares, an update where the adoption allows one, and a first difference where one can be constructed- Diagnostics
roguelike-daily-run-recording-traceroguelike-daily-run-identity-check-traceroguelike-daily-run-reference-sourceroguelike-daily-run-comparison-logroguelike-daily-run-input-log-traceroguelike-daily-run-playback-resultroguelike-daily-run-first-ordering-violation
JSONthe adoption as one file
Answers you try on this page do not change this file. To change an adoption, open it in the authoring tool.
{
"contract": "replay-scope",
"version": 2,
"summary": "This contract covers racing ghosts, daily seeds, observer replays, solution shares, and other recorded reruns. It decides what the record contains, whether the game can still play the record after an update, what must match, and what happens at the first difference. This contract does not cover input encoding, random-number methods, storage, cameras, or networking.",
"questions": {
"replay-record": {
"asks": "What does this replay need to run again?",
"rationale": "A daily seed recreates a challenge. A racing ghost also needs the driver's recorded inputs.",
"options": {
"seed-only": {
"meaning": "The replay needs only the seed. A roguelike daily run rebuilds the day's dungeon before new play begins.",
"semantics": "The record carries the seed but no input log; each claim's comparison reference is carried or recomputed from the record. Playback consumes the seed, accepts live inputs, and applies each claim's live-input answer."
},
"seed-and-input-log": {
"meaning": "The replay needs the seed and the recorded inputs. A racing ghost follows the recorded steering on the same generated track.",
"semantics": "The record carries the seed and one ordered input log; each claim's comparison reference is carried or recomputed from the record. Playback consumes the seed and log from the declared starting point; changing either creates a different record instance."
},
"input-log-from-fixed-start": {
"meaning": "The replay needs recorded inputs and one fixed start. A puzzle solution begins from the shared board and repeats the saved moves.",
"semantics": "The record carries one fixed-start identity and one ordered input log; each claim's comparison reference is carried or recomputed from the record. Seed identity is not a separate requirement."
}
}
},
"after-an-update": {
"asks": "What happens to a recorded replay after the game updates?",
"rationale": "A patch can change rules, content, or timing. The replay needs a clear version promise before playback starts.",
"options": {
"same-version-only": {
"meaning": "The replay works only in the version that recorded it. A patched racing game labels an older ghost as incompatible.",
"semantics": "When the recorded and running version ids differ, refuse the replay before consuming its seed, start, or inputs. Equal version ids do not override failed content, mod, or settings checks."
},
"migrate-then-replay": {
"meaning": "The game converts the replay before playing it. A puzzle update maps an old move list onto the revised board rules.",
"semantics": "When the version ids differ, a cited migration rule derives a new record for the running version while preserving the source record. Playback consumes only a successful migrated record and identifies both versions and the migration used."
},
"best-effort-with-declared-divergence": {
"meaning": "The game tries the old replay and states what may differ. An RTS update names changed unit balance before the observer replay starts.",
"semantics": "When the version ids differ, the running version consumes the original record after presenting the cited known changes between the versions. Actual differences still follow the divergence-response answer."
}
}
},
"divergence-response": {
"asks": "What happens at the first difference between the replay and the record?",
"rationale": "A replay can stop, continue with a warning, or continue without showing the difference.",
"options": {
"stop-and-report": {
"meaning": "Stop the replay and report the first difference. A puzzle solution stops on the first move that produces the wrong board.",
"semantics": "Do not consume the next recorded input. Report the failed claim, comparison point, expected result, observed result, versions, and platforms, then end playback as diverged."
},
"continue-and-flag": {
"meaning": "Keep playing and mark the replay as diverged. An RTS observer can watch the rest after a unit first appears in the wrong place.",
"semantics": "Report the first difference, mark playback as diverged, and continue from playback's own state. Later comparisons are informational; they do not replace the first report or resynchronize playback to the reference."
},
"continue-silently": {
"meaning": "Keep playing without showing the difference. A racing ghost can finish the lap after its position differs from the record by more than the allowed gap.",
"semantics": "Mark the difference inside the replay controller, send no report to the player, to the ordinary log, or to telemetry, and continue from playback's own state. Later comparisons are informational and playback remains diverged."
}
}
}
},
"declares": {
"values": {
"allowed-position-gap": {
"description": "The greatest allowed distance between recorded and replayed positions, in the position unit named by every position claim in this adoption.",
"range": [
0,
1000000
],
"forms": [
"number",
"citation"
],
"when": {
"row-has": {
"reproduction-claims": {
"matching-standard": [
"allowed-position-gap"
]
}
}
}
}
},
"rows": {
"replay-record": {
"description": "Give the rules that record and play back this kind of replay. One adoption has exactly one row.",
"when-empty": "An empty replay-record list is never a behavior choice: this adoption requires exactly one row, and a reviewer rejects a file without it.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A short name for this kind of replay in your game's words, such as ghost-lap or observer-match. Each finished record of this kind has its own identity. The rules for recording define that identity."
},
"recording-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules name the start and the end of recording. The same rules set the recording version, the platform, the content-set identity, the settings, the mod identity, and the record's own identity. They name the seed or the fixed start, and the input log when one is used. They say whether each claim's comparison reference is captured at recording or recomputed from the record at playback."
},
"input-clock-declared-in": {
"type": "citation",
"when": {
"flag": {
"replay-record": [
"seed-and-input-log",
"input-log-from-fixed-start"
]
}
},
"description": "Where your game's rules say how recorded inputs are ordered, and which clock, step, or turn is used to play them back."
},
"fixed-start-declared-in": {
"type": "citation",
"when": {
"flag": {
"replay-record": [
"input-log-from-fixed-start"
]
}
},
"description": "Where your game's rules say how the game identifies the fixed starting state and verifies it before the first input."
},
"migration-declared-in": {
"type": "citation",
"when": {
"flag": {
"after-an-update": [
"migrate-then-replay"
]
}
},
"description": "Where your game's rules state the deterministic rule that derives the record for the running version. The source record stays unchanged."
},
"cross-version-divergence-declared-in": {
"type": "citation",
"when": {
"flag": {
"after-an-update": [
"best-effort-with-declared-divergence"
]
}
},
"description": "Where your game's rules state the known changes that may alter this replay in the running version. The game shows this statement to the player."
},
"difference-report-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules describe the incompatibility or difference report. Before playback, the report presents a refusal because of the version, the content, the mods, the settings, the start, or the migration. When the selected response is visible, the report presents the first failed claim and the comparison details."
}
}
},
"reproduction-claims": {
"description": "List one row for each result this replay promises to compare. Rows may share one conditions section when the same conditions apply. A shared section must cover every row that points to it.",
"when-empty": "This adoption makes no replay promise without at least one result to compare, and a reviewer rejects the empty list.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A short name for this comparison claim in your game's words, such as car-path or match-state."
},
"artifact": {
"type": "string",
"required": true,
"description": "The game's plain name for the result that playback compares."
},
"platform-reach": {
"type": "string",
"required": true,
"options": [
"recorded-platform-only",
"every-supported-platform"
],
"description": "Whether this claim is compared only on the recording platform or on every supported platform."
},
"shifts-with-live-input": {
"type": "string",
"when": {
"flag": {
"replay-record": [
"seed-only"
]
}
},
"options": [
"seed-fixes-this-claim",
"live-input-may-shift-this-claim"
],
"description": "Can the player's input during playback change a result that this replay promises? Say whether the seed alone decides this result, or whether live input may change it."
},
"live-input-dependence-declared-in": {
"type": "citation",
"when": {
"row": {
"shifts-with-live-input": [
"live-input-may-shift-this-claim"
]
}
},
"description": "Where your game's rules name every fact about the player's earlier live input that may change this result. Live input that the rules do not list does not change the result."
},
"matching-standard": {
"type": "string",
"required": true,
"options": [
"bit-exact-state",
"outcome-equivalent",
"allowed-position-gap"
],
"description": "What this claim compares: every named state byte, every named outcome field, or position in the named space using the adoption's allowed gap."
},
"reproduces": {
"type": "citation",
"required": true,
"description": "Where your game's rules name every state byte, outcome field, or position that must match."
},
"excludes": {
"type": "citation",
"required": true,
"description": "Where your game's rules name what this claim excludes from what it promises to match. This section is separate from the section that names what must match. When nothing is excluded, the section says so."
},
"conditions": {
"type": "citation",
"required": true,
"description": "Where your game's rules say when the promise holds. The conditions include the content-set identity, the settings, the mods, and every other condition for compatibility or comparison. Content identity is a condition, not a version."
},
"comparison-points": {
"type": "citation",
"required": true,
"description": "Where your game's rules say when a reference is captured or recomputed and when playback compares it, such as at every simulation checkpoint, at the finish line, or at the solved board."
}
}
}
}
},
"rules": {
"best-effort-must-be-visible": {
"forbid": {
"flag": {
"after-an-update": [
"best-effort-with-declared-divergence"
],
"divergence-response": [
"continue-silently"
]
}
},
"message": "A replay that the game tries after an update must show its first difference. Choose stop-and-report or continue-and-flag, or choose same-version-only."
}
},
"origin": "https://opengdd.org/contracts/replay-scope-2",
"mechanism": [
"This text decides the order of the steps for what is recorded, when capture or recomputation happens, what playback consumes, and how differences are detected and handled. The questions and rows supply choices and cited game rules. They do not change the order.",
"A `replay-record` row names a replay kind. Each immutable replay record of that kind carries its own stable instance identity under `recording-declared-in`. It also carries the recording version, platform, content-set identity, settings and mod identity; the chosen seed or fixed start; the ordered input log when selected; and every claim's comparison reference. A reference is either captured at recording or deterministically recomputed from the sealed record at lifecycle step 11. A migrated record is a derived record with its own identity and a link to the unchanged source.",
"A **comparison point** is a cited checkpoint at which playback reads a result and obtains the corresponding captured or recomputed reference. A **difference** is the first eligible comparison that fails that claim's matching standard. The terminal playback result is `diverged`, `rejected`, or `complete`; before a terminal result, playback is in progress. When the game refuses a record or a replay, the result is `rejected`.",
"### Record",
"1. Read the one `replay-record` row and every reproduction claim. From `recording-declared-in`, set the recording version, platform, content-set identity, settings, and mod identity before the record begins. They do not change during the recording.",
"2. Establish the start. A seed-only or seed-and-input record captures the seed before any claimed seeded result is generated. A fixed-start record captures an identity that the cited state rule can verify before playback.",
"3. Begin input capture at the cited start. A seed-only record captures no inputs. Either input-log record captures each mapped game action with its complete order and cited clock, step, or turn.",
"4. At every claim's comparison point, either capture the reference required by that claim's matching standard or capture all sealed source data that the cited rule requires to recompute the reference at step 11.",
"5. End capture at the cited boundary. Seal the record's own instance identity and contents. A later edit creates a different record instance of the same replay kind.",
"### Select a playable version and claims",
"6. Before consuming the seed, start, or inputs, read the version, platform, content-set identity, settings, and mod identity carried under `recording-declared-in`, then read every cited compatibility condition. If a record-wide identity — content, settings, mods, or the fixed start — no longer holds, refuse the record and use the incompatibility report. A failed condition cited by one claim alone exempts only that claim, per steps 7 and 12. Content identity is a condition, not a version; a level-content patch can therefore invalidate a record even when the version id is unchanged.",
"7. Determine platform reach claim by claim. A claim limited to the recording platform is not compared on another running platform. A claim covering every supported platform is not compared on an unsupported running platform. A claim that is excluded in one of these two ways does not diverge. The other claims continue.",
"8. Only when the recorded version differs from the running version, apply the selected update policy. `same-version-only` refuses the record with the incompatibility report. `migrate-then-replay` runs the cited migration once; success creates a derived record naming source version, target version, and migration rule, and when the migration fails, the game refuses the record. `best-effort-with-declared-divergence` presents the cited known changes and keeps the source record unchanged. Migration must map the recorded input clock to an existing running-version clock; playback under `best-effort-with-declared-divergence` refuses the record if the cited clock no longer exists.",
"### Replay and compare",
"9. Recreate the start. Supply the recorded seed when present. Verify or restore the fixed starting state when present. Refuse the replay if either required item cannot be established.",
"10. For an input-log record, consume inputs in their recorded order at their cited clock, step, or turn. For a seed-only record, accept live inputs. A `seed-fixes-this-claim` result cannot change when those inputs vary. A `live-input-may-shift-this-claim` result may read only the live-input facts named by its `live-input-dependence-declared-in` citation.",
"11. Obtain each claim's comparison reference. Read a reference captured in the record, or deterministically recompute it from the sealed record using the method cited by `recording-declared-in` and that claim's `comparison-points`. This is the recomputation step used by a puzzle share whose solved-board reference is derived from its fixed board and move log.",
"12. At each comparison point, first read the claim's cited conditions. If they are not met, do not compare that claim and do not mark a divergence. The `live-input-dependence-declared-in` citation of a `live-input-may-shift-this-claim` result works the same way: a result that differs only as that citation permits is not compared against the recorded reference and does not diverge; where the citation's method recomputes a reference for the actual inputs, step 11's recomputation applies. Otherwise compare with the reference using the row's matching standard. Bit-exact state compares every declared byte. Outcome matching compares every declared outcome field. Position matching measures distance in the cited space and passes when it is no greater than `allowed-position-gap`. `excludes` subtracts from `reproduces`; excluded state is never compared.",
"This contract makes no promise about changes outside the cited conditions. Such a change does not fail this contract.",
"### Handle the first difference",
"13. On the first failed eligible comparison, set the playback result to `diverged` and retain the claim id, comparison point, expected result, observed result, versions, platforms, and last consumed input when present.",
"14. Under `stop-and-report`, present the difference, consume no later input, and end playback. Under `continue-and-flag`, present the difference, keep a visible diverged mark, and continue. Under `continue-silently`, emit no outward report and continue. Either continuing route advances from playback's own state. Later comparisons are informational and never resynchronize playback to the recorded reference.",
"15. If no eligible comparison fails and the record reaches its cited end, set the result to `complete`. Completion means every comparison actually made matched. It makes no promise about excluded claims, unmet conditions, or excluded state.",
"Every event offered at the same replay moment enters this lifecycle in the total order supplied by **Event resolution**. This contract preserves that order but does not choose it."
],
"pack": "sha256:bf1143945366c1a44f1715fbfb5ca22c389ccc27b091ac8bc7bbfac64be3593c",
"answers": {
"replay-record": "seed-only",
"after-an-update": "same-version-only",
"divergence-response": "stop-and-report"
},
"values": {},
"rows": {
"replay-record": [
{
"id": "daily-run",
"recording-declared-in": "daily.seed-and-reference-capture",
"difference-report-declared-in": "daily.run-comparison"
}
],
"reproduction-claims": [
{
"id": "dungeon-layout",
"artifact": "daily dungeon layout",
"platform-reach": "every-supported-platform",
"shifts-with-live-input": "seed-fixes-this-claim",
"matching-standard": "bit-exact-state",
"reproduces": "daily.dungeon-layout-result",
"excludes": "daily.dungeon-layout-exclusions",
"conditions": "daily.dungeon-layout-conditions",
"comparison-points": "daily.floor-generation-checks"
},
{
"id": "boss-reward",
"artifact": "daily boss reward",
"platform-reach": "every-supported-platform",
"shifts-with-live-input": "live-input-may-shift-this-claim",
"live-input-dependence-declared-in": "daily.reward-input-history",
"matching-standard": "outcome-equivalent",
"reproduces": "daily.boss-reward-result",
"excludes": "daily.boss-reward-exclusions",
"conditions": "daily.boss-reward-conditions",
"comparison-points": "daily.boss-reward-check"
}
]
}
}