Patched racing ghost
patched-racing-ghost · an adoption of Replay scope, version 1
Use in your game
Opens the authoring tool with these answers and settings already filled in. You still add your game's own rules and tuning.
What is in the ZIP
The ZIP holds the adoption 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/.
The contract behind it
Covers racing ghosts, daily seeds, observer replays, solution shares, and other recorded reruns. It decides what the record contains, whether an update can still play it, what must match, and what happens at the first difference. Input encoding, random-number methods, storage, cameras, and networking stay in the game's own rules.
Questions
The supplied answer is marked on each question. Pick other answers to see what changes. Nothing is saved here: the ZIP 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 result that does not match?
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 one of your tuning keys.
Allowed position gap = tuning.social-ghost-gap
read from your tuningallowed-position-gap
The greatest allowed distance between recorded and replayed positions, in the position unit named by every position claim in this adoption.
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 |
|---|---|---|---|---|---|---|
social-ghost | racing.social-ghost-recording | racing.physics-steps | — | — | racing.patch-ghost-notice | racing.social-ghost-status |
Reproduction claims
reproduction-claims
| Id | Artifact | Platform reach | Shifts with live input | Live input dependence declared in | Matching standard | Reproduces | Excludes | Conditions | Comparison points |
|---|---|---|---|---|---|---|---|---|---|
patched-car-path | social ghost car path | recorded-platform-only | — | — | allowed-position-gap | racing.social-ghost-position | racing.social-ghost-exclusions | racing.social-ghost-conditions | racing.social-ghost-samples |
Test inputsscope and seeds
Some tests need a scope or seeds from the adoption before they can run.
This adoption supplies none; every test uses its defaults.
Acceptance tests30 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 · social-ghost
social-ghost sealed records carry the complete replay identity
Applies to the social-ghost row.
Each sealed social-ghost record has its own instance identity and carries, as named at racing.social-ghost-recording, the replay identity fields and the seed and ordered 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 made from replay family
social-ghostand its manifest atracing.social-ghost-recording- 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 ordered 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
patched-racing-ghost-record-manifestpatched-racing-ghost-reference-source
migrated-record-keeps-source-identity
a migrated record has its own identity and keeps its source
Does not apply to patched-racing-ghost: after an update is best effort with declared divergence, not migrate then replay.
playback-result-uses-closed-vocabulary
the terminal playback result uses the closed vocabulary
Applies to patched-racing-ghost.
patched-racing-ghost 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
patched-racing-ghostplayback 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
patched-racing-ghost-playback-result
record-establishes-declared-start · social-ghost
social-ghost records its selected start before claimed results
Applies to the social-ghost row.
The recording version, platform, content-set identity, settings, and mod identity are fixed from racing.social-ghost-recording before the first captured seed, start, or input and do not change for the life of the recording. social-ghost 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
social-ghostrecording about to begin, with its manifest atracing.social-ghost-recording- 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 fixed from
racing.social-ghost-recordingbefore the first captured seed, start, or input and do not change for the life of the recording
- Diagnostics
patched-racing-ghost-record-manifestpatched-racing-ghost-recording-trace
input-log-captures-complete-action-order · social-ghost
social-ghost captures every mapped action in cited order
Applies to the social-ghost row.
From the start at racing.social-ghost-recording, social-ghost captures every mapped game action in complete order at the clock, step, or turn cited at racing.physics-steps. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
one
social-ghostrecording with mapped game actions before and after the cited start- When
- input capture runs from the start named at
racing.social-ghost-recordingusing the clock, step, or turn atracing.physics-steps
- input capture runs from the start named at
- Then
- every mapped game action after capture begins enters one ordered input log in complete order at the cited clock, step, or turn
- no action before capture begins enters the log
- Diagnostics
patched-racing-ghost-input-log-tracepatched-racing-ghost-recording-trace
seed-only-record-captures-no-input
Row.id captures no input log
Does not apply to patched-racing-ghost: replay record is seed and input log, not seed only.
claim-records-reference-or-recomputation-source · patched-car-path
patched-car-path records its comparison reference source
Applies to the patched-car-path row.
At every point cited at racing.social-ghost-samples, recording captures the reference patched-car-path needs or all sealed data the family row's cited method 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
patched-car-pathcomparison point cited atracing.social-ghost-samples- When
- the recorder handles the claim at that point
- Then
- the record captures the comparison reference required by
patched-car-path's matching standard or all sealed source data required by the family row's cited recomputation method - the record distinguishes a captured reference from sealed recomputation source data
- the record captures the comparison reference required by
- Diagnostics
patched-racing-ghost-reference-sourcepatched-racing-ghost-recording-trace
record-seals-at-boundary · social-ghost
social-ghost seals one immutable record at its boundary
Applies to the social-ghost row.
At the boundary cited at racing.social-ghost-recording, social-ghost seals its instance identity and contents. Any later edit creates a different instance in the same replay family. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
one
social-ghostrecording approaching the end boundary atracing.social-ghost-recording- 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 in the same replay family and leaves the sealed record unchanged
- Diagnostics
patched-racing-ghost-record-manifestpatched-racing-ghost-recording-trace
record-wide-identity-precedes-consumption · social-ghost
social-ghost checks record-wide identity before consumption
Applies to the social-ghost row.
Before consuming a seed, start, or input, social-ghost reads the record identity at racing.social-ghost-recording and the cited compatibility conditions. Each record-wide identity it carries rejects through racing.social-ghost-status when it fails; neither an unchanged version id nor the update policy excuses a failed identity. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
sealed
social-ghostrecords 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
racing.social-ghost-recordingand every cited compatibility condition are read before any seed, start, or input is consumed - each failed record-wide identity the adoption carries rejects the record and presents the incompatibility report through
racing.social-ghost-statusbefore any seed, start, or input is consumed - the unchanged version id does not turn the failed content identity into a pass
- the update policy is not used to excuse a failed identity
- the version, platform, content-set identity, settings, and mod identity at
- Diagnostics
patched-racing-ghost-identity-check-tracepatched-racing-ghost-rejection-reportpatched-racing-ghost-input-log-trace
compatible-record-is-played · social-ghost
social-ghost plays a compatible record
Applies to the social-ghost row.
A sealed social-ghost record whose complete replay identity matches the running game and whose cited compatibility conditions hold is played rather than rejected. Playback consumes the seed, start, or inputs it carries and reaches complete or diverged, never rejected.
Test steps and diagnostics
- Given
a sealed
social-ghostrecord 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
- playback is not rejected
- playback consumes the seed, start, or inputs the record carries
- playback reaches a terminal result that is complete or diverged, never rejected
- Diagnostics
patched-racing-ghost-identity-check-tracepatched-racing-ghost-playback-result
recorded-platform-only-excludes-other-platforms · patched-car-path
patched-car-path compares only on the recording platform
Applies to the patched-car-path row.
On another platform, recorded-platform-only claim patched-car-path is excluded, is not compared, and cannot diverge. Other eligible claims continue where they exist. The comparison log distinguishes exclusion from a match.
Test steps and diagnostics
- Given
a playback on a platform different from the recording platform with
patched-car-pathand at least one other eligible claim where the adoption can construct one- When
- claim platform reach is selected
- Then
patched-car-pathis not compared and cannot cause divergence- every other eligible claim continues; where no other eligible claim exists, this clause asserts nothing
- the comparison log records platform exclusion rather than a match
- Diagnostics
patched-racing-ghost-comparison-logpatched-racing-ghost-playback-result
every-supported-platform-excludes-only-unsupported-platforms
Row.id compares on every supported platform
Does not apply to patched-racing-ghost: no row in reproduction-claims matches platform-reach every supported platform.
same-version-only-rejects-version-mismatch
Row.id rejects a different running version
Does not apply to patched-racing-ghost: after an update is best effort with declared divergence, not same version only.
migration-runs-once-before-playback
Row.id migrates once or rejects
Does not apply to patched-racing-ghost: after an update is best effort with declared divergence, not migrate then replay.
best-effort-presents-known-differences · social-ghost
social-ghost presents known cross-version differences before playback
Applies to the social-ghost row.
For differing versions, best-effort presents the differences at racing.patch-ghost-notice before consuming the unchanged source record; no clock mapping is performed and the input clock the record cites must still exist in the running version. A missing running-version clock rejects through racing.social-ghost-status before input consumption. For equal version ids, the cross-version notice is not presented and playback proceeds on the source record. Every non-rejected mismatch follows the divergence response. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
sealed
social-ghostsource records whose version ids are equal to and differ from the running version and, for each record with a cited input clock, running versions where that clock exists and no longer exists- When
- best-effort selection applies the update policy at
racing.patch-ghost-notice
- best-effort selection applies the update policy at
- Then
- when the version ids differ, the cited known differences are presented before playback consumes the source record, and the source record remains unchanged
- when the version ids are equal, the cross-version notice is not presented and playback proceeds on the source record
- for a differing version, no clock mapping is performed and the input clock the record cites must still exist in the running version
- where the record carries a cited input clock and that clock no longer exists, playback rejects through
racing.social-ghost-statusbefore consuming an input - where no rejection occurs, later actual mismatches follow the selected divergence response
- Diagnostics
patched-racing-ghost-cross-version-noticepatched-racing-ghost-record-manifestpatched-racing-ghost-rejection-report
seeded-playback-recreates-start · social-ghost
social-ghost supplies the recorded seed or rejects
Applies to the social-ghost row.
Seeded social-ghost playback supplies the recorded seed before generating a claimed seeded result. If the seed cannot be established, playback rejects before input consumption.
Test steps and diagnostics
- Given
a playable
social-ghostrecord, 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 unavailable run becomes rejected before consuming any input
- Diagnostics
patched-racing-ghost-start-tracepatched-racing-ghost-playback-result
fixed-start-playback-verifies-or-restores
Row.id verifies or restores the fixed start
Does not apply to patched-racing-ghost: replay record is seed and input log, not input log from fixed start.
input-log-playback-consumes-cited-order · social-ghost
social-ghost consumes recorded inputs in cited order
Applies to the social-ghost row.
social-ghost playback consumes the recorded input log once, in its recorded order, at the clock, step, or turn cited at racing.physics-steps. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
a playable
social-ghostrecord with distinct mapped actions in its input log- When
- playback runs at the clock, step, or turn cited at
racing.physics-steps
- playback runs at the clock, step, or turn cited at
- Then
- every recorded input is consumed once in recorded order at the clock, step, or turn cited at
racing.physics-steps - no live input replaces or reorders a recorded action
- every recorded input is consumed once in recorded order at the clock, step, or turn cited at
- Diagnostics
patched-racing-ghost-input-log-tracepatched-racing-ghost-playback-result
seed-only-playback-accepts-live-input
Row.id accepts live input without a recorded log
Does not apply to patched-racing-ghost: replay record is seed and input log, not seed only.
seed-fixed-claim-ignores-live-input-variation
Row.id cannot change when live inputs vary
Does not apply to patched-racing-ghost: no row in reproduction-claims matches shifts-with-live-input seed fixes this claim.
live-input-shifted-claim-reads-only-cited-facts
Row.id reads only its cited live-input facts
Does not apply to patched-racing-ghost: no row in reproduction-claims matches shifts-with-live-input live input may shift this claim.
claim-reference-comes-from-sealed-record · patched-car-path
patched-car-path obtains its reference from the sealed record
Applies to the patched-car-path row.
At racing.social-ghost-samples, patched-car-path reads a captured comparison reference or deterministically recomputes it from the sealed record through the family row's cited method. The reference-source record distinguishes the two and proves live play supplied neither. An unavailable form asserts nothing. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
patched-car-pathplaybacks using a captured reference and, where the adoption can construct one, a deterministically recomputed reference- When
- playback reaches the points at
racing.social-ghost-samples
- playback reaches the points at
- Then
- the reference is read from the sealed record or deterministically recomputed from it using the family row's cited method and
racing.social-ghost-samples - 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, that form asserts nothing
- the reference is read from the sealed record or deterministically recomputed from it using the family row's cited method and
- Diagnostics
patched-racing-ghost-reference-sourcepatched-racing-ghost-comparison-log
unmet-claim-condition-skips-comparison · patched-car-path
patched-car-path reads conditions before comparison
Applies to the patched-car-path row.
At each constructible point where racing.social-ghost-conditions is not met, patched-car-path is not compared, does not diverge, and does not reject or 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, the test asserts nothing. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
each
patched-car-pathcomparison point this adoption can construct where the conditions atracing.social-ghost-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 playback is not rejected and 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 clause asserts nothing
- where no unmet-condition point can be constructed, this test asserts nothing
- Diagnostics
patched-racing-ghost-condition-tracepatched-racing-ghost-comparison-logpatched-racing-ghost-playback-result
bit-exact-claim-compares-declared-bytes
Row.id compares every included byte
Does not apply to patched-racing-ghost: no row in reproduction-claims matches matching-standard bit exact state.
outcome-equivalent-claim-compares-declared-fields
Row.id compares every included outcome field
Does not apply to patched-racing-ghost: no row in reproduction-claims matches matching-standard outcome equivalent.
position-claim-uses-adoption-gap · patched-car-path
patched-car-path passes only within the declared allowed gap
Applies to the patched-car-path row.
Position claim patched-car-path measures distance in the space at racing.social-ghost-position, subtracts racing.social-ghost-exclusions, and passes exactly when the distance is no greater than the declared allowed gap at allowed-position-gap = tuning.social-ghost-gap. Every position claim in this adoption uses that one value. The test names the addresses and restates neither the gap nor the cited rules.
Test steps and diagnostics
- Given
eligible
patched-car-pathcomparisons whose distance in the space cited atracing.social-ghost-positionis below, equal to, and above the value atallowed-position-gap = tuning.social-ghost-gap- When
- playback applies the allowed-position-gap matching standard
- Then
- the measured distance uses the cited space and excludes the state at
racing.social-ghost-exclusions - the comparison passes exactly when the distance is no greater than the declared allowed gap and fails when it is greater
- every position claim in this adoption reads the same adoption-wide value at
allowed-position-gap = tuning.social-ghost-gap
- the measured distance uses the cited space and excludes the state at
- Diagnostics
patched-racing-ghost-comparison-logpatched-racing-ghost-allowed-gap-source
seed-fixed-claim-repeats-from-declared-record
the Row.artifact result repeats from the declared seed record
Does not apply to patched-racing-ghost: replay record is seed and input log, not seed only.
live-input-shifted-claim-repeats-within-cited-rule
the Row.artifact result repeats within its cited live-input rule
Does not apply to patched-racing-ghost: replay record is seed and input log, not seed only.
seed-and-input-claim-repeats-from-declared-record · patched-car-path
the social ghost car path result repeats from the declared seed and input record
Applies to the patched-car-path row.
Across recorded runs where this claim is eligible, the social ghost car path result from the same sealed seed and ordered input log satisfies patched-car-path's matching standard at racing.social-ghost-samples whenever the claim is eligible. The test names the address and restates nothing from it.
Test steps and diagnostics
- Holds
for every eligible case for the
social ghost car pathresult in scope, playback using the same sealed seed and ordered input log satisfiespatched-car-path's selected matching standard at the points cited atracing.social-ghost-samples- Seeds
["audit-a","audit-b"]- Scope
recorded runs where this claim is eligible- Diagnostics
patched-racing-ghost-record-manifestpatched-racing-ghost-input-log-tracepatched-racing-ghost-comparison-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 patched-racing-ghost: replay record is seed and input log, not input log from fixed start.
outside-conditions-make-no-promise
changes outside cited conditions do not fail this contract
Applies to patched-racing-ghost.
A change outside the cited conditions is never itself a reason to reject 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, the test asserts nothing.
Test steps and diagnostics
- Given
each change outside the cited conditions that the
patched-racing-ghostadoption can construct- When
- the change is observed during playback
- Then
- no change outside the cited conditions is itself a ground for rejection 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 asserts nothing
- Diagnostics
patched-racing-ghost-condition-tracepatched-racing-ghost-comparison-logpatched-racing-ghost-playback-result
first-difference-retains-complete-record · social-ghost
social-ghost retains the first failed eligible comparison
Applies to the social-ghost row.
At the first failed eligible comparison, social-ghost 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
social-ghostplayback 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
patched-racing-ghost-divergence-recordpatched-racing-ghost-playback-resultpatched-racing-ghost-comparison-log
stop-and-report-ends-at-first-difference
Row.id reports and stops at the first difference
Does not apply to patched-racing-ghost: divergence response is continue and flag, not stop and report.
continue-and-flag-keeps-visible-divergence · social-ghost
social-ghost reports and continues from playback state
Applies to the social-ghost row.
At the first difference, social-ghost presents it through racing.social-ghost-status before the next input, keeps a visible diverged mark, and continues from playback's own state. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
one
social-ghostplayback at its first difference with later playback remaining- When
- the difference is retained
- Then
- the difference is presented through
racing.social-ghost-statusbefore the next input is consumed - a visible diverged mark remains and playback continues from its own state
- the difference is presented through
- Diagnostics
patched-racing-ghost-divergence-recordpatched-racing-ghost-difference-reportpatched-racing-ghost-playback-result
continue-silently-keeps-internal-divergence
Row.id continues with an internal diverged mark
Does not apply to patched-racing-ghost: divergence response is continue and flag, not continue silently.
later-comparisons-never-resynchronise
later comparisons are informational only
Applies to patched-racing-ghost.
For each constructible continuing run, later comparisons are informational: they do not replace the first difference or resynchronise playback to a reference. Playback advances from its own state. A continuing run with no later comparison point asserts nothing.
Test steps and diagnostics
- Given
each continuing
patched-racing-ghostplayback that can construct a first difference, with and without later comparison points- When
- playback continues after the first difference
- Then
- later comparisons are retained as informational and never replace the first difference
- playback is never resynchronised to a comparison reference and advances only from its own state
- where a continuing run has no later comparison point, this test asserts nothing
- Diagnostics
patched-racing-ghost-divergence-recordpatched-racing-ghost-comparison-logpatched-racing-ghost-playback-state-trace
complete-means-all-made-comparisons-matched · social-ghost
complete means every comparison actually made matched
Applies to the social-ghost row.
When social-ghost reaches its end at racing.social-ghost-recording 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
social-ghostrecord reaching the end boundary atracing.social-ghost-recordingwith 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
patched-racing-ghost-playback-resultpatched-racing-ghost-comparison-log
same-moment-events-preserve-event-resolution-order
same-moment events preserve Event resolution order
Applies to patched-racing-ghost.
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
patched-racing-ghostreplay 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
patched-racing-ghost-event-order-trace
adoption-declares-exactly-one-replay-record
declaration check: the adoption declares exactly one replay-record row
Applies to patched-racing-ghost.
This declaration check reads the adoption, not the running game. A legal adoption has exactly one replay-record row. Any other count is a defect this test fails by construction; the validator does not enforce the maximum.
Test steps and diagnostics
- Given
the
patched-racing-ghostadoption document, not the running game- When
- a reviewer counts replay-record rows
- Then
- the adoption has exactly one replay-record row; zero rows or more than one row is a defect this test fails by construction
- Diagnostics
patched-racing-ghost-declaration-record
adoption-declares-at-least-one-reproduction-claim
declaration check: the adoption declares at least one reproduction claim
Applies to patched-racing-ghost.
This declaration check reads the adoption, not the running game. A legal adoption has at least one reproduction claim. An empty claim list is a defect this test fails by construction; the validator does not enforce the minimum.
Test steps and diagnostics
- Given
the
patched-racing-ghostadoption document, not the running game- When
- a reviewer counts reproduction-claims rows
- Then
- the adoption has at least one reproduction-claims row; an empty list is a defect this test fails by construction
- Diagnostics
patched-racing-ghost-declaration-record
claim-standard-agrees-with-cited-prose · patched-car-path
declaration check: patched-car-path's matching standard agrees with its cited prose
Applies to the patched-car-path row.
This declaration check reads the adoption and racing.social-ghost-position with racing.social-ghost-exclusions, not the running game. The cited prose must describe the kind of result selected by patched-car-path's matching standard; any other pairing is a defect this test fails by construction. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
the
patched-racing-ghostadoption and the prose atracing.social-ghost-positionandracing.social-ghost-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
- any disagreement is a defect this test fails by construction
- Diagnostics
patched-racing-ghost-declaration-record
every-platform-claim-has-multiple-platform-evidence
declaration check: Row.id was tested on more than one platform
Does not apply to patched-racing-ghost: no row in reproduction-claims matches platform-reach every supported platform.
claim-excludes-cites-separate-section · patched-car-path
declaration check: patched-car-path has a separate exclusions section
Applies to the patched-car-path row.
This declaration check reads the adoption and cited prose, not the running game. racing.social-ghost-exclusions must be a section separate from racing.social-ghost-position and must name exclusions or explicitly say there are none. Any other shape is a defect this test fails by construction. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
the
patched-racing-ghostadoption and the prose atracing.social-ghost-positionandracing.social-ghost-exclusions, not the running game- When
- a reviewer checks the two cited sections
- Then
racing.social-ghost-exclusionsnames a section separate fromracing.social-ghost-positionand that section names every exclusion or states explicitly that nothing is excluded- a shared section, an omitted exclusion, or silence when nothing is excluded is a defect this test fails by construction
- Diagnostics
patched-racing-ghost-declaration-record
claim-citations-state-their-own-duties · patched-car-path
declaration check: patched-car-path's four required citations state their own duties
Applies to the patched-car-path row.
This declaration check reads the adoption and cited prose, not the running game. racing.social-ghost-position, racing.social-ghost-exclusions, racing.social-ghost-conditions, and racing.social-ghost-samples must respectively state the included result, separate exclusions, conditions, and reference and comparison points. Any wrong meaning is a defect this test fails by construction. The test names every address and restates nothing from them.
Test steps and diagnostics
- Given
the
patched-racing-ghostadoption and the prose atracing.social-ghost-position,racing.social-ghost-exclusions,racing.social-ghost-conditions, andracing.social-ghost-samples, 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
- a citation with another meaning is a defect this test fails by construction
- Diagnostics
patched-racing-ghost-declaration-record
live-input-shifted-claim-cites-dependence-rule
declaration check: Row.id cites its live-input dependence rule
Does not apply to patched-racing-ghost: no row in reproduction-claims matches shifts-with-live-input live input may shift this claim.
shared-conditions-section-covers-every-citing-claim · patched-car-path
declaration check: patched-car-path's shared conditions section covers every citing claim
Applies to the patched-car-path row.
This declaration check reads the adoption and the cited prose at racing.social-ghost-conditions, not the running game. A section cited by more than one claim states the conditions for every citing claim by name; a shared section covering only some citing claims is a defect this test fails by construction. Where no other claim cites the section, this check asserts nothing.
Test steps and diagnostics
- Given
the
patched-racing-ghostadoption and the cited prose atracing.social-ghost-conditions, not the running game- When
- a reviewer checks every reproduction claim that cites the same conditions section
- Then
- where the section at
racing.social-ghost-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 check asserts nothing
- any shared section that covers only some citing claims is a defect this test fails by construction
- where the section at
- Diagnostics
patched-racing-ghost-declaration-record
position-gap-unit-matches-cited-space · patched-car-path
declaration check: patched-car-path's position gap unit matches its cited space
Applies to the patched-car-path row.
This declaration check reads the adoption and the cited prose at racing.social-ghost-position and allowed-position-gap = tuning.social-ghost-gap, not the running game. The cited space names a position unit, and the adoption's gap value, whether a number or a cited rule, is one distance in that unit. Any other pairing is a defect this test fails by construction.
Test steps and diagnostics
- Given
the
patched-racing-ghostadoption and the cited prose atracing.social-ghost-positionandallowed-position-gap = tuning.social-ghost-gap, not the running game- When
- a reviewer compares the cited position space with the adoption's allowed gap value
- Then
- the space cited at
racing.social-ghost-positionnames a position unit, and the adoption's gap value atallowed-position-gap = tuning.social-ghost-gap, whether a number or a cited rule, is one distance in that unit - any other pairing is a defect this test fails by construction
- the space cited at
- Diagnostics
patched-racing-ghost-declaration-record
replay-holds
the replay mechanism holds for the whole run
Applies to patched-racing-ghost.
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 rejection 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
patched-racing-ghost-recording-tracepatched-racing-ghost-identity-check-tracepatched-racing-ghost-reference-sourcepatched-racing-ghost-comparison-logpatched-racing-ghost-input-log-tracepatched-racing-ghost-playback-resultpatched-racing-ghost-first-ordering-violation
JSONthe adoption as one file
The adoption file as supplied. Answers you try on this page are not written into it; to change an adoption, open it in the authoring tool.
{
"contract": "replay-scope",
"version": 1,
"summary": "Covers racing ghosts, daily seeds, observer replays, solution shares, and other recorded reruns. It decides what the record contains, whether an update can still play it, what must match, and what happens at the first difference. Input encoding, random-number methods, storage, cameras, and networking stay in the game's own rules.",
"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, reject 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 cross-version differences. Actual mismatches still follow the divergence-response answer."
}
}
},
"divergence-response": {
"asks": "What happens at the first result that does not match?",
"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 resynchronise playback to the reference."
},
"continue-silently": {
"meaning": "Keep playing without showing the difference. A racing ghost can finish the lap after it drifts past the allowed gap.",
"semantics": "Mark the mismatch inside the replay controller, emit no player-facing, ordinary-log, or telemetry report, 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 capture and read this replay family. 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": "Name this replay family in the game's words, such as ghost-lap or observer-match. Each sealed record created from the family carries its own cited instance identity."
},
"recording-declared-in": {
"type": "citation",
"required": true,
"description": "The rule naming the start and end of recording. It fixes the recording version, platform, content-set identity, settings, mod identity, and the record's own instance identity. It names the seed or fixed start and the input log when used, and says 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": "The rule that orders recorded inputs and states the clock, step, or turn used to play them back."
},
"fixed-start-declared-in": {
"type": "citation",
"when": {
"flag": {
"replay-record": [
"input-log-from-fixed-start"
]
}
},
"description": "The rule that identifies and verifies the fixed starting state before the first input."
},
"migration-declared-in": {
"type": "citation",
"when": {
"flag": {
"after-an-update": [
"migrate-then-replay"
]
}
},
"description": "The deterministic rule that derives the running-version record while preserving the source record."
},
"cross-version-divergence-declared-in": {
"type": "citation",
"when": {
"flag": {
"after-an-update": [
"best-effort-with-declared-divergence"
]
}
},
"description": "The player-facing statement of known changes that may alter this replay in the running version."
},
"difference-report-declared-in": {
"type": "citation",
"required": true,
"description": "The incompatibility or difference report. It presents version, content, mod, settings, start, or migration rejection before playback and presents the first failed claim and comparison details when the selected response is visible."
}
}
},
"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. Shared test material must cover every row that cites 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": "Name this comparison claim in the 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 what the player does change a result this replay promises? Say whether the seed fixes this claim or whether live input may shift it."
},
"live-input-dependence-declared-in": {
"type": "citation",
"when": {
"row": {
"shifts-with-live-input": [
"live-input-may-shift-this-claim"
]
}
},
"description": "The fixed rule naming every live-input history fact allowed to change this claimed result. Unlisted live input does not change it."
},
"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 cited space using the adoption's allowed gap."
},
"reproduces": {
"type": "citation",
"required": true,
"description": "The fixed game prose naming every state byte, outcome field, or position that must match."
},
"excludes": {
"type": "citation",
"required": true,
"description": "A separate fixed section naming what this claim subtracts from what it promises to match, including an explicit statement when nothing is excluded."
},
"conditions": {
"type": "citation",
"required": true,
"description": "The fixed game prose naming when the promise holds, including content-set identity, settings, mods, and any other compatibility or comparison conditions. Content identity is a condition, not a version."
},
"comparison-points": {
"type": "citation",
"required": true,
"description": "The rule naming when a reference is captured or recomputed and when playback compares it, such as every simulation checkpoint, the finish line, or the solved board."
}
}
}
}
},
"rules": {
"best-effort-must-be-visible": {
"forbid": {
"flag": {
"after-an-update": [
"best-effort-with-declared-divergence"
],
"divergence-response": [
"continue-silently"
]
}
},
"message": "Best-effort replay after an update needs a visible difference notice; show and flag differences, or keep the replay on its recorded version."
}
},
"origin": "https://opengdd.org/contracts/replay-scope-1",
"mechanism": [
"This is the single normative authority for what is recorded, when capture or recomputation happens, what playback consumes, and how differences are detected and handled. Questions and rows supply choices and references; they do not redefine this order.",
"A `replay-record` row names a replay family. Each immutable replay record made from that family 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.",
"### Record",
"1. Read the one replay-family row and every reproduction claim. From `recording-declared-in`, fix the recording version, platform, content-set identity, settings, and mod identity before the record begins. 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 in the same replay family.",
"### 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, reject 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. Either excluded claim does not diverge; other claims continue. 8. Only when the recorded version differs from the running version, apply the selected update policy. `same-version-only` rejects 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, while failure rejects. `best-effort-with-declared-divergence` presents the cited known differences and keeps the source record unchanged. Migration must map the recorded input clock to an existing running-version clock; best-effort playback rejects 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. Reject 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 gated 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. A `live-input-may-shift-this-claim` result's gated citation 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.",
"Changes outside the cited conditions make no promise and do 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 resynchronise 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."
],
"answers": {
"replay-record": "seed-and-input-log",
"after-an-update": "best-effort-with-declared-divergence",
"divergence-response": "continue-and-flag"
},
"values": {
"allowed-position-gap": "tuning.social-ghost-gap"
},
"rows": {
"replay-record": [
{
"id": "social-ghost",
"recording-declared-in": "racing.social-ghost-recording",
"input-clock-declared-in": "racing.physics-steps",
"cross-version-divergence-declared-in": "racing.patch-ghost-notice",
"difference-report-declared-in": "racing.social-ghost-status"
}
],
"reproduction-claims": [
{
"id": "patched-car-path",
"artifact": "social ghost car path",
"platform-reach": "recorded-platform-only",
"matching-standard": "allowed-position-gap",
"reproduces": "racing.social-ghost-position",
"excludes": "racing.social-ghost-exclusions",
"conditions": "racing.social-ghost-conditions",
"comparison-points": "racing.social-ghost-samples"
}
]
},
"pack": "sha256:dc3ee9f2383b70086aa53fad03e41f878befddd8b12eca9147598b6ea59505bc"
}